/
disenable.go
157 lines (133 loc) · 3.63 KB
/
disenable.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2014 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package user
import (
"github.com/juju/cmd/v3"
"github.com/juju/errors"
jujucmd "github.com/juju/juju/cmd"
"github.com/juju/juju/cmd/juju/block"
"github.com/juju/juju/cmd/modelcmd"
)
var usageDisableUserSummary = `
Disables a Juju user.`[1:]
var usageDisableUserDetails = `
A disabled Juju user is one that cannot log in to any controller.
This command has no affect on models that the disabled user may have
created and/or shared nor any applications associated with that user.
`[1:]
const usageDisableUserExamples = `
juju disable-user bob
`
var usageEnableUserSummary = `
Re-enables a previously disabled Juju user.`[1:]
var usageEnableUserDetails = `
An enabled Juju user is one that can log in to a controller.
`[1:]
const usageEnableUserExamples = `
juju enable-user bob
`
// disenableUserBase common code for enable/disable user commands
type disenableUserBase struct {
modelcmd.ControllerCommandBase
api disenableUserAPI
User string
}
func NewDisableCommand() cmd.Command {
return modelcmd.WrapController(&disableCommand{})
}
// disableCommand disables users.
type disableCommand struct {
disenableUserBase
}
func NewEnableCommand() cmd.Command {
return modelcmd.WrapController(&enableCommand{})
}
// enableCommand enables users.
type enableCommand struct {
disenableUserBase
}
// Info implements Command.Info.
func (c *disableCommand) Info() *cmd.Info {
return jujucmd.Info(&cmd.Info{
Name: "disable-user",
Args: "<user name>",
Purpose: usageDisableUserSummary,
Doc: usageDisableUserDetails,
Examples: usageDisableUserExamples,
SeeAlso: []string{
"users",
"enable-user",
"login",
},
})
}
// Info implements Command.Info.
func (c *enableCommand) Info() *cmd.Info {
return jujucmd.Info(&cmd.Info{
Name: "enable-user",
Args: "<user name>",
Purpose: usageEnableUserSummary,
Doc: usageEnableUserDetails,
Examples: usageEnableUserExamples,
SeeAlso: []string{
"users",
"disable-user",
"login",
},
})
}
// Init implements Command.Init.
func (c *disenableUserBase) Init(args []string) error {
if len(args) == 0 {
return errors.New("no username supplied")
}
// TODO(thumper): support multiple users in one command,
// and also verify that the values are valid user names.
c.User = args[0]
return cmd.CheckEmpty(args[1:])
}
// Username is here entirely for testing purposes to allow both the
// disableCommand and enableCommand to support a common interface that is able
// to ask for the command line supplied username.
func (c *disenableUserBase) Username() string {
return c.User
}
// disenableUserAPI defines the API methods that the disable and enable
// commands use.
type disenableUserAPI interface {
EnableUser(username string) error
DisableUser(username string) error
Close() error
}
// Run implements Command.Run.
func (c *disableCommand) Run(ctx *cmd.Context) error {
if c.api == nil {
api, err := c.NewUserManagerAPIClient()
if err != nil {
return errors.Trace(err)
}
c.api = api
defer c.api.Close()
}
if err := c.api.DisableUser(c.User); err != nil {
return block.ProcessBlockedError(err, block.BlockChange)
}
ctx.Infof("User %q disabled", c.User)
return nil
}
// Run implements Command.Run.
func (c *enableCommand) Run(ctx *cmd.Context) error {
if c.api == nil {
api, err := c.NewUserManagerAPIClient()
if err != nil {
return errors.Trace(err)
}
c.api = api
defer c.api.Close()
}
if err := c.api.EnableUser(c.User); err != nil {
return block.ProcessBlockedError(err, block.BlockChange)
}
ctx.Infof("User %q enabled", c.User)
return nil
}