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 {
2023-02-22 22:16:13 +08:00
modify1 := ldap . NewModifyRequest ( oldGroup . GroupDN , nil )
modify1 . 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
}
2023-02-22 22:16:13 +08:00
err = conn . Modify ( modify1 )
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 {
2023-02-22 22:16:13 +08:00
modify2 := ldap . NewModifyDNRequest ( oldGroup . GroupDN , newGroup . GroupDN , true , "" )
err := conn . ModifyDN ( modify2 )
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
}
2023-02-22 22:16:13 +08:00
// DelUserFromGroup 将用户从分组删除
func ( x GroupService ) ListGroupDN ( ) ( groups [ ] * model . Group , err error ) {
// Construct query request
searchRequest := ldap . NewSearchRequest (
config . Conf . Ldap . BaseDN , // This is basedn, we will start searching from this node.
ldap . ScopeWholeSubtree , ldap . NeverDerefAliases , 0 , 0 , false , // Here several parameters are respectively scope, derefAliases, sizeLimit, timeLimit, typesOnly
"(|(objectClass=organizationalUnit)(objectClass=groupOfUniqueNames))" , // This is Filter for LDAP query
[ ] string { "DN" } , // Here are the attributes returned by the query, provided as an array. If empty, all attributes are returned
nil ,
)
// 获取 LDAP 连接
conn , err := common . GetLDAPConn ( )
defer common . PutLADPConn ( conn )
if err != nil {
return groups , err
}
var sr * ldap . SearchResult
// Search through ldap built-in search
sr , err = conn . Search ( searchRequest )
if err != nil {
return nil , err
}
if len ( sr . Entries ) > 0 {
for _ , v := range sr . Entries {
groups = append ( groups , & model . Group {
GroupDN : v . DN ,
} )
}
}
return
}