package com.salama.android.developer.user; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import MetoXML.XmlDeserializer; import MetoXML.XmlSerializer; import android.content.Context; import android.util.Log; import com.salama.android.developer.SalamaAppService; import com.salama.android.developer.util.http.SalamaHttpClientUtil; import com.salama.android.support.ServiceSupportApplication; import com.salama.android.support.ServiceSupportUtil; import com.salama.android.util.MD5Util; import com.salama.android.util.SSLog; public class SalamaUserService { protected final static String USER_INFO_STORED_KEY = "salamauserauth_"; protected final static String EASY_APP_USER_AUTH_SERVICE = "com.salama.easyapp.service.UserAuthService"; private UserAuthInfo _userAuthInfo = null; private static SalamaUserService _singleton = null; public static SalamaUserService singleton() { if(_singleton == null) { _singleton = new SalamaUserService(); } return _singleton; } private SalamaUserService() { _userAuthInfo = getStoredUserAuthInfo(); if(_userAuthInfo == null) { _userAuthInfo = new UserAuthInfo(); } } /** * 取得用户认证信息 * @return 用户认证信息 */ public UserAuthInfo getUserAuthInfo() { return _userAuthInfo; } /** * 返回用户是否已登录(检测是否有登录票据,以及票据是否过期) * @return 1:是 0:否 */ public int isUserAuthValid() { if(_userAuthInfo == null || _userAuthInfo.getAuthTicket() == null || _userAuthInfo.getAuthTicket().length() == 0) { //SSLog.d("SalamaUserService", "isUserAuthValid() 0 a"); return 0; } else { if(_userAuthInfo.getExpiringTime() <= System.currentTimeMillis()) { //SSLog.d("SalamaUserService", "isUserAuthValid() 0 b expTime:" + _userAuthInfo.getExpiringTime()); return 0; } else { return 1; } } } /** * 保存用户认证信息(存储至手机中) */ public void storeUserAuthInfo(UserAuthInfo userAuthInfo) { if(userAuthInfo == null) { clearUserAuthInfo(); } else { _userAuthInfo.setLoginId(userAuthInfo.getLoginId()); _userAuthInfo.setReturnCode(userAuthInfo.getReturnCode()); _userAuthInfo.setUserId(userAuthInfo.getUserId()); _userAuthInfo.setAuthTicket(userAuthInfo.getAuthTicket()); _userAuthInfo.setExpiringTime(userAuthInfo.getExpiringTime()); } FileOutputStream fos = null; OutputStreamWriter writer = null; try { fos = ServiceSupportApplication.singleton().openFileOutput( USER_INFO_STORED_KEY.concat(SalamaAppService.singleton().getAppId()), Context.MODE_PRIVATE); writer = new OutputStreamWriter(fos, XmlDeserializer.DefaultCharset); XmlSerializer xmlSer = new XmlSerializer(); xmlSer.Serialize(writer, _userAuthInfo, UserAuthInfo.class); writer.flush(); } catch(Exception e) { Log.e("SalamaAppService", "Error in storeAppAuthInfoWithAppId()", e); } finally { try { fos.close(); } catch(Exception e) { } try { writer.close(); } catch(Exception e) { } } } /** * 用户注册 * @param loginId 登录ID * @param password 密码 * @return 用户认证信息(包含Ticket,登录操作的结果)。 * 其中returnCode是操作的结果,有以下种类: * 0:成功 * -8:失败。loginId格式不正确(正确的格式:长度小于等于32;内容仅允许英文字母,数字,和三种符号'.','_','-',不能以符号开头或结尾) * -9:失败。password格式不正确(正确的格式:长度小于等于32) * -20:失败。loginId重复 * -30:失败。其他错误。 */ public UserAuthInfo signUp(String loginId, String password) { try { SSLog.d("SalamaUserService", "signUp() loginId:" + loginId); String passwordMD5 = MD5Util.md5String(password); String resultXml = (String)SalamaHttpClientUtil.doBasicGet( false, SalamaAppService.singleton().getAppServiceHttpsUrl(), ServiceSupportUtil.newList(new String[]{"serviceType", "serviceMethod", "appToken", "loginId", "passwordMD5"}), ServiceSupportUtil.newList(new String[]{EASY_APP_USER_AUTH_SERVICE, "signUp", SalamaAppService.singleton().getAppToken(), loginId, passwordMD5}), null ); UserAuthInfo authInfo = null; if(resultXml != null && resultXml.length() > 0) { authInfo = (UserAuthInfo) XmlDeserializer.stringToObject(resultXml, UserAuthInfo.class); } storeUserAuthInfo(authInfo); return authInfo; } catch(Exception e) { SSLog.e("SalamaUserService", "signUp()", e); return null; } } /** * 用户登录 * @param loginId 登录ID * @param password 密码 * @return 用户认证信息(包含Ticket,登录操作的结果)。 * 其中returnCode是操作的结果,有以下种类: * 0:成功 * -8:失败。loginId格式不正确(正确的格式:长度小于等于32;内容仅允许英文字母,数字,和三种符号'.','_','-',不能以符号开头或结尾) * -9:失败。password格式不正确(正确的格式:长度小于等于32) * -10:失败。登录id和密码验证不通过 * -20:失败。loginId重复 * -30:失败。其他错误。 */ public UserAuthInfo login(String loginId, String password) { String utcTime = Long.toString(System.currentTimeMillis()); String utcTimeMD5 = MD5Util.md5String(utcTime); String passwordMD5 = MD5Util.md5String(password); String passwordMD5MD5 = MD5Util.md5String(passwordMD5.concat(utcTimeMD5)); try { String resultXml = (String)SalamaHttpClientUtil.doBasicGet( false, SalamaAppService.singleton().getAppServiceHttpsUrl(), ServiceSupportUtil.newList(new String[]{"serviceType", "serviceMethod", "appToken", "loginId", "passwordMD5MD5", "utcTime"}), ServiceSupportUtil.newList(new String[]{EASY_APP_USER_AUTH_SERVICE, "login", SalamaAppService.singleton().getAppToken(), loginId, passwordMD5MD5, utcTime}), null ); UserAuthInfo authInfo = null; if(resultXml != null && resultXml.length() > 0) { authInfo = (UserAuthInfo) XmlDeserializer.stringToObject(resultXml, UserAuthInfo.class); } storeUserAuthInfo(authInfo); return authInfo; } catch(Exception e) { SSLog.e("SalamaUserService", "login()", e); return null; } } /** * 用户通过存储在手机中的登录票据登录 * @return 用户认证信息(包含Ticket,登录操作的结果)。 * 其中returnCode是操作的结果,有以下种类: * 0:成功 * -11:失败。登录票据过期失效 * -30:失败。其他错误。 */ public UserAuthInfo loginByTicket() { try { String resultXml = (String)SalamaHttpClientUtil.doBasicGet( false, SalamaAppService.singleton().getAppServiceHttpsUrl(), ServiceSupportUtil.newList(new String[]{"serviceType", "serviceMethod", "appToken", "authTicket"}), ServiceSupportUtil.newList(new String[]{EASY_APP_USER_AUTH_SERVICE, "loginByTicket", SalamaAppService.singleton().getAppToken(), _userAuthInfo.getAuthTicket()==null?"":_userAuthInfo.getAuthTicket()}), null ); UserAuthInfo authInfo = null; if(resultXml != null && resultXml.length() > 0) { authInfo = (UserAuthInfo) XmlDeserializer.stringToObject(resultXml, UserAuthInfo.class); } storeUserAuthInfo(authInfo); return authInfo; } catch(Exception e) { SSLog.e("SalamaUserService", "loginByTicket()", e); return null; } } /** * 修改密码 * @param loginId 登录ID * @param password 原密码 * @param newPassword 新密码 * @return 用户认证信息(包含Ticket,登录操作的结果)。 * 其中returnCode是操作的结果,有以下种类: * 0:成功 * -8:失败。loginId格式不正确(正确的格式:长度小于等于32;内容仅允许英文字母,数字,和三种符号'.','_','-',不能以符号开头或结尾) * -9:失败。password格式不正确(正确的格式:长度小于等于32) * -10:失败。登录id和密码验证不通过 * -30:失败。其他错误。 */ public UserAuthInfo changePassword(String loginId, String password, String newPassword) { String passwordMD5 = MD5Util.md5String(password); String newPasswordMD5 = MD5Util.md5String(newPassword); try { String resultXml = (String)SalamaHttpClientUtil.doBasicGet( false, SalamaAppService.singleton().getAppServiceHttpsUrl(), ServiceSupportUtil.newList(new String[]{"serviceType", "serviceMethod", "appToken", "loginId", "passwordMD5", "newPasswordMD5"}), ServiceSupportUtil.newList(new String[]{EASY_APP_USER_AUTH_SERVICE, "changePassword", SalamaAppService.singleton().getAppToken(), loginId, passwordMD5, newPasswordMD5}), null ); UserAuthInfo authInfo = null; if(resultXml != null && resultXml.length() > 0) { authInfo = (UserAuthInfo) XmlDeserializer.stringToObject(resultXml, UserAuthInfo.class); } storeUserAuthInfo(authInfo); return authInfo; } catch(Exception e) { SSLog.e("SalamaUserService", "changePassword()", e); return null; } } /** * 登出 * @return 1:成功 以外:失败 */ public String logout() { try { String result = (String)SalamaHttpClientUtil.doBasicGet( false, SalamaAppService.singleton().getAppServiceHttpsUrl(), ServiceSupportUtil.newList(new String[]{"serviceType", "serviceMethod", "appToken", "authTicket"}), ServiceSupportUtil.newList(new String[]{EASY_APP_USER_AUTH_SERVICE, "changePassword", SalamaAppService.singleton().getAppToken(), _userAuthInfo.getAuthTicket()==null?"":_userAuthInfo.getAuthTicket()}), null ); _userAuthInfo.setAuthTicket(""); _userAuthInfo.setExpiringTime(0); storeUserAuthInfo(_userAuthInfo); return result; } catch(Exception e) { SSLog.e("SalamaUserService", "logout()", e); return null; } } private void clearUserAuthInfo() { _userAuthInfo.setReturnCode(""); _userAuthInfo.setUserId(""); _userAuthInfo.setAuthTicket(""); _userAuthInfo.setExpiringTime(0); } private UserAuthInfo getStoredUserAuthInfo() { FileInputStream fis = null; InputStreamReader reader = null; try { fis = ServiceSupportApplication.singleton().openFileInput( USER_INFO_STORED_KEY.concat(SalamaAppService.singleton().getAppId())); reader = new InputStreamReader(fis, XmlDeserializer.DefaultCharset); XmlDeserializer xmlDes = new XmlDeserializer(); return (UserAuthInfo) xmlDes.Deserialize( reader, UserAuthInfo.class, ServiceSupportApplication.singleton()); } catch(FileNotFoundException e) { SSLog.d("SalamaUserService", "getStoredUserAuthInfo() file does not exist."); return null; } catch(Exception e) { Log.e("SalamaUserService", "Error in getStoredUserAuthInfo()", e); return null; } finally { try { fis.close(); } catch(Exception e) { } try { reader.close(); } catch(Exception e) { } } } }