@ -10,7 +10,10 @@ use crate::{
core ::{ log_event , two_factor , CipherSyncData , CipherSyncType } ,
EmptyResult , JsonResult , Notify , PasswordOrOtpData , UpdateType ,
} ,
auth ::{ decode_invite , AdminHeaders , ClientVersion , Headers , ManagerHeaders , ManagerHeadersLoose , OwnerHeaders } ,
auth ::{
decode_invite , AdminHeaders , ClientVersion , Headers , ManagerHeaders , ManagerHeadersLoose , OrgMemberHeaders ,
OwnerHeaders ,
} ,
db ::{ models ::* , DbConn } ,
mail ,
util ::{ convert_json_key_lcase_first , NumberOrString } ,
@ -213,6 +216,9 @@ async fn delete_organization(
headers : OwnerHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : PasswordOrOtpData = data . into_inner ( ) ;
data . validate ( & headers . user , true , & mut conn ) . await ? ;
@ -261,7 +267,10 @@ async fn leave_organization(org_id: OrganizationId, headers: Headers, mut conn:
}
#[ get( " /organizations/<org_id> " ) ]
async fn get_organization ( org_id : OrganizationId , _headers : OwnerHeaders , mut conn : DbConn ) -> JsonResult {
async fn get_organization ( org_id : OrganizationId , headers : OwnerHeaders , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
match Organization ::find_by_uuid ( & org_id , & mut conn ) . await {
Some ( organization ) = > Ok ( Json ( organization . to_json ( ) ) ) ,
None = > err ! ( "Can't find organization details" ) ,
@ -285,14 +294,18 @@ async fn post_organization(
data : Json < OrganizationUpdateData > ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : OrganizationUpdateData = data . into_inner ( ) ;
let Some ( mut org ) = Organization ::find_by_uuid ( & org_id , & mut conn ) . await else {
err ! ( "Can't find organization details" )
err ! ( "Organization not found " )
} ;
org . name = data . name ;
org . billing_email = data . billing_email ;
org . billing_email = data . billing_email . to_lowercase ( ) ;
org . save ( & mut conn ) . await ? ;
@ -325,12 +338,15 @@ async fn get_user_collections(headers: Headers, mut conn: DbConn) -> Json<Value>
}
#[ get( " /organizations/<org_id>/collections " ) ]
async fn get_org_collections ( org_id : OrganizationId , _headers : ManagerHeadersLoose , mut conn : DbConn ) -> Json < Value > {
Json ( json ! ( {
async fn get_org_collections ( org_id : OrganizationId , headers : ManagerHeadersLoose , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
Ok ( Json ( json ! ( {
"data" : _get_org_collections ( & org_id , & mut conn ) . await ,
"object" : "list" ,
"continuationToken" : null ,
} ) )
} ) ) )
}
#[ get( " /organizations/<org_id>/collections/details " ) ]
@ -339,6 +355,9 @@ async fn get_org_collections_details(
headers : ManagerHeadersLoose ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let mut data = Vec ::new ( ) ;
let Some ( member ) = Membership ::find_by_user_and_org ( & headers . user . uuid , & org_id , & mut conn ) . await else {
@ -413,6 +432,9 @@ async fn post_organization_collections(
data : Json < NewCollectionData > ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : NewCollectionData = data . into_inner ( ) ;
let Some ( org ) = Organization ::find_by_uuid ( & org_id , & mut conn ) . await else {
@ -485,6 +507,9 @@ async fn post_organization_collection_update(
data : Json < NewCollectionData > ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : NewCollectionData = data . into_inner ( ) ;
if Organization ::find_by_uuid ( & org_id , & mut conn ) . await . is_none ( ) {
@ -545,9 +570,12 @@ async fn delete_organization_collection_member(
org_id : OrganizationId ,
col_id : CollectionId ,
member_id : MembershipId ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( collection ) = Collection ::find_by_uuid_and_org ( & col_id , & org_id , & mut conn ) . await else {
err ! ( "Collection not found" , "Collection does not exist or does not belong to this organization" )
} ;
@ -638,6 +666,9 @@ async fn bulk_delete_organization_collections(
data : Json < BulkCollectionIds > ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : BulkCollectionIds = data . into_inner ( ) ;
let collections = data . ids ;
@ -657,6 +688,9 @@ async fn get_org_collection_detail(
headers : ManagerHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
match Collection ::find_by_uuid_and_user ( & col_id , headers . user . uuid . clone ( ) , & mut conn ) . await {
None = > err ! ( "Collection not found" ) ,
Some ( collection ) = > {
@ -718,9 +752,12 @@ async fn get_org_collection_detail(
async fn get_collection_users (
org_id : OrganizationId ,
col_id : CollectionId ,
_ headers : ManagerHeaders ,
headers : ManagerHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
// Get org and collection, check that collection is from org
let Some ( collection ) = Collection ::find_by_uuid_and_org ( & col_id , & org_id , & mut conn ) . await else {
err ! ( "Collection not found in Organization" )
@ -744,9 +781,12 @@ async fn put_collection_users(
org_id : OrganizationId ,
col_id : CollectionId ,
data : Json < Vec < MembershipData > > ,
_ headers : ManagerHeaders ,
headers : ManagerHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
// Get org and collection, check that collection is from org
if Collection ::find_by_uuid_and_org ( & col_id , & org_id , & mut conn ) . await . is_none ( ) {
err ! ( "Collection not found in Organization" )
@ -778,10 +818,9 @@ struct OrgIdData {
}
#[ get( " /ciphers/organization-details?<data..> " ) ]
async fn get_org_details ( data : OrgIdData , headers : Headers , mut conn : DbConn ) -> JsonResult {
if Membership ::find_confirmed_by_user_and_org ( & headers . user . uuid , & data . organization_id , & mut conn ) . await . is_none ( )
{
err_code ! ( "Resource not found." , rocket ::http ::Status ::NotFound . code ) ;
async fn get_org_details ( data : OrgIdData , headers : OrgMemberHeaders , mut conn : DbConn ) -> JsonResult {
if data . organization_id ! = headers . org_id {
err_code ! ( "Resource not found." , "Organization id's do not match" , rocket ::http ::Status ::NotFound . code ) ;
}
Ok ( Json ( json ! ( {
@ -814,9 +853,12 @@ struct GetOrgUserData {
async fn get_members (
data : GetOrgUserData ,
org_id : OrganizationId ,
_ headers : ManagerHeadersLoose ,
headers : ManagerHeadersLoose ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let mut users_json = Vec ::new ( ) ;
for u in Membership ::find_by_org ( & org_id , & mut conn ) . await {
users_json . push (
@ -829,20 +871,23 @@ async fn get_members(
) ;
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : users_json ,
"object" : "list" ,
"continuationToken" : null ,
} ) )
} ) ) )
}
#[ post( " /organizations/<org_id>/keys " , data = " <data> " ) ]
async fn post_org_keys (
org_id : OrganizationId ,
data : Json < OrgKeyData > ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : OrgKeyData = data . into_inner ( ) ;
let mut org = match Organization ::find_by_uuid ( & org_id , & mut conn ) . await {
@ -905,6 +950,9 @@ async fn send_invite(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let mut data : InviteData = data . into_inner ( ) ;
// HACK: We need the raw user-type to be sure custom role is selected to determine the access_all permission
@ -1045,7 +1093,10 @@ async fn bulk_reinvite_members(
data : Json < BulkMembershipIds > ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : BulkMembershipIds = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -1064,11 +1115,11 @@ async fn bulk_reinvite_members(
) )
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
#[ post( " /organizations/<org_id>/users/<member_id>/reinvite " ) ]
@ -1237,7 +1288,10 @@ async fn bulk_confirm_invite(
headers : AdminHeaders ,
mut conn : DbConn ,
nt : Notify < '_ > ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -1263,11 +1317,11 @@ async fn bulk_confirm_invite(
None = > error ! ( "No keys to confirm" ) ,
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
#[ post( " /organizations/<org_id>/users/<member_id>/confirm " , data = " <data> " ) ]
@ -1364,19 +1418,22 @@ async fn _confirm_invite(
#[ get( " /organizations/<org_id>/users/mini-details " , rank = 1) ]
async fn get_org_user_mini_details (
org_id : OrganizationId ,
_ headers : ManagerHeadersLoose ,
headers : ManagerHeadersLoose ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let mut members_json = Vec ::new ( ) ;
for m in Membership ::find_by_org ( & org_id , & mut conn ) . await {
members_json . push ( m . to_json_mini_details ( & mut conn ) . await ) ;
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : members_json ,
"object" : "list" ,
"continuationToken" : null ,
} ) )
} ) ) )
}
#[ get( " /organizations/<org_id>/users/<member_id>?<data..> " , rank = 2) ]
@ -1384,9 +1441,12 @@ async fn get_user(
org_id : OrganizationId ,
member_id : MembershipId ,
data : GetOrgUserData ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( user ) = Membership ::find_by_uuid_and_org ( & member_id , & org_id , & mut conn ) . await else {
err ! ( "The specified user isn't a member of the organization" )
} ;
@ -1430,6 +1490,9 @@ async fn edit_member(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let mut data : EditUserData = data . into_inner ( ) ;
// HACK: We need the raw user-type to be sure custom role is selected to determine the access_all permission
@ -1551,7 +1614,10 @@ async fn bulk_delete_member(
headers : AdminHeaders ,
mut conn : DbConn ,
nt : Notify < '_ > ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : BulkMembershipIds = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -1570,11 +1636,11 @@ async fn bulk_delete_member(
) )
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
#[ delete( " /organizations/<org_id>/users/<member_id> " ) ]
@ -1644,9 +1710,12 @@ async fn _delete_member(
async fn bulk_public_keys (
org_id : OrganizationId ,
data : Json < BulkMembershipIds > ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : BulkMembershipIds = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -1670,11 +1739,11 @@ async fn bulk_public_keys(
}
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
use super ::ciphers ::update_cipher_from_data ;
@ -1819,15 +1888,18 @@ async fn post_bulk_collections(data: Json<BulkCollectionsData>, headers: Headers
}
#[ get( " /organizations/<org_id>/policies " ) ]
async fn list_policies ( org_id : OrganizationId , _headers : AdminHeaders , mut conn : DbConn ) -> Json < Value > {
async fn list_policies ( org_id : OrganizationId , headers : AdminHeaders , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let policies = OrgPolicy ::find_by_org ( & org_id , & mut conn ) . await ;
let policies_json : Vec < Value > = policies . iter ( ) . map ( OrgPolicy ::to_json ) . collect ( ) ;
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : policies_json ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
#[ get( " /organizations/<org_id>/policies/token?<token> " ) ]
@ -1855,7 +1927,10 @@ async fn list_policies_token(org_id: OrganizationId, token: &str, mut conn: DbCo
}
#[ get( " /organizations/<org_id>/policies/<pol_type> " ) ]
async fn get_policy ( org_id : OrganizationId , pol_type : i32 , _headers : AdminHeaders , mut conn : DbConn ) -> JsonResult {
async fn get_policy ( org_id : OrganizationId , pol_type : i32 , headers : AdminHeaders , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( pol_type_enum ) = OrgPolicyType ::from_i32 ( pol_type ) else {
err ! ( "Invalid or unsupported policy type" )
} ;
@ -1884,6 +1959,9 @@ async fn put_policy(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data : PolicyData = data . into_inner ( ) ;
let Some ( pol_type_enum ) = OrgPolicyType ::from_i32 ( pol_type ) else {
@ -2217,7 +2295,7 @@ async fn bulk_deactivate_members(
data : Json < BulkRevokeMembershipIds > ,
headers : AdminHeaders ,
conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
bulk_revoke_members ( org_id , data , headers , conn ) . await
}
@ -2237,7 +2315,10 @@ async fn bulk_revoke_members(
data : Json < BulkRevokeMembershipIds > ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -2261,11 +2342,11 @@ async fn bulk_revoke_members(
None = > error ! ( "No users to revoke" ) ,
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
async fn _revoke_member (
@ -2326,7 +2407,7 @@ async fn bulk_activate_members(
data : Json < BulkMembershipIds > ,
headers : AdminHeaders ,
conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
bulk_restore_members ( org_id , data , headers , conn ) . await
}
@ -2346,7 +2427,10 @@ async fn bulk_restore_members(
data : Json < BulkMembershipIds > ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let data = data . into_inner ( ) ;
let mut bulk_response = Vec ::new ( ) ;
@ -2365,11 +2449,11 @@ async fn bulk_restore_members(
) ) ;
}
Json ( json ! ( {
Ok ( Json ( json ! ( {
"data" : bulk_response ,
"object" : "list" ,
"continuationToken" : null
} ) )
} ) ) )
}
async fn _restore_member (
@ -2426,7 +2510,10 @@ async fn _restore_member(
}
#[ get( " /organizations/<org_id>/groups " ) ]
async fn get_groups ( org_id : OrganizationId , _headers : ManagerHeadersLoose , mut conn : DbConn ) -> JsonResult {
async fn get_groups ( org_id : OrganizationId , headers : ManagerHeadersLoose , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . membership . org_uuid {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let groups : Vec < Value > = if CONFIG . org_groups_enabled ( ) {
// Group::find_by_organization(&org_id, &mut conn).await.iter().map(Group::to_json).collect::<Value>()
let groups = Group ::find_by_organization ( & org_id , & mut conn ) . await ;
@ -2614,9 +2701,12 @@ async fn add_update_group(
async fn get_group_details (
org_id : OrganizationId ,
group_id : GroupId ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2696,7 +2786,10 @@ async fn bulk_delete_groups(
}
#[ get( " /organizations/<org_id>/groups/<group_id> " , rank = 2) ]
async fn get_group ( org_id : OrganizationId , group_id : GroupId , _headers : AdminHeaders , mut conn : DbConn ) -> JsonResult {
async fn get_group ( org_id : OrganizationId , group_id : GroupId , headers : AdminHeaders , mut conn : DbConn ) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2712,9 +2805,12 @@ async fn get_group(org_id: OrganizationId, group_id: GroupId, _headers: AdminHea
async fn get_group_members (
org_id : OrganizationId ,
group_id : GroupId ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2774,9 +2870,12 @@ async fn put_group_members(
async fn get_user_groups (
org_id : OrganizationId ,
member_id : MembershipId ,
_ headers : AdminHeaders ,
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2816,6 +2915,9 @@ async fn put_user_groups(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2865,6 +2967,9 @@ async fn delete_group_member(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
if ! CONFIG . org_groups_enabled ( ) {
err ! ( "Group support is disabled" ) ;
}
@ -2910,7 +3015,14 @@ struct OrganizationUserResetPasswordRequest {
// But the clients do not seem to use this at all
// Just add it here in case they will
#[ get( " /organizations/<org_id>/public-key " ) ]
async fn get_organization_public_key ( org_id : OrganizationId , _headers : Headers , mut conn : DbConn ) -> JsonResult {
async fn get_organization_public_key (
org_id : OrganizationId ,
headers : OrgMemberHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( org ) = Organization ::find_by_uuid ( & org_id , & mut conn ) . await else {
err ! ( "Organization not found" )
} ;
@ -2924,7 +3036,7 @@ async fn get_organization_public_key(org_id: OrganizationId, _headers: Headers,
// Obsolete - Renamed to public-key (2023.8), left for backwards compatibility with older clients
// https://github.com/bitwarden/server/blob/25dc0c9178e3e3584074bbef0d4be827b7c89415/src/Api/AdminConsole/Controllers/OrganizationsController.cs#L463-L468
#[ get( " /organizations/<org_id>/keys " ) ]
async fn get_organization_keys ( org_id : OrganizationId , headers : Headers , conn : DbConn ) -> JsonResult {
async fn get_organization_keys ( org_id : OrganizationId , headers : OrgMember Headers, conn : DbConn ) -> JsonResult {
get_organization_public_key ( org_id , headers , conn ) . await
}
@ -2937,6 +3049,9 @@ async fn put_reset_password(
mut conn : DbConn ,
nt : Notify < '_ > ,
) -> EmptyResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( org ) = Organization ::find_by_uuid ( & org_id , & mut conn ) . await else {
err ! ( "Required organization not found" )
} ;
@ -2993,6 +3108,9 @@ async fn get_reset_password_details(
headers : AdminHeaders ,
mut conn : DbConn ,
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
let Some ( org ) = Organization ::find_by_uuid ( & org_id , & mut conn ) . await else {
err ! ( "Required organization not found" )
} ;
@ -3114,7 +3232,10 @@ async fn get_org_export(
headers : AdminHeaders ,
client_version : Option < ClientVersion > ,
mut conn : DbConn ,
) -> Json < Value > {
) -> JsonResult {
if org_id ! = headers . org_id {
err ! ( "Organization not found" , "Organization id's do not match" ) ;
}
// Since version v2023.1.0 the format of the export is different.
// Also, this endpoint was created since v2022.9.0.
// Therefore, we will check for any version smaller then v2023.1.0 and return a different response.
@ -3130,7 +3251,7 @@ async fn get_org_export(
// Also both main keys here need to be lowercase, else the export will fail.
if use_list_response_model {
// Backwards compatible pre v2023.1.0 response
Json ( json ! ( {
Ok ( Json ( json ! ( {
"collections" : {
"data" : convert_json_key_lcase_first ( _get_org_collections ( & org_id , & mut conn ) . await ) ,
"object" : "list" ,
@ -3141,13 +3262,13 @@ async fn get_org_export(
"object" : "list" ,
"continuationToken" : null ,
}
} ) )
} ) ) )
} else {
// v2023.1.0 and newer response
Json ( json ! ( {
Ok ( Json ( json ! ( {
"collections" : convert_json_key_lcase_first ( _get_org_collections ( & org_id , & mut conn ) . await ) ,
"ciphers" : convert_json_key_lcase_first ( _get_org_details ( & org_id , & headers . host , & headers . user . uuid , & mut conn ) . await ) ,
} ) )
} ) ) )
}
}