Skip to content

Commit 23874ff

Browse files
authored
Merge pull request #2766 from brandonpage/client-manager-logout
Fix use of non-current account in client manager and possible logout of current user.
2 parents b302878 + 3776e12 commit 23874ff

2 files changed

Lines changed: 446 additions & 6 deletions

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/rest/ClientManager.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,20 @@ public AccMgrAuthTokenProvider(ClientManager clientManager, String instanceUrl,
379379
@Override
380380
public String getNewAuthToken() {
381381
SalesforceSDKLogger.i(TAG, "Need new access token");
382-
final Account acc = clientManager.getAccount();
383-
if (acc == null) {
382+
UserAccountManager userAccountManager = SalesforceSDKManager.getInstance().getUserAccountManager();
383+
Account[] accounts = clientManager.getAccounts();
384+
Account matchingAccount = null;
385+
386+
// Find the account for this client.
387+
for (Account account : accounts) {
388+
UserAccount user = userAccountManager.buildUserAccount(account);
389+
if (user != null && lastNewAuthToken.equals(user.getAuthToken())) {
390+
matchingAccount = account;
391+
}
392+
}
393+
394+
// Fail early to ensure we don't logout the current user below by sending null.
395+
if (matchingAccount == null) {
384396
return null;
385397
}
386398

@@ -401,9 +413,8 @@ public String getNewAuthToken() {
401413
try {
402414

403415
// Invalidate current auth token.
404-
final String cachedAuthToken = clientManager.peekRestClient(acc).getAuthToken();
405-
clientManager.invalidateToken(cachedAuthToken);
406-
final UserAccount userAccount = refreshStaleToken(acc);
416+
clientManager.invalidateToken(lastNewAuthToken);
417+
final UserAccount userAccount = refreshStaleToken(matchingAccount);
407418

408419
// NB: userAccount will be null if refresh token is no longer valid
409420
newAuthToken = userAccount != null ? userAccount.getAuthToken() : null;
@@ -417,11 +428,12 @@ public String getNewAuthToken() {
417428
if (Looper.myLooper() == null) {
418429
Looper.prepare();
419430
}
431+
boolean showLoginPage = accounts.length > 1;
420432
// Note: As of writing (2024) this call will never succeed because revoke API is an
421433
// authenticated endpoint. However, there is no harm in attempting and the debug logs
422434
// produced may help developers better understand the state of their app.
423435
SalesforceSDKManager.getInstance()
424-
.logout(null, null, false, OAuth2.LogoutReason.REFRESH_TOKEN_EXPIRED);
436+
.logout(matchingAccount, null, showLoginPage, OAuth2.LogoutReason.REFRESH_TOKEN_EXPIRED);
425437
}
426438

427439
// Broadcasts an intent that the refresh token has been revoked.

0 commit comments

Comments
 (0)