(CommandList children: [ (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:tid) op:Equal rhs:{(DQ ('sftp permissions'))} spids:[7])] spids: [7] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:SERVER_LOG) op: Equal rhs: {(${ VSub_Name OBJ) (/sftp-server.log)} spids: [13] ) ] spids: [13] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CLIENT_LOG) op: Equal rhs: {(${ VSub_Name OBJ) (/sftp.log)} spids: [19] ) ] spids: [19] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:TEST_SFTP_SERVER) op: Equal rhs: {(${ VSub_Name OBJ) (/sftp-server.sh)} spids: [25] ) ] spids: [25] ) (FuncDef name: prepare_server body: (BraceGroup children: [ (SimpleCommand words: [ {(printf)} { (DQ ('#!/bin/sh') (Lit_Other '\\') ('nexec ') ($ VSub_Name '$SFTPSERVER') (' -el debug3 ') ($ VSub_Star '$*') (' 2>') ($ VSub_Name '$SERVER_LOG') (Lit_Other '\\') (n) ) } ] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {($ VSub_Name '$TEST_SFTP_SERVER')} spids: [56] ) ] ) (C {(chmod)} {(a) (Lit_Other '+') (x)} {($ VSub_Name '$TEST_SFTP_SERVER')}) ] spids: [36] ) spids: [32 35] ) (FuncDef name: run_client body: (BraceGroup children: [ (Pipeline children: [ (C {(echo)} {(DQ ($ VSub_At '$@'))}) (SimpleCommand words: [{(${ VSub_Name SFTP)} {(-D)} {(${ VSub_Name TEST_SFTP_SERVER)} {(-vvvb)} {(-)}] redirects: [ (Redir op_id: Redir_Great fd: 16777215 arg_word: {($ VSub_Name '$CLIENT_LOG')} spids: [101] ) (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[104]) ] ) ] negated: False ) ] spids: [76] ) spids: [72 75] ) (FuncDef name: prepare_files body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_prep) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [117] ) ] spids: [117] ) (C {(rm)} {(-f)} {(${ VSub_Name COPY)} {(${ VSub_Name COPY) (.1)}) (AndOr children: [ (C {(test)} {(-d)} {(${ VSub_Name COPY) (.dd)}) (BraceGroup children: [ (Sentence child: (AndOr children: [ (C {(rmdir)} {(${ VSub_Name COPY) (.dd)}) (C {(fatal)} {(DQ ('rmdir ') (${ VSub_Name COPY) (.dd))}) ] op_id: Op_DPipe ) terminator: <Op_Semi ';'> ) ] spids: [148] ) ] op_id: Op_DAmp ) (AndOr children: [ (C {(test)} {(-z)} {(DQ ($ VSub_Name '$_prep'))}) (ControlFlow token:<ControlFlow_Return return>) ] op_id: Op_DAmp ) (AndOr children: [ (C {(sh)} {(-c)} {(DQ ($ VSub_Name '$_prep'))}) (C {(fail)} { (DQ ('preparation failed: ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ($ VSub_Name '$_prep') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ) } ) ] op_id: Op_DPipe ) ] spids: [114] ) spids: [110 113] ) (FuncDef name: postcondition body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_title) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [215] ) ] spids: [215] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_check) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} spids: [221] ) ] spids: [221] ) (AndOr children: [ (C {(test)} {(-z)} {(DQ ($ VSub_Name '$_check'))}) (ControlFlow token:<ControlFlow_Return return>) ] op_id: Op_DAmp ) (AndOr children: [ (C {(${ VSub_Name TEST_SHELL)} {(-c)} {(DQ ($ VSub_Name '$_check'))}) (C {(fail)} {(DQ ('postcondition check failed: ') ($ VSub_Name '$_title'))}) ] op_id: Op_DPipe ) ] spids: [212] ) spids: [208 211] ) (FuncDef name: ro_test body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_desc) op: Equal rhs: {($ VSub_Number '$1')} spids: [269] ) ] spids: [269] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_cmd) op: Equal rhs: {(DQ ($ VSub_Number '$2'))} spids: [273] ) ] spids: [273] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_prep) op: Equal rhs: {(DQ ($ VSub_Number '$3'))} spids: [279] ) ] spids: [279] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_expect_success_post) op: Equal rhs: {(DQ ($ VSub_Number '$4'))} spids: [285] ) ] spids: [285] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_expect_fail_post) op: Equal rhs: {(DQ ($ VSub_Number '$5'))} spids: [291] ) ] spids: [291] ) (C {(verbose)} {(DQ ($ VSub_Name '$tid') (': read-only ') ($ VSub_Name '$_desc'))}) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)}) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('plain ') ($ VSub_Name '$_desc') (' failed'))}) ] op_id: Op_DPipe ) (C {(postcondition)} {(DQ ($ VSub_Name '$_desc') (' no-readonly'))} {(DQ ($ VSub_Name '$_expect_success_post'))} ) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)} {(-R)}) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('read-only ') ($ VSub_Name '$_desc') (' succeeded'))}) ] op_id: Op_DAmp ) (C {(postcondition)} {(DQ ($ VSub_Name '$_desc') (' readonly'))} {(DQ ($ VSub_Name '$_expect_fail_post'))} ) ] spids: [266] ) spids: [262 265] ) (FuncDef name: perm_test body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_op) op: Equal rhs: {($ VSub_Number '$1')} spids: [403] ) ] spids: [403] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_whitelist_ops) op: Equal rhs: {($ VSub_Number '$2')} spids: [407] ) ] spids: [407] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_cmd) op: Equal rhs: {(DQ ($ VSub_Number '$3'))} spids: [411] ) ] spids: [411] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_prep) op: Equal rhs: {(DQ ($ VSub_Number '$4'))} spids: [417] ) ] spids: [417] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_expect_success_post) op: Equal rhs: {(DQ ($ VSub_Number '$5'))} spids: [423] ) ] spids: [423] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:_expect_fail_post) op: Equal rhs: {(DQ ($ VSub_Number '$6'))} spids: [429] ) ] spids: [429] ) (C {(verbose)} {(DQ ($ VSub_Name '$tid') (': explicit ') ($ VSub_Name '$_op'))}) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)}) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('plain ') ($ VSub_Name '$_op') (' failed'))}) ] op_id: Op_DPipe ) (C {(postcondition)} {(DQ ($ VSub_Name '$_op') (' no white/blacklists'))} {(DQ ($ VSub_Name '$_expect_success_post'))} ) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)} {(-p)} {($ VSub_Name '$_op') (Lit_Comma ',') ($ VSub_Name '$_whitelist_ops')} ) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('whitelisted ') ($ VSub_Name '$_op') (' failed'))}) ] op_id: Op_DPipe ) (C {(postcondition)} {(DQ ($ VSub_Name '$_op') (' whitelisted'))} {(DQ ($ VSub_Name '$_expect_success_post'))} ) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)} {(-P)} {($ VSub_Name '$_op')}) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('blacklisted ') ($ VSub_Name '$_op') (' succeeded'))}) ] op_id: Op_DAmp ) (C {(postcondition)} {(DQ ($ VSub_Name '$_op') (' blacklisted'))} {(DQ ($ VSub_Name '$_expect_fail_post'))} ) (C {(prepare_files)} {(DQ ($ VSub_Name '$_prep'))}) (C {(prepare_server)} {(-p)} {($ VSub_Name '$_whitelist_ops')}) (AndOr children: [ (C {(run_client)} {(DQ ($ VSub_Name '$_cmd'))}) (C {(fail)} {(DQ ('no whitelist ') ($ VSub_Name '$_op') (' succeeded'))}) ] op_id: Op_DAmp ) (C {(postcondition)} {(DQ ($ VSub_Name '$_op') (' not in whitelist'))} {(DQ ($ VSub_Name '$_expect_fail_post'))} ) ] spids: [400] ) spids: [396 399] ) (C {(ro_test)} {(DQ (upload))} {(DQ ('put ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ )} {(DQ ('cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ ('test ! -f ') ($ VSub_Name '$COPY'))} ) (C {(ro_test)} {(DQ (setstat))} {(DQ ('chmod 0700 ') ($ VSub_Name '$COPY'))} {(DQ ('touch ') ($ VSub_Name '$COPY') ('; chmod 0400 ') ($ VSub_Name '$COPY'))} {(DQ ('test -x ') ($ VSub_Name '$COPY'))} {(DQ ('test ! -x ') ($ VSub_Name '$COPY'))} ) (C {(ro_test)} {(DQ (rm))} {(DQ ('rm ') ($ VSub_Name '$COPY'))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY'))} ) (C {(ro_test)} {(DQ (mkdir))} {(DQ ('mkdir ') (${ VSub_Name COPY) (.dd))} {(DQ )} {(DQ ('test -d ') (${ VSub_Name COPY) (.dd))} {(DQ ('test ! -d ') (${ VSub_Name COPY) (.dd))} ) (C {(ro_test)} {(DQ (rmdir))} {(DQ ('rmdir ') (${ VSub_Name COPY) (.dd))} {(DQ ('mkdir ') (${ VSub_Name COPY) (.dd))} {(DQ ('test ! -d ') (${ VSub_Name COPY) (.dd))} {(DQ ('test -d ') (${ VSub_Name COPY) (.dd))} ) (C {(ro_test)} {(DQ (posix-rename))} {(DQ ('rename ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) ('.1 -a ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY') (' -a ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(ro_test)} {(DQ (oldrename))} {(DQ ('rename -l ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) ('.1 -a ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY') (' -a ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(ro_test)} {(DQ (symlink))} {(DQ ('ln -s ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -h ') (${ VSub_Name COPY) (.1))} {(DQ ('test ! -h ') (${ VSub_Name COPY) (.1))} ) (C {(ro_test)} {(DQ (hardlink))} {(DQ ('ln ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) (.1))} {(DQ ('test ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(perm_test)} {(DQ (open))} {(DQ ('realpath,stat,lstat,read,close'))} {(DQ ('get ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ )} {(DQ ('cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ ('! cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY') (' 2>/dev/null'))} ) (C {(perm_test)} {(DQ (read))} {(DQ ('realpath,stat,lstat,open,close'))} {(DQ ('get ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ )} {(DQ ('cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ ('! cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY') (' 2>/dev/null'))} ) (C {(perm_test)} {(DQ (write))} {(DQ ('realpath,stat,lstat,open,close'))} {(DQ ('put ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ )} {(DQ ('cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ ('! cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY') (' 2>/dev/null'))} ) (C {(perm_test)} {(DQ (lstat))} {(DQ ('realpath,stat,open,read,close'))} {(DQ ('get ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ )} {(DQ ('cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY'))} {(DQ ('! cmp ') ($ VSub_Name '$DATA') (' ') ($ VSub_Name '$COPY') (' 2>/dev/null'))} ) (C {(perm_test)} {(DQ (opendir))} {(DQ ('realpath,readdir,stat,lstat'))} {(DQ ('ls -ln ') ($ VSub_Name '$OBJ'))} ) (C {(perm_test)} {(DQ (readdir))} {(DQ ('realpath,opendir,stat,lstat'))} {(DQ ('ls -ln ') ($ VSub_Name '$OBJ'))} ) (C {(perm_test)} {(DQ (setstat))} {(DQ ('realpath,stat,lstat'))} {(DQ ('chmod 0700 ') ($ VSub_Name '$COPY'))} {(DQ ('touch ') ($ VSub_Name '$COPY') ('; chmod 0400 ') ($ VSub_Name '$COPY'))} {(DQ ('test -x ') ($ VSub_Name '$COPY'))} {(DQ ('test ! -x ') ($ VSub_Name '$COPY'))} ) (C {(perm_test)} {(DQ (remove))} {(DQ ('realpath,stat,lstat'))} {(DQ ('rm ') ($ VSub_Name '$COPY'))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY'))} ) (C {(perm_test)} {(DQ (mkdir))} {(DQ ('realpath,stat,lstat'))} {(DQ ('mkdir ') (${ VSub_Name COPY) (.dd))} {(DQ )} {(DQ ('test -d ') (${ VSub_Name COPY) (.dd))} {(DQ ('test ! -d ') (${ VSub_Name COPY) (.dd))} ) (C {(perm_test)} {(DQ (rmdir))} {(DQ ('realpath,stat,lstat'))} {(DQ ('rmdir ') (${ VSub_Name COPY) (.dd))} {(DQ ('mkdir ') (${ VSub_Name COPY) (.dd))} {(DQ ('test ! -d ') (${ VSub_Name COPY) (.dd))} {(DQ ('test -d ') (${ VSub_Name COPY) (.dd))} ) (C {(perm_test)} {(DQ (posix-rename))} {(DQ ('realpath,stat,lstat'))} {(DQ ('rename ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) ('.1 -a ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY') (' -a ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(perm_test)} {(DQ (rename))} {(DQ ('realpath,stat,lstat'))} {(DQ ('rename -l ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) ('.1 -a ! -f ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') ($ VSub_Name '$COPY') (' -a ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(perm_test)} {(DQ (symlink))} {(DQ ('realpath,stat,lstat'))} {(DQ ('ln -s ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -h ') (${ VSub_Name COPY) (.1))} {(DQ ('test ! -h ') (${ VSub_Name COPY) (.1))} ) (C {(perm_test)} {(DQ (hardlink))} {(DQ ('realpath,stat,lstat'))} {(DQ ('ln ') ($ VSub_Name '$COPY') (' ') (${ VSub_Name COPY) (.1))} {(DQ ('touch ') ($ VSub_Name '$COPY'))} {(DQ ('test -f ') (${ VSub_Name COPY) (.1))} {(DQ ('test ! -f ') (${ VSub_Name COPY) (.1))} ) (C {(perm_test)} {(DQ (statvfs))} {(DQ ('realpath,stat,lstat'))} {(DQ ('df /'))}) (C {(rm)} {(-rf)} {(${ VSub_Name COPY)} {(${ VSub_Name COPY) (.1)} {(${ VSub_Name COPY) (.dd)}) ] )