/******************************************************************************* * Copyright (c) 2011-2012 Nokia Corporation * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Comarch team - initial API and implementation *******************************************************************************/ package org.ned.client; import java.io.DataOutputStream; import java.io.IOException; import java.util.Vector; import javax.microedition.io.ConnectionNotFoundException; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import org.kxml2.kdom.Document; import org.kxml2.kdom.Element; import org.kxml2.kdom.Node; import org.ned.client.NedConsts.LoginError; import org.ned.client.statistics.StatisticsManager; import org.ned.client.utils.*; import org.ned.client.view.GeneralAlert; import org.ned.client.view.WaitingScreen; public class AccountManager { private String serverAddress = null; private Vector users = new Vector(); private UserInfo currentUser = null; private LanguageInfo currentLanguage; public void setServer( String url ) { serverAddress = url; saveSetup(); } private int TryLoginToServer( String login, String password, int retval ) { WaitingScreen.show( NedResources.CONNECTING ); retval = loginToServer( login, password ); WaitingScreen.dispose(); if ( retval != LoginError.SUCCESS ) { ErrorConnectionMessageResolver.showErrorMessage( retval ); } return retval; } public int getUsersCount() { return users.size(); } public class UserInfo { public UserInfo( String login, String password, boolean save ) { this.login = login; this.password = password; this.isPassSaved = save; } public String login = null; public String password = null; public boolean isPassSaved = false; } public AccountManager() { readSetup(); } public String getServerUrl() { return serverAddress; } public String getContentServletUri() { return serverAddress + NedConsts.NedRemotePath.BASEPATH + NedConsts.NedRemotePath.GETXMLSERVLET; } public String getMotdServletUri() { return serverAddress + NedConsts.NedRemotePath.BASEPATH + NedConsts.NedRemotePath.MOTDSERVLET; } public String getStatisticsServletUri() { return serverAddress + NedConsts.NedRemotePath.BASEPATH + NedConsts.NedRemotePath.STAT_UPLOAD; } public String getLoginServletUri() { return serverAddress + NedConsts.NedRemotePath.BASEPATH + NedConsts.NedRemotePath.LOGIN; } public String getLocalizationUri() { return serverAddress + NedConsts.NedRemotePath.BASEPATH + NedConsts.NedRemotePath.LOCALIZATION; } private void readSetup() { if ( NedIOUtils.fileExists( NedIOUtils.getAccountsFile() ) ) { Element rootElement = null; try { Document doc = NedXmlUtils.getDocFile( NedIOUtils. getAccountsFile() ); if ( doc == null ) { NedIOUtils.removeFile( NedIOUtils.getAccountsFile() ); return; } else { rootElement = doc.getRootElement(); } } catch ( Exception ex ) { GeneralAlert.show( "load accounts error: " + ex.getMessage(), GeneralAlert.ERROR ); } for ( int i = 0; i < rootElement.getChildCount(); i++ ) { if ( rootElement.getType( i ) == Node.ELEMENT ) { Element element = rootElement.getElement( i ); if ( element.getName().equals( NedConsts.NedXmlTag.USER ) ) { String username = element.getAttributeValue( "", NedConsts.NedXmlAttribute.LOGIN ); String password = element.getAttributeValue( "", NedConsts.NedXmlAttribute.PASSWORD ); String strSave = element.getAttributeValue( "", NedConsts.NedXmlAttribute.SAVE_PASS ); boolean bSave = false; if ( strSave != null && strSave.equals( "yes" ) ) { bSave = true; } users.addElement( new UserInfo( username, password, bSave ) ); } else if ( element.getName().equals( NedConsts.NedXmlTag.SERVER ) ) { serverAddress = element.getText( 0 ); } else if ( (element.getName().equals( NedConsts.NedXmlTag.LAST_USER )) ) { currentUser = findUser( element.getAttributeValue( "", NedConsts.NedXmlAttribute.LOGIN ) ); } else if ( element.getName().equals( "Language" ) ) { currentLanguage = new LanguageInfo( element. getAttributeValue( "", "langName" ), element. getAttributeValue( "", "locale" ), true ); } } } } } public void saveSetup() { Document doc = new Document(); Element accountSetup = doc.createElement( "", "AccountSetup" ); Element server = doc.createElement( "", NedConsts.NedXmlTag.SERVER ); server.addChild( Node.TEXT, serverAddress ); accountSetup.addChild( Node.ELEMENT, server ); for ( int i = 0; i < users.size(); i++ ) { Element user = accountSetup.createElement( "", NedConsts.NedXmlTag.USER ); user.setAttribute( "", NedConsts.NedXmlAttribute.LOGIN, ((UserInfo)users. elementAt( i )).login ); user.setAttribute( "", NedConsts.NedXmlAttribute.PASSWORD, ((UserInfo)users. elementAt( i )).password ); user.setAttribute( "", NedConsts.NedXmlAttribute.PASSWORD, ((UserInfo)users. elementAt( i )).password ); user.setAttribute( "", NedConsts.NedXmlAttribute.SAVE_PASS, ((UserInfo)users. elementAt( i )).isPassSaved ? "yes" : "no" ); accountSetup.addChild( Node.ELEMENT, user ); } doc.addChild( Node.ELEMENT, accountSetup ); if ( currentUser != null ) { Element lastUser = accountSetup.createElement( "", NedConsts.NedXmlTag.LAST_USER ); lastUser.setAttribute( "", NedConsts.NedXmlAttribute.LOGIN, currentUser.login ); accountSetup.addChild( Node.ELEMENT, lastUser ); } if ( currentLanguage != null ) { Element language = doc.createElement( "", "Language" ); language.setAttribute( "", "langName", currentLanguage.getLangName() ); language.setAttribute( "", "locale", currentLanguage.getLocale() ); accountSetup.addChild( Node.ELEMENT, language ); } NedXmlUtils.writeXmlFile( NedIOUtils.getAccountsFile(), doc ); } public int login( String login, String password ) { int retval = LoginError.UNKNOWN; UserInfo user = findUser( login ); if ( user == null ) { retval = TryLoginToServer( login, password, retval ); } else if ( user.password.equals( password ) ) { currentUser = user; saveSetup(); retval = LoginError.SUCCESS; } else { if ( GeneralAlert.showQuestion( NedResources.LOGIN_ONLINE ) == GeneralAlert.RESULT_YES ) { try { Thread.sleep( 100 ); } catch ( InterruptedException ex ) { ex.printStackTrace(); } retval = TryLoginToServer( login, password, retval ); } else { retval = LoginError.ABORTED;// for concurrency purpose } } return retval; } public void savePassword( String userName, boolean bSave ) { UserInfo user = findUser( userName ); user.isPassSaved = bSave; saveSetup(); } public int loginToServer( String login, String password ) { int retval = LoginError.UNKNOWN; DataOutputStream httpOutput = null; HttpConnection httpConn = null; try { httpConn = (HttpConnection)Connector.open( getLoginServletUri() ); httpConn.setRequestMethod( HttpConnection.GET ); httpConn.setRequestProperty( NedConsts.HttpHeader.CACHECONTROL, NedConsts.HttpHeaderValue.NOCACHE ); NedConnectionUtils.addCredentialsToConnection( httpConn, login, password ); httpOutput = httpConn.openDataOutputStream(); int rspCode = httpConn.getResponseCode(); if ( rspCode == HttpConnection.HTTP_OK ) { // exchange old user for new if exists UserInfo user = findUser( login ); if ( user != null ) { users.removeElement( user ); saveSetup(); } user = new UserInfo( login, password, false ); users.addElement( user ); currentUser = user; NedIOUtils.createDirectory( NedIOUtils.getUserRootDirectory() ); saveSetup(); retval = LoginError.SUCCESS; if ( NedMidlet.getSettingsManager().getAutoStatSend() ) { StatisticsManager.uploadStats( true ); } MotdManager.getInstance().updateMotd(); } else if ( rspCode == HttpConnection.HTTP_UNAUTHORIZED ) { retval = LoginError.UNAUTHORIZED; } } catch ( ConnectionNotFoundException cex ) { retval = LoginError.CONNECTIONERROR; } catch ( IOException ioex ) { if ( "-3".equals( ioex.getMessage() ) ) { retval = LoginError.ABORTED; } else { retval = LoginError.OTHERCONNECTIONPROBLEM; } ioex.printStackTrace(); } catch ( SecurityException sec ) { retval = LoginError.LOCALSECURITY; sec.printStackTrace(); } catch ( Exception ex ) { ex.printStackTrace(); retval = LoginError.UNKNOWN; } finally { try { if ( httpOutput != null ) { httpOutput.close(); } if ( httpConn != null ) { httpConn.close(); } } catch ( IOException ex ) { } } return retval; } public void changePassword( String newPasword ) { String currentUser = NedMidlet.getSettingsManager().getUser(); UserInfo checkUser = findUser( currentUser ); if ( checkUser != null ) { users.removeElement( checkUser ); users.addElement( new UserInfo( checkUser.login, newPasword, false ) ); saveSetup(); //todo push to server } } public void removeUser( String user ) { if ( user != null ) { UserInfo removeUser = findUser( user ); users.removeElement( removeUser ); saveSetup(); //todo push to server } } public UserInfo findUser( String login ) { UserInfo retval = null; for ( int i = 0; i < users.size(); i++ ) { if ( ((UserInfo)users.elementAt( i )).login.equals( login ) ) { retval = (UserInfo)users.elementAt( i ); } } return retval; } public UserInfo getCurrentUser() { return currentUser; } public LanguageInfo getLanguage() { return currentLanguage; } public void setLanguage( LanguageInfo language ) { currentLanguage = language; } }