diff options
Diffstat (limited to 'vendor/github.com/smallstep/linkedca/policy.go')
| -rw-r--r-- | vendor/github.com/smallstep/linkedca/policy.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/vendor/github.com/smallstep/linkedca/policy.go b/vendor/github.com/smallstep/linkedca/policy.go new file mode 100644 index 0000000..4a4e13e --- /dev/null +++ b/vendor/github.com/smallstep/linkedca/policy.go @@ -0,0 +1,72 @@ +package linkedca + +// Deduplicate removes duplicate values from the Policy +func (p *Policy) Deduplicate() { + if p == nil { + return + } + if x509 := p.GetX509(); x509 != nil { + if allow := x509.GetAllow(); allow != nil { + allow.Dns = removeDuplicates(allow.Dns) + allow.Ips = removeDuplicates(allow.Ips) + allow.Emails = removeDuplicates(allow.Emails) + allow.Uris = removeDuplicates(allow.Uris) + allow.CommonNames = removeDuplicates(allow.CommonNames) + } + if deny := p.GetX509().GetDeny(); deny != nil { + deny.Dns = removeDuplicates(deny.Dns) + deny.Ips = removeDuplicates(deny.Ips) + deny.Emails = removeDuplicates(deny.Emails) + deny.Uris = removeDuplicates(deny.Uris) + deny.CommonNames = removeDuplicates(deny.CommonNames) + } + } + if ssh := p.GetSsh(); ssh != nil { + if host := ssh.GetHost(); host != nil { + if allow := host.GetAllow(); allow != nil { + allow.Dns = removeDuplicates(allow.Dns) + allow.Ips = removeDuplicates(allow.Ips) + allow.Principals = removeDuplicates(allow.Principals) + } + if deny := host.GetDeny(); deny != nil { + deny.Dns = removeDuplicates(deny.Dns) + deny.Ips = removeDuplicates(deny.Ips) + deny.Principals = removeDuplicates(deny.Principals) + } + } + if user := ssh.GetUser(); user != nil { + if allow := user.GetAllow(); allow != nil { + allow.Emails = removeDuplicates(allow.Emails) + allow.Principals = removeDuplicates(allow.Principals) + } + if deny := user.GetDeny(); deny != nil { + deny.Emails = removeDuplicates(deny.Emails) + deny.Principals = removeDuplicates(deny.Principals) + } + } + } +} + +// removeDuplicates returns a new slice of strings with +// duplicate values removed. It retains the order of elements +// in the source slice. +func removeDuplicates(tokens []string) (ret []string) { + // no need to remove dupes; return original + if len(tokens) <= 1 { + return tokens + } + + keys := make(map[string]struct{}, len(tokens)) + + ret = make([]string, 0, len(tokens)) + for _, item := range tokens { + if _, ok := keys[item]; ok { + continue + } + + keys[item] = struct{}{} + ret = append(ret, item) + } + + return +} |
