NAME=sandbox disable
FILE=-
CMDS=<<EOF
e cfg.sandbox=true
e cfg.sandbox=false
e cfg.sandbox
EOF
EXPECT=<<EOF
true
EOF
RUN

NAME=sandbox open
FILE=-
CMDS=<<EOF
e cfg.sandbox=true
o~[4]
oc /bin/ls
EOF
EXPECT=<<EOF
malloc://512
EOF
RUN

NAME=sandbox grain default is all
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
all
EOF
RUN

NAME=sandbox grain=none blocks exec
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
!!echo hello 2>/dev/null
EOF
EXPECT=<<EOF
EOF
RUN

NAME=sandbox grain=none blocks shell subcommands
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
?e $(!echo dollar)
?e $(?e safe)
e cfg.sandbox
EOF
EXPECT=<<EOF
safe
true
EOF
RUN

NAME=sandbox grain=none blocks backtick shell subcommands
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
?e `!echo backtick`
?e `?e safe`
e cfg.sandbox
EOF
EXPECT=<<EOF
safe
true
EOF
RUN

NAME=sandbox grain=exec allows exec
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=exec
e cfg.sandbox=true
!!echo hello
?e $(!!echo dollar)
?e `!!echo backtick`
EOF
EXPECT=<<EOF
hello
dollar
backtick
EOF
RUN

NAME=sandbox grain=all allows exec
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=all
e cfg.sandbox=true
!!echo hello
EOF
EXPECT=<<EOF
hello
EOF
RUN

NAME=sandbox grain order does not matter
FILE=-
CMDS=<<EOF
e cfg.sandbox=true
e cfg.sandbox.grain=exec
!!echo hello
EOF
EXPECT=<<EOF
hello
EOF
RUN

NAME=sandbox grain=none blocks oc
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
o~[4]
oc /bin/ls
EOF
EXPECT=<<EOF
malloc://512
EOF
RUN

NAME=sandbox grain=environ allows environ
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=environ
e cfg.sandbox=true
?e empty
%SHELL~?
?e empty
e cfg.sandbox.grain=none
%SHELL~?
?e empty
EOF
EXPECT=<<EOF
empty
1
empty
0
empty
EOF
RUN

NAME=sandbox grain=disk,exec combined
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=disk,exec
e cfg.sandbox=true
!!echo works
EOF
EXPECT=<<EOF
works
EOF
RUN

NAME=sandbox grain persist after enable
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=exec
e cfg.sandbox=true
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
exec
EOF
RUN

NAME=sandbox grain=hidden option
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=hidden
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
hidden
EOF
RUN

NAME=sandbox grain cannot grant additional permissions
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=environ
e cfg.sandbox=true
e cfg.sandbox.grain=exec,environ
e cfg.sandbox.grain
e cfg.sandbox.grain=none
e cfg.sandbox.grain=all
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
environ
none
EOF
RUN

NAME=sandbox configuration cannot be reset
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
e-
e cfg.sandbox
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
true
none
EOF
RUN

NAME=sandbox grain exclusions block environment access
FILE=-
CMDS=<<EOF
%R2_GRAIN_TEST=visible
e cfg.sandbox.grain=!disk,!exec
e cfg.sandbox=true
%R2_GRAIN_TEST~?
e cfg.sandbox.grain=!disk,!exec,!environ
%R2_GRAIN_TEST~?
e cfg.sandbox.grain=!exec
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
1
0
!disk,!exec,!environ
EOF
RUN

NAME=HTTP sandbox grain is independent of local sandbox
FILE=-
CMDS=<<EOF
e http.sandbox.grain
e cfg.sandbox.grain=environ
e http.sandbox.grain=all,!exec
e http.sandbox.grain
e cfg.sandbox
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
none
all,!exec
false
environ
EOF
RUN

NAME=HTTP sandbox grain rejects malformed values without side effects
FILE=-
CMDS=<<EOF
e http.sandbox.grain=environ
e http.sandbox.grain=exec,
e http.sandbox.grain
e http.sandbox.grain=bogus
e http.sandbox.grain
e http.sandbox.grain=exec,,environ
e http.sandbox.grain
e http.sandbox.grain=!
e http.sandbox.grain
e cfg.sandbox
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
environ
environ
environ
environ
false
all
EOF
RUN

NAME=HTTP sandbox grain assignment does not change active local permissions
FILE=-
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
e http.sandbox.grain=exec
e http.sandbox.grain
e cfg.sandbox.grain=exec
e cfg.sandbox.grain
EOF
EXPECT=<<EOF
exec
none
EOF
RUN

NAME=sandbox grain=none blocks lang pipe
FILE=--
CMDS=<<EOF
e cfg.sandbox.grain=none
e cfg.sandbox=true
#!pipe echo PIPE_RAN
?e done
EOF
EXPECT=<<EOF
done
EOF
RUN
