Fix nested LDAP group resolution

This commit is contained in:
Fabian Schultis 2022-12-07 05:01:06 +01:00
parent 6f463ac9a5
commit a2ab5c9301
2 changed files with 18 additions and 7 deletions

View File

@ -114,7 +114,7 @@ func NewConfig() *Config {
cfg.LDAP.AdminLdapGroup = "CN=WireGuardAdmins,OU=_O_IT,DC=COMPANY,DC=LOCAL"
cfg.LDAP.LoginFilter = "(&(objectClass=organizationalPerson)(mail={{login_identifier}})(!userAccountControl:1.2.840.113556.1.4.803:=2))"
cfg.LDAP.SyncFilter = "(&(objectClass=organizationalPerson)(!userAccountControl:1.2.840.113556.1.4.803:=2)(mail=*))"
cfg.LDAP.SyncGroupFilter = "(&(objectCategory=group))"
cfg.LDAP.SyncGroupFilter = "(&(objectClass=group))"
cfg.WG.DeviceNames = []string{"wg0"}
cfg.WG.DefaultDeviceName = "wg0"

View File

@ -4,14 +4,13 @@ import (
"strings"
"time"
gldap "github.com/go-ldap/ldap/v3"
"github.com/h44z/wg-portal/internal/wireguard"
"github.com/h44z/wg-portal/internal/ldap"
"github.com/h44z/wg-portal/internal/users"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
gldap "github.com/go-ldap/ldap/v3"
)
func (s *Server) SyncLdapWithUserDatabase() {
@ -48,21 +47,33 @@ func (s *Server) SyncLdapWithUserDatabase() {
logrus.Info("ldap user synchronization stopped")
}
func (s Server) userIsInAdminGroup(ldapData *ldap.RawLdapData, ldapGroupData []ldap.RawLdapData) bool {
func (s Server) userIsInAdminGroup(ldapData *ldap.RawLdapData, ldapGroupData []ldap.RawLdapData, layer int) bool {
if s.config.LDAP.EveryoneAdmin {
return true
}
if s.config.LDAP.AdminLdapGroup_ == nil {
return false
}
//fmt.Printf("%+v\n", ldapData.Attributes)
var prefix string
for i := 0; i < layer; i++ {
prefix += "+"
}
logrus.Tracef("%s Group layer: %d\n", prefix, layer)
for _, group := range ldapData.RawAttributes[s.config.LDAP.GroupMemberAttribute] {
logrus.Tracef("%s%s\n", prefix, string(group))
var dn, _ = gldap.ParseDN(string(group))
if s.config.LDAP.AdminLdapGroup_.Equal(dn) {
logrus.Tracef("%sFOUND: %s\n", prefix, string(group))
return true
}
for _, group2 := range ldapGroupData {
if group2.DN == string(group) {
return s.userIsInAdminGroup(&group2, ldapGroupData)
logrus.Tracef("%sChecking nested: %s\n", prefix, group2.DN)
isAdmin := s.userIsInAdminGroup(&group2, ldapGroupData, layer+1)
if isAdmin {
return true
}
}
}
}
@ -90,7 +101,7 @@ func (s Server) userChangedInLdap(user *users.User, ldapData *ldap.RawLdapData,
return true
}
if user.IsAdmin != s.userIsInAdminGroup(ldapData, ldapGroupData) {
if user.IsAdmin != s.userIsInAdminGroup(ldapData, ldapGroupData, 0) {
return true
}
@ -165,7 +176,7 @@ func (s *Server) updateLdapUsers(ldapUsers []ldap.RawLdapData, ldapGroups []ldap
user.Lastname = ldapUsers[i].Attributes[s.config.LDAP.LastNameAttribute]
user.Email = ldapUsers[i].Attributes[s.config.LDAP.EmailAttribute]
user.Phone = ldapUsers[i].Attributes[s.config.LDAP.PhoneAttribute]
user.IsAdmin = s.userIsInAdminGroup(&ldapUsers[i], ldapGroups)
user.IsAdmin = s.userIsInAdminGroup(&ldapUsers[i], ldapGroups, 0)
user.Source = users.UserSourceLdap
user.DeletedAt = gorm.DeletedAt{} // Not deleted