mirror of
https://github.com/dani-garcia/vaultwarden.git
synced 2026-10-28 08:35:23 +00:00
[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:
5 files changed
+193
-19
No files matched your search
+29
-12
@@ -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;
|
||||
|
||||
|
||||
Reference in new issue
Block a user