@@ -45,6 +45,8 @@ import { mockEndpointWithParams } from '../../../test/helpers/api/helper';
45
45
import { Endpoint , RecaptchaClientType , RecaptchaVersion } from '../../api' ;
46
46
import * as mockFetch from '../../../test/helpers/mock_fetch' ;
47
47
import { AuthErrorCode } from '../errors' ;
48
+ import { PasswordValidationStatus } from '../../model/public_types' ;
49
+ import { PasswordPolicyImpl } from './password_policy_impl' ;
48
50
49
51
use ( sinonChai ) ;
50
52
use ( chaiAsPromised ) ;
@@ -789,8 +791,11 @@ describe('core/auth/auth_impl', () => {
789
791
790
792
context ( 'passwordPolicy' , ( ) => {
791
793
const TEST_ALLOWED_NON_ALPHANUMERIC_CHARS = [ '!' , '(' , ')' ] ;
794
+ const TEST_ALLOWED_NON_ALPHANUMERIC_STRING =
795
+ TEST_ALLOWED_NON_ALPHANUMERIC_CHARS . join ( '' ) ;
792
796
const TEST_MIN_PASSWORD_LENGTH = 6 ;
793
797
const TEST_SCHEMA_VERSION = 1 ;
798
+ const TEST_UNSUPPORTED_SCHEMA_VERSION = 0 ;
794
799
const TEST_TENANT_ID = 'tenant-id' ;
795
800
const TEST_TENANT_ID_UNSUPPORTED_POLICY_VERSION =
796
801
'tenant-id-unsupported-policy-version' ;
@@ -810,17 +815,36 @@ describe('core/auth/auth_impl', () => {
810
815
allowedNonAlphanumericCharacters : TEST_ALLOWED_NON_ALPHANUMERIC_CHARS ,
811
816
schemaVersion : TEST_SCHEMA_VERSION
812
817
} ;
813
- const PASSWORD_POLICY_RESPONSE_UNSUPPORTED_VERSION = {
818
+ const PASSWORD_POLICY_RESPONSE_UNSUPPORTED_SCHEMA_VERSION = {
814
819
customStrengthOptions : {
815
820
maxPasswordLength : TEST_MIN_PASSWORD_LENGTH ,
816
821
unsupportedPasswordPolicyProperty : 10
817
822
} ,
818
823
allowedNonAlphanumericCharacters : TEST_ALLOWED_NON_ALPHANUMERIC_CHARS ,
819
- schemaVersion : 0
824
+ schemaVersion : TEST_UNSUPPORTED_SCHEMA_VERSION
825
+ } ;
826
+ const CACHED_PASSWORD_POLICY = {
827
+ customStrengthOptions : {
828
+ minPasswordLength : TEST_MIN_PASSWORD_LENGTH
829
+ } ,
830
+ allowedNonAlphanumericCharacters : TEST_ALLOWED_NON_ALPHANUMERIC_STRING ,
831
+ schemaVersion : TEST_SCHEMA_VERSION
832
+ } ;
833
+ const CACHED_PASSWORD_POLICY_REQUIRE_NUMERIC = {
834
+ customStrengthOptions : {
835
+ minPasswordLength : TEST_MIN_PASSWORD_LENGTH ,
836
+ containsNumericCharacter : true
837
+ } ,
838
+ allowedNonAlphanumericCharacters : TEST_ALLOWED_NON_ALPHANUMERIC_STRING ,
839
+ schemaVersion : TEST_SCHEMA_VERSION
840
+ } ;
841
+ const PASSWORD_POLICY_UNSUPPORTED_SCHEMA_VERSION = {
842
+ customStrengthOptions : {
843
+ maxPasswordLength : TEST_MIN_PASSWORD_LENGTH
844
+ } ,
845
+ allowedNonAlphanumericCharacters : TEST_ALLOWED_NON_ALPHANUMERIC_STRING ,
846
+ schemaVersion : TEST_UNSUPPORTED_SCHEMA_VERSION
820
847
} ;
821
- const CACHED_PASSWORD_POLICY = PASSWORD_POLICY_RESPONSE ;
822
- const CACHED_PASSWORD_POLICY_REQUIRE_NUMERIC =
823
- PASSWORD_POLICY_RESPONSE_REQUIRE_NUMERIC ;
824
848
825
849
beforeEach ( async ( ) => {
826
850
mockFetch . setUp ( ) ;
@@ -841,7 +865,7 @@ describe('core/auth/auth_impl', () => {
841
865
{
842
866
tenantId : TEST_TENANT_ID_UNSUPPORTED_POLICY_VERSION
843
867
} ,
844
- PASSWORD_POLICY_RESPONSE_UNSUPPORTED_VERSION
868
+ PASSWORD_POLICY_RESPONSE_UNSUPPORTED_SCHEMA_VERSION
845
869
) ;
846
870
} ) ;
847
871
@@ -885,14 +909,121 @@ describe('core/auth/auth_impl', () => {
885
909
expect ( auth . _getPasswordPolicyInternal ( ) ) . to . be . undefined ;
886
910
} ) ;
887
911
888
- it ( 'password policy should not be set when the schema version is not supported' , async ( ) => {
912
+ it ( 'password policy should still be set when the schema version is not supported' , async ( ) => {
889
913
auth = await testAuth ( ) ;
890
914
auth . tenantId = TEST_TENANT_ID_UNSUPPORTED_POLICY_VERSION ;
891
- await expect ( auth . _updatePasswordPolicy ( ) ) . to . be . rejectedWith (
892
- AuthErrorCode . UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION
915
+ await expect ( auth . _updatePasswordPolicy ( ) ) . to . be . fulfilled ;
916
+
917
+ expect ( auth . _getPasswordPolicyInternal ( ) ) . to . eql (
918
+ PASSWORD_POLICY_UNSUPPORTED_SCHEMA_VERSION
893
919
) ;
920
+ } ) ;
894
921
895
- expect ( auth . _getPasswordPolicyInternal ( ) ) . to . be . undefined ;
922
+ context ( '#validatePassword' , ( ) => {
923
+ const PASSWORD_POLICY_IMPL = new PasswordPolicyImpl (
924
+ PASSWORD_POLICY_RESPONSE
925
+ ) ;
926
+ const PASSWORD_POLICY_IMPL_REQUIRE_NUMERIC = new PasswordPolicyImpl (
927
+ PASSWORD_POLICY_RESPONSE_REQUIRE_NUMERIC
928
+ ) ;
929
+ const TEST_BASIC_PASSWORD = 'password' ;
930
+
931
+ it ( 'password meeting the policy for the project should be considered valid' , async ( ) => {
932
+ const expectedValidationStatus : PasswordValidationStatus = {
933
+ isValid : true ,
934
+ meetsMinPasswordLength : true ,
935
+ passwordPolicy : PASSWORD_POLICY_IMPL
936
+ } ;
937
+
938
+ auth = await testAuth ( ) ;
939
+ const status = await auth . validatePassword ( TEST_BASIC_PASSWORD ) ;
940
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
941
+ } ) ;
942
+
943
+ it ( 'password not meeting the policy for the project should be considered invalid' , async ( ) => {
944
+ const expectedValidationStatus : PasswordValidationStatus = {
945
+ isValid : false ,
946
+ meetsMinPasswordLength : false ,
947
+ passwordPolicy : PASSWORD_POLICY_IMPL
948
+ } ;
949
+
950
+ auth = await testAuth ( ) ;
951
+ const status = await auth . validatePassword ( 'pass' ) ;
952
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
953
+ } ) ;
954
+
955
+ it ( 'password meeting the policy for the tenant should be considered valid' , async ( ) => {
956
+ const expectedValidationStatus : PasswordValidationStatus = {
957
+ isValid : true ,
958
+ meetsMinPasswordLength : true ,
959
+ containsNumericCharacter : true ,
960
+ passwordPolicy : PASSWORD_POLICY_IMPL_REQUIRE_NUMERIC
961
+ } ;
962
+
963
+ auth = await testAuth ( ) ;
964
+ auth . tenantId = TEST_TENANT_ID ;
965
+ const status = await auth . validatePassword ( 'passw0rd' ) ;
966
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
967
+ } ) ;
968
+
969
+ it ( 'password not meeting the policy for the tenant should be considered invalid' , async ( ) => {
970
+ const expectedValidationStatus : PasswordValidationStatus = {
971
+ isValid : false ,
972
+ meetsMinPasswordLength : false ,
973
+ containsNumericCharacter : false ,
974
+ passwordPolicy : PASSWORD_POLICY_IMPL_REQUIRE_NUMERIC
975
+ } ;
976
+
977
+ auth = await testAuth ( ) ;
978
+ auth . tenantId = TEST_TENANT_ID ;
979
+ const status = await auth . validatePassword ( 'pass' ) ;
980
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
981
+ } ) ;
982
+
983
+ it ( 'should use the password policy associated with the tenant ID when the tenant ID switches' , async ( ) => {
984
+ let expectedValidationStatus : PasswordValidationStatus = {
985
+ isValid : true ,
986
+ meetsMinPasswordLength : true ,
987
+ passwordPolicy : PASSWORD_POLICY_IMPL
988
+ } ;
989
+
990
+ auth = await testAuth ( ) ;
991
+
992
+ let status = await auth . validatePassword ( TEST_BASIC_PASSWORD ) ;
993
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
994
+
995
+ expectedValidationStatus = {
996
+ isValid : false ,
997
+ meetsMinPasswordLength : true ,
998
+ containsNumericCharacter : false ,
999
+ passwordPolicy : PASSWORD_POLICY_IMPL_REQUIRE_NUMERIC
1000
+ } ;
1001
+
1002
+ auth . tenantId = TEST_TENANT_ID ;
1003
+ status = await auth . validatePassword ( TEST_BASIC_PASSWORD ) ;
1004
+ expect ( status ) . to . eql ( expectedValidationStatus ) ;
1005
+ } ) ;
1006
+
1007
+ it ( 'should throw an error when a password policy with an unsupported schema version is received' , async ( ) => {
1008
+ auth = await testAuth ( ) ;
1009
+ auth . tenantId = TEST_TENANT_ID_UNSUPPORTED_POLICY_VERSION ;
1010
+ await expect (
1011
+ auth . validatePassword ( TEST_BASIC_PASSWORD )
1012
+ ) . to . be . rejectedWith (
1013
+ AuthErrorCode . UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION
1014
+ ) ;
1015
+ } ) ;
1016
+
1017
+ it ( 'should throw an error when a password policy with an unsupported schema version is already cached' , async ( ) => {
1018
+ auth = await testAuth ( ) ;
1019
+ auth . tenantId = TEST_TENANT_ID_UNSUPPORTED_POLICY_VERSION ;
1020
+ await auth . _updatePasswordPolicy ( ) ;
1021
+ await expect (
1022
+ auth . validatePassword ( TEST_BASIC_PASSWORD )
1023
+ ) . to . be . rejectedWith (
1024
+ AuthErrorCode . UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION
1025
+ ) ;
1026
+ } ) ;
896
1027
} ) ;
897
1028
} ) ;
898
1029
} ) ;
0 commit comments