[ 
https://issues.apache.org/jira/browse/OAK-9494?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17381281#comment-17381281
 ] 

Angela Schreiber edited comment on OAK-9494 at 7/15/21, 11:54 AM:
------------------------------------------------------------------

[~joerghoh], thanks for reporting.... i agree that the fully qualified name 
constants are making it super-hard to compare sets of jcr names (like privilege 
names in this case). what should work though is comparing privileges 
themselves.... i.e. not looking at the names.

e.g. something like:
{code}
// TODO: if all aggregated privileges are required -> extract using 
Privilege.isAggregate() and  Privilege.getAggregatedPrivileges()
Set<Privilege> privileges = 
ImmutableSet.copyOf(accessControlManger.getPrivileges(absPath));
Privilege readPrivilege = ....
boolean canRead = privileges.contains(readPrivilege);
{code}

and privilege can be access using ac-mgr or privilege manager (thanks for 
reminding me of that!):
{code}
readPrivilege = acMgr.privilegeFromName(Privilege.JCR_READ)
or
PrivilegeManager privilegeManager = ((JackrabbitWorkspace) 
session.getWorkspace()).getPrivilegeManager();
readPrivilege = privilegeManager.getPrivilege(Privilege.JCR_READ)
{code}

let me know if that works until we have complete this improvement.

btw: i believe that you want to check if a given privilege is granted at a 
particular node and not check if you can apply it..... applicable privileges 
for a given path are covered by a different API method: 
{{AccessControlManager.getSupportedPrivileges(String absPath)}} will return an 
array of privileges that can be used/applied at the given path.... 


was (Author: anchela):
[~joerghoh], thanks for reporting.... i agree that the fully qualified name 
constants are making it super-hard to compare sets of jcr names (like privilege 
names in this case). what should work though is comparing privileges 
themselves.... i.e. not looking at the names.

e.g. something like:
{code}
// TODO: if all aggregated privileges are required -> extract using 
Privilege.isAggregate() and  Privilege.getAggregatedPrivileges()
Set<Privilege> privileges = 
ImmutableSet.copyOf(accessControlManger.getPrivileges(absPath));
PrivilegeManager privilegeManager = ((JackrabbitWorkspace) 
session.getWorkspace()).getPrivilegeManager();
boolean canRead = 
privileges.contains(privilegeManager.getPrivilege(Privilege.JCR_READ));
{code}

let me know if that works until we have complete this improvement.

> Check if a privilege is granted at a node
> -----------------------------------------
>
>                 Key: OAK-9494
>                 URL: https://issues.apache.org/jira/browse/OAK-9494
>             Project: Jackrabbit Oak
>          Issue Type: Improvement
>          Components: api, commons
>            Reporter: Joerg Hoh
>            Priority: Major
>
> I have a case where I need to check for a session if individual privileges 
> are available for a specific node. For performance reasons I want to avoid to 
> execute multiple calls to {{accessControlManager.hasPrivilege(...)}}, but get 
> all Privileges of that node once and the set various flags based on the 
> presene of certain privileges or not.
> I want to use something like this:
> {code}
> Set<String> applicablePrivilegeNames = 
> ...(accessControlManager.getPrivileges(path))...
> boolean canAddChildNodes = 
> applicablePrivilegeNames.contains(Privilege.JCR_ADD_CHILD_NODES);
> boolean canWrite = applicablePrivilegeNames.contains(Privilege.WRITE);
> {code}
> It should work with aggregates as well.
> Right now it's a bit problematic because {{privilege.getName()}} resolves to 
> something like {{jcr:read}}, while the value of {{Privilege.JCR_READ}} is 
> {{\{http://www.jcp.org/jcr/1.0}read}}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to