Skip to content

Commit e69d96b

Browse files
committed
chore: refactor setMfaSettings method to handle multiple mfa preferred scenarios
1 parent 1d37cae commit e69d96b

File tree

1 file changed

+81
-112
lines changed

1 file changed

+81
-112
lines changed

packages/auth/amplify_auth_cognito_dart/lib/src/sdk/sdk_bridge.dart

Lines changed: 81 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -794,123 +794,92 @@ extension MfaSettings on CognitoIdentityProviderClient {
794794

795795
/// Sets the MFA settings for the user.
796796
Future<void> setMfaSettings({
797-
required String accessToken,
798-
MfaPreference? sms,
799-
MfaPreference? totp,
800-
MfaPreference? email,
801-
}) async {
802-
final UserMfaPreference(
803-
enabled: currentEnabled,
804-
preferred: currentPreference
805-
) = await _getRawUserSettings(
806-
accessToken: accessToken,
807-
);
808-
const enabledValues = [
809-
MfaPreference.enabled,
810-
MfaPreference.notPreferred,
811-
MfaPreference.preferred,
812-
];
813-
bool isEnabled(MfaType mfaType) {
814-
final explicitlyDisabled = switch (mfaType) {
815-
MfaType.sms => sms == MfaPreference.disabled,
816-
MfaType.totp => totp == MfaPreference.disabled,
817-
MfaType.email => email == MfaPreference.disabled,
818-
};
819-
if (explicitlyDisabled) {
820-
return false;
821-
}
822-
final currentlyEnabled = currentEnabled.contains(mfaType);
823-
final requestingEnabled = switch (mfaType) {
824-
MfaType.sms => enabledValues.contains(sms),
825-
MfaType.totp => enabledValues.contains(totp),
826-
MfaType.email => enabledValues.contains(email),
827-
};
828-
return currentlyEnabled || requestingEnabled;
797+
required String accessToken,
798+
MfaPreference? sms,
799+
MfaPreference? totp,
800+
MfaPreference? email,
801+
}) async {
802+
final UserMfaPreference(
803+
enabled: currentEnabled,
804+
preferred: currentPreference
805+
) = await _getRawUserSettings(
806+
accessToken: accessToken,
807+
);
808+
809+
const enabledValues = [
810+
MfaPreference.enabled,
811+
MfaPreference.notPreferred,
812+
MfaPreference.preferred,
813+
];
814+
815+
bool isEnabled(MfaType mfaType) {
816+
final explicitlyDisabled = switch (mfaType) {
817+
MfaType.sms => sms == MfaPreference.disabled,
818+
MfaType.totp => totp == MfaPreference.disabled,
819+
MfaType.email => email == MfaPreference.disabled,
820+
};
821+
if (explicitlyDisabled) {
822+
return false;
829823
}
824+
final currentlyEnabled = currentEnabled.contains(mfaType);
825+
final requestingEnabled = switch (mfaType) {
826+
MfaType.sms => enabledValues.contains(sms),
827+
MfaType.totp => enabledValues.contains(totp),
828+
MfaType.email => enabledValues.contains(email),
829+
};
830+
return currentlyEnabled || requestingEnabled;
831+
}
830832

831-
final preferred =
832-
switch ((currentPreference, sms: sms, totp: totp, email: email)) {
833-
// Prevent an invalid choice.
834-
(
835-
_,
836-
sms: MfaPreference.preferred,
837-
totp: MfaPreference.preferred,
838-
email: MfaPreference.preferred
839-
) =>
840-
throw const InvalidParameterException(
841-
'Cannot assign multiple MFA methods as preferred',
842-
),
833+
// Count the number of MFA methods set to preferred
834+
final preferredMethods = [
835+
if (sms == MfaPreference.preferred) MfaType.sms,
836+
if (totp == MfaPreference.preferred) MfaType.totp,
837+
if (email == MfaPreference.preferred) MfaType.email,
838+
];
843839

844-
// Setting one or the other as preferred overrides previous value.
845-
(
846-
_,
847-
sms: MfaPreference.preferred,
848-
totp: != MfaPreference.preferred,
849-
email: != MfaPreference.preferred
850-
) =>
851-
MfaType.sms,
852-
(
853-
_,
854-
sms: != MfaPreference.preferred,
855-
totp: MfaPreference.preferred,
856-
email: != MfaPreference.preferred
857-
) =>
858-
MfaType.totp,
859-
(
860-
_,
861-
sms: != MfaPreference.preferred,
862-
totp: != MfaPreference.preferred,
863-
email: MfaPreference.preferred
864-
) =>
865-
MfaType.email,
866-
867-
// Setting one or the other as disabled or not preferred removes current
868-
// preference if it matches.
869-
(
870-
MfaType.sms,
871-
sms: MfaPreference.notPreferred || MfaPreference.disabled,
872-
totp: _,
873-
email: _,
874-
) ||
875-
(
876-
MfaType.totp,
877-
sms: _,
878-
totp: MfaPreference.notPreferred || MfaPreference.disabled,
879-
email: _,
880-
) ||
881-
(
882-
MfaType.email,
883-
sms: _,
884-
totp: _,
885-
email: MfaPreference.notPreferred || MfaPreference.disabled,
886-
) =>
887-
null,
888-
889-
// Ignore preference changes which do not affect the current preference.
890-
(final currentPreference, sms: _, totp: _, email: _) => currentPreference,
840+
if (preferredMethods.length > 1) {
841+
throw const InvalidParameterException(
842+
'Cannot assign multiple MFA methods as preferred',
843+
);
844+
}
845+
846+
MfaType? preferred;
847+
if (preferredMethods.isNotEmpty) {
848+
preferred = preferredMethods.first;
849+
} else {
850+
// Check if the current preference needs to be removed
851+
final isCurrentPreferenceDisabled = switch (currentPreference) {
852+
MfaType.sms => sms == MfaPreference.disabled || sms == MfaPreference.notPreferred,
853+
MfaType.totp => totp == MfaPreference.disabled || totp == MfaPreference.notPreferred,
854+
MfaType.email => email == MfaPreference.disabled || email == MfaPreference.notPreferred,
855+
_ => false,
891856
};
892-
final smsMfaSettings = SmsMfaSettingsType(
893-
enabled: isEnabled(MfaType.sms),
894-
preferredMfa: preferred == MfaType.sms,
895-
);
896-
final softwareTokenSettings = SoftwareTokenMfaSettingsType(
897-
enabled: isEnabled(MfaType.totp),
898-
preferredMfa: preferred == MfaType.totp,
899-
);
900-
// TODO(khatruong2009): confirm EmailMfaSettingsType is added to SDK
901-
final emailMfaSettings = EmailMfaSettingsType(
902-
enabled: isEnabled(MfaType.email),
903-
preferredMfa: preferred == MfaType.email,
904-
);
905-
await setUserMfaPreference(
906-
SetUserMfaPreferenceRequest(
907-
accessToken: accessToken,
908-
smsMfaSettings: smsMfaSettings,
909-
softwareTokenMfaSettings: softwareTokenSettings,
910-
emailMfaSettings: emailMfaSettings,
911-
),
912-
).result;
857+
preferred = isCurrentPreferenceDisabled ? null : currentPreference;
913858
}
859+
860+
final smsMfaSettings = SmsMfaSettingsType(
861+
enabled: isEnabled(MfaType.sms),
862+
preferredMfa: preferred == MfaType.sms,
863+
);
864+
final softwareTokenSettings = SoftwareTokenMfaSettingsType(
865+
enabled: isEnabled(MfaType.totp),
866+
preferredMfa: preferred == MfaType.totp,
867+
);
868+
final emailMfaSettings = EmailMfaSettingsType(
869+
enabled: isEnabled(MfaType.email),
870+
preferredMfa: preferred == MfaType.email,
871+
);
872+
873+
await setUserMfaPreference(
874+
SetUserMfaPreferenceRequest(
875+
accessToken: accessToken,
876+
smsMfaSettings: smsMfaSettings,
877+
softwareTokenMfaSettings: softwareTokenSettings,
878+
emailMfaSettings: emailMfaSettings,
879+
),
880+
).result;
881+
}
882+
914883
}
915884

916885
extension on String {

0 commit comments

Comments
 (0)