Fixed registry JMAP helpers

This commit is contained in:
Maurus Decimus
2026-04-13 19:51:45 +02:00
parent 7564f51642
commit f3dfb7cb33
32 changed files with 487 additions and 282 deletions

View File

@@ -23,7 +23,7 @@ registry = { path = "../registry" }
smtp-proto = { version = "0.2" }
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
mail-builder = { version = "0.4" }
mail-auth = { path = "/Users/me/code/mail-auth", features = ["generate"] }
mail-auth = { version = "0.8", features = ["generate"] }
tokio = { version = "1.47", features = ["rt"] }
hyper = { version = "1.0.1", features = ["server", "http1", "http2"] }
hyper-util = { version = "0.1.1", features = ["tokio"] }

View File

@@ -4,10 +4,17 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use common::{Server, auth::AccessToken};
use common::{
Server,
auth::{AccessToken, RECOVERY_ADMIN_ID, permissions::PermissionsListBuilder},
};
use http_proto::{HttpResponse, JsonResponse, ToHttpResponse};
use registry::schema::enums::{Locale, Permission};
use registry::{
schema::enums::{Locale, Permission},
types::EnumImpl,
};
use serde::Serialize;
use utils::DomainPart;
#[derive(Debug, Clone, Serialize)]
pub struct Account {
@@ -43,9 +50,67 @@ impl AccountApiHandler for Server {
// SPDX-SnippetEnd
let account_info = self.account_info(access_token.account_id()).await?;
let is_external_directory = if let Some(domain_name) = account_info.name().try_domain_part()
&& self.get_directory_for_domain(domain_name).await?.is_some()
{
true
} else {
false
};
let is_recovery_admin = access_token.account_id() == RECOVERY_ADMIN_ID;
let permissions = if let Some(scope) = access_token.access_scope() {
let mut permissions = scope.permissions.clone();
for p in [
Permission::SysDmarcInternalReportUpdate,
Permission::SysDmarcInternalReportCreate,
Permission::SysDmarcExternalReportUpdate,
Permission::SysDmarcExternalReportCreate,
Permission::SysTlsInternalReportUpdate,
Permission::SysTlsInternalReportCreate,
Permission::SysTlsExternalReportUpdate,
Permission::SysTlsExternalReportCreate,
Permission::SysArfExternalReportCreate,
Permission::SysArfExternalReportUpdate,
Permission::SysQueuedMessageCreate,
Permission::SysLogCreate,
Permission::SysLogDestroy,
Permission::SysLogUpdate,
] {
permissions.clear(p.to_id() as usize);
}
if is_external_directory || is_recovery_admin {
permissions.clear(Permission::SysAccountPasswordGet.to_id() as usize);
permissions.clear(Permission::SysAccountPasswordUpdate.to_id() as usize);
}
if is_recovery_admin {
for p in [
Permission::SysAccountSettingsGet,
Permission::SysAccountSettingsUpdate,
Permission::SysApiKeyCreate,
Permission::SysApiKeyUpdate,
Permission::SysApiKeyDestroy,
Permission::SysApiKeyQuery,
Permission::SysApiKeyGet,
Permission::SysAppPasswordCreate,
Permission::SysAppPasswordUpdate,
Permission::SysAppPasswordDestroy,
Permission::SysAppPasswordQuery,
Permission::SysAppPasswordGet,
] {
permissions.clear(p.to_id() as usize);
}
}
permissions.build_permissions_list()
} else {
Vec::new()
};
Ok(JsonResponse::new(Account {
permissions: access_token.permissions(),
permissions,
edition,
locale: account_info.locale(),
})