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 Sep 29, 2018
1 parent 480eb23 commit cbb9598
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
7 changes: 3 additions & 4 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 @@ -1419,7 +1418,7 @@ func MatchLabels(selector Labels, target map[string]string) (bool, string, error
if !utils.SliceContainsStr(selectorValues, Wildcard) {
result, err := utils.SliceContainsRegexStr(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
6 changes: 6 additions & 0 deletions lib/utils/replace.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ func ReplaceRegexp(expression string, replaceWith string, input string) (string,
return expr.ReplaceAllString(input, replaceWith), nil
}

// SliceContainsRegexStr checks if input matches any of the expressions. The
// match is always evaluated as a regex either an exact match or regexp.
func SliceContainsRegexStr(input string, expressions []string) (bool, error) {
for _, expression := range expressions {
if !strings.HasPrefix(expression, "^") || !strings.HasSuffix(expression, "$") {
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 cbb9598

Please sign in to comment.