/
command_get_user.go
106 lines (86 loc) · 3.67 KB
/
command_get_user.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
95
96
97
98
99
100
101
102
103
104
105
106
package commands
import (
supererrors "github.com/sarumaj/go-super/errors"
apputil "github.com/sarumaj/ldap-cli/pkg/app/util"
attributes "github.com/sarumaj/ldap-cli/pkg/lib/definitions/attributes"
filter "github.com/sarumaj/ldap-cli/pkg/lib/definitions/filter"
libutil "github.com/sarumaj/ldap-cli/pkg/lib/util"
cobra "github.com/spf13/cobra"
)
// Default attributes for search query
var defaultUserGetAttributes = attributes.Attributes{
attributes.CommonName(),
attributes.DisplayName(),
attributes.DistinguishedName(),
attributes.Name(),
attributes.Mail(),
attributes.ObjectCategory(),
attributes.ObjectClass(),
attributes.SamAccountName(),
attributes.SamAccountType(),
attributes.UserAccountControl(),
attributes.UserPrincipalName(),
}
// Command options
var getUserFlags struct {
id string `flag:"user-id"`
enabled bool `flag:"enabled"`
expired bool `flag:"expired"`
memberOf []string `flag:"member-of"`
recursively bool `flag:"recursively"`
}
// "user" command
var getUserCmd = func() *cobra.Command {
getUserCmd := &cobra.Command{
Use: "user",
Short: "Get a user(s) in the directory",
Example: "ldap-cli --user \"DOMAIN\\\\user\" --password \"password\" --url \"ldaps://example.com:636\" " +
"get --path \"DC=example,DC=com\" --select \"accountExpires,sAmAccountName\" " +
"user --user-id \"uix12345\" --enabled",
PersistentPreRun: getUserPersistentPreRun,
Run: getChildCommandRun,
}
flags := getUserCmd.Flags()
flags.StringVar(&getUserFlags.id, "user-id", "", "Specify user ID (common name, DN, SAN or UPN)")
flags.BoolVar(&getUserFlags.enabled, "enabled", false, "Search explicitly for enabled users")
flags.BoolVar(&getUserFlags.expired, "expired", false, "Search explicitly for expired users")
flags.StringArrayVar(&getUserFlags.memberOf, "member-of", nil, "Search users being member of given group")
flags.BoolVar(&getUserFlags.recursively, "recursively", false, "Consider nested group membership")
return getUserCmd
}()
// Runs always prior to "run"
func getUserPersistentPreRun(cmd *cobra.Command, _ []string) {
parent := cmd.Parent()
parent.PersistentPreRun(parent, nil)
logger := apputil.Logger.WithFields(apputil.Fields{"command": cmd.CommandPath(), "step": "getUserPersistentPreRun"})
logger.Debug("Executing")
apputil.AskID(cmd, "user-id", &getUserFlags.id, &getFlags.searchArguments)
if len(getFlags.searchArguments.Attributes) == 0 {
getFlags.searchArguments.Attributes.Append(defaultUserGetAttributes...)
}
logger.WithField("searchArguments.Attributes", getFlags.searchArguments.Attributes).Debug("Set")
var filters []filter.Filter
if getUserFlags.id != "" {
filters = append(filters, filter.ByID(getUserFlags.id))
}
switch wasProvided := cmd.Flags().Changed("enabled"); {
case wasProvided && getUserFlags.enabled:
filters = append(filters, filter.IsEnabled())
case wasProvided && !getUserFlags.enabled:
filters = append(filters, filter.Not(filter.IsEnabled()))
}
switch wasProvided := cmd.Flags().Changed("expired"); {
case wasProvided && getUserFlags.expired:
filters = append(filters, filter.HasExpired())
case wasProvided && !getUserFlags.expired:
filters = append(filters, filter.Not(filter.HasExpired()))
}
if len(getUserFlags.memberOf) > 0 {
getUserFlags.memberOf = supererrors.ExceptFn(supererrors.W(libutil.RebuildStringSliceFlag(getUserFlags.memberOf, ';')))
}
for _, memberOf := range getUserFlags.memberOf {
filters = append(filters, filter.MemberOf(memberOf, getUserFlags.recursively))
}
getFlags.searchArguments.Filter = filter.And(filter.IsUser(), filters...)
logger.WithField("searchArguments.Filter", getFlags.searchArguments.Filter.String()).Debug("Set")
}