|
|
|
@ -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.")
|
|
|
|
|
}
|
|
|
|
|
}
|