aboutsummaryrefslogtreecommitdiff
path: root/session.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2023-10-21 17:23:02 +0700
committerShulhan <ms@kilabit.info>2023-10-21 17:23:02 +0700
commitede44261a87f320036cc0cd399d2df5ab5e38222 (patch)
treeaab37e6d0c8ad507c83297362e5dd7f683cf9f9d /session.go
parent761212298e017f58345aa948aebedc2c07b73753 (diff)
downloadawwan-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.go37
1 files changed, 18 insertions, 19 deletions
diff --git a/session.go b/session.go
index 4cd746d..bab3607 100644
--- a/session.go
+++ b/session.go
@@ -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
}