diff options
-rw-r--r-- | main.go | 79 | ||||
-rw-r--r-- | read.go | 40 | ||||
-rw-r--r-- | util.go | 6 | ||||
-rw-r--r-- | write.go | 44 |
4 files changed, 87 insertions, 82 deletions
@@ -10,7 +10,6 @@ import ( "io/ioutil" "os" "os/signal" - "strings" "syscall" ldap "bottin/ldapserver" @@ -358,84 +357,6 @@ func (server *Server) init() error { return nil } -func (server *Server) putAttributes(dn string, attrs Entry) error { - prefix, err := dnToConsul(dn) - if err != nil { - return err - } - - for k, valuesNC := range attrs { - path := prefix + "/attribute=" + k - - // Trim spaces and remove empty values - values := []string{} - for _, v := range valuesNC { - vv := strings.TrimSpace(v) - if len(vv) > 0 { - values = append(values, vv) - } - } - - // If we have zero values, delete associated k/v pair - // Otherwise, write new values - if len(values) == 0 { - _, err := server.kv.Delete(path, nil) - if err != nil { - return err - } - } else { - json, err := json.MarshalIndent(values, "", " ") - if err != nil { - return err - } - pair := &consul.KVPair{Key: path, Value: json} - _, err = server.kv.Put(pair, nil) - if err != nil { - return err - } - } - } - return nil -} - -func (server *Server) getAttribute(dn string, attr string) ([]string, error) { - path, err := dnToConsul(dn) - if err != nil { - return nil, err - } - - pairs, _, err := server.kv.List(path+"/attribute=", &server.readOpts) - if err != nil { - return nil, err - } - - values := []string{} - for _, pair := range pairs { - if strings.EqualFold(pair.Key, path+"/attribute="+attr) { - newVals, err := parseValue(pair.Value) - if err != nil { - return nil, err - } - values = append(values, newVals...) - } - } - - return values, nil -} - -func (server *Server) objectExists(dn string) (bool, error) { - prefix, err := dnToConsul(dn) - if err != nil { - return false, err - } - - data, _, err := server.kv.List(prefix+"/attribute=", &server.readOpts) - if err != nil { - return false, err - } - return len(data) > 0, nil -} - func (server *Server) checkDN(dn string, allow_extend bool) (string, error) { // 1. Canonicalize: remove spaces between things and put all in lower case dn, err := canonicalDN(dn) @@ -9,6 +9,46 @@ import ( message "github.com/lor00x/goldap/message" ) +// Generic read utility functions ---------- + +func (server *Server) getAttribute(dn string, attr string) ([]string, error) { + path, err := dnToConsul(dn) + if err != nil { + return nil, err + } + + pairs, _, err := server.kv.List(path+"/attribute=", &server.readOpts) + if err != nil { + return nil, err + } + + values := []string{} + for _, pair := range pairs { + if strings.EqualFold(pair.Key, path+"/attribute="+attr) { + newVals, err := parseValue(pair.Value) + if err != nil { + return nil, err + } + values = append(values, newVals...) + } + } + + return values, nil +} + +func (server *Server) objectExists(dn string) (bool, error) { + prefix, err := dnToConsul(dn) + if err != nil { + return false, err + } + + data, _, err := server.kv.List(prefix+"/attribute=", &server.readOpts) + if err != nil { + return false, err + } + return len(data) > 0, nil +} + // Compare request ------------------------- func (server *Server) handleCompare(s ldap.UserState, w ldap.ResponseWriter, m *ldap.Message) { @@ -64,15 +64,15 @@ func parseValue(value []byte) ([]string, error) { func parseConsulResult(data []*consul.KVPair) (map[string]Entry, error) { aggregator := map[string]Entry{} - for _, kv := range data { - dn, attr, err := consulToDN(kv.Key) + for _, pair := range data { + dn, attr, err := consulToDN(pair.Key) if err != nil { continue } if _, exists := aggregator[dn]; !exists { aggregator[dn] = Entry{} } - value, err := parseValue(kv.Value) + value, err := parseValue(pair.Value) if err != nil { return nil, err } @@ -1,14 +1,58 @@ package main import ( + "encoding/json" "fmt" "strings" ldap "bottin/ldapserver" + consul "github.com/hashicorp/consul/api" message "github.com/lor00x/goldap/message" ) +// Generic item modification function -------- + +func (server *Server) putAttributes(dn string, attrs Entry) error { + prefix, err := dnToConsul(dn) + if err != nil { + return err + } + + for k, valuesNC := range attrs { + path := prefix + "/attribute=" + k + + // Trim spaces and remove empty values + values := []string{} + for _, v := range valuesNC { + vv := strings.TrimSpace(v) + if len(vv) > 0 { + values = append(values, vv) + } + } + + // If we have zero values, delete associated k/v pair + // Otherwise, write new values + if len(values) == 0 { + _, err := server.kv.Delete(path, nil) + if err != nil { + return err + } + } else { + json, err := json.MarshalIndent(values, "", " ") + if err != nil { + return err + } + pair := &consul.KVPair{Key: path, Value: json} + _, err = server.kv.Put(pair, nil) + if err != nil { + return err + } + } + } + return nil +} + // Add request ------------------------ func (server *Server) handleAdd(s ldap.UserState, w ldap.ResponseWriter, m *ldap.Message) { |