-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathget_group_list.go
69 lines (63 loc) · 1.43 KB
/
get_group_list.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
package pkg
import (
"fmt"
"sort"
"github.com/go-ldap/ldap/v3"
pb "github.com/romnn/ldap-manager/pkg/grpc/gen"
log "github.com/sirupsen/logrus"
)
const (
pagingSize = 256
)
// GetGroupList gets a list of all groups
func (m *LDAPManager) GetGroupList(req *pb.GetGroupListRequest) (*pb.GroupList, error) {
conn, err := m.Pool.Get()
if err != nil {
return nil, err
}
defer conn.Close()
result, err := conn.SearchWithPaging(ldap.NewSearchRequest(
m.GroupsDN,
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false,
fmt.Sprintf(
"(&(objectClass=posixGroup)%s)",
BuildFilter(req.GetFilter()),
),
[]string{},
[]ldap.Control{},
), pagingSize)
if err != nil {
return nil, err
}
groups := []*pb.Group{}
for _, entry := range result.Entries {
group, err := m.parseGroup(entry)
if err != nil {
log.Errorf(
"failed to parse group %v: %v",
entry, err,
)
continue
}
groups = append(groups, group)
}
// Sort
sort.Slice(groups, func(i, j int) bool {
asc := groups[i].GetName() < groups[j].GetName()
if req.GetSortOrder() == pb.SortOrder_DESCENDING {
return !asc
}
return asc
})
// Clip
validStart := req.GetStart() >= 0
validEnd := req.GetEnd() < int32(len(groups))
validRange := req.GetStart() < req.GetEnd()
if validRange && validStart && validEnd {
groups = groups[req.GetStart():req.GetEnd()]
}
return &pb.GroupList{
Groups: groups,
Total: int64(len(groups)),
}, nil
}