Skip to content

Commit

Permalink
Refactor regexp node labels.
Browse files Browse the repository at this point in the history
  • Loading branch information
russjones committed Oct 5, 2018
1 parent 74d1d5e commit ed6d35a
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
9 changes: 4 additions & 5 deletions lib/services/role.go
Original file line number Diff line number Diff line change
Expand Up @@ -1401,7 +1401,6 @@ func MatchLabels(selector Labels, target map[string]string) (bool, string, error
return false, "no match, empty selector", nil
}

// matchLabels, labelsMessage := MatchLabels(role.GetNodeLabels(Deny), s.GetAllLabels())
// *: * matches everything even empty target set.
selectorValues := selector[Wildcard]
if len(selectorValues) == 1 && selectorValues[0] == Wildcard {
Expand All @@ -1417,9 +1416,9 @@ func MatchLabels(selector Labels, target map[string]string) (bool, string, error
}

if !utils.SliceContainsStr(selectorValues, Wildcard) {
result, err := utils.SliceContainsRegexStr(targetVal, selectorValues)
result, err := utils.SliceMatchesRegex(targetVal, selectorValues)
if err != nil {
return false, "", trace.BadParameter(err.Error())
return false, "", trace.Wrap(err)
} else if !result {
return false, fmt.Sprintf("no value match: got '%v' want: '%v'", targetVal, selectorValues), nil
}
Expand Down Expand Up @@ -1568,7 +1567,7 @@ func (set RoleSet) CheckAccessToServer(login string, s Server) error {
matchNamespace, namespaceMessage := MatchNamespace(role.GetNamespaces(Deny), s.GetNamespace())
matchLabels, labelsMessage, err := MatchLabels(role.GetNodeLabels(Deny), s.GetAllLabels())
if err != nil {
return trace.CompareFailed(err.Error())
return trace.Wrap(err)
}
matchLogin, loginMessage := MatchLogin(role.GetLogins(Deny), login)
if matchNamespace && (matchLabels || matchLogin) {
Expand All @@ -1588,7 +1587,7 @@ func (set RoleSet) CheckAccessToServer(login string, s Server) error {
matchNamespace, namespaceMessage := MatchNamespace(role.GetNamespaces(Allow), s.GetNamespace())
matchLabels, labelsMessage, err := MatchLabels(role.GetNodeLabels(Allow), s.GetAllLabels())
if err != nil {
return trace.CompareFailed(err.Error())
return trace.Wrap(err)
}
matchLogin, loginMessage := MatchLogin(role.GetLogins(Allow), login)
if matchNamespace && matchLabels && matchLogin {
Expand Down
8 changes: 7 additions & 1 deletion lib/utils/replace.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ func ReplaceRegexp(expression string, replaceWith string, input string) (string,
return expr.ReplaceAllString(input, replaceWith), nil
}

func SliceContainsRegexStr(input string, expressions []string) (bool, error) {
// SliceMatchesRegex checks if input matches any of the expressions. The
// match is always evaluated as a regex either an exact match or regexp.
func SliceMatchesRegex(input string, expressions []string) (bool, error) {
for _, expression := range expressions {
if !strings.HasPrefix(expression, "^") || !strings.HasSuffix(expression, "$") {
// replace glob-style wildcards with regexp wildcards
Expand All @@ -59,6 +61,10 @@ func SliceContainsRegexStr(input string, expressions []string) (bool, error) {
if err != nil {
return false, trace.BadParameter(err.Error())
}

// Since the expression is always surrounded by ^ and $ this is an exact
// match for either a a plain string (for example ^hello$) or for a regexp
// (for example ^hel*o$).
if expr.MatchString(input) {
return true, nil
}
Expand Down

0 comments on commit ed6d35a

Please sign in to comment.