String sessionToken = ((State) state).sessionToken(); if (sessionToken != null) { try {
/* package */ Task<Void> logOutAsync(boolean revoke) { ParseAuthenticationManager controller = getAuthenticationManager(); List<Task<Void>> tasks = new ArrayList<>(); final String oldSessionToken; synchronized (mutex) { oldSessionToken = getState().sessionToken(); for (Map.Entry<String, Map<String, String>> entry : getAuthData().entrySet()) { tasks.add(controller.deauthenticateAsync(entry.getKey())); } State newState = getState().newBuilder() .sessionToken(null) .isNew(false) .build(); isCurrentUser = false; setState(newState); } if (revoke) { tasks.add(ParseSession.revokeAsync(oldSessionToken)); } return Task.whenAll(tasks); }
@Test public void testDecodeSuccessWithSessionTokenAndAuthData() throws Exception { JSONObject facebookAuthDataJson = new JSONObject() .put("id", "facebookId") .put("access_token", "facebookAccessToken"); JSONObject twitterAuthDataJson = new JSONObject() .put("id", "twitterId") .put("access_token", "twitterAccessToken"); JSONObject authDataJson = new JSONObject() .put("facebook", facebookAuthDataJson) .put("twitter", twitterAuthDataJson); JSONObject objectJson = new JSONObject() .put(KEY_SESSION_TOKEN, "sessionToken") .put(KEY_AUTH_DATA, authDataJson); ParseUserCurrentCoder coder = ParseUserCurrentCoder.get(); ParseUser.State.Builder builder = coder.decode(new ParseUser.State.Builder(), objectJson, ParseDecoder.get()); // We use the builder to build a state to verify the content in the builder ParseUser.State state = builder.build(); assertEquals("sessionToken", state.sessionToken()); Map<String, Map<String, String>> authData = state.authData(); Map<String, String> facebookAuthData = authData.get("facebook"); assertEquals("facebookId", facebookAuthData.get("id")); assertEquals("facebookAccessToken", facebookAuthData.get("access_token")); Map<String, String> twitterAuthData = authData.get("twitter"); assertEquals("twitterId", twitterAuthData.get("id")); assertEquals("twitterAccessToken", twitterAuthData.get("access_token")); }
@Override public Task<ParseUser.State> logInAsync( ParseUser.State state, ParseOperationSet operations) { JSONObject objectJSON = coder.encode(state, operations, PointerEncoder.get()); final ParseRESTUserCommand command = ParseRESTUserCommand.serviceLogInUserCommand( objectJSON, state.sessionToken(), revocableSession); return command.executeAsync(client).onSuccess(new Continuation<JSONObject, ParseUser.State>() { @Override public ParseUser.State then(Task<JSONObject> task) { JSONObject result = task.getResult(); // TODO(grantland): Does the server really respond back with complete object data if the // object isn't new? boolean isNew = command.getStatusCode() == STATUS_CODE_CREATED; boolean isComplete = !isNew; return coder.decode(new ParseUser.State.Builder(), result, ParseDecoder.get()) .isComplete(isComplete) .isNew(isNew) .build(); } }); }
@Test public void testEncodeDecodeWithNullValues() { ParseUser.State state = new ParseUser.State.Builder() .sessionToken(null) .authData(null) .build(); ParseUserCurrentCoder coder = ParseUserCurrentCoder.get(); JSONObject object = coder.encode(state, null, PointerEncoder.get()); ParseUser.State.Builder builder = coder.decode(new ParseUser.State.Builder(), object, ParseDecoder.get()); state = builder.build(); assertNull(state.sessionToken()); assertEquals(0, state.authData().size()); } }
/** * Whether the ParseUser has been authenticated on this device. This will be true if the ParseUser * was obtained via a logIn or signUp method. Only an authenticated ParseUser can be saved (with * altered attributes) and deleted. */ public boolean isAuthenticated() { synchronized (mutex) { ParseUser current = ParseUser.getCurrentUser(); return isLazy() || (getState().sessionToken() != null && current != null && getObjectId().equals(current.getObjectId())); } }
@Test public void testDecodeSuccessWithoutSessionTokenAndAuthData() { JSONObject objectJson = new JSONObject(); ParseUserCurrentCoder coder = ParseUserCurrentCoder.get(); ParseUser.State.Builder builder = coder.decode(new ParseUser.State.Builder(), objectJson, ParseDecoder.get()); // We use the builder to build a state to verify the content in the builder ParseUser.State state = builder.build(); assertNull(state.sessionToken()); // We always return non-null for authData() assertEquals(0, state.authData().size()); }
private void verifyBasicUserState(JSONObject mockResponse, ParseUser.State state) throws JSONException { long createAtLong = ParseDateFormat.getInstance().parse(mockResponse.getString("createdAt")).getTime(); assertEquals(createAtLong, state.createdAt()); assertEquals(mockResponse.getString("objectId"), state.objectId()); assertEquals(mockResponse.getString("sessionToken"), state.sessionToken()); assertEquals(mockResponse.getString("username"), state.get("username")); assertEquals(mockResponse.getString("email"), state.get("email")); } }
/** * @return the session token for a user, if they are logged in. */ public String getSessionToken() { return getState().sessionToken(); }
private Task<Void> setSessionTokenInBackground(String newSessionToken) { synchronized (mutex) { State state = getState(); if (newSessionToken.equals(state.sessionToken())) { return Task.forResult(null); } State.Builder builder = state.newBuilder() .sessionToken(newSessionToken); setState(builder.build()); return saveCurrentUserAsync(this); } }