mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
This change moves the `system.SecurityOpt` type and `system.DecodeSecurityOptions` function to the client and adds a set of unit tests to capture current implementation. This change also create a set of daemon backend copies for usage. Signed-off-by: Austin Vazquez <austin.vazquez@docker.com>
49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package security
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// Option contains the name and options of a security option
|
|
type Option struct {
|
|
Name string
|
|
Options []KeyValue
|
|
}
|
|
|
|
// KeyValue holds a key/value pair.
|
|
type KeyValue struct {
|
|
Key, Value string
|
|
}
|
|
|
|
// DecodeOptions decodes a security options string slice to a
|
|
// type-safe [Option].
|
|
func DecodeOptions(opts []string) ([]Option, error) {
|
|
so := []Option{}
|
|
for _, opt := range opts {
|
|
// support output from a < 1.13 docker daemon
|
|
if !strings.Contains(opt, "=") {
|
|
so = append(so, Option{Name: opt})
|
|
continue
|
|
}
|
|
secopt := Option{}
|
|
for _, s := range strings.Split(opt, ",") {
|
|
k, v, ok := strings.Cut(s, "=")
|
|
if !ok {
|
|
return nil, fmt.Errorf("invalid security option %q", s)
|
|
}
|
|
if k == "" || v == "" {
|
|
return nil, errors.New("invalid empty security option")
|
|
}
|
|
if k == "name" {
|
|
secopt.Name = v
|
|
continue
|
|
}
|
|
secopt.Options = append(secopt.Options, KeyValue{Key: k, Value: v})
|
|
}
|
|
so = append(so, secopt)
|
|
}
|
|
return so, nil
|
|
}
|