-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterface.go
More file actions
121 lines (110 loc) · 3.08 KB
/
interface.go
File metadata and controls
121 lines (110 loc) · 3.08 KB
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package ldappool
import (
"context"
"github.com/go-ldap/ldap/v3"
)
func (dir *Directory) StickyConn(ctx context.Context, fn func(stickyConn *ldap.Conn) error) error {
var dc *conn
var err error
err = dir.retry(func(strategy connReuseStrategy) error {
dc, err = dir.conn(ctx, strategy)
return err
})
if err != nil {
return err
}
defer dc.releaseConn(err)
dc.Lock()
defer dc.Unlock()
dc.needRebind = true
return fn(dc.internal)
}
func (dir *Directory) Search(ctx context.Context, searchRequest *ldap.SearchRequest) (res *ldap.SearchResult, err error) {
err = dir.retry(func(strategy connReuseStrategy) error {
res, err = dir.search(ctx, searchRequest, strategy)
return err
})
return res, err
}
func (dir *Directory) search(ctx context.Context, req *ldap.SearchRequest, strategy connReuseStrategy) (*ldap.SearchResult, error) {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return nil, err
}
defer dc.releaseConn(err)
dc.Lock()
res, err := dc.internal.Search(req)
dc.Unlock()
return res, err
}
func (dir *Directory) SearchWithPaging(ctx context.Context, searchRequest *ldap.SearchRequest, pagingSize uint32) (res *ldap.SearchResult, err error) {
err = dir.retry(func(strategy connReuseStrategy) error {
res, err = dir.searchWithPaging(ctx, searchRequest, pagingSize, strategy)
return err
})
return res, err
}
func (dir *Directory) searchWithPaging(ctx context.Context, req *ldap.SearchRequest, size uint32, strategy connReuseStrategy) (*ldap.SearchResult, error) {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return nil, err
}
defer dc.releaseConn(err)
dc.Lock()
res, err := dc.internal.SearchWithPaging(req, size)
dc.Unlock()
return res, err
}
func (dir *Directory) Modify(ctx context.Context, modifyRequest *ldap.ModifyRequest) error {
return dir.retry(func(strategy connReuseStrategy) error {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return err
}
defer dc.releaseConn(err)
dc.Lock()
err = dc.internal.Modify(modifyRequest)
dc.Unlock()
return err
})
}
func (dir *Directory) ModifyWithResult(ctx context.Context, modifyRequest *ldap.ModifyRequest) (res *ldap.ModifyResult, err error) {
return res, dir.retry(func(strategy connReuseStrategy) error {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return err
}
defer dc.releaseConn(err)
dc.Lock()
res, err = dc.internal.ModifyWithResult(modifyRequest)
dc.Unlock()
return err
})
}
func (dir *Directory) Del(ctx context.Context, delRequest *ldap.DelRequest) error {
return dir.retry(func(strategy connReuseStrategy) error {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return err
}
defer dc.releaseConn(err)
dc.Lock()
err = dc.internal.Del(delRequest)
dc.Unlock()
return err
})
}
func (dir *Directory) VerifyPassword(ctx context.Context, username, password string) error {
return dir.retry(func(strategy connReuseStrategy) error {
dc, err := dir.conn(ctx, strategy)
if err != nil {
return err
}
defer dc.releaseConn(err)
dc.Lock()
err = dc.internal.Bind(username, password)
dc.needRebind = true
dc.Unlock()
return err
})
}