diff options
Diffstat (limited to 'internal/authorization/access_control_resource.go')
| -rw-r--r-- | internal/authorization/access_control_resource.go | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/internal/authorization/access_control_resource.go b/internal/authorization/access_control_resource.go index 9bfca6d20..c9141f863 100644 --- a/internal/authorization/access_control_resource.go +++ b/internal/authorization/access_control_resource.go @@ -4,12 +4,32 @@ import ( "regexp" ) -// AccessControlResource represents an ACL resource. +// NewAccessControlResource creates a AccessControlResource or AccessControlResourceGroup. +func NewAccessControlResource(pattern regexp.Regexp) AccessControlResource { + var iuser, igroup = -1, -1 + + for i, group := range pattern.SubexpNames() { + switch group { + case subexpNameUser: + iuser = i + case subexpNameGroup: + igroup = i + } + } + + if iuser != -1 || igroup != -1 { + return AccessControlResource{RegexpGroupStringSubjectMatcher{pattern, iuser, igroup}} + } + + return AccessControlResource{RegexpStringSubjectMatcher{pattern}} +} + +// AccessControlResource represents an ACL resource that matches without named groups. type AccessControlResource struct { - Pattern regexp.Regexp + Matcher StringSubjectMatcher } // IsMatch returns true if the ACL resource match the object path. -func (acr AccessControlResource) IsMatch(object Object) (match bool) { - return acr.Pattern.MatchString(object.Path) +func (acl AccessControlResource) IsMatch(subject Subject, object Object) (match bool) { + return acl.Matcher.IsMatch(object.Path, subject) } |
