vw_small

Hardened fork of Vaultwarden (https://github.com/dani-garcia/vaultwarden) with fewer features.
git clone https://git.philomathiclife.com/repos/vw_small
Log | Files | Refs | README

commit e2a065cb09e00e69e6bb91c4981636b68fc56e0f
parent 795d98afa6ff930c601b175993ff3ce428bfec8c
Author: Daniel GarcĂ­a <dani-garcia@users.noreply.github.com>
Date:   Wed, 16 May 2018 22:50:47 +0200

Merge pull request #20 from mprasil/folder_delete

Improve Folder::delete() to handle FolderCipher
Diffstat:
Msrc/api/core/accounts.rs | 7++++++-
Msrc/api/core/ciphers.rs | 7++++++-
Msrc/api/core/folders.rs | 10++++------
Msrc/db/models/folder.rs | 21++++++++++++++-------
4 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/api/core/accounts.rs b/src/api/core/accounts.rs @@ -176,7 +176,12 @@ fn delete_account(data: Json<PasswordData>, headers: Headers, conn: DbConn) -> E } // Delete folders - for f in Folder::find_by_user(&user.uuid, &conn) { f.delete(&conn); } + for f in Folder::find_by_user(&user.uuid, &conn) { + match f.delete(&conn) { + Ok(()) => (), + Err(_) => err!("Failed deleting folder") + } + } // Delete devices for d in Device::find_by_user(&user.uuid, &conn) { d.delete(&conn); } diff --git a/src/api/core/ciphers.rs b/src/api/core/ciphers.rs @@ -557,7 +557,12 @@ fn delete_all(data: Json<PasswordData>, headers: Headers, conn: DbConn) -> Empty } // Delete folders - for f in Folder::find_by_user(&user.uuid, &conn) { f.delete(&conn); } + for f in Folder::find_by_user(&user.uuid, &conn) { + match f.delete(&conn) { + Ok(()) => (), + Err(_) => err!("Failed deleting folder") + } + } Ok(()) } diff --git a/src/api/core/folders.rs b/src/api/core/folders.rs @@ -89,11 +89,9 @@ fn delete_folder(uuid: String, headers: Headers, conn: DbConn) -> EmptyResult { err!("Folder belongs to another user") } - // Delete FolderCipher mappings - for fc in FolderCipher::find_by_folder(&uuid, &conn) { fc.delete(&conn).expect("Error deleting mapping"); } - // Delete the actual folder entry - folder.delete(&conn); - - Ok(()) + match folder.delete(&conn) { + Ok(()) => Ok(()), + Err(_) => err!("Failed deleting folder") + } } diff --git a/src/db/models/folder.rs b/src/db/models/folder.rs @@ -81,13 +81,14 @@ impl Folder { } } - pub fn delete(self, conn: &DbConn) -> bool { - match diesel::delete(folders::table.filter( - folders::uuid.eq(self.uuid))) - .execute(&**conn) { - Ok(1) => true, // One row deleted - _ => false, - } + pub fn delete(self, conn: &DbConn) -> QueryResult<()> { + FolderCipher::delete_all_by_folder(&self.uuid, &conn)?; + + diesel::delete( + folders::table.filter( + folders::uuid.eq(self.uuid) + ) + ).execute(&**conn).and(Ok(())) } pub fn find_by_uuid(uuid: &str, conn: &DbConn) -> Option<Self> { @@ -123,6 +124,12 @@ impl FolderCipher { ).execute(&**conn).and(Ok(())) } + pub fn delete_all_by_folder(folder_uuid: &str, conn: &DbConn) -> QueryResult<()> { + diesel::delete(folders_ciphers::table + .filter(folders_ciphers::folder_uuid.eq(folder_uuid)) + ).execute(&**conn).and(Ok(())) + } + pub fn find_by_folder_and_cipher(folder_uuid: &str, cipher_uuid: &str, conn: &DbConn) -> Option<Self> { folders_ciphers::table .filter(folders_ciphers::folder_uuid.eq(folder_uuid))