ParseKMSContext takes either a KMS context map or a comma-separated list of KMS context key:value pairs, and returns a map.
(in interface{})
| 140 | // ParseKMSContext takes either a KMS context map or a comma-separated list of |
| 141 | // KMS context key:value pairs, and returns a map. |
| 142 | func ParseKMSContext(in interface{}) map[string]*string { |
| 143 | const nonStringValueWarning = "Encryption context contains a non-string value, context will not be used" |
| 144 | out := make(map[string]*string) |
| 145 | switch in := in.(type) { |
| 146 | case map[string]interface{}: |
| 147 | if len(in) == 0 { |
| 148 | return nil |
| 149 | } |
| 150 | for k, v := range in { |
| 151 | value, ok := v.(string) |
| 152 | if !ok { |
| 153 | log.Warn(nonStringValueWarning) |
| 154 | return nil |
| 155 | } |
| 156 | out[k] = &value |
| 157 | } |
| 158 | case map[interface{}]interface{}: |
| 159 | if len(in) == 0 { |
| 160 | return nil |
| 161 | } |
| 162 | for k, v := range in { |
| 163 | key, ok := k.(string) |
| 164 | if !ok { |
| 165 | log.Warn(nonStringValueWarning) |
| 166 | return nil |
| 167 | } |
| 168 | value, ok := v.(string) |
| 169 | if !ok { |
| 170 | log.Warn(nonStringValueWarning) |
| 171 | return nil |
| 172 | } |
| 173 | out[key] = &value |
| 174 | } |
| 175 | case string: |
| 176 | if in == "" { |
| 177 | return nil |
| 178 | } |
| 179 | for _, kv := range strings.Split(in, ",") { |
| 180 | kv := strings.Split(kv, ":") |
| 181 | if len(kv) != 2 { |
| 182 | log.Warn(nonStringValueWarning) |
| 183 | return nil |
| 184 | } |
| 185 | out[kv[0]] = &kv[1] |
| 186 | } |
| 187 | } |
| 188 | return out |
| 189 | } |
| 190 | |
| 191 | // kmsContextToString converts a dictionary into a string that can be parsed |
| 192 | // again with ParseKMSContext(). |
no outgoing calls