From 09931d85c0ffc965b063db4b63071e121106dfaf Mon Sep 17 00:00:00 2001 From: Viktor Kojouharov Date: Wed, 3 Jul 2019 21:24:33 +0300 Subject: Add support for retrieving all user attributes (#5) --- server_search.go | 5 +++-- server_search_test.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/server_search.go b/server_search.go index 3fc91c5..b4f7a5f 100644 --- a/server_search.go +++ b/server_search.go @@ -3,9 +3,10 @@ package ldap import ( "errors" "fmt" - "github.com/nmcclain/asn1-ber" "net" "strings" + + ber "github.com/nmcclain/asn1-ber" ) func HandleSearchRequest(req *ber.Packet, controls *[]Control, messageID uint64, boundDN string, server *Server, conn net.Conn) (resultErr error) { @@ -161,7 +162,7 @@ func filterAttributes(entry *Entry, attributes []string) (*Entry, error) { for _, attr := range entry.Attributes { for _, requested := range attributes { - if strings.ToLower(attr.Name) == strings.ToLower(requested) { + if requested == "*" || strings.ToLower(attr.Name) == strings.ToLower(requested) { newAttributes = append(newAttributes, attr) } } diff --git a/server_search_test.go b/server_search_test.go index ed6b6d6..5a083b0 100644 --- a/server_search_test.go +++ b/server_search_test.go @@ -339,6 +339,58 @@ func TestSearchAttributes(t *testing.T) { quit <- true } +func TestSearchAllUserAttributes(t *testing.T) { + quit := make(chan bool) + done := make(chan bool) + go func() { + s := NewServer() + s.EnforceLDAP = true + s.QuitChannel(quit) + s.SearchFunc("", searchSimple{}) + s.BindFunc("", bindSimple{}) + if err := s.ListenAndServe(listenString); err != nil { + t.Errorf("s.ListenAndServe failed: %s", err.Error()) + } + }() + + go func() { + filterString := "" + cmd := exec.Command("ldapsearch", "-H", ldapURL, "-x", + "-b", serverBaseDN, "-D", "cn=testy,"+serverBaseDN, "-w", "iLike2test", filterString, "*") + out, _ := cmd.CombinedOutput() + + if !strings.Contains(string(out), "dn: cn=ned,o=testers,c=test") { + t.Errorf("ldapsearch failed - missing requested DN attribute: %v", string(out)) + } + if !strings.Contains(string(out), "cn: ned") { + t.Errorf("ldapsearch failed - missing requested CN attribute: %v", string(out)) + } + if !strings.Contains(string(out), "uidNumber") { + t.Errorf("ldapsearch failed - missing requested uidNumber attribute: %v", string(out)) + } + if !strings.Contains(string(out), "accountstatus") { + t.Errorf("ldapsearch failed - missing requested accountstatus attribute: %v", string(out)) + } + if !strings.Contains(string(out), "o: ate") { + t.Errorf("ldapsearch failed - missing requested o attribute: %v", string(out)) + } + if !strings.Contains(string(out), "description") { + t.Errorf("ldapsearch failed - missing requested description attribute: %v", string(out)) + } + if !strings.Contains(string(out), "objectclass") { + t.Errorf("ldapsearch failed - missing requested objectclass attribute: %v", string(out)) + } + done <- true + }() + + select { + case <-done: + case <-time.After(timeout): + t.Errorf("ldapsearch command timed out") + } + quit <- true +} + ///////////////////////// func TestSearchScope(t *testing.T) { quit := make(chan bool) -- cgit v1.2.3