On Wed, 2 Oct 2019, Jon C Kidder wrote: > Does the regex engine in OpenLDAP not support lazy quantifiers? Why > does the ACL processing in this log show only one capture group as if > the lazy quantifier in the first capture group isn't recognized? Every > tester I plug this regex into produces 2 capture groups which is what I > need. I need to carve off the leading OU as one capture group and > capture the remaining chain of OUs as the second group then re-use both > in my ACLs. Any suggestions for creating a regex that would produce the > desired capture groups for use in my ACLs? > > 5d94aa15 => dnpat: [18] > (ou=.+?,)?(ou=.+,)?ou=Delegated,ou=ApplicationData,dc=global,dc=aep,dc=com$ > nsub: 2
Lazy quantifiers, (aka stingy or minimal matches) are a feature of perl-compatible regexps and are not part of the regexp functions called by openldap for ACL processing. Per the slapd.access(5) manpage: If the <dnstyle> qualifier is regex, then <dnpattern> is a POSIX (''extended'') regular expression pattern, as detailed in regex(7) and/or re_format(7), matching a normalized string representation of the entry's DN. The regex form of the pattern does not (yet) support UTF-8. POSIX extended regexps do not include minimal matching. That said, minimal matches can often be more precisely written by putting a less general regexp, one that matches a more specific set of inputs, to the left of them. In this case, you probably want the ".+?" in "(ou=.+?,)?" to never match a comma, as that would mean multiple DN components were being included in that submatch. So, I would suggest trying (ou=[^,]+,)?(ou=.+,)?ou=Delegated,ou=ApplicationData,dc=global,dc=aep,dc=com$ This will have the same effect when the leading DN components are all 'ou' types. It'll behave differently if you were to have a DN that had some other type of component in there. For example, if the DN ou=foo,l=home,ou=bar,ou=Delegated,ou=ApplicationData,dc=global,dc=aep,dc=com was to be tested, and minimal match was actually supported, then your original regexp would have *matched* with $1 = ou=foo,l=home, $2 = ou=bar, while the regexp I suggest about will instead match $1 = $2 = ou=foo,l=home,ou=bar, If you wouldn't want such a (weird) case to match at all then you would want to tighten the second group as well, ala (ou=[^,]+,)?(ou=[^,]+,)?ou=Delegated,ou=ApplicationData,dc=global,dc=aep,dc=com$ or maybe... (ou=[^,]+,)?((ou=[^,]+,)+)?ou=Delegated,ou=ApplicationData,dc=global,dc=aep,dc=com$ ...but it depends on what you want to happen when there are more than two components before the ou=Delegated component. Philip Guenther