]> source.dussan.org Git - gitea.git/commitdiff
Refactor filetype is not allowed errors (#7309)
authorAntoine GIRARD <sapk@users.noreply.github.com>
Sun, 7 Jul 2019 02:25:05 +0000 (04:25 +0200)
committertechknowlogick <techknowlogick@gitea.io>
Sun, 7 Jul 2019 02:25:05 +0000 (22:25 -0400)
modules/upload/filetype.go [new file with mode: 0644]
routers/api/v1/repo/release_attachment.go
routers/repo/attachment.go
routers/repo/editor.go
routers/repo/issue.go

diff --git a/modules/upload/filetype.go b/modules/upload/filetype.go
new file mode 100644 (file)
index 0000000..1ec7324
--- /dev/null
@@ -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
+}
index f85787bc592a2aec440e4a024690b094b3dfc07d..d0eb3d4ae11e5c6ae3a93ed99c0cf7382f0e3ca6 100644 (file)
@@ -5,13 +5,12 @@
 package repo
 
 import (
-       "errors"
-       "net/http"
        "strings"
 
        "code.gitea.io/gitea/models"
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/upload"
 
        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
-       fileType := http.DetectContentType(buf)
-
-       allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
-       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"))
+       err = upload.VerifyAllowedContentType(buf, strings.Split(setting.AttachmentAllowedTypes, ","))
+       if err != nil {
+               ctx.Error(400, "DetectContentType", err)
                return
        }
 
index 8913e630150cc62e67ded7023ab642730af07a05..a07a2a8ace9c566f9027e75d60e87420022db88c 100644 (file)
@@ -6,13 +6,13 @@ package repo
 
 import (
        "fmt"
-       "net/http"
        "strings"
 
        "code.gitea.io/gitea/models"
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/setting"
+       "code.gitea.io/gitea/modules/upload"
 )
 
 func renderAttachmentSettings(ctx *context.Context) {
@@ -42,21 +42,10 @@ func UploadAttachment(ctx *context.Context) {
        if n > 0 {
                buf = buf[:n]
        }
-       fileType := http.DetectContentType(buf)
 
-       allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
-       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)
-               ctx.Error(400, ErrFileTypeForbidden.Error())
+       err = upload.VerifyAllowedContentType(buf, strings.Split(setting.AttachmentAllowedTypes, ","))
+       if err != nil {
+               ctx.Error(400, err.Error())
                return
        }
 
index 062ecfebf777bc15062f40fe4fae7088c7da8616..f3327017e5f361bd1c87b248307ee472604ff4cc 100644 (file)
@@ -7,7 +7,6 @@ package repo
 import (
        "fmt"
        "io/ioutil"
-       "net/http"
        "path"
        "strings"
 
@@ -20,6 +19,7 @@ import (
        "code.gitea.io/gitea/modules/repofiles"
        "code.gitea.io/gitea/modules/setting"
        "code.gitea.io/gitea/modules/templates"
+       "code.gitea.io/gitea/modules/upload"
        "code.gitea.io/gitea/modules/util"
 )
 
@@ -594,20 +594,11 @@ func UploadFileToServer(ctx *context.Context) {
        if n > 0 {
                buf = buf[:n]
        }
-       fileType := http.DetectContentType(buf)
 
        if len(setting.Repository.Upload.AllowedTypes) > 0 {
-               allowed := false
-               for _, t := range setting.Repository.Upload.AllowedTypes {
-                       t := strings.Trim(t, " ")
-                       if t == "*/*" || t == fileType {
-                               allowed = true
-                               break
-                       }
-               }
-
-               if !allowed {
-                       ctx.Error(400, ErrFileTypeForbidden.Error())
+               err = upload.VerifyAllowedContentType(buf, setting.Repository.Upload.AllowedTypes)
+               if err != nil {
+                       ctx.Error(400, err.Error())
                        return
                }
        }
index 3904d29532fded6432c3735062d0ccea196abfa2..72e0357e6cf871942d5a5fa99d8c7b4d2ed93c21 100644 (file)
@@ -41,8 +41,6 @@ const (
 )
 
 var (
-       // ErrFileTypeForbidden not allowed file type error
-       ErrFileTypeForbidden = errors.New("File type is not allowed")
        // ErrTooManyFiles upload too many files
        ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded")
        // IssueTemplateCandidates issue templates