Case insensitive match on attribute names

This commit is contained in:
Alex 2020-01-19 18:04:42 +01:00
parent 4c5b3d929d
commit 131297a33f

18
main.go
View file

@ -329,8 +329,8 @@ func (server *Server) handleSearchInternal(state *State, w ldap.ResponseWriter,
// If attribute is not in request, exclude it from returned entry // If attribute is not in request, exclude it from returned entry
if len(r.Attributes()) > 0 { if len(r.Attributes()) > 0 {
found := false found := false
for _, need := range r.Attributes() { for _, requested := range r.Attributes() {
if string(need) == attr { if strings.EqualFold(string(requested), attr) {
found = true found = true
break break
} }
@ -389,15 +389,19 @@ func applyFilter(entry Entry, filter message.Filter) (bool, error) {
return !res, nil return !res, nil
} else if fPresent, ok := filter.(message.FilterPresent); ok { } else if fPresent, ok := filter.(message.FilterPresent); ok {
what := string(fPresent) what := string(fPresent)
log.Printf("Present filter: %s", what) // Case insensitive search
if _, ok := entry[what]; ok { for desc := range entry {
if strings.EqualFold(what, desc) {
return true, nil return true, nil
} }
}
return false, nil return false, nil
} else if fEquality, ok := filter.(message.FilterEqualityMatch); ok { } else if fEquality, ok := filter.(message.FilterEqualityMatch); ok {
desc := string(fEquality.AttributeDesc()) desc := string(fEquality.AttributeDesc())
target := string(fEquality.AssertionValue()) target := string(fEquality.AssertionValue())
if value, ok := entry[desc]; ok { // Case insensitive attribute search
for entry_desc, value := range entry {
if strings.EqualFold(entry_desc, desc) {
if vstr, ok := value.(string); ok { if vstr, ok := value.(string); ok {
// If we have one value for the key, match exactly // If we have one value for the key, match exactly
return vstr == target, nil return vstr == target, nil
@ -412,9 +416,9 @@ func applyFilter(entry Entry, filter message.Filter) (bool, error) {
} else { } else {
panic(fmt.Sprintf("Invalid value: %#v", value)) panic(fmt.Sprintf("Invalid value: %#v", value))
} }
} else {
return false, nil
} }
}
return false, nil
} else { } else {
return false, fmt.Errorf("Unsupported filter: %#v %T", filter, filter) return false, fmt.Errorf("Unsupported filter: %#v %T", filter, filter)
} }