diff --git a/src/api/core/key_connector.rs b/src/api/core/key_connector.rs index f7c60371..f079b392 100644 --- a/src/api/core/key_connector.rs +++ b/src/api/core/key_connector.rs @@ -6,7 +6,10 @@ use crate::{ CONFIG, api::{EmptyResult, JsonResult}, auth::Headers, - db::DbConn, + db::{ + DbConn, + models::{Membership, MembershipType, UserId}, + }, }; pub fn routes() -> Vec { @@ -33,6 +36,13 @@ pub struct SetKeyConnectorKeyData { org_identifier: String, } +async fn can_use_key_connector(user_uuid: &UserId, conn: &DbConn) -> EmptyResult { + if Membership::find_by_user(user_uuid, conn).await.iter().any(|m| m.atype >= MembershipType::Admin) { + err!("Owners and admins cannot use Key Connector and must keep a master password"); + } + Ok(()) +} + // Called by the client to finish provisioning a new SSO user whose master key // was just stored on the key connector. #[post("/accounts/set-key-connector-key", data = "")] @@ -44,6 +54,8 @@ async fn post_set_key_connector_key(data: Json, headers: let data = data.into_inner(); let mut user = headers.user; + can_use_key_connector(&user.uuid, &conn).await?; + user.client_kdf_type = data.kdf; user.client_kdf_iter = data.kdf_iterations; user.client_kdf_memory = data.kdf_memory; @@ -69,6 +81,9 @@ async fn post_convert_to_key_connector(headers: Headers, conn: DbConn) -> EmptyR } let mut user = headers.user; + + can_use_key_connector(&user.uuid, &conn).await?; + user.password_hash = Vec::new(); user.password_hint = None; user.uses_key_connector = true;