Skip to content

Commit e55edf4

Browse files
committed
Better check for max file size
1 parent efa7cb0 commit e55edf4

6 files changed

Lines changed: 30 additions & 23 deletions

File tree

internal/storage/chunking/Chunking.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,19 +202,22 @@ func FileExists(id string) bool {
202202
}
203203

204204
// NewChunk allocates the space for the new file and writes the chunk
205-
func NewChunk(chunkContent io.Reader, fileHeader *multipart.FileHeader, info ChunkInfo) error {
206-
err := allocateFile(info)
205+
func NewChunk(chunkContent io.Reader, fileHeader *multipart.FileHeader, info ChunkInfo, maxAllowedSize int64) error {
206+
err := allocateFile(info, maxAllowedSize)
207207
if err != nil {
208208
return err
209209
}
210210
return writeChunk(chunkContent, fileHeader, info)
211211
}
212212

213-
func allocateFile(info ChunkInfo) error {
213+
func allocateFile(info ChunkInfo, maxAllowedSize int64) error {
214+
if maxAllowedSize <= 0 {
215+
return errors.New("invalid maxAllowedSize")
216+
}
214217
if FileExists(info.UUID) {
215218
return nil
216219
}
217-
maxSizeBytes := int64(configuration.Get().MaxFileSizeMB) * 1024 * 1024
220+
maxSizeBytes := min(int64(configuration.Get().MaxFileSizeMB)*1024*1024, maxAllowedSize)
218221
if info.TotalFilesizeBytes > maxSizeBytes {
219222
return errors.New("declared file size exceeds the maximum allowed size")
220223
}

internal/storage/chunking/Chunking_test.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import (
44
"bytes"
55
"crypto/sha1"
66
"encoding/hex"
7-
"github.com/forceu/gokapi/internal/configuration"
8-
"github.com/forceu/gokapi/internal/helper"
9-
"github.com/forceu/gokapi/internal/test"
10-
"github.com/forceu/gokapi/internal/test/testconfiguration"
11-
"github.com/juju/ratelimit"
12-
"golang.org/x/sync/errgroup"
137
"mime/multipart"
148
"net/textproto"
159
"net/url"
1610
"os"
1711
"strings"
1812
"testing"
13+
14+
"github.com/forceu/gokapi/internal/configuration"
15+
"github.com/forceu/gokapi/internal/helper"
16+
"github.com/forceu/gokapi/internal/test"
17+
"github.com/forceu/gokapi/internal/test/testconfiguration"
18+
"github.com/juju/ratelimit"
19+
"golang.org/x/sync/errgroup"
1920
)
2021

2122
func TestMain(m *testing.M) {
@@ -286,32 +287,32 @@ func TestNewChunk(t *testing.T) {
286287
header := multipart.FileHeader{
287288
Size: 21,
288289
}
289-
err := NewChunk(strings.NewReader("This is a test content"), &header, info)
290+
err := NewChunk(strings.NewReader("This is a test content"), &header, info, 100000)
290291
test.IsNil(t, err)
291292
test.IsEqualString(t, sha1sumFile("test/data/chunk-testuuid12345"), "a69ec3c3a031e3540d0c2a864ca931f3d54e2c13")
292293

293294
info.Offset = 52
294295
header = multipart.FileHeader{
295296
Size: 11,
296297
}
297-
err = NewChunk(strings.NewReader("More content"), &header, info)
298+
err = NewChunk(strings.NewReader("More content"), &header, info, 100000)
298299
test.IsNil(t, err)
299300
test.IsEqualString(t, sha1sumFile("test/data/chunk-testuuid12345"), "8794d8352fae46b83bab83d3e613dde8f0244ded")
300301

301302
info.Offset = 99
302-
err = NewChunk(strings.NewReader("More content"), &header, info)
303+
err = NewChunk(strings.NewReader("More content"), &header, info, 100000)
303304
test.IsNotNil(t, err)
304305

305306
err = os.Remove("test/data/chunk-testuuid12345")
306307
test.IsNil(t, err)
307308

308309
info.TotalFilesizeBytes = -4
309-
err = NewChunk(strings.NewReader("More content"), &header, info)
310+
err = NewChunk(strings.NewReader("More content"), &header, info, 100000)
310311
test.IsNotNil(t, err)
311312

312313
info.TotalFilesizeBytes = 100
313314
info.UUID = "../../../../../../../../../../invalid"
314-
err = NewChunk(strings.NewReader("More content"), &header, info)
315+
err = NewChunk(strings.NewReader("More content"), &header, info, 100000)
315316
test.IsNotNil(t, err)
316317

317318
// Testing simultaneous writes
@@ -341,7 +342,7 @@ func writeRateLimitedChunk(firstHalf bool) error {
341342
}
342343
content := []byte(helper.GenerateRandomString(500 * 1024))
343344
bucket := ratelimit.NewBucketWithRate(400*1024, 400*1024)
344-
err := NewChunk(ratelimit.Reader(bytes.NewReader(content), bucket), &header, info)
345+
err := NewChunk(ratelimit.Reader(bytes.NewReader(content), bucket), &header, info, 2000000)
345346
return err
346347
}
347348

internal/webserver/Webserver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ func uploadChunk(w http.ResponseWriter, r *http.Request) {
10051005
return
10061006
}
10071007
r.Body = http.MaxBytesReader(w, r.Body, maxUpload)
1008-
_, err := fileupload.ProcessNewChunk(w, r, false, "")
1008+
_, err := fileupload.ProcessNewChunk(w, r, false, "", maxUpload)
10091009
responseError(w, err)
10101010
}
10111011

internal/webserver/api/Api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ func processNewChunk(w http.ResponseWriter, request chunkParams, maxFileSizeMb i
476476
return http.StatusBadRequest, errorcodes.FileTooLarge, storage.ErrorFileTooLarge.Error()
477477
}
478478
request.GetRequest().Body = http.MaxBytesReader(w, request.GetRequest().Body, maxUpload)
479-
errCode, err := fileupload.ProcessNewChunk(w, request.GetRequest(), true, filerequestId)
479+
errCode, err := fileupload.ProcessNewChunk(w, request.GetRequest(), true, filerequestId, maxUpload)
480480
if err != nil {
481481
return http.StatusBadRequest, errCode, err.Error()
482482
}

internal/webserver/fileupload/FileUpload.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func isChunkMinChunkSize(r *http.Request, offset, fileSize int64) bool {
6565
}
6666

6767
// ProcessNewChunk processes a file chunk upload request
68-
func ProcessNewChunk(w http.ResponseWriter, r *http.Request, isApiCall bool, filerequestId string) (int, error) {
68+
func ProcessNewChunk(w http.ResponseWriter, r *http.Request, isApiCall bool, filerequestId string, maxFileSize int64) (int, error) {
6969
err := r.ParseMultipartForm(int64(configuration.Get().MaxMemory) * 1024 * 1024)
7070
if err != nil {
7171
return errorcodes.CannotParse, err
@@ -83,14 +83,17 @@ func ProcessNewChunk(w http.ResponseWriter, r *http.Request, isApiCall bool, fil
8383
if !isChunkMinChunkSize(r, chunkInfo.Offset, chunkInfo.TotalFilesizeBytes) {
8484
return errorcodes.ChunkTooSmall, storage.ErrorChunkTooSmall
8585
}
86+
if chunkInfo.TotalFilesizeBytes > maxFileSize || chunkInfo.Offset > maxFileSize {
87+
return errorcodes.FileTooLarge, storage.ErrorFileTooLarge
88+
}
8689

8790
if filerequestId != "" {
8891
if !chunkreservation.SetUploading(filerequestId, chunkInfo.UUID) {
8992
return errorcodes.InvalidChunkReservation, errors.New("chunk reservation has expired or was not requested")
9093
}
9194
}
9295

93-
err = chunking.NewChunk(file, header, chunkInfo)
96+
err = chunking.NewChunk(file, header, chunkInfo, maxFileSize)
9497
defer file.Close()
9598
if err != nil {
9699
return errorcodes.CannotAllocateFile, err

internal/webserver/fileupload/FileUpload_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,17 +99,17 @@ func TestProcess(t *testing.T) {
9999

100100
func TestProcessNewChunk(t *testing.T) {
101101
w, r := test.GetRecorder("POST", "/uploadChunk", nil, nil, strings.NewReader("invalid§$%&%§"))
102-
_, err := ProcessNewChunk(w, r, false, "")
102+
_, err := ProcessNewChunk(w, r, false, "", 100*1000*1000)
103103
test.IsNotNil(t, err)
104104

105105
w = httptest.NewRecorder()
106106
r = getFileUploadRecorder(false)
107-
_, err = ProcessNewChunk(w, r, false, "")
107+
_, err = ProcessNewChunk(w, r, false, "", 100*1000*1000)
108108
test.IsNotNil(t, err)
109109

110110
w = httptest.NewRecorder()
111111
r = getFileUploadRecorder(true)
112-
_, err = ProcessNewChunk(w, r, false, "")
112+
_, err = ProcessNewChunk(w, r, false, "", 100*1000*1000)
113113
test.IsNil(t, err)
114114
response, err := io.ReadAll(w.Result().Body)
115115
test.IsNil(t, err)

0 commit comments

Comments
 (0)