@ -11,7 +11,7 @@ use serde_json::Value;
use crate ::{
use crate ::{
api ::{ self , core ::log_event , EmptyResult , JsonResult , JsonUpcase , Notify , PasswordData , UpdateType } ,
api ::{ self , core ::log_event , EmptyResult , JsonResult , JsonUpcase , Notify , PasswordData , UpdateType } ,
auth ::{ ClientIp , Headers } ,
auth ::Headers ,
crypto ,
crypto ,
db ::{ models ::* , DbConn , DbPool } ,
db ::{ models ::* , DbConn , DbPool } ,
CONFIG ,
CONFIG ,
@ -263,10 +263,9 @@ async fn post_ciphers_admin(
data : JsonUpcase < ShareCipherData > ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
post_ciphers_create ( data , headers , conn , ip, nt) . await
post_ciphers_create ( data , headers , conn , nt) . await
}
}
/// Called when creating a new org-owned cipher, or cloning a cipher (whether
/// Called when creating a new org-owned cipher, or cloning a cipher (whether
@ -277,7 +276,6 @@ async fn post_ciphers_create(
data : JsonUpcase < ShareCipherData > ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let mut data : ShareCipherData = data . into_inner ( ) . data ;
let mut data : ShareCipherData = data . into_inner ( ) . data ;
@ -305,18 +303,12 @@ async fn post_ciphers_create(
// or otherwise), we can just ignore this field entirely.
// or otherwise), we can just ignore this field entirely.
data . Cipher . LastKnownRevisionDate = None ;
data . Cipher . LastKnownRevisionDate = None ;
share_cipher_by_uuid ( & cipher . uuid , data , & headers , & mut conn , & ip, & nt) . await
share_cipher_by_uuid ( & cipher . uuid , data , & headers , & mut conn , & nt) . await
}
}
/// Called when creating a new user-owned cipher.
/// Called when creating a new user-owned cipher.
#[ post( " /ciphers " , data = " <data> " ) ]
#[ post( " /ciphers " , data = " <data> " ) ]
async fn post_ciphers (
async fn post_ciphers ( data : JsonUpcase < CipherData > , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
data : JsonUpcase < CipherData > ,
headers : Headers ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> JsonResult {
let mut data : CipherData = data . into_inner ( ) . data ;
let mut data : CipherData = data . into_inner ( ) . data ;
// The web/browser clients set this field to null as expected, but the
// The web/browser clients set this field to null as expected, but the
@ -326,8 +318,7 @@ async fn post_ciphers(
data . LastKnownRevisionDate = None ;
data . LastKnownRevisionDate = None ;
let mut cipher = Cipher ::new ( data . Type , data . Name . clone ( ) ) ;
let mut cipher = Cipher ::new ( data . Type , data . Name . clone ( ) ) ;
update_cipher_from_data ( & mut cipher , data , & headers , false , & mut conn , & ip , & nt , UpdateType ::SyncCipherCreate )
update_cipher_from_data ( & mut cipher , data , & headers , false , & mut conn , & nt , UpdateType ::SyncCipherCreate ) . await ? ;
. await ? ;
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
}
}
@ -354,14 +345,12 @@ async fn enforce_personal_ownership_policy(
Ok ( ( ) )
Ok ( ( ) )
}
}
#[ allow(clippy::too_many_arguments) ]
pub async fn update_cipher_from_data (
pub async fn update_cipher_from_data (
cipher : & mut Cipher ,
cipher : & mut Cipher ,
data : CipherData ,
data : CipherData ,
headers : & Headers ,
headers : & Headers ,
shared_to_collection : bool ,
shared_to_collection : bool ,
conn : & mut DbConn ,
conn : & mut DbConn ,
ip : & ClientIp ,
nt : & Notify < ' _ > ,
nt : & Notify < ' _ > ,
ut : UpdateType ,
ut : UpdateType ,
) -> EmptyResult {
) -> EmptyResult {
@ -517,7 +506,7 @@ pub async fn update_cipher_from_data(
String ::from ( org_uuid ) ,
String ::from ( org_uuid ) ,
headers . user . uuid . clone ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
conn ,
conn ,
)
)
. await ;
. await ;
@ -551,7 +540,6 @@ async fn post_ciphers_import(
data : JsonUpcase < ImportData > ,
data : JsonUpcase < ImportData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
enforce_personal_ownership_policy ( None , & headers , & mut conn ) . await ? ;
enforce_personal_ownership_policy ( None , & headers , & mut conn ) . await ? ;
@ -586,8 +574,7 @@ async fn post_ciphers_import(
cipher_data . FolderId = folder_uuid ;
cipher_data . FolderId = folder_uuid ;
let mut cipher = Cipher ::new ( cipher_data . Type , cipher_data . Name . clone ( ) ) ;
let mut cipher = Cipher ::new ( cipher_data . Type , cipher_data . Name . clone ( ) ) ;
update_cipher_from_data ( & mut cipher , cipher_data , & headers , false , & mut conn , & ip , & nt , UpdateType ::None )
update_cipher_from_data ( & mut cipher , cipher_data , & headers , false , & mut conn , & nt , UpdateType ::None ) . await ? ;
. await ? ;
}
}
let mut user = headers . user ;
let mut user = headers . user ;
@ -603,10 +590,9 @@ async fn put_cipher_admin(
data : JsonUpcase < CipherData > ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
put_cipher ( uuid , data , headers , conn , ip, nt) . await
put_cipher ( uuid , data , headers , conn , nt) . await
}
}
#[ post( " /ciphers/<uuid>/admin " , data = " <data> " ) ]
#[ post( " /ciphers/<uuid>/admin " , data = " <data> " ) ]
@ -615,10 +601,9 @@ async fn post_cipher_admin(
data : JsonUpcase < CipherData > ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
post_cipher ( uuid , data , headers , conn , ip, nt) . await
post_cipher ( uuid , data , headers , conn , nt) . await
}
}
#[ post( " /ciphers/<uuid> " , data = " <data> " ) ]
#[ post( " /ciphers/<uuid> " , data = " <data> " ) ]
@ -627,10 +612,9 @@ async fn post_cipher(
data : JsonUpcase < CipherData > ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
put_cipher ( uuid , data , headers , conn , ip, nt) . await
put_cipher ( uuid , data , headers , conn , nt) . await
}
}
#[ put( " /ciphers/<uuid> " , data = " <data> " ) ]
#[ put( " /ciphers/<uuid> " , data = " <data> " ) ]
@ -639,7 +623,6 @@ async fn put_cipher(
data : JsonUpcase < CipherData > ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let data : CipherData = data . into_inner ( ) . data ;
let data : CipherData = data . into_inner ( ) . data ;
@ -658,8 +641,7 @@ async fn put_cipher(
err ! ( "Cipher is not write accessible" )
err ! ( "Cipher is not write accessible" )
}
}
update_cipher_from_data ( & mut cipher , data , & headers , false , & mut conn , & ip , & nt , UpdateType ::SyncCipherUpdate )
update_cipher_from_data ( & mut cipher , data , & headers , false , & mut conn , & nt , UpdateType ::SyncCipherUpdate ) . await ? ;
. await ? ;
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
}
}
@ -720,9 +702,8 @@ async fn put_collections_update(
data : JsonUpcase < CollectionsAdminData > ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
) -> EmptyResult {
) -> EmptyResult {
post_collections_admin ( uuid , data , headers , conn , ip ). await
post_collections_admin ( uuid , data , headers , conn ). await
}
}
#[ post( " /ciphers/<uuid>/collections " , data = " <data> " ) ]
#[ post( " /ciphers/<uuid>/collections " , data = " <data> " ) ]
@ -731,9 +712,8 @@ async fn post_collections_update(
data : JsonUpcase < CollectionsAdminData > ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
) -> EmptyResult {
) -> EmptyResult {
post_collections_admin ( uuid , data , headers , conn , ip ). await
post_collections_admin ( uuid , data , headers , conn ). await
}
}
#[ put( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
#[ put( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
@ -742,9 +722,8 @@ async fn put_collections_admin(
data : JsonUpcase < CollectionsAdminData > ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
) -> EmptyResult {
) -> EmptyResult {
post_collections_admin ( uuid , data , headers , conn , ip ). await
post_collections_admin ( uuid , data , headers , conn ). await
}
}
#[ post( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
#[ post( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
@ -753,7 +732,6 @@ async fn post_collections_admin(
data : JsonUpcase < CollectionsAdminData > ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
) -> EmptyResult {
) -> EmptyResult {
let data : CollectionsAdminData = data . into_inner ( ) . data ;
let data : CollectionsAdminData = data . into_inner ( ) . data ;
@ -795,7 +773,7 @@ async fn post_collections_admin(
cipher . organization_uuid . unwrap ( ) ,
cipher . organization_uuid . unwrap ( ) ,
headers . user . uuid . clone ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
& mut conn ,
& mut conn ,
)
)
. await ;
. await ;
@ -816,12 +794,11 @@ async fn post_cipher_share(
data : JsonUpcase < ShareCipherData > ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let data : ShareCipherData = data . into_inner ( ) . data ;
let data : ShareCipherData = data . into_inner ( ) . data ;
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & ip, & nt) . await
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & nt) . await
}
}
#[ put( " /ciphers/<uuid>/share " , data = " <data> " ) ]
#[ put( " /ciphers/<uuid>/share " , data = " <data> " ) ]
@ -830,12 +807,11 @@ async fn put_cipher_share(
data : JsonUpcase < ShareCipherData > ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let data : ShareCipherData = data . into_inner ( ) . data ;
let data : ShareCipherData = data . into_inner ( ) . data ;
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & ip, & nt) . await
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & nt) . await
}
}
#[ derive(Deserialize) ]
#[ derive(Deserialize) ]
@ -850,7 +826,6 @@ async fn put_cipher_share_selected(
data : JsonUpcase < ShareSelectedCipherData > ,
data : JsonUpcase < ShareSelectedCipherData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let mut data : ShareSelectedCipherData = data . into_inner ( ) . data ;
let mut data : ShareSelectedCipherData = data . into_inner ( ) . data ;
@ -878,7 +853,7 @@ async fn put_cipher_share_selected(
} ;
} ;
match shared_cipher_data . Cipher . Id . take ( ) {
match shared_cipher_data . Cipher . Id . take ( ) {
Some ( id ) = > share_cipher_by_uuid ( & id , shared_cipher_data , & headers , & mut conn , & ip, & nt) . await ? ,
Some ( id ) = > share_cipher_by_uuid ( & id , shared_cipher_data , & headers , & mut conn , & nt) . await ? ,
None = > err ! ( "Request missing ids field" ) ,
None = > err ! ( "Request missing ids field" ) ,
} ;
} ;
}
}
@ -891,7 +866,6 @@ async fn share_cipher_by_uuid(
data : ShareCipherData ,
data : ShareCipherData ,
headers : & Headers ,
headers : & Headers ,
conn : & mut DbConn ,
conn : & mut DbConn ,
ip : & ClientIp ,
nt : & Notify < ' _ > ,
nt : & Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
@ -930,7 +904,7 @@ async fn share_cipher_by_uuid(
UpdateType ::SyncCipherCreate
UpdateType ::SyncCipherCreate
} ;
} ;
update_cipher_from_data ( & mut cipher , data . Cipher , headers , shared_to_collection , conn , ip, nt, ut ) . await ? ;
update_cipher_from_data ( & mut cipher , data . Cipher , headers , shared_to_collection , conn , nt, ut ) . await ? ;
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , conn ) . await ) )
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , conn ) . await ) )
}
}
@ -1025,7 +999,6 @@ async fn save_attachment(
data : Form < UploadData < ' _ > > ,
data : Form < UploadData < ' _ > > ,
headers : & Headers ,
headers : & Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> Result < ( Cipher , DbConn ) , crate ::error ::Error > {
) -> Result < ( Cipher , DbConn ) , crate ::error ::Error > {
let cipher = match Cipher ::find_by_uuid ( & cipher_uuid , & mut conn ) . await {
let cipher = match Cipher ::find_by_uuid ( & cipher_uuid , & mut conn ) . await {
@ -1144,7 +1117,7 @@ async fn save_attachment(
String ::from ( org_uuid ) ,
String ::from ( org_uuid ) ,
headers . user . uuid . clone ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
& mut conn ,
& mut conn ,
)
)
. await ;
. await ;
@ -1164,7 +1137,6 @@ async fn post_attachment_v2_data(
data : Form < UploadData < ' _ > > ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let attachment = match Attachment ::find_by_id ( & attachment_id , & mut conn ) . await {
let attachment = match Attachment ::find_by_id ( & attachment_id , & mut conn ) . await {
@ -1173,7 +1145,7 @@ async fn post_attachment_v2_data(
None = > err ! ( "Attachment doesn't exist" ) ,
None = > err ! ( "Attachment doesn't exist" ) ,
} ;
} ;
save_attachment ( attachment , uuid , data , & headers , conn , ip, nt) . await ? ;
save_attachment ( attachment , uuid , data , & headers , conn , nt) . await ? ;
Ok ( ( ) )
Ok ( ( ) )
}
}
@ -1185,14 +1157,13 @@ async fn post_attachment(
data : Form < UploadData < ' _ > > ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
// Setting this as None signifies to save_attachment() that it should create
// Setting this as None signifies to save_attachment() that it should create
// the attachment database record as well as saving the data to disk.
// the attachment database record as well as saving the data to disk.
let attachment = None ;
let attachment = None ;
let ( cipher , mut conn ) = save_attachment ( attachment , uuid , data , & headers , conn , ip, nt) . await ? ;
let ( cipher , mut conn ) = save_attachment ( attachment , uuid , data , & headers , conn , nt) . await ? ;
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
Ok ( Json ( cipher . to_json ( & headers . host , & headers . user . uuid , None , CipherSyncType ::User , & mut conn ) . await ) )
}
}
@ -1203,10 +1174,9 @@ async fn post_attachment_admin(
data : Form < UploadData < ' _ > > ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
post_attachment ( uuid , data , headers , conn , ip, nt) . await
post_attachment ( uuid , data , headers , conn , nt) . await
}
}
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/share " , format = " multipart/form-data " , data = " <data> " ) ]
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/share " , format = " multipart/form-data " , data = " <data> " ) ]
@ -1216,11 +1186,10 @@ async fn post_attachment_share(
data : Form < UploadData < ' _ > > ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & ip, & nt) . await ? ;
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt) . await ? ;
post_attachment ( uuid , data , headers , conn , ip, nt) . await
post_attachment ( uuid , data , headers , conn , nt) . await
}
}
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete-admin " ) ]
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete-admin " ) ]
@ -1229,10 +1198,9 @@ async fn delete_attachment_post_admin(
attachment_id : String ,
attachment_id : String ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
delete_attachment ( uuid , attachment_id , headers , conn , ip, nt) . await
delete_attachment ( uuid , attachment_id , headers , conn , nt) . await
}
}
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete " ) ]
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete " ) ]
@ -1241,10 +1209,9 @@ async fn delete_attachment_post(
attachment_id : String ,
attachment_id : String ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
delete_attachment ( uuid , attachment_id , headers , conn , ip, nt) . await
delete_attachment ( uuid , attachment_id , headers , conn , nt) . await
}
}
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id> " ) ]
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id> " ) ]
@ -1253,10 +1220,9 @@ async fn delete_attachment(
attachment_id : String ,
attachment_id : String ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & ip, & nt) . await
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt) . await
}
}
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id>/admin " ) ]
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id>/admin " ) ]
@ -1265,70 +1231,44 @@ async fn delete_attachment_admin(
attachment_id : String ,
attachment_id : String ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & ip, & nt) . await
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt) . await
}
}
#[ post( " /ciphers/<uuid>/delete " ) ]
#[ post( " /ciphers/<uuid>/delete " ) ]
async fn delete_cipher_post (
async fn delete_cipher_post ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
uuid : String ,
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
headers : Headers ,
// permanent delete
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & ip , & nt ) . await // permanent delete
}
}
#[ post( " /ciphers/<uuid>/delete-admin " ) ]
#[ post( " /ciphers/<uuid>/delete-admin " ) ]
async fn delete_cipher_post_admin (
async fn delete_cipher_post_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
uuid : String ,
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
headers : Headers ,
// permanent delete
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & ip , & nt ) . await // permanent delete
}
}
#[ put( " /ciphers/<uuid>/delete " ) ]
#[ put( " /ciphers/<uuid>/delete " ) ]
async fn delete_cipher_put (
async fn delete_cipher_put ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
uuid : String ,
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & nt ) . await
headers : Headers ,
// soft delete
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & ip , & nt ) . await // soft delete
}
}
#[ put( " /ciphers/<uuid>/delete-admin " ) ]
#[ put( " /ciphers/<uuid>/delete-admin " ) ]
async fn delete_cipher_put_admin (
async fn delete_cipher_put_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
uuid : String ,
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & nt ) . await
headers : Headers ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & ip , & nt ) . await
}
}
#[ delete( " /ciphers/<uuid> " ) ]
#[ delete( " /ciphers/<uuid> " ) ]
async fn delete_cipher ( uuid : String , headers : Headers , mut conn : DbConn , ip : ClientIp , nt : Notify < ' _ > ) -> EmptyResult {
async fn delete_cipher ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & ip , & nt ) . await // permanent delete
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
// permanent delete
}
}
#[ delete( " /ciphers/<uuid>/admin " ) ]
#[ delete( " /ciphers/<uuid>/admin " ) ]
async fn delete_cipher_admin (
async fn delete_cipher_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
uuid : String ,
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
headers : Headers ,
// permanent delete
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & ip , & nt ) . await // permanent delete
}
}
#[ delete( " /ciphers " , data = " <data> " ) ]
#[ delete( " /ciphers " , data = " <data> " ) ]
@ -1336,10 +1276,9 @@ async fn delete_cipher_selected(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , false , ip, nt) . await // permanent delete
_delete_multiple_ciphers ( data , headers , conn , false , nt) . await // permanent delete
}
}
#[ post( " /ciphers/delete " , data = " <data> " ) ]
#[ post( " /ciphers/delete " , data = " <data> " ) ]
@ -1347,10 +1286,9 @@ async fn delete_cipher_selected_post(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , false , ip, nt) . await // permanent delete
_delete_multiple_ciphers ( data , headers , conn , false , nt) . await // permanent delete
}
}
#[ put( " /ciphers/delete " , data = " <data> " ) ]
#[ put( " /ciphers/delete " , data = " <data> " ) ]
@ -1358,10 +1296,9 @@ async fn delete_cipher_selected_put(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , true , ip, nt) . await // soft delete
_delete_multiple_ciphers ( data , headers , conn , true , nt) . await // soft delete
}
}
#[ delete( " /ciphers/admin " , data = " <data> " ) ]
#[ delete( " /ciphers/admin " , data = " <data> " ) ]
@ -1369,10 +1306,9 @@ async fn delete_cipher_selected_admin(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , false , ip, nt) . await // permanent delete
_delete_multiple_ciphers ( data , headers , conn , false , nt) . await // permanent delete
}
}
#[ post( " /ciphers/delete-admin " , data = " <data> " ) ]
#[ post( " /ciphers/delete-admin " , data = " <data> " ) ]
@ -1380,10 +1316,9 @@ async fn delete_cipher_selected_post_admin(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , false , ip, nt) . await // permanent delete
_delete_multiple_ciphers ( data , headers , conn , false , nt) . await // permanent delete
}
}
#[ put( " /ciphers/delete-admin " , data = " <data> " ) ]
#[ put( " /ciphers/delete-admin " , data = " <data> " ) ]
@ -1391,32 +1326,19 @@ async fn delete_cipher_selected_put_admin(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
conn : DbConn ,
conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
_delete_multiple_ciphers ( data , headers , conn , true , ip, nt) . await // soft delete
_delete_multiple_ciphers ( data , headers , conn , true , nt) . await // soft delete
}
}
#[ put( " /ciphers/<uuid>/restore " ) ]
#[ put( " /ciphers/<uuid>/restore " ) ]
async fn restore_cipher_put (
async fn restore_cipher_put ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
uuid : String ,
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & nt ) . await
headers : Headers ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> JsonResult {
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & ip , & nt ) . await
}
}
#[ put( " /ciphers/<uuid>/restore-admin " ) ]
#[ put( " /ciphers/<uuid>/restore-admin " ) ]
async fn restore_cipher_put_admin (
async fn restore_cipher_put_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
uuid : String ,
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & nt ) . await
headers : Headers ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
) -> JsonResult {
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & ip , & nt ) . await
}
}
#[ put( " /ciphers/restore " , data = " <data> " ) ]
#[ put( " /ciphers/restore " , data = " <data> " ) ]
@ -1424,10 +1346,9 @@ async fn restore_cipher_selected(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
_restore_multiple_ciphers ( data , & headers , & mut conn , ip , & nt ) . await
_restore_multiple_ciphers ( data , & headers , & mut conn , & nt ) . await
}
}
#[ derive(Deserialize) ]
#[ derive(Deserialize) ]
@ -1499,7 +1420,6 @@ async fn delete_all(
data : JsonUpcase < PasswordData > ,
data : JsonUpcase < PasswordData > ,
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let data : PasswordData = data . into_inner ( ) . data ;
let data : PasswordData = data . into_inner ( ) . data ;
@ -1527,7 +1447,7 @@ async fn delete_all(
org_data . org_id . clone ( ) ,
org_data . org_id . clone ( ) ,
user . uuid ,
user . uuid ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
& mut conn ,
& mut conn ,
)
)
. await ;
. await ;
@ -1563,7 +1483,6 @@ async fn _delete_cipher_by_uuid(
headers : & Headers ,
headers : & Headers ,
conn : & mut DbConn ,
conn : & mut DbConn ,
soft_delete : bool ,
soft_delete : bool ,
ip : & ClientIp ,
nt : & Notify < ' _ > ,
nt : & Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
@ -1602,7 +1521,15 @@ async fn _delete_cipher_by_uuid(
false = > EventType ::CipherDeleted as i32 ,
false = > EventType ::CipherDeleted as i32 ,
} ;
} ;
log_event ( event_type , & cipher . uuid , org_uuid , headers . user . uuid . clone ( ) , headers . device . atype , & ip . ip , conn )
log_event (
event_type ,
& cipher . uuid ,
org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
conn ,
)
. await ;
. await ;
}
}
@ -1614,7 +1541,6 @@ async fn _delete_multiple_ciphers(
headers : Headers ,
headers : Headers ,
mut conn : DbConn ,
mut conn : DbConn ,
soft_delete : bool ,
soft_delete : bool ,
ip : ClientIp ,
nt : Notify < ' _ > ,
nt : Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let data : Value = data . into_inner ( ) . data ;
let data : Value = data . into_inner ( ) . data ;
@ -1628,7 +1554,7 @@ async fn _delete_multiple_ciphers(
} ;
} ;
for uuid in uuids {
for uuid in uuids {
if let error @ Err ( _ ) = _delete_cipher_by_uuid ( uuid , & headers , & mut conn , soft_delete , & ip, & nt) . await {
if let error @ Err ( _ ) = _delete_cipher_by_uuid ( uuid , & headers , & mut conn , soft_delete , & nt) . await {
return error ;
return error ;
} ;
} ;
}
}
@ -1636,13 +1562,7 @@ async fn _delete_multiple_ciphers(
Ok ( ( ) )
Ok ( ( ) )
}
}
async fn _restore_cipher_by_uuid (
async fn _restore_cipher_by_uuid ( uuid : & str , headers : & Headers , conn : & mut DbConn , nt : & Notify < ' _ > ) -> JsonResult {
uuid : & str ,
headers : & Headers ,
conn : & mut DbConn ,
ip : & ClientIp ,
nt : & Notify < ' _ > ,
) -> JsonResult {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
let mut cipher = match Cipher ::find_by_uuid ( uuid , conn ) . await {
Some ( cipher ) = > cipher ,
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
None = > err ! ( "Cipher doesn't exist" ) ,
@ -1669,7 +1589,7 @@ async fn _restore_cipher_by_uuid(
String ::from ( org_uuid ) ,
String ::from ( org_uuid ) ,
headers . user . uuid . clone ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
conn ,
conn ,
)
)
. await ;
. await ;
@ -1682,7 +1602,6 @@ async fn _restore_multiple_ciphers(
data : JsonUpcase < Value > ,
data : JsonUpcase < Value > ,
headers : & Headers ,
headers : & Headers ,
conn : & mut DbConn ,
conn : & mut DbConn ,
ip : ClientIp ,
nt : & Notify < ' _ > ,
nt : & Notify < ' _ > ,
) -> JsonResult {
) -> JsonResult {
let data : Value = data . into_inner ( ) . data ;
let data : Value = data . into_inner ( ) . data ;
@ -1697,7 +1616,7 @@ async fn _restore_multiple_ciphers(
let mut ciphers : Vec < Value > = Vec ::new ( ) ;
let mut ciphers : Vec < Value > = Vec ::new ( ) ;
for uuid in uuids {
for uuid in uuids {
match _restore_cipher_by_uuid ( uuid , headers , conn , & ip , nt ) . await {
match _restore_cipher_by_uuid ( uuid , headers , conn , nt ) . await {
Ok ( json ) = > ciphers . push ( json . into_inner ( ) ) ,
Ok ( json ) = > ciphers . push ( json . into_inner ( ) ) ,
err = > return err ,
err = > return err ,
}
}
@ -1715,7 +1634,6 @@ async fn _delete_cipher_attachment_by_id(
attachment_id : & str ,
attachment_id : & str ,
headers : & Headers ,
headers : & Headers ,
conn : & mut DbConn ,
conn : & mut DbConn ,
ip : & ClientIp ,
nt : & Notify < ' _ > ,
nt : & Notify < ' _ > ,
) -> EmptyResult {
) -> EmptyResult {
let attachment = match Attachment ::find_by_id ( attachment_id , conn ) . await {
let attachment = match Attachment ::find_by_id ( attachment_id , conn ) . await {
@ -1752,7 +1670,7 @@ async fn _delete_cipher_attachment_by_id(
org_uuid ,
org_uuid ,
headers . user . uuid . clone ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
headers . device . atype ,
& ip. ip ,
& headers. ip. ip ,
conn ,
conn ,
)
)
. await ;
. await ;