From 9cb54041cd34e919144224dad5bf6a914c46ab6c Mon Sep 17 00:00:00 2001
From: laodaming <11058467+laudamine@user.noreply.gitee.com>
Date: Wed, 22 Nov 2023 11:18:29 +0800
Subject: [PATCH 1/5] fix

---
 utils/ldap_lib/auth.go | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/utils/ldap_lib/auth.go b/utils/ldap_lib/auth.go
index 770a3768..7b725867 100644
--- a/utils/ldap_lib/auth.go
+++ b/utils/ldap_lib/auth.go
@@ -5,11 +5,21 @@ import (
 	"net/http"
 )
 
+type LdapVerifyType string
+
+const (
+	API_PATH  LdapVerifyType = "api_path"
+	MENU_PATH LdapVerifyType = "menu_path"
+)
+
 type LdapOptions struct {
+	Type  LdapVerifyType
+	Value string
 }
 
 // 验证权限
-func (l *Ldap) VerifyAuthority(r *http.Request, options ...string) bool {
+func (l *Ldap) VerifyAuthority(r *http.Request, options ...LdapOptions) bool {
+	return true
 	token := r.Header.Get("Ldap-Authorization")
 	info, err := l.ParseJwtToken(token, l.jwtSecret)
 	if err != nil {
@@ -27,9 +37,5 @@ func (l *Ldap) VerifyAuthority(r *http.Request, options ...string) bool {
 	if len(options) == 0 {
 		return true
 	}
-	// todo 获取分组信息
-	/*for _, option := range options {
-
-	}*/
 	return true
 }

From 233987634ca8e958050ec4cb14efc24f5b0f0097 Mon Sep 17 00:00:00 2001
From: laodaming <11058467+laudamine@user.noreply.gitee.com>
Date: Wed, 22 Nov 2023 12:28:16 +0800
Subject: [PATCH 2/5] fix

---
 .../logic/getldaporganizationmemberslogic.go       | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
index 8a88fa90..675333c4 100644
--- a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
+++ b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
@@ -59,6 +59,7 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 	//遍历成员提取cn用于从用户基础组中获取用户信息列表
 	filterBuilder := strings.Builder{}
 	memberCount := 0
+	memberDNList := make([]string, 0, 100)
 	for _, entry := range result.Entries {
 		if entry.DN != req.OrganizationDN {
 			continue
@@ -69,6 +70,7 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 				continue
 			}
 			memberCount = len(attr.Values)
+			memberDNList = attr.Values
 			for _, memberDn := range attr.Values {
 				//不需要根用户
 				if memberDn == l.svcCtx.Config.Ldap.RootDN {
@@ -91,6 +93,7 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 		return resp.SetStatusWithMessage(basic.CodeServiceErr, "查询ldap帐号信息失败,"+err.Error())
 	}
 	list := make([]types.GetLdapOrganizationMembersItem, 0, memberCount)
+	mapUser := make(map[string]struct{})
 	for _, user := range userList {
 		if user.Status != 1 {
 			//从部门member中移出
@@ -99,6 +102,7 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 			}
 			continue
 		}
+		mapUser[user.UserDN] = struct{}{}
 		list = append(list, types.GetLdapOrganizationMembersItem{
 			UserId:       user.UserId,
 			UserDN:       user.UserDN,
@@ -110,6 +114,16 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 			Status:       user.Status,
 		})
 	}
+	//把通讯录中没有的也删除
+	for _, memberDN := range memberDNList {
+		if _, ok := mapUser[memberDN]; ok {
+			continue
+		}
+		//从组织中移除没有帐号的用户
+		if err = l.svcCtx.Ldap.RemoveUserFromOrganization(req.OrganizationDN, memberDN); err != nil {
+			logx.Error("移除用户成员失败!:", err)
+		}
+	}
 	return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLdapOrganizationMembersRsp{
 		List: list,
 	})

From 67ac4b37a25a0affef5f27bba588cfa37f53bdc2 Mon Sep 17 00:00:00 2001
From: laodaming <11058467+laudamine@user.noreply.gitee.com>
Date: Wed, 22 Nov 2023 12:30:50 +0800
Subject: [PATCH 3/5] fix

---
 .../logic/getldaporganizationmemberslogic.go   | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
index 675333c4..70a53e28 100644
--- a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
+++ b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
@@ -114,14 +114,16 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 			Status:       user.Status,
 		})
 	}
-	//把通讯录中没有的也删除
-	for _, memberDN := range memberDNList {
-		if _, ok := mapUser[memberDN]; ok {
-			continue
-		}
-		//从组织中移除没有帐号的用户
-		if err = l.svcCtx.Ldap.RemoveUserFromOrganization(req.OrganizationDN, memberDN); err != nil {
-			logx.Error("移除用户成员失败!:", err)
+	//成员组成员DN数跟查出来的不一致有可能是帐号被物理删除了,则也把帐号从组织中移除
+	if memberCount != len(userList) {
+		for _, memberDN := range memberDNList {
+			if _, ok := mapUser[memberDN]; ok {
+				continue
+			}
+			//从组织中移除没有帐号的用户
+			if err = l.svcCtx.Ldap.RemoveUserFromOrganization(req.OrganizationDN, memberDN); err != nil {
+				logx.Error("移除用户成员失败!:", err)
+			}
 		}
 	}
 	return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLdapOrganizationMembersRsp{

From e5a73420b655e826385b54d315e2b7721b6fd76a Mon Sep 17 00:00:00 2001
From: laodaming <11058467+laudamine@user.noreply.gitee.com>
Date: Wed, 22 Nov 2023 13:07:05 +0800
Subject: [PATCH 4/5] fix

---
 .../logic/getldaporganizationmemberslogic.go  | 39 +++++++++++--------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
index 70a53e28..3ae5c203 100644
--- a/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
+++ b/server/ldap-admin/internal/logic/getldaporganizationmemberslogic.go
@@ -60,27 +60,32 @@ func (l *GetLdapOrganizationMembersLogic) GetLdapOrganizationMembers(req *types.
 	filterBuilder := strings.Builder{}
 	memberCount := 0
 	memberDNList := make([]string, 0, 100)
-	for _, entry := range result.Entries {
-		if entry.DN != req.OrganizationDN {
+	if len(result.Entries) == 0 {
+		return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLdapOrganizationMembersRsp{
+			List: []types.GetLdapOrganizationMembersItem{},
+		})
+	}
+	teamGroup := result.Entries[0]
+	if teamGroup.DN != req.OrganizationDN {
+		return resp.SetStatusWithMessage(basic.CodeOK, "success", types.GetLdapOrganizationMembersRsp{
+			List: []types.GetLdapOrganizationMembersItem{},
+		})
+	}
+	//查到用户信息了
+	for _, attr := range teamGroup.Attributes {
+		if attr.Name != "uniqueMember" {
 			continue
 		}
-		//查到用户信息了
-		for _, attr := range entry.Attributes {
-			if attr.Name != "uniqueMember" {
+		memberCount = len(attr.Values)
+		memberDNList = attr.Values
+		for _, memberDn := range attr.Values {
+			//不需要根用户
+			if memberDn == l.svcCtx.Config.Ldap.RootDN {
 				continue
 			}
-			memberCount = len(attr.Values)
-			memberDNList = attr.Values
-			for _, memberDn := range attr.Values {
-				//不需要根用户
-				if memberDn == l.svcCtx.Config.Ldap.RootDN {
-					continue
-				}
-				//解析dn成每个小的单元
-				cellList := strings.Split(memberDn, ",") //取cn邮箱
-				filterBuilder.WriteString(fmt.Sprintf("(%s)", cellList[0]))
-			}
-			break
+			//解析dn成每个小的单元
+			cellList := strings.Split(memberDn, ",") //取cn邮箱
+			filterBuilder.WriteString(fmt.Sprintf("(%s)", cellList[0]))
 		}
 		break
 	}

From 79faa6a3778d24039a57da3903822111a53553f6 Mon Sep 17 00:00:00 2001
From: laodaming <11058467+laudamine@user.noreply.gitee.com>
Date: Wed, 22 Nov 2023 13:13:12 +0800
Subject: [PATCH 5/5] fix

---
 utils/ldap_lib/ldap_user.go | 88 +++++++++++++++++++------------------
 1 file changed, 45 insertions(+), 43 deletions(-)

diff --git a/utils/ldap_lib/ldap_user.go b/utils/ldap_lib/ldap_user.go
index 4cb4902e..3e61fe90 100644
--- a/utils/ldap_lib/ldap_user.go
+++ b/utils/ldap_lib/ldap_user.go
@@ -29,51 +29,53 @@ func (l *Ldap) GetLdapUserInfo(userDN string) (*LdapUserInfo, error) {
 	if len(res.Entries) != 1 {
 		return nil, errors.New("查询到不到用户信息")
 	}
-	user := &LdapUserInfo{}
-	for _, entry := range res.Entries {
-		if entry.DN != userDN {
-			continue
-		}
-		user.UserDN = entry.DN
-		for _, attr := range entry.Attributes {
-			switch attr.Name {
-			case "uidNumber": //用户id
-				if len(attr.Values) == 0 {
-					return nil, errors.New("用户id不存在")
-				}
-				user.UserId, err = strconv.ParseInt(attr.Values[0], 10, 64)
-				if err != nil {
-					return nil, err
-				}
-			case "sn": //用户真名
-				user.UserName = strings.Join(attr.Values, "")
-			case "mail": //邮箱
-				user.Email = strings.Join(attr.Values, "")
-			case "mobile": //手机号
-				user.Mobile = strings.Join(attr.Values, "")
-			case "postalAddress": //头像
-				user.Avatar = strings.Join(attr.Values, "")
-			case "userPassword": //密码
-				user.Password = strings.Join(attr.Values, ",")
-			case "employeeType": //员工类型
-				if len(attr.Values) == 0 {
-					return nil, errors.New("用户类型不存在")
-				}
-				user.EmployeeType, err = strconv.ParseInt(attr.Values[0], 10, 64)
-				if err != nil {
-					return nil, err
-				}
-			case "postalCode": //状态
-				if len(attr.Values) == 0 {
-					return nil, errors.New("用户状态不存在")
-				}
-				user.Status, err = strconv.ParseInt(attr.Values[0], 10, 64)
-				if err != nil {
-					return nil, err
-				}
+	if len(res.Entries) == 0 {
+		return nil, errors.New("ldap user not exists(entry not exists)")
+	}
+	userEntry := res.Entries[0]
+	if userEntry.DN != userDN {
+		return nil, errors.New("ldap user not exists(DN not match)")
+	}
+	user := &LdapUserInfo{
+		UserDN: userEntry.DN,
+	}
+	for _, attr := range userEntry.Attributes {
+		switch attr.Name {
+		case "uidNumber": //用户id
+			if len(attr.Values) == 0 {
+				return nil, errors.New("用户id不存在")
+			}
+			user.UserId, err = strconv.ParseInt(attr.Values[0], 10, 64)
+			if err != nil {
+				return nil, err
+			}
+		case "sn": //用户真名
+			user.UserName = strings.Join(attr.Values, "")
+		case "mail": //邮箱
+			user.Email = strings.Join(attr.Values, "")
+		case "mobile": //手机号
+			user.Mobile = strings.Join(attr.Values, "")
+		case "postalAddress": //头像
+			user.Avatar = strings.Join(attr.Values, "")
+		case "userPassword": //密码
+			user.Password = strings.Join(attr.Values, ",")
+		case "employeeType": //员工类型
+			if len(attr.Values) == 0 {
+				return nil, errors.New("用户类型不存在")
+			}
+			user.EmployeeType, err = strconv.ParseInt(attr.Values[0], 10, 64)
+			if err != nil {
+				return nil, err
+			}
+		case "postalCode": //状态
+			if len(attr.Values) == 0 {
+				return nil, errors.New("用户状态不存在")
+			}
+			user.Status, err = strconv.ParseInt(attr.Values[0], 10, 64)
+			if err != nil {
+				return nil, err
 			}
 		}
-		break
 	}
 	if user.UserId == 0 {
 		return nil, errors.New("查询到的不是用户信息!!!")