Skip to content

Commit 834bfdf

Browse files
authored
Merge pull request #2724 from wmathurin/dev
Saving API instance URL in user account
2 parents 11f5401 + 21fddc6 commit 834bfdf

8 files changed

Lines changed: 121 additions & 41 deletions

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/accounts/UserAccount.java

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class UserAccount {
6363
public static final String LOGIN_SERVER = "loginServer";
6464
public static final String ID_URL = "idUrl";
6565
public static final String INSTANCE_SERVER = "instanceServer";
66+
public static final String API_INSTANCE_SERVER = "apiInstanceServer";
6667
public static final String ORG_ID = "orgId";
6768
public static final String USER_ID = "userId";
6869
public static final String USERNAME = "username";
@@ -109,6 +110,7 @@ public class UserAccount {
109110
private String loginServer;
110111
private String idUrl;
111112
private String instanceServer;
113+
private String apiInstanceServer;
112114
private String orgId;
113115
private String userId;
114116
private String username;
@@ -144,41 +146,42 @@ public class UserAccount {
144146
/**
145147
* Parameterized constructor.
146148
*
147-
* @param authToken Auth token.
148-
* @param refreshToken Refresh token.
149-
* @param loginServer Login server.
150-
* @param idUrl Identity URL.
151-
* @param instanceServer Instance server.
152-
* @param orgId Org ID.
153-
* @param userId User ID.
154-
* @param username Username.
155-
* @param accountName Account name.
156-
* @param communityId Community ID.
157-
* @param communityUrl Community URL.
158-
* @param firstName First Name.
159-
* @param lastName Last Name.
160-
* @param displayName Display Name.
161-
* @param email Email.
162-
* @param photoUrl Photo URL.
163-
* @param thumbnailUrl Thumbnail URL.
164-
* @param additionalOauthValues Additional OAuth values.
165-
* @param lightningDomain Lightning domain.
166-
* @param lightningSid Lightning SID.
167-
* @param vfDomain VF domain.
168-
* @param vfSid VF SID.
169-
* @param contentDomain Content domain.
170-
* @param contentSid Content SID.
171-
* @param nativeLogin If the account was added with native auth.
172-
* @param language User's language,
173-
* @param locale User's locale,
174-
* @param cookieClientSrc cookie client src
175-
* @param cookieSidClient cookie sid client
176-
* @param sidCookieName sid cookie name
177-
* @param clientId oauth client id
178-
* @param parentSid parent sid
179-
* @param tokenFormat token format
180-
* @param beaconChildConsumerKey beacon child consumer key
149+
* @param authToken Auth token.
150+
* @param refreshToken Refresh token.
151+
* @param loginServer Login server.
152+
* @param idUrl Identity URL.
153+
* @param instanceServer Instance server.
154+
* @param orgId Org ID.
155+
* @param userId User ID.
156+
* @param username Username.
157+
* @param accountName Account name.
158+
* @param communityId Community ID.
159+
* @param communityUrl Community URL.
160+
* @param firstName First Name.
161+
* @param lastName Last Name.
162+
* @param displayName Display Name.
163+
* @param email Email.
164+
* @param photoUrl Photo URL.
165+
* @param thumbnailUrl Thumbnail URL.
166+
* @param additionalOauthValues Additional OAuth values.
167+
* @param lightningDomain Lightning domain.
168+
* @param lightningSid Lightning SID.
169+
* @param vfDomain VF domain.
170+
* @param vfSid VF SID.
171+
* @param contentDomain Content domain.
172+
* @param contentSid Content SID.
173+
* @param nativeLogin If the account was added with native auth.
174+
* @param language User's language,
175+
* @param locale User's locale,
176+
* @param cookieClientSrc cookie client src
177+
* @param cookieSidClient cookie sid client
178+
* @param sidCookieName sid cookie name
179+
* @param clientId oauth client id
180+
* @param parentSid parent sid
181+
* @param tokenFormat token format
182+
* @param beaconChildConsumerKey beacon child consumer key
181183
* @param beaconChildConsumerSecret beacon child consumer secret
184+
* @param apiInstanceServer API instance server
182185
*/
183186
UserAccount(String authToken, String refreshToken,
184187
String loginServer, String idUrl, String instanceServer,
@@ -190,12 +193,13 @@ public class UserAccount {
190193
String contentDomain, String contentSid, String csrfToken, Boolean nativeLogin,
191194
String language, String locale, String cookieClientSrc, String cookieSidClient,
192195
String sidCookieName, String clientId, String parentSid, String tokenFormat,
193-
String beaconChildConsumerKey, String beaconChildConsumerSecret) {
196+
String beaconChildConsumerKey, String beaconChildConsumerSecret, String apiInstanceServer) {
194197
this.authToken = authToken;
195198
this.refreshToken = refreshToken;
196199
this.loginServer = loginServer;
197200
this.idUrl = idUrl;
198201
this.instanceServer = instanceServer;
202+
this.apiInstanceServer = apiInstanceServer;
199203
this.orgId = orgId;
200204
this.userId = userId;
201205
this.username = username;
@@ -244,6 +248,7 @@ public class UserAccount {
244248
loginServer = object.optString(LOGIN_SERVER, null);
245249
idUrl = object.optString(ID_URL, null);
246250
instanceServer = object.optString(INSTANCE_SERVER, null);
251+
apiInstanceServer = object.optString(API_INSTANCE_SERVER, null);
247252
orgId = object.optString(ORG_ID, null);
248253
userId = object.optString(USER_ID, null);
249254
username = object.optString(USERNAME, null);
@@ -301,6 +306,7 @@ public UserAccount(JSONObject object) {
301306
loginServer = bundle.getString(LOGIN_SERVER);
302307
idUrl = bundle.getString(ID_URL);
303308
instanceServer = bundle.getString(INSTANCE_SERVER);
309+
apiInstanceServer = bundle.getString(API_INSTANCE_SERVER);
304310
orgId = bundle.getString(ORG_ID);
305311
userId = bundle.getString(USER_ID);
306312
username = bundle.getString(USERNAME);
@@ -389,6 +395,15 @@ public String getInstanceServer() {
389395
return instanceServer;
390396
}
391397

398+
/**
399+
* Returns the API instance server for this user account.
400+
*
401+
* @return API instance server.
402+
*/
403+
public String getApiInstanceServer() {
404+
return apiInstanceServer;
405+
}
406+
392407
/**
393408
* Returns the org ID for this user account.
394409
*
@@ -911,6 +926,7 @@ JSONObject toJson(List<String> additionalOauthKeys) {
911926
object.put(LOGIN_SERVER, loginServer);
912927
object.put(ID_URL, idUrl);
913928
object.put(INSTANCE_SERVER, instanceServer);
929+
object.put(API_INSTANCE_SERVER, apiInstanceServer);
914930
object.put(ORG_ID, orgId);
915931
object.put(USER_ID, userId);
916932
object.put(USERNAME, username);
@@ -968,6 +984,7 @@ Bundle toBundle(List<String> additionalOauthKeys) {
968984
object.putString(LOGIN_SERVER, loginServer);
969985
object.putString(ID_URL, idUrl);
970986
object.putString(INSTANCE_SERVER, instanceServer);
987+
object.putString(API_INSTANCE_SERVER, apiInstanceServer);
971988
object.putString(ORG_ID, orgId);
972989
object.putString(USER_ID, userId);
973990
object.putString(USERNAME, username);

libs/SalesforceSDK/src/com/salesforce/androidsdk/accounts/UserAccountBuilder.kt

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class UserAccountBuilder private constructor() {
3838
private var loginServer: String? = null
3939
private var idUrl: String? = null
4040
private var instanceServer: String? = null
41+
private var apiInstanceServer: String? = null
4142
private var orgId: String? = null
4243
private var userId: String? = null
4344
private var username: String? = null
@@ -84,6 +85,7 @@ class UserAccountBuilder private constructor() {
8485
return authToken(tr.authToken)
8586
.refreshToken(tr.refreshToken)
8687
.instanceServer(tr.instanceUrl)
88+
.apiInstanceServer(tr.apiInstanceUrl)
8789
.idUrl(tr.idUrl)
8890
.orgId(tr.orgId)
8991
.userId(tr.userId)
@@ -139,6 +141,7 @@ class UserAccountBuilder private constructor() {
139141
.loginServer(userAccount.loginServer)
140142
.idUrl(userAccount.idUrl)
141143
.instanceServer(userAccount.instanceServer)
144+
.apiInstanceServer(userAccount.apiInstanceServer)
142145
.orgId(userAccount.orgId)
143146
.userId(userAccount.userId)
144147
.username(userAccount.username)
@@ -234,6 +237,16 @@ class UserAccountBuilder private constructor() {
234237
return if (!allowUnset && instanceServer == null) this else apply { this.instanceServer = instanceServer }
235238
}
236239

240+
/**
241+
* Sets api instance server.
242+
*
243+
* @param apiInstanceServer API instance server.
244+
* @return Instance of this class.
245+
*/
246+
fun apiInstanceServer(apiInstanceServer: String?): UserAccountBuilder {
247+
return if (!allowUnset && apiInstanceServer == null) this else apply { this.apiInstanceServer = apiInstanceServer }
248+
}
249+
237250
/**
238251
* Sets org ID.
239252
*
@@ -566,12 +579,43 @@ class UserAccountBuilder private constructor() {
566579
*/
567580
fun build(): UserAccount {
568581
return UserAccount(
569-
authToken, refreshToken, loginServer, idUrl, instanceServer, orgId,
570-
userId, username, accountName, communityId, communityUrl, firstName, lastName,
571-
displayName, email, photoUrl, thumbnailUrl, additionalOauthValues, lightningDomain,
572-
lightningSid, vfDomain, vfSid, contentDomain, contentSid, csrfToken, nativeLogin,
573-
language, locale, cookieClientSrc, cookieSidClient, sidCookieName, clientId,
574-
parentSid, tokenFormat, beaconChildConsumerKey, beaconChildConsumerSecret
582+
authToken,
583+
refreshToken,
584+
loginServer,
585+
idUrl,
586+
instanceServer,
587+
orgId,
588+
userId,
589+
username,
590+
accountName,
591+
communityId,
592+
communityUrl,
593+
firstName,
594+
lastName,
595+
displayName,
596+
email,
597+
photoUrl,
598+
thumbnailUrl,
599+
additionalOauthValues,
600+
lightningDomain,
601+
lightningSid,
602+
vfDomain,
603+
vfSid,
604+
contentDomain,
605+
contentSid,
606+
csrfToken,
607+
nativeLogin,
608+
language,
609+
locale,
610+
cookieClientSrc,
611+
cookieSidClient,
612+
sidCookieName,
613+
clientId,
614+
parentSid,
615+
tokenFormat,
616+
beaconChildConsumerKey,
617+
beaconChildConsumerSecret,
618+
apiInstanceServer
575619
)
576620
}
577621

libs/SalesforceSDK/src/com/salesforce/androidsdk/accounts/UserAccountManager.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,7 @@ public Bundle updateAccount(Account account, UserAccount userAccount) {
509509
final String loginServer = decryptUserData(account, AuthenticatorService.KEY_LOGIN_URL, encryptionKey);
510510
final String idUrl = decryptUserData(account, AuthenticatorService.KEY_ID_URL, encryptionKey);
511511
final String instanceServer = decryptUserData(account, AuthenticatorService.KEY_INSTANCE_URL, encryptionKey);
512+
final String apiInstanceServer = decryptUserData(account, AuthenticatorService.KEY_API_INSTANCE_URL, encryptionKey);
512513
final String orgId = decryptUserData(account, AuthenticatorService.KEY_ORG_ID, encryptionKey);
513514
final String userId = decryptUserData(account, AuthenticatorService.KEY_USER_ID, encryptionKey);
514515
final String username = decryptUserData(account, AuthenticatorService.KEY_USERNAME, encryptionKey);
@@ -562,6 +563,7 @@ public Bundle updateAccount(Account account, UserAccount userAccount) {
562563
.loginServer(loginServer)
563564
.idUrl(idUrl)
564565
.instanceServer(instanceServer)
566+
.apiInstanceServer(apiInstanceServer)
565567
.orgId(orgId)
566568
.userId(userId)
567569
.username(username)
@@ -710,6 +712,7 @@ private Bundle buildAuthBundle(UserAccount userAccount) {
710712
extras.putString(AuthenticatorService.KEY_LOGIN_URL, SalesforceSDKManager.encrypt(userAccount.getLoginServer(), encryptionKey));
711713
extras.putString(AuthenticatorService.KEY_ID_URL, SalesforceSDKManager.encrypt(userAccount.getIdUrl(), encryptionKey));
712714
extras.putString(AuthenticatorService.KEY_INSTANCE_URL, SalesforceSDKManager.encrypt(userAccount.getInstanceServer(), encryptionKey));
715+
extras.putString(AuthenticatorService.KEY_API_INSTANCE_URL, SalesforceSDKManager.encrypt(userAccount.getApiInstanceServer(), encryptionKey));
713716
extras.putString(AuthenticatorService.KEY_CLIENT_ID, SalesforceSDKManager.encrypt(userAccount.getClientId(), encryptionKey));
714717
extras.putString(AuthenticatorService.KEY_ORG_ID, SalesforceSDKManager.encrypt(userAccount.getOrgId(), encryptionKey));
715718
extras.putString(AuthenticatorService.KEY_USER_ID, SalesforceSDKManager.encrypt(userAccount.getUserId(), encryptionKey));

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/AuthenticatorService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class AuthenticatorService extends Service {
5858
// Keys to extra info in the account.
5959
public static final String KEY_LOGIN_URL = "loginUrl";
6060
public static final String KEY_INSTANCE_URL = "instanceUrl";
61+
public static final String KEY_API_INSTANCE_URL = "apiInstanceUrl";
6162
public static final String KEY_USER_ID = "userId";
6263
public static final String KEY_CLIENT_ID = "clientId";
6364
public static final String KEY_ORG_ID = "orgId";

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/OAuth2.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public class OAuth2 {
9797
protected static final String FORMAT = "format";
9898
private static final String ID = "id";
9999
private static final String INSTANCE_URL = "instance_url";
100+
private static final String API_INSTANCE_URL = "api_instance_url";
100101
protected static final String JSON = "json";
101102
private static final String MOBILE_POLICY = "mobile_policy";
102103
private static final String SCREEN_LOCK_TIMEOUT = "screen_lock";
@@ -808,6 +809,7 @@ public static class TokenEndpointResponse {
808809
public String authToken;
809810
public String refreshToken;
810811
public String instanceUrl;
812+
public String apiInstanceUrl;
811813
public String idUrl;
812814
public String idUrlWithInstance;
813815
public String orgId;
@@ -844,6 +846,7 @@ public TokenEndpointResponse(Map<String, String> callbackUrlParams, List<String>
844846
authToken = callbackUrlParams.get(ACCESS_TOKEN);
845847
refreshToken = callbackUrlParams.get(REFRESH_TOKEN);
846848
instanceUrl = callbackUrlParams.get(INSTANCE_URL);
849+
apiInstanceUrl = callbackUrlParams.get(API_INSTANCE_URL);
847850
idUrl = callbackUrlParams.get(ID);
848851
code = callbackUrlParams.get(CODE);
849852
computeOtherFields();
@@ -903,6 +906,7 @@ public TokenEndpointResponse(Response response, List<String> additionalOauthKeys
903906
Log.d(TAG, "parsedResponse-->" + parsedResponse);
904907
authToken = parsedResponse.getString(ACCESS_TOKEN);
905908
instanceUrl = parsedResponse.getString(INSTANCE_URL);
909+
apiInstanceUrl = parsedResponse.getString(API_INSTANCE_URL);
906910
idUrl = parsedResponse.getString(ID);
907911
computeOtherFields();
908912
if (parsedResponse.has(REFRESH_TOKEN)) {

libs/SalesforceSDK/src/com/salesforce/androidsdk/util/test/TestCredentials.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
import com.salesforce.androidsdk.R;
3232
import com.salesforce.androidsdk.rest.ApiVersionStrings;
33+
import com.salesforce.androidsdk.util.JSONObjectHelper;
3334
import com.salesforce.androidsdk.util.ResourceReaderHelper;
3435

3536
import org.json.JSONObject;
@@ -49,6 +50,7 @@ public class TestCredentials {
4950
public static String USER_ID;
5051
public static String LOGIN_URL;
5152
public static String INSTANCE_URL;
53+
public static String API_INSTANCE_URL;
5254
public static String COMMUNITY_URL;
5355
public static String IDENTITY_URL;
5456
public static String CLIENT_ID;
@@ -69,6 +71,7 @@ public static void init(Context ctx) {
6971
USER_ID = json.getString("user_id");
7072
LOGIN_URL = json.getString("test_login_domain");
7173
INSTANCE_URL = json.getString("instance_url");
74+
API_INSTANCE_URL = JSONObjectHelper.optString(json, "api_instance_url");
7275
COMMUNITY_URL = json.optString("community_url", INSTANCE_URL /* in case the test_credentials.json was obtained for a user / org without community setup */);
7376
IDENTITY_URL = json.getString("identity_url");
7477
CLIENT_ID = json.getString("test_client_id");

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/accounts/UserAccountTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class UserAccountTest {
6969
public static final String TEST_USERNAME = "test_username";
7070
public static final String TEST_LOGIN_URL = "https://test.salesforce.com";
7171
public static final String TEST_INSTANCE_URL = "https://cs1.salesforce.com";
72+
public static final String TEST_API_INSTANCE_URL = "https://api.salesforce.com";
7273
public static final String TEST_IDENTITY_URL = "https://test.salesforce.com/" + TEST_ORG_ID + "/" + TEST_USER_ID;
7374
public static final String TEST_COMMUNITY_URL = "https://mobilesdk.cs1.my.salesforce.com";
7475
public static final String TEST_AUTH_TOKEN = "test_auth_token";
@@ -375,6 +376,7 @@ private JSONObject createTestAccountJSON() throws JSONException{
375376
object.put(UserAccount.LOGIN_SERVER, TEST_LOGIN_URL);
376377
object.put(UserAccount.ID_URL, TEST_IDENTITY_URL);
377378
object.put(UserAccount.INSTANCE_SERVER, TEST_INSTANCE_URL);
379+
object.put(UserAccount.API_INSTANCE_SERVER, TEST_API_INSTANCE_URL);
378380
object.put(UserAccount.ORG_ID, TEST_ORG_ID);
379381
object.put(UserAccount.USER_ID, TEST_USER_ID);
380382
object.put(UserAccount.USERNAME, TEST_USERNAME);
@@ -419,6 +421,7 @@ private Bundle createTestAccountBundle() {
419421
object.putString(UserAccount.LOGIN_SERVER, TEST_LOGIN_URL);
420422
object.putString(UserAccount.ID_URL, TEST_IDENTITY_URL);
421423
object.putString(UserAccount.INSTANCE_SERVER, TEST_INSTANCE_URL);
424+
object.putString(UserAccount.API_INSTANCE_SERVER, TEST_API_INSTANCE_URL);
422425
object.putString(UserAccount.ORG_ID, TEST_ORG_ID);
423426
object.putString(UserAccount.USER_ID, TEST_USER_ID);
424427
object.putString(UserAccount.USERNAME, TEST_USERNAME);
@@ -463,6 +466,7 @@ public static UserAccount createTestAccount() {
463466
.loginServer(TEST_LOGIN_URL)
464467
.idUrl(TEST_IDENTITY_URL)
465468
.instanceServer(TEST_INSTANCE_URL)
469+
.apiInstanceServer(TEST_API_INSTANCE_URL)
466470
.orgId(TEST_ORG_ID)
467471
.userId(TEST_USER_ID)
468472
.username(TEST_USERNAME)
@@ -529,6 +533,7 @@ void checkTestAccount(UserAccount account, boolean expectBeaconChildFields) {
529533
Assert.assertEquals("Login server URL should match", TEST_LOGIN_URL, account.getLoginServer());
530534
Assert.assertEquals("Identity URL should match", TEST_IDENTITY_URL, account.getIdUrl());
531535
Assert.assertEquals("Instance URL should match", TEST_INSTANCE_URL, account.getInstanceServer());
536+
Assert.assertEquals("API instance URL should match", TEST_API_INSTANCE_URL, account.getApiInstanceServer());
532537
Assert.assertEquals("Org ID should match", TEST_ORG_ID, account.getOrgId());
533538
Assert.assertEquals("User ID should match", TEST_USER_ID, account.getUserId());
534539
Assert.assertEquals("User name should match", TEST_USERNAME, account.getUsername());
@@ -575,6 +580,7 @@ void checkOtherTestAccount(UserAccount account) {
575580
Assert.assertEquals("Login server URL should match", TEST_LOGIN_URL, account.getLoginServer());
576581
Assert.assertEquals("Identity URL should match", TEST_IDENTITY_URL, account.getIdUrl());
577582
Assert.assertEquals("Instance URL should match", TEST_INSTANCE_URL, account.getInstanceServer());
583+
Assert.assertEquals("API instance URL should match", TEST_API_INSTANCE_URL, account.getApiInstanceServer());
578584
Assert.assertEquals("Org ID should match", TEST_ORG_ID_2, account.getOrgId());
579585
Assert.assertEquals("User ID should match", TEST_USER_ID_2, account.getUserId());
580586
Assert.assertEquals("User name should match", TEST_USERNAME_2, account.getUsername());
@@ -646,6 +652,7 @@ private Map<String, String> createTokenEndpointParams() {
646652
params.put("access_token", TEST_AUTH_TOKEN);
647653
params.put("refresh_token", TEST_REFRESH_TOKEN);
648654
params.put("instance_url", TEST_INSTANCE_URL);
655+
params.put("api_instance_url", TEST_API_INSTANCE_URL);
649656
params.put("id", TEST_IDENTITY_URL);
650657
params.put("sfdc_community_id", TEST_COMMUNITY_ID);
651658
params.put("sfdc_community_url", TEST_COMMUNITY_URL);

native/NativeSampleApps/RestExplorer/src/com/salesforce/samples/restexplorer/ExplorerActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,7 @@ private void exportCredentials() {
791791
credsMap.put("test_redirect_uri", config.getOauthRedirectURI());
792792
credsMap.put("refresh_token", user.getRefreshToken());
793793
credsMap.put("instance_url", user.getInstanceServer());
794+
credsMap.put("api_instance_url", user.getApiInstanceServer());
794795
credsMap.put("identity_url", user.getIdUrl());
795796
credsMap.put("access_token", "__NOT_REQUIRED__");
796797
credsMap.put("organization_id", user.getOrgId());

0 commit comments

Comments
 (0)