|
|
|
@ -11,6 +11,13 @@ import ( |
|
|
|
|
log "github.com/sirupsen/logrus" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// DNs ----
|
|
|
|
|
|
|
|
|
|
type dnComponent struct { |
|
|
|
|
Type string |
|
|
|
|
Value string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func dnToConsul(dn string) (string, error) { |
|
|
|
|
if strings.Contains(dn, "/") { |
|
|
|
|
return "", fmt.Errorf("DN %s contains a /", dn) |
|
|
|
@ -45,6 +52,48 @@ func consulToDN(key string) (string, string, error) { |
|
|
|
|
return "", "", fmt.Errorf("Consul key %s does not end with attribute=something", key) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func parseDN(dn string) ([]dnComponent, error) { |
|
|
|
|
rdns := strings.Split(dn, ",") |
|
|
|
|
|
|
|
|
|
ret := []dnComponent{} |
|
|
|
|
|
|
|
|
|
for _, rdn := range rdns { |
|
|
|
|
splits := strings.Split(rdn, "=") |
|
|
|
|
if len(splits) != 2 { |
|
|
|
|
return nil, fmt.Errorf("Wrong DN component: %s (expected type=value)", rdn) |
|
|
|
|
} |
|
|
|
|
ret = append(ret, dnComponent{ |
|
|
|
|
Type: strings.ToLower(strings.TrimSpace(splits[0])), |
|
|
|
|
Value: strings.ToLower(strings.TrimSpace(splits[1])), |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
return ret, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func unparseDN(path []dnComponent) string { |
|
|
|
|
ret := "" |
|
|
|
|
for _, c := range path { |
|
|
|
|
if ret != "" { |
|
|
|
|
ret = ret + "," |
|
|
|
|
} |
|
|
|
|
ret = ret + c.Type + "=" + c.Value |
|
|
|
|
} |
|
|
|
|
return ret |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func canonicalDN(dn string) (string, error) { |
|
|
|
|
path, err := parseDN(dn) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return unparseDN(path), nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Values
|
|
|
|
|
|
|
|
|
|
type Entry map[string][]string |
|
|
|
|
|
|
|
|
|
func parseValue(value []byte) ([]string, error) { |
|
|
|
|
val := []string{} |
|
|
|
|
err := json.Unmarshal(value, &val) |
|
|
|
@ -82,49 +131,6 @@ func parseConsulResult(data []*consul.KVPair) (map[string]Entry, error) { |
|
|
|
|
return aggregator, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type DNComponent struct { |
|
|
|
|
Type string |
|
|
|
|
Value string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func parseDN(dn string) ([]DNComponent, error) { |
|
|
|
|
rdns := strings.Split(dn, ",") |
|
|
|
|
|
|
|
|
|
ret := []DNComponent{} |
|
|
|
|
|
|
|
|
|
for _, rdn := range rdns { |
|
|
|
|
splits := strings.Split(rdn, "=") |
|
|
|
|
if len(splits) != 2 { |
|
|
|
|
return nil, fmt.Errorf("Wrong DN component: %s (expected type=value)", rdn) |
|
|
|
|
} |
|
|
|
|
ret = append(ret, DNComponent{ |
|
|
|
|
Type: strings.ToLower(strings.TrimSpace(splits[0])), |
|
|
|
|
Value: strings.ToLower(strings.TrimSpace(splits[1])), |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
return ret, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func unparseDN(path []DNComponent) string { |
|
|
|
|
ret := "" |
|
|
|
|
for _, c := range path { |
|
|
|
|
if ret != "" { |
|
|
|
|
ret = ret + "," |
|
|
|
|
} |
|
|
|
|
ret = ret + c.Type + "=" + c.Value |
|
|
|
|
} |
|
|
|
|
return ret |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func canonicalDN(dn string) (string, error) { |
|
|
|
|
path, err := parseDN(dn) |
|
|
|
|
if err != nil { |
|
|
|
|
return "", err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return unparseDN(path), nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func checkRestrictedAttr(attr string) error { |
|
|
|
|
RESTRICTED_ATTRS := []string{ |
|
|
|
|
ATTR_MEMBEROF, |
|
|
|
|