aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server.go12
-rw-r--r--server_search.go7
-rw-r--r--server_search_test.go14
-rw-r--r--server_test.go45
4 files changed, 16 insertions, 62 deletions
diff --git a/server.go b/server.go
index ffae8e7..071286c 100644
--- a/server.go
+++ b/server.go
@@ -12,10 +12,8 @@ import (
)
type BindFunc func(bindDN, bindSimplePw string, conn net.Conn) (LDAPResultCode, error)
+type SearchFunc func(boundDN string, req SearchRequest, conn net.Conn) (ServerSearchResult, error)
-type Searcher interface {
- Search(boundDN string, req SearchRequest, conn net.Conn) (ServerSearchResult, error)
-}
type Adder interface {
Add(boundDN string, req AddRequest, conn net.Conn) (LDAPResultCode, error)
}
@@ -47,8 +45,8 @@ type Closer interface {
//
type Server struct {
Bind BindFunc
+ Search SearchFunc
- SearchFns map[string]Searcher
AddFns map[string]Adder
ModifyFns map[string]Modifier
DeleteFns map[string]Deleter
@@ -84,7 +82,6 @@ func NewServer() *Server {
s := new(Server)
d := defaultHandler{}
- s.SearchFns = make(map[string]Searcher)
s.AddFns = make(map[string]Adder)
s.ModifyFns = make(map[string]Modifier)
s.DeleteFns = make(map[string]Deleter)
@@ -96,8 +93,8 @@ func NewServer() *Server {
s.CloseFns = make(map[string]Closer)
s.Bind = d.Bind
+ s.Search = d.Search
- s.SearchFunc("", d)
s.AddFunc("", d)
s.ModifyFunc("", d)
s.DeleteFunc("", d)
@@ -112,9 +109,6 @@ func NewServer() *Server {
s.closing = make(chan struct{})
return s
}
-func (server *Server) SearchFunc(baseDN string, f Searcher) {
- server.SearchFns[baseDN] = f
-}
func (server *Server) AddFunc(baseDN string, f Adder) {
server.AddFns[baseDN] = f
}
diff --git a/server_search.go b/server_search.go
index 2e21e12..aa290a3 100644
--- a/server_search.go
+++ b/server_search.go
@@ -26,12 +26,7 @@ func HandleSearchRequest(req *ber.Packet, controls *[]Control, messageID uint64,
return NewError(LDAPResultOperationsError, err)
}
- fnNames := []string{}
- for k := range server.SearchFns {
- fnNames = append(fnNames, k)
- }
- fn := routeFunc(searchReq.BaseDN, fnNames)
- searchResp, err := server.SearchFns[fn].Search(boundDN, searchReq, conn)
+ searchResp, err := server.Search(boundDN, searchReq, conn)
if err != nil {
return NewError(searchResp.ResultCode, err)
}
diff --git a/server_search_test.go b/server_search_test.go
index 1a59940..63d465d 100644
--- a/server_search_test.go
+++ b/server_search_test.go
@@ -14,7 +14,7 @@ func TestSearchSimpleOK(t *testing.T) {
defer s.Close()
ln, addr := mustListen()
go func() {
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -56,7 +56,7 @@ func TestSearchSizelimit(t *testing.T) {
ln, addr := mustListen()
go func() {
s.EnforceLDAP = true
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -150,7 +150,7 @@ func TestSearchPanic(t *testing.T) {
defer s.Close()
ln, addr := mustListen()
go func() {
- s.SearchFunc("", searchPanic{})
+ s.Search = SearchPanic
s.Bind = BindAnonOK
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -216,7 +216,7 @@ func TestSearchFiltering(t *testing.T) {
ln, addr := mustListen()
go func() {
s.EnforceLDAP = true
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -252,7 +252,7 @@ func TestSearchAttributes(t *testing.T) {
ln, addr := mustListen()
go func() {
s.EnforceLDAP = true
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -295,7 +295,7 @@ func TestSearchScope(t *testing.T) {
ln, addr := mustListen()
go func() {
s.EnforceLDAP = true
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -352,7 +352,7 @@ func TestSearchControls(t *testing.T) {
defer s.Close()
ln, addr := mustListen()
go func() {
- s.SearchFunc("", searchControls{})
+ s.Search = SearchControls
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
diff --git a/server_test.go b/server_test.go
index 79a1c07..29df06b 100644
--- a/server_test.go
+++ b/server_test.go
@@ -79,7 +79,7 @@ func TestBindSimpleOK(t *testing.T) {
defer s.Close()
ln, addr := mustListen()
go func() {
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindSimple
if err := s.Serve(ln); err != nil {
t.Errorf("s.Serve failed: %s", err.Error())
@@ -267,7 +267,7 @@ func TestSearchStats(t *testing.T) {
ln, addr := mustListen()
go func() {
- s.SearchFunc("", searchSimple{})
+ s.Search = SearchSimple
s.Bind = BindAnonOK
s.SetStats(true)
if err := s.Serve(ln); err != nil {
@@ -311,21 +311,11 @@ func BindSimple(bindDN, bindSimplePw string, conn net.Conn) (LDAPResultCode, err
return LDAPResultInvalidCredentials, nil
}
-func BindSimple2(bindDN, bindSimplePw string, conn net.Conn) (LDAPResultCode, error) {
- if bindDN == "cn=testy,o=testers,c=testz" && bindSimplePw == "ZLike2test" {
- return LDAPResultSuccess, nil
- }
- return LDAPResultInvalidCredentials, nil
-}
-
func BindPanic(bindDN, bindSimplePw string, conn net.Conn) (LDAPResultCode, error) {
panic("test panic at the disco")
}
-type searchSimple struct {
-}
-
-func (s searchSimple) Search(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
+func SearchSimple(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
entries := []*Entry{
&Entry{"cn=ned,o=testers,c=test", []*EntryAttribute{
&EntryAttribute{"cn", []string{"ned"}},
@@ -357,36 +347,11 @@ func (s searchSimple) Search(boundDN string, searchReq SearchRequest, conn net.C
return ServerSearchResult{entries, []string{}, []Control{}, LDAPResultSuccess}, nil
}
-type searchSimple2 struct {
-}
-
-func (s searchSimple2) Search(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
- entries := []*Entry{
- &Entry{"cn=hamburger,o=testers,c=testz", []*EntryAttribute{
- &EntryAttribute{"cn", []string{"hamburger"}},
- &EntryAttribute{"o", []string{"testers"}},
- &EntryAttribute{"uidNumber", []string{"5000"}},
- &EntryAttribute{"accountstatus", []string{"active"}},
- &EntryAttribute{"uid", []string{"hamburger"}},
- &EntryAttribute{"objectclass", []string{"posixaccount"}},
- }},
- }
- return ServerSearchResult{entries, []string{}, []Control{}, LDAPResultSuccess}, nil
-}
-
-type searchPanic struct {
-}
-
-func (s searchPanic) Search(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
- entries := []*Entry{}
+func SearchPanic(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
panic("this is a test panic")
- return ServerSearchResult{entries, []string{}, []Control{}, LDAPResultSuccess}, nil
-}
-
-type searchControls struct {
}
-func (s searchControls) Search(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
+func SearchControls(boundDN string, searchReq SearchRequest, conn net.Conn) (ServerSearchResult, error) {
entries := []*Entry{}
if len(searchReq.Controls) == 1 && searchReq.Controls[0].GetControlType() == "1.2.3.4.5" {
newEntry := &Entry{"cn=hamburger,o=testers,c=testz", []*EntryAttribute{