Skip to content

Commit

Permalink
Add avatar color support
Browse files Browse the repository at this point in the history
The new web-vault v2023.1.0 supports a custom color for the avatar.
bitwarden/server#2330

This PR adds this feature.
  • Loading branch information
BlackDex committed Jan 11, 2023
1 parent 367e1ce commit 36b5350
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 1 deletion.
Empty file.
2 changes: 2 additions & 0 deletions migrations/mysql/2023-01-11-205851_add_avatar_color/up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE users
ADD COLUMN avatar_color VARCHAR(7);
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE users
ADD COLUMN avatar_color TEXT;
Empty file.
2 changes: 2 additions & 0 deletions migrations/sqlite/2023-01-11-205851_add_avatar_color/up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE users
ADD COLUMN avatar_color TEXT;
27 changes: 27 additions & 0 deletions src/api/core/accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ pub fn routes() -> Vec<rocket::Route> {
api_key,
rotate_api_key,
get_known_device,
put_avatar,
]
}

Expand Down Expand Up @@ -228,6 +229,32 @@ async fn post_profile(data: JsonUpcase<ProfileData>, headers: Headers, mut conn:
Ok(Json(user.to_json(&mut conn).await))
}

#[derive(Deserialize)]
#[allow(non_snake_case)]
struct AvatarData {
AvatarColor: Option<String>,
}

#[put("/accounts/avatar", data = "<data>")]
async fn put_avatar(data: JsonUpcase<AvatarData>, headers: Headers, mut conn: DbConn) -> JsonResult {
let data: AvatarData = data.into_inner().data;

// It looks like it only supports the 6 hex color format.
// If you try to add the short value it will not show that color.
// Check and force 7 chars, including the #.
if let Some(color) = &data.AvatarColor {
if color.len() != 7 {
err!("The field AvatarColor must be a HTML/Hex color code with a length of 7 characters")
}
}

let mut user = headers.user;
user.avatar_color = data.AvatarColor;

user.save(&mut conn).await?;
Ok(Json(user.to_json(&mut conn).await))
}

#[get("/users/<uuid>/public-key")]
async fn get_public_keys(uuid: String, _headers: Headers, mut conn: DbConn) -> JsonResult {
let user = match User::find_by_uuid(&uuid, &mut conn).await {
Expand Down
5 changes: 5 additions & 0 deletions src/db/models/user.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ db_object! {
pub client_kdf_iter: i32,

pub api_key: Option<String>,

pub avatar_color: Option<String>,
}

#[derive(Identifiable, Queryable, Insertable)]
Expand Down Expand Up @@ -113,6 +115,8 @@ impl User {
client_kdf_iter: Self::CLIENT_KDF_ITER_DEFAULT,

api_key: None,

avatar_color: None,
}
}

Expand Down Expand Up @@ -226,6 +230,7 @@ impl User {
"Providers": [],
"ProviderOrganizations": [],
"ForcePasswordReset": false,
"AvatarColor": self.avatar_color,
"Object": "profile",
})
}
Expand Down
1 change: 1 addition & 0 deletions src/db/schemas/mysql/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ table! {
client_kdf_type -> Integer,
client_kdf_iter -> Integer,
api_key -> Nullable<Text>,
avatar_color -> Nullable<Text>,
}
}

Expand Down
1 change: 1 addition & 0 deletions src/db/schemas/postgresql/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ table! {
client_kdf_type -> Integer,
client_kdf_iter -> Integer,
api_key -> Nullable<Text>,
avatar_color -> Nullable<Text>,
}
}

Expand Down
1 change: 1 addition & 0 deletions src/db/schemas/sqlite/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ table! {
client_kdf_type -> Integer,
client_kdf_iter -> Integer,
api_key -> Nullable<Text>,
avatar_color -> Nullable<Text>,
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
// The more key/value pairs there are the more recursion occurs.
// We want to keep this as low as possible, but not higher then 128.
// If you go above 128 it will cause rust-analyzer to fail,
#![recursion_limit = "94"]
#![recursion_limit = "97"]

// When enabled use MiMalloc as malloc instead of the default malloc
#[cfg(feature = "enable_mimalloc")]
Expand Down

0 comments on commit 36b5350

Please sign in to comment.