diff options
| author | Shulhan <ms@kilabit.info> | 2023-10-21 17:23:02 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2023-10-21 17:23:02 +0700 |
| commit | ede44261a87f320036cc0cd399d2df5ab5e38222 (patch) | |
| tree | aab37e6d0c8ad507c83297362e5dd7f683cf9f9d /session.go | |
| parent | 761212298e017f58345aa948aebedc2c07b73753 (diff) | |
| download | awwan-ede44261a87f320036cc0cd399d2df5ab5e38222.tar.xz | |
all: set the mode permission first before owner in Copy and SudoCopy
In case of Copy, the user that run chmod definitely can change the
permission but may not have privileged to chown.
By setting the permission first, we minimize error during "#get:" or
"#put:".
Diffstat (limited to 'session.go')
| -rw-r--r-- | session.go | 37 |
1 files changed, 18 insertions, 19 deletions
@@ -151,6 +151,12 @@ func (ses *Session) Copy(stmt *Statement) (err error) { return fmt.Errorf(`%s: %w`, logp, err) } + if stmt.mode != 0 { + err = os.Chmod(dst, stmt.mode) + if err != nil { + return fmt.Errorf(`%s: %w`, logp, err) + } + } if len(stmt.owner) != 0 { var cmd = fmt.Sprintf(`chown %s %s`, stmt.owner, dst) err = libexec.Run(cmd, nil, nil) @@ -158,13 +164,6 @@ func (ses *Session) Copy(stmt *Statement) (err error) { return fmt.Errorf(`%s: chown %s: %w`, logp, stmt.owner, err) } } - if stmt.mode != 0 { - err = os.Chmod(dst, stmt.mode) - if err != nil { - return fmt.Errorf(`%s: %w`, logp, err) - } - } - return nil } @@ -274,18 +273,6 @@ func (ses *Session) SudoCopy(req *Request, stmt *Statement) (err error) { return fmt.Errorf("%s: %w", logp, err) } - if len(stmt.owner) != 0 { - var sudoChown = &Statement{ - kind: statementKindDefault, - cmd: `sudo`, - args: []string{`chown`, stmt.owner, dst}, - raw: []byte(fmt.Sprintf(`sudo chown %s %q`, stmt.owner, dst)), - } - err = ExecLocal(req, sudoChown) - if err != nil { - return fmt.Errorf(`%s: chown: %w`, logp, err) - } - } if stmt.mode != 0 { var ( fsmode = strconv.FormatUint(uint64(stmt.mode), 8) @@ -301,6 +288,18 @@ func (ses *Session) SudoCopy(req *Request, stmt *Statement) (err error) { return fmt.Errorf(`%s: chmod: %w`, logp, err) } } + if len(stmt.owner) != 0 { + var sudoChown = &Statement{ + kind: statementKindDefault, + cmd: `sudo`, + args: []string{`chown`, stmt.owner, dst}, + raw: []byte(fmt.Sprintf(`sudo chown %s %q`, stmt.owner, dst)), + } + err = ExecLocal(req, sudoChown) + if err != nil { + return fmt.Errorf(`%s: chown: %w`, logp, err) + } + } return nil } |
