Skip to content

Commit 7aef171

Browse files
@W-19803824: [Android] Provide new field on SalesforceSDKManager to allow an app to indicate it can do the welcome login discovery flow
1 parent 28c0d83 commit 7aef171

3 files changed

Lines changed: 90 additions & 16 deletions

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/app/SalesforceSDKManager.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,13 @@ open class SalesforceSDKManager protected constructor(
372372
@set:Synchronized
373373
var useWebServerAuthentication = true
374374

375+
376+
/**
377+
* Whether or not the app supports welcome discovery. This should only be
378+
* enabled if the connected app is supported.
379+
*/
380+
var supportsWelcomeDiscovery = false
381+
375382
/**
376383
* Optionally, enables the hybrid authentication flow. Defaults to true
377384
*/
@@ -728,7 +735,7 @@ open class SalesforceSDKManager protected constructor(
728735
* Cleans cached credentials and data.
729736
*
730737
* @param frontActivity The front activity
731-
* @param account The user account
738+
* @param userAccount The user account
732739
* @param shouldDismissActivity Dismisses the current activity if true; does
733740
* nothing otherwise
734741
*/

libs/SalesforceSDK/src/com/salesforce/androidsdk/ui/LoginActivity.kt

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ import com.salesforce.androidsdk.auth.OAuth2.TokenEndpointResponse
132132
import com.salesforce.androidsdk.auth.OAuth2.swapJWTForTokens
133133
import com.salesforce.androidsdk.auth.idp.interfaces.SPManager.Status
134134
import com.salesforce.androidsdk.auth.idp.interfaces.SPManager.StatusUpdateCallback
135-
import com.salesforce.androidsdk.config.BootConfig.getBootConfig
136135
import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.ManagedAppCertAlias
137136
import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.RequireCertAuth
138137
import com.salesforce.androidsdk.config.RuntimeConfig.getRuntimeConfig
@@ -353,7 +352,7 @@ open class LoginActivity : FragmentActivity() {
353352
super.onNewIntent(intent)
354353

355354
// If the intent is a callback from Chrome and not another recognized intent URL, process it and do nothing else.
356-
if (isCustomTabAuthFinishedCallback(intent) && intent.data?.let { (isQrCodeLoginUrlIntent(intent) || isSalesforceWelcomeDiscoveryMobileUrl(this, it)) } != true) {
355+
if (isCustomTabAuthFinishedCallback(intent) && intent.data?.let { (isQrCodeLoginUrlIntent(intent) || isSalesforceWelcomeDiscoveryMobileUrl(it)) } != true) {
357356
completeAdvAuthFlow(intent)
358357
return
359358
}
@@ -996,7 +995,7 @@ open class LoginActivity : FragmentActivity() {
996995
private fun isSwitchFromSalesforceWelcomeDiscoveryToDefaultLogin(
997996
proposedSelectedServerUrl: Uri
998997
) = viewModel.loginUrl.value?.toUri()?.let { loginUrl ->
999-
isSalesforceWelcomeDiscoveryMobileUrl(this, loginUrl) && !(isSalesforceWelcomeDiscoveryMobileUrl(this, proposedSelectedServerUrl))
998+
isSalesforceWelcomeDiscoveryMobileUrl(loginUrl) && !(isSalesforceWelcomeDiscoveryMobileUrl(proposedSelectedServerUrl))
1000999
} ?: false
10011000

10021001
/**
@@ -1068,7 +1067,7 @@ open class LoginActivity : FragmentActivity() {
10681067
* Salesforce Welcome Discovery mobile URL
10691068
*/
10701069
private fun useSalesforceWelcomeDiscoveryMobileUrl(uri: Uri) {
1071-
if (isSalesforceWelcomeDiscoveryMobileUrl(this, uri)) {
1070+
if (isSalesforceWelcomeDiscoveryMobileUrl(uri)) {
10721071
viewModel.loginUrl.postValue(uri.toString())
10731072
}
10741073
}
@@ -1438,16 +1437,20 @@ open class LoginActivity : FragmentActivity() {
14381437
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_CALLBACK_URL_QUERY_PARAMETER_KEY_MY_DOMAIN = "my_domain"
14391438

14401439
/** The Salesforce Welcome Discovery mobile URL's callback URL query string parameter name */
1441-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL = "callback_url"
1440+
@VisibleForTesting
1441+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL = "callback_url"
14421442

14431443
/** The Salesforce Welcome Discovery mobile URL's client id (consumer key) query string parameter name */
1444-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID = "client_id"
1444+
@VisibleForTesting
1445+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID = "client_id"
14451446

14461447
/** The Salesforce Welcome Discovery mobile URL's client version query string parameter name */
1447-
private const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION = "client_version"
1448+
@VisibleForTesting
1449+
const val SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION = "client_version"
14481450

14491451
/** The URL path used by Salesforce Welcome Discovery URLs */
1450-
private const val SALESFORCE_WELCOME_DISCOVERY_URL_PATH = "/discovery"
1452+
@VisibleForTesting
1453+
const val SALESFORCE_WELCOME_DISCOVERY_URL_PATH = "/discovery"
14511454

14521455
/**
14531456
* Determines if the provided URL has the Salesforce Welcome Discovery
@@ -1474,21 +1477,42 @@ open class LoginActivity : FragmentActivity() {
14741477
* consumer key or false otherwise
14751478
*/
14761479
fun isSalesforceWelcomeDiscoveryMobileUrl(
1477-
context: Context,
14781480
uri: Uri,
14791481
): Boolean {
14801482
if (!uri.isHierarchical) return false
1481-
val clientIdParameter = uri.getQueryParameter(SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID)
1482-
return isSalesforceWelcomeDiscoveryUrlPath(uri) && uri.queryParameterNames?.contains(
1483+
1484+
val isDiscovery = isSalesforceWelcomeDiscoveryUrlPath(uri)
1485+
val discoveryEnabled = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
1486+
1487+
if (isDiscovery && !discoveryEnabled) {
1488+
w(TAG, "'${uri}' is a discovery domain, but welcome discovery isn't enabled.")
1489+
}
1490+
1491+
return isDiscovery && discoveryEnabled && uri.queryParameterNames?.contains(
14831492
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID
1484-
) != null && uri.queryParameterNames?.contains(
1493+
) == true && uri.queryParameterNames?.contains(
14851494
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION
1486-
) != null && uri.queryParameterNames?.contains(
1495+
) == true && uri.queryParameterNames?.contains(
14871496
SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL
1488-
) != null && clientIdParameter == getBootConfig(context).remoteAccessConsumerKey &&
1489-
(clientIdParameter == "SfdcMobileChatterAndroid" || clientIdParameter == "SfdcMobileChatteriOS") // TODO: Keep this list of client ids up to date with those supported by Salesforce Welcome Discovery or remove it when no longer required.
1497+
) == true
14901498
}
14911499

1500+
/**
1501+
* Determines if the provided URL has the Salesforce Welcome Discovery
1502+
* path and parameters for mobile callback. The client id (consumer
1503+
* key) of the URL must match the boot config's consumer key.
1504+
* @param url The URL to examine for the Salesforce Welcome Discovery
1505+
* path and parameters for mobile callback
1506+
* @return Boolean true if the URL has the Salesforce Welcome Discovery
1507+
* path and parameters for mobile callback and matches the boot config's
1508+
* consumer key or false otherwise
1509+
*/
1510+
@Deprecated(message = "Deprecated in 13.2.0. Will be removed in 14.0.0. Use isSalesforceWelcomeDiscoveryMobileUrl(Uri).")
1511+
fun isSalesforceWelcomeDiscoveryMobileUrl(
1512+
@Suppress("unused") context: Context,
1513+
uri: Uri,
1514+
) = isSalesforceWelcomeDiscoveryMobileCallbackUrl(uri)
1515+
14921516
/**
14931517
* Determines if the provided URL is a Salesforce Welcome Discovery
14941518
* mobile callback URL.

libs/test/SalesforceSDKTest/src/com/salesforce/androidsdk/ui/LoginActivityTest.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
3636
import com.salesforce.androidsdk.app.SalesforceSDKManager
3737
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HINT
3838
import com.salesforce.androidsdk.ui.LoginActivity.Companion.EXTRA_KEY_LOGIN_HOST
39+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL
40+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID
41+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION
42+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.SALESFORCE_WELCOME_DISCOVERY_URL_PATH
43+
import com.salesforce.androidsdk.ui.LoginActivity.Companion.isSalesforceWelcomeDiscoveryMobileUrl
3944
import org.junit.Assert.assertEquals
4045
import org.junit.Assert.assertFalse
4146
import org.junit.Assert.assertTrue
@@ -187,4 +192,42 @@ class LoginActivityTest {
187192
}
188193
}
189194
}
195+
196+
@Test
197+
fun testIsWelcomeDiscoveryUri() {
198+
val supportWelcomeDiscovery = SalesforceSDKManager.getInstance().supportsWelcomeDiscovery
199+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = false
200+
201+
val validUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
202+
203+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(validUrl.toUri()))
204+
205+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = true
206+
207+
val incorrectPathUrl = "https://welcome.salesforce.com/other/path?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
208+
val emptyPathUrl = "https://welcome.salesforce.com?/$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
209+
val missingPathUrl = "https://welcome.salesforce.com?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
210+
211+
val missingClientIdUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
212+
val missingClientVersionUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CALLBACK_URL=Z"
213+
val missingCallbackUrl = "https://welcome.salesforce.com$SALESFORCE_WELCOME_DISCOVERY_URL_PATH?$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_ID=X&$SALESFORCE_WELCOME_DISCOVERY_MOBILE_URL_QUERY_PARAMETER_KEY_CLIENT_VERSION=Y"
214+
215+
val otherUrl = "https://login.salesforce.com"
216+
217+
assertTrue(isSalesforceWelcomeDiscoveryMobileUrl(validUrl.toUri()))
218+
219+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(incorrectPathUrl.toUri()))
220+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(emptyPathUrl.toUri()))
221+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(missingPathUrl.toUri()))
222+
223+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(missingClientIdUrl.toUri()))
224+
225+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(missingClientVersionUrl.toUri()))
226+
227+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(missingCallbackUrl.toUri()))
228+
229+
assertFalse(isSalesforceWelcomeDiscoveryMobileUrl(otherUrl.toUri()))
230+
231+
SalesforceSDKManager.getInstance().supportsWelcomeDiscovery = supportWelcomeDiscovery
232+
}
190233
}

0 commit comments

Comments
 (0)