5
5
package admin
6
6
7
7
import (
8
+ "fmt"
8
9
"net/http"
9
10
"net/url"
10
11
"strconv"
@@ -28,6 +29,11 @@ import (
28
29
user_service "code.gitea.io/gitea/services/user"
29
30
)
30
31
32
+ type EditUserForm struct {
33
+ * forms.AdminEditUserForm
34
+ * forms.AvatarForm
35
+ }
36
+
31
37
const (
32
38
tplUsers base.TplName = "admin/user/list"
33
39
tplUserNew base.TplName = "admin/user/new"
@@ -207,48 +213,86 @@ func NewUserPost(ctx *context.Context) {
207
213
ctx .Redirect (setting .AppSubURL + "/admin/users/" + strconv .FormatInt (u .ID , 10 ))
208
214
}
209
215
210
- func prepareUserInfo (ctx * context.Context ) * user_model.User {
216
+ func prepareUserInfo (ctx * context.Context , adminEditUserForm * forms. AdminEditUserForm , avatarForm * forms. AvatarForm ) ( * user_model.User , * EditUserForm ) {
211
217
u , err := user_model .GetUserByID (ctx , ctx .ParamsInt64 (":userid" ))
212
218
if err != nil {
213
219
if user_model .IsErrUserNotExist (err ) {
214
220
ctx .Redirect (setting .AppSubURL + "/admin/users" )
215
221
} else {
216
222
ctx .ServerError ("GetUserByID" , err )
217
223
}
218
- return nil
224
+ return nil , nil
219
225
}
220
226
ctx .Data ["User" ] = u
221
227
228
+ var loginSource * auth.Source
222
229
if u .LoginSource > 0 {
223
- ctx . Data [ "LoginSource" ] , err = auth .GetSourceByID (u .LoginSource )
230
+ loginSource , err = auth .GetSourceByID (u .LoginSource )
224
231
if err != nil {
225
232
ctx .ServerError ("auth.GetSourceByID" , err )
226
- return nil
233
+ return nil , nil
227
234
}
228
235
} else {
229
- ctx . Data [ "LoginSource" ] = & auth.Source {}
236
+ loginSource = & auth.Source {}
230
237
}
238
+ ctx .Data ["LoginSource" ] = loginSource
231
239
232
240
sources , err := auth .Sources ()
233
241
if err != nil {
234
242
ctx .ServerError ("auth.Sources" , err )
235
- return nil
243
+ return nil , nil
236
244
}
237
245
ctx .Data ["Sources" ] = sources
238
246
239
247
hasTOTP , err := auth .HasTwoFactorByUID (u .ID )
240
248
if err != nil {
241
249
ctx .ServerError ("auth.HasTwoFactorByUID" , err )
242
- return nil
250
+ return nil , nil
243
251
}
244
252
hasWebAuthn , err := auth .HasWebAuthnRegistrationsByUID (u .ID )
245
253
if err != nil {
246
254
ctx .ServerError ("auth.HasWebAuthnRegistrationsByUID" , err )
247
- return nil
255
+ return nil , nil
248
256
}
249
257
ctx .Data ["TwoFactorEnabled" ] = hasTOTP || hasWebAuthn
250
258
251
- return u
259
+ var source string
260
+ if u .UseCustomAvatar {
261
+ source = "local"
262
+ } else {
263
+ source = "lookup"
264
+ }
265
+
266
+ if adminEditUserForm == nil {
267
+ adminEditUserForm = & forms.AdminEditUserForm {
268
+ LoginType : fmt .Sprintf ("%d-%d" , loginSource .Type .Int (), loginSource .ID ),
269
+ UserName : u .Name ,
270
+ LoginName : u .LoginName ,
271
+ FullName : u .FullName ,
272
+ Email : u .Email ,
273
+ Website : u .Website ,
274
+ Location : u .Location ,
275
+ MaxRepoCreation : u .MaxRepoCreation ,
276
+ Active : u .IsActive ,
277
+ Admin : u .IsAdmin ,
278
+ Restricted : u .IsRestricted ,
279
+ AllowGitHook : u .CanEditGitHook (),
280
+ AllowImportLocal : u .CanImportLocal (),
281
+ AllowCreateOrganization : u .CanCreateOrganization (),
282
+ ProhibitLogin : u .ProhibitLogin ,
283
+ Visibility : u .Visibility ,
284
+ }
285
+ }
286
+ if avatarForm == nil {
287
+ avatarForm = & forms.AvatarForm {
288
+ Source : source ,
289
+ Gravatar : u .AvatarEmail ,
290
+ }
291
+ }
292
+ form := & EditUserForm {adminEditUserForm , avatarForm }
293
+ ctx .Data ["Form" ] = form
294
+
295
+ return u , form
252
296
}
253
297
254
298
// EditUser show editing user page
@@ -260,7 +304,7 @@ func EditUser(ctx *context.Context) {
260
304
ctx .Data ["DisableMigrations" ] = setting .Repository .DisableMigrations
261
305
ctx .Data ["AllowedUserVisibilityModes" ] = setting .Service .AllowedUserVisibilityModesSlice .ToVisibleTypeSlice ()
262
306
263
- prepareUserInfo (ctx )
307
+ prepareUserInfo (ctx , nil , nil )
264
308
if ctx .Written () {
265
309
return
266
310
}
@@ -277,7 +321,7 @@ func EditUserPost(ctx *context.Context) {
277
321
ctx .Data ["DisableMigrations" ] = setting .Repository .DisableMigrations
278
322
ctx .Data ["AllowedUserVisibilityModes" ] = setting .Service .AllowedUserVisibilityModesSlice .ToVisibleTypeSlice ()
279
323
280
- u := prepareUserInfo (ctx )
324
+ u , f := prepareUserInfo (ctx , form , nil )
281
325
if ctx .Written () {
282
326
return
283
327
}
@@ -302,11 +346,11 @@ func EditUserPost(ctx *context.Context) {
302
346
var err error
303
347
if len (form .Password ) < setting .MinPasswordLength {
304
348
ctx .Data ["Err_Password" ] = true
305
- ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplUserEdit , & form )
349
+ ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplUserEdit , & f )
306
350
return
307
351
}
308
352
if ! password .IsComplexEnough (form .Password ) {
309
- ctx .RenderWithErr (password .BuildComplexityError (ctx ), tplUserEdit , & form )
353
+ ctx .RenderWithErr (password .BuildComplexityError (ctx ), tplUserEdit , & f )
310
354
return
311
355
}
312
356
pwned , err := password .IsPwned (ctx , form .Password )
@@ -317,13 +361,13 @@ func EditUserPost(ctx *context.Context) {
317
361
log .Error (err .Error ())
318
362
errMsg = ctx .Tr ("auth.password_pwned_err" )
319
363
}
320
- ctx .RenderWithErr (errMsg , tplUserEdit , & form )
364
+ ctx .RenderWithErr (errMsg , tplUserEdit , & f )
321
365
return
322
366
}
323
367
324
368
if err := user_model .ValidateEmail (form .Email ); err != nil {
325
369
ctx .Data ["Err_Email" ] = true
326
- ctx .RenderWithErr (ctx .Tr ("form.email_error" ), tplUserEdit , & form )
370
+ ctx .RenderWithErr (ctx .Tr ("form.email_error" ), tplUserEdit , & f )
327
371
return
328
372
}
329
373
@@ -342,7 +386,7 @@ func EditUserPost(ctx *context.Context) {
342
386
if ctx .Written () {
343
387
return
344
388
}
345
- ctx .RenderWithErr (ctx .Flash .ErrorMsg , tplUserEdit , & form )
389
+ ctx .RenderWithErr (ctx .Flash .ErrorMsg , tplUserEdit , & f )
346
390
return
347
391
}
348
392
u .Name = form .UserName
@@ -401,11 +445,11 @@ func EditUserPost(ctx *context.Context) {
401
445
if err := user_model .UpdateUser (ctx , u , emailChanged ); err != nil {
402
446
if user_model .IsErrEmailAlreadyUsed (err ) {
403
447
ctx .Data ["Err_Email" ] = true
404
- ctx .RenderWithErr (ctx .Tr ("form.email_been_used" ), tplUserEdit , & form )
448
+ ctx .RenderWithErr (ctx .Tr ("form.email_been_used" ), tplUserEdit , & f )
405
449
} else if user_model .IsErrEmailCharIsNotSupported (err ) ||
406
450
user_model .IsErrEmailInvalid (err ) {
407
451
ctx .Data ["Err_Email" ] = true
408
- ctx .RenderWithErr (ctx .Tr ("form.email_invalid" ), tplUserEdit , & form )
452
+ ctx .RenderWithErr (ctx .Tr ("form.email_invalid" ), tplUserEdit , & f )
409
453
} else {
410
454
ctx .ServerError ("UpdateUser" , err )
411
455
}
@@ -456,12 +500,13 @@ func DeleteUser(ctx *context.Context) {
456
500
457
501
// AvatarPost response for change user's avatar request
458
502
func AvatarPost (ctx * context.Context ) {
459
- u := prepareUserInfo (ctx )
503
+ form := web .GetForm (ctx ).(* forms.AvatarForm )
504
+
505
+ u , _ := prepareUserInfo (ctx , nil , form )
460
506
if ctx .Written () {
461
507
return
462
508
}
463
509
464
- form := web .GetForm (ctx ).(* forms.AvatarForm )
465
510
if err := user_setting .UpdateAvatarSetting (ctx , form , u ); err != nil {
466
511
ctx .Flash .Error (err .Error ())
467
512
} else {
@@ -473,7 +518,7 @@ func AvatarPost(ctx *context.Context) {
473
518
474
519
// DeleteAvatar render delete avatar page
475
520
func DeleteAvatar (ctx * context.Context ) {
476
- u := prepareUserInfo (ctx )
521
+ u , _ := prepareUserInfo (ctx , nil , nil )
477
522
if ctx .Written () {
478
523
return
479
524
}
0 commit comments