diff --git a/ldap/server.go b/ldap/server.go index a311213f..433ff8b7 100644 --- a/ldap/server.go +++ b/ldap/server.go @@ -113,6 +113,9 @@ func handleSearch(w ldap.ResponseWriter, m *ldap.Message) { for _, attr := range r.Attributes() { e.AddAttribute(message.AttributeDescription(attr), getAttribute(string(attr), user)) + if string(attr) == "cn" { + e.AddAttribute(message.AttributeDescription(attr), getAttribute("title", user)) + } } w.Write(e) diff --git a/ldap/util.go b/ldap/util.go index ecc32699..a196c47f 100644 --- a/ldap/util.go +++ b/ldap/util.go @@ -74,6 +74,15 @@ func getUsername(filter string) string { return name } +func stringInSlice(value string, list []string) bool { + for _, item := range list { + if item == value { + return true + } + } + return false +} + func GetFilteredUsers(m *ldap.Message) (filteredUsers []*object.User, code int) { r := m.GetSearchRequest() @@ -94,13 +103,32 @@ func GetFilteredUsers(m *ldap.Message) (filteredUsers []*object.User, code int) return nil, ldap.LDAPResultInsufficientAccessRights } } else { - hasPermission, err := object.CheckUserPermission(fmt.Sprintf("%s/%s", m.Client.OrgName, m.Client.UserName), fmt.Sprintf("%s/%s", org, name), true, "en") + requestUserId := util.GetId(m.Client.OrgName, m.Client.UserName) + userId := util.GetId(org, name) + + hasPermission, err := object.CheckUserPermission(requestUserId, userId, true, "en") if !hasPermission { log.Printf("ErrMsg = %v", err.Error()) return nil, ldap.LDAPResultInsufficientAccessRights } - user := object.GetUser(util.GetId(org, name)) - filteredUsers = append(filteredUsers, user) + + user := object.GetUser(userId) + if user != nil { + filteredUsers = append(filteredUsers, user) + return filteredUsers, ldap.LDAPResultSuccess + } + + organization := object.GetOrganization(util.GetId("admin", org)) + if organization == nil { + return nil, ldap.LDAPResultNoSuchObject + } + + if !stringInSlice(name, organization.Tags) { + return nil, ldap.LDAPResultNoSuchObject + } + + users := object.GetUsersByTag(org, name) + filteredUsers = append(filteredUsers, users...) return filteredUsers, ldap.LDAPResultSuccess } } @@ -130,12 +158,16 @@ func getAttribute(attributeName string, user *object.User) message.AttributeValu return message.AttributeValue(user.Name) case "uid": return message.AttributeValue(user.Name) + case "displayname": + return message.AttributeValue(user.DisplayName) case "email": return message.AttributeValue(user.Email) case "mail": return message.AttributeValue(user.Email) case "mobile": return message.AttributeValue(user.Phone) + case "title": + return message.AttributeValue(user.Tag) case "userPassword": return message.AttributeValue(getUserPasswordWithType(user)) default: diff --git a/object/check.go b/object/check.go index 315b98e2..79d57e3f 100644 --- a/object/check.go +++ b/object/check.go @@ -282,6 +282,10 @@ func CheckUserPermission(requestUserId, userId string, strict bool, lang string) if userId != "" { targetUser := GetUser(userId) if targetUser == nil { + if strings.HasPrefix(requestUserId, "built-in/") { + return true, nil + } + return false, fmt.Errorf(i18n.Translate(lang, "general:The user: %s doesn't exist"), userId) } diff --git a/object/user.go b/object/user.go index 0c91edb6..34839a7c 100644 --- a/object/user.go +++ b/object/user.go @@ -250,6 +250,16 @@ func GetUsers(owner string) []*User { return users } +func GetUsersByTag(owner string, tag string) []*User { + users := []*User{} + err := adapter.Engine.Desc("created_time").Find(&users, &User{Owner: owner, Tag: tag}) + if err != nil { + panic(err) + } + + return users +} + func GetSortedUsers(owner string, sorter string, limit int) []*User { users := []*User{} err := adapter.Engine.Desc(sorter).Limit(limit, 0).Find(&users, &User{Owner: owner})