| 
						
						
						
					 | 
				
				 | 
				
					@ -1,5 +1,3 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#![allow(unused_imports)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use rocket_contrib::{Json, Value}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use CONFIG; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use db::DbConn; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -140,9 +138,8 @@ fn get_user_collections(headers: Headers, conn: DbConn) -> JsonResult { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "Data": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            Collection::find_by_user_uuid(&headers.user.uuid, &conn) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .iter() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .map(|collection| { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                collection.to_json() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }).collect::<Value>(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .map(Collection::to_json) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .collect::<Value>(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "Object": "list" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -153,9 +150,8 @@ fn get_org_collections(org_id: String, _headers: AdminHeaders, conn: DbConn) -> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "Data": | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            Collection::find_by_organization(&org_id, &conn) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .iter() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .map(|collection| { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                collection.to_json() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            }).collect::<Value>(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .map(Collection::to_json) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            .collect::<Value>(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        "Object": "list" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }))) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -583,3 +579,72 @@ fn delete_user(org_id: String, org_user_id: String, headers: AdminHeaders, conn: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					fn post_delete_user(org_id: String, org_user_id: String, headers: AdminHeaders, conn: DbConn) -> EmptyResult { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    delete_user(org_id, org_user_id, headers, conn) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use super::ciphers::CipherData; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					use super::ciphers::update_cipher_from_data; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[derive(Deserialize)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[allow(non_snake_case)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					struct ImportData { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Ciphers: Vec<CipherData>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Collections: Vec<NewCollectionData>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    CollectionRelationships: Vec<RelationsData>, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[derive(Deserialize)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[allow(non_snake_case)] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					struct RelationsData { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Cipher index
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Key: usize, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Collection index
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    Value: usize, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#[post("/ciphers/import-organization?<query>", data = "<data>")] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					fn post_org_import(query: OrgIdData, data: JsonUpcase<ImportData>, headers: Headers, conn: DbConn) -> EmptyResult { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let data: ImportData = data.into_inner().data; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let org_id = query.organizationId; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let org_user = match UserOrganization::find_by_user_and_org(&headers.user.uuid, &org_id, &conn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Some(user) => user, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        None => err!("User is not part of the organization") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if org_user.type_ > UserOrgType::Admin as i32 { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        err!("Only admins or owners can import into an organization") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Read and create the collections
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let collections: Vec<_> = data.Collections.into_iter().map(|coll| { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        let mut collection = Collection::new(org_id.clone(), coll.Name); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        collection.save(&conn); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        collection | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }).collect(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Read the relations between collections and ciphers
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let mut relations = Vec::new(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for relation in data.CollectionRelationships { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        relations.push((relation.Key, relation.Value)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Read and create the ciphers
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let ciphers: Vec<_> = data.Ciphers.into_iter().map(|cipher_data| { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        let mut cipher = Cipher::new(cipher_data.Type, cipher_data.Name.clone()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        update_cipher_from_data(&mut cipher, cipher_data, &headers, false, &conn).ok(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        cipher | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }).collect(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // Assign the collections
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (cipher_index, coll_index) in relations { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        let cipher_id = &ciphers[cipher_index].uuid; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        let coll_id = &collections[coll_index].uuid; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        CollectionCipher::save(cipher_id, coll_id, &conn); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    let mut user = headers.user; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    match user.update_revision(&conn) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Ok(()) => Ok(()), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Err(_) => err!("Failed to update the revision, please log out and log back in to finish import.") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} |