Skip to content

Commit e07be19

Browse files
committed
Move Native Login and IDP to new AuthenticationUtlities. Remove LoginOptions and OAuthWebViewHelper entirely.
1 parent d08a45c commit e07be19

7 files changed

Lines changed: 45 additions & 779 deletions

File tree

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/AuthenticationUtilities.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ import com.salesforce.androidsdk.rest.RestClient.clearCaches
4646
import com.salesforce.androidsdk.security.BiometricAuthenticationManager
4747
import com.salesforce.androidsdk.security.BiometricAuthenticationManager.Companion.isBiometricAuthenticationEnabled
4848
import com.salesforce.androidsdk.security.ScreenLockManager
49-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.MUST_BE_MANAGED_APP_PERM
5049
import com.salesforce.androidsdk.util.SalesforceSDKLogger.e
5150
import com.salesforce.androidsdk.util.SalesforceSDKLogger.w
5251
import kotlinx.coroutines.CoroutineScope
@@ -60,6 +59,12 @@ import org.json.JSONObject
6059
import java.net.URI
6160
import java.util.function.Consumer
6261

62+
/**
63+
* Set a custom permission on the connected application with that name
64+
* for the application to be restricted to managed devices
65+
*/
66+
private const val MUST_BE_MANAGED_APP_PERM = "must_be_managed_app"
67+
6368
private const val TAG = "AuthenticationUtilities"
6469

6570
/**
@@ -79,6 +84,7 @@ internal fun onAuthFlowComplete(
7984
onAuthFlowError: (error: String, errorDesc: String?, e: Throwable?) -> Unit,
8085
onAuthFlowSuccess: (userAccount: UserAccount) -> Unit,
8186
buildAccountName: (username: String?, instanceServer: String?) -> String = ::defaultBuildAccountName,
87+
nativeLogin: Boolean = false,
8288
) {
8389
val context = SalesforceSDKManager.getInstance().appContext
8490
val blockIntegrationUser = SalesforceSDKManager.getInstance().shouldBlockSalesforceIntegrationUser &&
@@ -124,6 +130,7 @@ internal fun onAuthFlowComplete(
124130
.accountName(buildAccountName(userIdentity?.username, tokenResponse.instanceUrl))
125131
.loginServer(loginServer)
126132
.clientId(consumerKey)
133+
.nativeLogin(nativeLogin)
127134
.build()
128135
account.downloadProfilePhoto()
129136

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/NativeLoginManager.kt

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import android.util.Base64.URL_SAFE
3737
import android.util.Base64.encodeToString
3838
import android.util.Patterns.EMAIL_ADDRESS
3939
import androidx.core.os.bundleOf
40-
import com.salesforce.androidsdk.accounts.UserAccount
4140
import com.salesforce.androidsdk.app.SalesforceSDKManager
4241
import com.salesforce.androidsdk.auth.NativeLoginManager.StartRegistrationRequestBody.UserData
4342
import com.salesforce.androidsdk.auth.OAuth2.AUTHORIZATION
@@ -68,7 +67,6 @@ import com.salesforce.androidsdk.auth.interfaces.NativeLoginResult.Success
6867
import com.salesforce.androidsdk.auth.interfaces.NativeLoginResult.UnknownError
6968
import com.salesforce.androidsdk.auth.interfaces.OtpRequestResult
7069
import com.salesforce.androidsdk.auth.interfaces.OtpVerificationMethod
71-
import com.salesforce.androidsdk.rest.LoginOptions
7270
import com.salesforce.androidsdk.rest.RestClient.AsyncRequestCallback
7371
import com.salesforce.androidsdk.rest.RestRequest
7472
import com.salesforce.androidsdk.rest.RestRequest.RestEndpoint.LOGIN
@@ -77,8 +75,6 @@ import com.salesforce.androidsdk.rest.RestResponse
7775
import com.salesforce.androidsdk.security.BiometricAuthenticationManager.Companion.SHOW_BIOMETRIC
7876
import com.salesforce.androidsdk.security.SalesforceKeyGenerator.getRandom128ByteKey
7977
import com.salesforce.androidsdk.security.SalesforceKeyGenerator.getSHA256Hash
80-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper
81-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.OAuthWebviewHelperEvents
8278
import com.salesforce.androidsdk.util.SalesforceSDKLogger
8379
import okhttp3.MediaType.Companion.toMediaTypeOrNull
8480
import okhttp3.RequestBody
@@ -197,51 +193,32 @@ internal class NativeLoginManager(
197193

198194
private suspend fun suspendFinishAuthFlow(tokenResponse: RestResponse): NativeLoginResult {
199195
val appContext = SalesforceSDKManager.getInstance().appContext
200-
val loginOptions = LoginOptions(loginUrl, clientId, emptyArray<String>())
201196
val tokenEndpointResponse = TokenEndpointResponse(tokenResponse.rawResponse)
202197
tokenResponse.consumeQuietly()
203198

204199
return suspendCoroutine { continuation ->
205-
OAuthWebviewHelper(appContext, object : OAuthWebviewHelperEvents {
206-
override fun loadingLoginPage(loginUrl: String) {
207-
/* This will never be called. */
208-
}
209-
210-
override fun onAccountAuthenticatorResult(authResult: Bundle) {
211-
/* Unused */
212-
}
213-
214-
override fun finish(userAccount: UserAccount?) {
215-
if (userAccount != null) {
216-
accountManager.switchToUser(userAccount)
217-
// Start App's Main Activity
218-
appContext.startActivity(
219-
Intent(appContext, SalesforceSDKManager.getInstance().mainActivityClass).apply {
220-
setPackage(appContext.packageName)
221-
flags = FLAG_ACTIVITY_NEW_TASK
222-
}
223-
)
224-
}
225-
226-
/**
227-
* We need to wait until the main activity is launched before
228-
* returning success back to the app's Native Login Activity. If we
229-
* don't they call finish() too early and the activity will be restarted.
230-
* This will cause it to hang around forever behind the main activity.
231-
*/
232-
continuation.resume(
233-
when (userAccount) {
234-
null -> {
235-
SalesforceSDKLogger.e(TAG, "Unable to create user account from successful token response.")
236-
UnknownError
237-
}
238-
239-
else -> Success
200+
onAuthFlowComplete(
201+
tokenResponse = tokenEndpointResponse,
202+
loginServer = loginUrl,
203+
consumerKey = clientId,
204+
onAuthFlowError = { error, errorDesc, e ->
205+
SalesforceSDKLogger.e(TAG, "$error: $errorDesc", e)
206+
continuation.resume(UnknownError)
207+
},
208+
onAuthFlowSuccess = { userAccount ->
209+
accountManager.switchToUser(userAccount)
210+
// Start App's Main Activity
211+
appContext.startActivity(
212+
Intent(appContext, SalesforceSDKManager.getInstance().mainActivityClass).apply {
213+
setPackage(appContext.packageName)
214+
flags = FLAG_ACTIVITY_NEW_TASK
240215
}
241216
)
242-
}
243217

244-
}, loginOptions).onAuthFlowComplete(tokenEndpointResponse, nativeLogin = true)
218+
continuation.resume(Success)
219+
},
220+
nativeLogin = true,
221+
)
245222
}
246223
}
247224

libs/SalesforceSDK/src/com/salesforce/androidsdk/auth/idp/SPAuthCodeHelper.kt

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,11 @@
2727
package com.salesforce.androidsdk.auth.idp
2828

2929
import android.content.Context
30-
import android.os.Bundle
3130
import com.salesforce.androidsdk.accounts.UserAccount
3231
import com.salesforce.androidsdk.auth.HttpAccess
3332
import com.salesforce.androidsdk.auth.OAuth2
3433
import com.salesforce.androidsdk.auth.OAuth2.TokenEndpointResponse
35-
import com.salesforce.androidsdk.rest.LoginOptions
36-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper
37-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.OAuthWebviewHelperEvents
38-
import com.salesforce.androidsdk.util.LogUtil
34+
import com.salesforce.androidsdk.auth.onAuthFlowComplete
3935
import com.salesforce.androidsdk.util.SalesforceSDKLogger
4036
import kotlinx.coroutines.CoroutineScope
4137
import kotlinx.coroutines.Dispatchers
@@ -51,7 +47,7 @@ internal class SPAuthCodeHelper private constructor (
5147
val code: String,
5248
private val codeVerifier: String,
5349
val onResult:(result:Result) -> Unit
54-
) : OAuthWebviewHelperEvents {
50+
) {
5551
data class Result(
5652
val success: Boolean,
5753
val user: UserAccount? = null,
@@ -88,15 +84,18 @@ internal class SPAuthCodeHelper private constructor (
8884
}
8985

9086
private fun completeLogin(tokenResponse: TokenEndpointResponse) {
91-
val loginOptions = LoginOptions(
92-
loginUrl,
93-
spConfig.oauthClientId,
94-
spConfig.oauthScopes,
87+
onAuthFlowComplete(
88+
tokenResponse = tokenResponse,
89+
loginServer = loginUrl,
90+
consumerKey = spConfig.oauthClientId,
91+
onAuthFlowError = { error, errorDesc, e ->
92+
SalesforceSDKLogger.e(TAG, "$error: $errorDesc", e)
93+
},
94+
onAuthFlowSuccess = { userAccount ->
95+
SalesforceSDKLogger.d(TAG, "onAuthFlowSuccess $userAccount")
96+
onResult(Result(success = true, user = userAccount))
97+
},
9598
)
96-
97-
val oauthHelper = OAuthWebviewHelper(context, this, loginOptions)
98-
SalesforceSDKLogger.d(TAG, "completeLogin oauthHelper $oauthHelper")
99-
oauthHelper.onAuthFlowComplete(tokenResponse)
10099
}
101100

102101
private fun loginWithAuthCode() {
@@ -109,19 +108,4 @@ internal class SPAuthCodeHelper private constructor (
109108
}
110109
}
111110
}
112-
113-
override fun loadingLoginPage(loginUrl: String) {
114-
SalesforceSDKLogger.d(TAG, "loadingLoginPage $loginUrl")
115-
}
116-
117-
override fun onAccountAuthenticatorResult(authResult: Bundle) {
118-
SalesforceSDKLogger.d(TAG, "onAccountAuthenticatorResult ${LogUtil.bundleToString(authResult)}")
119-
}
120-
121-
override fun finish(userAccount: UserAccount?) {
122-
SalesforceSDKLogger.d(TAG, "finish $userAccount")
123-
userAccount?.let {
124-
onResult(Result(success = true, user = it))
125-
}
126-
}
127111
}

libs/SalesforceSDK/src/com/salesforce/androidsdk/rest/LoginOptions.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,6 @@ import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.ManagedAppCertAl
133133
import com.salesforce.androidsdk.config.RuntimeConfig.ConfigKey.RequireCertAuth
134134
import com.salesforce.androidsdk.config.RuntimeConfig.getRuntimeConfig
135135
import com.salesforce.androidsdk.security.BiometricAuthenticationManager
136-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.AUTHENTICATION_FAILED_INTENT
137-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.HTTP_ERROR_RESPONSE_CODE_INTENT
138-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.RESPONSE_ERROR_DESCRIPTION_INTENT
139-
import com.salesforce.androidsdk.ui.OAuthWebviewHelper.Companion.RESPONSE_ERROR_INTENT
140136
import com.salesforce.androidsdk.ui.components.LoginView
141137
import com.salesforce.androidsdk.util.EventsObservable
142138
import com.salesforce.androidsdk.util.EventsObservable.EventType.AuthWebViewPageFinished
@@ -1011,6 +1007,10 @@ open class LoginActivity : FragmentActivity() {
10111007
private const val SETUP_REQUEST_CODE = 72
10121008
private const val TAG = "LoginActivity"
10131009
private const val PROMPT_LOGIN = "&prompt=login"
1010+
private const val AUTHENTICATION_FAILED_INTENT = "com.salesforce.auth.intent.AUTHENTICATION_ERROR"
1011+
private const val HTTP_ERROR_RESPONSE_CODE_INTENT = "com.salesforce.auth.intent.HTTP_RESPONSE_CODE"
1012+
private const val RESPONSE_ERROR_INTENT = "com.salesforce.auth.intent.RESPONSE_ERROR"
1013+
private const val RESPONSE_ERROR_DESCRIPTION_INTENT = "com.salesforce.auth.intent.RESPONSE_ERROR_DESCRIPTION"
10141014

10151015
// This parses the expected "rgb(x, x, x)" string.
10161016
private val rgbTextPattern = "rgb\\((\\d{1,3}), (\\d{1,3}), (\\d{1,3})\\)".toRegex()

0 commit comments

Comments
 (0)