@@ -20,6 +20,7 @@ import (
20
20
21
21
"golang.org/x/net/context"
22
22
23
+ "github.com/coreos/etcd/auth/authpb"
23
24
"github.com/coreos/etcd/clientv3"
24
25
"github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
25
26
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
@@ -104,16 +105,167 @@ func TestV3AuthRevision(t *testing.T) {
104
105
}
105
106
}
106
107
107
- func authSetupRoot (t * testing.T , auth pb.AuthClient ) {
108
- if _ , err := auth .UserAdd (context .TODO (), & pb.AuthUserAddRequest {Name : "root" , Password : "123" }); err != nil {
108
+ type user struct {
109
+ name string
110
+ password string
111
+ role string
112
+ key string
113
+ end string
114
+ }
115
+
116
+ func TestV3AuthWithLeaseRevoke (t * testing.T ) {
117
+ defer testutil .AfterTest (t )
118
+ clus := NewClusterV3 (t , & ClusterConfig {Size : 1 })
119
+ defer clus .Terminate (t )
120
+
121
+ users := []user {
122
+ {
123
+ name : "user1" ,
124
+ password : "user1-123" ,
125
+ role : "role1" ,
126
+ key : "k1" ,
127
+ end : "k2" ,
128
+ },
129
+ }
130
+ authSetupUsers (t , toGRPC (clus .Client (0 )).Auth , users )
131
+
132
+ authSetupRoot (t , toGRPC (clus .Client (0 )).Auth )
133
+
134
+ rootc , cerr := clientv3 .New (clientv3.Config {Endpoints : clus .Client (0 ).Endpoints (), Username : "root" , Password : "123" })
135
+ if cerr != nil {
136
+ t .Fatal (cerr )
137
+ }
138
+ defer rootc .Close ()
139
+
140
+ leaseResp , err := rootc .Grant (context .TODO (), 90 )
141
+ if err != nil {
109
142
t .Fatal (err )
110
143
}
111
- if _ , err := auth .RoleAdd (context .TODO (), & pb.AuthRoleAddRequest {Name : "root" }); err != nil {
144
+ leaseID := leaseResp .ID
145
+ // permission of k3 isn't granted to user1
146
+ _ , err = rootc .Put (context .TODO (), "k3" , "val" , clientv3 .WithLease (leaseID ))
147
+ if err != nil {
112
148
t .Fatal (err )
113
149
}
114
- if _ , err := auth .UserGrantRole (context .TODO (), & pb.AuthUserGrantRoleRequest {User : "root" , Role : "root" }); err != nil {
150
+
151
+ userc , cerr := clientv3 .New (clientv3.Config {Endpoints : clus .Client (0 ).Endpoints (), Username : "user1" , Password : "user1-123" })
152
+ if cerr != nil {
153
+ t .Fatal (cerr )
154
+ }
155
+ defer userc .Close ()
156
+ _ , err = userc .Revoke (context .TODO (), leaseID )
157
+ if err == nil {
158
+ t .Fatal ("revoking from user1 should be failed with permission denied" )
159
+ }
160
+ }
161
+
162
+ func TestV3AuthWithLeaseAttach (t * testing.T ) {
163
+ defer testutil .AfterTest (t )
164
+ clus := NewClusterV3 (t , & ClusterConfig {Size : 1 })
165
+ defer clus .Terminate (t )
166
+
167
+ users := []user {
168
+ {
169
+ name : "user1" ,
170
+ password : "user1-123" ,
171
+ role : "role1" ,
172
+ key : "k1" ,
173
+ end : "k3" ,
174
+ },
175
+ {
176
+ name : "user2" ,
177
+ password : "user2-123" ,
178
+ role : "role2" ,
179
+ key : "k2" ,
180
+ end : "k4" ,
181
+ },
182
+ }
183
+ authSetupUsers (t , toGRPC (clus .Client (0 )).Auth , users )
184
+
185
+ authSetupRoot (t , toGRPC (clus .Client (0 )).Auth )
186
+
187
+ user1c , cerr := clientv3 .New (clientv3.Config {Endpoints : clus .Client (0 ).Endpoints (), Username : "user1" , Password : "user1-123" })
188
+ if cerr != nil {
189
+ t .Fatal (cerr )
190
+ }
191
+ defer user1c .Close ()
192
+
193
+ user2c , cerr := clientv3 .New (clientv3.Config {Endpoints : clus .Client (0 ).Endpoints (), Username : "user2" , Password : "user2-123" })
194
+ if cerr != nil {
195
+ t .Fatal (cerr )
196
+ }
197
+ defer user2c .Close ()
198
+
199
+ leaseResp , err := user1c .Grant (context .TODO (), 90 )
200
+ if err != nil {
201
+ t .Fatal (err )
202
+ }
203
+ leaseID := leaseResp .ID
204
+ // permission of k2 is also granted to user2
205
+ _ , err = user1c .Put (context .TODO (), "k2" , "val" , clientv3 .WithLease (leaseID ))
206
+ if err != nil {
207
+ t .Fatal (err )
208
+ }
209
+
210
+ _ , err = user2c .Revoke (context .TODO (), leaseID )
211
+ if err != nil {
212
+ t .Fatal (err )
213
+ }
214
+
215
+ leaseResp , err = user1c .Grant (context .TODO (), 90 )
216
+ if err != nil {
217
+ t .Fatal (err )
218
+ }
219
+ leaseID = leaseResp .ID
220
+ // permission of k1 isn't granted to user2
221
+ _ , err = user1c .Put (context .TODO (), "k1" , "val" , clientv3 .WithLease (leaseID ))
222
+ if err != nil {
115
223
t .Fatal (err )
116
224
}
225
+
226
+ _ , err = user2c .Revoke (context .TODO (), leaseID )
227
+ if err == nil {
228
+ t .Fatal ("revoking from user2 should be failed with permission denied" )
229
+ }
230
+ }
231
+
232
+ func authSetupUsers (t * testing.T , auth pb.AuthClient , users []user ) {
233
+ for _ , user := range users {
234
+ if _ , err := auth .UserAdd (context .TODO (), & pb.AuthUserAddRequest {Name : user .name , Password : user .password }); err != nil {
235
+ t .Fatal (err )
236
+ }
237
+ if _ , err := auth .RoleAdd (context .TODO (), & pb.AuthRoleAddRequest {Name : user .role }); err != nil {
238
+ t .Fatal (err )
239
+ }
240
+ if _ , err := auth .UserGrantRole (context .TODO (), & pb.AuthUserGrantRoleRequest {User : user .name , Role : user .role }); err != nil {
241
+ t .Fatal (err )
242
+ }
243
+
244
+ if len (user .key ) == 0 {
245
+ continue
246
+ }
247
+
248
+ perm := & authpb.Permission {
249
+ PermType : authpb .READWRITE ,
250
+ Key : []byte (user .key ),
251
+ RangeEnd : []byte (user .end ),
252
+ }
253
+ if _ , err := auth .RoleGrantPermission (context .TODO (), & pb.AuthRoleGrantPermissionRequest {Name : user .role , Perm : perm }); err != nil {
254
+ t .Fatal (err )
255
+ }
256
+ }
257
+ }
258
+
259
+ func authSetupRoot (t * testing.T , auth pb.AuthClient ) {
260
+ root := []user {
261
+ {
262
+ name : "root" ,
263
+ password : "123" ,
264
+ role : "root" ,
265
+ key : "" ,
266
+ },
267
+ }
268
+ authSetupUsers (t , auth , root )
117
269
if _ , err := auth .AuthEnable (context .TODO (), & pb.AuthEnableRequest {}); err != nil {
118
270
t .Fatal (err )
119
271
}
0 commit comments