@@ -64,6 +64,7 @@ import com.amplifyframework.auth.cognito.exceptions.invalidstate.SignedInExcepti
6464import com.amplifyframework.auth.cognito.exceptions.service.CodeDeliveryFailureException
6565import com.amplifyframework.auth.cognito.exceptions.service.HostedUISignOutException
6666import com.amplifyframework.auth.cognito.exceptions.service.InvalidAccountTypeException
67+ import com.amplifyframework.auth.cognito.exceptions.service.InvalidParameterException
6768import com.amplifyframework.auth.cognito.exceptions.service.UserCancelledException
6869import com.amplifyframework.auth.cognito.helpers.AuthHelper
6970import com.amplifyframework.auth.cognito.helpers.HostedUIHelper
@@ -2194,7 +2195,7 @@ internal class RealAWSCognitoAuthPlugin(
21942195 var enabledSet: MutableSet <MFAType >? = null
21952196 var preferred: MFAType ? = null
21962197 if (! response.userMfaSettingList.isNullOrEmpty()) {
2197- enabledSet = mutableSetOf< MFAType > ()
2198+ enabledSet = mutableSetOf ()
21982199 response.userMfaSettingList?.forEach { mfaType ->
21992200 enabledSet.add(getMFAType(mfaType))
22002201 }
@@ -2227,45 +2228,76 @@ internal class RealAWSCognitoAuthPlugin(
22272228 onSuccess : Action ,
22282229 onError : Consumer <AuthException >
22292230 ) {
2230- authStateMachine.getCurrentState { authState ->
2231- when (authState.authNState) {
2232- is AuthenticationState .SignedIn -> {
2233- GlobalScope .launch {
2234- try {
2235- val accessToken = getSession().userPoolTokensResult.value?.accessToken
2236- accessToken?.let { token ->
2237- authEnvironment.cognitoAuthService.cognitoIdentityProviderClient?.setUserMfaPreference {
2238- this .accessToken = token
2239- this .smsMfaSettings = sms?.let {
2240- SmsMfaSettingsType .invoke {
2241- enabled = it.mfaEnabled
2242- it.mfaPreferred ?.let { preferred -> preferredMfa = preferred }
2243- }
2244- }
2245- this .softwareTokenMfaSettings = totp?.let {
2246- SoftwareTokenMfaSettingsType .invoke {
2247- enabled = it.mfaEnabled
2248- it.mfaPreferred ?.let { preferred -> preferredMfa = preferred }
2231+ if (sms == null && totp == null ) {
2232+ onError.accept(InvalidParameterException (" No mfa settings given" ))
2233+ return
2234+ }
2235+ // If either of the params have preferred setting set then ignore fetched preference preferred property
2236+ val overridePreferredSetting: Boolean = ! (sms?.mfaPreferred == true || totp?.mfaPreferred == true )
2237+ fetchMFAPreference({ userPreference ->
2238+ authStateMachine.getCurrentState { authState ->
2239+ when (authState.authNState) {
2240+ is AuthenticationState .SignedIn -> {
2241+ GlobalScope .launch {
2242+ try {
2243+ val accessToken = getSession().userPoolTokensResult.value?.accessToken
2244+ accessToken?.let { token ->
2245+ authEnvironment
2246+ .cognitoAuthService
2247+ .cognitoIdentityProviderClient
2248+ ?.setUserMfaPreference {
2249+ this .accessToken = token
2250+ this .smsMfaSettings = sms?.let { it ->
2251+ val preferredMFASetting = it.mfaPreferred
2252+ ? : (
2253+ overridePreferredSetting &&
2254+ userPreference.preferred == MFAType .SMS &&
2255+ it.mfaEnabled
2256+ )
2257+ SmsMfaSettingsType .invoke {
2258+ enabled = it.mfaEnabled
2259+ preferredMfa = preferredMFASetting
2260+ }
2261+ }
2262+ this .softwareTokenMfaSettings = totp?.let { it ->
2263+ val preferredMFASetting = it.mfaPreferred
2264+ ? : (
2265+ overridePreferredSetting &&
2266+ userPreference.preferred == MFAType .TOTP &&
2267+ it.mfaEnabled
2268+ )
2269+ SoftwareTokenMfaSettingsType .invoke {
2270+ enabled = it.mfaEnabled
2271+ preferredMfa = preferredMFASetting
2272+ }
2273+ }
2274+ }?.also {
2275+ onSuccess.call()
22492276 }
2250- }
2251- }?.also {
2252- onSuccess.call()
2253- }
2254- } ? : onError.accept(SignedOutException ())
2255- } catch (error: Exception ) {
2256- onError.accept(
2257- CognitoAuthExceptionConverter .lookup(
2258- error,
2259- " Amazon Cognito cannot update the MFA preferences"
2277+ } ? : onError.accept(SignedOutException ())
2278+ } catch (error: Exception ) {
2279+ onError.accept(
2280+ CognitoAuthExceptionConverter .lookup(
2281+ error,
2282+ " Amazon Cognito cannot update the MFA preferences"
2283+ )
22602284 )
2261- )
2285+ }
22622286 }
22632287 }
2288+ else -> onError.accept(InvalidStateException ())
22642289 }
2265-
2266- else -> onError.accept(InvalidStateException ())
22672290 }
2268- }
2291+ }, {
2292+ onError.accept(
2293+ AuthException (
2294+ message = " Failed to fetch current MFA preferences " +
2295+ " which is a pre-requisite to update MFA preferences" ,
2296+ recoverySuggestion = AmplifyException .TODO_RECOVERY_SUGGESTION ,
2297+ cause = it
2298+ )
2299+ )
2300+ })
22692301 }
22702302
22712303 private fun verifyTotp (
0 commit comments