Fix command runners for upload

pull/3676/head
BeziCZ 2025-01-16 15:10:37 +01:00
parent e92dbb4bb8
commit c9f6ccc55c
2 changed files with 48 additions and 0 deletions

View File

@ -131,6 +131,13 @@ func tusPatchHandler() handleFunc {
)
}
if uploadOffset == 0 {
err = d.RunBeforeHook("upload", r.URL.Path, "", d.user)
if err != nil {
return errToStatus(err), err
}
}
openFile, err := d.user.Fs.OpenFile(r.URL.Path, os.O_WRONLY|os.O_APPEND, files.PermFile)
if err != nil {
return http.StatusInternalServerError, fmt.Errorf("could not open file: %w", err)
@ -150,6 +157,14 @@ func tusPatchHandler() handleFunc {
w.Header().Set("Upload-Offset", strconv.FormatInt(uploadOffset+bytesWritten, 10))
if bytesWritten < int64(d.Settings.Tus.ChunkSize) {
fmt.Printf("Final chunk detected (size: %d). Running after hook\n", bytesWritten)
err = d.RunAfterHook("upload", r.URL.Path, "", d.user)
if err != nil {
return errToStatus(err), err
}
}
return http.StatusNoContent, nil
})
}

View File

@ -17,6 +17,39 @@ type Runner struct {
*settings.Settings
}
// RunBeforeHooks and RunAfterHooks is used for the chunked upload since it cannot use the standard RunHook
func (r *Runner) RunBeforeHook(evt, path, dst string, user *users.User) error {
path = user.FullPath(path)
dst = user.FullPath(dst)
if r.Enabled {
if val, ok := r.Commands["before_"+evt]; ok {
for _, command := range val {
err := r.exec(command, "before_"+evt, path, dst, user)
if err != nil {
return err
}
}
}
}
return nil
}
func (r *Runner) RunAfterHook(evt, path, dst string, user *users.User) error {
path = user.FullPath(path)
dst = user.FullPath(dst)
if r.Enabled {
if val, ok := r.Commands["after_"+evt]; ok {
for _, command := range val {
err := r.exec(command, "after_"+evt, path, dst, user)
if err != nil {
return err
}
}
}
}
return nil
}
// RunHook runs the hooks for the before and after event.
func (r *Runner) RunHook(fn func() error, evt, path, dst string, user *users.User) error {
path = user.FullPath(path)