-
Notifications
You must be signed in to change notification settings - Fork 1.3k
server: optimize account creation by pre-loading the role permissions #11137
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
e5848ac
fc10728
d395684
37fe152
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -47,6 +47,7 @@ | |
| import org.apache.cloudstack.acl.InfrastructureEntity; | ||
| import org.apache.cloudstack.acl.QuerySelector; | ||
| import org.apache.cloudstack.acl.Role; | ||
| import org.apache.cloudstack.acl.RolePermission; | ||
| import org.apache.cloudstack.acl.RoleService; | ||
| import org.apache.cloudstack.acl.RoleType; | ||
| import org.apache.cloudstack.acl.SecurityChecker; | ||
|
|
@@ -1431,29 +1432,35 @@ | |
| requested.getUuid(), | ||
| requested.getRoleId())); | ||
| } | ||
| if (caller.getRoleId().equals(requested.getRoleId())) { | ||
| return; | ||
| } | ||
| List<APIChecker> apiCheckers = getEnabledApiCheckers(); | ||
| for (APIChecker apiChecker : apiCheckers) { | ||
| checkApiAccess(apiChecker, caller, requested); | ||
| } | ||
|
Comment on lines
1438
to
+1441
|
||
| } | ||
|
|
||
| private void checkApiAccess(APIChecker apiChecker, Account caller, Account requested) throws PermissionDeniedException { | ||
| Pair<Role, List<RolePermission>> roleAndPermissionsForCaller = apiChecker.getRolePermissions(caller.getRoleId()); | ||
| Pair<Role, List<RolePermission>> roleAndPermissionsForRequested = apiChecker.getRolePermissions(requested.getRoleId()); | ||
| for (String command : apiNameList) { | ||
| try { | ||
| checkApiAccess(apiCheckers, requested, command); | ||
| } catch (PermissionDeniedException pde) { | ||
| if (logger.isTraceEnabled()) { | ||
| logger.trace(String.format( | ||
| "Checking for permission to \"%s\" is irrelevant as it is not requested for %s [%s]", | ||
| command, | ||
| requested.getAccountName(), | ||
| requested.getUuid() | ||
| ) | ||
| ); | ||
| if (roleAndPermissionsForRequested == null) { | ||
| apiChecker.checkAccess(caller, command); | ||
weizhouapache marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } else { | ||
| apiChecker.checkAccess(caller, command, roleAndPermissionsForRequested.first(), roleAndPermissionsForRequested.second()); | ||
weizhouapache marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
| } catch (PermissionDeniedException pde) { | ||
| continue; | ||
| } | ||
| // so requested can, now make sure caller can as well | ||
| try { | ||
| if (logger.isTraceEnabled()) { | ||
| logger.trace(String.format("permission to \"%s\" is requested", | ||
| command)); | ||
| if (roleAndPermissionsForCaller == null) { | ||
| apiChecker.checkAccess(caller, command); | ||
| } else { | ||
| apiChecker.checkAccess(caller, command, roleAndPermissionsForCaller.first(), roleAndPermissionsForCaller.second()); | ||
| } | ||
| checkApiAccess(apiCheckers, caller, command); | ||
| } catch (PermissionDeniedException pde) { | ||
| String msg = String.format("User of Account %s and domain %s can not create an account with access to more privileges they have themself.", | ||
| caller, _domainMgr.getDomain(caller.getDomainId())); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DynamicRoleBasedAPIAccessCheckeradds a newcheckAccess(Account, String, Role, List<RolePermission>)path, but the existing unit tests in this module only covercheckAccess(User, String)/checkAccess(Account, String). Adding tests for the new overload (allow/deny and root-admin cases) would help prevent regressions in the new preloaded-permissions flow used during account creation.