[jira] [Resolved] (SLING-8605) AclUtil.createLocalRestrictions should use JackrabbitAccessControlList.isMultiValueRestriction(String)

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[jira] [Resolved] (SLING-8605) AclUtil.createLocalRestrictions should use JackrabbitAccessControlList.isMultiValueRestriction(String)

Andrei Shilov (Jira)

     [ https://issues.apache.org/jira/browse/SLING-8605?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Robert Munteanu resolved SLING-8605.
------------------------------------
    Resolution: Fixed

Thanks for the patch [~angela], I've applied it in [sling-org-apache-sling-jcr-repoinit commit da2a93d|https://github.com/apache/sling-org-apache-sling-jcr-repoinit/commit/da2a93d].

For the future, please consider submitting PRs on GitHub as it makes them easier to apply and review, also including various PR checks.


> AclUtil.createLocalRestrictions should use JackrabbitAccessControlList.isMultiValueRestriction(String)
> ------------------------------------------------------------------------------------------------------
>
>                 Key: SLING-8605
>                 URL: https://issues.apache.org/jira/browse/SLING-8605
>             Project: Sling
>          Issue Type: Bug
>          Components: Repoinit
>            Reporter: angela
>            Assignee: Robert Munteanu
>            Priority: Major
>             Fix For: Repoinit JCR 1.1.14
>
>
> today the {{AclUtil.createLocalRestrictions}} looks at the length of the value array to determine if a given restriction is intended to be multivalued or not. this may lead to an unexpected exception in cases where a single value is defined for a restriction that is defined to be multivalued. instead of looking at the length of the array, the code should make use of {{JackrabbitAccessControlList.isMultiValueRestriction}} in order to find out if a given restriction is multivalued or not.
> here the proposed change (also using the 'checkState' method that is part of the patch for SLING-8604:
> {code}
>     private static LocalRestrictions createLocalRestrictions(List<RestrictionClause> list, JackrabbitAccessControlList jacl, Session s) throws RepositoryException {
>         Map<String,Value> restrictions = new HashMap<>();
>         Map<String,Value[]> mvrestrictions = new HashMap<>();
>         if(list != null && !list.isEmpty()){
>             ValueFactory vf = s.getValueFactory();
>            for(RestrictionClause rc : list){
>                String restrictionName = rc.getName();
>                int type = jacl.getRestrictionType(restrictionName);
>                boolean isMvRestriction = jacl.isMultiValueRestriction(restrictionName);
>                Value[] values = new Value[rc.getValues().size()];
>                for(int i=0;i<values.length;i++) {
>                    values[i] = vf.createValue(rc.getValues().get(i),type);
>                }
>                if("rep:glob".equals(restrictionName) && values.length == 0) {
>                    // SLING-7280 - special case for rep:glob which supports an empty string
>                    // to mean "no values"
>                    restrictions.put(restrictionName, vf.createValue(""));
>                } else if (isMvRestriction) {
>                    mvrestrictions.put(restrictionName, values);
>                } else {
>                    checkState(values.length == 1, "Expected just one value for single valued restriction with name " + restrictionName);
>                    restrictions.put(restrictionName, values[0]);
>                }
>            }
>         }
>         return new LocalRestrictions(restrictions,mvrestrictions);
>     }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.2#803003)