[Web 2026.9.0] Support new Emergency Access password payload (#7746)

* Support new emergency access password payload

* Apply PR 7747 review changes to emergency access

* Add Playwright test for emergency access takeover
This commit is contained in:
Tom authored and GitHub committed 2026-10-06 20:28:51 +02:00
1 parent c687cacb6b
commit 8647af8f89
5 files changed
+193 -19

No files matched your search

+29 -12
View File
@@ -93,6 +93,15 @@ pub struct KDFData {
kdf_parallelism: Option<i32>,
}
impl KDFData {
pub(super) fn matches_user(&self, user: &User) -> bool {
self.kdf == user.client_kdf_type
&& self.kdf_iterations == user.client_kdf_iter
&& self.kdf_memory == user.client_kdf_memory
&& self.kdf_parallelism == user.client_kdf_parallelism
}
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RegisterData {
@@ -717,21 +726,35 @@ fn set_kdf_data(user: &mut User, data: &KDFData) -> EmptyResult {
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct AuthenticationData {
pub(super) struct AuthenticationData {
#[serde(alias = "Salt")]
salt: String,
#[serde(alias = "Kdf")]
kdf: KDFData,
pub(super) kdf: KDFData,
#[serde(alias = "MasterPasswordAuthenticationHash")]
master_password_authentication_hash: String,
pub(super) master_password_authentication_hash: String,
}
impl AuthenticationData {
pub(super) fn check(&self, user: &User, unlock: &UnlockData) -> EmptyResult {
if self.kdf != unlock.kdf {
err!("KDF settings must be equal for authentication and unlock")
}
if self.salt != user.master_password_salt() || self.salt != unlock.salt {
err!("Invalid master password salt")
}
Ok(())
}
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct UnlockData {
pub(super) struct UnlockData {
salt: String,
kdf: KDFData,
master_key_wrapped_user_key: String,
pub(super) master_key_wrapped_user_key: String,
}
#[derive(Deserialize)]
@@ -750,13 +773,7 @@ async fn post_kdf(data: Json<ChangeKdfData>, headers: Headers, conn: DbConn, nt:
err!("Invalid password")
}
if data.authentication_data.kdf != data.unlock_data.kdf {
err!("KDF settings must be equal for authentication and unlock")
}
if headers.user.email != data.authentication_data.salt || headers.user.email != data.unlock_data.salt {
err!("Invalid master password salt")
}
data.authentication_data.check(&headers.user, &data.unlock_data)?;
let mut user = headers.user;