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  }