xref: /freebsd/crypto/openssh/servconf.c (revision acc1a9ef)
1 
2 /* $OpenBSD: servconf.c,v 1.285 2016/02/17 05:29:04 djm Exp $ */
3 /*
4  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5  *                    All rights reserved
6  *
7  * As far as I am concerned, the code I have written for this software
8  * can be used freely for any purpose.  Any derived versions of this
9  * software must be clearly marked as such, and if the derived work is
10  * incompatible with the protocol description in the RFC file, it must be
11  * called by a name other than "ssh" or "Secure Shell".
12  */
13 
14 #include "includes.h"
15 __RCSID("$FreeBSD$");
16 
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 
20 #include <netinet/in.h>
21 #include <netinet/in_systm.h>
22 #include <netinet/ip.h>
23 
24 #include <ctype.h>
25 #include <netdb.h>
26 #include <pwd.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <signal.h>
31 #include <unistd.h>
32 #include <limits.h>
33 #include <stdarg.h>
34 #include <errno.h>
35 #ifdef HAVE_UTIL_H
36 #include <util.h>
37 #endif
38 
39 #include "openbsd-compat/sys-queue.h"
40 #include "xmalloc.h"
41 #include "ssh.h"
42 #include "log.h"
43 #include "buffer.h"
44 #include "misc.h"
45 #include "servconf.h"
46 #include "compat.h"
47 #include "pathnames.h"
48 #include "cipher.h"
49 #include "key.h"
50 #include "kex.h"
51 #include "mac.h"
52 #include "match.h"
53 #include "channels.h"
54 #include "groupaccess.h"
55 #include "canohost.h"
56 #include "packet.h"
57 #include "hostfile.h"
58 #include "auth.h"
59 #include "myproposal.h"
60 #include "digest.h"
61 #include "version.h"
62 
63 static void add_listen_addr(ServerOptions *, char *, int);
64 static void add_one_listen_addr(ServerOptions *, char *, int);
65 
66 /* Use of privilege separation or not */
67 extern int use_privsep;
68 extern Buffer cfg;
69 
70 /* Initializes the server options to their default values. */
71 
72 void
73 initialize_server_options(ServerOptions *options)
74 {
75 	memset(options, 0, sizeof(*options));
76 
77 	/* Portable-specific options */
78 	options->use_pam = -1;
79 
80 	/* Standard Options */
81 	options->num_ports = 0;
82 	options->ports_from_cmdline = 0;
83 	options->queued_listen_addrs = NULL;
84 	options->num_queued_listens = 0;
85 	options->listen_addrs = NULL;
86 	options->address_family = -1;
87 	options->num_host_key_files = 0;
88 	options->num_host_cert_files = 0;
89 	options->host_key_agent = NULL;
90 	options->pid_file = NULL;
91 	options->server_key_bits = -1;
92 	options->login_grace_time = -1;
93 	options->key_regeneration_time = -1;
94 	options->permit_root_login = PERMIT_NOT_SET;
95 	options->ignore_rhosts = -1;
96 	options->ignore_user_known_hosts = -1;
97 	options->print_motd = -1;
98 	options->print_lastlog = -1;
99 	options->x11_forwarding = -1;
100 	options->x11_display_offset = -1;
101 	options->x11_use_localhost = -1;
102 	options->permit_tty = -1;
103 	options->permit_user_rc = -1;
104 	options->xauth_location = NULL;
105 	options->strict_modes = -1;
106 	options->tcp_keep_alive = -1;
107 	options->log_facility = SYSLOG_FACILITY_NOT_SET;
108 	options->log_level = SYSLOG_LEVEL_NOT_SET;
109 	options->rhosts_rsa_authentication = -1;
110 	options->hostbased_authentication = -1;
111 	options->hostbased_uses_name_from_packet_only = -1;
112 	options->hostbased_key_types = NULL;
113 	options->hostkeyalgorithms = NULL;
114 	options->rsa_authentication = -1;
115 	options->pubkey_authentication = -1;
116 	options->pubkey_key_types = NULL;
117 	options->kerberos_authentication = -1;
118 	options->kerberos_or_local_passwd = -1;
119 	options->kerberos_ticket_cleanup = -1;
120 	options->kerberos_get_afs_token = -1;
121 	options->gss_authentication=-1;
122 	options->gss_cleanup_creds = -1;
123 	options->gss_strict_acceptor = -1;
124 	options->password_authentication = -1;
125 	options->kbd_interactive_authentication = -1;
126 	options->challenge_response_authentication = -1;
127 	options->permit_empty_passwd = -1;
128 	options->permit_user_env = -1;
129 	options->use_login = -1;
130 	options->compression = -1;
131 	options->rekey_limit = -1;
132 	options->rekey_interval = -1;
133 	options->allow_tcp_forwarding = -1;
134 	options->allow_streamlocal_forwarding = -1;
135 	options->allow_agent_forwarding = -1;
136 	options->num_allow_users = 0;
137 	options->num_deny_users = 0;
138 	options->num_allow_groups = 0;
139 	options->num_deny_groups = 0;
140 	options->ciphers = NULL;
141 	options->macs = NULL;
142 	options->kex_algorithms = NULL;
143 	options->protocol = SSH_PROTO_UNKNOWN;
144 	options->fwd_opts.gateway_ports = -1;
145 	options->fwd_opts.streamlocal_bind_mask = (mode_t)-1;
146 	options->fwd_opts.streamlocal_bind_unlink = -1;
147 	options->num_subsystems = 0;
148 	options->max_startups_begin = -1;
149 	options->max_startups_rate = -1;
150 	options->max_startups = -1;
151 	options->max_authtries = -1;
152 	options->max_sessions = -1;
153 	options->banner = NULL;
154 	options->use_dns = -1;
155 	options->client_alive_interval = -1;
156 	options->client_alive_count_max = -1;
157 	options->num_authkeys_files = 0;
158 	options->num_accept_env = 0;
159 	options->permit_tun = -1;
160 	options->num_permitted_opens = -1;
161 	options->adm_forced_command = NULL;
162 	options->chroot_directory = NULL;
163 	options->authorized_keys_command = NULL;
164 	options->authorized_keys_command_user = NULL;
165 	options->revoked_keys_file = NULL;
166 	options->trusted_user_ca_keys = NULL;
167 	options->authorized_principals_file = NULL;
168 	options->authorized_principals_command = NULL;
169 	options->authorized_principals_command_user = NULL;
170 	options->ip_qos_interactive = -1;
171 	options->ip_qos_bulk = -1;
172 	options->version_addendum = NULL;
173 	options->fingerprint_hash = -1;
174 }
175 
176 /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
177 static int
178 option_clear_or_none(const char *o)
179 {
180 	return o == NULL || strcasecmp(o, "none") == 0;
181 }
182 
183 static void
184 assemble_algorithms(ServerOptions *o)
185 {
186 	if (kex_assemble_names(KEX_SERVER_ENCRYPT, &o->ciphers) != 0 ||
187 	    kex_assemble_names(KEX_SERVER_MAC, &o->macs) != 0 ||
188 	    kex_assemble_names(KEX_SERVER_KEX, &o->kex_algorithms) != 0 ||
189 	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
190 	    &o->hostkeyalgorithms) != 0 ||
191 	    kex_assemble_names(KEX_DEFAULT_PK_ALG,
192 	    &o->hostbased_key_types) != 0 ||
193 	    kex_assemble_names(KEX_DEFAULT_PK_ALG, &o->pubkey_key_types) != 0)
194 		fatal("kex_assemble_names failed");
195 }
196 
197 void
198 fill_default_server_options(ServerOptions *options)
199 {
200 	int i;
201 
202 	/* Portable-specific options */
203 	if (options->use_pam == -1)
204 		options->use_pam = 1;
205 
206 	/* Standard Options */
207 	if (options->protocol == SSH_PROTO_UNKNOWN)
208 		options->protocol = SSH_PROTO_2;
209 	if (options->protocol & SSH_PROTO_1)
210 		error("WARNING: SSH protocol version 1 enabled");
211 	if (options->num_host_key_files == 0) {
212 		/* fill default hostkeys for protocols */
213 		if (options->protocol & SSH_PROTO_1)
214 			options->host_key_files[options->num_host_key_files++] =
215 			    _PATH_HOST_KEY_FILE;
216 		if (options->protocol & SSH_PROTO_2) {
217 			options->host_key_files[options->num_host_key_files++] =
218 			    _PATH_HOST_RSA_KEY_FILE;
219 			options->host_key_files[options->num_host_key_files++] =
220 			    _PATH_HOST_DSA_KEY_FILE;
221 #ifdef OPENSSL_HAS_ECC
222 			options->host_key_files[options->num_host_key_files++] =
223 			    _PATH_HOST_ECDSA_KEY_FILE;
224 #endif
225 			options->host_key_files[options->num_host_key_files++] =
226 			    _PATH_HOST_ED25519_KEY_FILE;
227 		}
228 	}
229 	/* No certificates by default */
230 	if (options->num_ports == 0)
231 		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
232 	if (options->address_family == -1)
233 		options->address_family = AF_UNSPEC;
234 	if (options->listen_addrs == NULL)
235 		add_listen_addr(options, NULL, 0);
236 	if (options->pid_file == NULL)
237 		options->pid_file = xstrdup(_PATH_SSH_DAEMON_PID_FILE);
238 	if (options->server_key_bits == -1)
239 		options->server_key_bits = 1024;
240 	if (options->login_grace_time == -1)
241 		options->login_grace_time = 120;
242 	if (options->key_regeneration_time == -1)
243 		options->key_regeneration_time = 3600;
244 	if (options->permit_root_login == PERMIT_NOT_SET)
245 		options->permit_root_login = PERMIT_NO;
246 	if (options->ignore_rhosts == -1)
247 		options->ignore_rhosts = 1;
248 	if (options->ignore_user_known_hosts == -1)
249 		options->ignore_user_known_hosts = 0;
250 	if (options->print_motd == -1)
251 		options->print_motd = 1;
252 	if (options->print_lastlog == -1)
253 		options->print_lastlog = 1;
254 	if (options->x11_forwarding == -1)
255 		options->x11_forwarding = 1;
256 	if (options->x11_display_offset == -1)
257 		options->x11_display_offset = 10;
258 	if (options->x11_use_localhost == -1)
259 		options->x11_use_localhost = 1;
260 	if (options->xauth_location == NULL)
261 		options->xauth_location = xstrdup(_PATH_XAUTH);
262 	if (options->permit_tty == -1)
263 		options->permit_tty = 1;
264 	if (options->permit_user_rc == -1)
265 		options->permit_user_rc = 1;
266 	if (options->strict_modes == -1)
267 		options->strict_modes = 1;
268 	if (options->tcp_keep_alive == -1)
269 		options->tcp_keep_alive = 1;
270 	if (options->log_facility == SYSLOG_FACILITY_NOT_SET)
271 		options->log_facility = SYSLOG_FACILITY_AUTH;
272 	if (options->log_level == SYSLOG_LEVEL_NOT_SET)
273 		options->log_level = SYSLOG_LEVEL_INFO;
274 	if (options->rhosts_rsa_authentication == -1)
275 		options->rhosts_rsa_authentication = 0;
276 	if (options->hostbased_authentication == -1)
277 		options->hostbased_authentication = 0;
278 	if (options->hostbased_uses_name_from_packet_only == -1)
279 		options->hostbased_uses_name_from_packet_only = 0;
280 	if (options->rsa_authentication == -1)
281 		options->rsa_authentication = 1;
282 	if (options->pubkey_authentication == -1)
283 		options->pubkey_authentication = 1;
284 	if (options->kerberos_authentication == -1)
285 		options->kerberos_authentication = 0;
286 	if (options->kerberos_or_local_passwd == -1)
287 		options->kerberos_or_local_passwd = 1;
288 	if (options->kerberos_ticket_cleanup == -1)
289 		options->kerberos_ticket_cleanup = 1;
290 	if (options->kerberos_get_afs_token == -1)
291 		options->kerberos_get_afs_token = 0;
292 	if (options->gss_authentication == -1)
293 		options->gss_authentication = 0;
294 	if (options->gss_cleanup_creds == -1)
295 		options->gss_cleanup_creds = 1;
296 	if (options->gss_strict_acceptor == -1)
297 		options->gss_strict_acceptor = 0;
298 	if (options->password_authentication == -1)
299 		options->password_authentication = 0;
300 	if (options->kbd_interactive_authentication == -1)
301 		options->kbd_interactive_authentication = 0;
302 	if (options->challenge_response_authentication == -1)
303 		options->challenge_response_authentication = 1;
304 	if (options->permit_empty_passwd == -1)
305 		options->permit_empty_passwd = 0;
306 	if (options->permit_user_env == -1)
307 		options->permit_user_env = 0;
308 	if (options->use_login == -1)
309 		options->use_login = 0;
310 	if (options->compression == -1)
311 		options->compression = COMP_DELAYED;
312 	if (options->rekey_limit == -1)
313 		options->rekey_limit = 0;
314 	if (options->rekey_interval == -1)
315 		options->rekey_interval = 0;
316 	if (options->allow_tcp_forwarding == -1)
317 		options->allow_tcp_forwarding = FORWARD_ALLOW;
318 	if (options->allow_streamlocal_forwarding == -1)
319 		options->allow_streamlocal_forwarding = FORWARD_ALLOW;
320 	if (options->allow_agent_forwarding == -1)
321 		options->allow_agent_forwarding = 1;
322 	if (options->fwd_opts.gateway_ports == -1)
323 		options->fwd_opts.gateway_ports = 0;
324 	if (options->max_startups == -1)
325 		options->max_startups = 100;
326 	if (options->max_startups_rate == -1)
327 		options->max_startups_rate = 30;		/* 30% */
328 	if (options->max_startups_begin == -1)
329 		options->max_startups_begin = 10;
330 	if (options->max_authtries == -1)
331 		options->max_authtries = DEFAULT_AUTH_FAIL_MAX;
332 	if (options->max_sessions == -1)
333 		options->max_sessions = DEFAULT_SESSIONS_MAX;
334 	if (options->use_dns == -1)
335 		options->use_dns = 1;
336 	if (options->client_alive_interval == -1)
337 		options->client_alive_interval = 0;
338 	if (options->client_alive_count_max == -1)
339 		options->client_alive_count_max = 3;
340 	if (options->num_authkeys_files == 0) {
341 		options->authorized_keys_files[options->num_authkeys_files++] =
342 		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS);
343 		options->authorized_keys_files[options->num_authkeys_files++] =
344 		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS2);
345 	}
346 	if (options->permit_tun == -1)
347 		options->permit_tun = SSH_TUNMODE_NO;
348 	if (options->ip_qos_interactive == -1)
349 		options->ip_qos_interactive = IPTOS_LOWDELAY;
350 	if (options->ip_qos_bulk == -1)
351 		options->ip_qos_bulk = IPTOS_THROUGHPUT;
352 	if (options->version_addendum == NULL)
353 		options->version_addendum = xstrdup(SSH_VERSION_FREEBSD);
354 	if (options->fwd_opts.streamlocal_bind_mask == (mode_t)-1)
355 		options->fwd_opts.streamlocal_bind_mask = 0177;
356 	if (options->fwd_opts.streamlocal_bind_unlink == -1)
357 		options->fwd_opts.streamlocal_bind_unlink = 0;
358 	if (options->fingerprint_hash == -1)
359 		options->fingerprint_hash = SSH_FP_HASH_DEFAULT;
360 
361 	assemble_algorithms(options);
362 
363 	/* Turn privilege separation and sandboxing on by default */
364 	if (use_privsep == -1)
365 		use_privsep = PRIVSEP_ON;
366 
367 #define CLEAR_ON_NONE(v) \
368 	do { \
369 		if (option_clear_or_none(v)) { \
370 			free(v); \
371 			v = NULL; \
372 		} \
373 	} while(0)
374 	CLEAR_ON_NONE(options->pid_file);
375 	CLEAR_ON_NONE(options->xauth_location);
376 	CLEAR_ON_NONE(options->banner);
377 	CLEAR_ON_NONE(options->trusted_user_ca_keys);
378 	CLEAR_ON_NONE(options->revoked_keys_file);
379 	CLEAR_ON_NONE(options->authorized_principals_file);
380 	CLEAR_ON_NONE(options->adm_forced_command);
381 	CLEAR_ON_NONE(options->chroot_directory);
382 	for (i = 0; i < options->num_host_key_files; i++)
383 		CLEAR_ON_NONE(options->host_key_files[i]);
384 	for (i = 0; i < options->num_host_cert_files; i++)
385 		CLEAR_ON_NONE(options->host_cert_files[i]);
386 #undef CLEAR_ON_NONE
387 
388 #ifndef HAVE_MMAP
389 	if (use_privsep && options->compression == 1) {
390 		error("This platform does not support both privilege "
391 		    "separation and compression");
392 		error("Compression disabled");
393 		options->compression = 0;
394 	}
395 #endif
396 
397 }
398 
399 /* Keyword tokens. */
400 typedef enum {
401 	sBadOption,		/* == unknown option */
402 	/* Portable-specific options */
403 	sUsePAM,
404 	/* Standard Options */
405 	sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime,
406 	sKeyRegenerationTime, sPermitRootLogin, sLogFacility, sLogLevel,
407 	sRhostsRSAAuthentication, sRSAAuthentication,
408 	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,
409 	sKerberosGetAFSToken,
410 	sKerberosTgtPassing, sChallengeResponseAuthentication,
411 	sPasswordAuthentication, sKbdInteractiveAuthentication,
412 	sListenAddress, sAddressFamily,
413 	sPrintMotd, sPrintLastLog, sIgnoreRhosts,
414 	sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,
415 	sPermitTTY, sStrictModes, sEmptyPasswd, sTCPKeepAlive,
416 	sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,
417 	sRekeyLimit, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
418 	sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
419 	sGatewayPorts, sPubkeyAuthentication, sPubkeyAcceptedKeyTypes,
420 	sXAuthLocation, sSubsystem, sMaxStartups, sMaxAuthTries, sMaxSessions,
421 	sBanner, sUseDNS, sHostbasedAuthentication,
422 	sHostbasedUsesNameFromPacketOnly, sHostbasedAcceptedKeyTypes,
423 	sHostKeyAlgorithms,
424 	sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile,
425 	sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor,
426 	sAcceptEnv, sPermitTunnel,
427 	sMatch, sPermitOpen, sForceCommand, sChrootDirectory,
428 	sUsePrivilegeSeparation, sAllowAgentForwarding,
429 	sHostCertificate,
430 	sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile,
431 	sAuthorizedPrincipalsCommand, sAuthorizedPrincipalsCommandUser,
432 	sKexAlgorithms, sIPQoS, sVersionAddendum,
433 	sAuthorizedKeysCommand, sAuthorizedKeysCommandUser,
434 	sAuthenticationMethods, sHostKeyAgent, sPermitUserRC,
435 	sStreamLocalBindMask, sStreamLocalBindUnlink,
436 	sAllowStreamLocalForwarding, sFingerprintHash,
437 	sDeprecated, sUnsupported
438 } ServerOpCodes;
439 
440 #define SSHCFG_GLOBAL	0x01	/* allowed in main section of sshd_config */
441 #define SSHCFG_MATCH	0x02	/* allowed inside a Match section */
442 #define SSHCFG_ALL	(SSHCFG_GLOBAL|SSHCFG_MATCH)
443 
444 /* Textual representation of the tokens. */
445 static struct {
446 	const char *name;
447 	ServerOpCodes opcode;
448 	u_int flags;
449 } keywords[] = {
450 	/* Portable-specific options */
451 #ifdef USE_PAM
452 	{ "usepam", sUsePAM, SSHCFG_GLOBAL },
453 #else
454 	{ "usepam", sUnsupported, SSHCFG_GLOBAL },
455 #endif
456 	{ "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL },
457 	/* Standard Options */
458 	{ "port", sPort, SSHCFG_GLOBAL },
459 	{ "hostkey", sHostKeyFile, SSHCFG_GLOBAL },
460 	{ "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL },		/* alias */
461 	{ "hostkeyagent", sHostKeyAgent, SSHCFG_GLOBAL },
462 	{ "pidfile", sPidFile, SSHCFG_GLOBAL },
463 	{ "serverkeybits", sServerKeyBits, SSHCFG_GLOBAL },
464 	{ "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL },
465 	{ "keyregenerationinterval", sKeyRegenerationTime, SSHCFG_GLOBAL },
466 	{ "permitrootlogin", sPermitRootLogin, SSHCFG_ALL },
467 	{ "syslogfacility", sLogFacility, SSHCFG_GLOBAL },
468 	{ "loglevel", sLogLevel, SSHCFG_GLOBAL },
469 	{ "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL },
470 	{ "rhostsrsaauthentication", sRhostsRSAAuthentication, SSHCFG_ALL },
471 	{ "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL },
472 	{ "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_ALL },
473 	{ "hostbasedacceptedkeytypes", sHostbasedAcceptedKeyTypes, SSHCFG_ALL },
474 	{ "hostkeyalgorithms", sHostKeyAlgorithms, SSHCFG_GLOBAL },
475 	{ "rsaauthentication", sRSAAuthentication, SSHCFG_ALL },
476 	{ "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL },
477 	{ "pubkeyacceptedkeytypes", sPubkeyAcceptedKeyTypes, SSHCFG_ALL },
478 	{ "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */
479 #ifdef KRB5
480 	{ "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL },
481 	{ "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL },
482 	{ "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL },
483 #ifdef USE_AFS
484 	{ "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL },
485 #else
486 	{ "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
487 #endif
488 #else
489 	{ "kerberosauthentication", sUnsupported, SSHCFG_ALL },
490 	{ "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL },
491 	{ "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL },
492 	{ "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
493 #endif
494 	{ "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL },
495 	{ "afstokenpassing", sUnsupported, SSHCFG_GLOBAL },
496 #ifdef GSSAPI
497 	{ "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
498 	{ "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
499 	{ "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL },
500 #else
501 	{ "gssapiauthentication", sUnsupported, SSHCFG_ALL },
502 	{ "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL },
503 	{ "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL },
504 #endif
505 	{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
506 	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
507 	{ "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
508 	{ "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */
509 	{ "checkmail", sDeprecated, SSHCFG_GLOBAL },
510 	{ "listenaddress", sListenAddress, SSHCFG_GLOBAL },
511 	{ "addressfamily", sAddressFamily, SSHCFG_GLOBAL },
512 	{ "printmotd", sPrintMotd, SSHCFG_GLOBAL },
513 #ifdef DISABLE_LASTLOG
514 	{ "printlastlog", sUnsupported, SSHCFG_GLOBAL },
515 #else
516 	{ "printlastlog", sPrintLastLog, SSHCFG_GLOBAL },
517 #endif
518 	{ "ignorerhosts", sIgnoreRhosts, SSHCFG_GLOBAL },
519 	{ "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL },
520 	{ "x11forwarding", sX11Forwarding, SSHCFG_ALL },
521 	{ "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL },
522 	{ "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL },
523 	{ "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL },
524 	{ "strictmodes", sStrictModes, SSHCFG_GLOBAL },
525 	{ "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL },
526 	{ "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL },
527 	{ "uselogin", sUseLogin, SSHCFG_GLOBAL },
528 	{ "compression", sCompression, SSHCFG_GLOBAL },
529 	{ "rekeylimit", sRekeyLimit, SSHCFG_ALL },
530 	{ "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL },
531 	{ "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL },	/* obsolete alias */
532 	{ "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL },
533 	{ "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL },
534 	{ "allowusers", sAllowUsers, SSHCFG_ALL },
535 	{ "denyusers", sDenyUsers, SSHCFG_ALL },
536 	{ "allowgroups", sAllowGroups, SSHCFG_ALL },
537 	{ "denygroups", sDenyGroups, SSHCFG_ALL },
538 	{ "ciphers", sCiphers, SSHCFG_GLOBAL },
539 	{ "macs", sMacs, SSHCFG_GLOBAL },
540 	{ "protocol", sProtocol, SSHCFG_GLOBAL },
541 	{ "gatewayports", sGatewayPorts, SSHCFG_ALL },
542 	{ "subsystem", sSubsystem, SSHCFG_GLOBAL },
543 	{ "maxstartups", sMaxStartups, SSHCFG_GLOBAL },
544 	{ "maxauthtries", sMaxAuthTries, SSHCFG_ALL },
545 	{ "maxsessions", sMaxSessions, SSHCFG_ALL },
546 	{ "banner", sBanner, SSHCFG_ALL },
547 	{ "usedns", sUseDNS, SSHCFG_GLOBAL },
548 	{ "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL },
549 	{ "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL },
550 	{ "clientaliveinterval", sClientAliveInterval, SSHCFG_GLOBAL },
551 	{ "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL },
552 	{ "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL },
553 	{ "authorizedkeysfile2", sDeprecated, SSHCFG_ALL },
554 	{ "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL},
555 	{ "acceptenv", sAcceptEnv, SSHCFG_ALL },
556 	{ "permittunnel", sPermitTunnel, SSHCFG_ALL },
557 	{ "permittty", sPermitTTY, SSHCFG_ALL },
558 	{ "permituserrc", sPermitUserRC, SSHCFG_ALL },
559 	{ "match", sMatch, SSHCFG_ALL },
560 	{ "permitopen", sPermitOpen, SSHCFG_ALL },
561 	{ "forcecommand", sForceCommand, SSHCFG_ALL },
562 	{ "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
563 	{ "hostcertificate", sHostCertificate, SSHCFG_GLOBAL },
564 	{ "revokedkeys", sRevokedKeys, SSHCFG_ALL },
565 	{ "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL },
566 	{ "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL },
567 	{ "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL },
568 	{ "ipqos", sIPQoS, SSHCFG_ALL },
569 	{ "authorizedkeyscommand", sAuthorizedKeysCommand, SSHCFG_ALL },
570 	{ "authorizedkeyscommanduser", sAuthorizedKeysCommandUser, SSHCFG_ALL },
571 	{ "authorizedprincipalscommand", sAuthorizedPrincipalsCommand, SSHCFG_ALL },
572 	{ "authorizedprincipalscommanduser", sAuthorizedPrincipalsCommandUser, SSHCFG_ALL },
573 	{ "versionaddendum", sVersionAddendum, SSHCFG_GLOBAL },
574 	{ "authenticationmethods", sAuthenticationMethods, SSHCFG_ALL },
575 	{ "streamlocalbindmask", sStreamLocalBindMask, SSHCFG_ALL },
576 	{ "streamlocalbindunlink", sStreamLocalBindUnlink, SSHCFG_ALL },
577 	{ "allowstreamlocalforwarding", sAllowStreamLocalForwarding, SSHCFG_ALL },
578 	{ "fingerprinthash", sFingerprintHash, SSHCFG_GLOBAL },
579 	{ "noneenabled", sUnsupported, SSHCFG_ALL },
580 	{ "hpndisabled", sDeprecated, SSHCFG_ALL },
581 	{ "hpnbuffersize", sDeprecated, SSHCFG_ALL },
582 	{ "tcprcvbufpoll", sDeprecated, SSHCFG_ALL },
583 	{ NULL, sBadOption, 0 }
584 };
585 
586 static struct {
587 	int val;
588 	char *text;
589 } tunmode_desc[] = {
590 	{ SSH_TUNMODE_NO, "no" },
591 	{ SSH_TUNMODE_POINTOPOINT, "point-to-point" },
592 	{ SSH_TUNMODE_ETHERNET, "ethernet" },
593 	{ SSH_TUNMODE_YES, "yes" },
594 	{ -1, NULL }
595 };
596 
597 /*
598  * Returns the number of the token pointed to by cp or sBadOption.
599  */
600 
601 static ServerOpCodes
602 parse_token(const char *cp, const char *filename,
603 	    int linenum, u_int *flags)
604 {
605 	u_int i;
606 
607 	for (i = 0; keywords[i].name; i++)
608 		if (strcasecmp(cp, keywords[i].name) == 0) {
609 			*flags = keywords[i].flags;
610 			return keywords[i].opcode;
611 		}
612 
613 	error("%s: line %d: Bad configuration option: %s",
614 	    filename, linenum, cp);
615 	return sBadOption;
616 }
617 
618 char *
619 derelativise_path(const char *path)
620 {
621 	char *expanded, *ret, cwd[PATH_MAX];
622 
623 	if (strcasecmp(path, "none") == 0)
624 		return xstrdup("none");
625 	expanded = tilde_expand_filename(path, getuid());
626 	if (*expanded == '/')
627 		return expanded;
628 	if (getcwd(cwd, sizeof(cwd)) == NULL)
629 		fatal("%s: getcwd: %s", __func__, strerror(errno));
630 	xasprintf(&ret, "%s/%s", cwd, expanded);
631 	free(expanded);
632 	return ret;
633 }
634 
635 static void
636 add_listen_addr(ServerOptions *options, char *addr, int port)
637 {
638 	u_int i;
639 
640 	if (port == 0)
641 		for (i = 0; i < options->num_ports; i++)
642 			add_one_listen_addr(options, addr, options->ports[i]);
643 	else
644 		add_one_listen_addr(options, addr, port);
645 }
646 
647 static void
648 add_one_listen_addr(ServerOptions *options, char *addr, int port)
649 {
650 	struct addrinfo hints, *ai, *aitop;
651 	char strport[NI_MAXSERV];
652 	int gaierr;
653 
654 	memset(&hints, 0, sizeof(hints));
655 	hints.ai_family = options->address_family;
656 	hints.ai_socktype = SOCK_STREAM;
657 	hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
658 	snprintf(strport, sizeof strport, "%d", port);
659 	if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
660 		fatal("bad addr or host: %s (%s)",
661 		    addr ? addr : "<NULL>",
662 		    ssh_gai_strerror(gaierr));
663 	for (ai = aitop; ai->ai_next; ai = ai->ai_next)
664 		;
665 	ai->ai_next = options->listen_addrs;
666 	options->listen_addrs = aitop;
667 }
668 
669 /*
670  * Queue a ListenAddress to be processed once we have all of the Ports
671  * and AddressFamily options.
672  */
673 static void
674 queue_listen_addr(ServerOptions *options, char *addr, int port)
675 {
676 	options->queued_listen_addrs = xreallocarray(
677 	    options->queued_listen_addrs, options->num_queued_listens + 1,
678 	    sizeof(addr));
679 	options->queued_listen_ports = xreallocarray(
680 	    options->queued_listen_ports, options->num_queued_listens + 1,
681 	    sizeof(port));
682 	options->queued_listen_addrs[options->num_queued_listens] =
683 	    xstrdup(addr);
684 	options->queued_listen_ports[options->num_queued_listens] = port;
685 	options->num_queued_listens++;
686 }
687 
688 /*
689  * Process queued (text) ListenAddress entries.
690  */
691 static void
692 process_queued_listen_addrs(ServerOptions *options)
693 {
694 	u_int i;
695 
696 	if (options->num_ports == 0)
697 		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
698 	if (options->address_family == -1)
699 		options->address_family = AF_UNSPEC;
700 
701 	for (i = 0; i < options->num_queued_listens; i++) {
702 		add_listen_addr(options, options->queued_listen_addrs[i],
703 		    options->queued_listen_ports[i]);
704 		free(options->queued_listen_addrs[i]);
705 		options->queued_listen_addrs[i] = NULL;
706 	}
707 	free(options->queued_listen_addrs);
708 	options->queued_listen_addrs = NULL;
709 	free(options->queued_listen_ports);
710 	options->queued_listen_ports = NULL;
711 	options->num_queued_listens = 0;
712 }
713 
714 struct connection_info *
715 get_connection_info(int populate, int use_dns)
716 {
717 	static struct connection_info ci;
718 
719 	if (!populate)
720 		return &ci;
721 	ci.host = get_canonical_hostname(use_dns);
722 	ci.address = get_remote_ipaddr();
723 	ci.laddress = get_local_ipaddr(packet_get_connection_in());
724 	ci.lport = get_local_port();
725 	return &ci;
726 }
727 
728 /*
729  * The strategy for the Match blocks is that the config file is parsed twice.
730  *
731  * The first time is at startup.  activep is initialized to 1 and the
732  * directives in the global context are processed and acted on.  Hitting a
733  * Match directive unsets activep and the directives inside the block are
734  * checked for syntax only.
735  *
736  * The second time is after a connection has been established but before
737  * authentication.  activep is initialized to 2 and global config directives
738  * are ignored since they have already been processed.  If the criteria in a
739  * Match block is met, activep is set and the subsequent directives
740  * processed and actioned until EOF or another Match block unsets it.  Any
741  * options set are copied into the main server config.
742  *
743  * Potential additions/improvements:
744  *  - Add Match support for pre-kex directives, eg Protocol, Ciphers.
745  *
746  *  - Add a Tag directive (idea from David Leonard) ala pf, eg:
747  *	Match Address 192.168.0.*
748  *		Tag trusted
749  *	Match Group wheel
750  *		Tag trusted
751  *	Match Tag trusted
752  *		AllowTcpForwarding yes
753  *		GatewayPorts clientspecified
754  *		[...]
755  *
756  *  - Add a PermittedChannelRequests directive
757  *	Match Group shell
758  *		PermittedChannelRequests session,forwarded-tcpip
759  */
760 
761 static int
762 match_cfg_line_group(const char *grps, int line, const char *user)
763 {
764 	int result = 0;
765 	struct passwd *pw;
766 
767 	if (user == NULL)
768 		goto out;
769 
770 	if ((pw = getpwnam(user)) == NULL) {
771 		debug("Can't match group at line %d because user %.100s does "
772 		    "not exist", line, user);
773 	} else if (ga_init(pw->pw_name, pw->pw_gid) == 0) {
774 		debug("Can't Match group because user %.100s not in any group "
775 		    "at line %d", user, line);
776 	} else if (ga_match_pattern_list(grps) != 1) {
777 		debug("user %.100s does not match group list %.100s at line %d",
778 		    user, grps, line);
779 	} else {
780 		debug("user %.100s matched group list %.100s at line %d", user,
781 		    grps, line);
782 		result = 1;
783 	}
784 out:
785 	ga_free();
786 	return result;
787 }
788 
789 /*
790  * All of the attributes on a single Match line are ANDed together, so we need
791  * to check every attribute and set the result to zero if any attribute does
792  * not match.
793  */
794 static int
795 match_cfg_line(char **condition, int line, struct connection_info *ci)
796 {
797 	int result = 1, attributes = 0, port;
798 	char *arg, *attrib, *cp = *condition;
799 
800 	if (ci == NULL)
801 		debug3("checking syntax for 'Match %s'", cp);
802 	else
803 		debug3("checking match for '%s' user %s host %s addr %s "
804 		    "laddr %s lport %d", cp, ci->user ? ci->user : "(null)",
805 		    ci->host ? ci->host : "(null)",
806 		    ci->address ? ci->address : "(null)",
807 		    ci->laddress ? ci->laddress : "(null)", ci->lport);
808 
809 	while ((attrib = strdelim(&cp)) && *attrib != '\0') {
810 		attributes++;
811 		if (strcasecmp(attrib, "all") == 0) {
812 			if (attributes != 1 ||
813 			    ((arg = strdelim(&cp)) != NULL && *arg != '\0')) {
814 				error("'all' cannot be combined with other "
815 				    "Match attributes");
816 				return -1;
817 			}
818 			*condition = cp;
819 			return 1;
820 		}
821 		if ((arg = strdelim(&cp)) == NULL || *arg == '\0') {
822 			error("Missing Match criteria for %s", attrib);
823 			return -1;
824 		}
825 		if (strcasecmp(attrib, "user") == 0) {
826 			if (ci == NULL || ci->user == NULL) {
827 				result = 0;
828 				continue;
829 			}
830 			if (match_pattern_list(ci->user, arg, 0) != 1)
831 				result = 0;
832 			else
833 				debug("user %.100s matched 'User %.100s' at "
834 				    "line %d", ci->user, arg, line);
835 		} else if (strcasecmp(attrib, "group") == 0) {
836 			if (ci == NULL || ci->user == NULL) {
837 				result = 0;
838 				continue;
839 			}
840 			switch (match_cfg_line_group(arg, line, ci->user)) {
841 			case -1:
842 				return -1;
843 			case 0:
844 				result = 0;
845 			}
846 		} else if (strcasecmp(attrib, "host") == 0) {
847 			if (ci == NULL || ci->host == NULL) {
848 				result = 0;
849 				continue;
850 			}
851 			if (match_hostname(ci->host, arg) != 1)
852 				result = 0;
853 			else
854 				debug("connection from %.100s matched 'Host "
855 				    "%.100s' at line %d", ci->host, arg, line);
856 		} else if (strcasecmp(attrib, "address") == 0) {
857 			if (ci == NULL || ci->address == NULL) {
858 				result = 0;
859 				continue;
860 			}
861 			switch (addr_match_list(ci->address, arg)) {
862 			case 1:
863 				debug("connection from %.100s matched 'Address "
864 				    "%.100s' at line %d", ci->address, arg, line);
865 				break;
866 			case 0:
867 			case -1:
868 				result = 0;
869 				break;
870 			case -2:
871 				return -1;
872 			}
873 		} else if (strcasecmp(attrib, "localaddress") == 0){
874 			if (ci == NULL || ci->laddress == NULL) {
875 				result = 0;
876 				continue;
877 			}
878 			switch (addr_match_list(ci->laddress, arg)) {
879 			case 1:
880 				debug("connection from %.100s matched "
881 				    "'LocalAddress %.100s' at line %d",
882 				    ci->laddress, arg, line);
883 				break;
884 			case 0:
885 			case -1:
886 				result = 0;
887 				break;
888 			case -2:
889 				return -1;
890 			}
891 		} else if (strcasecmp(attrib, "localport") == 0) {
892 			if ((port = a2port(arg)) == -1) {
893 				error("Invalid LocalPort '%s' on Match line",
894 				    arg);
895 				return -1;
896 			}
897 			if (ci == NULL || ci->lport == 0) {
898 				result = 0;
899 				continue;
900 			}
901 			/* TODO support port lists */
902 			if (port == ci->lport)
903 				debug("connection from %.100s matched "
904 				    "'LocalPort %d' at line %d",
905 				    ci->laddress, port, line);
906 			else
907 				result = 0;
908 		} else {
909 			error("Unsupported Match attribute %s", attrib);
910 			return -1;
911 		}
912 	}
913 	if (attributes == 0) {
914 		error("One or more attributes required for Match");
915 		return -1;
916 	}
917 	if (ci != NULL)
918 		debug3("match %sfound", result ? "" : "not ");
919 	*condition = cp;
920 	return result;
921 }
922 
923 #define WHITESPACE " \t\r\n"
924 
925 /* Multistate option parsing */
926 struct multistate {
927 	char *key;
928 	int value;
929 };
930 static const struct multistate multistate_addressfamily[] = {
931 	{ "inet",			AF_INET },
932 	{ "inet6",			AF_INET6 },
933 	{ "any",			AF_UNSPEC },
934 	{ NULL, -1 }
935 };
936 static const struct multistate multistate_permitrootlogin[] = {
937 	{ "without-password",		PERMIT_NO_PASSWD },
938 	{ "prohibit-password",		PERMIT_NO_PASSWD },
939 	{ "forced-commands-only",	PERMIT_FORCED_ONLY },
940 	{ "yes",			PERMIT_YES },
941 	{ "no",				PERMIT_NO },
942 	{ NULL, -1 }
943 };
944 static const struct multistate multistate_compression[] = {
945 	{ "delayed",			COMP_DELAYED },
946 	{ "yes",			COMP_ZLIB },
947 	{ "no",				COMP_NONE },
948 	{ NULL, -1 }
949 };
950 static const struct multistate multistate_gatewayports[] = {
951 	{ "clientspecified",		2 },
952 	{ "yes",			1 },
953 	{ "no",				0 },
954 	{ NULL, -1 }
955 };
956 static const struct multistate multistate_privsep[] = {
957 	{ "yes",			PRIVSEP_NOSANDBOX },
958 	{ "sandbox",			PRIVSEP_ON },
959 	{ "nosandbox",			PRIVSEP_NOSANDBOX },
960 	{ "no",				PRIVSEP_OFF },
961 	{ NULL, -1 }
962 };
963 static const struct multistate multistate_tcpfwd[] = {
964 	{ "yes",			FORWARD_ALLOW },
965 	{ "all",			FORWARD_ALLOW },
966 	{ "no",				FORWARD_DENY },
967 	{ "remote",			FORWARD_REMOTE },
968 	{ "local",			FORWARD_LOCAL },
969 	{ NULL, -1 }
970 };
971 
972 int
973 process_server_config_line(ServerOptions *options, char *line,
974     const char *filename, int linenum, int *activep,
975     struct connection_info *connectinfo)
976 {
977 	char *cp, **charptr, *arg, *p;
978 	int cmdline = 0, *intptr, value, value2, n, port;
979 	SyslogFacility *log_facility_ptr;
980 	LogLevel *log_level_ptr;
981 	ServerOpCodes opcode;
982 	u_int i, flags = 0;
983 	size_t len;
984 	long long val64;
985 	const struct multistate *multistate_ptr;
986 
987 	cp = line;
988 	if ((arg = strdelim(&cp)) == NULL)
989 		return 0;
990 	/* Ignore leading whitespace */
991 	if (*arg == '\0')
992 		arg = strdelim(&cp);
993 	if (!arg || !*arg || *arg == '#')
994 		return 0;
995 	intptr = NULL;
996 	charptr = NULL;
997 	opcode = parse_token(arg, filename, linenum, &flags);
998 
999 	if (activep == NULL) { /* We are processing a command line directive */
1000 		cmdline = 1;
1001 		activep = &cmdline;
1002 	}
1003 	if (*activep && opcode != sMatch)
1004 		debug3("%s:%d setting %s %s", filename, linenum, arg, cp);
1005 	if (*activep == 0 && !(flags & SSHCFG_MATCH)) {
1006 		if (connectinfo == NULL) {
1007 			fatal("%s line %d: Directive '%s' is not allowed "
1008 			    "within a Match block", filename, linenum, arg);
1009 		} else { /* this is a directive we have already processed */
1010 			while (arg)
1011 				arg = strdelim(&cp);
1012 			return 0;
1013 		}
1014 	}
1015 
1016 	switch (opcode) {
1017 	/* Portable-specific options */
1018 	case sUsePAM:
1019 		intptr = &options->use_pam;
1020 		goto parse_flag;
1021 
1022 	/* Standard Options */
1023 	case sBadOption:
1024 		return -1;
1025 	case sPort:
1026 		/* ignore ports from configfile if cmdline specifies ports */
1027 		if (options->ports_from_cmdline)
1028 			return 0;
1029 		if (options->num_ports >= MAX_PORTS)
1030 			fatal("%s line %d: too many ports.",
1031 			    filename, linenum);
1032 		arg = strdelim(&cp);
1033 		if (!arg || *arg == '\0')
1034 			fatal("%s line %d: missing port number.",
1035 			    filename, linenum);
1036 		options->ports[options->num_ports++] = a2port(arg);
1037 		if (options->ports[options->num_ports-1] <= 0)
1038 			fatal("%s line %d: Badly formatted port number.",
1039 			    filename, linenum);
1040 		break;
1041 
1042 	case sServerKeyBits:
1043 		intptr = &options->server_key_bits;
1044  parse_int:
1045 		arg = strdelim(&cp);
1046 		if (!arg || *arg == '\0')
1047 			fatal("%s line %d: missing integer value.",
1048 			    filename, linenum);
1049 		value = atoi(arg);
1050 		if (*activep && *intptr == -1)
1051 			*intptr = value;
1052 		break;
1053 
1054 	case sLoginGraceTime:
1055 		intptr = &options->login_grace_time;
1056  parse_time:
1057 		arg = strdelim(&cp);
1058 		if (!arg || *arg == '\0')
1059 			fatal("%s line %d: missing time value.",
1060 			    filename, linenum);
1061 		if ((value = convtime(arg)) == -1)
1062 			fatal("%s line %d: invalid time value.",
1063 			    filename, linenum);
1064 		if (*activep && *intptr == -1)
1065 			*intptr = value;
1066 		break;
1067 
1068 	case sKeyRegenerationTime:
1069 		intptr = &options->key_regeneration_time;
1070 		goto parse_time;
1071 
1072 	case sListenAddress:
1073 		arg = strdelim(&cp);
1074 		if (arg == NULL || *arg == '\0')
1075 			fatal("%s line %d: missing address",
1076 			    filename, linenum);
1077 		/* check for bare IPv6 address: no "[]" and 2 or more ":" */
1078 		if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL
1079 		    && strchr(p+1, ':') != NULL) {
1080 			queue_listen_addr(options, arg, 0);
1081 			break;
1082 		}
1083 		p = hpdelim(&arg);
1084 		if (p == NULL)
1085 			fatal("%s line %d: bad address:port usage",
1086 			    filename, linenum);
1087 		p = cleanhostname(p);
1088 		if (arg == NULL)
1089 			port = 0;
1090 		else if ((port = a2port(arg)) <= 0)
1091 			fatal("%s line %d: bad port number", filename, linenum);
1092 
1093 		queue_listen_addr(options, p, port);
1094 
1095 		break;
1096 
1097 	case sAddressFamily:
1098 		intptr = &options->address_family;
1099 		multistate_ptr = multistate_addressfamily;
1100  parse_multistate:
1101 		arg = strdelim(&cp);
1102 		if (!arg || *arg == '\0')
1103 			fatal("%s line %d: missing argument.",
1104 			    filename, linenum);
1105 		value = -1;
1106 		for (i = 0; multistate_ptr[i].key != NULL; i++) {
1107 			if (strcasecmp(arg, multistate_ptr[i].key) == 0) {
1108 				value = multistate_ptr[i].value;
1109 				break;
1110 			}
1111 		}
1112 		if (value == -1)
1113 			fatal("%s line %d: unsupported option \"%s\".",
1114 			    filename, linenum, arg);
1115 		if (*activep && *intptr == -1)
1116 			*intptr = value;
1117 		break;
1118 
1119 	case sHostKeyFile:
1120 		intptr = &options->num_host_key_files;
1121 		if (*intptr >= MAX_HOSTKEYS)
1122 			fatal("%s line %d: too many host keys specified (max %d).",
1123 			    filename, linenum, MAX_HOSTKEYS);
1124 		charptr = &options->host_key_files[*intptr];
1125  parse_filename:
1126 		arg = strdelim(&cp);
1127 		if (!arg || *arg == '\0')
1128 			fatal("%s line %d: missing file name.",
1129 			    filename, linenum);
1130 		if (*activep && *charptr == NULL) {
1131 			*charptr = derelativise_path(arg);
1132 			/* increase optional counter */
1133 			if (intptr != NULL)
1134 				*intptr = *intptr + 1;
1135 		}
1136 		break;
1137 
1138 	case sHostKeyAgent:
1139 		charptr = &options->host_key_agent;
1140 		arg = strdelim(&cp);
1141 		if (!arg || *arg == '\0')
1142 			fatal("%s line %d: missing socket name.",
1143 			    filename, linenum);
1144 		if (*activep && *charptr == NULL)
1145 			*charptr = !strcmp(arg, SSH_AUTHSOCKET_ENV_NAME) ?
1146 			    xstrdup(arg) : derelativise_path(arg);
1147 		break;
1148 
1149 	case sHostCertificate:
1150 		intptr = &options->num_host_cert_files;
1151 		if (*intptr >= MAX_HOSTKEYS)
1152 			fatal("%s line %d: too many host certificates "
1153 			    "specified (max %d).", filename, linenum,
1154 			    MAX_HOSTCERTS);
1155 		charptr = &options->host_cert_files[*intptr];
1156 		goto parse_filename;
1157 		break;
1158 
1159 	case sPidFile:
1160 		charptr = &options->pid_file;
1161 		goto parse_filename;
1162 
1163 	case sPermitRootLogin:
1164 		intptr = &options->permit_root_login;
1165 		multistate_ptr = multistate_permitrootlogin;
1166 		goto parse_multistate;
1167 
1168 	case sIgnoreRhosts:
1169 		intptr = &options->ignore_rhosts;
1170  parse_flag:
1171 		arg = strdelim(&cp);
1172 		if (!arg || *arg == '\0')
1173 			fatal("%s line %d: missing yes/no argument.",
1174 			    filename, linenum);
1175 		value = 0;	/* silence compiler */
1176 		if (strcmp(arg, "yes") == 0)
1177 			value = 1;
1178 		else if (strcmp(arg, "no") == 0)
1179 			value = 0;
1180 		else
1181 			fatal("%s line %d: Bad yes/no argument: %s",
1182 				filename, linenum, arg);
1183 		if (*activep && *intptr == -1)
1184 			*intptr = value;
1185 		break;
1186 
1187 	case sIgnoreUserKnownHosts:
1188 		intptr = &options->ignore_user_known_hosts;
1189 		goto parse_flag;
1190 
1191 	case sRhostsRSAAuthentication:
1192 		intptr = &options->rhosts_rsa_authentication;
1193 		goto parse_flag;
1194 
1195 	case sHostbasedAuthentication:
1196 		intptr = &options->hostbased_authentication;
1197 		goto parse_flag;
1198 
1199 	case sHostbasedUsesNameFromPacketOnly:
1200 		intptr = &options->hostbased_uses_name_from_packet_only;
1201 		goto parse_flag;
1202 
1203 	case sHostbasedAcceptedKeyTypes:
1204 		charptr = &options->hostbased_key_types;
1205  parse_keytypes:
1206 		arg = strdelim(&cp);
1207 		if (!arg || *arg == '\0')
1208 			fatal("%s line %d: Missing argument.",
1209 			    filename, linenum);
1210 		if (!sshkey_names_valid2(*arg == '+' ? arg + 1 : arg, 1))
1211 			fatal("%s line %d: Bad key types '%s'.",
1212 			    filename, linenum, arg ? arg : "<NONE>");
1213 		if (*activep && *charptr == NULL)
1214 			*charptr = xstrdup(arg);
1215 		break;
1216 
1217 	case sHostKeyAlgorithms:
1218 		charptr = &options->hostkeyalgorithms;
1219 		goto parse_keytypes;
1220 
1221 	case sRSAAuthentication:
1222 		intptr = &options->rsa_authentication;
1223 		goto parse_flag;
1224 
1225 	case sPubkeyAuthentication:
1226 		intptr = &options->pubkey_authentication;
1227 		goto parse_flag;
1228 
1229 	case sPubkeyAcceptedKeyTypes:
1230 		charptr = &options->pubkey_key_types;
1231 		goto parse_keytypes;
1232 
1233 	case sKerberosAuthentication:
1234 		intptr = &options->kerberos_authentication;
1235 		goto parse_flag;
1236 
1237 	case sKerberosOrLocalPasswd:
1238 		intptr = &options->kerberos_or_local_passwd;
1239 		goto parse_flag;
1240 
1241 	case sKerberosTicketCleanup:
1242 		intptr = &options->kerberos_ticket_cleanup;
1243 		goto parse_flag;
1244 
1245 	case sKerberosGetAFSToken:
1246 		intptr = &options->kerberos_get_afs_token;
1247 		goto parse_flag;
1248 
1249 	case sGssAuthentication:
1250 		intptr = &options->gss_authentication;
1251 		goto parse_flag;
1252 
1253 	case sGssCleanupCreds:
1254 		intptr = &options->gss_cleanup_creds;
1255 		goto parse_flag;
1256 
1257 	case sGssStrictAcceptor:
1258 		intptr = &options->gss_strict_acceptor;
1259 		goto parse_flag;
1260 
1261 	case sPasswordAuthentication:
1262 		intptr = &options->password_authentication;
1263 		goto parse_flag;
1264 
1265 	case sKbdInteractiveAuthentication:
1266 		intptr = &options->kbd_interactive_authentication;
1267 		goto parse_flag;
1268 
1269 	case sChallengeResponseAuthentication:
1270 		intptr = &options->challenge_response_authentication;
1271 		goto parse_flag;
1272 
1273 	case sPrintMotd:
1274 		intptr = &options->print_motd;
1275 		goto parse_flag;
1276 
1277 	case sPrintLastLog:
1278 		intptr = &options->print_lastlog;
1279 		goto parse_flag;
1280 
1281 	case sX11Forwarding:
1282 		intptr = &options->x11_forwarding;
1283 		goto parse_flag;
1284 
1285 	case sX11DisplayOffset:
1286 		intptr = &options->x11_display_offset;
1287 		goto parse_int;
1288 
1289 	case sX11UseLocalhost:
1290 		intptr = &options->x11_use_localhost;
1291 		goto parse_flag;
1292 
1293 	case sXAuthLocation:
1294 		charptr = &options->xauth_location;
1295 		goto parse_filename;
1296 
1297 	case sPermitTTY:
1298 		intptr = &options->permit_tty;
1299 		goto parse_flag;
1300 
1301 	case sPermitUserRC:
1302 		intptr = &options->permit_user_rc;
1303 		goto parse_flag;
1304 
1305 	case sStrictModes:
1306 		intptr = &options->strict_modes;
1307 		goto parse_flag;
1308 
1309 	case sTCPKeepAlive:
1310 		intptr = &options->tcp_keep_alive;
1311 		goto parse_flag;
1312 
1313 	case sEmptyPasswd:
1314 		intptr = &options->permit_empty_passwd;
1315 		goto parse_flag;
1316 
1317 	case sPermitUserEnvironment:
1318 		intptr = &options->permit_user_env;
1319 		goto parse_flag;
1320 
1321 	case sUseLogin:
1322 		intptr = &options->use_login;
1323 		goto parse_flag;
1324 
1325 	case sCompression:
1326 		intptr = &options->compression;
1327 		multistate_ptr = multistate_compression;
1328 		goto parse_multistate;
1329 
1330 	case sRekeyLimit:
1331 		arg = strdelim(&cp);
1332 		if (!arg || *arg == '\0')
1333 			fatal("%.200s line %d: Missing argument.", filename,
1334 			    linenum);
1335 		if (strcmp(arg, "default") == 0) {
1336 			val64 = 0;
1337 		} else {
1338 			if (scan_scaled(arg, &val64) == -1)
1339 				fatal("%.200s line %d: Bad number '%s': %s",
1340 				    filename, linenum, arg, strerror(errno));
1341 			if (val64 != 0 && val64 < 16)
1342 				fatal("%.200s line %d: RekeyLimit too small",
1343 				    filename, linenum);
1344 		}
1345 		if (*activep && options->rekey_limit == -1)
1346 			options->rekey_limit = val64;
1347 		if (cp != NULL) { /* optional rekey interval present */
1348 			if (strcmp(cp, "none") == 0) {
1349 				(void)strdelim(&cp);	/* discard */
1350 				break;
1351 			}
1352 			intptr = &options->rekey_interval;
1353 			goto parse_time;
1354 		}
1355 		break;
1356 
1357 	case sGatewayPorts:
1358 		intptr = &options->fwd_opts.gateway_ports;
1359 		multistate_ptr = multistate_gatewayports;
1360 		goto parse_multistate;
1361 
1362 	case sUseDNS:
1363 		intptr = &options->use_dns;
1364 		goto parse_flag;
1365 
1366 	case sLogFacility:
1367 		log_facility_ptr = &options->log_facility;
1368 		arg = strdelim(&cp);
1369 		value = log_facility_number(arg);
1370 		if (value == SYSLOG_FACILITY_NOT_SET)
1371 			fatal("%.200s line %d: unsupported log facility '%s'",
1372 			    filename, linenum, arg ? arg : "<NONE>");
1373 		if (*log_facility_ptr == -1)
1374 			*log_facility_ptr = (SyslogFacility) value;
1375 		break;
1376 
1377 	case sLogLevel:
1378 		log_level_ptr = &options->log_level;
1379 		arg = strdelim(&cp);
1380 		value = log_level_number(arg);
1381 		if (value == SYSLOG_LEVEL_NOT_SET)
1382 			fatal("%.200s line %d: unsupported log level '%s'",
1383 			    filename, linenum, arg ? arg : "<NONE>");
1384 		if (*log_level_ptr == -1)
1385 			*log_level_ptr = (LogLevel) value;
1386 		break;
1387 
1388 	case sAllowTcpForwarding:
1389 		intptr = &options->allow_tcp_forwarding;
1390 		multistate_ptr = multistate_tcpfwd;
1391 		goto parse_multistate;
1392 
1393 	case sAllowStreamLocalForwarding:
1394 		intptr = &options->allow_streamlocal_forwarding;
1395 		multistate_ptr = multistate_tcpfwd;
1396 		goto parse_multistate;
1397 
1398 	case sAllowAgentForwarding:
1399 		intptr = &options->allow_agent_forwarding;
1400 		goto parse_flag;
1401 
1402 	case sUsePrivilegeSeparation:
1403 		intptr = &use_privsep;
1404 		multistate_ptr = multistate_privsep;
1405 		goto parse_multistate;
1406 
1407 	case sAllowUsers:
1408 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1409 			if (options->num_allow_users >= MAX_ALLOW_USERS)
1410 				fatal("%s line %d: too many allow users.",
1411 				    filename, linenum);
1412 			if (!*activep)
1413 				continue;
1414 			options->allow_users[options->num_allow_users++] =
1415 			    xstrdup(arg);
1416 		}
1417 		break;
1418 
1419 	case sDenyUsers:
1420 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1421 			if (options->num_deny_users >= MAX_DENY_USERS)
1422 				fatal("%s line %d: too many deny users.",
1423 				    filename, linenum);
1424 			if (!*activep)
1425 				continue;
1426 			options->deny_users[options->num_deny_users++] =
1427 			    xstrdup(arg);
1428 		}
1429 		break;
1430 
1431 	case sAllowGroups:
1432 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1433 			if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
1434 				fatal("%s line %d: too many allow groups.",
1435 				    filename, linenum);
1436 			if (!*activep)
1437 				continue;
1438 			options->allow_groups[options->num_allow_groups++] =
1439 			    xstrdup(arg);
1440 		}
1441 		break;
1442 
1443 	case sDenyGroups:
1444 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1445 			if (options->num_deny_groups >= MAX_DENY_GROUPS)
1446 				fatal("%s line %d: too many deny groups.",
1447 				    filename, linenum);
1448 			if (!*activep)
1449 				continue;
1450 			options->deny_groups[options->num_deny_groups++] =
1451 			    xstrdup(arg);
1452 		}
1453 		break;
1454 
1455 	case sCiphers:
1456 		arg = strdelim(&cp);
1457 		if (!arg || *arg == '\0')
1458 			fatal("%s line %d: Missing argument.", filename, linenum);
1459 		if (!ciphers_valid(*arg == '+' ? arg + 1 : arg))
1460 			fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
1461 			    filename, linenum, arg ? arg : "<NONE>");
1462 		if (options->ciphers == NULL)
1463 			options->ciphers = xstrdup(arg);
1464 		break;
1465 
1466 	case sMacs:
1467 		arg = strdelim(&cp);
1468 		if (!arg || *arg == '\0')
1469 			fatal("%s line %d: Missing argument.", filename, linenum);
1470 		if (!mac_valid(*arg == '+' ? arg + 1 : arg))
1471 			fatal("%s line %d: Bad SSH2 mac spec '%s'.",
1472 			    filename, linenum, arg ? arg : "<NONE>");
1473 		if (options->macs == NULL)
1474 			options->macs = xstrdup(arg);
1475 		break;
1476 
1477 	case sKexAlgorithms:
1478 		arg = strdelim(&cp);
1479 		if (!arg || *arg == '\0')
1480 			fatal("%s line %d: Missing argument.",
1481 			    filename, linenum);
1482 		if (!kex_names_valid(*arg == '+' ? arg + 1 : arg))
1483 			fatal("%s line %d: Bad SSH2 KexAlgorithms '%s'.",
1484 			    filename, linenum, arg ? arg : "<NONE>");
1485 		if (options->kex_algorithms == NULL)
1486 			options->kex_algorithms = xstrdup(arg);
1487 		break;
1488 
1489 	case sProtocol:
1490 		intptr = &options->protocol;
1491 		arg = strdelim(&cp);
1492 		if (!arg || *arg == '\0')
1493 			fatal("%s line %d: Missing argument.", filename, linenum);
1494 		value = proto_spec(arg);
1495 		if (value == SSH_PROTO_UNKNOWN)
1496 			fatal("%s line %d: Bad protocol spec '%s'.",
1497 			    filename, linenum, arg ? arg : "<NONE>");
1498 		if (*intptr == SSH_PROTO_UNKNOWN)
1499 			*intptr = value;
1500 		break;
1501 
1502 	case sSubsystem:
1503 		if (options->num_subsystems >= MAX_SUBSYSTEMS) {
1504 			fatal("%s line %d: too many subsystems defined.",
1505 			    filename, linenum);
1506 		}
1507 		arg = strdelim(&cp);
1508 		if (!arg || *arg == '\0')
1509 			fatal("%s line %d: Missing subsystem name.",
1510 			    filename, linenum);
1511 		if (!*activep) {
1512 			arg = strdelim(&cp);
1513 			break;
1514 		}
1515 		for (i = 0; i < options->num_subsystems; i++)
1516 			if (strcmp(arg, options->subsystem_name[i]) == 0)
1517 				fatal("%s line %d: Subsystem '%s' already defined.",
1518 				    filename, linenum, arg);
1519 		options->subsystem_name[options->num_subsystems] = xstrdup(arg);
1520 		arg = strdelim(&cp);
1521 		if (!arg || *arg == '\0')
1522 			fatal("%s line %d: Missing subsystem command.",
1523 			    filename, linenum);
1524 		options->subsystem_command[options->num_subsystems] = xstrdup(arg);
1525 
1526 		/* Collect arguments (separate to executable) */
1527 		p = xstrdup(arg);
1528 		len = strlen(p) + 1;
1529 		while ((arg = strdelim(&cp)) != NULL && *arg != '\0') {
1530 			len += 1 + strlen(arg);
1531 			p = xreallocarray(p, 1, len);
1532 			strlcat(p, " ", len);
1533 			strlcat(p, arg, len);
1534 		}
1535 		options->subsystem_args[options->num_subsystems] = p;
1536 		options->num_subsystems++;
1537 		break;
1538 
1539 	case sMaxStartups:
1540 		arg = strdelim(&cp);
1541 		if (!arg || *arg == '\0')
1542 			fatal("%s line %d: Missing MaxStartups spec.",
1543 			    filename, linenum);
1544 		if ((n = sscanf(arg, "%d:%d:%d",
1545 		    &options->max_startups_begin,
1546 		    &options->max_startups_rate,
1547 		    &options->max_startups)) == 3) {
1548 			if (options->max_startups_begin >
1549 			    options->max_startups ||
1550 			    options->max_startups_rate > 100 ||
1551 			    options->max_startups_rate < 1)
1552 				fatal("%s line %d: Illegal MaxStartups spec.",
1553 				    filename, linenum);
1554 		} else if (n != 1)
1555 			fatal("%s line %d: Illegal MaxStartups spec.",
1556 			    filename, linenum);
1557 		else
1558 			options->max_startups = options->max_startups_begin;
1559 		break;
1560 
1561 	case sMaxAuthTries:
1562 		intptr = &options->max_authtries;
1563 		goto parse_int;
1564 
1565 	case sMaxSessions:
1566 		intptr = &options->max_sessions;
1567 		goto parse_int;
1568 
1569 	case sBanner:
1570 		charptr = &options->banner;
1571 		goto parse_filename;
1572 
1573 	/*
1574 	 * These options can contain %X options expanded at
1575 	 * connect time, so that you can specify paths like:
1576 	 *
1577 	 * AuthorizedKeysFile	/etc/ssh_keys/%u
1578 	 */
1579 	case sAuthorizedKeysFile:
1580 		if (*activep && options->num_authkeys_files == 0) {
1581 			while ((arg = strdelim(&cp)) && *arg != '\0') {
1582 				if (options->num_authkeys_files >=
1583 				    MAX_AUTHKEYS_FILES)
1584 					fatal("%s line %d: "
1585 					    "too many authorized keys files.",
1586 					    filename, linenum);
1587 				options->authorized_keys_files[
1588 				    options->num_authkeys_files++] =
1589 				    tilde_expand_filename(arg, getuid());
1590 			}
1591 		}
1592 		return 0;
1593 
1594 	case sAuthorizedPrincipalsFile:
1595 		charptr = &options->authorized_principals_file;
1596 		arg = strdelim(&cp);
1597 		if (!arg || *arg == '\0')
1598 			fatal("%s line %d: missing file name.",
1599 			    filename, linenum);
1600 		if (*activep && *charptr == NULL) {
1601 			*charptr = tilde_expand_filename(arg, getuid());
1602 			/* increase optional counter */
1603 			if (intptr != NULL)
1604 				*intptr = *intptr + 1;
1605 		}
1606 		break;
1607 
1608 	case sClientAliveInterval:
1609 		intptr = &options->client_alive_interval;
1610 		goto parse_time;
1611 
1612 	case sClientAliveCountMax:
1613 		intptr = &options->client_alive_count_max;
1614 		goto parse_int;
1615 
1616 	case sAcceptEnv:
1617 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1618 			if (strchr(arg, '=') != NULL)
1619 				fatal("%s line %d: Invalid environment name.",
1620 				    filename, linenum);
1621 			if (options->num_accept_env >= MAX_ACCEPT_ENV)
1622 				fatal("%s line %d: too many allow env.",
1623 				    filename, linenum);
1624 			if (!*activep)
1625 				continue;
1626 			options->accept_env[options->num_accept_env++] =
1627 			    xstrdup(arg);
1628 		}
1629 		break;
1630 
1631 	case sPermitTunnel:
1632 		intptr = &options->permit_tun;
1633 		arg = strdelim(&cp);
1634 		if (!arg || *arg == '\0')
1635 			fatal("%s line %d: Missing yes/point-to-point/"
1636 			    "ethernet/no argument.", filename, linenum);
1637 		value = -1;
1638 		for (i = 0; tunmode_desc[i].val != -1; i++)
1639 			if (strcmp(tunmode_desc[i].text, arg) == 0) {
1640 				value = tunmode_desc[i].val;
1641 				break;
1642 			}
1643 		if (value == -1)
1644 			fatal("%s line %d: Bad yes/point-to-point/ethernet/"
1645 			    "no argument: %s", filename, linenum, arg);
1646 		if (*activep && *intptr == -1)
1647 			*intptr = value;
1648 		break;
1649 
1650 	case sMatch:
1651 		if (cmdline)
1652 			fatal("Match directive not supported as a command-line "
1653 			   "option");
1654 		value = match_cfg_line(&cp, linenum, connectinfo);
1655 		if (value < 0)
1656 			fatal("%s line %d: Bad Match condition", filename,
1657 			    linenum);
1658 		*activep = value;
1659 		break;
1660 
1661 	case sPermitOpen:
1662 		arg = strdelim(&cp);
1663 		if (!arg || *arg == '\0')
1664 			fatal("%s line %d: missing PermitOpen specification",
1665 			    filename, linenum);
1666 		n = options->num_permitted_opens;	/* modified later */
1667 		if (strcmp(arg, "any") == 0) {
1668 			if (*activep && n == -1) {
1669 				channel_clear_adm_permitted_opens();
1670 				options->num_permitted_opens = 0;
1671 			}
1672 			break;
1673 		}
1674 		if (strcmp(arg, "none") == 0) {
1675 			if (*activep && n == -1) {
1676 				options->num_permitted_opens = 1;
1677 				channel_disable_adm_local_opens();
1678 			}
1679 			break;
1680 		}
1681 		if (*activep && n == -1)
1682 			channel_clear_adm_permitted_opens();
1683 		for (; arg != NULL && *arg != '\0'; arg = strdelim(&cp)) {
1684 			p = hpdelim(&arg);
1685 			if (p == NULL)
1686 				fatal("%s line %d: missing host in PermitOpen",
1687 				    filename, linenum);
1688 			p = cleanhostname(p);
1689 			if (arg == NULL || ((port = permitopen_port(arg)) < 0))
1690 				fatal("%s line %d: bad port number in "
1691 				    "PermitOpen", filename, linenum);
1692 			if (*activep && n == -1)
1693 				options->num_permitted_opens =
1694 				    channel_add_adm_permitted_opens(p, port);
1695 		}
1696 		break;
1697 
1698 	case sForceCommand:
1699 		if (cp == NULL || *cp == '\0')
1700 			fatal("%.200s line %d: Missing argument.", filename,
1701 			    linenum);
1702 		len = strspn(cp, WHITESPACE);
1703 		if (*activep && options->adm_forced_command == NULL)
1704 			options->adm_forced_command = xstrdup(cp + len);
1705 		return 0;
1706 
1707 	case sChrootDirectory:
1708 		charptr = &options->chroot_directory;
1709 
1710 		arg = strdelim(&cp);
1711 		if (!arg || *arg == '\0')
1712 			fatal("%s line %d: missing file name.",
1713 			    filename, linenum);
1714 		if (*activep && *charptr == NULL)
1715 			*charptr = xstrdup(arg);
1716 		break;
1717 
1718 	case sTrustedUserCAKeys:
1719 		charptr = &options->trusted_user_ca_keys;
1720 		goto parse_filename;
1721 
1722 	case sRevokedKeys:
1723 		charptr = &options->revoked_keys_file;
1724 		goto parse_filename;
1725 
1726 	case sIPQoS:
1727 		arg = strdelim(&cp);
1728 		if ((value = parse_ipqos(arg)) == -1)
1729 			fatal("%s line %d: Bad IPQoS value: %s",
1730 			    filename, linenum, arg);
1731 		arg = strdelim(&cp);
1732 		if (arg == NULL)
1733 			value2 = value;
1734 		else if ((value2 = parse_ipqos(arg)) == -1)
1735 			fatal("%s line %d: Bad IPQoS value: %s",
1736 			    filename, linenum, arg);
1737 		if (*activep) {
1738 			options->ip_qos_interactive = value;
1739 			options->ip_qos_bulk = value2;
1740 		}
1741 		break;
1742 
1743 	case sVersionAddendum:
1744 		if (cp == NULL || *cp == '\0')
1745 			fatal("%.200s line %d: Missing argument.", filename,
1746 			    linenum);
1747 		len = strspn(cp, WHITESPACE);
1748 		if (*activep && options->version_addendum == NULL) {
1749 			if (strcasecmp(cp + len, "none") == 0)
1750 				options->version_addendum = xstrdup("");
1751 			else if (strchr(cp + len, '\r') != NULL)
1752 				fatal("%.200s line %d: Invalid argument",
1753 				    filename, linenum);
1754 			else
1755 				options->version_addendum = xstrdup(cp + len);
1756 		}
1757 		return 0;
1758 
1759 	case sAuthorizedKeysCommand:
1760 		if (cp == NULL)
1761 			fatal("%.200s line %d: Missing argument.", filename,
1762 			    linenum);
1763 		len = strspn(cp, WHITESPACE);
1764 		if (*activep && options->authorized_keys_command == NULL) {
1765 			if (cp[len] != '/' && strcasecmp(cp + len, "none") != 0)
1766 				fatal("%.200s line %d: AuthorizedKeysCommand "
1767 				    "must be an absolute path",
1768 				    filename, linenum);
1769 			options->authorized_keys_command = xstrdup(cp + len);
1770 		}
1771 		return 0;
1772 
1773 	case sAuthorizedKeysCommandUser:
1774 		charptr = &options->authorized_keys_command_user;
1775 
1776 		arg = strdelim(&cp);
1777 		if (!arg || *arg == '\0')
1778 			fatal("%s line %d: missing AuthorizedKeysCommandUser "
1779 			    "argument.", filename, linenum);
1780 		if (*activep && *charptr == NULL)
1781 			*charptr = xstrdup(arg);
1782 		break;
1783 
1784 	case sAuthorizedPrincipalsCommand:
1785 		if (cp == NULL)
1786 			fatal("%.200s line %d: Missing argument.", filename,
1787 			    linenum);
1788 		len = strspn(cp, WHITESPACE);
1789 		if (*activep &&
1790 		    options->authorized_principals_command == NULL) {
1791 			if (cp[len] != '/' && strcasecmp(cp + len, "none") != 0)
1792 				fatal("%.200s line %d: "
1793 				    "AuthorizedPrincipalsCommand must be "
1794 				    "an absolute path", filename, linenum);
1795 			options->authorized_principals_command =
1796 			    xstrdup(cp + len);
1797 		}
1798 		return 0;
1799 
1800 	case sAuthorizedPrincipalsCommandUser:
1801 		charptr = &options->authorized_principals_command_user;
1802 
1803 		arg = strdelim(&cp);
1804 		if (!arg || *arg == '\0')
1805 			fatal("%s line %d: missing "
1806 			    "AuthorizedPrincipalsCommandUser argument.",
1807 			    filename, linenum);
1808 		if (*activep && *charptr == NULL)
1809 			*charptr = xstrdup(arg);
1810 		break;
1811 
1812 	case sAuthenticationMethods:
1813 		if (options->num_auth_methods == 0) {
1814 			while ((arg = strdelim(&cp)) && *arg != '\0') {
1815 				if (options->num_auth_methods >=
1816 				    MAX_AUTH_METHODS)
1817 					fatal("%s line %d: "
1818 					    "too many authentication methods.",
1819 					    filename, linenum);
1820 				if (auth2_methods_valid(arg, 0) != 0)
1821 					fatal("%s line %d: invalid "
1822 					    "authentication method list.",
1823 					    filename, linenum);
1824 				if (!*activep)
1825 					continue;
1826 				options->auth_methods[
1827 				    options->num_auth_methods++] = xstrdup(arg);
1828 			}
1829 		}
1830 		return 0;
1831 
1832 	case sStreamLocalBindMask:
1833 		arg = strdelim(&cp);
1834 		if (!arg || *arg == '\0')
1835 			fatal("%s line %d: missing StreamLocalBindMask "
1836 			    "argument.", filename, linenum);
1837 		/* Parse mode in octal format */
1838 		value = strtol(arg, &p, 8);
1839 		if (arg == p || value < 0 || value > 0777)
1840 			fatal("%s line %d: Bad mask.", filename, linenum);
1841 		if (*activep)
1842 			options->fwd_opts.streamlocal_bind_mask = (mode_t)value;
1843 		break;
1844 
1845 	case sStreamLocalBindUnlink:
1846 		intptr = &options->fwd_opts.streamlocal_bind_unlink;
1847 		goto parse_flag;
1848 
1849 	case sFingerprintHash:
1850 		arg = strdelim(&cp);
1851 		if (!arg || *arg == '\0')
1852 			fatal("%.200s line %d: Missing argument.",
1853 			    filename, linenum);
1854 		if ((value = ssh_digest_alg_by_name(arg)) == -1)
1855 			fatal("%.200s line %d: Invalid hash algorithm \"%s\".",
1856 			    filename, linenum, arg);
1857 		if (*activep)
1858 			options->fingerprint_hash = value;
1859 		break;
1860 
1861 	case sDeprecated:
1862 		logit("%s line %d: Deprecated option %s",
1863 		    filename, linenum, arg);
1864 		while (arg)
1865 		    arg = strdelim(&cp);
1866 		break;
1867 
1868 	case sUnsupported:
1869 		logit("%s line %d: Unsupported option %s",
1870 		    filename, linenum, arg);
1871 		while (arg)
1872 		    arg = strdelim(&cp);
1873 		break;
1874 
1875 	default:
1876 		fatal("%s line %d: Missing handler for opcode %s (%d)",
1877 		    filename, linenum, arg, opcode);
1878 	}
1879 	if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
1880 		fatal("%s line %d: garbage at end of line; \"%.200s\".",
1881 		    filename, linenum, arg);
1882 	return 0;
1883 }
1884 
1885 /* Reads the server configuration file. */
1886 
1887 void
1888 load_server_config(const char *filename, Buffer *conf)
1889 {
1890 	char line[4096], *cp;
1891 	FILE *f;
1892 	int lineno = 0;
1893 
1894 	debug2("%s: filename %s", __func__, filename);
1895 	if ((f = fopen(filename, "r")) == NULL) {
1896 		perror(filename);
1897 		exit(1);
1898 	}
1899 	buffer_clear(conf);
1900 	while (fgets(line, sizeof(line), f)) {
1901 		lineno++;
1902 		if (strlen(line) == sizeof(line) - 1)
1903 			fatal("%s line %d too long", filename, lineno);
1904 		/*
1905 		 * Trim out comments and strip whitespace
1906 		 * NB - preserve newlines, they are needed to reproduce
1907 		 * line numbers later for error messages
1908 		 */
1909 		if ((cp = strchr(line, '#')) != NULL)
1910 			memcpy(cp, "\n", 2);
1911 		cp = line + strspn(line, " \t\r");
1912 
1913 		buffer_append(conf, cp, strlen(cp));
1914 	}
1915 	buffer_append(conf, "\0", 1);
1916 	fclose(f);
1917 	debug2("%s: done config len = %d", __func__, buffer_len(conf));
1918 }
1919 
1920 void
1921 parse_server_match_config(ServerOptions *options,
1922    struct connection_info *connectinfo)
1923 {
1924 	ServerOptions mo;
1925 
1926 	initialize_server_options(&mo);
1927 	parse_server_config(&mo, "reprocess config", &cfg, connectinfo);
1928 	copy_set_server_options(options, &mo, 0);
1929 }
1930 
1931 int parse_server_match_testspec(struct connection_info *ci, char *spec)
1932 {
1933 	char *p;
1934 
1935 	while ((p = strsep(&spec, ",")) && *p != '\0') {
1936 		if (strncmp(p, "addr=", 5) == 0) {
1937 			ci->address = xstrdup(p + 5);
1938 		} else if (strncmp(p, "host=", 5) == 0) {
1939 			ci->host = xstrdup(p + 5);
1940 		} else if (strncmp(p, "user=", 5) == 0) {
1941 			ci->user = xstrdup(p + 5);
1942 		} else if (strncmp(p, "laddr=", 6) == 0) {
1943 			ci->laddress = xstrdup(p + 6);
1944 		} else if (strncmp(p, "lport=", 6) == 0) {
1945 			ci->lport = a2port(p + 6);
1946 			if (ci->lport == -1) {
1947 				fprintf(stderr, "Invalid port '%s' in test mode"
1948 				   " specification %s\n", p+6, p);
1949 				return -1;
1950 			}
1951 		} else {
1952 			fprintf(stderr, "Invalid test mode specification %s\n",
1953 			   p);
1954 			return -1;
1955 		}
1956 	}
1957 	return 0;
1958 }
1959 
1960 /*
1961  * returns 1 for a complete spec, 0 for partial spec and -1 for an
1962  * empty spec.
1963  */
1964 int server_match_spec_complete(struct connection_info *ci)
1965 {
1966 	if (ci->user && ci->host && ci->address)
1967 		return 1;	/* complete */
1968 	if (!ci->user && !ci->host && !ci->address)
1969 		return -1;	/* empty */
1970 	return 0;	/* partial */
1971 }
1972 
1973 /*
1974  * Copy any supported values that are set.
1975  *
1976  * If the preauth flag is set, we do not bother copying the string or
1977  * array values that are not used pre-authentication, because any that we
1978  * do use must be explictly sent in mm_getpwnamallow().
1979  */
1980 void
1981 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
1982 {
1983 #define M_CP_INTOPT(n) do {\
1984 	if (src->n != -1) \
1985 		dst->n = src->n; \
1986 } while (0)
1987 
1988 	M_CP_INTOPT(password_authentication);
1989 	M_CP_INTOPT(gss_authentication);
1990 	M_CP_INTOPT(rsa_authentication);
1991 	M_CP_INTOPT(pubkey_authentication);
1992 	M_CP_INTOPT(kerberos_authentication);
1993 	M_CP_INTOPT(hostbased_authentication);
1994 	M_CP_INTOPT(hostbased_uses_name_from_packet_only);
1995 	M_CP_INTOPT(kbd_interactive_authentication);
1996 	M_CP_INTOPT(permit_root_login);
1997 	M_CP_INTOPT(permit_empty_passwd);
1998 
1999 	M_CP_INTOPT(allow_tcp_forwarding);
2000 	M_CP_INTOPT(allow_streamlocal_forwarding);
2001 	M_CP_INTOPT(allow_agent_forwarding);
2002 	M_CP_INTOPT(permit_tun);
2003 	M_CP_INTOPT(fwd_opts.gateway_ports);
2004 	M_CP_INTOPT(x11_display_offset);
2005 	M_CP_INTOPT(x11_forwarding);
2006 	M_CP_INTOPT(x11_use_localhost);
2007 	M_CP_INTOPT(permit_tty);
2008 	M_CP_INTOPT(permit_user_rc);
2009 	M_CP_INTOPT(max_sessions);
2010 	M_CP_INTOPT(max_authtries);
2011 	M_CP_INTOPT(ip_qos_interactive);
2012 	M_CP_INTOPT(ip_qos_bulk);
2013 	M_CP_INTOPT(rekey_limit);
2014 	M_CP_INTOPT(rekey_interval);
2015 
2016 	/* M_CP_STROPT and M_CP_STRARRAYOPT should not appear before here */
2017 #define M_CP_STROPT(n) do {\
2018 	if (src->n != NULL && dst->n != src->n) { \
2019 		free(dst->n); \
2020 		dst->n = src->n; \
2021 	} \
2022 } while(0)
2023 #define M_CP_STRARRAYOPT(n, num_n) do {\
2024 	if (src->num_n != 0) { \
2025 		for (dst->num_n = 0; dst->num_n < src->num_n; dst->num_n++) \
2026 			dst->n[dst->num_n] = xstrdup(src->n[dst->num_n]); \
2027 	} \
2028 } while(0)
2029 
2030 	/* See comment in servconf.h */
2031 	COPY_MATCH_STRING_OPTS();
2032 
2033 	/* Arguments that accept '+...' need to be expanded */
2034 	assemble_algorithms(dst);
2035 
2036 	/*
2037 	 * The only things that should be below this point are string options
2038 	 * which are only used after authentication.
2039 	 */
2040 	if (preauth)
2041 		return;
2042 
2043 	/* These options may be "none" to clear a global setting */
2044 	M_CP_STROPT(adm_forced_command);
2045 	if (option_clear_or_none(dst->adm_forced_command)) {
2046 		free(dst->adm_forced_command);
2047 		dst->adm_forced_command = NULL;
2048 	}
2049 	M_CP_STROPT(chroot_directory);
2050 	if (option_clear_or_none(dst->chroot_directory)) {
2051 		free(dst->chroot_directory);
2052 		dst->chroot_directory = NULL;
2053 	}
2054 }
2055 
2056 #undef M_CP_INTOPT
2057 #undef M_CP_STROPT
2058 #undef M_CP_STRARRAYOPT
2059 
2060 void
2061 parse_server_config(ServerOptions *options, const char *filename, Buffer *conf,
2062     struct connection_info *connectinfo)
2063 {
2064 	int active, linenum, bad_options = 0;
2065 	char *cp, *obuf, *cbuf;
2066 
2067 	debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));
2068 
2069 	obuf = cbuf = xstrdup(buffer_ptr(conf));
2070 	active = connectinfo ? 0 : 1;
2071 	linenum = 1;
2072 	while ((cp = strsep(&cbuf, "\n")) != NULL) {
2073 		if (process_server_config_line(options, cp, filename,
2074 		    linenum++, &active, connectinfo) != 0)
2075 			bad_options++;
2076 	}
2077 	free(obuf);
2078 	if (bad_options > 0)
2079 		fatal("%s: terminating, %d bad configuration options",
2080 		    filename, bad_options);
2081 	process_queued_listen_addrs(options);
2082 }
2083 
2084 static const char *
2085 fmt_multistate_int(int val, const struct multistate *m)
2086 {
2087 	u_int i;
2088 
2089 	for (i = 0; m[i].key != NULL; i++) {
2090 		if (m[i].value == val)
2091 			return m[i].key;
2092 	}
2093 	return "UNKNOWN";
2094 }
2095 
2096 static const char *
2097 fmt_intarg(ServerOpCodes code, int val)
2098 {
2099 	if (val == -1)
2100 		return "unset";
2101 	switch (code) {
2102 	case sAddressFamily:
2103 		return fmt_multistate_int(val, multistate_addressfamily);
2104 	case sPermitRootLogin:
2105 		return fmt_multistate_int(val, multistate_permitrootlogin);
2106 	case sGatewayPorts:
2107 		return fmt_multistate_int(val, multistate_gatewayports);
2108 	case sCompression:
2109 		return fmt_multistate_int(val, multistate_compression);
2110 	case sUsePrivilegeSeparation:
2111 		return fmt_multistate_int(val, multistate_privsep);
2112 	case sAllowTcpForwarding:
2113 		return fmt_multistate_int(val, multistate_tcpfwd);
2114 	case sAllowStreamLocalForwarding:
2115 		return fmt_multistate_int(val, multistate_tcpfwd);
2116 	case sFingerprintHash:
2117 		return ssh_digest_alg_name(val);
2118 	case sProtocol:
2119 		switch (val) {
2120 		case SSH_PROTO_1:
2121 			return "1";
2122 		case SSH_PROTO_2:
2123 			return "2";
2124 		case (SSH_PROTO_1|SSH_PROTO_2):
2125 			return "2,1";
2126 		default:
2127 			return "UNKNOWN";
2128 		}
2129 	default:
2130 		switch (val) {
2131 		case 0:
2132 			return "no";
2133 		case 1:
2134 			return "yes";
2135 		default:
2136 			return "UNKNOWN";
2137 		}
2138 	}
2139 }
2140 
2141 static const char *
2142 lookup_opcode_name(ServerOpCodes code)
2143 {
2144 	u_int i;
2145 
2146 	for (i = 0; keywords[i].name != NULL; i++)
2147 		if (keywords[i].opcode == code)
2148 			return(keywords[i].name);
2149 	return "UNKNOWN";
2150 }
2151 
2152 static void
2153 dump_cfg_int(ServerOpCodes code, int val)
2154 {
2155 	printf("%s %d\n", lookup_opcode_name(code), val);
2156 }
2157 
2158 static void
2159 dump_cfg_oct(ServerOpCodes code, int val)
2160 {
2161 	printf("%s 0%o\n", lookup_opcode_name(code), val);
2162 }
2163 
2164 static void
2165 dump_cfg_fmtint(ServerOpCodes code, int val)
2166 {
2167 	printf("%s %s\n", lookup_opcode_name(code), fmt_intarg(code, val));
2168 }
2169 
2170 static void
2171 dump_cfg_string(ServerOpCodes code, const char *val)
2172 {
2173 	if (val == NULL)
2174 		return;
2175 	printf("%s %s\n", lookup_opcode_name(code),
2176 	    val == NULL ? "none" : val);
2177 }
2178 
2179 static void
2180 dump_cfg_strarray(ServerOpCodes code, u_int count, char **vals)
2181 {
2182 	u_int i;
2183 
2184 	for (i = 0; i < count; i++)
2185 		printf("%s %s\n", lookup_opcode_name(code), vals[i]);
2186 }
2187 
2188 static void
2189 dump_cfg_strarray_oneline(ServerOpCodes code, u_int count, char **vals)
2190 {
2191 	u_int i;
2192 
2193 	if (count <= 0)
2194 		return;
2195 	printf("%s", lookup_opcode_name(code));
2196 	for (i = 0; i < count; i++)
2197 		printf(" %s",  vals[i]);
2198 	printf("\n");
2199 }
2200 
2201 void
2202 dump_config(ServerOptions *o)
2203 {
2204 	u_int i;
2205 	int ret;
2206 	struct addrinfo *ai;
2207 	char addr[NI_MAXHOST], port[NI_MAXSERV], *s = NULL;
2208 	char *laddr1 = xstrdup(""), *laddr2 = NULL;
2209 
2210 	/* these are usually at the top of the config */
2211 	for (i = 0; i < o->num_ports; i++)
2212 		printf("port %d\n", o->ports[i]);
2213 	dump_cfg_fmtint(sProtocol, o->protocol);
2214 	dump_cfg_fmtint(sAddressFamily, o->address_family);
2215 
2216 	/*
2217 	 * ListenAddress must be after Port.  add_one_listen_addr pushes
2218 	 * addresses onto a stack, so to maintain ordering we need to
2219 	 * print these in reverse order.
2220 	 */
2221 	for (ai = o->listen_addrs; ai; ai = ai->ai_next) {
2222 		if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
2223 		    sizeof(addr), port, sizeof(port),
2224 		    NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
2225 			error("getnameinfo failed: %.100s",
2226 			    (ret != EAI_SYSTEM) ? gai_strerror(ret) :
2227 			    strerror(errno));
2228 		} else {
2229 			laddr2 = laddr1;
2230 			if (ai->ai_family == AF_INET6)
2231 				xasprintf(&laddr1, "listenaddress [%s]:%s\n%s",
2232 				    addr, port, laddr2);
2233 			else
2234 				xasprintf(&laddr1, "listenaddress %s:%s\n%s",
2235 				    addr, port, laddr2);
2236 			free(laddr2);
2237 		}
2238 	}
2239 	printf("%s", laddr1);
2240 	free(laddr1);
2241 
2242 	/* integer arguments */
2243 #ifdef USE_PAM
2244 	dump_cfg_fmtint(sUsePAM, o->use_pam);
2245 #endif
2246 	dump_cfg_int(sServerKeyBits, o->server_key_bits);
2247 	dump_cfg_int(sLoginGraceTime, o->login_grace_time);
2248 	dump_cfg_int(sKeyRegenerationTime, o->key_regeneration_time);
2249 	dump_cfg_int(sX11DisplayOffset, o->x11_display_offset);
2250 	dump_cfg_int(sMaxAuthTries, o->max_authtries);
2251 	dump_cfg_int(sMaxSessions, o->max_sessions);
2252 	dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
2253 	dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
2254 	dump_cfg_oct(sStreamLocalBindMask, o->fwd_opts.streamlocal_bind_mask);
2255 
2256 	/* formatted integer arguments */
2257 	dump_cfg_fmtint(sPermitRootLogin, o->permit_root_login);
2258 	dump_cfg_fmtint(sIgnoreRhosts, o->ignore_rhosts);
2259 	dump_cfg_fmtint(sIgnoreUserKnownHosts, o->ignore_user_known_hosts);
2260 	dump_cfg_fmtint(sRhostsRSAAuthentication, o->rhosts_rsa_authentication);
2261 	dump_cfg_fmtint(sHostbasedAuthentication, o->hostbased_authentication);
2262 	dump_cfg_fmtint(sHostbasedUsesNameFromPacketOnly,
2263 	    o->hostbased_uses_name_from_packet_only);
2264 	dump_cfg_fmtint(sRSAAuthentication, o->rsa_authentication);
2265 	dump_cfg_fmtint(sPubkeyAuthentication, o->pubkey_authentication);
2266 #ifdef KRB5
2267 	dump_cfg_fmtint(sKerberosAuthentication, o->kerberos_authentication);
2268 	dump_cfg_fmtint(sKerberosOrLocalPasswd, o->kerberos_or_local_passwd);
2269 	dump_cfg_fmtint(sKerberosTicketCleanup, o->kerberos_ticket_cleanup);
2270 # ifdef USE_AFS
2271 	dump_cfg_fmtint(sKerberosGetAFSToken, o->kerberos_get_afs_token);
2272 # endif
2273 #endif
2274 #ifdef GSSAPI
2275 	dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
2276 	dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
2277 #endif
2278 	dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
2279 	dump_cfg_fmtint(sKbdInteractiveAuthentication,
2280 	    o->kbd_interactive_authentication);
2281 	dump_cfg_fmtint(sChallengeResponseAuthentication,
2282 	    o->challenge_response_authentication);
2283 	dump_cfg_fmtint(sPrintMotd, o->print_motd);
2284 #ifndef DISABLE_LASTLOG
2285 	dump_cfg_fmtint(sPrintLastLog, o->print_lastlog);
2286 #endif
2287 	dump_cfg_fmtint(sX11Forwarding, o->x11_forwarding);
2288 	dump_cfg_fmtint(sX11UseLocalhost, o->x11_use_localhost);
2289 	dump_cfg_fmtint(sPermitTTY, o->permit_tty);
2290 	dump_cfg_fmtint(sPermitUserRC, o->permit_user_rc);
2291 	dump_cfg_fmtint(sStrictModes, o->strict_modes);
2292 	dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive);
2293 	dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd);
2294 	dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env);
2295 	dump_cfg_fmtint(sUseLogin, o->use_login);
2296 	dump_cfg_fmtint(sCompression, o->compression);
2297 	dump_cfg_fmtint(sGatewayPorts, o->fwd_opts.gateway_ports);
2298 	dump_cfg_fmtint(sUseDNS, o->use_dns);
2299 	dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding);
2300 	dump_cfg_fmtint(sAllowAgentForwarding, o->allow_agent_forwarding);
2301 	dump_cfg_fmtint(sAllowStreamLocalForwarding, o->allow_streamlocal_forwarding);
2302 	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep);
2303 	dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash);
2304 
2305 	/* string arguments */
2306 	dump_cfg_string(sPidFile, o->pid_file);
2307 	dump_cfg_string(sXAuthLocation, o->xauth_location);
2308 	dump_cfg_string(sCiphers, o->ciphers ? o->ciphers : KEX_SERVER_ENCRYPT);
2309 	dump_cfg_string(sMacs, o->macs ? o->macs : KEX_SERVER_MAC);
2310 	dump_cfg_string(sBanner, o->banner);
2311 	dump_cfg_string(sForceCommand, o->adm_forced_command);
2312 	dump_cfg_string(sChrootDirectory, o->chroot_directory);
2313 	dump_cfg_string(sTrustedUserCAKeys, o->trusted_user_ca_keys);
2314 	dump_cfg_string(sRevokedKeys, o->revoked_keys_file);
2315 	dump_cfg_string(sAuthorizedPrincipalsFile,
2316 	    o->authorized_principals_file);
2317 	dump_cfg_string(sVersionAddendum, *o->version_addendum == '\0'
2318 	    ? "none" : o->version_addendum);
2319 	dump_cfg_string(sAuthorizedKeysCommand, o->authorized_keys_command);
2320 	dump_cfg_string(sAuthorizedKeysCommandUser, o->authorized_keys_command_user);
2321 	dump_cfg_string(sAuthorizedPrincipalsCommand, o->authorized_principals_command);
2322 	dump_cfg_string(sAuthorizedPrincipalsCommandUser, o->authorized_principals_command_user);
2323 	dump_cfg_string(sHostKeyAgent, o->host_key_agent);
2324 	dump_cfg_string(sKexAlgorithms,
2325 	    o->kex_algorithms ? o->kex_algorithms : KEX_SERVER_KEX);
2326 	dump_cfg_string(sHostbasedAcceptedKeyTypes, o->hostbased_key_types ?
2327 	    o->hostbased_key_types : KEX_DEFAULT_PK_ALG);
2328 	dump_cfg_string(sHostKeyAlgorithms, o->hostkeyalgorithms ?
2329 	    o->hostkeyalgorithms : KEX_DEFAULT_PK_ALG);
2330 	dump_cfg_string(sPubkeyAcceptedKeyTypes, o->pubkey_key_types ?
2331 	    o->pubkey_key_types : KEX_DEFAULT_PK_ALG);
2332 
2333 	/* string arguments requiring a lookup */
2334 	dump_cfg_string(sLogLevel, log_level_name(o->log_level));
2335 	dump_cfg_string(sLogFacility, log_facility_name(o->log_facility));
2336 
2337 	/* string array arguments */
2338 	dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files,
2339 	    o->authorized_keys_files);
2340 	dump_cfg_strarray(sHostKeyFile, o->num_host_key_files,
2341 	     o->host_key_files);
2342 	dump_cfg_strarray(sHostCertificate, o->num_host_cert_files,
2343 	     o->host_cert_files);
2344 	dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users);
2345 	dump_cfg_strarray(sDenyUsers, o->num_deny_users, o->deny_users);
2346 	dump_cfg_strarray(sAllowGroups, o->num_allow_groups, o->allow_groups);
2347 	dump_cfg_strarray(sDenyGroups, o->num_deny_groups, o->deny_groups);
2348 	dump_cfg_strarray(sAcceptEnv, o->num_accept_env, o->accept_env);
2349 	dump_cfg_strarray_oneline(sAuthenticationMethods,
2350 	    o->num_auth_methods, o->auth_methods);
2351 
2352 	/* other arguments */
2353 	for (i = 0; i < o->num_subsystems; i++)
2354 		printf("subsystem %s %s\n", o->subsystem_name[i],
2355 		    o->subsystem_args[i]);
2356 
2357 	printf("maxstartups %d:%d:%d\n", o->max_startups_begin,
2358 	    o->max_startups_rate, o->max_startups);
2359 
2360 	for (i = 0; tunmode_desc[i].val != -1; i++)
2361 		if (tunmode_desc[i].val == o->permit_tun) {
2362 			s = tunmode_desc[i].text;
2363 			break;
2364 		}
2365 	dump_cfg_string(sPermitTunnel, s);
2366 
2367 	printf("ipqos %s ", iptos2str(o->ip_qos_interactive));
2368 	printf("%s\n", iptos2str(o->ip_qos_bulk));
2369 
2370 	printf("rekeylimit %llu %d\n", (unsigned long long)o->rekey_limit,
2371 	    o->rekey_interval);
2372 
2373 	channel_print_adm_permitted_opens();
2374 }
2375