private List<NameValuePair> getCredentialsFromAccount() throws OperationCanceledException, AuthenticatorException, IOException, NoAccountException { List<NameValuePair> credentials = new ArrayList<NameValuePair>(); String username = AuthenticationHelper.getAccountUsername(); String password = AuthenticationHelper.getAccountPassword(); credentials.add(new BasicNameValuePair("username", username)); credentials.add(new BasicNameValuePair("password", password)); return credentials; }
/** * Hits the logout service and then the login. * * <p>Returns - userid - 0 if already logged in */ public int authenticate() throws HttpAuthenticationFailedException, IOException, JSONException, NoAccountException { RestClient authClient = new RestClient(); int userId = 0; try { // Log.i(TAG, "Routine logout attempt"); authClient.authpost(wsUserLogoutUrl); } catch (Exception e) { Log.i(TAG, "Exception on logout - not to worry: " + e.toString()); // We don't care a lot about this, as we were just trying to ensure clean login. } try { List<NameValuePair> credentials = getCredentialsFromAccount(); // Log.i(TAG, "Normal login attempt after logout credentials=" + credentials.toString()); JSONObject authResult = authClient.authpost(wsUserAuthUrl, credentials); userId = authResult.getJSONObject("user").getInt("uid"); Host profileInfo = Host.CREATOR.parse(authResult.getJSONObject("user")); MemberInfo.initInstance(profileInfo); String cookieSessionName = authResult.getString("session_name"); String cookieSessionId = authResult.getString("sessid"); AuthenticationHelper.addCookieInfo(cookieSessionName, cookieSessionId, userId); String filePath = MemberInfo.getMemberPhotoFilePath(); // Get the member photo if it doesn't exist already File profileImageFile = new File(filePath); // If the file doesn't exist or is tiny, download it, otherwise use the one we have if (!profileImageFile.exists() || profileImageFile.length() < 1000) { // Download it downloadMemberPhoto(profileInfo, filePath); } } catch (ClientProtocolException e) { if (e.getCause() instanceof CircularRedirectException) { // If we get this authentication has still been successful, so ignore it } else { throw new HttpAuthenticationFailedException(e); } } catch (IOException e) { // Rethrow, prevent the catch below from getting to it. we want to know this was IO exception throw e; } catch (HttpAuthenticationFailedException e) { // Attempting to do auth with wrong credentials throw e; } catch (NoAccountException e) { throw e; } catch (HttpException e) { if (e.getMessage().equals("406")) { Log.i(TAG, "Got error 406 attempting to log in, so ignoring"); // This is the case where we hit auth and were already authenticated... but shouldn't have // happened. } else { throw e; } } catch (Exception e) { // We might have had a json parsing or access exception - for example, if the "user" was not // there, // Could also have AuthenticatorException or OperationCancelledException here // or if there was something wrong with what the server returned throw new HttpAuthenticationFailedException(e); } return userId; }