@@ -24,6 +24,9 @@ import com.amplifyframework.auth.AuthUser
2424import  com.amplifyframework.auth.AuthUserAttribute 
2525import  com.amplifyframework.auth.AuthUserAttributeKey 
2626import  com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin 
27+ import  com.amplifyframework.auth.cognito.PasswordProtectionSettings 
28+ import  com.amplifyframework.auth.cognito.UsernameAttribute 
29+ import  com.amplifyframework.auth.cognito.VerificationMechanism  as  AmplifyVerificationMechanism 
2730import  com.amplifyframework.auth.options.AuthSignUpOptions 
2831import  com.amplifyframework.auth.result.AuthResetPasswordResult 
2932import  com.amplifyframework.auth.result.AuthSignInResult 
@@ -44,7 +47,6 @@ import kotlinx.coroutines.channels.awaitClose
4447import  kotlinx.coroutines.channels.trySendBlocking 
4548import  kotlinx.coroutines.flow.Flow 
4649import  kotlinx.coroutines.flow.callbackFlow 
47- import  org.json.JSONException 
4850
4951/* *
5052 * An abstraction of the Amplify.Auth API that allows us to use coroutines with no exceptions 
@@ -253,62 +255,31 @@ internal class RealAuthProvider : AuthProvider {
253255    }
254256
255257    override  suspend  fun  getConfiguration (): AuthConfigurationResult  {
256-         val  authConfigJSON =  getCognitoPlugin()?.getPluginConfiguration() ? :  return  AuthConfigurationResult .Missing 
257-         try  {
258-             val  innerJSON =  authConfigJSON
259-                 .getJSONObject(" Auth" 
260-                 .getJSONObject(" Default" 
261-             val  signUpAttributes =  innerJSON.getJSONArray(" signupAttributes" 
262-             val  usernameAttributes =  innerJSON.getJSONArray(" usernameAttributes" 
263-             val  passwordAttributes =  innerJSON.getJSONObject(" passwordProtectionSettings" 
264- 
265-             val  signInAttributeList =  List (usernameAttributes.length()) {
266-                 usernameAttributes.getString(it)
267-             }
268-             val  containsEmail =  signInAttributeList.contains(" EMAIL" 
269-             val  containsPhoneNumber =  signInAttributeList.contains(" PHONE_NUMBER" 
270-             val  signInMethod =  when  {
271-                 containsEmail ->  SignInMethod .Email 
272-                 containsPhoneNumber ->  SignInMethod .PhoneNumber 
273-                 else  ->  SignInMethod .Username 
274-             }
258+         val  authConfiguration =  getCognitoPlugin()?.getAuthConfiguration() ? :  return  AuthConfigurationResult .Missing 
259+ 
260+         val  passwordCriteria =  authConfiguration.passwordProtectionSettings?.toPasswordCriteria()
261+             ? :  return  AuthConfigurationResult .Invalid (
262+                 """ 
263+                     Your auth configuration does not define passwordProtectionSettings.  
264+                     Authenticator needs these settings to perform client-side validation of passwords. 
265+                 """  .trimIndent()
266+             )
275267
276-             val  signUpAttributeList =  List (signUpAttributes.length()) {
277-                 AuthUserAttributeKey .custom(signUpAttributes.getString(it).lowercase())
268+         val  verificationMechanisms =  authConfiguration.verificationMechanisms.map {
269+             when  (it) {
270+                 AmplifyVerificationMechanism .Email  ->  VerificationMechanism .Email 
271+                 AmplifyVerificationMechanism .PhoneNumber  ->  VerificationMechanism .PhoneNumber 
278272            }
273+         }.toSet()
279274
280-             val  passwordRequirementsJSON =  passwordAttributes
281-                 .getJSONArray(" passwordPolicyCharacters" 
282-             val  passwordRequirements =  List (passwordRequirementsJSON.length()) {
283-                 passwordRequirementsJSON.getString(it)
284-             }
285-             val  passwordCriteria =  PasswordCriteria (
286-                 length =  passwordAttributes.getInt(" passwordPolicyMinLength" 
287-                 requiresNumber =  passwordRequirements.contains(" REQUIRES_NUMBERS" 
288-                 requiresSpecial =  passwordRequirements.contains(" REQUIRES_SYMBOLS" 
289-                 requiresLower =  passwordRequirements.contains(" REQUIRES_LOWER" 
290-                 requiresUpper =  passwordRequirements.contains(" REQUIRES_UPPER" 
291-             )
275+         val  amplifyAuthConfiguration =  AmplifyAuthConfiguration (
276+             signInMethod =  getSignInMethod(authConfiguration.usernameAttributes),
277+             signUpAttributes =  authConfiguration.signUpAttributes,
278+             passwordCriteria =  passwordCriteria,
279+             verificationMechanisms =  verificationMechanisms
280+         )
292281
293-             val  verificationMechanismsJson =  innerJSON.getJSONArray(" verificationMechanisms" 
294-             val  verificationMechanisms =  List (verificationMechanismsJson.length()) {
295-                 when  (verificationMechanismsJson.getString(it)) {
296-                     " EMAIL" ->  VerificationMechanism .Email 
297-                     else  ->  VerificationMechanism .PhoneNumber 
298-                 }
299-             }.toSet()
300- 
301-             return  AuthConfigurationResult .Valid (
302-                 AmplifyAuthConfiguration (
303-                     signInMethod,
304-                     signUpAttributeList,
305-                     passwordCriteria,
306-                     verificationMechanisms
307-                 )
308-             )
309-         } catch  (e:  JSONException ) {
310-             return  AuthConfigurationResult .Invalid (e.message ? :  " Auth configuration is not valid" 
311-         }
282+         return  AuthConfigurationResult .Valid (amplifyAuthConfiguration)
312283    }
313284
314285    private  fun  getCognitoPlugin (): AWSCognitoAuthPlugin ?  {
@@ -319,6 +290,20 @@ internal class RealAuthProvider : AuthProvider {
319290            null 
320291        }
321292    }
293+ 
294+     private  fun  getSignInMethod (attributes :  List <UsernameAttribute >) =  when  {
295+         attributes.contains(UsernameAttribute .Email ) ->  SignInMethod .Email 
296+         attributes.contains(UsernameAttribute .PhoneNumber ) ->  SignInMethod .PhoneNumber 
297+         else  ->  SignInMethod .Username 
298+     }
299+ 
300+     private  fun  PasswordProtectionSettings.toPasswordCriteria () =  PasswordCriteria (
301+         length =  length,
302+         requiresNumber =  requiresNumber,
303+         requiresSpecial =  requiresSpecial,
304+         requiresUpper =  requiresUpper,
305+         requiresLower =  requiresLower
306+     )
322307}
323308
324309internal  sealed  interface  AmplifyResult <out  T  :  Any > {
0 commit comments