Skip to content

Commit f1b20ec

Browse files
committed
V2 Upgrade Token
1 parent 3e8a45e commit f1b20ec

File tree

26 files changed

+637
-22
lines changed

26 files changed

+637
-22
lines changed

crates/bitwarden-api-api/src/models/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,10 @@ pub mod user_license;
952952
pub use self::user_license::UserLicense;
953953
pub mod user_verification_requirement;
954954
pub use self::user_verification_requirement::UserVerificationRequirement;
955+
pub mod v2_upgrade_token_request_model;
956+
pub use self::v2_upgrade_token_request_model::V2UpgradeTokenRequestModel;
957+
pub mod v2_upgrade_token_response_model;
958+
pub use self::v2_upgrade_token_response_model::V2UpgradeTokenResponseModel;
955959
pub mod verified_organization_domain_sso_detail_response_model;
956960
pub use self::verified_organization_domain_sso_detail_response_model::VerifiedOrganizationDomainSsoDetailResponseModel;
957961
pub mod verified_organization_domain_sso_details_response_model;

crates/bitwarden-api-api/src/models/unlock_data_request_model.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ pub struct UnlockDataRequestModel {
3434
pub passkey_unlock_data: Option<Vec<models::WebAuthnLoginRotateKeyRequestModel>>,
3535
#[serde(rename = "deviceKeyUnlockData", alias = "DeviceKeyUnlockData")]
3636
pub device_key_unlock_data: Option<Vec<models::OtherDeviceKeysUpdateRequestModel>>,
37+
#[serde(
38+
rename = "v2UpgradeToken",
39+
alias = "V2UpgradeToken",
40+
skip_serializing_if = "Option::is_none"
41+
)]
42+
pub v2_upgrade_token: Option<Box<models::V2UpgradeTokenRequestModel>>,
3743
}
3844

3945
impl UnlockDataRequestModel {
@@ -52,6 +58,7 @@ impl UnlockDataRequestModel {
5258
organization_account_recovery_unlock_data,
5359
passkey_unlock_data,
5460
device_key_unlock_data,
61+
v2_upgrade_token: None,
5562
}
5663
}
5764
}

crates/bitwarden-api-api/src/models/user_decryption_response_model.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,20 @@ pub struct UserDecryptionResponseModel {
2727
skip_serializing_if = "Option::is_none"
2828
)]
2929
pub web_authn_prf_options: Option<Vec<models::WebAuthnPrfDecryptionOption>>,
30+
#[serde(
31+
rename = "v2UpgradeToken",
32+
alias = "V2UpgradeToken",
33+
skip_serializing_if = "Option::is_none"
34+
)]
35+
pub v2_upgrade_token: Option<Box<models::V2UpgradeTokenResponseModel>>,
3036
}
3137

3238
impl UserDecryptionResponseModel {
3339
pub fn new() -> UserDecryptionResponseModel {
3440
UserDecryptionResponseModel {
3541
master_password_unlock: None,
3642
web_authn_prf_options: None,
43+
v2_upgrade_token: None,
3744
}
3845
}
3946
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Bitwarden Internal API
3+
*
4+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
5+
*
6+
* The version of the OpenAPI document: latest
7+
*
8+
* Generated by: https://openapi-generator.tech
9+
*/
10+
11+
use serde::{Deserialize, Serialize};
12+
13+
use crate::models;
14+
15+
/// V2UpgradeTokenRequestModel : Request model for V2 upgrade token submitted during key rotation.
16+
/// Contains wrapped user keys allowing clients to unlock after V1→V2 upgrade.
17+
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
18+
pub struct V2UpgradeTokenRequestModel {
19+
/// User Key V2 Wrapped User Key V1.
20+
#[serde(rename = "wrappedUserKey1", alias = "WrappedUserKey1")]
21+
pub wrapped_user_key1: String,
22+
/// User Key V1 Wrapped User Key V2.
23+
#[serde(rename = "wrappedUserKey2", alias = "WrappedUserKey2")]
24+
pub wrapped_user_key2: String,
25+
}
26+
27+
impl V2UpgradeTokenRequestModel {
28+
/// Request model for V2 upgrade token submitted during key rotation. Contains wrapped user keys
29+
/// allowing clients to unlock after V1→V2 upgrade.
30+
pub fn new(wrapped_user_key1: String, wrapped_user_key2: String) -> V2UpgradeTokenRequestModel {
31+
V2UpgradeTokenRequestModel {
32+
wrapped_user_key1,
33+
wrapped_user_key2,
34+
}
35+
}
36+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Bitwarden Internal API
3+
*
4+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
5+
*
6+
* The version of the OpenAPI document: latest
7+
*
8+
* Generated by: https://openapi-generator.tech
9+
*/
10+
11+
use serde::{Deserialize, Serialize};
12+
13+
use crate::models;
14+
15+
#[derive(Clone, Default, Debug, PartialEq, Serialize, Deserialize)]
16+
pub struct V2UpgradeTokenResponseModel {
17+
#[serde(rename = "wrappedUserKey1", alias = "WrappedUserKey1")]
18+
pub wrapped_user_key1: Option<String>,
19+
#[serde(rename = "wrappedUserKey2", alias = "WrappedUserKey2")]
20+
pub wrapped_user_key2: Option<String>,
21+
}
22+
23+
impl V2UpgradeTokenResponseModel {
24+
pub fn new(
25+
wrapped_user_key1: Option<String>,
26+
wrapped_user_key2: Option<String>,
27+
) -> V2UpgradeTokenResponseModel {
28+
V2UpgradeTokenResponseModel {
29+
wrapped_user_key1,
30+
wrapped_user_key2,
31+
}
32+
}
33+
}

crates/bitwarden-core/src/auth/auth_request.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ mod tests {
166166
salt: "test@bitwarden.com".to_string(),
167167
},
168168
WrappedAccountCryptographicState::V1 { private_key },
169+
None,
169170
)
170171
.unwrap();
171172

@@ -240,6 +241,7 @@ mod tests {
240241
WrappedAccountCryptographicState::V1 {
241242
private_key: private_key.clone(),
242243
},
244+
None,
243245
)
244246
.unwrap();
245247

@@ -264,6 +266,7 @@ mod tests {
264266
protected_user_key: approved_req,
265267
},
266268
},
269+
upgrade_token: None,
267270
})
268271
.await
269272
.unwrap();

crates/bitwarden-core/src/auth/login/api_key.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub(crate) async fn login_api_key(
4848
input.password.clone(),
4949
master_password_unlock.clone(),
5050
user_key_state,
51+
None,
5152
)?;
5253

5354
client

crates/bitwarden-core/src/auth/login/auth_request.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ pub(crate) async fn complete_auth_request(
135135
request_private_key: auth_req.private_key,
136136
method,
137137
},
138+
upgrade_token: None,
138139
})
139140
.await?;
140141

crates/bitwarden-core/src/auth/login/password.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ pub(crate) async fn login_password(
6262
input.password.clone(),
6363
master_password_unlock.clone(),
6464
user_key_state,
65+
None,
6566
)?;
6667

6768
client

crates/bitwarden-core/src/auth/password/validate.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ mod tests {
154154
salt: email.to_string(),
155155
},
156156
WrappedAccountCryptographicState::V1 { private_key },
157+
None,
157158
)
158159
.unwrap();
159160

@@ -206,6 +207,7 @@ mod tests {
206207
salt: email.to_string(),
207208
},
208209
WrappedAccountCryptographicState::V1 { private_key },
210+
None,
209211
)
210212
.unwrap();
211213

0 commit comments

Comments
 (0)