Skip to content

Commit a8ffb16

Browse files
committed
kooks: fill AccessInfo in pre-create hook
when Upload-Concat is used, to check authorization for instance
1 parent 0f6fe1a commit a8ffb16

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

pkg/handler/post_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,48 @@ func TestPost(t *testing.T) {
599599
},
600600
}).Run(handler, t)
601601
})
602+
603+
SubTest(t, "RejectAccessConcat", func(t *testing.T, store *MockFullDataStore, composer *StoreComposer) {
604+
ctrl := gomock.NewController(t)
605+
defer ctrl.Finish()
606+
uploadA := NewMockFullUpload(ctrl)
607+
uploadB := NewMockFullUpload(ctrl)
608+
609+
gomock.InOrder(
610+
store.EXPECT().GetUpload(gomock.Any(), "a").Return(uploadA, nil),
611+
uploadA.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
612+
ID: "a",
613+
Offset: 5,
614+
Size: 5,
615+
}, nil),
616+
617+
store.EXPECT().GetUpload(gomock.Any(), "b").Return(uploadB, nil),
618+
uploadB.EXPECT().GetInfo(gomock.Any()).Return(FileInfo{
619+
ID: "b",
620+
Offset: 10,
621+
Size: 10,
622+
}, nil),
623+
)
624+
625+
handler, _ := NewHandler(Config{
626+
StoreComposer: composer,
627+
BasePath: "/files/",
628+
PreUploadCreateCallback: func(event HookEvent) (HTTPResponse, FileInfoChanges, error) {
629+
return HTTPResponse{}, FileInfoChanges{}, ErrAccessRejectedByServer
630+
},
631+
})
632+
633+
(&httpTest{
634+
Method: "POST",
635+
ReqHeader: map[string]string{
636+
"Tus-Resumable": "1.0.0",
637+
"Upload-Concat": "final;http://tus.io/files/a http://tus.io/files/b",
638+
},
639+
Code: ErrAccessRejectedByServer.HTTPResponse.StatusCode,
640+
ResHeader: ErrAccessRejectedByServer.HTTPResponse.Header,
641+
ResBody: ErrAccessRejectedByServer.HTTPResponse.Body,
642+
}).Run(handler, t)
643+
})
602644
})
603645

604646
SubTest(t, "ExperimentalProtocol", func(t *testing.T, _ *MockFullDataStore, _ *StoreComposer) {

pkg/handler/unrouted_handler.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,15 @@ func (handler *UnroutedHandler) PostFile(w http.ResponseWriter, r *http.Request)
293293
var size int64
294294
var sizeIsDeferred bool
295295
var partialUploads []Upload
296+
var partialFileInfos []FileInfo
296297
if isFinal {
297298
// A final upload must not contain a chunk within the creation request
298299
if containsChunk {
299300
handler.sendError(c, ErrModifyFinal)
300301
return
301302
}
302303

303-
partialUploads, size, err = handler.sizeOfUploads(c, partialUploadIDs)
304+
partialUploads, partialFileInfos, size, err = handler.sizeOfUploads(c, partialUploadIDs)
304305
if err != nil {
305306
handler.sendError(c, err)
306307
return
@@ -339,7 +340,8 @@ func (handler *UnroutedHandler) PostFile(w http.ResponseWriter, r *http.Request)
339340
}
340341

341342
if handler.config.PreUploadCreateCallback != nil {
342-
resp2, changes, err := handler.config.PreUploadCreateCallback(newHookEvent(c, &info, nil))
343+
access := newAccessInfo(AccessModeRead, partialFileInfos)
344+
resp2, changes, err := handler.config.PreUploadCreateCallback(newHookEvent(c, &info, &access))
343345
if err != nil {
344346
handler.sendError(c, err)
345347
return
@@ -1310,27 +1312,29 @@ func getHostAndProtocol(r *http.Request, allowForwarded bool) (host, proto strin
13101312
// The get sum of all sizes for a list of upload ids while checking whether
13111313
// all of these uploads are finished yet. This is used to calculate the size
13121314
// of a final resource.
1313-
func (handler *UnroutedHandler) sizeOfUploads(ctx context.Context, ids []string) (partialUploads []Upload, size int64, err error) {
1315+
func (handler *UnroutedHandler) sizeOfUploads(ctx context.Context, ids []string) (partialUploads []Upload, partialFileInfos []FileInfo, size int64, err error) {
13141316
partialUploads = make([]Upload, len(ids))
1317+
partialFileInfos = make([]FileInfo, len(ids))
13151318

13161319
for i, id := range ids {
13171320
upload, err := handler.composer.Core.GetUpload(ctx, id)
13181321
if err != nil {
1319-
return nil, 0, err
1322+
return nil, nil, 0, err
13201323
}
13211324

13221325
info, err := upload.GetInfo(ctx)
13231326
if err != nil {
1324-
return nil, 0, err
1327+
return nil, nil, 0, err
13251328
}
13261329

13271330
if info.SizeIsDeferred || info.Offset != info.Size {
13281331
err = ErrUploadNotFinished
1329-
return nil, 0, err
1332+
return nil, nil, 0, err
13301333
}
13311334

13321335
size += info.Size
13331336
partialUploads[i] = upload
1337+
partialFileInfos[i] = info
13341338
}
13351339

13361340
return

0 commit comments

Comments
 (0)