2022-05-18 17:57:03 +08:00
|
|
|
|
package ildap
|
|
|
|
|
|
|
|
|
|
import (
|
2022-05-28 22:22:36 +08:00
|
|
|
|
"errors"
|
2022-05-29 10:06:21 +08:00
|
|
|
|
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/config"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/model"
|
|
|
|
|
"github.com/eryajf/go-ldap-admin/public/common"
|
2022-05-18 17:57:03 +08:00
|
|
|
|
|
|
|
|
|
ldap "github.com/go-ldap/ldap/v3"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type GroupService struct{}
|
|
|
|
|
|
|
|
|
|
// Add 添加资源
|
2022-06-14 11:17:38 +08:00
|
|
|
|
func (x GroupService) Add(g *model.Group) error { //organizationalUnit
|
|
|
|
|
if g.Remark == "" {
|
|
|
|
|
g.Remark = g.GroupName
|
2022-05-28 22:22:36 +08:00
|
|
|
|
}
|
2022-06-14 11:17:38 +08:00
|
|
|
|
add := ldap.NewAddRequest(g.GroupDN, nil)
|
2022-05-28 22:22:36 +08:00
|
|
|
|
if g.GroupType == "ou" {
|
|
|
|
|
add.Attribute("objectClass", []string{"organizationalUnit", "top"}) // 如果定义了 groupOfNAmes,那么必须指定member,否则报错如下:object class 'groupOfNames' requires attribute 'member'
|
|
|
|
|
}
|
|
|
|
|
if g.GroupType == "cn" {
|
|
|
|
|
add.Attribute("objectClass", []string{"groupOfUniqueNames", "top"})
|
2022-06-14 12:08:16 +08:00
|
|
|
|
add.Attribute("uniqueMember", []string{config.Conf.Ldap.AdminDN}) // 所以这里创建组的时候,默认将admin加入其中,以免创建时没有人员而报上边的错误
|
2022-05-28 22:22:36 +08:00
|
|
|
|
}
|
|
|
|
|
add.Attribute(g.GroupType, []string{g.GroupName})
|
2022-05-18 17:57:03 +08:00
|
|
|
|
add.Attribute("description", []string{g.Remark})
|
|
|
|
|
|
2022-07-24 21:24:08 +08:00
|
|
|
|
// 获取 LDAP 连接
|
|
|
|
|
conn, err := common.GetLDAPConn()
|
|
|
|
|
defer common.PutLADPConn(conn)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return conn.Add(add)
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// UpdateGroup 更新一个分组
|
2022-06-14 11:17:38 +08:00
|
|
|
|
func (x GroupService) Update(oldGroup, newGroup *model.Group) error {
|
|
|
|
|
modify := ldap.NewModifyRequest(oldGroup.GroupDN, nil)
|
|
|
|
|
modify.Replace("description", []string{newGroup.Remark})
|
2022-07-24 21:24:08 +08:00
|
|
|
|
|
|
|
|
|
// 获取 LDAP 连接
|
|
|
|
|
conn, err := common.GetLDAPConn()
|
|
|
|
|
defer common.PutLADPConn(conn)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = conn.Modify(modify)
|
2022-06-14 11:17:38 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
2022-05-28 22:22:36 +08:00
|
|
|
|
}
|
|
|
|
|
// 如果配置文件允许修改分组名称,且分组名称发生了变化,那么执行修改分组名称
|
2022-06-14 12:08:16 +08:00
|
|
|
|
if config.Conf.Ldap.GroupNameModify && newGroup.GroupName != oldGroup.GroupName {
|
2022-06-14 11:17:38 +08:00
|
|
|
|
modify := ldap.NewModifyDNRequest(oldGroup.GroupDN, newGroup.GroupDN, true, "")
|
2022-07-24 21:24:08 +08:00
|
|
|
|
err := conn.ModifyDN(modify)
|
2022-05-28 22:22:36 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Delete 删除资源
|
2022-06-14 11:17:38 +08:00
|
|
|
|
func (x GroupService) Delete(gdn string) error {
|
|
|
|
|
del := ldap.NewDelRequest(gdn, nil)
|
2022-07-24 21:24:08 +08:00
|
|
|
|
|
|
|
|
|
// 获取 LDAP 连接
|
|
|
|
|
conn, err := common.GetLDAPConn()
|
|
|
|
|
defer common.PutLADPConn(conn)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return conn.Del(del)
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AddUserToGroup 添加用户到分组
|
2022-05-28 22:22:36 +08:00
|
|
|
|
func (x GroupService) AddUserToGroup(dn, udn string) error {
|
|
|
|
|
//判断dn是否以ou开头
|
|
|
|
|
if dn[:3] == "ou=" {
|
|
|
|
|
return errors.New("不能添加用户到OU组织单元")
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|
2022-05-28 22:22:36 +08:00
|
|
|
|
newmr := ldap.NewModifyRequest(dn, nil)
|
|
|
|
|
newmr.Add("uniqueMember", []string{udn})
|
2022-07-24 21:24:08 +08:00
|
|
|
|
|
|
|
|
|
// 获取 LDAP 连接
|
|
|
|
|
conn, err := common.GetLDAPConn()
|
|
|
|
|
defer common.PutLADPConn(conn)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return conn.Modify(newmr)
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DelUserFromGroup 将用户从分组删除
|
2022-06-14 11:17:38 +08:00
|
|
|
|
func (x GroupService) RemoveUserFromGroup(gdn, udn string) error {
|
2022-05-18 17:57:03 +08:00
|
|
|
|
newmr := ldap.NewModifyRequest(gdn, nil)
|
2022-05-28 22:22:36 +08:00
|
|
|
|
newmr.Delete("uniqueMember", []string{udn})
|
2022-07-24 21:24:08 +08:00
|
|
|
|
|
|
|
|
|
// 获取 LDAP 连接
|
|
|
|
|
conn, err := common.GetLDAPConn()
|
|
|
|
|
defer common.PutLADPConn(conn)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return conn.Modify(newmr)
|
2022-05-18 17:57:03 +08:00
|
|
|
|
}
|