-
Notifications
You must be signed in to change notification settings - Fork 20
Auth/PM-22661 - Send Access #351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
143 commits
Select commit
Hold shift + click to select a range
5cb35a9
PM-22661 - Add anonymous auth_client and documentation
JaredSnider-Bitwarden 07e49b3
PM-22661 - WIP on building various classes
JaredSnider-Bitwarden bec03fc
PM-22661 - SendAccessTokenPayload serialization
JaredSnider-Bitwarden 5a140fd
PM-22661 - Add traits for converting SendAccessTokenRequest to SendAcโฆ
JaredSnider-Bitwarden 68617bd
PM-22661 - WIP - Start defining send token api service + response modโฆ
JaredSnider-Bitwarden 6a5370f
PM-22661 - (1) Progress on SendApiService (2) Refactor names / folderโฆ
JaredSnider-Bitwarden f5daadb
PM-22661 - Wasm Crate - add serde_urlencoded for quicker encoding of โฆ
JaredSnider-Bitwarden dac6068
PM-22661 - SendTokenApiService - clean up comments
JaredSnider-Bitwarden c435f56
PM-22661 - SendTokenApiService - fix import
JaredSnider-Bitwarden e209646
PM-22661 - SendAccessTokenRequest - add comment
JaredSnider-Bitwarden d70bc5b
PM-22661 - SendAccess mod - remove enums
JaredSnider-Bitwarden cac6788
PM-22661 - SendTokenApiService integration test suite - some progress
JaredSnider-Bitwarden 14243d9
PM-22661 - bw-wasm-internal crate cargo.toml - Instead of just builiโฆ
JaredSnider-Bitwarden 7c7f1cb
PM-22661 - AuthClient - must make public outside of crate as integratโฆ
JaredSnider-Bitwarden 8b57676
PM-22661 - Lib.rs - make auth module public
JaredSnider-Bitwarden ad9fd99
PM-22661 - Auth mod.rs - make send_access module public.
JaredSnider-Bitwarden 14238ac
PM-22661 - SendAccessToken - add docs and make properties public
JaredSnider-Bitwarden 1d7d638
PM-22661 - Auth>SendAccess>Requests mod.rs - add enums module and makโฆ
JaredSnider-Bitwarden 8674ef4
PM-22661 - Fix imports after creating responses/enums and requests/eโฆ
JaredSnider-Bitwarden 19a4de8
PM-22661 - SendTokenApiService - make auth_client public outside of cโฆ
JaredSnider-Bitwarden 33a1d86
PM-22661 - SendAccessCredentials - add serialization + unit tests for it
JaredSnider-Bitwarden a81ca5d
PM-22661 - SendAccessTokenRequest - add serialization
JaredSnider-Bitwarden c04c12f
PM-22661 - SendAccessTokenResponse - add serialization
JaredSnider-Bitwarden 58ef896
PM-22661 - Port over Dani's changes to fix integration tests
JaredSnider-Bitwarden d91275a
PM-22661 - Add clone to request and credentials for easier test usage
JaredSnider-Bitwarden 9327e04
PM-22661 - SendTokenApiService integration tests - get tests passing
JaredSnider-Bitwarden 11b5ab6
PM-22661 - SendTokenApiService - remove unnecessary mut
JaredSnider-Bitwarden 3fb485f
PM-22661 - Add a bunch of docs
JaredSnider-Bitwarden c0a0f9a
PM-22661 - Rename SendAccessTokenPayloadVariant to SendAccessTokenPayโฆ
JaredSnider-Bitwarden 44fb2f6
PM-22661 - More docs
JaredSnider-Bitwarden cc925bd
PM-22661 - SendAccessTokenError - add tests
JaredSnider-Bitwarden 9c57d56
PM-22661 - (1) Add new, separate enums for invalid grant and request โฆ
JaredSnider-Bitwarden b476eb6
Merge remote-tracking branch 'origin/main' into auth/pm-22661/send-acโฆ
JaredSnider-Bitwarden 34fd641
PM-22661 - Clean up comments
JaredSnider-Bitwarden acc3870
PM-22661 - SendTokenApiService - clean up typescript commented out coโฆ
JaredSnider-Bitwarden 5db40c1
PM-22661 - Move / refactor request logic into token_request in auth cโฆ
JaredSnider-Bitwarden 293d0d7
PM-22661 - Move common module over to auth crate
JaredSnider-Bitwarden 1deb5fa
PM-22661 - Internal module - declare token_request_payload but limit โฆ
JaredSnider-Bitwarden fe238de
PM-22661 - SendAccess module - (1) declare internal module so send acโฆ
JaredSnider-Bitwarden 4bce01d
PM-22661 - TokenRequestPayload - (1) bring over and combine relevant โฆ
JaredSnider-Bitwarden c620e4f
PM-22661 - Delete files that were moved to bw-auth crate
JaredSnider-Bitwarden 21842bf
PM-22661 - token_request --> access_token_request
JaredSnider-Bitwarden 5bac04e
PM-22661 - Bring over access_token_response
JaredSnider-Bitwarden 4b20cd0
PM-22661 - Bring over token_api_error_response content to bw-auth
JaredSnider-Bitwarden 972a8b5
PM-22661 - Bring over SendAccessTokenResponse and rename in bw-auth
JaredSnider-Bitwarden c107751
PM-22661 - SendAccessTokenError renamed to SendAccessTokenApiErrorResโฆ
JaredSnider-Bitwarden 0551d35
PM-22661 - internal mod - rearrange code
JaredSnider-Bitwarden d60e6dd
PM-22661 - Re-add trait for converting api success response to send aโฆ
JaredSnider-Bitwarden 8f68dc3
PM-22661 - SendAccessTokenPayload --> SendAccessTokenRequestPayload
JaredSnider-Bitwarden 2ba21a8
PM-22661 - Move request_send_access_token logic over and update bw-auโฆ
JaredSnider-Bitwarden 458d992
PM-22661 - Finish removing all changes but test file from wasm internโฆ
JaredSnider-Bitwarden e7ea86f
PM-22661 - Apply Dani's fixes
JaredSnider-Bitwarden 74b8fe3
PM-22661 - Readme add todo
JaredSnider-Bitwarden 66fd4a0
PM-22661 - SendAccess Client - request_send_access_token - get error โฆ
JaredSnider-Bitwarden 804c87a
PM-22661 - SendAccessClient - request_send_access_token - actually coโฆ
JaredSnider-Bitwarden 00f417c
PM-22661 - spacing
JaredSnider-Bitwarden 0270a22
PM-22661 - WIP on integration tests
JaredSnider-Bitwarden d692b6d
PM-22661 - Rename internal to just API so we can make response modelsโฆ
JaredSnider-Bitwarden 856ecb0
PM-22661 - Worked with Andreas to get modules structured better
JaredSnider-Bitwarden f771dbc
PM-22661 - Lint
JaredSnider-Bitwarden 4df558f
PM-22661 - Change Scope to match new server value
JaredSnider-Bitwarden 21e5fcd
PM-22661 - Add scope docs
JaredSnider-Bitwarden 9cc4fb5
PM-22661 - Clean up unused import
JaredSnider-Bitwarden fe50102
PM-22661 - GrantType docs
JaredSnider-Bitwarden 0612e4d
PM-22661 - SendAccessClient docs
JaredSnider-Bitwarden 180f8d9
PM-22661 - format
JaredSnider-Bitwarden dd1db6b
PM-22661 - Address warnings in test
JaredSnider-Bitwarden dc2529d
PM-22661 - Add invalid send_id error case
JaredSnider-Bitwarden 43e5b93
PM-22661 - SendAccess tests - finish adding invalid request scenarios
JaredSnider-Bitwarden 7fa3ab1
PM-22661 - Get all send access tests passing and finish adding invaliโฆ
JaredSnider-Bitwarden e927128
PM-22661 - Fix lint - alphabetize bw-auth crate deps
JaredSnider-Bitwarden c897dc0
PM-22661 - Actually sort bw-auth crate toml
JaredSnider-Bitwarden da447ef
Merge remote-tracking branch 'origin/main' into auth/pm-22661/send-acโฆ
JaredSnider-Bitwarden 98f5d7b
PM-22661 - Try to appease the linter again with turning links into acโฆ
JaredSnider-Bitwarden be733db
PM-22661 - SendAccessTokenResponse - rename fields to camelCase
JaredSnider-Bitwarden b73c32c
PM-22661 - SendAccessTokenRequest - rename to camel case for typescript
JaredSnider-Bitwarden 2e232cf
PM-22661 - Update invalid request / grant enums to use alias so we caโฆ
JaredSnider-Bitwarden 2c1b0e3
PM-22661 - Refactor to offer expected and unexpected errors + refactoโฆ
JaredSnider-Bitwarden d65e7ee
PM-22661 - replace final usage of AuthApiError with IdentityTransportโฆ
JaredSnider-Bitwarden 8d0c65b
PM-22661 - SendAccessTokenError - use lowercase for expected / unexpeโฆ
JaredSnider-Bitwarden d61c4ee
PM-22661 - Update SendAccessTokenApiErrorResponse to use a struct witโฆ
JaredSnider-Bitwarden 50010d2
PM-22661 - Try to fix lint errors
JaredSnider-Bitwarden f3d836d
PM-22661 - fix lint again
JaredSnider-Bitwarden 10d23a8
PM-22661 - SendAccessTokenRequest - make send_access_credentials optiโฆ
JaredSnider-Bitwarden 814f3e0
PM-22661 - SendPasswordCredentials - camelCase output
JaredSnider-Bitwarden d42ddc2
PM-22661 - Go back to camel case for JSON serialization across board โฆ
JaredSnider-Bitwarden f92a5c4
PM-22661 - cargo +nightly-2025-08-18 fmt
JaredSnider-Bitwarden 0c3ebac
PM-22661 - Completely refactor SendAccessTokenApiErrorResponse to proโฆ
JaredSnider-Bitwarden 0f78bd1
PM-22661 - cargo format + lint
JaredSnider-Bitwarden 9bff39f
PM-22661 - Get integration tests passing in light of previous token_aโฆ
JaredSnider-Bitwarden fdcaba4
PM-22661 - TokenRequestPayload - fix comments
JaredSnider-Bitwarden 01394b2
Merge remote-tracking branch 'origin/main' into auth/pm-22661/send-acโฆ
JaredSnider-Bitwarden 3fbdfe2
merge main and fix conflicts
JaredSnider-Bitwarden 0c855e5
PM-22661 - Add docs
JaredSnider-Bitwarden b3b136e
PM-22661 - cargo lock changes after merge mistakes
JaredSnider-Bitwarden 888ed38
PM-22661 - Rename IdentityTransportError to UnexpectedIdentityError
JaredSnider-Bitwarden bf85519
PM-22661 - cargo fmt
JaredSnider-Bitwarden f204301
PM-22661 - Update readme.
JaredSnider-Bitwarden 2093c1a
PM-22661 - Add handling for otp_generation_failed
JaredSnider-Bitwarden 22d7846
PM-22661 - Per PR feedback, adjust doc comment to be normal comment tโฆ
JaredSnider-Bitwarden 556ddf6
PM-225661 - Client.rs - per PR feedback, remove type
JaredSnider-Bitwarden cf34d1b
PM-22661 - clients.rs - per PR feedback, remove unncessary docs
JaredSnider-Bitwarden 03b64e8
PM-22661 - Per PR feedback move docs to where it makes better sense.
JaredSnider-Bitwarden 1ca17ec
PM-22661 - Per PR feedback, clean up whitespace
JaredSnider-Bitwarden 1e4a117
PM-22661 - Per PR feedback, clean up readme indentation
JaredSnider-Bitwarden 0d41ac9
PM-22661 - Per PR feedback, remove zeroize as it was unused.
JaredSnider-Bitwarden c2164ad
PM-22661 - SendAccess tests - per PR feedback, replace manual mock seโฆ
JaredSnider-Bitwarden 1a6a720
PM-22661 - lint and format
JaredSnider-Bitwarden e88630b
Merge remote-tracking branch 'origin/main' into auth/pm-22661/send-acโฆ
JaredSnider-Bitwarden 287f457
PM-22661 - cargo sort proper version...
JaredSnider-Bitwarden de2f8d3
PM-22661 - Work with Dani to improve any unexpected 4xx or 5xx errors.
JaredSnider-Bitwarden fc27f7b
PM-22661 - Clean up inaccurate comment
JaredSnider-Bitwarden 833abba
PM-22661 - Clean up comments
JaredSnider-Bitwarden cd8a359
PM-22661 - Add tests for unexpected error scenarios
JaredSnider-Bitwarden d9700ac
PM-22661 - Add better docs about how SendAccessTokenError::Unexpectedโฆ
JaredSnider-Bitwarden 8b7aa18
PM-22661 - TokenRequestPayload - Adjust test to not use string literaโฆ
JaredSnider-Bitwarden 221d036
PM-22661 - TokenApiErrorResponse tests - fix test indentation of striโฆ
JaredSnider-Bitwarden 6802eeb
PM-22661 - Fix removed newline
JaredSnider-Bitwarden bbd3ce2
PM-22661 - serde_urlencoded - per PR feedback, use 0.7.1 or greater.
JaredSnider-Bitwarden d299f81
PM-22661 - Per PR feedback, clean up unnecessary comment
JaredSnider-Bitwarden 45585ea
PM-22661 - TokenApiErrorResponse - per PR feedback, use rename all
JaredSnider-Bitwarden 3ebdd7d
PM-22661 - TokenRequestPayload - Per PR feedback, adjust comment to bโฆ
JaredSnider-Bitwarden 5cd11c6
PM-22661 - Per Dani, refactor UnexpectedIdentityError to just wrap a โฆ
JaredSnider-Bitwarden a636111
PM-22661 - Per PR feedback, move module docs into actual mod.rs file โฆ
JaredSnider-Bitwarden 3ab2fda
PM-22661 - Docs changes
JaredSnider-Bitwarden cc84733
PM-22661 - SendAccess Anon Send test - update test to use actual commโฆ
JaredSnider-Bitwarden eb9a192
PM-22661 - TokenRequestPayload - add serialization tests for all creds
JaredSnider-Bitwarden cf7a68b
PM-22661 - SendAccess - add password and email + otp success scenarios
JaredSnider-Bitwarden 10f14fb
PM-22661 - AccessTokenResponse - clean up deprecated comment
JaredSnider-Bitwarden 14b4359
PM-22661 - BW-auth crate - cargo.toml - lock upper range of serde_urlโฆ
JaredSnider-Bitwarden 132a1a5
PM-22661 - Per PR feedback: (1) Convert bitwarden_auth > common to biโฆ
JaredSnider-Bitwarden 3cf2904
PM-22661 - FIx lint
JaredSnider-Bitwarden 855b744
PM-22661 - Update crates/bitwarden-auth/src/api/enums/grant_type.rs
JaredSnider-Bitwarden 942d1b1
PM-22661 - Per PR feedback, change visibility of GrantType and Scope โฆ
JaredSnider-Bitwarden 0625f0f
PM-22661 - Lint - Remove empty line in grant_type.rs
JaredSnider-Bitwarden 8910d08
PM-22661 - Update grant_type to not be public
JaredSnider-Bitwarden 6da90aa
PM-22661 - Update scope to not be public
JaredSnider-Bitwarden ede6e1b
PM-22661 - Make grant_type and scope enums pub(crate)
JaredSnider-Bitwarden 68aa1aa
PM-22661 - Update crates/bitwarden-auth/src/send_access/api/token_apiโฆ
JaredSnider-Bitwarden fd47f8f
PM-22661 - Update crates/bitwarden-auth/src/send_access/api/token_reqโฆ
JaredSnider-Bitwarden 4814b16
PM-22661 - Update crates/bitwarden-auth/src/send_access/api/token_reqโฆ
JaredSnider-Bitwarden 96d18fd
PM-22661 - Update crates/bitwarden-auth/src/send_access/api/token_reqโฆ
JaredSnider-Bitwarden 21a2a48
PM-22661 - Adjust api mod to have proper visibility
JaredSnider-Bitwarden File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,7 @@ | ||
# Bitwarden Auth | ||
|
||
Contains the implementation of the auth functionality for the Bitwarden Password Manager. | ||
|
||
## Send Access | ||
|
||
- Manages obtaining send access tokens for accessing secured send endpoints. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
use serde::{Deserialize, Serialize}; | ||
|
||
/// Represents the OAuth 2.0 grant types recognized by the Bitwarden API. | ||
/// A grant type specifies the method a client uses to obtain an access token, | ||
/// as defined in [RFC 6749, Section 4](https://datatracker.ietf.org/doc/html/rfc6749#section-4) | ||
/// or by custom Bitwarden extensions. The value is sent in the `grant_type` parameter | ||
/// of a token request. | ||
#[derive(Serialize, Deserialize, Debug)] | ||
#[serde(rename_all = "snake_case")] | ||
pub(crate) enum GrantType { | ||
/// A custom extension grant type for requesting send access tokens outside the context of a | ||
/// Bitwarden user. | ||
SendAccess, | ||
// TODO: Add other grant types as needed. | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
//! Module for common auth enums | ||
|
||
mod grant_type; | ||
mod scope; | ||
|
||
pub(crate) use grant_type::GrantType; | ||
pub(crate) use scope::Scope; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
use serde::{Deserialize, Serialize}; | ||
|
||
/// The OAuth 2.0 scopes recognized by the Bitwarden API. | ||
/// Scopes define the specific permissions an access token grants to the client. | ||
/// They are requested by the client during token acquisition and enforced by the | ||
/// resource server when the token is used. | ||
#[derive(Serialize, Deserialize, Debug)] | ||
pub(crate) enum Scope { | ||
/// The scope for accessing send resources outside the context of a Bitwarden user. | ||
#[serde(rename = "api.send.access")] | ||
ApiSendAccess, | ||
// TODO: Add other scopes as needed. | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
//! Module for API specific types / enums / etc. | ||
//! Note: API in the this case is generically used for any API calls. Not BW API vs BW Identity on | ||
//! server. | ||
|
||
pub mod enums; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,9 @@ | ||
#![doc = include_str!("../README.md")] | ||
|
||
mod auth_client; | ||
mod send_access; | ||
|
||
pub mod send_access; | ||
|
||
pub(crate) mod api; // keep internal to crate | ||
|
||
pub use auth_client::{AuthClient, AuthClientExt}; |
251 changes: 251 additions & 0 deletions
251
crates/bitwarden-auth/src/send_access/access_token_request.rs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,251 @@ | ||
#[cfg(feature = "wasm")] | ||
use tsify::Tsify; | ||
|
||
/// Credentials for sending password secured access requests. | ||
/// Clone auto implements the standard lib's Clone trait, allowing us to create copies of this | ||
/// struct. | ||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] | ||
pub struct SendPasswordCredentials { | ||
/// A Base64-encoded hash of the password protecting the send. | ||
pub password_hash_b64: String, | ||
} | ||
|
||
/// Credentials for sending an OTP to the user's email address. | ||
/// This is used when the send requires email verification with an OTP. | ||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] | ||
#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] | ||
pub struct SendEmailCredentials { | ||
/// The email address to which the OTP will be sent. | ||
pub email: String, | ||
} | ||
|
||
/// Credentials for getting a send access token using an email and OTP. | ||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] | ||
#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] | ||
pub struct SendEmailOtpCredentials { | ||
/// The email address to which the OTP will be sent. | ||
pub email: String, | ||
/// The one-time password (OTP) that the user has received via email. | ||
pub otp: String, | ||
} | ||
|
||
/// The credentials used for send access requests. | ||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] | ||
#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] | ||
// Use untagged so that each variant can be serialized without a type tag. | ||
// For example, this allows us to serialize the password credentials as just | ||
// {"password_hash_b64": "value"} instead of {"type": "password", "password_hash_b64": "value"}. | ||
#[serde(untagged)] | ||
pub enum SendAccessCredentials { | ||
#[allow(missing_docs)] | ||
Password(SendPasswordCredentials), | ||
#[allow(missing_docs)] | ||
Email(SendEmailCredentials), | ||
#[allow(missing_docs)] | ||
EmailOtp(SendEmailOtpCredentials), | ||
} | ||
|
||
/// A request structure for requesting a send access token from the API. | ||
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] | ||
pub struct SendAccessTokenRequest { | ||
/// The id of the send for which the access token is requested. | ||
pub send_id: String, | ||
|
||
#[serde(default, skip_serializing_if = "Option::is_none")] | ||
#[cfg_attr(feature = "wasm", tsify(optional))] | ||
/// The optional send access credentials. | ||
pub send_access_credentials: Option<SendAccessCredentials>, | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use super::*; | ||
|
||
mod send_access_token_request_tests { | ||
use serde_json::{from_str, to_string}; | ||
|
||
use super::*; | ||
|
||
#[test] | ||
fn deserialize_camelcase_request() { | ||
let json = r#" | ||
{ | ||
"sendId": "abc123", | ||
"sendAccessCredentials": { "passwordHashB64": "ha$h" } | ||
}"#; | ||
|
||
let req: SendAccessTokenRequest = from_str(json).unwrap(); | ||
assert_eq!(req.send_id, "abc123"); | ||
|
||
let creds = req.send_access_credentials.expect("expected Some"); | ||
match creds { | ||
SendAccessCredentials::Password(p) => assert_eq!(p.password_hash_b64, "ha$h"), | ||
_ => panic!("expected Password variant"), | ||
} | ||
} | ||
|
||
#[test] | ||
fn serialize_camelcase_request_with_credentials() { | ||
let req = SendAccessTokenRequest { | ||
send_id: "abc123".into(), | ||
send_access_credentials: Some(SendAccessCredentials::Password( | ||
SendPasswordCredentials { | ||
password_hash_b64: "ha$h".into(), | ||
}, | ||
)), | ||
}; | ||
let json = to_string(&req).unwrap(); | ||
assert_eq!( | ||
json, | ||
r#"{"sendId":"abc123","sendAccessCredentials":{"passwordHashB64":"ha$h"}}"# | ||
); | ||
} | ||
|
||
#[test] | ||
fn serialize_omits_optional_credentials_when_none() { | ||
let req = SendAccessTokenRequest { | ||
send_id: "abc123".into(), | ||
send_access_credentials: None, | ||
}; | ||
let json = to_string(&req).unwrap(); | ||
assert_eq!(json, r#"{"sendId":"abc123"}"#); | ||
} | ||
|
||
#[test] | ||
fn roundtrip_camel_in_to_camel_out() { | ||
let in_json = r#" | ||
{ | ||
"sendId": "abc123", | ||
"sendAccessCredentials": { "passwordHashB64": "ha$h" } | ||
}"#; | ||
|
||
let req: SendAccessTokenRequest = from_str(in_json).unwrap(); | ||
let out_json = to_string(&req).unwrap(); | ||
assert_eq!( | ||
out_json, | ||
r#"{"sendId":"abc123","sendAccessCredentials":{"passwordHashB64":"ha$h"}}"# | ||
); | ||
} | ||
|
||
#[test] | ||
fn snakecase_top_level_keys_are_rejected() { | ||
let json = r#" | ||
{ | ||
"send_id": "abc123", | ||
"sendAccessCredentials": { "passwordHashB64": "ha$h" } | ||
}"#; | ||
let err = from_str::<SendAccessTokenRequest>(json).unwrap_err(); | ||
let msg = err.to_string(); | ||
assert!( | ||
msg.contains("unknown field") && msg.contains("send_id"), | ||
"unexpected: {msg}" | ||
); | ||
} | ||
|
||
#[test] | ||
fn extra_top_level_key_is_rejected() { | ||
let json = r#" | ||
{ | ||
"sendId": "abc123", | ||
"sendAccessCredentials": { "passwordHashB64": "ha$h" }, | ||
"extra": "nope" | ||
}"#; | ||
let err = from_str::<SendAccessTokenRequest>(json).unwrap_err(); | ||
let msg = err.to_string(); | ||
assert!( | ||
msg.contains("unknown field") && msg.contains("extra"), | ||
"unexpected: {msg}" | ||
); | ||
} | ||
|
||
#[test] | ||
fn snakecase_nested_keys_are_rejected() { | ||
let json = r#" | ||
{ | ||
"sendId": "abc123", | ||
"sendAccessCredentials": { "password_hash_b64": "ha$h" } | ||
}"#; | ||
|
||
let err = serde_json::from_str::<SendAccessTokenRequest>(json).unwrap_err(); | ||
let msg = err.to_string(); | ||
assert!( | ||
msg.contains("did not match any variant"), | ||
"unexpected: {msg}" | ||
); | ||
} | ||
|
||
#[test] | ||
fn extra_nested_key_is_rejected() { | ||
let json = r#" | ||
{ | ||
"sendId": "abc123", | ||
"sendAccessCredentials": { | ||
"passwordHashB64": "ha$h", | ||
"extra": "nope" | ||
} | ||
}"#; | ||
let err = from_str::<SendAccessTokenRequest>(json).unwrap_err(); | ||
let msg = err.to_string(); | ||
assert!( | ||
msg.contains("did not match any variant"), | ||
"unexpected: {msg}" | ||
); | ||
} | ||
} | ||
|
||
mod send_access_credentials_tests { | ||
use super::*; | ||
|
||
mod send_access_password_credentials_tests { | ||
use serde_json::{from_str, to_string}; | ||
|
||
use super::*; | ||
#[test] | ||
fn deserializes_camelcase_from_ts() { | ||
let json = r#"{ "passwordHashB64": "ha$h" }"#; | ||
let s: SendPasswordCredentials = from_str(json).unwrap(); | ||
assert_eq!(s.password_hash_b64, "ha$h"); | ||
} | ||
|
||
#[test] | ||
fn serializes_camelcase_to_wire() { | ||
let s = SendPasswordCredentials { | ||
password_hash_b64: "ha$h".into(), | ||
}; | ||
let json = to_string(&s).unwrap(); | ||
assert_eq!(json, r#"{"passwordHashB64":"ha$h"}"#); | ||
} | ||
|
||
#[test] | ||
fn roundtrip_camel_in_to_camel_out() { | ||
let in_json = r#"{ "passwordHashB64": "ha$h" }"#; | ||
let parsed: SendPasswordCredentials = from_str(in_json).unwrap(); | ||
let out_json = to_string(&parsed).unwrap(); | ||
assert_eq!(out_json, r#"{"passwordHashB64":"ha$h"}"#); | ||
} | ||
} | ||
|
||
#[test] | ||
fn serialize_email_credentials() { | ||
let creds = SendAccessCredentials::Email(SendEmailCredentials { | ||
email: "user@example.com".into(), | ||
}); | ||
let json = serde_json::to_string(&creds).unwrap(); | ||
assert_eq!(json, r#"{"email":"user@example.com"}"#); | ||
} | ||
|
||
#[test] | ||
fn serialize_email_otp_credentials() { | ||
let creds = SendAccessCredentials::EmailOtp(SendEmailOtpCredentials { | ||
email: "user@example.com".into(), | ||
otp: "123456".into(), | ||
}); | ||
let json = serde_json::to_string(&creds).unwrap(); | ||
assert_eq!(json, r#"{"email":"user@example.com","otp":"123456"}"#); | ||
} | ||
} | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.