51 lines
1 KiB
Go
51 lines
1 KiB
Go
|
package libtrust
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
)
|
||
|
|
||
|
// FilterByHosts filters the list of PublicKeys to only those which contain a
|
||
|
// 'hosts' pattern which matches the given host. If *includeEmpty* is true,
|
||
|
// then keys which do not specify any hosts are also returned.
|
||
|
func FilterByHosts(keys []PublicKey, host string, includeEmpty bool) ([]PublicKey, error) {
|
||
|
filtered := make([]PublicKey, 0, len(keys))
|
||
|
|
||
|
for _, pubKey := range keys {
|
||
|
var hosts []string
|
||
|
switch v := pubKey.GetExtendedField("hosts").(type) {
|
||
|
case []string:
|
||
|
hosts = v
|
||
|
case []interface{}:
|
||
|
for _, value := range v {
|
||
|
h, ok := value.(string)
|
||
|
if !ok {
|
||
|
continue
|
||
|
}
|
||
|
hosts = append(hosts, h)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(hosts) == 0 {
|
||
|
if includeEmpty {
|
||
|
filtered = append(filtered, pubKey)
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// Check if any hosts match pattern
|
||
|
for _, hostPattern := range hosts {
|
||
|
match, err := filepath.Match(hostPattern, host)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if match {
|
||
|
filtered = append(filtered, pubKey)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return filtered, nil
|
||
|
}
|