@@ -800,7 +800,12 @@ mod tests {
800
800
"### ) ;
801
801
}
802
802
803
- async fn user_with_password ( state : & TestState , username : & str , password : & str ) {
803
+ async fn user_with_password (
804
+ state : & TestState ,
805
+ username : & str ,
806
+ password : & str ,
807
+ locked : bool ,
808
+ ) -> User {
804
809
let mut rng = state. rng ( ) ;
805
810
let mut repo = state. repository ( ) . await . unwrap ( ) ;
806
811
@@ -826,7 +831,14 @@ mod tests {
826
831
. await
827
832
. unwrap ( ) ;
828
833
834
+ let user = if locked {
835
+ repo. user ( ) . lock ( & state. clock , user) . await . unwrap ( )
836
+ } else {
837
+ user
838
+ } ;
839
+
829
840
repo. save ( ) . await . unwrap ( ) ;
841
+ return user;
830
842
}
831
843
832
844
/// Test that a user can login with a password using the Matrix
@@ -836,7 +848,7 @@ mod tests {
836
848
setup ( ) ;
837
849
let state = TestState :: from_pool ( pool) . await . unwrap ( ) ;
838
850
839
- user_with_password ( & state, "alice" , "password" ) . await ;
851
+ let user = user_with_password ( & state, "alice" , "password" , true ) . await ;
840
852
841
853
// Now let's try to login with the password, without asking for a refresh token.
842
854
let request = Request :: post ( "/_matrix/client/v3/login" ) . json ( serde_json:: json!( {
@@ -848,14 +860,30 @@ mod tests {
848
860
"password" : "password" ,
849
861
} ) ) ;
850
862
863
+ // First try to login to a locked account
864
+ let response = state. request ( request. clone ( ) ) . await ;
865
+ response. assert_status ( StatusCode :: UNAUTHORIZED ) ;
866
+ let body: serde_json:: Value = response. json ( ) ;
867
+ insta:: assert_json_snapshot!( body, @r###"
868
+ {
869
+ "errcode": "M_USER_LOCKED",
870
+ "error": "User account has been locked"
871
+ }
872
+ "### ) ;
873
+
874
+ // Now try again after unlocking the account
875
+ let mut repo = state. repository ( ) . await . unwrap ( ) ;
876
+ let _ = repo. user ( ) . unlock ( user) . await . unwrap ( ) ;
877
+ repo. save ( ) . await . unwrap ( ) ;
878
+
851
879
let response = state. request ( request) . await ;
852
880
response. assert_status ( StatusCode :: OK ) ;
853
881
854
882
let body: serde_json:: Value = response. json ( ) ;
855
883
insta:: assert_json_snapshot!( body, @r###"
856
884
{
857
- "access_token": "mct_16tugBE5Ta9LIWoSJaAEHHq2g3fx8S_alcBB4 ",
858
- "device_id": "ZGpSvYQqlq ",
885
+ "access_token": "mct_cxG6gZXyvelQWW9XqfNbm5KAQovodf_XvJz43 ",
886
+ "device_id": "42oTpLoieH ",
859
887
"user_id": "@alice:example.com"
860
888
}
861
889
"### ) ;
@@ -877,10 +905,10 @@ mod tests {
877
905
let body: serde_json:: Value = response. json ( ) ;
878
906
insta:: assert_json_snapshot!( body, @r###"
879
907
{
880
- "access_token": "mct_cxG6gZXyvelQWW9XqfNbm5KAQovodf_XvJz43 ",
881
- "device_id": "42oTpLoieH ",
908
+ "access_token": "mct_PGMLvvMXC4Ds1A3lCWc6Hx4l9DGzqG_lVEIV2 ",
909
+ "device_id": "Yp7FM44zJN ",
882
910
"user_id": "@alice:example.com",
883
- "refresh_token": "mcr_7IvDc44woP66fRQoS9MVcHXO9OeBmR_0jDGr1 ",
911
+ "refresh_token": "mcr_LoYqtrtBUBcWlE4RX6o47chBCGkadB_9gzpc1 ",
884
912
"expires_in_ms": 300000
885
913
}
886
914
"### ) ;
@@ -898,8 +926,8 @@ mod tests {
898
926
let body: serde_json:: Value = response. json ( ) ;
899
927
insta:: assert_json_snapshot!( body, @r###"
900
928
{
901
- "access_token": "mct_PGMLvvMXC4Ds1A3lCWc6Hx4l9DGzqG_lVEIV2 ",
902
- "device_id": "Yp7FM44zJN ",
929
+ "access_token": "mct_Xl3bbpfh9yNy9NzuRxyR3b3PLW0rqd_DiXAH2 ",
930
+ "device_id": "6cq7FqNSYo ",
903
931
"user_id": "@alice:example.com"
904
932
}
905
933
"### ) ;
@@ -953,7 +981,7 @@ mod tests {
953
981
setup ( ) ;
954
982
let state = TestState :: from_pool ( pool) . await . unwrap ( ) ;
955
983
956
- user_with_password ( & state, "alice" , "password" ) . await ;
984
+ user_with_password ( & state, "alice" , "password" , false ) . await ;
957
985
// Try without a Content-Type header
958
986
let mut request = Request :: post ( "/_matrix/client/v3/login" ) . json ( serde_json:: json!( {
959
987
"type" : "m.login.password" ,
@@ -985,7 +1013,7 @@ mod tests {
985
1013
setup ( ) ;
986
1014
let state = TestState :: from_pool ( pool) . await . unwrap ( ) ;
987
1015
988
- user_with_password ( & state, "alice" , "password" ) . await ;
1016
+ let user = user_with_password ( & state, "alice" , "password" , true ) . await ;
989
1017
990
1018
// Login with a full MXID as identifier
991
1019
let request = Request :: post ( "/_matrix/client/v3/login" ) . json ( serde_json:: json!( {
@@ -997,13 +1025,29 @@ mod tests {
997
1025
"password" : "password" ,
998
1026
} ) ) ;
999
1027
1028
+ // First try to login to a locked account
1029
+ let response = state. request ( request. clone ( ) ) . await ;
1030
+ response. assert_status ( StatusCode :: UNAUTHORIZED ) ;
1031
+ let body: serde_json:: Value = response. json ( ) ;
1032
+ insta:: assert_json_snapshot!( body, @r###"
1033
+ {
1034
+ "errcode": "M_USER_LOCKED",
1035
+ "error": "User account has been locked"
1036
+ }
1037
+ "### ) ;
1038
+
1039
+ // Now try again after unlocking the account
1040
+ let mut repo = state. repository ( ) . await . unwrap ( ) ;
1041
+ let _ = repo. user ( ) . unlock ( user) . await . unwrap ( ) ;
1042
+ repo. save ( ) . await . unwrap ( ) ;
1043
+
1000
1044
let response = state. request ( request) . await ;
1001
1045
response. assert_status ( StatusCode :: OK ) ;
1002
1046
let body: serde_json:: Value = response. json ( ) ;
1003
1047
insta:: assert_json_snapshot!( body, @r###"
1004
1048
{
1005
- "access_token": "mct_16tugBE5Ta9LIWoSJaAEHHq2g3fx8S_alcBB4 ",
1006
- "device_id": "ZGpSvYQqlq ",
1049
+ "access_token": "mct_cxG6gZXyvelQWW9XqfNbm5KAQovodf_XvJz43 ",
1050
+ "device_id": "42oTpLoieH ",
1007
1051
"user_id": "@alice:example.com"
1008
1052
}
1009
1053
"### ) ;
@@ -1147,6 +1191,8 @@ mod tests {
1147
1191
. add ( & mut state. rng ( ) , & state. clock , "alice" . to_owned ( ) )
1148
1192
. await
1149
1193
. unwrap ( ) ;
1194
+ // Start with a locked account
1195
+ let user = repo. user ( ) . lock ( & state. clock , user) . await . unwrap ( ) ;
1150
1196
repo. save ( ) . await . unwrap ( ) ;
1151
1197
1152
1198
let mxid = state. homeserver_connection . mxid ( & user. username ) ;
@@ -1179,14 +1225,29 @@ mod tests {
1179
1225
"type" : "m.login.token" ,
1180
1226
"token" : token,
1181
1227
} ) ) ;
1228
+ let response = state. request ( request. clone ( ) ) . await ;
1229
+ response. assert_status ( StatusCode :: UNAUTHORIZED ) ;
1230
+ let body: serde_json:: Value = response. json ( ) ;
1231
+ insta:: assert_json_snapshot!( body, @r###"
1232
+ {
1233
+ "errcode": "M_USER_LOCKED",
1234
+ "error": "User account has been locked"
1235
+ }
1236
+ "### ) ;
1237
+
1238
+ // Now try again after unlocking the account
1239
+ let mut repo = state. repository ( ) . await . unwrap ( ) ;
1240
+ let user = repo. user ( ) . unlock ( user) . await . unwrap ( ) ;
1241
+ repo. save ( ) . await . unwrap ( ) ;
1242
+
1182
1243
let response = state. request ( request) . await ;
1183
1244
response. assert_status ( StatusCode :: OK ) ;
1184
1245
1185
1246
let body: serde_json:: Value = response. json ( ) ;
1186
1247
insta:: assert_json_snapshot!( body, @r#"
1187
1248
{
1188
- "access_token": "mct_bnkWh1tPmm1MZOpygPaXwygX8PfxEY_hE6do1 ",
1189
- "device_id": "O3Ju1MUh3Z ",
1249
+ "access_token": "mct_bUTa4XIh92RARTPTjqQrCZLAkq2ild_0VsYE6 ",
1250
+ "device_id": "uihy4bk51g ",
1190
1251
"user_id": "@alice:example.com"
1191
1252
}
1192
1253
"# ) ;
0 commit comments