X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=rpc%2Fdial.go;fp=rpc%2Fdial.go;h=680cb87df39ae0c999ce789d5d53bb168ed64b80;hb=304a68c565d58ae52dd39cf6e2d6ef52cada7d19;hp=db25cb7b6e823ab5287e039304a31a46c5483ab3;hpb=ee36e1803e470eb760f72a5ef44a8e4447749641;p=safcm%2Fsafcm.git diff --git a/rpc/dial.go b/rpc/dial.go index db25cb7..680cb87 100644 --- a/rpc/dial.go +++ b/rpc/dial.go @@ -98,6 +98,25 @@ func (c *Conn) dialSSH(stdin io.Writer, stdout_ io.Reader) error { path := fmt.Sprintf("/tmp/safcm-remote-%d", uid) c.debugf("DialSSH: probing remote at %q", path) + + // Compatibility for different operating systems + var compat string + switch goos { + case "linux": + compat = ` +dir_stat='drwxrwxrwt 0 0' +file_stat="-rwx------ $(id -u) $(id -g)" +compat_stat() { + stat -c '%A %u %g' "$1" +} +compat_sha512sum() { + sha512sum "$1" +} +` + default: + return fmt.Errorf("internal error: no support for %q", goos) + } + // Use a function so the shell cannot execute the input line-wise. // This is important because we're also using stdin to send data to // the script. If the shell executes the input line-wise then our @@ -116,18 +135,19 @@ func (c *Conn) dialSSH(stdin io.Writer, stdout_ io.Reader) error { // `test -e` is only used to prevent error messages if the file // doesn't exist. It does not guard against any races. _, err = fmt.Fprintf(stdin, ` +%s f() { x=%q dir="$(dirname "$x")" - if ! test "$(stat -c '%%A %%u %%g' "$dir")" = 'drwxrwxrwt 0 0'; then + if ! test "$(compat_stat "$dir")" = "$dir_stat"; then echo "unsafe permissions on $dir, aborting" >&2 exit 1 fi - if test -e "$x" && test "$(stat -c '%%A %%u' "$x")" = "-rwx------ $(id -u)"; then + if test -e "$x" && test "$(compat_stat "$x")" = "$file_stat"; then # Report checksum - sha512sum "$x" + compat_sha512sum "$x" else # Empty checksum to request upload echo @@ -155,7 +175,7 @@ f() { exec "$x" sync } f -`, path) +`, compat, path) if err != nil { return err }