aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel García <[email protected]>2018-07-11 16:30:03 +0200
committerDaniel García <[email protected]>2018-07-11 16:30:03 +0200
commit1cb67eee691f6020e181ad0f52c945319176828b (patch)
treed840f81122c72d95e03255bdb04a57d5620c2c30
parente88d8c856dbdd3cee56dc23141154c92db714c70 (diff)
downloadvaultwarden-1cb67eee691f6020e181ad0f52c945319176828b.tar.gz
vaultwarden-1cb67eee691f6020e181ad0f52c945319176828b.zip
Implement leave organization (accessed from the bottom of the user's settings page)
-rw-r--r--src/api/core/mod.rs1
-rw-r--r--src/api/core/organizations.rs23
2 files changed, 24 insertions, 0 deletions
diff --git a/src/api/core/mod.rs b/src/api/core/mod.rs
index 24a7de1d..8609ed3d 100644
--- a/src/api/core/mod.rs
+++ b/src/api/core/mod.rs
@@ -65,6 +65,7 @@ pub fn routes() -> Vec<Route> {
get_organization,
create_organization,
delete_organization,
+ leave_organization,
get_user_collections,
get_org_collections,
get_org_collection_detail,
diff --git a/src/api/core/organizations.rs b/src/api/core/organizations.rs
index 1d53222d..8c87a1dd 100644
--- a/src/api/core/organizations.rs
+++ b/src/api/core/organizations.rs
@@ -73,6 +73,29 @@ fn delete_organization(org_id: String, data: JsonUpcase<PasswordData>, headers:
}
}
+#[post("/organizations/<org_id>/leave")]
+fn leave_organization(org_id: String, headers: Headers, conn: DbConn) -> EmptyResult {
+ match UserOrganization::find_by_user_and_org(&headers.user.uuid, &org_id, &conn) {
+ None => err!("User not part of organization"),
+ Some(user_org) => {
+ if user_org.type_ == UserOrgType::Owner as i32 {
+ let num_owners = UserOrganization::find_by_org_and_type(
+ &org_id, UserOrgType::Owner as i32, &conn)
+ .len();
+
+ if num_owners <= 1 {
+ err!("The last owner can't leave")
+ }
+ }
+
+ match user_org.delete(&conn) {
+ Ok(()) => Ok(()),
+ Err(_) => err!("Failed leaving the organization")
+ }
+ }
+ }
+}
+
#[get("/organizations/<org_id>")]
fn get_organization(org_id: String, _headers: OwnerHeaders, conn: DbConn) -> JsonResult {
match Organization::find_by_uuid(&org_id, &conn) {