@@ -794,123 +794,92 @@ extension MfaSettings on CognitoIdentityProviderClient {
794
794
795
795
/// Sets the MFA settings for the user.
796
796
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 ;
829
823
}
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
+ }
830
832
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
+ ];
843
839
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 ,
891
856
};
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;
913
858
}
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
+
914
883
}
915
884
916
885
extension on String {
0 commit comments