Policy Managers¶
Group id 102, stored as [Policy Managers], enum value enum_IR.AdmistrativeRoles.PolicyManager
(IRBase\IRBaseEnum.cs). The role is for the application-wide settings (general, authentication and password,
system behaviour, e-mail and notification, default folder columns) and for the policies of every library. It is a
system group: it belongs to no library (DOMAINID 0, setup\PatchLibrary\...\Update_8_2_000_updater.cs), and only
Administrators can add or remove its members. IRSecurity.IsAllowed gives UpdateGroupMembers no role and no
library-manager pass for a group id up to IRConstants.LastSystemUserGroupId (1000), so only the administrator
check at the top of AccessAllowedforAdminFunctionsAsync lets a member change.
How the role is checked¶
Three entries of the IRSecurity.IsAllowed matrix name the role (IRNET\IRSecurity.cs):
| IrAdminAction | Required roles | Self | Library managers |
|---|---|---|---|
UpdateApplicationSettingsAndPolicies |
PolicyManager | no | no |
UpdateLibraryPolices |
PolicyManager | no | only when the system behaviour setting AllowLibraryManagersToEditPolicy is on |
ListLibrariesForAdministration |
UserManager, PolicyManager | no | yes |
Order of the decision (IRSecurity.AccessAllowedforAdminFunctionsAsync, then IsAllowed):
- An administrator (
ThreadVariables.IsAdministrator(): thesysadminaccount or a member of[Administrators]) passes everything. - Self-service: none of the three actions allows it.
- Membership of a required role group (
UsergroupMembersStore.IsMemberOfAnyGroupAsync). - Library managers, only when the action allows them and a library id above 0 was passed (
SecurityFunctions.CheckDomainManagementAsync,IRNET\ModuleSecurityFunctions.cs). The settings calls passlocalDomainId0, so no library manager ever passes them.
A refusal is errorCode="4030" with the message Access denied. This action is restricted to the following roles:
The system administrator, Policy managers (Messages.AccessDenied, ActionRestrictedToFollowingRoles,
TheSystemAdministrator, PolicyManagers). For a library policy change with the setting on, Library manager(s)
is listed as well.
Administrators always pass every check below; the tables do not repeat it.
What the role can do¶
Application settings¶
All of these call AccessAllowedforAdminFunctionsAsync(UpdateApplicationSettingsAndPolicies, UNSPECIFIED, 0, 0) first.
| Action | Web service calls | Who else may do it | Conditions |
|---|---|---|---|
| Change the general settings | SetGeneralAppSettings | nobody else | InfoRouterExtensions.UpdateGeneralApplicationSettings after SettingServices.SetGeneralAppSettingsAsync; both check. Recycle bin months 0 to 36, holiday description length checked after the role. |
| Change the authentication and password policy | SetAuthenticationAndPasswordPolicy | nobody else | SettingServices.SetAuthenticationAndPasswordPolicyAsync and InfoRouterExtensions.UpdateAuthenticationAndPasswordPolicySettings both check. |
| Change the system behaviour settings | SetSystemBehaviorSettings | nobody else | Includes AllowLibraryManagersToEditPolicy (stored as LIBMANAGERS_EDITPOLICY), the flag that decides whether library managers may change library policies. |
| Read the system behaviour settings | GetSystemBehaviorSettings | nobody else | SettingServices.GetSystemBehaviorSettingsAsync. |
| Change the e-mail and notification settings | SetEmailAndNotificationSettings | nobody else | Role checked before the XML is parsed; a refused caller gets 4030, not 4000. |
| Read the e-mail and notification settings | GetEmailAndNotificationSettings | nobody else | SettingServices.GetEmailAndNotificationSettingsAsync checks the same action as the writer. No SMTP server or credentials are in it. |
| Set the system default folder columns | SetDefaultFolderColumns | nobody else | Anonymous callers get 4010 first; then the role (SettingServices.SetDefaultFolderColumnsAsync), then InfoRouter.SaveSystemDefaultColumnSettings checks it again. No administrators-only check remains. |
Library policies¶
| Action | Web service calls | Who else may do it | Conditions |
|---|---|---|---|
| Read a library's policies | GetDomainPolicies | the library's managers, always | Domain.AccessAllowedToReadPoliciesAsync (DomainExtensions.cs): UpdateLibraryPolices first, then CheckDomainManagementAsync for the library's managers. The library is looked up by name first; one the caller cannot reach is 4041 Library not found. |
| Change a library's policies | SetDomainPolicies | the library's managers, only when AllowLibraryManagersToEditPolicy is on |
LibraryServices.SetDomainPoliciesAsync checks UpdateLibraryPolices with the library id, and DomainPolicyOperations.UpdatePoliciesAsync checks it again. System policies in the XML are skipped. The change is logged to Logs\PolicyUpdates. |
| Reach any library by name, member or not | every call that takes a DomainName |
User Managers for every library; a library's own managers for it; members; anyone, for a library that allows anonymous access | DomainOperations.MayReachAsync: membership or anonymous access (DomainsStore.GetViewableLibraryListAsync), else ListLibrariesForAdministration with the library's id. Reaching is only the lookup; each call then makes its own check. |
| List every library, membership aside | GetLibrariesForAdministration | User Managers; library managers get the libraries they manage; anyone else gets an empty list | UserOperations.GetLibraryListForAdministrationAsync: ListLibrariesForAdministration with library id 0 passes the role, then DomainsStore.GetAllLibrariesAsync (hidden and archived included). Anonymous callers get 4010. |
Settings reads that need no role¶
These are listed so the UI does not hide them from anyone; they are not what the role unlocks.
| Action | Web service calls | Who may do it | Conditions |
|---|---|---|---|
| Read the general settings | GetGeneralAppSettings | anyone signed in | Anonymous callers get 4010 (IsAuthenticatedUser()). |
| Read the authentication and password policy | GetAuthenticationAndPasswordPolicy | anyone signed in | Same check. |
| Read the default and available folder columns | GetDefaultFolderColumns, GetAllFolderColumns | anyone, the anonymous user included | No check in SettingServices; a call with no ticket runs as the anonymous user (GetUserInfoFromInfoRouterAsync.IRServiceLogin). |
| Read the public application parameters | getApplicationParameters | anyone signed in | SettingsWebServices.GetApplicationParametersAsync. The block after ALLOWPARTIALEMAILUPLOADS (INDEXCATALOG, LOGLOGINS, FILEUPLOADTIMEOUT, ALLOWOWNERSHIPTRANSFER, SUBSCRIPTIONNOTIFICATIONS, SENDEMAIL, SENDTO_DISPLAYUSERLIST, SMTPSERVER, SMTPSERVERPORT, SMTPCONNECTIONTIMEOUT, SMTPSENDUSERNAME, SMTPSENDPASSWORD masked, PWD*, AuthenticationAuthorities, ServerName, IPAddressList, WarehousePaths) is written only when IsAdministrator() is true. A Policy Manager gets the public block only. |
| Read the Connect settings report | GetConnectSettings | anyone signed in | ConnectServices.GetConnectSettingsAsync: 4010 for anonymous, no role. |
What the role cannot do¶
| Action | Web service calls | Who can | Error returned |
|---|---|---|---|
| Flush the application cache | FlushApplicationCache | Administrators only: IsAllowed adds no role for FlushApplicationCache |
4030 Access denied. This action is restricted to the following roles: The system administrator |
| Update the licence | UpdateApplicationLicense | Administrators only (InfoRouterExtensions.UpdateLicenseInformation, IsAdministrator()) |
4030 Access denied. |
| See the licence, server status, maintenance jobs, warehouse status | GetLicenseInfo, GetSystemStatistics, GetMaintenanceJobsStatus, GetWarehouseStatus | Audit Managers (ViewLicenseInformation, ViewServerStatus, ViewWarehouseStatus; MiscServices.cs, InfoRouter.cs:1235) |
4030, roles listed: the system administrator, Audit managers |
See the extended block of getApplicationParameters |
getApplicationParameters | Administrators only (IsAdministrator()) |
No error: the call succeeds with the public block only |
| Create, rename, delete, archive or unarchive a library | CreateDomain, UpdateDomain, DeleteDomain, ArchiveDomain, UnarchiveDomain | Administrators only (DomainOperations.CreateAsync, DeleteAsync; DomainExtensions.UpdateAsync, ArchiveAsync, UnArchiveAsync: IsAdministrator()) |
4030 Only the system administrator can perform this operation |
| Add or remove library members | AddUserAsDomainMember, AddUserGroupAsDomainMember, RemoveUserFromDomainMembership, RemoveUserGroupFromDomainMembership | User Managers; the library's managers (AddRemoveLibraryMembers; DomainExtensions.cs, DomainOperations.cs:44) |
4030, roles listed: the system administrator, Library manager(s), User managers |
| Appoint or remove library managers | AddManagerToDomain, RemoveManagerFromDomain | User Managers only (AddRemoveLibraryManagers, no library-manager pass; DomainExtensions.SetDomainManagerAsync, RemoveDomainManagerAsync) |
4030, roles listed: the system administrator, User managers |
Add or remove members of [Policy Managers] or any role group |
AddUsergroupMember, RemoveUsergroupMember | Administrators only (UpdateGroupMembers for group ids up to 1000; UsergroupExtensions.cs:64, UsergroupOperations.cs:229) |
4030, roles listed: the system administrator |
| Create, change or delete document types | CreateDocumentTypeDef, CreateDocumentTypeDef1, UpdateDocumentTypeDef, UpdateDocumentTypeDef1, DeleteDocumentTypeDef | Administrators only (DocumentTypeOperations.CreateDocumentTypeAsync, UpdateAsync, DeleteAsync: IsAdministrator()) |
4030 Only the system administrator can perform this operation |
| Create, change or delete property sets and their fields | CreatePropertySetDefinition, CreatePropertySetDefinition1, UpdatePropertySetDefinition, UpdatePropertySetDefinition1, DeletePropertySetDefinition, AddPropertySetField, DeletePropertySetField | Administrators only (PropertySetOperations.CreatePropertySet, PropertySetExtensions.UpdateAsync, AddFieldAsync, RemoveField, InfoRouter.DeletePropertySetAsync: IsAdministrator()) |
4030 Only the system administrator can perform this operation |
| Define retention and disposition schedules | CreateRandDSchedule, UpdateRandDSchedule, DeleteRandDSchedule, DeleteRandDSchedule1 | R&D Managers (AddRDDef, UpdateRDDef, DeleteRDDef; RetentionAndDispositionOperations.cs) |
4030, roles listed: the system administrator, R&D managers |
| See other users' workflow tasks | getTasks, GetTasks1 when the criteria name no document or flow and do not name the caller as assignee, assigner or supervisor | Administrators see every task; library managers those of the libraries they manage (WorkflowOperations.GetTasksAsync, DomainsStore.GetLibraryListForAdministrationAsync) |
No error: a Policy Manager gets their own tasks only |
Finding out whether the signed-in user has this role¶
- GetGroupMembershipsOfUser with the caller's own name:
ListingGroupMembershipOfUserallows self (UserServices.cs:992,User.AccessAllowedForUserAsyncpassesUSERand the user's id). AGroupIDof102in the answer is this role;104is an administrator, who passes every check on this page without being in group 102. - GetLibrariesForAdministration: every library for a Policy Manager, User Manager or administrator; only the managed ones for a library manager; empty for anyone else. It does not say which of the three the caller is.
- GetSystemBehaviorSettings succeeds only for a Policy Manager or an administrator, so a 4030 from it means the caller is neither.
- getApplicationParameters: the
SMTPSERVERorWarehousePathselement is present only for an administrator; it says nothing about this role.
Notes¶
- The flag that lets library managers edit policies is itself a Policy Manager setting.
AllowLibraryManagersToEditPolicyis part of the system behaviour settings (SetSystemBehaviorSettings), so a Policy Manager decides whether library managers may change their libraries' policies. Reading policies does not depend on it (Domain.AccessAllowedToReadPoliciesAsync). - Reading a library's policies, by whom. A Policy Manager and a library's managers read them; a plain member of the library gets 4030; a non-member who is not a Policy Manager, User Manager or manager of that library gets 4041
Library not foundfrom the lookup, before the policy check. The 4030 message for a member namesLibrary manager(s)only when the edit flag is on, becauseIsAllowedlists library managers only when it would have let them pass. - Library lookup by name. Commit 61e1fb36 (2026-10-21) gave
DomainOperations.GetLibraryByNameAsyncandGetLibraryByIdAsyncthe sameMayReachAsyncrule: members, anonymous-access libraries, thenListLibrariesForAdministrationwith the library's id. A Policy Manager therefore reaches any library by name, member or not.GetLibrariesForAdministrationitself was added by commit fdd53cf9 (2026-10-21); the testGetLibrariesForAdministrationApiTests.APolicyManager_GetsEveryLibraryToocovers the role. - Refusals of the anonymous user differ by code. With no ticket,
GetGeneralAppSettingsandGetAuthenticationAndPasswordPolicyanswer 4010 (explicitIsAuthenticatedUser()check), whileGetSystemBehaviorSettings,GetEmailAndNotificationSettings, the fourSet*settings calls andFlushApplicationCacheanswer 4030 (the matrix refuses the anonymous user like any non-member). The testAppSettingsBatchApiTests.WithoutATicket_EachOneIsRefused_ButNotAllTheSameWayrecords this. A UI should treat 4010 and 4030 alike for these. - Every settings writer checks twice. The
SettingServicesmethod checksUpdateApplicationSettingsAndPolicies, and theInfoRouterExtensionsmethod it calls (orInfoRouter.SaveSystemDefaultColumnSettingsfor the columns) checks it again. Same action, same answer; the second check is for callers inside IRNET. getApplicationParametersand the settings readers overlap. The extended block showsLOGLOGINSand thePWD*values to administrators only, yet a Policy Manager reads the same values throughGetSystemBehaviorSettings, and any signed-in user throughGetAuthenticationAndPasswordPolicy. Nothing is hidden by it that a dedicated reader does not give, except the SMTP server details, server name, IP addresses and warehouse paths, which no settings call exposes. Defensible: the block is infrastructure, not policy.ListLibrariesForAdministrationis shared with User Managers and is whatMayReachAsyncandGetLibrariesForAdministrationuse. It no longer widensgetTasks:WorkflowOperations.GetTasksAsyncreads the administrator flag andDomainsStore.GetLibraryListForAdministrationAsync(managed libraries) directly, so User and Policy Managers see only their own tasks.
Related¶
- AdministrativeRoles, all roles at a glance
- the other role pages: Administrators, User Managers, Audit Managers, R&D Managers, Search & Category Administrators, Library Managers