diff options
Diffstat (limited to 'internal/authorization/regexp.go')
| -rw-r--r-- | internal/authorization/regexp.go | 53 | 
1 files changed, 53 insertions, 0 deletions
diff --git a/internal/authorization/regexp.go b/internal/authorization/regexp.go new file mode 100644 index 000000000..7983d842f --- /dev/null +++ b/internal/authorization/regexp.go @@ -0,0 +1,53 @@ +package authorization + +import ( +	"regexp" +	"strings" + +	"github.com/authelia/authelia/v4/internal/utils" +) + +// RegexpGroupStringSubjectMatcher matches the input string against the pattern taking into account Subexp groups. +type RegexpGroupStringSubjectMatcher struct { +	Pattern         regexp.Regexp +	SubexpNameUser  int +	SubexpNameGroup int +} + +// IsMatch returns true if the underlying pattern matches the input given the subject. +func (r RegexpGroupStringSubjectMatcher) IsMatch(input string, subject Subject) (match bool) { +	matches := r.Pattern.FindAllStringSubmatch(input, -1) +	if matches == nil { +		return false +	} + +	if r.SubexpNameUser != -1 && !strings.EqualFold(subject.Username, matches[0][r.SubexpNameUser]) { +		return false +	} + +	if r.SubexpNameGroup != -1 && !utils.IsStringInSliceFold(matches[0][r.SubexpNameGroup], subject.Groups) { +		return false +	} + +	return true +} + +// String returns the pattern string. +func (r RegexpGroupStringSubjectMatcher) String() string { +	return r.Pattern.String() +} + +// RegexpStringSubjectMatcher just matches the input string against the pattern. +type RegexpStringSubjectMatcher struct { +	Pattern regexp.Regexp +} + +// IsMatch returns true if the underlying pattern matches the input. +func (r RegexpStringSubjectMatcher) IsMatch(input string, _ Subject) (match bool) { +	return r.Pattern.MatchString(input) +} + +// String returns the pattern string. +func (r RegexpStringSubjectMatcher) String() string { +	return r.Pattern.String() +}  | 
