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