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