1#	Placed in the Public Domain.
2
3tid="server config include"
4
5cat > $OBJ/sshd_config.i << _EOF
6HostKey $OBJ/host.ssh-ed25519
7Match host a
8	Banner /aa
9
10Match host b
11	Banner /bb
12	Include $OBJ/sshd_config.i.* # comment
13
14Match host c
15	Include $OBJ/sshd_config.i.* # comment
16	Banner /cc
17
18Match host m
19	Include $OBJ/sshd_config.i.*
20
21Match Host d
22	Banner /dd # comment
23
24Match Host e
25	Banner /ee
26	Include $OBJ/sshd_config.i.*
27
28Match Host f
29	Include $OBJ/sshd_config.i.*
30	Banner /ff
31
32Match Host n
33	Include $OBJ/sshd_config.i.*
34_EOF
35
36cat > $OBJ/sshd_config.i.0 << _EOF
37Match host xxxxxx
38_EOF
39
40cat > $OBJ/sshd_config.i.1 << _EOF
41Match host a
42	Banner /aaa
43
44Match host b
45	Banner /bbb
46
47Match host c
48	Banner /ccc
49
50Match Host d
51	Banner /ddd
52
53Match Host e
54	Banner /eee
55
56Match Host f
57	Banner /fff
58_EOF
59
60cat > $OBJ/sshd_config.i.2 << _EOF
61Match host a
62	Banner /aaaa
63
64Match host b
65	Banner /bbbb
66
67Match host c # comment
68	Banner /cccc
69
70Match Host d
71	Banner /dddd
72
73Match Host e
74	Banner /eeee
75
76Match Host f
77	Banner /ffff
78
79Match all
80	Banner /xxxx
81_EOF
82
83trial() {
84	_host="$1"
85	_exp="$2"
86	_desc="$3"
87	test -z "$_desc" && _desc="test match"
88	trace "$_desc host=$_host expect=$_exp"
89	${SUDO} ${REAL_SSHD} -f $OBJ/sshd_config.i -T \
90	    -C "host=$_host,user=test,addr=127.0.0.1" > $OBJ/sshd_config.out ||
91		fatal "ssh config parse failed: $_desc host=$_host expect=$_exp"
92	_got=`grep -i '^banner ' $OBJ/sshd_config.out | awk '{print $2}'`
93	if test "x$_exp" != "x$_got" ; then
94		fail "$desc_ host $_host include fail: expected $_exp got $_got"
95	fi
96}
97
98trial a /aa
99trial b /bb
100trial c /ccc
101trial d /dd
102trial e /ee
103trial f /fff
104trial m /xxxx
105trial n /xxxx
106trial x none
107
108# Prepare an included config with an error.
109
110cat > $OBJ/sshd_config.i.3 << _EOF
111Banner xxxx
112	Junk
113_EOF
114
115trace "disallow invalid config host=a"
116${SUDO} ${REAL_SSHD} -f $OBJ/sshd_config.i \
117    -C "host=a,user=test,addr=127.0.0.1" 2>/dev/null && \
118	fail "sshd include allowed invalid config"
119
120trace "disallow invalid config host=x"
121${SUDO} ${REAL_SSHD} -f $OBJ/sshd_config.i \
122    -C "host=x,user=test,addr=127.0.0.1" 2>/dev/null && \
123	fail "sshd include allowed invalid config"
124
125rm -f $OBJ/sshd_config.i.*
126
127# Ensure that a missing include is not fatal.
128cat > $OBJ/sshd_config.i << _EOF
129HostKey $OBJ/host.ssh-ed25519
130Include $OBJ/sshd_config.i.*
131Banner /aa
132_EOF
133
134trial a /aa "missing include non-fatal"
135
136# Ensure that Match/Host in an included config does not affect parent.
137cat > $OBJ/sshd_config.i.x << _EOF
138Match host x
139_EOF
140
141trial a /aa "included file does not affect match state"
142
143# Ensure the empty include directive is not accepted
144cat > $OBJ/sshd_config.i.x << _EOF
145Include
146_EOF
147
148trace "disallow invalid with no argument"
149${SUDO} ${REAL_SSHD} -f $OBJ/sshd_config.i.x -T \
150    -C "host=x,user=test,addr=127.0.0.1" 2>/dev/null && \
151	fail "sshd allowed Include with no argument"
152
153# Ensure the Include before any Match block works as expected (bug #3122)
154cat > $OBJ/sshd_config.i << _EOF
155Banner /xx
156HostKey $OBJ/host.ssh-ed25519
157Include $OBJ/sshd_config.i.2
158Match host a
159	Banner /aaaa
160_EOF
161cat > $OBJ/sshd_config.i.2 << _EOF
162Match host a
163	Banner /aa
164_EOF
165
166trace "Include before match blocks"
167trial a /aa "included file before match blocks is properly evaluated"
168
169# Port in included file is correctly interpretted (bug #3169)
170cat > $OBJ/sshd_config.i << _EOF
171Include $OBJ/sshd_config.i.2
172Port 7722
173_EOF
174cat > $OBJ/sshd_config.i.2 << _EOF
175HostKey $OBJ/host.ssh-ed25519
176_EOF
177
178trace "Port after included files"
179${SUDO} ${REAL_SSHD} -f $OBJ/sshd_config.i -T \
180    -C "host=x,user=test,addr=127.0.0.1" > $OBJ/sshd_config.out || \
181	fail "failed to parse Port after included files"
182_port=`grep -i '^port ' $OBJ/sshd_config.out | awk '{print $2}'`
183if test "x7722" != "x$_port" ; then
184	fail "The Port in included file was intertepretted wrongly. Expected 7722, got $_port"
185fi
186
187# cleanup
188rm -f $OBJ/sshd_config.i $OBJ/sshd_config.i.* $OBJ/sshd_config.out
189