@ -172,8 +172,8 @@ async fn get_ciphers(headers: Headers, mut conn: DbConn) -> Json<Value> {
}
#[ get( " /ciphers/<uuid> " ) ]
async fn get_cipher ( uuid : String , headers : Headers , mut conn : DbConn ) -> JsonResult {
let cipher = match Cipher ::find_by_uuid ( & uuid , & mut conn ) . await {
async fn get_cipher ( uuid : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
let cipher = match Cipher ::find_by_uuid ( uuid , & mut conn ) . await {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -186,13 +186,13 @@ async fn get_cipher(uuid: String, headers: Headers, mut conn: DbConn) -> JsonRes
}
#[ get( " /ciphers/<uuid>/admin " ) ]
async fn get_cipher_admin ( uuid : String , headers : Headers , conn : DbConn ) -> JsonResult {
async fn get_cipher_admin ( uuid : & str , headers : Headers , conn : DbConn ) -> JsonResult {
// TODO: Implement this correctly
get_cipher ( uuid , headers , conn ) . await
}
#[ get( " /ciphers/<uuid>/details " ) ]
async fn get_cipher_details ( uuid : String , headers : Headers , conn : DbConn ) -> JsonResult {
async fn get_cipher_details ( uuid : & str , headers : Headers , conn : DbConn ) -> JsonResult {
get_cipher ( uuid , headers , conn ) . await
}
@ -503,7 +503,7 @@ pub async fn update_cipher_from_data(
log_event (
event_type as i32 ,
& cipher . uuid ,
String ::from ( org_uuid ) ,
org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
@ -586,7 +586,7 @@ async fn post_ciphers_import(
/// Called when an org admin modifies an existing org cipher.
#[ put( " /ciphers/<uuid>/admin " , data = " <data> " ) ]
async fn put_cipher_admin (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
conn : DbConn ,
@ -597,7 +597,7 @@ async fn put_cipher_admin(
#[ post( " /ciphers/<uuid>/admin " , data = " <data> " ) ]
async fn post_cipher_admin (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
conn : DbConn ,
@ -608,7 +608,7 @@ async fn post_cipher_admin(
#[ post( " /ciphers/<uuid> " , data = " <data> " ) ]
async fn post_cipher (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
conn : DbConn ,
@ -619,7 +619,7 @@ async fn post_cipher(
#[ put( " /ciphers/<uuid> " , data = " <data> " ) ]
async fn put_cipher (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CipherData > ,
headers : Headers ,
mut conn : DbConn ,
@ -627,7 +627,7 @@ async fn put_cipher(
) -> JsonResult {
let data : CipherData = data . into_inner ( ) . data ;
let mut cipher = match Cipher ::find_by_uuid ( & uuid , & mut conn ) . await {
let mut cipher = match Cipher ::find_by_uuid ( uuid , & mut conn ) . await {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -648,7 +648,7 @@ async fn put_cipher(
#[ post( " /ciphers/<uuid>/partial " , data = " <data> " ) ]
async fn post_cipher_partial (
uuid : String ,
uuid : & str ,
data : JsonUpcase < PartialCipherData > ,
headers : Headers ,
conn : DbConn ,
@ -659,14 +659,14 @@ async fn post_cipher_partial(
// Only update the folder and favorite for the user, since this cipher is read-only
#[ put( " /ciphers/<uuid>/partial " , data = " <data> " ) ]
async fn put_cipher_partial (
uuid : String ,
uuid : & str ,
data : JsonUpcase < PartialCipherData > ,
headers : Headers ,
mut conn : DbConn ,
) -> JsonResult {
let data : PartialCipherData = data . into_inner ( ) . data ;
let cipher = match Cipher ::find_by_uuid ( & uuid , & mut conn ) . await {
let cipher = match Cipher ::find_by_uuid ( uuid , & mut conn ) . await {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -698,7 +698,7 @@ struct CollectionsAdminData {
#[ put( " /ciphers/<uuid>/collections " , data = " <data> " ) ]
async fn put_collections_update (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
conn : DbConn ,
@ -708,7 +708,7 @@ async fn put_collections_update(
#[ post( " /ciphers/<uuid>/collections " , data = " <data> " ) ]
async fn post_collections_update (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
conn : DbConn ,
@ -718,7 +718,7 @@ async fn post_collections_update(
#[ put( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
async fn put_collections_admin (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
conn : DbConn ,
@ -728,14 +728,14 @@ async fn put_collections_admin(
#[ post( " /ciphers/<uuid>/collections-admin " , data = " <data> " ) ]
async fn post_collections_admin (
uuid : String ,
uuid : & str ,
data : JsonUpcase < CollectionsAdminData > ,
headers : Headers ,
mut conn : DbConn ,
) -> EmptyResult {
let data : CollectionsAdminData = data . into_inner ( ) . data ;
let cipher = match Cipher ::find_by_uuid ( & uuid , & mut conn ) . await {
let cipher = match Cipher ::find_by_uuid ( uuid , & mut conn ) . await {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -770,7 +770,7 @@ async fn post_collections_admin(
log_event (
EventType ::CipherUpdatedCollections as i32 ,
& cipher . uuid ,
cipher . organization_uuid . unwrap ( ) ,
& cipher . organization_uuid . unwrap ( ) ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
@ -790,7 +790,7 @@ struct ShareCipherData {
#[ post( " /ciphers/<uuid>/share " , data = " <data> " ) ]
async fn post_cipher_share (
uuid : String ,
uuid : & str ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
mut conn : DbConn ,
@ -798,12 +798,12 @@ async fn post_cipher_share(
) -> JsonResult {
let data : ShareCipherData = data . into_inner ( ) . data ;
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & nt ) . await
share_cipher_by_uuid ( uuid , data , & headers , & mut conn , & nt ) . await
}
#[ put( " /ciphers/<uuid>/share " , data = " <data> " ) ]
async fn put_cipher_share (
uuid : String ,
uuid : & str ,
data : JsonUpcase < ShareCipherData > ,
headers : Headers ,
mut conn : DbConn ,
@ -811,7 +811,7 @@ async fn put_cipher_share(
) -> JsonResult {
let data : ShareCipherData = data . into_inner ( ) . data ;
share_cipher_by_uuid ( & uuid , data , & headers , & mut conn , & nt ) . await
share_cipher_by_uuid ( uuid , data , & headers , & mut conn , & nt ) . await
}
#[ derive(Deserialize) ]
@ -916,8 +916,8 @@ async fn share_cipher_by_uuid(
/// their object storage service. For self-hosted instances, it basically just
/// redirects to the same location as before the v2 API.
#[ get( " /ciphers/<uuid>/attachment/<attachment_id> " ) ]
async fn get_attachment ( uuid : String , attachment_id : String , headers : Headers , mut conn : DbConn ) -> JsonResult {
match Attachment ::find_by_id ( & attachment_id , & mut conn ) . await {
async fn get_attachment ( uuid : & str , attachment_id : & str , headers : Headers , mut conn : DbConn ) -> JsonResult {
match Attachment ::find_by_id ( attachment_id , & mut conn ) . await {
Some ( attachment ) if uuid = = attachment . cipher_uuid = > Ok ( Json ( attachment . to_json ( & headers . host ) ) ) ,
Some ( _ ) = > err ! ( "Attachment doesn't belong to cipher" ) ,
None = > err ! ( "Attachment doesn't exist" ) ,
@ -944,12 +944,12 @@ enum FileUploadType {
/// For self-hosted instances, it's another API on the local instance.
#[ post( " /ciphers/<uuid>/attachment/v2 " , data = " <data> " ) ]
async fn post_attachment_v2 (
uuid : String ,
uuid : & str ,
data : JsonUpcase < AttachmentRequestData > ,
headers : Headers ,
mut conn : DbConn ,
) -> JsonResult {
let cipher = match Cipher ::find_by_uuid ( & uuid , & mut conn ) . await {
let cipher = match Cipher ::find_by_uuid ( uuid , & mut conn ) . await {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -995,13 +995,13 @@ struct UploadData<'f> {
/// database record, which is passed in as `attachment`.
async fn save_attachment (
mut attachment : Option < Attachment > ,
cipher_uuid : String ,
cipher_uuid : & str ,
data : Form < UploadData < ' _ > > ,
headers : & Headers ,
mut conn : DbConn ,
nt : Notify < ' _ > ,
) -> 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 {
Some ( cipher ) = > cipher ,
None = > err ! ( "Cipher doesn't exist" ) ,
} ;
@ -1058,7 +1058,7 @@ async fn save_attachment(
None = > crypto ::generate_attachment_id ( ) , // Legacy API
} ;
let folder_path = tokio ::fs ::canonicalize ( & CONFIG . attachments_folder ( ) ) . await ? . join ( & cipher_uuid ) ;
let folder_path = tokio ::fs ::canonicalize ( & CONFIG . attachments_folder ( ) ) . await ? . join ( cipher_uuid ) ;
let file_path = folder_path . join ( & file_id ) ;
tokio ::fs ::create_dir_all ( & folder_path ) . await ? ;
@ -1094,7 +1094,8 @@ async fn save_attachment(
if data . key . is_none ( ) {
err ! ( "No attachment key provided" )
}
let attachment = Attachment ::new ( file_id , cipher_uuid . clone ( ) , encrypted_filename . unwrap ( ) , size , data . key ) ;
let attachment =
Attachment ::new ( file_id , String ::from ( cipher_uuid ) , encrypted_filename . unwrap ( ) , size , data . key ) ;
attachment . save ( & mut conn ) . await . expect ( "Error saving attachment" ) ;
}
@ -1114,7 +1115,7 @@ async fn save_attachment(
log_event (
EventType ::CipherAttachmentCreated as i32 ,
& cipher . uuid ,
String ::from ( org_uuid ) ,
org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
@ -1132,14 +1133,14 @@ async fn save_attachment(
/// with this one.
#[ post( " /ciphers/<uuid>/attachment/<attachment_id> " , format = " multipart/form-data " , data = " <data> " , rank = 1) ]
async fn post_attachment_v2_data (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
mut conn : DbConn ,
nt : Notify < ' _ > ,
) -> 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 {
Some ( attachment ) if uuid = = attachment . cipher_uuid = > Some ( attachment ) ,
Some ( _ ) = > err ! ( "Attachment doesn't belong to cipher" ) ,
None = > err ! ( "Attachment doesn't exist" ) ,
@ -1153,7 +1154,7 @@ async fn post_attachment_v2_data(
/// Legacy API for creating an attachment associated with a cipher.
#[ post( " /ciphers/<uuid>/attachment " , format = " multipart/form-data " , data = " <data> " ) ]
async fn post_attachment (
uuid : String ,
uuid : & str ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
conn : DbConn ,
@ -1170,7 +1171,7 @@ async fn post_attachment(
#[ post( " /ciphers/<uuid>/attachment-admin " , format = " multipart/form-data " , data = " <data> " ) ]
async fn post_attachment_admin (
uuid : String ,
uuid : & str ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
conn : DbConn ,
@ -1181,21 +1182,21 @@ async fn post_attachment_admin(
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/share " , format = " multipart/form-data " , data = " <data> " ) ]
async fn post_attachment_share (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
data : Form < UploadData < ' _ > > ,
headers : Headers ,
mut conn : DbConn ,
nt : Notify < ' _ > ,
) -> JsonResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt ) . await ? ;
_delete_cipher_attachment_by_id ( uuid , attachment_id , & headers , & mut conn , & nt ) . await ? ;
post_attachment ( uuid , data , headers , conn , nt ) . await
}
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete-admin " ) ]
async fn delete_attachment_post_admin (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
headers : Headers ,
conn : DbConn ,
nt : Notify < ' _ > ,
@ -1205,8 +1206,8 @@ async fn delete_attachment_post_admin(
#[ post( " /ciphers/<uuid>/attachment/<attachment_id>/delete " ) ]
async fn delete_attachment_post (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
headers : Headers ,
conn : DbConn ,
nt : Notify < ' _ > ,
@ -1216,58 +1217,58 @@ async fn delete_attachment_post(
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id> " ) ]
async fn delete_attachment (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
headers : Headers ,
mut conn : DbConn ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt ) . await
_delete_cipher_attachment_by_id ( uuid , attachment_id , & headers , & mut conn , & nt ) . await
}
#[ delete( " /ciphers/<uuid>/attachment/<attachment_id>/admin " ) ]
async fn delete_attachment_admin (
uuid : String ,
attachment_id : String ,
uuid : & str ,
attachment_id : & str ,
headers : Headers ,
mut conn : DbConn ,
nt : Notify < ' _ > ,
) -> EmptyResult {
_delete_cipher_attachment_by_id ( & uuid , & attachment_id , & headers , & mut conn , & nt ) . await
_delete_cipher_attachment_by_id ( uuid , attachment_id , & headers , & mut conn , & nt ) . await
}
#[ post( " /ciphers/<uuid>/delete " ) ]
async fn delete_cipher_post ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
async fn delete_cipher_post ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , false , & nt ) . await
// permanent delete
}
#[ post( " /ciphers/<uuid>/delete-admin " ) ]
async fn delete_cipher_post_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
async fn delete_cipher_post_admin ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , false , & nt ) . await
// permanent delete
}
#[ put( " /ciphers/<uuid>/delete " ) ]
async fn delete_cipher_put ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & nt ) . await
async fn delete_cipher_put ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , true , & nt ) . await
// soft delete
}
#[ put( " /ciphers/<uuid>/delete-admin " ) ]
async fn delete_cipher_put_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , true , & nt ) . await
async fn delete_cipher_put_admin ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , true , & nt ) . await
}
#[ delete( " /ciphers/<uuid> " ) ]
async fn delete_cipher ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
async fn delete_cipher ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , false , & nt ) . await
// permanent delete
}
#[ delete( " /ciphers/<uuid>/admin " ) ]
async fn delete_cipher_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( & uuid , & headers , & mut conn , false , & nt ) . await
async fn delete_cipher_admin ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> EmptyResult {
_delete_cipher_by_uuid ( uuid , & headers , & mut conn , false , & nt ) . await
// permanent delete
}
@ -1332,13 +1333,13 @@ async fn delete_cipher_selected_put_admin(
}
#[ put( " /ciphers/<uuid>/restore " ) ]
async fn restore_cipher_put ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & nt ) . await
async fn restore_cipher_put ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
_restore_cipher_by_uuid ( uuid , & headers , & mut conn , & nt ) . await
}
#[ put( " /ciphers/<uuid>/restore-admin " ) ]
async fn restore_cipher_put_admin ( uuid : String , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
_restore_cipher_by_uuid ( & uuid , & headers , & mut conn , & nt ) . await
async fn restore_cipher_put_admin ( uuid : & str , headers : Headers , mut conn : DbConn , nt : Notify < ' _ > ) -> JsonResult {
_restore_cipher_by_uuid ( uuid , & headers , & mut conn , & nt ) . await
}
#[ put( " /ciphers/restore " , data = " <data> " ) ]
@ -1444,7 +1445,7 @@ async fn delete_all(
log_event (
EventType ::OrganizationPurgedVault as i32 ,
& org_data . org_id ,
org_data . org_id . clone ( ) ,
& org_data . org_id ,
user . uuid ,
headers . device . atype ,
& headers . ip . ip ,
@ -1524,7 +1525,7 @@ async fn _delete_cipher_by_uuid(
log_event (
event_type ,
& cipher . uuid ,
org_uuid ,
& org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
@ -1586,7 +1587,7 @@ async fn _restore_cipher_by_uuid(uuid: &str, headers: &Headers, conn: &mut DbCon
log_event (
EventType ::CipherRestored as i32 ,
& cipher . uuid . clone ( ) ,
String ::from ( org_uuid ) ,
org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,
@ -1667,7 +1668,7 @@ async fn _delete_cipher_attachment_by_id(
log_event (
EventType ::CipherAttachmentDeleted as i32 ,
& cipher . uuid ,
org_uuid ,
& org_uuid ,
headers . user . uuid . clone ( ) ,
headers . device . atype ,
& headers . ip . ip ,