@@ -15,7 +15,7 @@ import (
1515
1616 // Packages
1717 ldap "github.com/go-ldap/ldap/v3"
18- "github.com/mutablelogic/go-server"
18+ server "github.com/mutablelogic/go-server"
1919 httpresponse "github.com/mutablelogic/go-server/pkg/httpresponse"
2020 schema "github.com/mutablelogic/go-server/pkg/ldap/schema"
2121 ref "github.com/mutablelogic/go-server/pkg/ref"
@@ -33,8 +33,8 @@ type Manager struct {
3333 user , pass string
3434 dn * schema.DN
3535 conn * ldap.Conn
36- users * schema.Group
37- groups * schema.Group
36+ users * schema.ObjectType
37+ groups * schema.ObjectType
3838}
3939
4040var _ server.LDAP = (* Manager )(nil )
@@ -103,7 +103,7 @@ func NewManager(opt ...Opt) (*Manager, error) {
103103 self .dn = o .dn
104104 }
105105
106- // Set the schemas for users, groups
106+ // Set the object types for users, groups
107107 self .users = o .users
108108 self .groups = o .groups
109109
@@ -637,6 +637,73 @@ func (manager *Manager) ListAttributeTypes(ctx context.Context) ([]*schema.Attri
637637///////////////////////////////////////////////////////////////////////////////
638638// PUBLIC METHODS - USERS AND GROUPS
639639
640+ // Create a user
641+ func (manager * Manager ) CreateUser (ctx context.Context , user string , attrs url.Values ) (* schema.Object , error ) {
642+ if manager .users == nil {
643+ return nil , httpresponse .ErrBadRequest .With ("User schema not set" )
644+ }
645+
646+ // Create the object template
647+ object , err := manager .users .New (user , attrs )
648+ if err != nil {
649+ return nil , httpresponse .ErrBadRequest .With (err )
650+ }
651+
652+ // Make absolute DN
653+ absdn , err := manager .absdn (object .DN )
654+ if err != nil {
655+ return nil , err
656+ }
657+
658+ // TODO: Uid
659+ fmt .Println (absdn , object )
660+
661+ // Create the user
662+ return manager .Create (ctx , absdn .String (), object .Values )
663+
664+ // TODO: Groups
665+ }
666+
667+ /*
668+ // If the uid is not set, then set it to the next available uid
669+ var nextId int
670+ uid, err := ldap.SearchOne("(&(objectclass=device)(cn=lastuid))")
671+ if err != nil {
672+ return nil, err
673+ } else if uid == nil {
674+ return nil, ErrNotImplemented.With("lastuid not found")
675+ } else if uid_, err := strconv.ParseInt(uid.Get("serialNumber"), 10, 32); err != nil {
676+ return nil, ErrNotImplemented.With("lastuid not found")
677+ } else {
678+ nextId = int(uid_) + 1
679+ if err := schema.OptUserId(int(uid_))(o); err != nil {
680+ return nil, err
681+ }
682+ }
683+
684+ // Create the request
685+ addReq := goldap.NewAddRequest(o.DN, []goldap.Control{})
686+ for name, values := range o.Values {
687+ addReq.Attribute(name, values)
688+ }
689+
690+ // Request -> Response
691+ if err := ldap.conn.Add(addReq); err != nil {
692+ return nil, err
693+ }
694+
695+ // Increment the uid
696+ if uid != nil && nextId > 0 {
697+ modify := goldap.NewModifyRequest(uid.DN, []goldap.Control{})
698+ modify.Replace("serialNumber", []string{fmt.Sprint(nextId)})
699+ if err := ldap.conn.Modify(modify); err != nil {
700+ return nil, err
701+ }
702+ }
703+
704+ // TODO: Add the user to a group
705+ */
706+
640707// Return all users
641708func (manager * Manager ) ListUsers (ctx context.Context , request schema.ObjectListRequest ) ([]* schema.ObjectList , error ) {
642709 // TODO
@@ -661,12 +728,6 @@ func (manager *Manager) GetGroup(ctx context.Context, dn string) (*schema.Object
661728 return nil , httpresponse .ErrNotImplemented .With ("GetGroup not implemented" )
662729}
663730
664- // Create a user
665- func (manager * Manager ) CreateUser (ctx context.Context , user string , attrs url.Values ) (* schema.Object , error ) {
666- // TODO
667- return nil , httpresponse .ErrNotImplemented .With ("CreateUser not implemented" )
668- }
669-
670731// Create a group
671732func (manager * Manager ) CreateGroup (ctx context.Context , group string , attrs url.Values ) (* schema.Object , error ) {
672733 // TODO
0 commit comments