Browse Source

#1639

add repo total size limit
tags/v1.22.4.1^2
chenyifan01 3 years ago
parent
commit
2e405768a9
3 changed files with 67 additions and 0 deletions
  1. +1
    -0
      modules/setting/repository.go
  2. +7
    -0
      routers/repo/editor.go
  3. +59
    -0
      services/repository/repository.go

+ 1
- 0
modules/setting/repository.go View File

@@ -40,6 +40,7 @@ var (
DisabledRepoUnits []string
DefaultRepoUnits []string
PrefixArchiveFiles bool
RepoMaxSize int64

// Repository editor settings
Editor struct {


+ 7
- 0
routers/repo/editor.go View File

@@ -5,6 +5,7 @@
package repo

import (
repo_service "code.gitea.io/gitea/services/repository"
"encoding/json"
"fmt"
"io/ioutil"
@@ -614,6 +615,12 @@ func UploadFilePost(ctx *context.Context, form auth.UploadRepoFileForm) {
message += "\n\n" + form.CommitMessage
}

if err := repo_service.CheckRepoSizeLimit(ctx.Repo.Repository, form.Files); err != nil {
//ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", part), tplUploadFile, &form)
ctx.RenderWithErr(err.Error(), tplUploadFile, &form)
return
}

if err := repofiles.UploadRepoFiles(ctx.Repo.Repository, ctx.User, &repofiles.UploadRepoFileOptions{
LastCommitID: ctx.Repo.CommitID,
OldBranch: oldBranchName,


+ 59
- 0
services/repository/repository.go View File

@@ -5,9 +5,11 @@
package repository

import (
"errors"
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"

"code.gitea.io/gitea/models"
@@ -172,3 +174,60 @@ func RecommendFromPromote(url string) ([]string, error) {
}
return result, nil
}

func CheckRepoSizeLimit(repo *models.Repository, fileIds []string) error {
if err := CheckRepoNumOnceLimit(len(fileIds)); err != nil {
return err
}
totalSize, err := CountUploadFileSizeByIds(fileIds)
if err != nil {
return errors.New("upload files are invalid")
}
if err := CheckRepoTotalSizeLimit(repo, totalSize); err != nil {
return err
}
return nil
}

func CheckRepoTotalSizeLimit(repo *models.Repository, uploadFileSize int64) error {
if repo.Size+uploadFileSize > setting.Repository.RepoMaxSize*1024*1024 {
return errors.New(fmt.Sprintf("repository can not exceed %d MB", setting.Repository.RepoMaxSize))
}
return nil
}

func CheckRepoNumOnceLimit(uploadFileNum int) error {
if uploadFileNum > setting.Repository.Upload.MaxFiles {
return errors.New(fmt.Sprintf("can not upload more than %d files at a time", setting.Repository.Upload.MaxFiles))
}
return nil
}

func CountUploadFileSizeByIds(fileIds []string) (int64, error) {
if len(fileIds) == 0 {
return 0, nil
}
uploads, err := models.GetUploadsByUUIDs(fileIds)
if err != nil {
return 0, fmt.Errorf("CountUploadFileSizeByIds error [uuids: %v]: %v", fileIds, err)
}
var totalSize int64
for _, upload := range uploads {
size, err := GetUploadFileSize(upload)
if err != nil {
return 0, err
}
totalSize += size
}
return totalSize, nil
}

func GetUploadFileSize(upload *models.Upload) (int64, error) {
info, err := os.Lstat(upload.LocalPath())

if err != nil {
return 0, err
}
return info.Size(), nil

}

Loading…
Cancel
Save