master
go 83 lines 1.38 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package openldap
4
5 import (
6 "net"
7
8 "github.com/go-ldap/ldap/v3"
9
10 "github.com/netdata/netdata/go/plugins/pkg/tlscfg"
11 )
12
13 type ldapConn interface {
14 connect() error
15 disconnect() error
16 search(*ldap.SearchRequest) (*ldap.SearchResult, error)
17 }
18
19 func newLdapConn(cfg Config) ldapConn {
20 return &ldapClient{Config: cfg}
21 }
22
23 type ldapClient struct {
24 Config
25
26 conn *ldap.Conn
27 }
28
29 func (c *ldapClient) search(req *ldap.SearchRequest) (*ldap.SearchResult, error) {
30 return c.conn.Search(req)
31 }
32
33 func (c *ldapClient) connect() error {
34 opts, err := c.connectOpts()
35 if err != nil {
36 return err
37 }
38
39 conn, err := ldap.DialURL(c.URL, opts...)
40 if err != nil {
41 return err
42 }
43
44 if c.Password == "" {
45 err = conn.UnauthenticatedBind(c.Username)
46 } else {
47 err = conn.Bind(c.Username, c.Password)
48 }
49 if err != nil {
50 _ = conn.Close()
51 return err
52 }
53
54 c.conn = conn
55
56 return nil
57 }
58
59 func (c *ldapClient) connectOpts() ([]ldap.DialOpt, error) {
60 d := &net.Dialer{
61 Timeout: c.Timeout.Duration(),
62 }
63
64 opts := []ldap.DialOpt{ldap.DialWithDialer(d)}
65
66 tlsConf, err := tlscfg.NewTLSConfig(c.TLSConfig)
67 if err != nil {
68 return nil, err
69 }
70 if tlsConf != nil {
71 opts = append(opts, ldap.DialWithTLSConfig(tlsConf))
72 }
73
74 return opts, nil
75 }
76
77 func (c *ldapClient) disconnect() error {
78 defer func() { c.conn = nil }()
79 if c.conn != nil {
80 return c.conn.Close()
81 }
82 return nil
83 }