Spiegel von
https://github.com/dani-garcia/vaultwarden.git
synchronisiert 2025-02-01 10:17:01 +01:00
996b60e43d
Previously the websocket notifications were using `app_id` as the `ContextId`. This was incorrect and should have been the device_uuid from the client device executing the request. The clients will ignore the websocket request if the uuid matches. This also fixes some issues with the Desktop client which is able to modify attachments within the same screen and causes an issue when saving the attachment afterwards. Also changed the way to handle removed attachments, since that causes an error saving the vault cipher afterwards, complaining about a missing attachment. Bitwarden ignores this, and continues with the remaining attachments (if any). This also fixes #2591 . Further some more websocket notifications have been added to some other functions which enhance the user experience. - Logout users when deauthed, changed password, rotated keys - Trigger OrgSyncKeys on user confirm and removal - Added some extra to the send feature Also renamed UpdateTypes to match Bitwarden naming.
117 Zeilen
3,3 KiB
Rust
117 Zeilen
3,3 KiB
Rust
use rocket::serde::json::Json;
|
|
use serde_json::Value;
|
|
|
|
use crate::{
|
|
api::{EmptyResult, JsonResult, JsonUpcase, Notify, UpdateType},
|
|
auth::Headers,
|
|
db::{models::*, DbConn},
|
|
};
|
|
|
|
pub fn routes() -> Vec<rocket::Route> {
|
|
routes![get_folders, get_folder, post_folders, post_folder, put_folder, delete_folder_post, delete_folder,]
|
|
}
|
|
|
|
#[get("/folders")]
|
|
async fn get_folders(headers: Headers, mut conn: DbConn) -> Json<Value> {
|
|
let folders = Folder::find_by_user(&headers.user.uuid, &mut conn).await;
|
|
let folders_json: Vec<Value> = folders.iter().map(Folder::to_json).collect();
|
|
|
|
Json(json!({
|
|
"Data": folders_json,
|
|
"Object": "list",
|
|
"ContinuationToken": null,
|
|
}))
|
|
}
|
|
|
|
#[get("/folders/<uuid>")]
|
|
async fn get_folder(uuid: String, headers: Headers, mut conn: DbConn) -> JsonResult {
|
|
let folder = match Folder::find_by_uuid(&uuid, &mut conn).await {
|
|
Some(folder) => folder,
|
|
_ => err!("Invalid folder"),
|
|
};
|
|
|
|
if folder.user_uuid != headers.user.uuid {
|
|
err!("Folder belongs to another user")
|
|
}
|
|
|
|
Ok(Json(folder.to_json()))
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
#[allow(non_snake_case)]
|
|
pub struct FolderData {
|
|
pub Name: String,
|
|
}
|
|
|
|
#[post("/folders", data = "<data>")]
|
|
async fn post_folders(data: JsonUpcase<FolderData>, headers: Headers, mut conn: DbConn, nt: Notify<'_>) -> JsonResult {
|
|
let data: FolderData = data.into_inner().data;
|
|
|
|
let mut folder = Folder::new(headers.user.uuid, data.Name);
|
|
|
|
folder.save(&mut conn).await?;
|
|
nt.send_folder_update(UpdateType::SyncFolderCreate, &folder, &headers.device.uuid).await;
|
|
|
|
Ok(Json(folder.to_json()))
|
|
}
|
|
|
|
#[post("/folders/<uuid>", data = "<data>")]
|
|
async fn post_folder(
|
|
uuid: String,
|
|
data: JsonUpcase<FolderData>,
|
|
headers: Headers,
|
|
conn: DbConn,
|
|
nt: Notify<'_>,
|
|
) -> JsonResult {
|
|
put_folder(uuid, data, headers, conn, nt).await
|
|
}
|
|
|
|
#[put("/folders/<uuid>", data = "<data>")]
|
|
async fn put_folder(
|
|
uuid: String,
|
|
data: JsonUpcase<FolderData>,
|
|
headers: Headers,
|
|
mut conn: DbConn,
|
|
nt: Notify<'_>,
|
|
) -> JsonResult {
|
|
let data: FolderData = data.into_inner().data;
|
|
|
|
let mut folder = match Folder::find_by_uuid(&uuid, &mut conn).await {
|
|
Some(folder) => folder,
|
|
_ => err!("Invalid folder"),
|
|
};
|
|
|
|
if folder.user_uuid != headers.user.uuid {
|
|
err!("Folder belongs to another user")
|
|
}
|
|
|
|
folder.name = data.Name;
|
|
|
|
folder.save(&mut conn).await?;
|
|
nt.send_folder_update(UpdateType::SyncFolderUpdate, &folder, &headers.device.uuid).await;
|
|
|
|
Ok(Json(folder.to_json()))
|
|
}
|
|
|
|
#[post("/folders/<uuid>/delete")]
|
|
async fn delete_folder_post(uuid: String, headers: Headers, conn: DbConn, nt: Notify<'_>) -> EmptyResult {
|
|
delete_folder(uuid, headers, conn, nt).await
|
|
}
|
|
|
|
#[delete("/folders/<uuid>")]
|
|
async fn delete_folder(uuid: String, headers: Headers, mut conn: DbConn, nt: Notify<'_>) -> EmptyResult {
|
|
let folder = match Folder::find_by_uuid(&uuid, &mut conn).await {
|
|
Some(folder) => folder,
|
|
_ => err!("Invalid folder"),
|
|
};
|
|
|
|
if folder.user_uuid != headers.user.uuid {
|
|
err!("Folder belongs to another user")
|
|
}
|
|
|
|
// Delete the actual folder entry
|
|
folder.delete(&mut conn).await?;
|
|
|
|
nt.send_folder_update(UpdateType::SyncFolderDelete, &folder, &headers.device.uuid).await;
|
|
Ok(())
|
|
}
|