Skip to content

Commit 8dedf6b

Browse files
committed
Support M_USER_LOCKED error for compat sessions
1 parent 872d725 commit 8dedf6b

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

crates/handlers/src/compat/login.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ pub enum RouteError {
205205
#[error("invalid login token")]
206206
InvalidLoginToken,
207207

208+
#[error("user is locked")]
209+
UserLocked,
210+
208211
#[error("failed to provision device")]
209212
ProvisionDeviceFailed(#[source] anyhow::Error),
210213
}
@@ -263,6 +266,11 @@ impl IntoResponse for RouteError {
263266
error: "Invalid login token",
264267
status: StatusCode::FORBIDDEN,
265268
},
269+
Self::UserLocked => MatrixError {
270+
errcode: "M_USER_LOCKED",
271+
error: "User account has been locked",
272+
status: StatusCode::UNAUTHORIZED,
273+
},
266274
};
267275

268276
(sentry_event_id, response).into_response()
@@ -506,7 +514,13 @@ async fn token_login(
506514
browser_session.id = %browser_session_id,
507515
"Attempt to exchange login token but browser session is not active"
508516
);
509-
return Err(RouteError::InvalidLoginToken);
517+
return Err(
518+
if browser_session.finished_at.is_none() && browser_session.user.locked_at.is_some() {
519+
RouteError::UserLocked
520+
} else {
521+
RouteError::InvalidLoginToken
522+
},
523+
);
510524
}
511525

512526
// We're about to create a device, let's explicitly acquire a lock, so that
@@ -565,9 +579,13 @@ async fn user_password_login(
565579
.user()
566580
.find_by_username(username)
567581
.await?
568-
.filter(mas_data_model::User::is_valid)
582+
.filter(|user| user.deactivated_at.is_none())
569583
.ok_or(RouteError::UserNotFound)?;
570584

585+
if user.locked_at.is_some() {
586+
return Err(RouteError::UserLocked);
587+
}
588+
571589
// Check the rate limit
572590
limiter.check_password(requester, &user)?;
573591

0 commit comments

Comments
 (0)