Refactor filetype is not allowed errors (#7309)
This commit is contained in:
parent
75d4414386
commit
f369788347
5 changed files with 61 additions and 46 deletions
49
modules/upload/filetype.go
Normal file
49
modules/upload/filetype.go
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// Copyright 2019 The Gitea Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a MIT-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package upload
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrFileTypeForbidden not allowed file type error
|
||||||
|
type ErrFileTypeForbidden struct {
|
||||||
|
Type string
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsErrFileTypeForbidden checks if an error is a ErrFileTypeForbidden.
|
||||||
|
func IsErrFileTypeForbidden(err error) bool {
|
||||||
|
_, ok := err.(ErrFileTypeForbidden)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err ErrFileTypeForbidden) Error() string {
|
||||||
|
return fmt.Sprintf("File type is not allowed: %s", err.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
// VerifyAllowedContentType validates a file is allowed to be uploaded.
|
||||||
|
func VerifyAllowedContentType(buf []byte, allowedTypes []string) error {
|
||||||
|
fileType := http.DetectContentType(buf)
|
||||||
|
|
||||||
|
allowed := false
|
||||||
|
for _, t := range allowedTypes {
|
||||||
|
t := strings.Trim(t, " ")
|
||||||
|
if t == "*/*" || t == fileType {
|
||||||
|
allowed = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !allowed {
|
||||||
|
log.Info("Attachment with type %s blocked from upload", fileType)
|
||||||
|
return ErrFileTypeForbidden{Type: fileType}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -5,13 +5,12 @@
|
||||||
package repo
|
package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"net/http"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/upload"
|
||||||
|
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
)
|
)
|
||||||
|
@ -177,20 +176,9 @@ func CreateReleaseAttachment(ctx *context.APIContext) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the filetype is allowed by the settings
|
// Check if the filetype is allowed by the settings
|
||||||
fileType := http.DetectContentType(buf)
|
err = upload.VerifyAllowedContentType(buf, strings.Split(setting.AttachmentAllowedTypes, ","))
|
||||||
|
if err != nil {
|
||||||
allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
|
ctx.Error(400, "DetectContentType", err)
|
||||||
allowed := false
|
|
||||||
for _, t := range allowedTypes {
|
|
||||||
t := strings.Trim(t, " ")
|
|
||||||
if t == "*/*" || t == fileType {
|
|
||||||
allowed = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !allowed {
|
|
||||||
ctx.Error(400, "DetectContentType", errors.New("File type is not allowed"))
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,13 +6,13 @@ package repo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/models"
|
"code.gitea.io/gitea/models"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/upload"
|
||||||
)
|
)
|
||||||
|
|
||||||
func renderAttachmentSettings(ctx *context.Context) {
|
func renderAttachmentSettings(ctx *context.Context) {
|
||||||
|
@ -42,21 +42,10 @@ func UploadAttachment(ctx *context.Context) {
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
buf = buf[:n]
|
buf = buf[:n]
|
||||||
}
|
}
|
||||||
fileType := http.DetectContentType(buf)
|
|
||||||
|
|
||||||
allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
|
err = upload.VerifyAllowedContentType(buf, strings.Split(setting.AttachmentAllowedTypes, ","))
|
||||||
allowed := false
|
if err != nil {
|
||||||
for _, t := range allowedTypes {
|
ctx.Error(400, err.Error())
|
||||||
t := strings.Trim(t, " ")
|
|
||||||
if t == "*/*" || t == fileType {
|
|
||||||
allowed = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !allowed {
|
|
||||||
log.Info("Attachment with type %s blocked from upload", fileType)
|
|
||||||
ctx.Error(400, ErrFileTypeForbidden.Error())
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ package repo
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -20,6 +19,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/repofiles"
|
"code.gitea.io/gitea/modules/repofiles"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/templates"
|
"code.gitea.io/gitea/modules/templates"
|
||||||
|
"code.gitea.io/gitea/modules/upload"
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -594,20 +594,11 @@ func UploadFileToServer(ctx *context.Context) {
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
buf = buf[:n]
|
buf = buf[:n]
|
||||||
}
|
}
|
||||||
fileType := http.DetectContentType(buf)
|
|
||||||
|
|
||||||
if len(setting.Repository.Upload.AllowedTypes) > 0 {
|
if len(setting.Repository.Upload.AllowedTypes) > 0 {
|
||||||
allowed := false
|
err = upload.VerifyAllowedContentType(buf, setting.Repository.Upload.AllowedTypes)
|
||||||
for _, t := range setting.Repository.Upload.AllowedTypes {
|
if err != nil {
|
||||||
t := strings.Trim(t, " ")
|
ctx.Error(400, err.Error())
|
||||||
if t == "*/*" || t == fileType {
|
|
||||||
allowed = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !allowed {
|
|
||||||
ctx.Error(400, ErrFileTypeForbidden.Error())
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,6 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrFileTypeForbidden not allowed file type error
|
|
||||||
ErrFileTypeForbidden = errors.New("File type is not allowed")
|
|
||||||
// ErrTooManyFiles upload too many files
|
// ErrTooManyFiles upload too many files
|
||||||
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded")
|
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded")
|
||||||
// IssueTemplateCandidates issue templates
|
// IssueTemplateCandidates issue templates
|
||||||
|
|
Loading…
Reference in a new issue