]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - crypto/openssh/regress/sftp-perm.sh
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / crypto / openssh / regress / sftp-perm.sh
1 #       $OpenBSD: sftp-perm.sh,v 1.2 2013/10/17 22:00:18 djm Exp $
2 #       Placed in the Public Domain.
3
4 tid="sftp permissions"
5
6 SERVER_LOG=${OBJ}/sftp-server.log
7 CLIENT_LOG=${OBJ}/sftp.log
8 TEST_SFTP_SERVER=${OBJ}/sftp-server.sh
9
10 prepare_server() {
11         printf "#!/bin/sh\nexec $SFTPSERVER -el debug3 $* 2>$SERVER_LOG\n" \
12         > $TEST_SFTP_SERVER
13         chmod a+x $TEST_SFTP_SERVER
14 }
15
16 run_client() {
17         echo "$@" | ${SFTP} -D ${TEST_SFTP_SERVER} -vvvb - >$CLIENT_LOG 2>&1
18 }
19
20 prepare_files() {
21         _prep="$1"
22         rm -f ${COPY} ${COPY}.1
23         test -d ${COPY}.dd && { rmdir ${COPY}.dd || fatal "rmdir ${COPY}.dd"; }
24         test -z "$_prep" && return
25         sh -c "$_prep" || fail "preparation failed: \"$_prep\""
26 }
27
28 postcondition() {
29         _title="$1"
30         _check="$2"
31         test -z "$_check" && return
32         ${TEST_SHELL} -c "$_check" || fail "postcondition check failed: $_title"
33 }
34
35 ro_test() {
36         _desc=$1
37         _cmd="$2"
38         _prep="$3"
39         _expect_success_post="$4"
40         _expect_fail_post="$5"
41         verbose "$tid: read-only $_desc"
42         # Plain (no options, mostly to test that _cmd is good)
43         prepare_files "$_prep"
44         prepare_server
45         run_client "$_cmd" || fail "plain $_desc failed"
46         postcondition "$_desc no-readonly" "$_expect_success_post"
47         # Read-only enabled
48         prepare_files "$_prep"
49         prepare_server -R
50         run_client "$_cmd" && fail "read-only $_desc succeeded"
51         postcondition "$_desc readonly" "$_expect_fail_post"
52 }
53
54 perm_test() {
55         _op=$1
56         _whitelist_ops=$2
57         _cmd="$3"
58         _prep="$4"
59         _expect_success_post="$5"
60         _expect_fail_post="$6"
61         verbose "$tid: explicit $_op"
62         # Plain (no options, mostly to test that _cmd is good)
63         prepare_files "$_prep"
64         prepare_server
65         run_client "$_cmd" || fail "plain $_op failed"
66         postcondition "$_op no white/blacklists" "$_expect_success_post"
67         # Whitelist
68         prepare_files "$_prep"
69         prepare_server -p $_op,$_whitelist_ops
70         run_client "$_cmd" || fail "whitelisted $_op failed"
71         postcondition "$_op whitelisted" "$_expect_success_post"
72         # Blacklist
73         prepare_files "$_prep"
74         prepare_server -P $_op
75         run_client "$_cmd" && fail "blacklisted $_op succeeded"
76         postcondition "$_op blacklisted" "$_expect_fail_post"
77         # Whitelist with op missing.
78         prepare_files "$_prep"
79         prepare_server -p $_whitelist_ops
80         run_client "$_cmd" && fail "no whitelist $_op succeeded"
81         postcondition "$_op not in whitelist" "$_expect_fail_post"
82 }
83
84 ro_test \
85         "upload" \
86         "put $DATA $COPY" \
87         "" \
88         "cmp $DATA $COPY" \
89         "test ! -f $COPY"
90
91 ro_test \
92         "setstat" \
93         "chmod 0700 $COPY" \
94         "touch $COPY; chmod 0400 $COPY" \
95         "test -x $COPY" \
96         "test ! -x $COPY"
97
98 ro_test \
99         "rm" \
100         "rm $COPY" \
101         "touch $COPY" \
102         "test ! -f $COPY" \
103         "test -f $COPY"
104
105 ro_test \
106         "mkdir" \
107         "mkdir ${COPY}.dd" \
108         "" \
109         "test -d ${COPY}.dd" \
110         "test ! -d ${COPY}.dd"
111
112 ro_test \
113         "rmdir" \
114         "rmdir ${COPY}.dd" \
115         "mkdir ${COPY}.dd" \
116         "test ! -d ${COPY}.dd" \
117         "test -d ${COPY}.dd"
118
119 ro_test \
120         "posix-rename" \
121         "rename $COPY ${COPY}.1" \
122         "touch $COPY" \
123         "test -f ${COPY}.1 -a ! -f $COPY" \
124         "test -f $COPY -a ! -f ${COPY}.1"
125
126 ro_test \
127         "oldrename" \
128         "rename -l $COPY ${COPY}.1" \
129         "touch $COPY" \
130         "test -f ${COPY}.1 -a ! -f $COPY" \
131         "test -f $COPY -a ! -f ${COPY}.1"
132
133 ro_test \
134         "symlink" \
135         "ln -s $COPY ${COPY}.1" \
136         "touch $COPY" \
137         "test -h ${COPY}.1" \
138         "test ! -h ${COPY}.1"
139
140 ro_test \
141         "hardlink" \
142         "ln $COPY ${COPY}.1" \
143         "touch $COPY" \
144         "test -f ${COPY}.1" \
145         "test ! -f ${COPY}.1"
146
147 # Test explicit permissions
148
149 perm_test \
150         "open" \
151         "realpath,stat,lstat,read,close" \
152         "get $DATA $COPY" \
153         "" \
154         "cmp $DATA $COPY" \
155         "! cmp $DATA $COPY 2>/dev/null"
156
157 perm_test \
158         "read" \
159         "realpath,stat,lstat,open,close" \
160         "get $DATA $COPY" \
161         "" \
162         "cmp $DATA $COPY" \
163         "! cmp $DATA $COPY 2>/dev/null"
164
165 perm_test \
166         "write" \
167         "realpath,stat,lstat,open,close" \
168         "put $DATA $COPY" \
169         "" \
170         "cmp $DATA $COPY" \
171         "! cmp $DATA $COPY 2>/dev/null"
172
173 perm_test \
174         "lstat" \
175         "realpath,stat,open,read,close" \
176         "get $DATA $COPY" \
177         "" \
178         "cmp $DATA $COPY" \
179         "! cmp $DATA $COPY 2>/dev/null"
180
181 perm_test \
182         "opendir" \
183         "realpath,readdir,stat,lstat" \
184         "ls -ln $OBJ"
185
186 perm_test \
187         "readdir" \
188         "realpath,opendir,stat,lstat" \
189         "ls -ln $OBJ"
190
191 perm_test \
192         "setstat" \
193         "realpath,stat,lstat" \
194         "chmod 0700 $COPY" \
195         "touch $COPY; chmod 0400 $COPY" \
196         "test -x $COPY" \
197         "test ! -x $COPY"
198
199 perm_test \
200         "remove" \
201         "realpath,stat,lstat" \
202         "rm $COPY" \
203         "touch $COPY" \
204         "test ! -f $COPY" \
205         "test -f $COPY"
206
207 perm_test \
208         "mkdir" \
209         "realpath,stat,lstat" \
210         "mkdir ${COPY}.dd" \
211         "" \
212         "test -d ${COPY}.dd" \
213         "test ! -d ${COPY}.dd"
214
215 perm_test \
216         "rmdir" \
217         "realpath,stat,lstat" \
218         "rmdir ${COPY}.dd" \
219         "mkdir ${COPY}.dd" \
220         "test ! -d ${COPY}.dd" \
221         "test -d ${COPY}.dd"
222
223 perm_test \
224         "posix-rename" \
225         "realpath,stat,lstat" \
226         "rename $COPY ${COPY}.1" \
227         "touch $COPY" \
228         "test -f ${COPY}.1 -a ! -f $COPY" \
229         "test -f $COPY -a ! -f ${COPY}.1"
230
231 perm_test \
232         "rename" \
233         "realpath,stat,lstat" \
234         "rename -l $COPY ${COPY}.1" \
235         "touch $COPY" \
236         "test -f ${COPY}.1 -a ! -f $COPY" \
237         "test -f $COPY -a ! -f ${COPY}.1"
238
239 perm_test \
240         "symlink" \
241         "realpath,stat,lstat" \
242         "ln -s $COPY ${COPY}.1" \
243         "touch $COPY" \
244         "test -h ${COPY}.1" \
245         "test ! -h ${COPY}.1"
246
247 perm_test \
248         "hardlink" \
249         "realpath,stat,lstat" \
250         "ln $COPY ${COPY}.1" \
251         "touch $COPY" \
252         "test -f ${COPY}.1" \
253         "test ! -f ${COPY}.1"
254
255 perm_test \
256         "statvfs" \
257         "realpath,stat,lstat" \
258         "df /"
259
260 # XXX need good tests for:
261 # fstat
262 # fsetstat
263 # realpath
264 # stat
265 # readlink
266 # fstatvfs
267
268 rm -rf ${COPY} ${COPY}.1 ${COPY}.dd
269