mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-08-01 19:58:42 +00:00
74 lines
1.9 KiB
Go
74 lines
1.9 KiB
Go
package events
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// Wildcard matches all teams and all commands
|
|
const wildcard = "*"
|
|
|
|
// mapOfStrings is an alias for map[string]string
|
|
type mapOfStrings map[string]string
|
|
|
|
// TeamAllowlistChecker implements checking the teams and the operations that the members
|
|
// of a particular team are allowed to perform
|
|
type TeamAllowlistChecker struct {
|
|
rules []mapOfStrings
|
|
}
|
|
|
|
// NewTeamAllowlistChecker constructs a new checker
|
|
func NewTeamAllowlistChecker(allowlist string) (*TeamAllowlistChecker, error) {
|
|
var rules []mapOfStrings
|
|
pairs := strings.Split(allowlist, ",")
|
|
if pairs[0] != "" {
|
|
for _, pair := range pairs {
|
|
values := strings.Split(pair, ":")
|
|
team := strings.TrimSpace(values[0])
|
|
command := strings.TrimSpace(values[1])
|
|
m := mapOfStrings{team: command}
|
|
rules = append(rules, m)
|
|
}
|
|
}
|
|
return &TeamAllowlistChecker{
|
|
rules: rules,
|
|
}, nil
|
|
}
|
|
|
|
func (checker *TeamAllowlistChecker) HasRules() bool {
|
|
return len(checker.rules) > 0
|
|
}
|
|
|
|
// IsCommandAllowedForTeam returns true if the team is allowed to execute the command
|
|
// and false otherwise.
|
|
func (checker *TeamAllowlistChecker) IsCommandAllowedForTeam(team string, command string) bool {
|
|
for _, rule := range checker.rules {
|
|
for key, value := range rule {
|
|
if (key == wildcard || strings.EqualFold(key, team)) && (value == wildcard || strings.EqualFold(value, command)) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// IsCommandAllowedForAnyTeam returns true if any of the teams is allowed to execute the command
|
|
// and false otherwise.
|
|
func (checker *TeamAllowlistChecker) IsCommandAllowedForAnyTeam(teams []string, command string) bool {
|
|
if len(teams) == 0 {
|
|
for _, rule := range checker.rules {
|
|
for key, value := range rule {
|
|
if (key == wildcard) && (value == wildcard || strings.EqualFold(value, command)) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
for _, t := range teams {
|
|
if checker.IsCommandAllowedForTeam(t, command) {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|