Lain Iwakura d31cbb3a7c
Some checks failed
CIFuzz / Fuzzing (push) Waiting to run
C/C++ CI self-hosted / win10 cygwin-release (push) Waiting to run
C/C++ CI self-hosted / ARM default (push) Waiting to run
C/C++ CI self-hosted / ARM64 default (push) Waiting to run
C/C++ CI self-hosted / alpine default (push) Waiting to run
C/C++ CI self-hosted / centos7 default (push) Waiting to run
C/C++ CI self-hosted / debian-i386 default (push) Waiting to run
C/C++ CI self-hosted / dfly30 default (push) Waiting to run
C/C++ CI self-hosted / dfly48 default (push) Waiting to run
C/C++ CI self-hosted / dfly60 default (push) Waiting to run
C/C++ CI self-hosted / dfly62 default (push) Waiting to run
C/C++ CI self-hosted / dfly64 default (push) Waiting to run
C/C++ CI self-hosted / fbsd10 default (push) Waiting to run
C/C++ CI self-hosted / fbsd12 default (push) Waiting to run
C/C++ CI self-hosted / fbsd13 default (push) Waiting to run
C/C++ CI self-hosted / fbsd14 default (push) Waiting to run
C/C++ CI self-hosted / nbsd10 default (push) Waiting to run
C/C++ CI self-hosted / nbsd3 default (push) Waiting to run
C/C++ CI self-hosted / nbsd4 default (push) Waiting to run
C/C++ CI self-hosted / nbsd8 default (push) Waiting to run
C/C++ CI self-hosted / nbsd9 default (push) Waiting to run
C/C++ CI self-hosted / obsd51 default (push) Waiting to run
C/C++ CI self-hosted / obsd67 default (push) Waiting to run
C/C++ CI self-hosted / obsd72 default (push) Waiting to run
C/C++ CI self-hosted / obsd73 default (push) Waiting to run
C/C++ CI self-hosted / obsd74 default (push) Waiting to run
C/C++ CI self-hosted / obsdsnap default (push) Waiting to run
C/C++ CI self-hosted / obsdsnap-i386 default (push) Waiting to run
C/C++ CI self-hosted / omnios default (push) Waiting to run
C/C++ CI self-hosted / openindiana default (push) Waiting to run
C/C++ CI self-hosted / ubuntu-2204 default (push) Waiting to run
C/C++ CI self-hosted / obsd-arm64 default (push) Waiting to run
C/C++ CI self-hosted / aix51 default (push) Waiting to run
C/C++ CI self-hosted / fbsd14-ppc64 default (push) Waiting to run
C/C++ CI self-hosted / sol10 default (push) Waiting to run
C/C++ CI self-hosted / sol11 default (push) Waiting to run
C/C++ CI self-hosted / win10 default (push) Waiting to run
C/C++ CI self-hosted / debian-riscv64 default (push) Waiting to run
C/C++ CI self-hosted / openwrt-mips default (push) Waiting to run
C/C++ CI self-hosted / openwrt-mipsel default (push) Waiting to run
C/C++ CI self-hosted / ARM64 pam (push) Waiting to run
C/C++ CI self-hosted / centos7 pam (push) Waiting to run
C/C++ CI self-hosted / debian-i386 pam (push) Waiting to run
C/C++ CI self-hosted / dfly48 pam (push) Waiting to run
C/C++ CI self-hosted / dfly58 pam (push) Waiting to run
C/C++ CI self-hosted / dfly60 pam (push) Waiting to run
C/C++ CI self-hosted / dfly62 pam (push) Waiting to run
C/C++ CI self-hosted / dfly64 pam (push) Waiting to run
C/C++ CI self-hosted / fbsd10 pam (push) Waiting to run
C/C++ CI self-hosted / fbsd12 pam (push) Waiting to run
C/C++ CI self-hosted / fbsd13 pam (push) Waiting to run
C/C++ CI self-hosted / fbsd14 pam (push) Waiting to run
C/C++ CI self-hosted / nbsd10 pam (push) Waiting to run
C/C++ CI self-hosted / nbsd8 pam (push) Waiting to run
C/C++ CI self-hosted / nbsd9 pam (push) Waiting to run
C/C++ CI self-hosted / omnios pam (push) Waiting to run
C/C++ CI self-hosted / openindiana pam (push) Waiting to run
C/C++ CI self-hosted / sol10 pam (push) Waiting to run
C/C++ CI self-hosted / sol11 pam-krb5 (push) Waiting to run
C/C++ CI self-hosted / sol11 sol64 (push) Waiting to run
C/C++ CI self-hosted / dfly30 without-openssl (push) Waiting to run
C/C++ CI / ubuntu-latest aws-lc (push) Failing after 31s
C/C++ CI / ubuntu-latest boringssl (push) Failing after 31s
C/C++ CI / ubuntu-latest clang-15 (push) Failing after 31s
C/C++ CI / ubuntu-latest clang-19 (push) Failing after 19s
C/C++ CI / ubuntu-latest default (push) Failing after 3s
C/C++ CI / ubuntu-latest gcc-14 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-3.2.6 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-3.3.6 (push) Failing after 3s
C/C++ CI / ubuntu-latest libressl-3.4.3 (push) Failing after 3s
C/C++ CI / ubuntu-latest libressl-3.5.3 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-3.6.1 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-3.7.2 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-3.8.4 (push) Failing after 3s
C/C++ CI / ubuntu-latest libressl-3.9.2 (push) Failing after 3s
C/C++ CI / ubuntu-latest libressl-4.0.0 (push) Failing after 4s
C/C++ CI / ubuntu-latest libressl-master (push) Failing after 4s
C/C++ CI / ubuntu-latest musl (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-1.1.1 (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-1.1.1_stable (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-1.1.1t (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-1.1.1w (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-3.0 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.0.0 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.0.15 (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-3.1 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.1.0 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.1.7 (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-3.2 (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-3.2.3 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.3 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-3.3.2 (push) Failing after 4s
C/C++ CI / ubuntu-latest openssl-3.4.0 (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-master (push) Failing after 3s
C/C++ CI / ubuntu-latest openssl-noec (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.71 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.72 (push) Failing after 3s
C/C++ CI / ubuntu-latest putty-0.73 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.74 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.75 (push) Failing after 3s
C/C++ CI / ubuntu-latest putty-0.76 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.77 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.78 (push) Failing after 3s
C/C++ CI / ubuntu-latest putty-0.79 (push) Failing after 3s
C/C++ CI / ubuntu-latest putty-0.80 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.81 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-0.82 (push) Failing after 3s
C/C++ CI / ubuntu-latest putty-0.83 (push) Failing after 4s
C/C++ CI / ubuntu-latest putty-snapshot (push) Failing after 4s
C/C++ CI / ubuntu-latest tcmalloc (push) Failing after 3s
C/C++ CI / ubuntu-latest zlib-develop (push) Failing after 3s
C/C++ CI / ubuntu-22.04 c89 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 clang-11 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 clang-12-Werror (push) Has been cancelled
C/C++ CI / ubuntu-22.04 clang-14 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 clang-sanitize-address (push) Has been cancelled
C/C++ CI / ubuntu-22.04 clang-sanitize-undefined (push) Has been cancelled
C/C++ CI / windows-2019 cygwin-release (push) Has been cancelled
C/C++ CI / windows-2022 cygwin-release (push) Has been cancelled
C/C++ CI / macos-13 default (push) Has been cancelled
C/C++ CI / macos-14 default (push) Has been cancelled
C/C++ CI / macos-15 default (push) Has been cancelled
C/C++ CI / ubuntu-22.04 default (push) Has been cancelled
C/C++ CI / ubuntu-22.04-arm default (push) Has been cancelled
C/C++ CI / ubuntu-24.04-arm default (push) Has been cancelled
C/C++ CI / windows-2019 default (push) Has been cancelled
C/C++ CI / windows-2022 default (push) Has been cancelled
C/C++ CI / ubuntu-22.04 gcc-11-Werror (push) Has been cancelled
C/C++ CI / ubuntu-22.04 gcc-12-Werror (push) Has been cancelled
C/C++ CI / ubuntu-22.04 gcc-9 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 gcc-sanitize-address (push) Has been cancelled
C/C++ CI / ubuntu-22.04 gcc-sanitize-undefined (push) Has been cancelled
C/C++ CI / ubuntu-22.04 hardenedmalloc (push) Has been cancelled
C/C++ CI / ubuntu-22.04 heimdal (push) Has been cancelled
C/C++ CI / ubuntu-22.04 kitchensink (push) Has been cancelled
C/C++ CI / ubuntu-22.04-arm kitchensink (push) Has been cancelled
C/C++ CI / ubuntu-24.04-arm kitchensink (push) Has been cancelled
C/C++ CI / ubuntu-22.04 krb5 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 libedit (push) Has been cancelled
C/C++ CI / macos-13 pam (push) Has been cancelled
C/C++ CI / macos-14 pam (push) Has been cancelled
C/C++ CI / macos-15 pam (push) Has been cancelled
C/C++ CI / ubuntu-22.04 pam (push) Has been cancelled
C/C++ CI / ubuntu-22.04 selinux (push) Has been cancelled
C/C++ CI / ubuntu-22.04 sk (push) Has been cancelled
C/C++ CI / ubuntu-22.04 valgrind-1 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 valgrind-2 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 valgrind-3 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 valgrind-4 (push) Has been cancelled
C/C++ CI / ubuntu-22.04 valgrind-unit (push) Has been cancelled
C/C++ CI / ubuntu-22.04 without-openssl (push) Has been cancelled
original code
2025-07-12 18:35:29 +03:00

272 lines
5.4 KiB
Bash

# $OpenBSD: sftp-perm.sh,v 1.3 2021/03/31 21:59:26 djm Exp $
# Placed in the Public Domain.
tid="sftp permissions"
SERVER_LOG=${OBJ}/sftp-server.log
CLIENT_LOG=${OBJ}/sftp.log
TEST_SFTP_SERVER=${OBJ}/sftp-server.sh
prepare_server() {
printf "#!/bin/sh\nexec $SFTPSERVER -el debug3 $* 2>$SERVER_LOG\n" \
> $TEST_SFTP_SERVER
chmod a+x $TEST_SFTP_SERVER
}
run_client() {
echo "$@" | ${SFTP} -D ${TEST_SFTP_SERVER} -vvvb - >$CLIENT_LOG 2>&1
}
prepare_files() {
_prep="$1"
rm -f ${COPY} ${COPY}.1
test -d ${COPY}.dd && { rmdir ${COPY}.dd || fatal "rmdir ${COPY}.dd"; }
test -z "$_prep" && return
sh -c "$_prep" || fail "preparation failed: \"$_prep\""
}
postcondition() {
_title="$1"
_check="$2"
test -z "$_check" && return
${TEST_SHELL} -c "$_check" || fail "postcondition check failed: $_title"
}
ro_test() {
_desc=$1
_cmd="$2"
_prep="$3"
_expect_success_post="$4"
_expect_fail_post="$5"
verbose "$tid: read-only $_desc"
# Plain (no options, mostly to test that _cmd is good)
prepare_files "$_prep"
prepare_server
run_client "$_cmd" || fail "plain $_desc failed"
postcondition "$_desc no-readonly" "$_expect_success_post"
# Read-only enabled
prepare_files "$_prep"
prepare_server -R
run_client "$_cmd" && fail "read-only $_desc succeeded"
postcondition "$_desc readonly" "$_expect_fail_post"
}
perm_test() {
_op=$1
_whitelist_ops=$2
_cmd="$3"
_prep="$4"
_expect_success_post="$5"
_expect_fail_post="$6"
verbose "$tid: explicit $_op"
# Plain (no options, mostly to test that _cmd is good)
prepare_files "$_prep"
prepare_server
run_client "$_cmd" || fail "plain $_op failed"
postcondition "$_op no white/blacklists" "$_expect_success_post"
# Whitelist
prepare_files "$_prep"
prepare_server -p $_op,$_whitelist_ops
run_client "$_cmd" || fail "whitelisted $_op failed"
postcondition "$_op whitelisted" "$_expect_success_post"
# Blacklist
prepare_files "$_prep"
prepare_server -P $_op
run_client "$_cmd" && fail "blacklisted $_op succeeded"
postcondition "$_op blacklisted" "$_expect_fail_post"
# Whitelist with op missing.
prepare_files "$_prep"
prepare_server -p $_whitelist_ops
run_client "$_cmd" && fail "no whitelist $_op succeeded"
postcondition "$_op not in whitelist" "$_expect_fail_post"
}
ro_test \
"upload" \
"put $DATA $COPY" \
"" \
"cmp $DATA $COPY" \
"test ! -f $COPY"
ro_test \
"setstat" \
"chmod 0700 $COPY" \
"touch $COPY; chmod 0400 $COPY" \
"test -x $COPY" \
"test ! -x $COPY"
ro_test \
"rm" \
"rm $COPY" \
"touch $COPY" \
"test ! -f $COPY" \
"test -f $COPY"
ro_test \
"mkdir" \
"mkdir ${COPY}.dd" \
"" \
"test -d ${COPY}.dd" \
"test ! -d ${COPY}.dd"
ro_test \
"rmdir" \
"rmdir ${COPY}.dd" \
"mkdir ${COPY}.dd" \
"test ! -d ${COPY}.dd" \
"test -d ${COPY}.dd"
ro_test \
"posix-rename" \
"rename $COPY ${COPY}.1" \
"touch $COPY" \
"test -f ${COPY}.1 -a ! -f $COPY" \
"test -f $COPY -a ! -f ${COPY}.1"
ro_test \
"oldrename" \
"rename -l $COPY ${COPY}.1" \
"touch $COPY" \
"test -f ${COPY}.1 -a ! -f $COPY" \
"test -f $COPY -a ! -f ${COPY}.1"
ro_test \
"symlink" \
"ln -s $COPY ${COPY}.1" \
"touch $COPY" \
"test -h ${COPY}.1" \
"test ! -h ${COPY}.1"
ro_test \
"hardlink" \
"ln $COPY ${COPY}.1" \
"touch $COPY" \
"test -f ${COPY}.1" \
"test ! -f ${COPY}.1"
# Test explicit permissions
perm_test \
"open" \
"realpath,stat,lstat,read,close" \
"get $DATA $COPY" \
"" \
"cmp $DATA $COPY" \
"! cmp $DATA $COPY 2>/dev/null"
perm_test \
"read" \
"realpath,stat,lstat,open,close" \
"get $DATA $COPY" \
"" \
"cmp $DATA $COPY" \
"! cmp $DATA $COPY 2>/dev/null"
perm_test \
"write" \
"realpath,stat,lstat,open,close" \
"put $DATA $COPY" \
"" \
"cmp $DATA $COPY" \
"! cmp $DATA $COPY 2>/dev/null"
perm_test \
"lstat" \
"realpath,stat,open,read,close" \
"get $DATA $COPY" \
"" \
"cmp $DATA $COPY" \
"! cmp $DATA $COPY 2>/dev/null"
perm_test \
"opendir" \
"realpath,readdir,stat,lstat" \
"ls -ln $OBJ"
perm_test \
"readdir" \
"realpath,opendir,stat,lstat" \
"ls -ln $OBJ"
perm_test \
"setstat" \
"realpath,stat,lstat" \
"chmod 0700 $COPY" \
"touch $COPY; chmod 0400 $COPY" \
"test -x $COPY" \
"test ! -x $COPY"
perm_test \
"remove" \
"realpath,stat,lstat" \
"rm $COPY" \
"touch $COPY" \
"test ! -f $COPY" \
"test -f $COPY"
perm_test \
"mkdir" \
"realpath,stat,lstat" \
"mkdir ${COPY}.dd" \
"" \
"test -d ${COPY}.dd" \
"test ! -d ${COPY}.dd"
perm_test \
"rmdir" \
"realpath,stat,lstat" \
"rmdir ${COPY}.dd" \
"mkdir ${COPY}.dd" \
"test ! -d ${COPY}.dd" \
"test -d ${COPY}.dd"
# Can't readily test this because the client falls back to traditional rename.
# XXX maybe there is a behaviorial difference we can test for?
#perm_test \
# "posix-rename" \
# "realpath,stat,lstat" \
# "rename $COPY ${COPY}.1" \
# "touch $COPY" \
# "test -f ${COPY}.1 -a ! -f $COPY" \
# "test -f $COPY -a ! -f ${COPY}.1"
perm_test \
"rename" \
"realpath,stat,lstat" \
"rename -l $COPY ${COPY}.1" \
"touch $COPY" \
"test -f ${COPY}.1 -a ! -f $COPY" \
"test -f $COPY -a ! -f ${COPY}.1"
perm_test \
"symlink" \
"realpath,stat,lstat" \
"ln -s $COPY ${COPY}.1" \
"touch $COPY" \
"test -h ${COPY}.1" \
"test ! -h ${COPY}.1"
perm_test \
"hardlink" \
"realpath,stat,lstat" \
"ln $COPY ${COPY}.1" \
"touch $COPY" \
"test -f ${COPY}.1" \
"test ! -f ${COPY}.1"
perm_test \
"statvfs" \
"realpath,stat,lstat" \
"df /"
# XXX need good tests for:
# fstat
# fsetstat
# realpath
# stat
# readlink
# fstatvfs
rm -rf ${COPY} ${COPY}.1 ${COPY}.dd