(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tid) op: assign_op.Equal rhs: {(DQ <'sftp permissions'>)} spids: [7] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SERVER_LOG) op: assign_op.Equal rhs: {(${ Id.VSub_Name OBJ) <'/sftp-server.log'>} spids: [13] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:CLIENT_LOG) op: assign_op.Equal rhs: {(${ Id.VSub_Name OBJ) <'/sftp.log'>} spids: [19] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:TEST_SFTP_SERVER) op: assign_op.Equal rhs: {(${ Id.VSub_Name OBJ) <'/sftp-server.sh'>} spids: [25] ) ] ) (command.ShFunction name: prepare_server body: (BraceGroup children: [ (command.Simple words: [ {<printf>} { (DQ <'#!/bin/sh'> <Id.Lit_BadBackslash '\\'> <'nexec '> ($ Id.VSub_DollarName '$SFTPSERVER') <' -el debug3 '> ($ Id.VSub_Star '$*') <' 2>'> ($ Id.VSub_DollarName '$SERVER_LOG') <Id.Lit_BadBackslash '\\'> <n> ) } ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {($ Id.VSub_DollarName '$TEST_SFTP_SERVER')} ) ] do_fork: T ) (C {<chmod>} {<a> <Id.Lit_Other '+'> <x>} {($ Id.VSub_DollarName '$TEST_SFTP_SERVER')}) ] ) ) (command.ShFunction name: run_client body: (BraceGroup children: [ (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_At '$@'))}) (command.Simple words: [ {(${ Id.VSub_Name SFTP)} {<-D>} {(${ Id.VSub_Name TEST_SFTP_SERVER)} {<-vvvb>} {<->} ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {($ Id.VSub_DollarName '$CLIENT_LOG')} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] negated: F ) ] ) ) (command.ShFunction name: prepare_files body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prep) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [117] ) ] ) (C {<rm>} {<-f>} {(${ Id.VSub_Name COPY)} {(${ Id.VSub_Name COPY) <.1>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<test>} {<-d>} {(${ Id.VSub_Name COPY) <.dd>}) (BraceGroup children: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<rmdir>} {(${ Id.VSub_Name COPY) <.dd>}) (C {<fatal>} {(DQ <'rmdir '> (${ Id.VSub_Name COPY) <.dd>)}) ] ) terminator: <Id.Op_Semi _> ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<test>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<sh>} {<-c>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<fail>} { (DQ <'preparation failed: '> (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\"'> ) ($ Id.VSub_DollarName '$_prep') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ) } ) ] ) ] ) ) (command.ShFunction name: postcondition body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_title) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [215] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_check) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [221] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<test>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_check'))}) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(${ Id.VSub_Name TEST_SHELL)} {<-c>} {(DQ ($ Id.VSub_DollarName '$_check'))}) (C {<fail>} {(DQ <'postcondition check failed: '> ($ Id.VSub_DollarName '$_title'))}) ] ) ] ) ) (command.ShFunction name: ro_test body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_desc) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [269] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_cmd) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [273] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prep) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$3'))} spids: [279] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expect_success_post) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$4'))} spids: [285] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expect_fail_post) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$5'))} spids: [291] ) ] ) (C {<verbose>} {(DQ ($ Id.VSub_DollarName '$tid') <': read-only '> ($ Id.VSub_DollarName '$_desc'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>}) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'plain '> ($ Id.VSub_DollarName '$_desc') <' failed'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_desc') <' no-readonly'>)} {(DQ ($ Id.VSub_DollarName '$_expect_success_post'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>} {<-R>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'read-only '> ($ Id.VSub_DollarName '$_desc') <' succeeded'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_desc') <' readonly'>)} {(DQ ($ Id.VSub_DollarName '$_expect_fail_post'))} ) ] ) ) (command.ShFunction name: perm_test body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_op) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [403] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_whitelist_ops) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [407] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_cmd) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$3'))} spids: [411] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prep) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$4'))} spids: [417] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expect_success_post) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$5'))} spids: [423] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expect_fail_post) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$6'))} spids: [429] ) ] ) (C {<verbose>} {(DQ ($ Id.VSub_DollarName '$tid') <': explicit '> ($ Id.VSub_DollarName '$_op'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>}) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'plain '> ($ Id.VSub_DollarName '$_op') <' failed'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_op') <' no white/blacklists'>)} {(DQ ($ Id.VSub_DollarName '$_expect_success_post'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>} {<-p>} {($ Id.VSub_DollarName '$_op') <Id.Lit_Comma ','> ($ Id.VSub_DollarName '$_whitelist_ops') } ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'whitelisted '> ($ Id.VSub_DollarName '$_op') <' failed'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_op') <' whitelisted'>)} {(DQ ($ Id.VSub_DollarName '$_expect_success_post'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>} {<-P>} {($ Id.VSub_DollarName '$_op')}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'blacklisted '> ($ Id.VSub_DollarName '$_op') <' succeeded'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_op') <' blacklisted'>)} {(DQ ($ Id.VSub_DollarName '$_expect_fail_post'))} ) (C {<prepare_files>} {(DQ ($ Id.VSub_DollarName '$_prep'))}) (C {<prepare_server>} {<-p>} {($ Id.VSub_DollarName '$_whitelist_ops')}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<run_client>} {(DQ ($ Id.VSub_DollarName '$_cmd'))}) (C {<fail>} {(DQ <'no whitelist '> ($ Id.VSub_DollarName '$_op') <' succeeded'>)}) ] ) (C {<postcondition>} {(DQ ($ Id.VSub_DollarName '$_op') <' not in whitelist'>)} {(DQ ($ Id.VSub_DollarName '$_expect_fail_post'))} ) ] ) ) (C {<ro_test>} {(DQ <upload>)} {(DQ <'put '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ )} {(DQ <'cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test ! -f '> ($ Id.VSub_DollarName '$COPY'))} ) (C {<ro_test>} {(DQ <setstat>)} {(DQ <'chmod 0700 '> ($ Id.VSub_DollarName '$COPY'))} { (DQ <'touch '> ($ Id.VSub_DollarName '$COPY') <'; chmod 0400 '> ($ Id.VSub_DollarName '$COPY')) } {(DQ <'test -x '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test ! -x '> ($ Id.VSub_DollarName '$COPY'))} ) (C {<ro_test>} {(DQ <rm>)} {(DQ <'rm '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY'))} ) (C {<ro_test>} {(DQ <mkdir>)} {(DQ <'mkdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ )} {(DQ <'test -d '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test ! -d '> (${ Id.VSub_Name COPY) <.dd>)} ) (C {<ro_test>} {(DQ <rmdir>)} {(DQ <'rmdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'mkdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test ! -d '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test -d '> (${ Id.VSub_Name COPY) <.dd>)} ) (C {<ro_test>} {(DQ <posix-rename>)} {(DQ <'rename '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <'.1 -a ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY') <' -a ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<ro_test>} {(DQ <oldrename>)} {(DQ <'rename -l '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <'.1 -a ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY') <' -a ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<ro_test>} {(DQ <symlink>)} {(DQ <'ln -s '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -h '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'test ! -h '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<ro_test>} {(DQ <hardlink>)} {(DQ <'ln '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'test ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<perm_test>} {(DQ <open>)} {(DQ <'realpath,stat,lstat,read,close'>)} {(DQ <'get '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ )} {(DQ <'cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} { (DQ <'! cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY') <' 2>/dev/null'> ) } ) (C {<perm_test>} {(DQ <read>)} {(DQ <'realpath,stat,lstat,open,close'>)} {(DQ <'get '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ )} {(DQ <'cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} { (DQ <'! cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY') <' 2>/dev/null'> ) } ) (C {<perm_test>} {(DQ <write>)} {(DQ <'realpath,stat,lstat,open,close'>)} {(DQ <'put '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ )} {(DQ <'cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} { (DQ <'! cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY') <' 2>/dev/null'> ) } ) (C {<perm_test>} {(DQ <lstat>)} {(DQ <'realpath,stat,open,read,close'>)} {(DQ <'get '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} {(DQ )} {(DQ <'cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY'))} { (DQ <'! cmp '> ($ Id.VSub_DollarName '$DATA') <' '> ($ Id.VSub_DollarName '$COPY') <' 2>/dev/null'> ) } ) (C {<perm_test>} {(DQ <opendir>)} {(DQ <'realpath,readdir,stat,lstat'>)} {(DQ <'ls -ln '> ($ Id.VSub_DollarName '$OBJ'))} ) (C {<perm_test>} {(DQ <readdir>)} {(DQ <'realpath,opendir,stat,lstat'>)} {(DQ <'ls -ln '> ($ Id.VSub_DollarName '$OBJ'))} ) (C {<perm_test>} {(DQ <setstat>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'chmod 0700 '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY') <'; chmod 0400 '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -x '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test ! -x '> ($ Id.VSub_DollarName '$COPY'))} ) (C {<perm_test>} {(DQ <remove>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'rm '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY'))} ) (C {<perm_test>} {(DQ <mkdir>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'mkdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ )} {(DQ <'test -d '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test ! -d '> (${ Id.VSub_Name COPY) <.dd>)} ) (C {<perm_test>} {(DQ <rmdir>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'rmdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'mkdir '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test ! -d '> (${ Id.VSub_Name COPY) <.dd>)} {(DQ <'test -d '> (${ Id.VSub_Name COPY) <.dd>)} ) (C {<perm_test>} {(DQ <posix-rename>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'rename '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <'.1 -a ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY') <' -a ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<perm_test>} {(DQ <rename>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'rename -l '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <'.1 -a ! -f '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> ($ Id.VSub_DollarName '$COPY') <' -a ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<perm_test>} {(DQ <symlink>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'ln -s '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -h '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'test ! -h '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<perm_test>} {(DQ <hardlink>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'ln '> ($ Id.VSub_DollarName '$COPY') <' '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'touch '> ($ Id.VSub_DollarName '$COPY'))} {(DQ <'test -f '> (${ Id.VSub_Name COPY) <.1>)} {(DQ <'test ! -f '> (${ Id.VSub_Name COPY) <.1>)} ) (C {<perm_test>} {(DQ <statvfs>)} {(DQ <'realpath,stat,lstat'>)} {(DQ <'df /'>)}) (C {<rm>} {<-rf>} {(${ Id.VSub_Name COPY)} {(${ Id.VSub_Name COPY) <.1>} {(${ Id.VSub_Name COPY) <.dd>} ) ] )