Fix upload file type check (#7890)
* fix upload file type check * make the function simple and added tests * Update comment as per @silverwind
This commit is contained in:
parent
a678ea44b8
commit
2d0b90c967
2 changed files with 54 additions and 10 deletions
|
@ -31,19 +31,16 @@ func (err ErrFileTypeForbidden) Error() string {
|
||||||
func VerifyAllowedContentType(buf []byte, allowedTypes []string) error {
|
func VerifyAllowedContentType(buf []byte, allowedTypes []string) error {
|
||||||
fileType := http.DetectContentType(buf)
|
fileType := http.DetectContentType(buf)
|
||||||
|
|
||||||
allowed := false
|
|
||||||
for _, t := range allowedTypes {
|
for _, t := range allowedTypes {
|
||||||
t := strings.Trim(t, " ")
|
t := strings.Trim(t, " ")
|
||||||
if t == "*/*" || t == fileType {
|
|
||||||
allowed = true
|
if t == "*/*" || t == fileType ||
|
||||||
break
|
// Allow directives after type, like 'text/plain; charset=utf-8'
|
||||||
|
strings.HasPrefix(fileType, t+";") {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !allowed {
|
|
||||||
log.Info("Attachment with type %s blocked from upload", fileType)
|
log.Info("Attachment with type %s blocked from upload", fileType)
|
||||||
return ErrFileTypeForbidden{Type: fileType}
|
return ErrFileTypeForbidden{Type: fileType}
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
47
modules/upload/filetype_test.go
Normal file
47
modules/upload/filetype_test.go
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// 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 (
|
||||||
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestUpload(t *testing.T) {
|
||||||
|
testContent := []byte(`This is a plain text file.`)
|
||||||
|
var b bytes.Buffer
|
||||||
|
w := gzip.NewWriter(&b)
|
||||||
|
w.Write(testContent)
|
||||||
|
w.Close()
|
||||||
|
|
||||||
|
kases := []struct {
|
||||||
|
data []byte
|
||||||
|
allowedTypes []string
|
||||||
|
err error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
data: testContent,
|
||||||
|
allowedTypes: []string{"text/plain"},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: testContent,
|
||||||
|
allowedTypes: []string{"application/x-gzip"},
|
||||||
|
err: ErrFileTypeForbidden{"text/plain; charset=utf-8"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
data: b.Bytes(),
|
||||||
|
allowedTypes: []string{"application/x-gzip"},
|
||||||
|
err: nil,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, kase := range kases {
|
||||||
|
assert.Equal(t, kase.err, VerifyAllowedContentType(kase.data, kase.allowedTypes))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue