gitea源码

avatar.go 2.2KB

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