Jackrabbit Content Repository
  1. Jackrabbit Content Repository
  2. JCR-2982

Extend syntax of ACL glob restrictions for properties

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Won't Fix
    • Affects Version/s: 2.3
    • Fix Version/s: None
    • Component/s: jackrabbit-core, security
    • Labels:
      None

      Description

      the current glob restrictions on resource based ACL simply adds the glob pattern to the path of the defining node. the resulting pattern is then used to match against the path of the item to be evaluated.

      eg: jcr:read on /content with /foo* will match all items having a path that matches "/content/foo*" including the properties of /content starting with foo'.

      A common usecase for using ACL restrictions is to allow read access to a node and it's properties, but generally deny it for it's child nodes:
      allow jcr:read on /content
      deny jcr:read on /content with /*

      this would be easy, but as mentioned above, would also include the node's properties, thus preventing them from being read.

      Suggest to modify the pattern matching by explicitly address properties differently by using a special prefix, like "|" (an illegal jcr char).

      eg:
      allow jcr:read on /content
      deny jcr:read on /content with "|jcr:" (denies all properties starting with "jcr:")
      deny jcr:read on /content with /* (denies all child nodes)

      if the type of an item can be easily transported to the ACL evaluation, then composing the path to be matched is simple:

      eg:
      if the item is a property /content/jcr:title, then the match-path is: /content|jcr:title so would not match /content/, but /content|jcr: of the example above.

      (Another option would be to support xpath restrictions - but this might be not performant enough)

        Activity

        Jukka Zitting made changes -
        Status Resolved [ 5 ] Closed [ 6 ]
        angela made changes -
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Won't Fix [ 2 ]
        Hide
        angela added a comment -

        as of oak the jcr:read privilege is an aggregate of 'read nodes' and 'read properties'.
        this will allow to specifically grant read access to properties only and to individual properties
        using the glob pattern or another configurable restriction.

        therefore resolving this issue wontfix.

        Show
        angela added a comment - as of oak the jcr:read privilege is an aggregate of 'read nodes' and 'read properties'. this will allow to specifically grant read access to properties only and to individual properties using the glob pattern or another configurable restriction. therefore resolving this issue wontfix.
        Jukka Zitting made changes -
        Fix Version/s 2.3.0 [ 12315901 ]
        Hide
        Tobias Bocanegra added a comment -

        > which of the above is it?
        all of them, this is the ACL

        > does your |* only apply to the properties of /content?
        yes.

        i think the check for an item would calculate the match path, eg: "/content|jcr:title" and then match against "/content|*"

        Show
        Tobias Bocanegra added a comment - > which of the above is it? all of them, this is the ACL > does your |* only apply to the properties of /content? yes. i think the check for an item would calculate the match path, eg: "/content|jcr:title" and then match against "/content|*"
        Hide
        angela added a comment -

        > the most common use case i've seen so far, is to deny all child nodes. so this could be done with:

        probably you mean: deny all child items except for properties of the target node, right?
        in contrast, deny all child nodes could also be read as only allow reading all properties in the subtree.

        > allow jcr:read on /content
        > deny jcr:read on /content with /* (denies all child nodes + properties)
        > allow jcr:read on /content with "|*" (allows all properties)

        which of the above is it?
        does your |* only apply to the properties of /content?

        Show
        angela added a comment - > the most common use case i've seen so far, is to deny all child nodes. so this could be done with: probably you mean: deny all child items except for properties of the target node, right? in contrast, deny all child nodes could also be read as only allow reading all properties in the subtree. > allow jcr:read on /content > deny jcr:read on /content with /* (denies all child nodes + properties) > allow jcr:read on /content with "|*" (allows all properties) which of the above is it? does your |* only apply to the properties of /content?
        Hide
        Tobias Bocanegra added a comment -

        > the last example would break backwards compatibility,
        yes. we don't need that.

        the most common use case i've seen so far, is to deny all child nodes. so this could be done with:

        allow jcr:read on /content
        deny jcr:read on /content with /* (denies all child nodes + properties)
        allow jcr:read on /content with "|*" (allows all properties

        Show
        Tobias Bocanegra added a comment - > the last example would break backwards compatibility, yes. we don't need that. the most common use case i've seen so far, is to deny all child nodes. so this could be done with: allow jcr:read on /content deny jcr:read on /content with /* (denies all child nodes + properties) allow jcr:read on /content with "|*" (allows all properties
        Hide
        angela added a comment -

        > Suggest to modify the pattern matching by explicitly address properties differently by using a special prefix, like "|" (an illegal jcr char).
        > eg:
        > allow jcr:read on /content
        > deny jcr:read on /content with "|jcr:" (denies all properties starting with "jcr:")
        > deny jcr:read on /content with /* (denies all child nodes)

        the last example would break backwards compatibility, which i would rather try to avoid.
        the solution depends on the needs, i.e. whether or not it was sufficient to explicitly address
        properties. honestly, i doubt that... so i would result in:

        • wildcard for any-item
        • wildcard for nodes
        • wildcard for properties

        > if the type of an item can be easily transported to the ACL evaluation [...]

        currently the type of item is not transported to the ACL evaluation for those cases where the eval is done for a path (and not an itemID).
        to achieve this, we either have to change the method signature or alternatively extend the Path interface.

        Show
        angela added a comment - > Suggest to modify the pattern matching by explicitly address properties differently by using a special prefix, like "|" (an illegal jcr char). > eg: > allow jcr:read on /content > deny jcr:read on /content with "|jcr: " (denies all properties starting with "jcr: ") > deny jcr:read on /content with /* (denies all child nodes) the last example would break backwards compatibility, which i would rather try to avoid. the solution depends on the needs, i.e. whether or not it was sufficient to explicitly address properties. honestly, i doubt that... so i would result in: wildcard for any-item wildcard for nodes wildcard for properties > if the type of an item can be easily transported to the ACL evaluation [...] currently the type of item is not transported to the ACL evaluation for those cases where the eval is done for a path (and not an itemID). to achieve this, we either have to change the method signature or alternatively extend the Path interface.
        angela made changes -
        Field Original Value New Value
        Component/s security [ 11646 ]
        Hide
        Andrew DePompa added a comment -

        I think you're right. I just latched onto the single example provided and fixed a problem I've been having that is similar but not quite the same. I've also noticed over the past few days that it may also be doable with existing functionality.

        Show
        Andrew DePompa added a comment - I think you're right. I just latched onto the single example provided and fixed a problem I've been having that is similar but not quite the same. I've also noticed over the past few days that it may also be doable with existing functionality.
        Hide
        Tobias Bocanegra added a comment -

        @andrew:
        The intent of this issue is to provide a syntax to distinct properties from child nodes in the restrictions. I still don't see how your solution would help here.

        Show
        Tobias Bocanegra added a comment - @andrew: The intent of this issue is to provide a syntax to distinct properties from child nodes in the restrictions. I still don't see how your solution would help here.
        Hide
        Andrew DePompa added a comment -

        I suppose I should also mention that this fix isn't necessarily limited to properties. Anything can be put on the right hand side of the "|/" and match exactly as it would previously. The only difference being the parent node would also match now.

        Show
        Andrew DePompa added a comment - I suppose I should also mention that this fix isn't necessarily limited to properties. Anything can be put on the right hand side of the "|/" and match exactly as it would previously. The only difference being the parent node would also match now.
        Hide
        Andrew DePompa added a comment -

        It would match the expression "/content(/jcr*)".
        The '|' character is stripped for matching purposes and essentially sets a flag that ensures "/content" will match the pattern as well as any children that normally would have matched.

        As I said, it's a simple solution that meets essentially this single use case without introducing serious code changes that would have broken the existing pattern matching.

        Show
        Andrew DePompa added a comment - It would match the expression "/content(/jcr*)". The '|' character is stripped for matching purposes and essentially sets a flag that ensures "/content" will match the pattern as well as any children that normally would have matched. As I said, it's a simple solution that meets essentially this single use case without introducing serious code changes that would have broken the existing pattern matching.
        Hide
        Tobias Bocanegra added a comment -

        > allow jcr:read on /content with "|/jcr*" - will match /content as well as all of its jcr properties and any of their children.
        "their" (==properties) children?

        so it translates to this regexp: "/content(|/jcr:.*)?" ,right? i don't really see the benefit, it just makes it more difficult to understand.

        Show
        Tobias Bocanegra added a comment - > allow jcr:read on /content with "|/jcr*" - will match /content as well as all of its jcr properties and any of their children. "their" (==properties) children? so it translates to this regexp: "/content(|/jcr:.*)?" ,right? i don't really see the benefit, it just makes it more difficult to understand.
        Hide
        Andrew DePompa added a comment -

        I've written a fairly simple solution that addresses this use case that I've been using locally for a while now. I started with Tobias's suggestion to use the '|' character but instead of using it to indicate that what follows is a property it now means to include "this" node (this being the node that the ACE is being set on). Thus, the pattern matching remains basically the same but '|' acts as a flag when included at the beginning of the pattern that returns true if the exact node path is checked.

        For example:
        allow jcr:read on /content with "|/jcr*" - will match /content as well as all of its jcr properties and any of their children.

        If this seems like a reasonable solution, I'd be willing to submit it for review.

        Show
        Andrew DePompa added a comment - I've written a fairly simple solution that addresses this use case that I've been using locally for a while now. I started with Tobias's suggestion to use the '|' character but instead of using it to indicate that what follows is a property it now means to include "this" node (this being the node that the ACE is being set on). Thus, the pattern matching remains basically the same but '|' acts as a flag when included at the beginning of the pattern that returns true if the exact node path is checked. For example: allow jcr:read on /content with "|/jcr*" - will match /content as well as all of its jcr properties and any of their children. If this seems like a reasonable solution, I'd be willing to submit it for review.
        Tobias Bocanegra created issue -

          People

          • Assignee:
            Unassigned
            Reporter:
            Tobias Bocanegra
          • Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development