Ensure comment is always a valid key (#8604)

Also fix LDAP leaky connection
master
Harshavardhana 5 years ago committed by Nitish Tiwari
parent c9940d8c3f
commit d8e3de0cae
  1. 54
      cmd/config/config.go
  2. 3
      cmd/sts-handlers.go
  3. 38
      pkg/madmin/parse-kv.go

@ -399,6 +399,12 @@ func LookupRegion(kv KVS) (string, error) {
func CheckValidKeys(subSys string, kv KVS, validKVS KVS) error { func CheckValidKeys(subSys string, kv KVS, validKVS KVS) error {
nkv := KVS{} nkv := KVS{}
for _, kv := range kv { for _, kv := range kv {
// Comment is a valid key, its also fully optional
// ignore it since it is a valid key for all
// sub-systems.
if kv.Key == Comment {
continue
}
if _, ok := validKVS.Lookup(kv.Key); !ok { if _, ok := validKVS.Lookup(kv.Key); !ok {
nkv = append(nkv, kv) nkv = append(nkv, kv)
} }
@ -557,23 +563,19 @@ func (c Config) SetKVS(s string, defaultKVS map[string]KVS) error {
continue continue
} }
if len(kv) == 1 && prevK != "" { if len(kv) == 1 && prevK != "" {
kvs = append(kvs, KV{ value := strings.Join([]string{
Key: prevK, kvs.Get(prevK),
Value: strings.Join([]string{ madmin.SanitizeValue(kv[0]),
kvs.Get(prevK), }, KvSpaceSeparator)
madmin.SanitizeValue(kv[0]), kvs.Set(prevK, value)
}, KvSpaceSeparator),
})
continue continue
} }
if len(kv) == 1 { if len(kv) == 2 {
return Errorf(SafeModeKind, "key '%s', cannot have empty value", kv[0]) prevK = kv[0]
kvs.Set(prevK, madmin.SanitizeValue(kv[1]))
continue
} }
prevK = kv[0] return Errorf(SafeModeKind, "key '%s', cannot have empty value", kv[0])
kvs = append(kvs, KV{
Key: kv[0],
Value: madmin.SanitizeValue(kv[1]),
})
} }
tgt := Default tgt := Default
@ -587,25 +589,27 @@ func (c Config) SetKVS(s string, defaultKVS map[string]KVS) error {
_, defaultOk := defaultKVS[subSys].Lookup(Enable) _, defaultOk := defaultKVS[subSys].Lookup(Enable)
if !ok && defaultOk { if !ok && defaultOk {
// implicit state "on" if not specified. // implicit state "on" if not specified.
kvs = append(kvs, KV{ kvs.Set(Enable, EnableOn)
Key: Enable,
Value: EnableOn,
})
} }
currKVS := c[subSys][tgt] currKVS, ok := c[subSys][tgt]
if !ok {
currKVS = defaultKVS[subSys]
}
for _, kv := range kvs { for _, kv := range kvs {
if kv.Key == Comment {
// Skip comment and add it later.
continue
}
currKVS.Set(kv.Key, kv.Value) currKVS.Set(kv.Key, kv.Value)
} }
for _, defaultKV := range defaultKVS[subSys] { v, ok := kvs.Lookup(Comment)
_, ok := c[subSys][tgt].Lookup(defaultKV.Key) if ok {
if !ok { currKVS.Set(Comment, v)
currKVS.Set(defaultKV.Key, defaultKV.Value)
}
} }
copy(c[subSys][tgt], currKVS) c[subSys][tgt] = currKVS
return nil return nil
} }

@ -484,6 +484,9 @@ func (sts *stsAPIHandlers) AssumeRoleWithLDAPIdentity(w http.ResponseWriter, r *
return return
} }
// Close ldap connection to avoid leaks.
defer ldapConn.Close()
usernameSubs, _ := xldap.NewSubstituter("username", ldapUsername) usernameSubs, _ := xldap.NewSubstituter("username", ldapUsername)
// We ignore error below as we already validated the username // We ignore error below as we already validated the username
// format string at startup. // format string at startup.

@ -40,6 +40,23 @@ func (kvs KVS) Empty() bool {
return len(kvs) == 0 return len(kvs) == 0
} }
// Set sets a value, if not sets a default value.
func (kvs *KVS) Set(key, value string) {
for i, kv := range *kvs {
if kv.Key == key {
(*kvs)[i] = KV{
Key: key,
Value: value,
}
return
}
}
*kvs = append(*kvs, KV{
Key: key,
Value: value,
})
}
// Get - returns the value of a key, if not found returns empty. // Get - returns the value of a key, if not found returns empty.
func (kvs KVS) Get(key string) string { func (kvs KVS) Get(key string) string {
v, ok := kvs.Lookup(key) v, ok := kvs.Lookup(key)
@ -174,20 +191,19 @@ func (t *Targets) AddTarget(s string) error {
continue continue
} }
if len(kv) == 1 && prevK != "" { if len(kv) == 1 && prevK != "" {
kvs = append(kvs, KV{ value := strings.Join([]string{
Key: prevK, kvs.Get(prevK),
Value: strings.Join([]string{kvs.Get(prevK), SanitizeValue(kv[0])}, KvSpaceSeparator), SanitizeValue(kv[0]),
}) }, KvSpaceSeparator)
kvs.Set(prevK, value)
continue continue
} }
if len(kv) == 1 { if len(kv) == 2 {
return fmt.Errorf("value for key '%s' cannot be empty", kv[0]) prevK = kv[0]
kvs.Set(prevK, SanitizeValue(kv[1]))
continue
} }
prevK = kv[0] return fmt.Errorf("value for key '%s' cannot be empty", kv[0])
kvs = append(kvs, KV{
Key: kv[0],
Value: SanitizeValue(kv[1]),
})
} }
for i := range *t { for i := range *t {

Loading…
Cancel
Save