Repository navigation
Conversation
…es (apache#14174) updateTemplateOrIsoPermissions() only treated the caller as owner when the caller's account id matched the template owner. For project owned templates/ISOs the owner is the project account, so project admins were rejected even though they can set the same flags at registration. Treat callers that can modify the project account (project admins) as owners. Fixes: apache#14174
|
Congratulations on your first Pull Request and welcome to the Apache CloudStack community! If you have any issues or are unsure about any anything please check our Contribution Guide (https://github.com/apache/cloudstack/blob/main/CONTRIBUTING.md)
|
|
Thank you for your first PR! Can you explain why this is a bug, isn’t this intended by design and this a change on how it works? |
|
Thanks for looking at it. I think it's a bug rather than intended behaviour, for three reasons:
The change keeps this narrow. It only treats a caller as owner when the template is project-owned and If you'd rather keep this admin-only by design, I'm happy to close this. It would probably be worth making registration consistent with that, though. |
wido
left a comment
There was a problem hiding this comment.
Thanks, that answers my question. I went through the code myself and had Claude Fable double check the reasoning afterwards.
Registration into a project is open to every member, public is only gated by allow.public.user.templates and extractable has no check at all. The update path then rejects everyone in the project because the owner is the project account. So this is an inconsistency, not a design choice. Limiting the fix to the project Admin role is stricter than registration, which is fine with me.
Verified on the 4.20 branch: TemplateManagerImplTest passes (42 tests), and with the fix reverted the project admin test fails with the error from the issue.
One pre-existing thing, not for this PR: the update path lets any owner set isfeatured, while registration forces it to false for non-admins. Could be a small follow-up.
LGTM, CI still has to run.
Description
This PR fixes project admins being unable to change
ispublic,isextractableorisfeaturedon a template or ISO owned by their project throughupdateTemplatePermissions/updateIsoPermissions. Thanks to @prashanthr2 for the report and analysis.Root cause:
TemplateManagerImpl.updateTemplateOrIsoPermissions()only allows the change ifcaller.getId() == ownerIdor the caller is an admin. For a project owned template the owner is the project account, so no user account ever matches and the call fails with "Unable to grant permission to Account X as it is neither admin nor owner or the Template", while the same flags can be set when registering the template into the project.This is an authorization change, limited to members with the project
Adminrole. The caller is treated as the owner only when the template is owned by a project account andProjectManager.canModifyProjectAccount(caller, ownerId)returns true. That is the helperDomainCheckeralready uses forModifyProjectaccess; for regular users it only returns true for accounts/users with theAdminrole in the project. Plain project members are still refused. The same owner flag is used for the existingisextractableowner check. Behaviour for template owners, root/domain admins and non-project templates is unchanged; the project check is only evaluated for non-admin, non-owner callers of project owned templates.Sent against 4.20 so it can be merged forward; the same code is present on 4.22 and main.
Fixes: #14174
Types of changes
Feature/Enhancement Scale or Bug Severity
Bug Severity
How Has This Been Tested?
Added unit tests to
TemplateManagerImplTestforupdateTemplateOrIsoPermissions():Ran:
mvn -pl server test -Dtest=TemplateManagerImplTest: 42 tests (37 existing + 5 new), 0 failures. With the fix reverted,updateTemplateOrIsoPermissionsTestProjectAdminCanUpdateProjectTemplatefails with theInvalidParameterValueExceptionfrom the issue.mvn -pl server test -Dtest='com.cloud.template.*Test,com.cloud.projects.*Test'with checkstyle enabled:TemplateManagerImplTest42,HypervisorTemplateAdapterTest17,ProjectManagerImplTest6; 65 tests in total, 0 failures, checkstyle passed.The full server test suite and integration/Marvin tests were not run.
How did you try to break this feature and the system with this change?
Checked that project members without the Admin role and unrelated users are still rejected, and that the existing owner and admin paths do not call the project check.