55package admin
66
77import (
8+ "fmt"
89 "net/http"
910 "net/url"
1011 "strconv"
@@ -28,6 +29,11 @@ import (
2829 user_service "code.gitea.io/gitea/services/user"
2930)
3031
32+ type EditUserForm struct {
33+ * forms.AdminEditUserForm
34+ * forms.AvatarForm
35+ }
36+
3137const (
3238 tplUsers base.TplName = "admin/user/list"
3339 tplUserNew base.TplName = "admin/user/new"
@@ -207,48 +213,86 @@ func NewUserPost(ctx *context.Context) {
207213 ctx .Redirect (setting .AppSubURL + "/admin/users/" + strconv .FormatInt (u .ID , 10 ))
208214}
209215
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 ) {
211217 u , err := user_model .GetUserByID (ctx , ctx .ParamsInt64 (":userid" ))
212218 if err != nil {
213219 if user_model .IsErrUserNotExist (err ) {
214220 ctx .Redirect (setting .AppSubURL + "/admin/users" )
215221 } else {
216222 ctx .ServerError ("GetUserByID" , err )
217223 }
218- return nil
224+ return nil , nil
219225 }
220226 ctx .Data ["User" ] = u
221227
228+ var loginSource * auth.Source
222229 if u .LoginSource > 0 {
223- ctx . Data [ "LoginSource" ] , err = auth .GetSourceByID (u .LoginSource )
230+ loginSource , err = auth .GetSourceByID (u .LoginSource )
224231 if err != nil {
225232 ctx .ServerError ("auth.GetSourceByID" , err )
226- return nil
233+ return nil , nil
227234 }
228235 } else {
229- ctx . Data [ "LoginSource" ] = & auth.Source {}
236+ loginSource = & auth.Source {}
230237 }
238+ ctx .Data ["LoginSource" ] = loginSource
231239
232240 sources , err := auth .Sources ()
233241 if err != nil {
234242 ctx .ServerError ("auth.Sources" , err )
235- return nil
243+ return nil , nil
236244 }
237245 ctx .Data ["Sources" ] = sources
238246
239247 hasTOTP , err := auth .HasTwoFactorByUID (u .ID )
240248 if err != nil {
241249 ctx .ServerError ("auth.HasTwoFactorByUID" , err )
242- return nil
250+ return nil , nil
243251 }
244252 hasWebAuthn , err := auth .HasWebAuthnRegistrationsByUID (u .ID )
245253 if err != nil {
246254 ctx .ServerError ("auth.HasWebAuthnRegistrationsByUID" , err )
247- return nil
255+ return nil , nil
248256 }
249257 ctx .Data ["TwoFactorEnabled" ] = hasTOTP || hasWebAuthn
250258
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
252296}
253297
254298// EditUser show editing user page
@@ -260,7 +304,7 @@ func EditUser(ctx *context.Context) {
260304 ctx .Data ["DisableMigrations" ] = setting .Repository .DisableMigrations
261305 ctx .Data ["AllowedUserVisibilityModes" ] = setting .Service .AllowedUserVisibilityModesSlice .ToVisibleTypeSlice ()
262306
263- prepareUserInfo (ctx )
307+ prepareUserInfo (ctx , nil , nil )
264308 if ctx .Written () {
265309 return
266310 }
@@ -277,7 +321,7 @@ func EditUserPost(ctx *context.Context) {
277321 ctx .Data ["DisableMigrations" ] = setting .Repository .DisableMigrations
278322 ctx .Data ["AllowedUserVisibilityModes" ] = setting .Service .AllowedUserVisibilityModesSlice .ToVisibleTypeSlice ()
279323
280- u := prepareUserInfo (ctx )
324+ u , f := prepareUserInfo (ctx , form , nil )
281325 if ctx .Written () {
282326 return
283327 }
@@ -302,11 +346,11 @@ func EditUserPost(ctx *context.Context) {
302346 var err error
303347 if len (form .Password ) < setting .MinPasswordLength {
304348 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 )
306350 return
307351 }
308352 if ! password .IsComplexEnough (form .Password ) {
309- ctx .RenderWithErr (password .BuildComplexityError (ctx ), tplUserEdit , & form )
353+ ctx .RenderWithErr (password .BuildComplexityError (ctx ), tplUserEdit , & f )
310354 return
311355 }
312356 pwned , err := password .IsPwned (ctx , form .Password )
@@ -317,13 +361,13 @@ func EditUserPost(ctx *context.Context) {
317361 log .Error (err .Error ())
318362 errMsg = ctx .Tr ("auth.password_pwned_err" )
319363 }
320- ctx .RenderWithErr (errMsg , tplUserEdit , & form )
364+ ctx .RenderWithErr (errMsg , tplUserEdit , & f )
321365 return
322366 }
323367
324368 if err := user_model .ValidateEmail (form .Email ); err != nil {
325369 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 )
327371 return
328372 }
329373
@@ -342,7 +386,7 @@ func EditUserPost(ctx *context.Context) {
342386 if ctx .Written () {
343387 return
344388 }
345- ctx .RenderWithErr (ctx .Flash .ErrorMsg , tplUserEdit , & form )
389+ ctx .RenderWithErr (ctx .Flash .ErrorMsg , tplUserEdit , & f )
346390 return
347391 }
348392 u .Name = form .UserName
@@ -401,11 +445,11 @@ func EditUserPost(ctx *context.Context) {
401445 if err := user_model .UpdateUser (ctx , u , emailChanged ); err != nil {
402446 if user_model .IsErrEmailAlreadyUsed (err ) {
403447 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 )
405449 } else if user_model .IsErrEmailCharIsNotSupported (err ) ||
406450 user_model .IsErrEmailInvalid (err ) {
407451 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 )
409453 } else {
410454 ctx .ServerError ("UpdateUser" , err )
411455 }
@@ -456,12 +500,13 @@ func DeleteUser(ctx *context.Context) {
456500
457501// AvatarPost response for change user's avatar request
458502func AvatarPost (ctx * context.Context ) {
459- u := prepareUserInfo (ctx )
503+ form := web .GetForm (ctx ).(* forms.AvatarForm )
504+
505+ u , _ := prepareUserInfo (ctx , nil , form )
460506 if ctx .Written () {
461507 return
462508 }
463509
464- form := web .GetForm (ctx ).(* forms.AvatarForm )
465510 if err := user_setting .UpdateAvatarSetting (ctx , form , u ); err != nil {
466511 ctx .Flash .Error (err .Error ())
467512 } else {
@@ -473,7 +518,7 @@ func AvatarPost(ctx *context.Context) {
473518
474519// DeleteAvatar render delete avatar page
475520func DeleteAvatar (ctx * context.Context ) {
476- u := prepareUserInfo (ctx )
521+ u , _ := prepareUserInfo (ctx , nil , nil )
477522 if ctx .Written () {
478523 return
479524 }
0 commit comments