package fi.bitrite.android.ws.auth; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import java.io.IOException; import fi.bitrite.android.ws.WSAndroidApplication; import fi.bitrite.android.ws.util.GlobalInfo; public class AuthenticationHelper { public static final String KEY_SESSION_NAME = "session_name"; public static final String KEY_SESSID = "sessid"; public static final String KEY_USERID = "userid"; public static Account createNewAccount(String username, String password) { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account account = new Account(username, AuthenticationService.ACCOUNT_TYPE); accountManager.addAccountExplicitly(account, null, null); accountManager.setAuthToken(account, AuthenticationService.ACCOUNT_TYPE, password); return account; } public static Account getWarmshowersAccount() throws NoAccountException { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account[] accounts = accountManager.getAccountsByType(AuthenticationService.ACCOUNT_TYPE); if (accounts.length == 0) { throw new NoAccountException(); } return accounts[0]; } public static String getAccountCookie() { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account account = getWarmshowersAccount(); String session_name = accountManager.getUserData(account, KEY_SESSION_NAME); String sessid = accountManager.getUserData(account, KEY_SESSID); String cookieString = session_name + "=" + sessid + "; domain=" + GlobalInfo.warmshowersCookieDomain; return cookieString; } public static int getAccountUid() { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account account = getWarmshowersAccount(); String sUid = accountManager.getUserData(account, KEY_USERID); int uid = -1; try { uid = Integer.parseInt(sUid); } catch (NumberFormatException e) { // Ignore, and we'll go with -1 for the uid. Doesn't work well, but cheater. // This probably should only be happening on initial 1.4.1 upgrade where account didn't have // the UID stashed in it. } return uid; } public static String getAccountUsername() throws NoAccountException { Account account = getWarmshowersAccount(); String username = account.name; return username; } public static String getAccountPassword() throws OperationCanceledException, IOException, AuthenticatorException, NoAccountException { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account account = getWarmshowersAccount(); // authToken is here instead of password for legacy reasons, and doesn't make sense to // break all existing accounts by changing it. String password = accountManager.blockingGetAuthToken(account, AuthenticationService.ACCOUNT_TYPE, true); return password; } public static void addCookieInfo(String cookieSessionName, String cookieSessionId, int userId) throws NoAccountException { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); Account account = getWarmshowersAccount(); accountManager.setUserData(account, KEY_SESSION_NAME, cookieSessionName); accountManager.setUserData(account, KEY_SESSID, cookieSessionId); accountManager.setUserData(account, KEY_USERID, String.valueOf(userId)); } public static void removeOldAccount() { AccountManager accountManager = AccountManager.get(WSAndroidApplication.getAppContext()); try { Account oldAccount = getWarmshowersAccount(); accountManager.removeAccount(oldAccount, null, null); } catch (NoAccountException e) { // No action } } }