Permission Model Validator
Validate the given custom Alfresco permission model and dynamic authorities against these rules.
XML Structure Validation
- The file must be well-formed XML with root element
<permissions>.
- Each
<permissionSet> must declare a type attribute bound to a custom type or aspect
({prefix}:...), not a redefinition of a core type that removes built-in groups.
- Each
<permissionGroup> and <permission> must declare a name.
Built-in Name Collision
- FLAG as ERROR any
<permissionGroup name="..."> or <permission name="..."> whose name
collides with a built-in Alfresco permission group/permission: Read, Write, Delete,
AddChildren, ReadProperties, ReadChildren, WriteProperties, Consumer, Contributor,
Editor, Collaborator, Coordinator, SiteManager, SiteCollaborator, SiteContributor,
SiteConsumer, FullControl, All.
- Why it breaks: redefining a core group name corrupts the global permission model and can
silently alter access across the whole repository.
- Fix: use a project-scoped PascalCase name; compose on top of a core group with
<includePermissionGroup permissionGroup="Read" type="cm:cmobject"/>.
Registration Validation
- The model must be registered as an extension model, not a replacement: look for a Spring
bean with
parent="permissionModelBootstrap" and a model property pointing at the
permissionDefinitions.xml under alfresco/extension/.
- WARN if no such registration bean is found in a companion
*-context.xml.
- The registering context must be imported from
module-context.xml.
Dynamic Authority Validation
- If a
*DynamicAuthority.java exists:
- It must
implements DynamicAuthority (from org.alfresco.repo.security.permissions).
- It must implement
hasAuthority, getAuthority, and requiredFor.
- FLAG as ERROR
runAsSystem inside hasAuthority (privilege escalation + per-node perf
hazard).
- WARN if
hasAuthority does not guard with nodeService.exists().
- The bean must be registered (id
{prefix}.{name}DynamicAuthority) and added to the global
dynamicAuthorities list.
- WARN if a permission/group omits
requiresType where it logically applies only to the
bound type.
Output
Report all violations with file path, line number, rule violated, and suggested fix. If no
violations found, confirm the permission model is valid.
1---2name: permission-model-validator3description: Validates custom Alfresco permission model XML for well-formedness, no collision with built-in permission group names, correct permissionSet binding, and that any dynamic authority is registered and implements DynamicAuthority. Trigger automatically after generating or editing a *permissionDefinitions.xml or a *DynamicAuthority.java file.4---56# Permission Model Validator78Validate the given custom Alfresco permission model and dynamic authorities against these rules.910## XML Structure Validation11- The file must be well-formed XML with root element `<permissions>`.12- Each `<permissionSet>` must declare a `type` attribute bound to a **custom** type or aspect13 (`{prefix}:...`), not a redefinition of a core type that removes built-in groups.14- Each `<permissionGroup>` and `<permission>` must declare a `name`.1516## Built-in Name Collision17- **FLAG as ERROR** any `<permissionGroup name="...">` or `<permission name="...">` whose name18 collides with a built-in Alfresco permission group/permission: `Read`, `Write`, `Delete`,19 `AddChildren`, `ReadProperties`, `ReadChildren`, `WriteProperties`, `Consumer`, `Contributor`,20 `Editor`, `Collaborator`, `Coordinator`, `SiteManager`, `SiteCollaborator`, `SiteContributor`,21 `SiteConsumer`, `FullControl`, `All`.22 - **Why it breaks**: redefining a core group name corrupts the global permission model and can23 silently alter access across the whole repository.24 - **Fix**: use a project-scoped PascalCase name; compose on top of a core group with25 `<includePermissionGroup permissionGroup="Read" type="cm:cmobject"/>`.2627## Registration Validation28- The model must be registered as an **extension** model, not a replacement: look for a Spring29 bean with `parent="permissionModelBootstrap"` and a `model` property pointing at the30 `permissionDefinitions.xml` under `alfresco/extension/`.31 - **WARN** if no such registration bean is found in a companion `*-context.xml`.32- The registering context must be imported from `module-context.xml`.3334## Dynamic Authority Validation35- If a `*DynamicAuthority.java` exists:36 - It must `implements DynamicAuthority` (from `org.alfresco.repo.security.permissions`).37 - It must implement `hasAuthority`, `getAuthority`, and `requiredFor`.38 - **FLAG as ERROR** `runAsSystem` inside `hasAuthority` (privilege escalation + per-node perf39 hazard).40 - **WARN** if `hasAuthority` does not guard with `nodeService.exists()`.41 - The bean must be registered (id `{prefix}.{name}DynamicAuthority`) and added to the global42 `dynamicAuthorities` list.43- **WARN** if a permission/group omits `requiresType` where it logically applies only to the44 bound type.4546## Output47Report all violations with file path, line number, rule violated, and suggested fix. If no48violations found, confirm the permission model is valid.