Refactoring

pull/8/head
Alex 2 years ago
parent dc3fd4df65
commit 1a20a64eff
  1. 79
      main.go
  2. 40
      read.go
  3. 6
      util.go
  4. 44
      write.go

@ -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) {

Loading…
Cancel
Save