code.gitea.io/gitea@v1.21.7/routers/web/repo/setting/avatar.go (about) 1 // Copyright 2023 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package setting 5 6 import ( 7 "errors" 8 "fmt" 9 "io" 10 11 "code.gitea.io/gitea/modules/context" 12 "code.gitea.io/gitea/modules/log" 13 "code.gitea.io/gitea/modules/setting" 14 "code.gitea.io/gitea/modules/typesniffer" 15 "code.gitea.io/gitea/modules/web" 16 "code.gitea.io/gitea/services/forms" 17 repo_service "code.gitea.io/gitea/services/repository" 18 ) 19 20 // UpdateAvatarSetting update repo's avatar 21 func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { 22 ctxRepo := ctx.Repo.Repository 23 24 if form.Avatar == nil { 25 // No avatar is uploaded and we not removing it here. 26 // No random avatar generated here. 27 // Just exit, no action. 28 if ctxRepo.CustomAvatarRelativePath() == "" { 29 log.Trace("No avatar was uploaded for repo: %d. Default icon will appear instead.", ctxRepo.ID) 30 } 31 return nil 32 } 33 34 r, err := form.Avatar.Open() 35 if err != nil { 36 return fmt.Errorf("Avatar.Open: %w", err) 37 } 38 defer r.Close() 39 40 if form.Avatar.Size > setting.Avatar.MaxFileSize { 41 return errors.New(ctx.Tr("settings.uploaded_avatar_is_too_big", form.Avatar.Size/1024, setting.Avatar.MaxFileSize/1024)) 42 } 43 44 data, err := io.ReadAll(r) 45 if err != nil { 46 return fmt.Errorf("io.ReadAll: %w", err) 47 } 48 st := typesniffer.DetectContentType(data) 49 if !(st.IsImage() && !st.IsSvgImage()) { 50 return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) 51 } 52 if err = repo_service.UploadAvatar(ctx, ctxRepo, data); err != nil { 53 return fmt.Errorf("UploadAvatar: %w", err) 54 } 55 return nil 56 } 57 58 // SettingsAvatar save new POSTed repository avatar 59 func SettingsAvatar(ctx *context.Context) { 60 form := web.GetForm(ctx).(*forms.AvatarForm) 61 form.Source = forms.AvatarLocal 62 if err := UpdateAvatarSetting(ctx, *form); err != nil { 63 ctx.Flash.Error(err.Error()) 64 } else { 65 ctx.Flash.Success(ctx.Tr("repo.settings.update_avatar_success")) 66 } 67 ctx.Redirect(ctx.Repo.RepoLink + "/settings") 68 } 69 70 // SettingsDeleteAvatar delete repository avatar 71 func SettingsDeleteAvatar(ctx *context.Context) { 72 if err := repo_service.DeleteAvatar(ctx, ctx.Repo.Repository); err != nil { 73 ctx.Flash.Error(fmt.Sprintf("DeleteAvatar: %v", err)) 74 } 75 ctx.JSONRedirect(ctx.Repo.RepoLink + "/settings") 76 }