From edcc7f43a96fb622f3ecdc444ad3a09e57511dd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 6 Dec 2019 14:33:19 +0100 Subject: [PATCH] Read more attributes from LDAP and implement /v1.0/users/{userID} --- pkg/service/v0/service.go | 68 ++++++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/pkg/service/v0/service.go b/pkg/service/v0/service.go index 97adfa3a92..ab8057a9de 100644 --- a/pkg/service/v0/service.go +++ b/pkg/service/v0/service.go @@ -2,6 +2,7 @@ package svc import ( "encoding/json" + "fmt" "net/http" "github.com/go-chi/chi" @@ -30,8 +31,15 @@ func NewService(opts ...Option) Service { mux: m, } - m.HandleFunc("/v1.0/me", svc.Me) - m.HandleFunc("/v1.0/users", svc.Users) + m.Route("/v1.0", func(r chi.Router) { + r.Get("/me", svc.Me) + r.Route("/users", func(r chi.Router) { + r.Get("/", svc.Users) + r.Route("/{userId}", func(r chi.Router) { + r.Get("/", svc.Users) + }) + }) + }) return svc } @@ -67,6 +75,12 @@ func (g Graph) Me(w http.ResponseWriter, r *http.Request) { // Users implements the Service interface. func (g Graph) Users(w http.ResponseWriter, r *http.Request) { + userID := chi.URLParam(r, "userId") + filter := "(objectclass=*)" + if userID != "" { + filter = fmt.Sprintf("(entryuuid=%s)", userID) + } + con, err := ldap.Dial("tcp", "localhost:10389") if err != nil { @@ -82,19 +96,20 @@ func (g Graph) Users(w http.ResponseWriter, r *http.Request) { } search := ldap.NewSearchRequest( - "ou=groups,dc=example,dc=org", + "ou=users,dc=example,dc=org", ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, - "(objectclass=*)", - []string{ - "dn", - "uuid", + filter, + []string{"dn", "uid", - "givenName", + "givenname", "mail", + "displayname", + "entryuuid", + "sn", }, nil, ) @@ -107,14 +122,24 @@ func (g Graph) Users(w http.ResponseWriter, r *http.Request) { return } - users := make([]*msgraph.User, len(result.Entries)) + if userID != "" { + if len(result.Entries) == 0 { + w.WriteHeader(http.StatusNotFound) + return + } + user := createUserModelFromLDAP(result.Entries[0]) + render.Status(r, http.StatusOK) + render.JSON(w, r, user) + return + } + + var users []*msgraph.User for _, user := range result.Entries { users = append( users, - createUserModel( - user.DN, - "1234-5678-9000-000", + createUserModelFromLDAP( + user, ), ) } @@ -134,3 +159,22 @@ func createUserModel(displayName string, id string) *msgraph.User { }, } } + +func createUserModelFromLDAP(entry *ldap.Entry) *msgraph.User { + displayName := entry.GetAttributeValue("displayname") + givenName := entry.GetAttributeValue("givenname") + mail := entry.GetAttributeValue("mail") + surName := entry.GetAttributeValue("sn") + id := entry.GetAttributeValue("entryuuid") + return &msgraph.User{ + DisplayName: &displayName, + GivenName: &givenName, + Surname: &surName, + Mail: &mail, + DirectoryObject: msgraph.DirectoryObject{ + Entity: msgraph.Entity{ + ID: &id, + }, + }, + } +}