mirror of
				https://github.com/dani-garcia/vaultwarden.git
				synced 2025-10-26 07:50:02 +02:00 
			
		
		
		
	Remove dependent items when removing cipher
This commit is contained in:
		| @@ -169,9 +169,10 @@ fn delete_account(data: Json<PasswordData>, headers: Headers, conn: DbConn) -> E | ||||
|  | ||||
|     // Delete ciphers and their attachments | ||||
|     for cipher in Cipher::find_owned_by_user(&user.uuid, &conn) { | ||||
|         for a in Attachment::find_by_cipher(&cipher.uuid, &conn) { a.delete(&conn); } | ||||
|  | ||||
|         cipher.delete(&conn); | ||||
|         match cipher.delete(&conn) { | ||||
|             Ok(()) => (), | ||||
|             Err(_) => err!("Failed deleting cipher") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Delete folders | ||||
|   | ||||
| @@ -450,9 +450,10 @@ fn delete_attachment(uuid: String, attachment_id: String, headers: Headers, conn | ||||
|     } | ||||
|  | ||||
|     // Delete attachment | ||||
|     attachment.delete(&conn); | ||||
|  | ||||
|     Ok(()) | ||||
|     match attachment.delete(&conn) { | ||||
|         Ok(()) => Ok(()), | ||||
|         Err(_) => err!("Deleting attachement failed") | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[post("/ciphers/<uuid>/delete")] | ||||
| @@ -549,7 +550,10 @@ fn delete_all(data: Json<PasswordData>, headers: Headers, conn: DbConn) -> Empty | ||||
|  | ||||
|     // Delete ciphers and their attachments | ||||
|     for cipher in Cipher::find_owned_by_user(&user.uuid, &conn) { | ||||
|         _delete_cipher(cipher, &conn); | ||||
|         match cipher.delete(&conn) { | ||||
|             Ok(()) => (), | ||||
|             Err(_) => err!("Failed deleting cipher") | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Delete folders | ||||
| @@ -568,15 +572,8 @@ fn _delete_cipher_by_uuid(uuid: &str, headers: &Headers, conn: &DbConn) -> Empty | ||||
|         err!("Cipher can't be deleted by user") | ||||
|     } | ||||
|  | ||||
|     _delete_cipher(cipher, conn); | ||||
|  | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| fn _delete_cipher(cipher: Cipher, conn: &DbConn) { | ||||
|     // Delete the attachments | ||||
|     for a in Attachment::find_by_cipher(&cipher.uuid, &conn) { a.delete(&conn); } | ||||
|  | ||||
|     // Delete the cipher | ||||
|     cipher.delete(conn); | ||||
|     match cipher.delete(conn) { | ||||
|         Ok(()) => Ok(()), | ||||
|         Err(_) => err!("Failed deleting cipher") | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -62,17 +62,23 @@ impl Attachment { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     pub fn delete(self, conn: &DbConn) -> bool { | ||||
|     pub fn delete(self, conn: &DbConn) -> QueryResult<()> { | ||||
|         use util; | ||||
|  | ||||
|         util::delete_file(&self.get_file_path()); | ||||
|  | ||||
|         match diesel::delete(attachments::table.filter( | ||||
|             attachments::id.eq(self.id))) | ||||
|             .execute(&**conn) { | ||||
|             Ok(1) => true, // One row deleted | ||||
|             _ => false, | ||||
|         diesel::delete( | ||||
|             attachments::table.filter( | ||||
|                 attachments::id.eq(self.id) | ||||
|             ) | ||||
|         ).execute(&**conn).and(Ok(())) | ||||
|     } | ||||
|  | ||||
|     pub fn delete_all_by_cipher(cipher_uuid: &str, conn: &DbConn) -> QueryResult<()> { | ||||
|         for attachement in Attachment::find_by_cipher(&cipher_uuid, &conn) { | ||||
|             attachement.delete(&conn)?; | ||||
|         } | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
|     pub fn find_by_id(id: &str, conn: &DbConn) -> Option<Self> { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ use serde_json::Value as JsonValue; | ||||
|  | ||||
| use uuid::Uuid; | ||||
|  | ||||
| use super::{User, Organization, UserOrganization, FolderCipher, UserOrgType}; | ||||
| use super::{User, Organization, UserOrganization, Attachment, FolderCipher, CollectionCipher, UserOrgType}; | ||||
|  | ||||
| #[derive(Debug, Identifiable, Queryable, Insertable, Associations)] | ||||
| #[table_name = "ciphers"] | ||||
| @@ -133,13 +133,16 @@ impl Cipher { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     pub fn delete(self, conn: &DbConn) -> bool { | ||||
|         match diesel::delete(ciphers::table.filter( | ||||
|             ciphers::uuid.eq(self.uuid))) | ||||
|             .execute(&**conn) { | ||||
|             Ok(1) => true, // One row deleted | ||||
|             _ => false, | ||||
|         } | ||||
|     pub fn delete(self, conn: &DbConn) -> QueryResult<()> { | ||||
|         FolderCipher::delete_all_by_cipher(&self.uuid, &conn)?; | ||||
|         CollectionCipher::delete_all_by_cipher(&self.uuid, &conn)?; | ||||
|         Attachment::delete_all_by_cipher(&self.uuid, &conn)?; | ||||
|  | ||||
|         diesel::delete( | ||||
|             ciphers::table.filter( | ||||
|                 ciphers::uuid.eq(self.uuid) | ||||
|             ) | ||||
|         ).execute(&**conn).and(Ok(())) | ||||
|     } | ||||
|  | ||||
|     pub fn move_to_folder(&self, folder_uuid: Option<String>, user_uuid: &str, conn: &DbConn) -> Result<(), &str> { | ||||
|   | ||||
| @@ -204,4 +204,10 @@ impl CollectionCipher { | ||||
|             _ => false, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     pub fn delete_all_by_cipher(cipher_uuid: &str, conn: &DbConn) -> QueryResult<()> { | ||||
|         diesel::delete(ciphers_collections::table | ||||
|             .filter(ciphers_collections::cipher_uuid.eq(cipher_uuid)) | ||||
|         ).execute(&**conn).and(Ok(())) | ||||
|     } | ||||
| } | ||||
| @@ -117,6 +117,12 @@ impl FolderCipher { | ||||
|         ).execute(&**conn).and(Ok(())) | ||||
|     } | ||||
|  | ||||
|     pub fn delete_all_by_cipher(cipher_uuid: &str, conn: &DbConn) -> QueryResult<()> { | ||||
|         diesel::delete(folders_ciphers::table | ||||
|             .filter(folders_ciphers::cipher_uuid.eq(cipher_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)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user