|
|
@@ -8,6 +8,7 @@ import ( |
|
|
|
"fmt" |
|
|
|
"io/ioutil" |
|
|
|
"net/http" |
|
|
|
"os" |
|
|
|
"strings" |
|
|
|
|
|
|
|
"code.gitea.io/gitea/models" |
|
|
@@ -172,3 +173,137 @@ func RecommendFromPromote(url string) ([]string, error) { |
|
|
|
} |
|
|
|
return result, nil |
|
|
|
} |
|
|
|
|
|
|
|
func CheckPushSizeLimit4Web(repo *models.Repository, fileIds []string) error { |
|
|
|
if err := CheckRepoNumOnceLimit(len(fileIds)); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
totalSize, err := CountUploadFileSizeByIds(fileIds) |
|
|
|
if err != nil { |
|
|
|
return UploadFileInvalidErr{} |
|
|
|
} |
|
|
|
if err := CheckRepoTotalSizeLimit(repo, totalSize); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func CheckPushSizeLimit4Http(repo *models.Repository, uploadFileSize int64) error { |
|
|
|
if err := CheckRepoOnceTotalSizeLimit(uploadFileSize); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
if err := CheckRepoTotalSizeLimit(repo, uploadFileSize); err != nil { |
|
|
|
return err |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func CheckRepoTotalSizeLimit(repo *models.Repository, uploadFileSize int64) error { |
|
|
|
if repo.Size+uploadFileSize > setting.Repository.RepoMaxSize*1024*1024 { |
|
|
|
return RepoTooLargeErr{} |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func CheckRepoOnceTotalSizeLimit(uploadFileSize int64) error { |
|
|
|
if uploadFileSize > setting.Repository.Upload.TotalMaxSize*1024*1024 { |
|
|
|
return UploadFileTooLargeErr{} |
|
|
|
} |
|
|
|
return nil |
|
|
|
} |
|
|
|
|
|
|
|
func CheckRepoNumOnceLimit(uploadFileNum int) error { |
|
|
|
if uploadFileNum > setting.Repository.Upload.MaxFiles { |
|
|
|
return UploadFileTooMuchErr{} |
|
|
|
} |
|
|
|
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 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
type RepoTooLargeErr struct { |
|
|
|
} |
|
|
|
|
|
|
|
func (RepoTooLargeErr) Error() string { |
|
|
|
return fmt.Sprintf("Repository can not exceed %d MB. Please remove some unnecessary files and try again", setting.Repository.RepoMaxSize) |
|
|
|
} |
|
|
|
|
|
|
|
func IsRepoTooLargeErr(err error) bool { |
|
|
|
_, ok := err.(RepoTooLargeErr) |
|
|
|
return ok |
|
|
|
} |
|
|
|
|
|
|
|
type UploadFileTooLargeErr struct { |
|
|
|
} |
|
|
|
|
|
|
|
func (UploadFileTooLargeErr) Error() string { |
|
|
|
return fmt.Sprintf("Upload files can not exceed %d MB at a time", setting.Repository.Upload.TotalMaxSize) |
|
|
|
} |
|
|
|
|
|
|
|
func IsUploadFileTooLargeErr(err error) bool { |
|
|
|
_, ok := err.(UploadFileTooLargeErr) |
|
|
|
return ok |
|
|
|
} |
|
|
|
|
|
|
|
type RepoFileTooLargeErr struct { |
|
|
|
} |
|
|
|
|
|
|
|
func (RepoFileTooLargeErr) Error() string { |
|
|
|
return "repository file is too large" |
|
|
|
} |
|
|
|
|
|
|
|
func IsRepoFileTooLargeErr(err error) bool { |
|
|
|
_, ok := err.(RepoFileTooLargeErr) |
|
|
|
return ok |
|
|
|
} |
|
|
|
|
|
|
|
type UploadFileTooMuchErr struct { |
|
|
|
} |
|
|
|
|
|
|
|
func (UploadFileTooMuchErr) Error() string { |
|
|
|
return "upload files are too lmuch" |
|
|
|
} |
|
|
|
|
|
|
|
func IsUploadFileTooMuchErr(err error) bool { |
|
|
|
_, ok := err.(UploadFileTooMuchErr) |
|
|
|
return ok |
|
|
|
} |
|
|
|
|
|
|
|
type UploadFileInvalidErr struct { |
|
|
|
} |
|
|
|
|
|
|
|
func (UploadFileInvalidErr) Error() string { |
|
|
|
return "upload files are invalid" |
|
|
|
} |
|
|
|
|
|
|
|
func IsUploadFileInvalidErr(err error) bool { |
|
|
|
_, ok := err.(UploadFileInvalidErr) |
|
|
|
return ok |
|
|
|
} |