Skip to content

Commit

Permalink
Fix issue validating multipart.FileHeader files
Browse files Browse the repository at this point in the history
  • Loading branch information
KyriakosMilad committed Apr 11, 2022
1 parent f3538f9 commit d774bd9
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 23 deletions.
5 changes: 4 additions & 1 deletion helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,14 @@ func getFileSize(v interface{}) (int64, error) {
}
s, err := f.Stat()
if err != nil {
return 0, err
return 0, errors.New("can't get size from os.File: " + err.Error())
}
return s.Size(), nil
}
if f, ok := v.(*multipart.FileHeader); ok {
if reflect.ValueOf(f.Size).IsZero() || reflect.ValueOf(f.Filename).IsZero() || reflect.ValueOf(f.Header).IsZero() {
return 0, errors.New("can't get size from non-valid multipart.FileHeader")
}
return f.Size, nil
}
return 0, fmt.Errorf("%v is not type of *os.File or *multipart.FileHeader", v)
Expand Down
3 changes: 2 additions & 1 deletion helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package valdn
import (
"fmt"
"mime/multipart"
"net/textproto"
"os"
"reflect"
"testing"
Expand Down Expand Up @@ -607,7 +608,7 @@ func Test_getFileSize(t *testing.T) {
{
name: "test getFileSize with multipart.FileHeader",
args: args{
&multipart.FileHeader{Size: 44},
&multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
},
wantErr: false,
wantSize: 44,
Expand Down
23 changes: 12 additions & 11 deletions rules_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package valdn

import (
"mime/multipart"
"net/textproto"
"os"
"reflect"
"testing"
Expand Down Expand Up @@ -3080,7 +3081,7 @@ func Test_fileRule(t *testing.T) {
name: "test fileRule with multipart.FileHeaders",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "",
},
wantErr: false,
Expand Down Expand Up @@ -3129,7 +3130,7 @@ func Test_sizeRule(t *testing.T) {
name: "test sizeRule",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "44",
},
wantErr: false,
Expand All @@ -3139,7 +3140,7 @@ func Test_sizeRule(t *testing.T) {
name: "test sizeRule with unsuitable data",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "43",
},
wantErr: true,
Expand Down Expand Up @@ -3196,7 +3197,7 @@ func Test_sizeMinRule(t *testing.T) {
name: "test sizeMinRule",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "44",
},
wantErr: false,
Expand All @@ -3206,7 +3207,7 @@ func Test_sizeMinRule(t *testing.T) {
name: "test sizeMinRule with unsuitable data",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "45",
},
wantErr: true,
Expand Down Expand Up @@ -3263,7 +3264,7 @@ func Test_sizeMaxRule(t *testing.T) {
name: "test sizeMaxRule",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "44",
},
wantErr: false,
Expand All @@ -3273,7 +3274,7 @@ func Test_sizeMaxRule(t *testing.T) {
name: "test sizeMaxRule with unsuitable data",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "43",
},
wantErr: true,
Expand All @@ -3283,7 +3284,7 @@ func Test_sizeMaxRule(t *testing.T) {
name: "test sizeMaxRule with non-integer ruleVal",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "forty",
},
wantErr: false,
Expand Down Expand Up @@ -3330,7 +3331,7 @@ func Test_sizeBetweenRule(t *testing.T) {
name: "test sizeBetweenRule",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "44,45",
},
wantErr: false,
Expand All @@ -3340,7 +3341,7 @@ func Test_sizeBetweenRule(t *testing.T) {
name: "test sizeBetweenRule with unsuitable data",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "1,40",
},
wantErr: true,
Expand All @@ -3350,7 +3351,7 @@ func Test_sizeBetweenRule(t *testing.T) {
name: "test sizeBetweenRule with unsuitable ruleVal",
args: args{
name: "file",
val: &multipart.FileHeader{Size: 44},
val: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
ruleVal: "66",
},
wantErr: false,
Expand Down
7 changes: 2 additions & 5 deletions utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -309,12 +309,9 @@ func IsURL(s string) bool {

// IsFile reports weather v is a valid file or not.
func IsFile(v interface{}) bool {
size, err := getFileSize(v)
_, err := getFileSize(v)
if err != nil {
return false
}
if size > 0 {
return true
}
return false
return true
}
25 changes: 20 additions & 5 deletions utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package valdn

import (
"mime/multipart"
"net/textproto"
"os"
"testing"
)

Expand Down Expand Up @@ -1392,10 +1394,9 @@ func Test_IsIPv6(t *testing.T) {
s string
}
tests := []struct {
name string
args args
want bool
wantPanic bool
name string
args args
want bool
}{
{
name: "test IsIPv6",
Expand Down Expand Up @@ -1532,7 +1533,7 @@ func Test_IsFile(t *testing.T) {
{
name: "test IsFile",
args: args{
v: &multipart.FileHeader{Size: 44},
v: &multipart.FileHeader{Size: 44, Filename: "file", Header: textproto.MIMEHeader{}},
},
want: true,
},
Expand All @@ -1543,6 +1544,20 @@ func Test_IsFile(t *testing.T) {
},
want: false,
},
{
name: "test IsFile with unsuitable data #2",
args: args{
v: &multipart.FileHeader{},
},
want: false,
},
{
name: "test IsFile with unsuitable data #3",
args: args{
v: &os.File{},
},
want: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down

0 comments on commit d774bd9

Please sign in to comment.