/
ldap.go
94 lines (84 loc) · 2.33 KB
/
ldap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main
import (
"github.com/go-ldap/ldap/v3"
"k8s.io/utils/env"
)
type Ldap struct {
connection *ldap.Conn
config *LdapConfig
logger appLoggerType
}
func NewLdap(cfg *LdapConfig, logger appLoggerType) (*Ldap, error) {
conn, err := ldap.DialURL(cfg.Address)
if err != nil {
logger.Fatalf("Failed to connect: %s\n", err)
return nil, err
}
_, err = conn.SimpleBind(&ldap.SimpleBindRequest{
Username: cfg.BindDN,
Password: env.GetString(cfg.BindPasswordEnvVar, "adminpassword"),
})
if err != nil {
logger.Fatalf("Failed to bind: %s\n", err)
return nil, err
}
return &Ldap{
connection: conn,
config: cfg,
logger: logger,
}, nil
}
func (l *Ldap) CreateUserFromRaw(raw map[string]any) (SourceUser, error) {
return NewLdapUser(raw)
}
func (l *Ldap) CreateGroupFromRaw(raw map[string]any) (SourceGroup, error) {
return NewLdapGroup(raw)
}
func (l *Ldap) GetUsers() ([]SourceUser, error) {
res, err := l.connection.Search(&ldap.SearchRequest{
BaseDN: l.config.BaseDN,
Filter: l.config.Users.Filter,
Attributes: []string{"*"},
Scope: ldap.ScopeWholeSubtree,
})
if err != nil {
return nil, err
}
var users []SourceUser
for _, entry := range res.Entries {
username := entry.GetAttributeValue(l.config.Users.UsernameAttributeType)
uid := entry.GetAttributeValue(l.config.Users.UIDAttributeType)
var firstName string
if l.config.Users.FirstNameAttributeType != nil {
firstName = entry.GetAttributeValue(*l.config.Users.FirstNameAttributeType)
}
users = append(users, LdapUser{
Username: username,
UID: uid,
FirstName: firstName})
}
return users, nil
}
func (l *Ldap) GetGroupsWithMembers() ([]SourceGroupWithMembers, error) {
res, err := l.connection.Search(&ldap.SearchRequest{
BaseDN: l.config.BaseDN,
Filter: l.config.Groups.Filter,
Attributes: []string{"*"},
Scope: ldap.ScopeWholeSubtree,
})
if err != nil {
return nil, err
}
var groups []SourceGroupWithMembers
for _, entry := range res.Entries {
groupname := entry.GetAttributeValue(l.config.Groups.GroupnameAttributeType)
members := entry.GetAttributeValues(l.config.Groups.MemberUIDAttributeType)
groups = append(groups, SourceGroupWithMembers{
SourceGroup: LdapGroup{
Groupname: groupname,
},
Members: NewStringSetFromItems(members...),
})
}
return groups, nil
}