java-topology/defects/seaorm/patch/seaorm-0002-rbac-group-permissions-by-id.patch

62 lines
2.5 KiB
Diff

# UNDF: UNDF-2026-000000275
--- a/src/rbac/engine/mod.rs
+++ b/src/rbac/engine/mod.rs
@@ -26,6 +26,8 @@ pub struct RbacEngine {
resources: HashMap<ResourceRequest, Resource>,
permissions: HashMap<PermissionRequest, Permission>,
wildcard_resources: HashMap<ResourceId, Resource>,
wildcard_permissions: HashMap<PermissionId, Permission>,
+ permissions_by_id: HashMap<PermissionId, Permission>,
+ resources_by_id: HashMap<ResourceId, Resource>,
roles: HashMap<RoleId, Role>,
user_roles: HashMap<UserId, RoleId>,
role_permissions: HashMap<RoleId, HashSet<(PermissionId, ResourceId)>>,
@@ -88,6 +90,12 @@ impl RbacEngine {
permissions.insert(permission.clone().into(), permission);
}
+ let permissions_by_id: HashMap<PermissionId, Permission> =
+ permissions.values().map(|p| (p.id, p.clone())).collect();
+ let resources_by_id: HashMap<ResourceId, Resource> =
+ resources.values().map(|r| (r.id, r.clone())).collect();
+
let roles: HashMap<RoleId, Role> = roles_rows.into_iter().map(|r| (r.id, r)).collect();
@@ -120,6 +128,8 @@ impl RbacEngine {
RbacEngine {
resources,
permissions,
wildcard_resources,
wildcard_permissions,
+ permissions_by_id,
+ resources_by_id,
roles,
user_roles,
role_permissions,
@@ -224,19 +234,16 @@ impl RbacEngine {
let mut map: HashMap<ResourceId, (Resource, Vec<Permission>)> = Default::default();
for item in items {
- let permission = if let Some(p) = self.wildcard_permissions.get(&item.1) {
+ let permission = if let Some(p) = self.wildcard_permissions.get(&item.1) {
p
} else {
- self.permissions
- .values()
- .find(|p| p.id == item.1)
+ self.permissions_by_id
+ .get(&item.1)
.ok_or_else(|| Error::PermissionNotFound(format!("{:?}", item.1)))?
};
- let resource = if let Some(r) = self.wildcard_resources.get(&item.0) {
+ let resource = if let Some(r) = self.wildcard_resources.get(&item.0) {
r
} else {
- self.resources
- .values()
- .find(|r| r.id == item.0)
+ self.resources_by_id
+ .get(&item.0)
.ok_or_else(|| Error::ResourceNotFound(format!("{:?}", item.0)))?
};