mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
event action: add update modtime to fs rename
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -176,7 +176,7 @@ func (c *Connection) getFileWriter(name string) (io.WriteCloser, error) {
|
||||
}
|
||||
|
||||
if common.Config.IsAtomicUploadEnabled() && fs.IsAtomicUploadSupported() {
|
||||
_, _, err = fs.Rename(p, filePath)
|
||||
_, _, err = fs.Rename(p, filePath, 0)
|
||||
if err != nil {
|
||||
c.Log(logger.LevelError, "error renaming existing file for atomic upload, source: %q, dest: %q, err: %+v",
|
||||
p, filePath, err)
|
||||
|
||||
@@ -2458,28 +2458,34 @@ func TestEventActionValidation(t *testing.T) {
|
||||
_, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(resp), "no path to rename specified")
|
||||
action.Options.FsConfig.Renames = []dataprovider.KeyValue{
|
||||
action.Options.FsConfig.Renames = []dataprovider.RenameConfig{
|
||||
{
|
||||
Key: "",
|
||||
Value: "/adir",
|
||||
KeyValue: dataprovider.KeyValue{
|
||||
Key: "",
|
||||
Value: "/adir",
|
||||
},
|
||||
},
|
||||
}
|
||||
_, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(resp), "invalid paths to rename")
|
||||
action.Options.FsConfig.Renames = []dataprovider.KeyValue{
|
||||
action.Options.FsConfig.Renames = []dataprovider.RenameConfig{
|
||||
{
|
||||
Key: "adir",
|
||||
Value: "/adir",
|
||||
KeyValue: dataprovider.KeyValue{
|
||||
Key: "adir",
|
||||
Value: "/adir",
|
||||
},
|
||||
},
|
||||
}
|
||||
_, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest)
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, string(resp), "rename source and target cannot be equal")
|
||||
action.Options.FsConfig.Renames = []dataprovider.KeyValue{
|
||||
action.Options.FsConfig.Renames = []dataprovider.RenameConfig{
|
||||
{
|
||||
Key: "/",
|
||||
Value: "/dir",
|
||||
KeyValue: dataprovider.KeyValue{
|
||||
Key: "/",
|
||||
Value: "/dir",
|
||||
},
|
||||
},
|
||||
}
|
||||
_, resp, err = httpdtest.AddEventAction(action, http.StatusBadRequest)
|
||||
@@ -23974,16 +23980,19 @@ func TestWebEventAction(t *testing.T) {
|
||||
|
||||
action.Options.FsConfig = dataprovider.EventActionFilesystemConfig{
|
||||
Type: dataprovider.FilesystemActionRename,
|
||||
Renames: []dataprovider.KeyValue{
|
||||
Renames: []dataprovider.RenameConfig{
|
||||
{
|
||||
Key: "/src",
|
||||
Value: "/target",
|
||||
KeyValue: dataprovider.KeyValue{
|
||||
Key: "/src",
|
||||
Value: "/target",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
form.Set("fs_action_type", fmt.Sprintf("%d", action.Options.FsConfig.Type))
|
||||
form.Set("fs_rename[0][fs_rename_source]", action.Options.FsConfig.Renames[0].Key)
|
||||
form.Set("fs_rename[0][fs_rename_target]", action.Options.FsConfig.Renames[0].Value)
|
||||
form.Set("fs_rename[0][fs_rename_options][]", "1")
|
||||
req, err = http.NewRequest(http.MethodPost, path.Join(webAdminEventActionPath, action.Name),
|
||||
bytes.NewBuffer([]byte(form.Encode())))
|
||||
assert.NoError(t, err)
|
||||
@@ -23995,7 +24004,9 @@ func TestWebEventAction(t *testing.T) {
|
||||
actionGet, _, err = httpdtest.GetEventActionByName(action.Name, http.StatusOK)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, action.Type, actionGet.Type)
|
||||
assert.Len(t, actionGet.Options.FsConfig.Renames, 1)
|
||||
if assert.Len(t, actionGet.Options.FsConfig.Renames, 1) {
|
||||
assert.True(t, actionGet.Options.FsConfig.Renames[0].UpdateModTime)
|
||||
}
|
||||
|
||||
action.Options.FsConfig = dataprovider.EventActionFilesystemConfig{
|
||||
Type: dataprovider.FilesystemActionCopy,
|
||||
|
||||
@@ -2201,6 +2201,28 @@ func getKeyValsFromPostFields(r *http.Request, key, val string) []dataprovider.K
|
||||
return res
|
||||
}
|
||||
|
||||
func getRenameConfigsFromPostFields(r *http.Request) []dataprovider.RenameConfig {
|
||||
var res []dataprovider.RenameConfig
|
||||
keys := r.Form["fs_rename_source"]
|
||||
values := r.Form["fs_rename_target"]
|
||||
|
||||
for idx, k := range keys {
|
||||
v := values[idx]
|
||||
if k != "" && v != "" {
|
||||
opts := r.Form["fs_rename_options"+strconv.Itoa(idx)]
|
||||
res = append(res, dataprovider.RenameConfig{
|
||||
KeyValue: dataprovider.KeyValue{
|
||||
Key: k,
|
||||
Value: v,
|
||||
},
|
||||
UpdateModTime: slices.Contains(opts, "1"),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func getFoldersRetentionFromPostFields(r *http.Request) ([]dataprovider.FolderRetention, error) {
|
||||
var res []dataprovider.FolderRetention
|
||||
paths := r.Form["folder_retention_path"]
|
||||
@@ -2310,6 +2332,8 @@ func updateRepeaterFormActionFields(r *http.Request) {
|
||||
base, _ := strings.CutSuffix(k, "[fs_rename_source]")
|
||||
r.Form.Add("fs_rename_source", strings.TrimSpace(r.Form.Get(k)))
|
||||
r.Form.Add("fs_rename_target", strings.TrimSpace(r.Form.Get(base+"[fs_rename_target]")))
|
||||
r.Form["fs_rename_options"+strconv.Itoa(len(r.Form["fs_rename_source"])-1)] =
|
||||
r.Form[base+"[fs_rename_options][]"]
|
||||
continue
|
||||
}
|
||||
if hasPrefixAndSuffix(k, "fs_copy[", "][fs_copy_source]") {
|
||||
@@ -2398,7 +2422,7 @@ func getEventActionOptionsFromPostFields(r *http.Request) (dataprovider.BaseEven
|
||||
},
|
||||
FsConfig: dataprovider.EventActionFilesystemConfig{
|
||||
Type: fsActionType,
|
||||
Renames: getKeyValsFromPostFields(r, "fs_rename_source", "fs_rename_target"),
|
||||
Renames: getRenameConfigsFromPostFields(r),
|
||||
Deletes: getSliceFromDelimitedValues(r.Form.Get("fs_delete_paths"), ","),
|
||||
MkDirs: getSliceFromDelimitedValues(r.Form.Get("fs_mkdir_paths"), ","),
|
||||
Exist: getSliceFromDelimitedValues(r.Form.Get("fs_exist_paths"), ","),
|
||||
|
||||
Reference in New Issue
Block a user