xref: /dragonfly/crypto/openssh/servconf.c (revision 783d47c4)
1 /* $OpenBSD: servconf.c,v 1.222 2011/06/22 21:57:01 djm Exp $ */
2 /*
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  *
6  * As far as I am concerned, the code I have written for this software
7  * can be used freely for any purpose.  Any derived versions of this
8  * software must be clearly marked as such, and if the derived work is
9  * incompatible with the protocol description in the RFC file, it must be
10  * called by a name other than "ssh" or "Secure Shell".
11  */
12 
13 #include "includes.h"
14 
15 #include <sys/types.h>
16 #include <sys/socket.h>
17 
18 #include <netinet/in.h>
19 #include <netinet/in_systm.h>
20 #include <netinet/ip.h>
21 
22 #include <netdb.h>
23 #include <pwd.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <signal.h>
28 #include <unistd.h>
29 #include <stdarg.h>
30 #include <errno.h>
31 
32 #include "openbsd-compat/sys-queue.h"
33 #include "xmalloc.h"
34 #include "ssh.h"
35 #include "log.h"
36 #include "buffer.h"
37 #include "servconf.h"
38 #include "compat.h"
39 #include "pathnames.h"
40 #include "misc.h"
41 #include "cipher.h"
42 #include "key.h"
43 #include "kex.h"
44 #include "mac.h"
45 #include "match.h"
46 #include "channels.h"
47 #include "groupaccess.h"
48 #include "version.h"
49 
50 static void add_listen_addr(ServerOptions *, char *, int);
51 static void add_one_listen_addr(ServerOptions *, char *, int);
52 
53 /* Use of privilege separation or not */
54 extern int use_privsep;
55 extern Buffer cfg;
56 
57 /* Initializes the server options to their default values. */
58 
59 void
60 initialize_server_options(ServerOptions *options)
61 {
62 	memset(options, 0, sizeof(*options));
63 
64 	/* Portable-specific options */
65 	options->use_pam = -1;
66 
67 	/* Standard Options */
68 	options->num_ports = 0;
69 	options->ports_from_cmdline = 0;
70 	options->listen_addrs = NULL;
71 	options->address_family = -1;
72 	options->num_host_key_files = 0;
73 	options->num_host_cert_files = 0;
74 	options->pid_file = NULL;
75 	options->server_key_bits = -1;
76 	options->login_grace_time = -1;
77 	options->key_regeneration_time = -1;
78 	options->permit_root_login = PERMIT_NOT_SET;
79 	options->ignore_rhosts = -1;
80 	options->ignore_user_known_hosts = -1;
81 	options->print_motd = -1;
82 	options->print_lastlog = -1;
83 	options->x11_forwarding = -1;
84 	options->x11_display_offset = -1;
85 	options->x11_use_localhost = -1;
86 	options->xauth_location = NULL;
87 	options->strict_modes = -1;
88 	options->tcp_keep_alive = -1;
89 	options->log_facility = SYSLOG_FACILITY_NOT_SET;
90 	options->log_level = SYSLOG_LEVEL_NOT_SET;
91 	options->rhosts_rsa_authentication = -1;
92 	options->hostbased_authentication = -1;
93 	options->hostbased_uses_name_from_packet_only = -1;
94 	options->rsa_authentication = -1;
95 	options->pubkey_authentication = -1;
96 	options->kerberos_authentication = -1;
97 	options->kerberos_or_local_passwd = -1;
98 	options->kerberos_ticket_cleanup = -1;
99 	options->kerberos_get_afs_token = -1;
100 	options->gss_authentication=-1;
101 	options->gss_cleanup_creds = -1;
102 	options->password_authentication = -1;
103 	options->kbd_interactive_authentication = -1;
104 	options->challenge_response_authentication = -1;
105 	options->permit_blacklisted_keys = -1;
106 	options->permit_empty_passwd = -1;
107 	options->permit_user_env = -1;
108 	options->use_login = -1;
109 	options->compression = -1;
110 	options->allow_tcp_forwarding = -1;
111 	options->allow_agent_forwarding = -1;
112 	options->num_allow_users = 0;
113 	options->num_deny_users = 0;
114 	options->num_allow_groups = 0;
115 	options->num_deny_groups = 0;
116 	options->ciphers = NULL;
117 	options->macs = NULL;
118 	options->kex_algorithms = NULL;
119 	options->protocol = SSH_PROTO_UNKNOWN;
120 	options->gateway_ports = -1;
121 	options->num_subsystems = 0;
122 	options->max_startups_begin = -1;
123 	options->max_startups_rate = -1;
124 	options->max_startups = -1;
125 	options->max_authtries = -1;
126 	options->max_sessions = -1;
127 	options->banner = NULL;
128 	options->use_dns = -1;
129 	options->client_alive_interval = -1;
130 	options->client_alive_count_max = -1;
131 	options->num_authkeys_files = 0;
132 	options->num_accept_env = 0;
133 	options->permit_tun = -1;
134 	options->num_permitted_opens = -1;
135 	options->adm_forced_command = NULL;
136 	options->chroot_directory = NULL;
137 	options->zero_knowledge_password_authentication = -1;
138 	options->none_enabled = -1;
139 	options->tcp_rcv_buf_poll = -1;
140 	options->hpn_disabled = -1;
141 	options->hpn_buffer_size = -1;
142 	options->revoked_keys_file = NULL;
143 	options->trusted_user_ca_keys = NULL;
144 	options->authorized_principals_file = NULL;
145 	options->ip_qos_interactive = -1;
146 	options->ip_qos_bulk = -1;
147 }
148 
149 void
150 fill_default_server_options(ServerOptions *options)
151 {
152 	/* needed for hpn socket tests */
153 	int sock;
154 	int socksize;
155 	int socksizelen = sizeof(int);
156 
157 	/* Portable-specific options */
158 	if (options->use_pam == -1)
159 		options->use_pam = 0;
160 
161 	/* Standard Options */
162 	if (options->protocol == SSH_PROTO_UNKNOWN)
163 		options->protocol = SSH_PROTO_2;
164 	if (options->num_host_key_files == 0) {
165 		/* fill default hostkeys for protocols */
166 		if (options->protocol & SSH_PROTO_1)
167 			options->host_key_files[options->num_host_key_files++] =
168 			    _PATH_HOST_KEY_FILE;
169 		if (options->protocol & SSH_PROTO_2) {
170 			options->host_key_files[options->num_host_key_files++] =
171 			    _PATH_HOST_RSA_KEY_FILE;
172 			options->host_key_files[options->num_host_key_files++] =
173 			    _PATH_HOST_DSA_KEY_FILE;
174 #ifdef OPENSSL_HAS_ECC
175 			options->host_key_files[options->num_host_key_files++] =
176 			    _PATH_HOST_ECDSA_KEY_FILE;
177 #endif
178 		}
179 	}
180 	/* No certificates by default */
181 	if (options->num_ports == 0)
182 		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
183 	if (options->listen_addrs == NULL)
184 		add_listen_addr(options, NULL, 0);
185 	if (options->pid_file == NULL)
186 		options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
187 	if (options->server_key_bits == -1)
188 		options->server_key_bits = 1024;
189 	if (options->login_grace_time == -1)
190 		options->login_grace_time = 120;
191 	if (options->key_regeneration_time == -1)
192 		options->key_regeneration_time = 3600;
193 	if (options->permit_root_login == PERMIT_NOT_SET)
194 		options->permit_root_login = PERMIT_NO;
195 	if (options->ignore_rhosts == -1)
196 		options->ignore_rhosts = 1;
197 	if (options->ignore_user_known_hosts == -1)
198 		options->ignore_user_known_hosts = 0;
199 	if (options->print_motd == -1)
200 		options->print_motd = 1;
201 	if (options->print_lastlog == -1)
202 		options->print_lastlog = 1;
203 	if (options->x11_forwarding == -1)
204 		options->x11_forwarding = 1;
205 	if (options->x11_display_offset == -1)
206 		options->x11_display_offset = 10;
207 	if (options->x11_use_localhost == -1)
208 		options->x11_use_localhost = 1;
209 	if (options->xauth_location == NULL)
210 		options->xauth_location = _PATH_XAUTH;
211 	if (options->strict_modes == -1)
212 		options->strict_modes = 1;
213 	if (options->tcp_keep_alive == -1)
214 		options->tcp_keep_alive = 1;
215 	if (options->log_facility == SYSLOG_FACILITY_NOT_SET)
216 		options->log_facility = SYSLOG_FACILITY_AUTH;
217 	if (options->log_level == SYSLOG_LEVEL_NOT_SET)
218 		options->log_level = SYSLOG_LEVEL_INFO;
219 	if (options->rhosts_rsa_authentication == -1)
220 		options->rhosts_rsa_authentication = 0;
221 	if (options->hostbased_authentication == -1)
222 		options->hostbased_authentication = 0;
223 	if (options->hostbased_uses_name_from_packet_only == -1)
224 		options->hostbased_uses_name_from_packet_only = 0;
225 	if (options->rsa_authentication == -1)
226 		options->rsa_authentication = 1;
227 	if (options->pubkey_authentication == -1)
228 		options->pubkey_authentication = 1;
229 	if (options->kerberos_authentication == -1)
230 		options->kerberos_authentication = 0;
231 	if (options->kerberos_or_local_passwd == -1)
232 		options->kerberos_or_local_passwd = 1;
233 	if (options->kerberos_ticket_cleanup == -1)
234 		options->kerberos_ticket_cleanup = 1;
235 	if (options->kerberos_get_afs_token == -1)
236 		options->kerberos_get_afs_token = 0;
237 	if (options->gss_authentication == -1)
238 		options->gss_authentication = 0;
239 	if (options->gss_cleanup_creds == -1)
240 		options->gss_cleanup_creds = 1;
241 	if (options->password_authentication == -1)
242 		options->password_authentication = 1;
243 	if (options->kbd_interactive_authentication == -1)
244 		options->kbd_interactive_authentication = 0;
245 	if (options->challenge_response_authentication == -1)
246 		options->challenge_response_authentication = 1;
247 	if (options->permit_blacklisted_keys == -1)
248 		options->permit_blacklisted_keys = 0;
249 	if (options->permit_empty_passwd == -1)
250 		options->permit_empty_passwd = 0;
251 	if (options->permit_user_env == -1)
252 		options->permit_user_env = 0;
253 	if (options->use_login == -1)
254 		options->use_login = 0;
255 	if (options->compression == -1)
256 		options->compression = COMP_DELAYED;
257 	if (options->allow_tcp_forwarding == -1)
258 		options->allow_tcp_forwarding = 1;
259 	if (options->allow_agent_forwarding == -1)
260 		options->allow_agent_forwarding = 1;
261 	if (options->gateway_ports == -1)
262 		options->gateway_ports = 0;
263 	if (options->max_startups == -1)
264 		options->max_startups = 10;
265 	if (options->max_startups_rate == -1)
266 		options->max_startups_rate = 100;		/* 100% */
267 	if (options->max_startups_begin == -1)
268 		options->max_startups_begin = options->max_startups;
269 	if (options->max_authtries == -1)
270 		options->max_authtries = DEFAULT_AUTH_FAIL_MAX;
271 	if (options->max_sessions == -1)
272 		options->max_sessions = DEFAULT_SESSIONS_MAX;
273 	if (options->use_dns == -1)
274 		options->use_dns = 1;
275 	if (options->client_alive_interval == -1)
276 		options->client_alive_interval = 0;
277 	if (options->client_alive_count_max == -1)
278 		options->client_alive_count_max = 3;
279 	if (options->num_authkeys_files == 0) {
280 		options->authorized_keys_files[options->num_authkeys_files++] =
281 		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS);
282 		options->authorized_keys_files[options->num_authkeys_files++] =
283 		    xstrdup(_PATH_SSH_USER_PERMITTED_KEYS2);
284 	}
285 	if (options->permit_tun == -1)
286 		options->permit_tun = SSH_TUNMODE_NO;
287 	if (options->zero_knowledge_password_authentication == -1)
288 		options->zero_knowledge_password_authentication = 0;
289 	if (options->ip_qos_interactive == -1)
290 		options->ip_qos_interactive = IPTOS_LOWDELAY;
291 	if (options->ip_qos_bulk == -1)
292 		options->ip_qos_bulk = IPTOS_THROUGHPUT;
293 
294 	if (options->hpn_disabled == -1)
295 		options->hpn_disabled = 0;
296 
297 	if (options->hpn_buffer_size == -1) {
298 		/* option not explicitly set. Now we have to figure out */
299 		/* what value to use */
300 		if (options->hpn_disabled == 1) {
301 			options->hpn_buffer_size = CHAN_SES_WINDOW_DEFAULT;
302 		} else {
303 			/* get the current RCV size and set it to that */
304 			/*create a socket but don't connect it */
305 			/* we use that the get the rcv socket size */
306 			sock = socket(AF_INET, SOCK_STREAM, 0);
307 			getsockopt(sock, SOL_SOCKET, SO_RCVBUF,
308 				   &socksize, &socksizelen);
309 			close(sock);
310 			options->hpn_buffer_size = socksize;
311 			debug ("HPN Buffer Size: %d", options->hpn_buffer_size);
312 
313 		}
314 	} else {
315 		/* we have to do this incase the user sets both values in a contradictory */
316 		/* manner. hpn_disabled overrrides hpn_buffer_size*/
317 		if (options->hpn_disabled <= 0) {
318 			if (options->hpn_buffer_size == 0)
319 				options->hpn_buffer_size = 1;
320 			/* limit the maximum buffer to 64MB */
321 			if (options->hpn_buffer_size > 64*1024) {
322 				options->hpn_buffer_size = 64*1024*1024;
323 			} else {
324 				options->hpn_buffer_size *= 1024;
325 			}
326 		} else
327 			options->hpn_buffer_size = CHAN_TCP_WINDOW_DEFAULT;
328 	}
329 
330 	/* Turn privilege separation on by default */
331 	if (use_privsep == -1)
332 		use_privsep = PRIVSEP_ON;
333 
334 #ifndef HAVE_MMAP
335 	if (use_privsep && options->compression == 1) {
336 		error("This platform does not support both privilege "
337 		    "separation and compression");
338 		error("Compression disabled");
339 		options->compression = 0;
340 	}
341 #endif
342 
343 }
344 
345 /* Keyword tokens. */
346 typedef enum {
347 	sBadOption,		/* == unknown option */
348 	/* Portable-specific options */
349 	sUsePAM,
350 	/* Standard Options */
351 	sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,
352 	sPermitRootLogin, sLogFacility, sLogLevel,
353 	sRhostsRSAAuthentication, sRSAAuthentication,
354 	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,
355 	sKerberosGetAFSToken,
356 	sKerberosTgtPassing, sChallengeResponseAuthentication,
357 	sPasswordAuthentication, sKbdInteractiveAuthentication,
358 	sListenAddress, sAddressFamily,
359 	sPrintMotd, sPrintLastLog, sIgnoreRhosts,
360 	sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,
361 	sStrictModes, sPermitBlacklistedKeys, sEmptyPasswd, sTCPKeepAlive,
362 	sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,
363 	sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
364 	sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
365 	sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem,
366 	sMaxStartups, sMaxAuthTries, sMaxSessions,
367 	sBanner, sUseDNS, sHostbasedAuthentication,
368 	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
369 	sClientAliveCountMax, sAuthorizedKeysFile,
370 	sGssAuthentication, sGssCleanupCreds, sAcceptEnv, sPermitTunnel,
371 	sMatch, sPermitOpen, sForceCommand, sChrootDirectory,
372 	sUsePrivilegeSeparation, sAllowAgentForwarding,
373 	sZeroKnowledgePasswordAuthentication, sHostCertificate,
374 	sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile,
375 	sKexAlgorithms, sIPQoS,
376 	sNoneEnabled, sTcpRcvBufPoll, sHPNDisabled, sHPNBufferSize,
377 	sVersionAddendum,
378 	sDeprecated, sUnsupported
379 } ServerOpCodes;
380 
381 #define SSHCFG_GLOBAL	0x01	/* allowed in main section of sshd_config */
382 #define SSHCFG_MATCH	0x02	/* allowed inside a Match section */
383 #define SSHCFG_ALL	(SSHCFG_GLOBAL|SSHCFG_MATCH)
384 
385 /* Textual representation of the tokens. */
386 static struct {
387 	const char *name;
388 	ServerOpCodes opcode;
389 	u_int flags;
390 } keywords[] = {
391 	/* Portable-specific options */
392 #ifdef USE_PAM
393 	{ "usepam", sUsePAM, SSHCFG_GLOBAL },
394 #else
395 	{ "usepam", sUnsupported, SSHCFG_GLOBAL },
396 #endif
397 	{ "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL },
398 	/* Standard Options */
399 	{ "port", sPort, SSHCFG_GLOBAL },
400 	{ "hostkey", sHostKeyFile, SSHCFG_GLOBAL },
401 	{ "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL },		/* alias */
402 	{ "pidfile", sPidFile, SSHCFG_GLOBAL },
403 	{ "serverkeybits", sServerKeyBits, SSHCFG_GLOBAL },
404 	{ "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL },
405 	{ "keyregenerationinterval", sKeyRegenerationTime, SSHCFG_GLOBAL },
406 	{ "permitrootlogin", sPermitRootLogin, SSHCFG_ALL },
407 	{ "syslogfacility", sLogFacility, SSHCFG_GLOBAL },
408 	{ "loglevel", sLogLevel, SSHCFG_GLOBAL },
409 	{ "rhostsauthentication", sDeprecated, SSHCFG_GLOBAL },
410 	{ "rhostsrsaauthentication", sRhostsRSAAuthentication, SSHCFG_ALL },
411 	{ "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL },
412 	{ "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly, SSHCFG_ALL },
413 	{ "rsaauthentication", sRSAAuthentication, SSHCFG_ALL },
414 	{ "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL },
415 	{ "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL }, /* alias */
416 #ifdef KRB5
417 	{ "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL },
418 	{ "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL },
419 	{ "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL },
420 #ifdef USE_AFS
421 	{ "kerberosgetafstoken", sKerberosGetAFSToken, SSHCFG_GLOBAL },
422 #else
423 	{ "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
424 #endif
425 #else
426 	{ "kerberosauthentication", sUnsupported, SSHCFG_ALL },
427 	{ "kerberosorlocalpasswd", sUnsupported, SSHCFG_GLOBAL },
428 	{ "kerberosticketcleanup", sUnsupported, SSHCFG_GLOBAL },
429 	{ "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL },
430 #endif
431 	{ "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL },
432 	{ "afstokenpassing", sUnsupported, SSHCFG_GLOBAL },
433 #ifdef GSSAPI
434 	{ "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
435 	{ "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
436 #else
437 	{ "gssapiauthentication", sUnsupported, SSHCFG_ALL },
438 	{ "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL },
439 #endif
440 	{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
441 	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
442 	{ "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
443 	{ "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */
444 #ifdef JPAKE
445 	{ "zeroknowledgepasswordauthentication", sZeroKnowledgePasswordAuthentication, SSHCFG_ALL },
446 #else
447 	{ "zeroknowledgepasswordauthentication", sUnsupported, SSHCFG_ALL },
448 #endif
449 	{ "checkmail", sDeprecated, SSHCFG_GLOBAL },
450 	{ "listenaddress", sListenAddress, SSHCFG_GLOBAL },
451 	{ "addressfamily", sAddressFamily, SSHCFG_GLOBAL },
452 	{ "printmotd", sPrintMotd, SSHCFG_GLOBAL },
453 	{ "printlastlog", sPrintLastLog, SSHCFG_GLOBAL },
454 	{ "ignorerhosts", sIgnoreRhosts, SSHCFG_GLOBAL },
455 	{ "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL },
456 	{ "x11forwarding", sX11Forwarding, SSHCFG_ALL },
457 	{ "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL },
458 	{ "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL },
459 	{ "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL },
460 	{ "strictmodes", sStrictModes, SSHCFG_GLOBAL },
461 	{ "permitblacklistedkeys", sPermitBlacklistedKeys, SSHCFG_GLOBAL },
462 	{ "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL },
463 	{ "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL },
464 	{ "uselogin", sUseLogin, SSHCFG_GLOBAL },
465 	{ "compression", sCompression, SSHCFG_GLOBAL },
466 	{ "tcpkeepalive", sTCPKeepAlive, SSHCFG_GLOBAL },
467 	{ "keepalive", sTCPKeepAlive, SSHCFG_GLOBAL },	/* obsolete alias */
468 	{ "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL },
469 	{ "allowagentforwarding", sAllowAgentForwarding, SSHCFG_ALL },
470 	{ "allowusers", sAllowUsers, SSHCFG_GLOBAL },
471 	{ "denyusers", sDenyUsers, SSHCFG_GLOBAL },
472 	{ "allowgroups", sAllowGroups, SSHCFG_GLOBAL },
473 	{ "denygroups", sDenyGroups, SSHCFG_GLOBAL },
474 	{ "ciphers", sCiphers, SSHCFG_GLOBAL },
475 	{ "macs", sMacs, SSHCFG_GLOBAL },
476 	{ "protocol", sProtocol, SSHCFG_GLOBAL },
477 	{ "gatewayports", sGatewayPorts, SSHCFG_ALL },
478 	{ "subsystem", sSubsystem, SSHCFG_GLOBAL },
479 	{ "maxstartups", sMaxStartups, SSHCFG_GLOBAL },
480 	{ "maxauthtries", sMaxAuthTries, SSHCFG_ALL },
481 	{ "maxsessions", sMaxSessions, SSHCFG_ALL },
482 	{ "banner", sBanner, SSHCFG_ALL },
483 	{ "usedns", sUseDNS, SSHCFG_GLOBAL },
484 	{ "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL },
485 	{ "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL },
486 	{ "clientaliveinterval", sClientAliveInterval, SSHCFG_GLOBAL },
487 	{ "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL },
488 	{ "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_ALL },
489 	{ "authorizedkeysfile2", sDeprecated, SSHCFG_ALL },
490 	{ "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL},
491 	{ "versionaddendum", sVersionAddendum , SSHCFG_GLOBAL },
492 	{ "acceptenv", sAcceptEnv, SSHCFG_GLOBAL },
493 	{ "permittunnel", sPermitTunnel, SSHCFG_ALL },
494 	{ "match", sMatch, SSHCFG_ALL },
495 	{ "permitopen", sPermitOpen, SSHCFG_ALL },
496 	{ "forcecommand", sForceCommand, SSHCFG_ALL },
497 	{ "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
498 	{ "hostcertificate", sHostCertificate, SSHCFG_GLOBAL },
499 	{ "revokedkeys", sRevokedKeys, SSHCFG_ALL },
500 	{ "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL },
501 	{ "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL },
502 	{ "noneenabled", sNoneEnabled },
503 	{ "hpndisabled", sHPNDisabled },
504 	{ "hpnbuffersize", sHPNBufferSize },
505 	{ "tcprcvbufpoll", sTcpRcvBufPoll },
506 	{ "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL },
507 	{ "ipqos", sIPQoS, SSHCFG_ALL },
508 	{ NULL, sBadOption, 0 }
509 };
510 
511 static struct {
512 	int val;
513 	char *text;
514 } tunmode_desc[] = {
515 	{ SSH_TUNMODE_NO, "no" },
516 	{ SSH_TUNMODE_POINTOPOINT, "point-to-point" },
517 	{ SSH_TUNMODE_ETHERNET, "ethernet" },
518 	{ SSH_TUNMODE_YES, "yes" },
519 	{ -1, NULL }
520 };
521 
522 /*
523  * Returns the number of the token pointed to by cp or sBadOption.
524  */
525 
526 static ServerOpCodes
527 parse_token(const char *cp, const char *filename,
528 	    int linenum, u_int *flags)
529 {
530 	u_int i;
531 
532 	for (i = 0; keywords[i].name; i++)
533 		if (strcasecmp(cp, keywords[i].name) == 0) {
534 		        debug ("Config token is %s", keywords[i].name);
535 			*flags = keywords[i].flags;
536 			return keywords[i].opcode;
537 		}
538 
539 	error("%s: line %d: Bad configuration option: %s",
540 	    filename, linenum, cp);
541 	return sBadOption;
542 }
543 
544 char *
545 derelativise_path(const char *path)
546 {
547 	char *expanded, *ret, cwd[MAXPATHLEN];
548 
549 	expanded = tilde_expand_filename(path, getuid());
550 	if (*expanded == '/')
551 		return expanded;
552 	if (getcwd(cwd, sizeof(cwd)) == NULL)
553 		fatal("%s: getcwd: %s", __func__, strerror(errno));
554 	xasprintf(&ret, "%s/%s", cwd, expanded);
555 	xfree(expanded);
556 	return ret;
557 }
558 
559 static void
560 add_listen_addr(ServerOptions *options, char *addr, int port)
561 {
562 	u_int i;
563 
564 	if (options->num_ports == 0)
565 		options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
566 	if (options->address_family == -1)
567 		options->address_family = AF_UNSPEC;
568 	if (port == 0)
569 		for (i = 0; i < options->num_ports; i++)
570 			add_one_listen_addr(options, addr, options->ports[i]);
571 	else
572 		add_one_listen_addr(options, addr, port);
573 }
574 
575 static void
576 add_one_listen_addr(ServerOptions *options, char *addr, int port)
577 {
578 	struct addrinfo hints, *ai, *aitop;
579 	char strport[NI_MAXSERV];
580 	int gaierr;
581 
582 	memset(&hints, 0, sizeof(hints));
583 	hints.ai_family = options->address_family;
584 	hints.ai_socktype = SOCK_STREAM;
585 	hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
586 	snprintf(strport, sizeof strport, "%d", port);
587 	if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
588 		fatal("bad addr or host: %s (%s)",
589 		    addr ? addr : "<NULL>",
590 		    ssh_gai_strerror(gaierr));
591 	for (ai = aitop; ai->ai_next; ai = ai->ai_next)
592 		;
593 	ai->ai_next = options->listen_addrs;
594 	options->listen_addrs = aitop;
595 }
596 
597 /*
598  * The strategy for the Match blocks is that the config file is parsed twice.
599  *
600  * The first time is at startup.  activep is initialized to 1 and the
601  * directives in the global context are processed and acted on.  Hitting a
602  * Match directive unsets activep and the directives inside the block are
603  * checked for syntax only.
604  *
605  * The second time is after a connection has been established but before
606  * authentication.  activep is initialized to 2 and global config directives
607  * are ignored since they have already been processed.  If the criteria in a
608  * Match block is met, activep is set and the subsequent directives
609  * processed and actioned until EOF or another Match block unsets it.  Any
610  * options set are copied into the main server config.
611  *
612  * Potential additions/improvements:
613  *  - Add Match support for pre-kex directives, eg Protocol, Ciphers.
614  *
615  *  - Add a Tag directive (idea from David Leonard) ala pf, eg:
616  *	Match Address 192.168.0.*
617  *		Tag trusted
618  *	Match Group wheel
619  *		Tag trusted
620  *	Match Tag trusted
621  *		AllowTcpForwarding yes
622  *		GatewayPorts clientspecified
623  *		[...]
624  *
625  *  - Add a PermittedChannelRequests directive
626  *	Match Group shell
627  *		PermittedChannelRequests session,forwarded-tcpip
628  */
629 
630 static int
631 match_cfg_line_group(const char *grps, int line, const char *user)
632 {
633 	int result = 0;
634 	struct passwd *pw;
635 
636 	if (user == NULL)
637 		goto out;
638 
639 	if ((pw = getpwnam(user)) == NULL) {
640 		debug("Can't match group at line %d because user %.100s does "
641 		    "not exist", line, user);
642 	} else if (ga_init(pw->pw_name, pw->pw_gid) == 0) {
643 		debug("Can't Match group because user %.100s not in any group "
644 		    "at line %d", user, line);
645 	} else if (ga_match_pattern_list(grps) != 1) {
646 		debug("user %.100s does not match group list %.100s at line %d",
647 		    user, grps, line);
648 	} else {
649 		debug("user %.100s matched group list %.100s at line %d", user,
650 		    grps, line);
651 		result = 1;
652 	}
653 out:
654 	ga_free();
655 	return result;
656 }
657 
658 static int
659 match_cfg_line(char **condition, int line, const char *user, const char *host,
660     const char *address)
661 {
662 	int result = 1;
663 	char *arg, *attrib, *cp = *condition;
664 	size_t len;
665 
666 	if (user == NULL)
667 		debug3("checking syntax for 'Match %s'", cp);
668 	else
669 		debug3("checking match for '%s' user %s host %s addr %s", cp,
670 		    user ? user : "(null)", host ? host : "(null)",
671 		    address ? address : "(null)");
672 
673 	while ((attrib = strdelim(&cp)) && *attrib != '\0') {
674 		if ((arg = strdelim(&cp)) == NULL || *arg == '\0') {
675 			error("Missing Match criteria for %s", attrib);
676 			return -1;
677 		}
678 		len = strlen(arg);
679 		if (strcasecmp(attrib, "user") == 0) {
680 			if (!user) {
681 				result = 0;
682 				continue;
683 			}
684 			if (match_pattern_list(user, arg, len, 0) != 1)
685 				result = 0;
686 			else
687 				debug("user %.100s matched 'User %.100s' at "
688 				    "line %d", user, arg, line);
689 		} else if (strcasecmp(attrib, "group") == 0) {
690 			switch (match_cfg_line_group(arg, line, user)) {
691 			case -1:
692 				return -1;
693 			case 0:
694 				result = 0;
695 			}
696 		} else if (strcasecmp(attrib, "host") == 0) {
697 			if (!host) {
698 				result = 0;
699 				continue;
700 			}
701 			if (match_hostname(host, arg, len) != 1)
702 				result = 0;
703 			else
704 				debug("connection from %.100s matched 'Host "
705 				    "%.100s' at line %d", host, arg, line);
706 		} else if (strcasecmp(attrib, "address") == 0) {
707 			switch (addr_match_list(address, arg)) {
708 			case 1:
709 				debug("connection from %.100s matched 'Address "
710 				    "%.100s' at line %d", address, arg, line);
711 				break;
712 			case 0:
713 			case -1:
714 				result = 0;
715 				break;
716 			case -2:
717 				return -1;
718 			}
719 		} else {
720 			error("Unsupported Match attribute %s", attrib);
721 			return -1;
722 		}
723 	}
724 	if (user != NULL)
725 		debug3("match %sfound", result ? "" : "not ");
726 	*condition = cp;
727 	return result;
728 }
729 
730 #define WHITESPACE " \t\r\n"
731 
732 /* Multistate option parsing */
733 struct multistate {
734 	char *key;
735 	int value;
736 };
737 static const struct multistate multistate_addressfamily[] = {
738 	{ "inet",			AF_INET },
739 	{ "inet6",			AF_INET6 },
740 	{ "any",			AF_UNSPEC },
741 	{ NULL, -1 }
742 };
743 static const struct multistate multistate_permitrootlogin[] = {
744 	{ "without-password",		PERMIT_NO_PASSWD },
745 	{ "forced-commands-only",	PERMIT_FORCED_ONLY },
746 	{ "yes",			PERMIT_YES },
747 	{ "no",				PERMIT_NO },
748 	{ NULL, -1 }
749 };
750 static const struct multistate multistate_compression[] = {
751 	{ "delayed",			COMP_DELAYED },
752 	{ "yes",			COMP_ZLIB },
753 	{ "no",				COMP_NONE },
754 	{ NULL, -1 }
755 };
756 static const struct multistate multistate_gatewayports[] = {
757 	{ "clientspecified",		2 },
758 	{ "yes",			1 },
759 	{ "no",				0 },
760 	{ NULL, -1 }
761 };
762 static const struct multistate multistate_privsep[] = {
763 	{ "sandbox",			PRIVSEP_SANDBOX },
764 	{ "yes",			PRIVSEP_ON },
765 	{ "no",				PRIVSEP_OFF },
766 	{ NULL, -1 }
767 };
768 
769 int
770 process_server_config_line(ServerOptions *options, char *line,
771     const char *filename, int linenum, int *activep, const char *user,
772     const char *host, const char *address)
773 {
774 	char *cp, **charptr, *arg, *p;
775 	int cmdline = 0, *intptr, value, value2, n;
776 	SyslogFacility *log_facility_ptr;
777 	LogLevel *log_level_ptr;
778 	ServerOpCodes opcode;
779 	int port;
780 	u_int i, flags = 0;
781 	size_t len;
782 	const struct multistate *multistate_ptr;
783 
784 	cp = line;
785 	if ((arg = strdelim(&cp)) == NULL)
786 		return 0;
787 	/* Ignore leading whitespace */
788 	if (*arg == '\0')
789 		arg = strdelim(&cp);
790 	if (!arg || !*arg || *arg == '#')
791 		return 0;
792 	intptr = NULL;
793 	charptr = NULL;
794 	opcode = parse_token(arg, filename, linenum, &flags);
795 
796 	if (activep == NULL) { /* We are processing a command line directive */
797 		cmdline = 1;
798 		activep = &cmdline;
799 	}
800 	if (*activep && opcode != sMatch)
801 		debug3("%s:%d setting %s %s", filename, linenum, arg, cp);
802 	if (*activep == 0 && !(flags & SSHCFG_MATCH)) {
803 		if (user == NULL) {
804 			fatal("%s line %d: Directive '%s' is not allowed "
805 			    "within a Match block", filename, linenum, arg);
806 		} else { /* this is a directive we have already processed */
807 			while (arg)
808 				arg = strdelim(&cp);
809 			return 0;
810 		}
811 	}
812 
813 	switch (opcode) {
814 	/* Portable-specific options */
815 	case sUsePAM:
816 		intptr = &options->use_pam;
817 		goto parse_flag;
818 
819 	/* Standard Options */
820 	case sBadOption:
821 		return -1;
822 	case sPort:
823 		/* ignore ports from configfile if cmdline specifies ports */
824 		if (options->ports_from_cmdline)
825 			return 0;
826 		if (options->listen_addrs != NULL)
827 			fatal("%s line %d: ports must be specified before "
828 			    "ListenAddress.", filename, linenum);
829 		if (options->num_ports >= MAX_PORTS)
830 			fatal("%s line %d: too many ports.",
831 			    filename, linenum);
832 		arg = strdelim(&cp);
833 		if (!arg || *arg == '\0')
834 			fatal("%s line %d: missing port number.",
835 			    filename, linenum);
836 		options->ports[options->num_ports++] = a2port(arg);
837 		if (options->ports[options->num_ports-1] <= 0)
838 			fatal("%s line %d: Badly formatted port number.",
839 			    filename, linenum);
840 		break;
841 
842 	case sServerKeyBits:
843 		intptr = &options->server_key_bits;
844  parse_int:
845 		arg = strdelim(&cp);
846 		if (!arg || *arg == '\0')
847 			fatal("%s line %d: missing integer value.",
848 			    filename, linenum);
849 		value = atoi(arg);
850 		if (*activep && *intptr == -1)
851 			*intptr = value;
852 		break;
853 
854 	case sLoginGraceTime:
855 		intptr = &options->login_grace_time;
856  parse_time:
857 		arg = strdelim(&cp);
858 		if (!arg || *arg == '\0')
859 			fatal("%s line %d: missing time value.",
860 			    filename, linenum);
861 		if ((value = convtime(arg)) == -1)
862 			fatal("%s line %d: invalid time value.",
863 			    filename, linenum);
864 		if (*intptr == -1)
865 			*intptr = value;
866 		break;
867 
868 	case sKeyRegenerationTime:
869 		intptr = &options->key_regeneration_time;
870 		goto parse_time;
871 
872 	case sListenAddress:
873 		arg = strdelim(&cp);
874 		if (arg == NULL || *arg == '\0')
875 			fatal("%s line %d: missing address",
876 			    filename, linenum);
877 		/* check for bare IPv6 address: no "[]" and 2 or more ":" */
878 		if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL
879 		    && strchr(p+1, ':') != NULL) {
880 			add_listen_addr(options, arg, 0);
881 			break;
882 		}
883 		p = hpdelim(&arg);
884 		if (p == NULL)
885 			fatal("%s line %d: bad address:port usage",
886 			    filename, linenum);
887 		p = cleanhostname(p);
888 		if (arg == NULL)
889 			port = 0;
890 		else if ((port = a2port(arg)) <= 0)
891 			fatal("%s line %d: bad port number", filename, linenum);
892 
893 		add_listen_addr(options, p, port);
894 
895 		break;
896 
897 	case sAddressFamily:
898 		intptr = &options->address_family;
899 		multistate_ptr = multistate_addressfamily;
900 		if (options->listen_addrs != NULL)
901 			fatal("%s line %d: address family must be specified "
902 			    "before ListenAddress.", filename, linenum);
903  parse_multistate:
904 		arg = strdelim(&cp);
905 		if (!arg || *arg == '\0')
906 			fatal("%s line %d: missing argument.",
907 			    filename, linenum);
908 		value = -1;
909 		for (i = 0; multistate_ptr[i].key != NULL; i++) {
910 			if (strcasecmp(arg, multistate_ptr[i].key) == 0) {
911 				value = multistate_ptr[i].value;
912 				break;
913 			}
914 		}
915 		if (value == -1)
916 			fatal("%s line %d: unsupported option \"%s\".",
917 			    filename, linenum, arg);
918 		if (*activep && *intptr == -1)
919 			*intptr = value;
920 		break;
921 
922 	case sHostKeyFile:
923 		intptr = &options->num_host_key_files;
924 		if (*intptr >= MAX_HOSTKEYS)
925 			fatal("%s line %d: too many host keys specified (max %d).",
926 			    filename, linenum, MAX_HOSTKEYS);
927 		charptr = &options->host_key_files[*intptr];
928  parse_filename:
929 		arg = strdelim(&cp);
930 		if (!arg || *arg == '\0')
931 			fatal("%s line %d: missing file name.",
932 			    filename, linenum);
933 		if (*activep && *charptr == NULL) {
934 			*charptr = derelativise_path(arg);
935 			/* increase optional counter */
936 			if (intptr != NULL)
937 				*intptr = *intptr + 1;
938 		}
939 		break;
940 
941 	case sHostCertificate:
942 		intptr = &options->num_host_cert_files;
943 		if (*intptr >= MAX_HOSTKEYS)
944 			fatal("%s line %d: too many host certificates "
945 			    "specified (max %d).", filename, linenum,
946 			    MAX_HOSTCERTS);
947 		charptr = &options->host_cert_files[*intptr];
948 		goto parse_filename;
949 		break;
950 
951 	case sPidFile:
952 		charptr = &options->pid_file;
953 		goto parse_filename;
954 
955 	case sPermitRootLogin:
956 		intptr = &options->permit_root_login;
957 		multistate_ptr = multistate_permitrootlogin;
958 		goto parse_multistate;
959 
960 	case sIgnoreRhosts:
961 		intptr = &options->ignore_rhosts;
962  parse_flag:
963 		arg = strdelim(&cp);
964 		if (!arg || *arg == '\0')
965 			fatal("%s line %d: missing yes/no argument.",
966 			    filename, linenum);
967 		value = 0;	/* silence compiler */
968 		if (strcmp(arg, "yes") == 0)
969 			value = 1;
970 		else if (strcmp(arg, "no") == 0)
971 			value = 0;
972 		else
973 			fatal("%s line %d: Bad yes/no argument: %s",
974 				filename, linenum, arg);
975 		if (*activep && *intptr == -1)
976 			*intptr = value;
977 		break;
978 
979 	case sNoneEnabled:
980 		intptr = &options->none_enabled;
981 		goto parse_flag;
982 
983 	case sTcpRcvBufPoll:
984 		intptr = &options->tcp_rcv_buf_poll;
985 		goto parse_flag;
986 
987 	case sHPNDisabled:
988 		intptr = &options->hpn_disabled;
989 		goto parse_flag;
990 
991 	case sHPNBufferSize:
992 		intptr = &options->hpn_buffer_size;
993 		goto parse_int;
994 
995 	case sIgnoreUserKnownHosts:
996 		intptr = &options->ignore_user_known_hosts;
997 		goto parse_flag;
998 
999 	case sRhostsRSAAuthentication:
1000 		intptr = &options->rhosts_rsa_authentication;
1001 		goto parse_flag;
1002 
1003 	case sHostbasedAuthentication:
1004 		intptr = &options->hostbased_authentication;
1005 		goto parse_flag;
1006 
1007 	case sHostbasedUsesNameFromPacketOnly:
1008 		intptr = &options->hostbased_uses_name_from_packet_only;
1009 		goto parse_flag;
1010 
1011 	case sRSAAuthentication:
1012 		intptr = &options->rsa_authentication;
1013 		goto parse_flag;
1014 
1015 	case sPubkeyAuthentication:
1016 		intptr = &options->pubkey_authentication;
1017 		goto parse_flag;
1018 
1019 	case sKerberosAuthentication:
1020 		intptr = &options->kerberos_authentication;
1021 		goto parse_flag;
1022 
1023 	case sKerberosOrLocalPasswd:
1024 		intptr = &options->kerberos_or_local_passwd;
1025 		goto parse_flag;
1026 
1027 	case sKerberosTicketCleanup:
1028 		intptr = &options->kerberos_ticket_cleanup;
1029 		goto parse_flag;
1030 
1031 	case sKerberosGetAFSToken:
1032 		intptr = &options->kerberos_get_afs_token;
1033 		goto parse_flag;
1034 
1035 	case sGssAuthentication:
1036 		intptr = &options->gss_authentication;
1037 		goto parse_flag;
1038 
1039 	case sGssCleanupCreds:
1040 		intptr = &options->gss_cleanup_creds;
1041 		goto parse_flag;
1042 
1043 	case sPasswordAuthentication:
1044 		intptr = &options->password_authentication;
1045 		goto parse_flag;
1046 
1047 	case sZeroKnowledgePasswordAuthentication:
1048 		intptr = &options->zero_knowledge_password_authentication;
1049 		goto parse_flag;
1050 
1051 	case sKbdInteractiveAuthentication:
1052 		intptr = &options->kbd_interactive_authentication;
1053 		goto parse_flag;
1054 
1055 	case sChallengeResponseAuthentication:
1056 		intptr = &options->challenge_response_authentication;
1057 		goto parse_flag;
1058 
1059 	case sPrintMotd:
1060 		intptr = &options->print_motd;
1061 		goto parse_flag;
1062 
1063 	case sPrintLastLog:
1064 		intptr = &options->print_lastlog;
1065 		goto parse_flag;
1066 
1067 	case sX11Forwarding:
1068 		intptr = &options->x11_forwarding;
1069 		goto parse_flag;
1070 
1071 	case sX11DisplayOffset:
1072 		intptr = &options->x11_display_offset;
1073 		goto parse_int;
1074 
1075 	case sX11UseLocalhost:
1076 		intptr = &options->x11_use_localhost;
1077 		goto parse_flag;
1078 
1079 	case sXAuthLocation:
1080 		charptr = &options->xauth_location;
1081 		goto parse_filename;
1082 
1083 	case sStrictModes:
1084 		intptr = &options->strict_modes;
1085 		goto parse_flag;
1086 
1087 	case sTCPKeepAlive:
1088 		intptr = &options->tcp_keep_alive;
1089 		goto parse_flag;
1090 
1091 	case sPermitBlacklistedKeys:
1092 		intptr = &options->permit_blacklisted_keys;
1093 		goto parse_flag;
1094 
1095 	case sEmptyPasswd:
1096 		intptr = &options->permit_empty_passwd;
1097 		goto parse_flag;
1098 
1099 	case sPermitUserEnvironment:
1100 		intptr = &options->permit_user_env;
1101 		goto parse_flag;
1102 
1103 	case sUseLogin:
1104 		intptr = &options->use_login;
1105 		goto parse_flag;
1106 
1107 	case sCompression:
1108 		intptr = &options->compression;
1109 		multistate_ptr = multistate_compression;
1110 		goto parse_multistate;
1111 
1112 	case sGatewayPorts:
1113 		intptr = &options->gateway_ports;
1114 		multistate_ptr = multistate_gatewayports;
1115 		goto parse_multistate;
1116 
1117 	case sUseDNS:
1118 		intptr = &options->use_dns;
1119 		goto parse_flag;
1120 
1121 	case sLogFacility:
1122 		log_facility_ptr = &options->log_facility;
1123 		arg = strdelim(&cp);
1124 		value = log_facility_number(arg);
1125 		if (value == SYSLOG_FACILITY_NOT_SET)
1126 			fatal("%.200s line %d: unsupported log facility '%s'",
1127 			    filename, linenum, arg ? arg : "<NONE>");
1128 		if (*log_facility_ptr == -1)
1129 			*log_facility_ptr = (SyslogFacility) value;
1130 		break;
1131 
1132 	case sLogLevel:
1133 		log_level_ptr = &options->log_level;
1134 		arg = strdelim(&cp);
1135 		value = log_level_number(arg);
1136 		if (value == SYSLOG_LEVEL_NOT_SET)
1137 			fatal("%.200s line %d: unsupported log level '%s'",
1138 			    filename, linenum, arg ? arg : "<NONE>");
1139 		if (*log_level_ptr == -1)
1140 			*log_level_ptr = (LogLevel) value;
1141 		break;
1142 
1143 	case sAllowTcpForwarding:
1144 		intptr = &options->allow_tcp_forwarding;
1145 		goto parse_flag;
1146 
1147 	case sAllowAgentForwarding:
1148 		intptr = &options->allow_agent_forwarding;
1149 		goto parse_flag;
1150 
1151 	case sUsePrivilegeSeparation:
1152 		intptr = &use_privsep;
1153 		multistate_ptr = multistate_privsep;
1154 		goto parse_multistate;
1155 
1156 	case sAllowUsers:
1157 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1158 			if (options->num_allow_users >= MAX_ALLOW_USERS)
1159 				fatal("%s line %d: too many allow users.",
1160 				    filename, linenum);
1161 			options->allow_users[options->num_allow_users++] =
1162 			    xstrdup(arg);
1163 		}
1164 		break;
1165 
1166 	case sDenyUsers:
1167 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1168 			if (options->num_deny_users >= MAX_DENY_USERS)
1169 				fatal("%s line %d: too many deny users.",
1170 				    filename, linenum);
1171 			options->deny_users[options->num_deny_users++] =
1172 			    xstrdup(arg);
1173 		}
1174 		break;
1175 
1176 	case sAllowGroups:
1177 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1178 			if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
1179 				fatal("%s line %d: too many allow groups.",
1180 				    filename, linenum);
1181 			options->allow_groups[options->num_allow_groups++] =
1182 			    xstrdup(arg);
1183 		}
1184 		break;
1185 
1186 	case sDenyGroups:
1187 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1188 			if (options->num_deny_groups >= MAX_DENY_GROUPS)
1189 				fatal("%s line %d: too many deny groups.",
1190 				    filename, linenum);
1191 			options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
1192 		}
1193 		break;
1194 
1195 	case sCiphers:
1196 		arg = strdelim(&cp);
1197 		if (!arg || *arg == '\0')
1198 			fatal("%s line %d: Missing argument.", filename, linenum);
1199 		if (!ciphers_valid(arg))
1200 			fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
1201 			    filename, linenum, arg ? arg : "<NONE>");
1202 		if (options->ciphers == NULL)
1203 			options->ciphers = xstrdup(arg);
1204 		break;
1205 
1206 	case sMacs:
1207 		arg = strdelim(&cp);
1208 		if (!arg || *arg == '\0')
1209 			fatal("%s line %d: Missing argument.", filename, linenum);
1210 		if (!mac_valid(arg))
1211 			fatal("%s line %d: Bad SSH2 mac spec '%s'.",
1212 			    filename, linenum, arg ? arg : "<NONE>");
1213 		if (options->macs == NULL)
1214 			options->macs = xstrdup(arg);
1215 		break;
1216 
1217 	case sKexAlgorithms:
1218 		arg = strdelim(&cp);
1219 		if (!arg || *arg == '\0')
1220 			fatal("%s line %d: Missing argument.",
1221 			    filename, linenum);
1222 		if (!kex_names_valid(arg))
1223 			fatal("%s line %d: Bad SSH2 KexAlgorithms '%s'.",
1224 			    filename, linenum, arg ? arg : "<NONE>");
1225 		if (options->kex_algorithms == NULL)
1226 			options->kex_algorithms = xstrdup(arg);
1227 		break;
1228 
1229 	case sProtocol:
1230 		intptr = &options->protocol;
1231 		arg = strdelim(&cp);
1232 		if (!arg || *arg == '\0')
1233 			fatal("%s line %d: Missing argument.", filename, linenum);
1234 		value = proto_spec(arg);
1235 		if (value == SSH_PROTO_UNKNOWN)
1236 			fatal("%s line %d: Bad protocol spec '%s'.",
1237 			    filename, linenum, arg ? arg : "<NONE>");
1238 		if (*intptr == SSH_PROTO_UNKNOWN)
1239 			*intptr = value;
1240 		break;
1241 
1242 	case sSubsystem:
1243 		if (options->num_subsystems >= MAX_SUBSYSTEMS) {
1244 			fatal("%s line %d: too many subsystems defined.",
1245 			    filename, linenum);
1246 		}
1247 		arg = strdelim(&cp);
1248 		if (!arg || *arg == '\0')
1249 			fatal("%s line %d: Missing subsystem name.",
1250 			    filename, linenum);
1251 		if (!*activep) {
1252 			arg = strdelim(&cp);
1253 			break;
1254 		}
1255 		for (i = 0; i < options->num_subsystems; i++)
1256 			if (strcmp(arg, options->subsystem_name[i]) == 0)
1257 				fatal("%s line %d: Subsystem '%s' already defined.",
1258 				    filename, linenum, arg);
1259 		options->subsystem_name[options->num_subsystems] = xstrdup(arg);
1260 		arg = strdelim(&cp);
1261 		if (!arg || *arg == '\0')
1262 			fatal("%s line %d: Missing subsystem command.",
1263 			    filename, linenum);
1264 		options->subsystem_command[options->num_subsystems] = xstrdup(arg);
1265 
1266 		/* Collect arguments (separate to executable) */
1267 		p = xstrdup(arg);
1268 		len = strlen(p) + 1;
1269 		while ((arg = strdelim(&cp)) != NULL && *arg != '\0') {
1270 			len += 1 + strlen(arg);
1271 			p = xrealloc(p, 1, len);
1272 			strlcat(p, " ", len);
1273 			strlcat(p, arg, len);
1274 		}
1275 		options->subsystem_args[options->num_subsystems] = p;
1276 		options->num_subsystems++;
1277 		break;
1278 
1279 	case sMaxStartups:
1280 		arg = strdelim(&cp);
1281 		if (!arg || *arg == '\0')
1282 			fatal("%s line %d: Missing MaxStartups spec.",
1283 			    filename, linenum);
1284 		if ((n = sscanf(arg, "%d:%d:%d",
1285 		    &options->max_startups_begin,
1286 		    &options->max_startups_rate,
1287 		    &options->max_startups)) == 3) {
1288 			if (options->max_startups_begin >
1289 			    options->max_startups ||
1290 			    options->max_startups_rate > 100 ||
1291 			    options->max_startups_rate < 1)
1292 				fatal("%s line %d: Illegal MaxStartups spec.",
1293 				    filename, linenum);
1294 		} else if (n != 1)
1295 			fatal("%s line %d: Illegal MaxStartups spec.",
1296 			    filename, linenum);
1297 		else
1298 			options->max_startups = options->max_startups_begin;
1299 		break;
1300 
1301 	case sMaxAuthTries:
1302 		intptr = &options->max_authtries;
1303 		goto parse_int;
1304 
1305 	case sMaxSessions:
1306 		intptr = &options->max_sessions;
1307 		goto parse_int;
1308 
1309 	case sBanner:
1310 		charptr = &options->banner;
1311 		goto parse_filename;
1312 
1313 	/*
1314 	 * These options can contain %X options expanded at
1315 	 * connect time, so that you can specify paths like:
1316 	 *
1317 	 * AuthorizedKeysFile	/etc/ssh_keys/%u
1318 	 */
1319 	case sAuthorizedKeysFile:
1320 		if (*activep && options->num_authkeys_files == 0) {
1321 			while ((arg = strdelim(&cp)) && *arg != '\0') {
1322 				if (options->num_authkeys_files >=
1323 				    MAX_AUTHKEYS_FILES)
1324 					fatal("%s line %d: "
1325 					    "too many authorized keys files.",
1326 					    filename, linenum);
1327 				options->authorized_keys_files[
1328 				    options->num_authkeys_files++] =
1329 				    tilde_expand_filename(arg, getuid());
1330 			}
1331 		}
1332 		return 0;
1333 
1334 	case sAuthorizedPrincipalsFile:
1335 		charptr = &options->authorized_principals_file;
1336 		arg = strdelim(&cp);
1337 		if (!arg || *arg == '\0')
1338 			fatal("%s line %d: missing file name.",
1339 			    filename, linenum);
1340 		if (*activep && *charptr == NULL) {
1341 			*charptr = tilde_expand_filename(arg, getuid());
1342 			/* increase optional counter */
1343 			if (intptr != NULL)
1344 				*intptr = *intptr + 1;
1345 		}
1346 		break;
1347 
1348 	case sClientAliveInterval:
1349 		intptr = &options->client_alive_interval;
1350 		goto parse_time;
1351 
1352 	case sClientAliveCountMax:
1353 		intptr = &options->client_alive_count_max;
1354 		goto parse_int;
1355 
1356 	case sAcceptEnv:
1357 		while ((arg = strdelim(&cp)) && *arg != '\0') {
1358 			if (strchr(arg, '=') != NULL)
1359 				fatal("%s line %d: Invalid environment name.",
1360 				    filename, linenum);
1361 			if (options->num_accept_env >= MAX_ACCEPT_ENV)
1362 				fatal("%s line %d: too many allow env.",
1363 				    filename, linenum);
1364 			if (!*activep)
1365 				break;
1366 			options->accept_env[options->num_accept_env++] =
1367 			    xstrdup(arg);
1368 		}
1369 		break;
1370 
1371 	case sPermitTunnel:
1372 		intptr = &options->permit_tun;
1373 		arg = strdelim(&cp);
1374 		if (!arg || *arg == '\0')
1375 			fatal("%s line %d: Missing yes/point-to-point/"
1376 			    "ethernet/no argument.", filename, linenum);
1377 		value = -1;
1378 		for (i = 0; tunmode_desc[i].val != -1; i++)
1379 			if (strcmp(tunmode_desc[i].text, arg) == 0) {
1380 				value = tunmode_desc[i].val;
1381 				break;
1382 			}
1383 		if (value == -1)
1384 			fatal("%s line %d: Bad yes/point-to-point/ethernet/"
1385 			    "no argument: %s", filename, linenum, arg);
1386 		if (*intptr == -1)
1387 			*intptr = value;
1388 		break;
1389 
1390 	case sMatch:
1391 		if (cmdline)
1392 			fatal("Match directive not supported as a command-line "
1393 			   "option");
1394 		value = match_cfg_line(&cp, linenum, user, host, address);
1395 		if (value < 0)
1396 			fatal("%s line %d: Bad Match condition", filename,
1397 			    linenum);
1398 		*activep = value;
1399 		break;
1400 
1401 	case sPermitOpen:
1402 		arg = strdelim(&cp);
1403 		if (!arg || *arg == '\0')
1404 			fatal("%s line %d: missing PermitOpen specification",
1405 			    filename, linenum);
1406 		n = options->num_permitted_opens;	/* modified later */
1407 		if (strcmp(arg, "any") == 0) {
1408 			if (*activep && n == -1) {
1409 				channel_clear_adm_permitted_opens();
1410 				options->num_permitted_opens = 0;
1411 			}
1412 			break;
1413 		}
1414 		if (*activep && n == -1)
1415 			channel_clear_adm_permitted_opens();
1416 		for (; arg != NULL && *arg != '\0'; arg = strdelim(&cp)) {
1417 			p = hpdelim(&arg);
1418 			if (p == NULL)
1419 				fatal("%s line %d: missing host in PermitOpen",
1420 				    filename, linenum);
1421 			p = cleanhostname(p);
1422 			if (arg == NULL || (port = a2port(arg)) <= 0)
1423 				fatal("%s line %d: bad port number in "
1424 				    "PermitOpen", filename, linenum);
1425 			if (*activep && n == -1)
1426 				options->num_permitted_opens =
1427 				    channel_add_adm_permitted_opens(p, port);
1428 		}
1429 		break;
1430 
1431 	case sForceCommand:
1432 		if (cp == NULL)
1433 			fatal("%.200s line %d: Missing argument.", filename,
1434 			    linenum);
1435 		len = strspn(cp, WHITESPACE);
1436 		if (*activep && options->adm_forced_command == NULL)
1437 			options->adm_forced_command = xstrdup(cp + len);
1438 		return 0;
1439 
1440 	case sChrootDirectory:
1441 		charptr = &options->chroot_directory;
1442 
1443 		arg = strdelim(&cp);
1444 		if (!arg || *arg == '\0')
1445 			fatal("%s line %d: missing file name.",
1446 			    filename, linenum);
1447 		if (*activep && *charptr == NULL)
1448 			*charptr = xstrdup(arg);
1449 		break;
1450 
1451 	case sVersionAddendum:
1452                 ssh_version_set_addendum(strtok(cp, "\n"));
1453                 do {
1454                         arg = strdelim(&cp);
1455                 } while (arg != NULL && *arg != '\0');
1456 		break;
1457 	case sTrustedUserCAKeys:
1458 		charptr = &options->trusted_user_ca_keys;
1459 		goto parse_filename;
1460 
1461 	case sRevokedKeys:
1462 		charptr = &options->revoked_keys_file;
1463 		goto parse_filename;
1464 
1465 	case sIPQoS:
1466 		arg = strdelim(&cp);
1467 		if ((value = parse_ipqos(arg)) == -1)
1468 			fatal("%s line %d: Bad IPQoS value: %s",
1469 			    filename, linenum, arg);
1470 		arg = strdelim(&cp);
1471 		if (arg == NULL)
1472 			value2 = value;
1473 		else if ((value2 = parse_ipqos(arg)) == -1)
1474 			fatal("%s line %d: Bad IPQoS value: %s",
1475 			    filename, linenum, arg);
1476 		if (*activep) {
1477 			options->ip_qos_interactive = value;
1478 			options->ip_qos_bulk = value2;
1479 		}
1480 		break;
1481 
1482 	case sDeprecated:
1483 		logit("%s line %d: Deprecated option %s",
1484 		    filename, linenum, arg);
1485 		while (arg)
1486 		    arg = strdelim(&cp);
1487 		break;
1488 
1489 	case sUnsupported:
1490 		logit("%s line %d: Unsupported option %s",
1491 		    filename, linenum, arg);
1492 		while (arg)
1493 		    arg = strdelim(&cp);
1494 		break;
1495 
1496 	default:
1497 		fatal("%s line %d: Missing handler for opcode %s (%d)",
1498 		    filename, linenum, arg, opcode);
1499 	}
1500 	if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
1501 		fatal("%s line %d: garbage at end of line; \"%.200s\".",
1502 		    filename, linenum, arg);
1503 	return 0;
1504 }
1505 
1506 /* Reads the server configuration file. */
1507 
1508 void
1509 load_server_config(const char *filename, Buffer *conf)
1510 {
1511 	char line[1024], *cp;
1512 	FILE *f;
1513 
1514 	debug2("%s: filename %s", __func__, filename);
1515 	if ((f = fopen(filename, "r")) == NULL) {
1516 		perror(filename);
1517 		exit(1);
1518 	}
1519 	buffer_clear(conf);
1520 	while (fgets(line, sizeof(line), f)) {
1521 		/*
1522 		 * Trim out comments and strip whitespace
1523 		 * NB - preserve newlines, they are needed to reproduce
1524 		 * line numbers later for error messages
1525 		 */
1526 		if ((cp = strchr(line, '#')) != NULL)
1527 			memcpy(cp, "\n", 2);
1528 		cp = line + strspn(line, " \t\r");
1529 
1530 		buffer_append(conf, cp, strlen(cp));
1531 	}
1532 	buffer_append(conf, "\0", 1);
1533 	fclose(f);
1534 	debug2("%s: done config len = %d", __func__, buffer_len(conf));
1535 }
1536 
1537 void
1538 parse_server_match_config(ServerOptions *options, const char *user,
1539     const char *host, const char *address)
1540 {
1541 	ServerOptions mo;
1542 
1543 	initialize_server_options(&mo);
1544 	parse_server_config(&mo, "reprocess config", &cfg, user, host, address);
1545 	copy_set_server_options(options, &mo, 0);
1546 }
1547 
1548 /* Helper macros */
1549 #define M_CP_INTOPT(n) do {\
1550 	if (src->n != -1) \
1551 		dst->n = src->n; \
1552 } while (0)
1553 #define M_CP_STROPT(n) do {\
1554 	if (src->n != NULL) { \
1555 		if (dst->n != NULL) \
1556 			xfree(dst->n); \
1557 		dst->n = src->n; \
1558 	} \
1559 } while(0)
1560 #define M_CP_STRARRAYOPT(n, num_n) do {\
1561 	if (src->num_n != 0) { \
1562 		for (dst->num_n = 0; dst->num_n < src->num_n; dst->num_n++) \
1563 			dst->n[dst->num_n] = xstrdup(src->n[dst->num_n]); \
1564 	} \
1565 } while(0)
1566 
1567 /*
1568  * Copy any supported values that are set.
1569  *
1570  * If the preauth flag is set, we do not bother copying the string or
1571  * array values that are not used pre-authentication, because any that we
1572  * do use must be explictly sent in mm_getpwnamallow().
1573  */
1574 void
1575 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
1576 {
1577 	M_CP_INTOPT(password_authentication);
1578 	M_CP_INTOPT(gss_authentication);
1579 	M_CP_INTOPT(rsa_authentication);
1580 	M_CP_INTOPT(pubkey_authentication);
1581 	M_CP_INTOPT(kerberos_authentication);
1582 	M_CP_INTOPT(hostbased_authentication);
1583 	M_CP_INTOPT(hostbased_uses_name_from_packet_only);
1584 	M_CP_INTOPT(kbd_interactive_authentication);
1585 	M_CP_INTOPT(zero_knowledge_password_authentication);
1586 	M_CP_INTOPT(permit_root_login);
1587 	M_CP_INTOPT(permit_empty_passwd);
1588 
1589 	M_CP_INTOPT(allow_tcp_forwarding);
1590 	M_CP_INTOPT(allow_agent_forwarding);
1591 	M_CP_INTOPT(permit_tun);
1592 	M_CP_INTOPT(gateway_ports);
1593 	M_CP_INTOPT(x11_display_offset);
1594 	M_CP_INTOPT(x11_forwarding);
1595 	M_CP_INTOPT(x11_use_localhost);
1596 	M_CP_INTOPT(max_sessions);
1597 	M_CP_INTOPT(max_authtries);
1598 	M_CP_INTOPT(ip_qos_interactive);
1599 	M_CP_INTOPT(ip_qos_bulk);
1600 
1601 	/* See comment in servconf.h */
1602 	COPY_MATCH_STRING_OPTS();
1603 
1604 	/*
1605 	 * The only things that should be below this point are string options
1606 	 * which are only used after authentication.
1607 	 */
1608 	if (preauth)
1609 		return;
1610 
1611 	M_CP_STROPT(adm_forced_command);
1612 	M_CP_STROPT(chroot_directory);
1613 }
1614 
1615 #undef M_CP_INTOPT
1616 #undef M_CP_STROPT
1617 #undef M_CP_STRARRAYOPT
1618 
1619 void
1620 parse_server_config(ServerOptions *options, const char *filename, Buffer *conf,
1621     const char *user, const char *host, const char *address)
1622 {
1623 	int active, linenum, bad_options = 0;
1624 	char *cp, *obuf, *cbuf;
1625 
1626 	debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));
1627 
1628 	obuf = cbuf = xstrdup(buffer_ptr(conf));
1629 	active = user ? 0 : 1;
1630 	linenum = 1;
1631 	while ((cp = strsep(&cbuf, "\n")) != NULL) {
1632 		if (process_server_config_line(options, cp, filename,
1633 		    linenum++, &active, user, host, address) != 0)
1634 			bad_options++;
1635 	}
1636 	xfree(obuf);
1637 	if (bad_options > 0)
1638 		fatal("%s: terminating, %d bad configuration options",
1639 		    filename, bad_options);
1640 }
1641 
1642 static const char *
1643 fmt_multistate_int(int val, const struct multistate *m)
1644 {
1645 	u_int i;
1646 
1647 	for (i = 0; m[i].key != NULL; i++) {
1648 		if (m[i].value == val)
1649 			return m[i].key;
1650 	}
1651 	return "UNKNOWN";
1652 }
1653 
1654 static const char *
1655 fmt_intarg(ServerOpCodes code, int val)
1656 {
1657 	if (val == -1)
1658 		return "unset";
1659 	switch (code) {
1660 	case sAddressFamily:
1661 		return fmt_multistate_int(val, multistate_addressfamily);
1662 	case sPermitRootLogin:
1663 		return fmt_multistate_int(val, multistate_permitrootlogin);
1664 	case sGatewayPorts:
1665 		return fmt_multistate_int(val, multistate_gatewayports);
1666 	case sCompression:
1667 		return fmt_multistate_int(val, multistate_compression);
1668 	case sUsePrivilegeSeparation:
1669 		return fmt_multistate_int(val, multistate_privsep);
1670 	case sProtocol:
1671 		switch (val) {
1672 		case SSH_PROTO_1:
1673 			return "1";
1674 		case SSH_PROTO_2:
1675 			return "2";
1676 		case (SSH_PROTO_1|SSH_PROTO_2):
1677 			return "2,1";
1678 		default:
1679 			return "UNKNOWN";
1680 		}
1681 	default:
1682 		switch (val) {
1683 		case 0:
1684 			return "no";
1685 		case 1:
1686 			return "yes";
1687 		default:
1688 			return "UNKNOWN";
1689 		}
1690 	}
1691 }
1692 
1693 static const char *
1694 lookup_opcode_name(ServerOpCodes code)
1695 {
1696 	u_int i;
1697 
1698 	for (i = 0; keywords[i].name != NULL; i++)
1699 		if (keywords[i].opcode == code)
1700 			return(keywords[i].name);
1701 	return "UNKNOWN";
1702 }
1703 
1704 static void
1705 dump_cfg_int(ServerOpCodes code, int val)
1706 {
1707 	printf("%s %d\n", lookup_opcode_name(code), val);
1708 }
1709 
1710 static void
1711 dump_cfg_fmtint(ServerOpCodes code, int val)
1712 {
1713 	printf("%s %s\n", lookup_opcode_name(code), fmt_intarg(code, val));
1714 }
1715 
1716 static void
1717 dump_cfg_string(ServerOpCodes code, const char *val)
1718 {
1719 	if (val == NULL)
1720 		return;
1721 	printf("%s %s\n", lookup_opcode_name(code), val);
1722 }
1723 
1724 static void
1725 dump_cfg_strarray(ServerOpCodes code, u_int count, char **vals)
1726 {
1727 	u_int i;
1728 
1729 	for (i = 0; i < count; i++)
1730 		printf("%s %s\n", lookup_opcode_name(code), vals[i]);
1731 }
1732 
1733 static void
1734 dump_cfg_strarray_oneline(ServerOpCodes code, u_int count, char **vals)
1735 {
1736 	u_int i;
1737 
1738 	printf("%s", lookup_opcode_name(code));
1739 	for (i = 0; i < count; i++)
1740 		printf(" %s",  vals[i]);
1741 	printf("\n");
1742 }
1743 
1744 void
1745 dump_config(ServerOptions *o)
1746 {
1747 	u_int i;
1748 	int ret;
1749 	struct addrinfo *ai;
1750 	char addr[NI_MAXHOST], port[NI_MAXSERV], *s = NULL;
1751 
1752 	/* these are usually at the top of the config */
1753 	for (i = 0; i < o->num_ports; i++)
1754 		printf("port %d\n", o->ports[i]);
1755 	dump_cfg_fmtint(sProtocol, o->protocol);
1756 	dump_cfg_fmtint(sAddressFamily, o->address_family);
1757 
1758 	/* ListenAddress must be after Port */
1759 	for (ai = o->listen_addrs; ai; ai = ai->ai_next) {
1760 		if ((ret = getnameinfo(ai->ai_addr, ai->ai_addrlen, addr,
1761 		    sizeof(addr), port, sizeof(port),
1762 		    NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
1763 			error("getnameinfo failed: %.100s",
1764 			    (ret != EAI_SYSTEM) ? gai_strerror(ret) :
1765 			    strerror(errno));
1766 		} else {
1767 			if (ai->ai_family == AF_INET6)
1768 				printf("listenaddress [%s]:%s\n", addr, port);
1769 			else
1770 				printf("listenaddress %s:%s\n", addr, port);
1771 		}
1772 	}
1773 
1774 	/* integer arguments */
1775 #ifdef USE_PAM
1776 	dump_cfg_int(sUsePAM, o->use_pam);
1777 #endif
1778 	dump_cfg_int(sServerKeyBits, o->server_key_bits);
1779 	dump_cfg_int(sLoginGraceTime, o->login_grace_time);
1780 	dump_cfg_int(sKeyRegenerationTime, o->key_regeneration_time);
1781 	dump_cfg_int(sX11DisplayOffset, o->x11_display_offset);
1782 	dump_cfg_int(sMaxAuthTries, o->max_authtries);
1783 	dump_cfg_int(sMaxSessions, o->max_sessions);
1784 	dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
1785 	dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
1786 
1787 	/* formatted integer arguments */
1788 	dump_cfg_fmtint(sPermitRootLogin, o->permit_root_login);
1789 	dump_cfg_fmtint(sIgnoreRhosts, o->ignore_rhosts);
1790 	dump_cfg_fmtint(sIgnoreUserKnownHosts, o->ignore_user_known_hosts);
1791 	dump_cfg_fmtint(sRhostsRSAAuthentication, o->rhosts_rsa_authentication);
1792 	dump_cfg_fmtint(sHostbasedAuthentication, o->hostbased_authentication);
1793 	dump_cfg_fmtint(sHostbasedUsesNameFromPacketOnly,
1794 	    o->hostbased_uses_name_from_packet_only);
1795 	dump_cfg_fmtint(sRSAAuthentication, o->rsa_authentication);
1796 	dump_cfg_fmtint(sPubkeyAuthentication, o->pubkey_authentication);
1797 #ifdef KRB5
1798 	dump_cfg_fmtint(sKerberosAuthentication, o->kerberos_authentication);
1799 	dump_cfg_fmtint(sKerberosOrLocalPasswd, o->kerberos_or_local_passwd);
1800 	dump_cfg_fmtint(sKerberosTicketCleanup, o->kerberos_ticket_cleanup);
1801 # ifdef USE_AFS
1802 	dump_cfg_fmtint(sKerberosGetAFSToken, o->kerberos_get_afs_token);
1803 # endif
1804 #endif
1805 #ifdef GSSAPI
1806 	dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
1807 	dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
1808 #endif
1809 #ifdef JPAKE
1810 	dump_cfg_fmtint(sZeroKnowledgePasswordAuthentication,
1811 	    o->zero_knowledge_password_authentication);
1812 #endif
1813 	dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
1814 	dump_cfg_fmtint(sKbdInteractiveAuthentication,
1815 	    o->kbd_interactive_authentication);
1816 	dump_cfg_fmtint(sChallengeResponseAuthentication,
1817 	    o->challenge_response_authentication);
1818 	dump_cfg_fmtint(sPrintMotd, o->print_motd);
1819 	dump_cfg_fmtint(sPrintLastLog, o->print_lastlog);
1820 	dump_cfg_fmtint(sX11Forwarding, o->x11_forwarding);
1821 	dump_cfg_fmtint(sX11UseLocalhost, o->x11_use_localhost);
1822 	dump_cfg_fmtint(sStrictModes, o->strict_modes);
1823 	dump_cfg_fmtint(sTCPKeepAlive, o->tcp_keep_alive);
1824 	dump_cfg_fmtint(sEmptyPasswd, o->permit_empty_passwd);
1825 	dump_cfg_fmtint(sPermitUserEnvironment, o->permit_user_env);
1826 	dump_cfg_fmtint(sUseLogin, o->use_login);
1827 	dump_cfg_fmtint(sCompression, o->compression);
1828 	dump_cfg_fmtint(sGatewayPorts, o->gateway_ports);
1829 	dump_cfg_fmtint(sUseDNS, o->use_dns);
1830 	dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding);
1831 	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep);
1832 
1833 	/* string arguments */
1834 	dump_cfg_string(sPidFile, o->pid_file);
1835 	dump_cfg_string(sXAuthLocation, o->xauth_location);
1836 	dump_cfg_string(sCiphers, o->ciphers);
1837 	dump_cfg_string(sMacs, o->macs);
1838 	dump_cfg_string(sBanner, o->banner);
1839 	dump_cfg_string(sForceCommand, o->adm_forced_command);
1840 	dump_cfg_string(sChrootDirectory, o->chroot_directory);
1841 	dump_cfg_string(sTrustedUserCAKeys, o->trusted_user_ca_keys);
1842 	dump_cfg_string(sRevokedKeys, o->revoked_keys_file);
1843 	dump_cfg_string(sAuthorizedPrincipalsFile,
1844 	    o->authorized_principals_file);
1845 
1846 	/* string arguments requiring a lookup */
1847 	dump_cfg_string(sLogLevel, log_level_name(o->log_level));
1848 	dump_cfg_string(sLogFacility, log_facility_name(o->log_facility));
1849 
1850 	/* string array arguments */
1851 	dump_cfg_strarray_oneline(sAuthorizedKeysFile, o->num_authkeys_files,
1852 	    o->authorized_keys_files);
1853 	dump_cfg_strarray(sHostKeyFile, o->num_host_key_files,
1854 	     o->host_key_files);
1855 	dump_cfg_strarray(sHostKeyFile, o->num_host_cert_files,
1856 	     o->host_cert_files);
1857 	dump_cfg_strarray(sAllowUsers, o->num_allow_users, o->allow_users);
1858 	dump_cfg_strarray(sDenyUsers, o->num_deny_users, o->deny_users);
1859 	dump_cfg_strarray(sAllowGroups, o->num_allow_groups, o->allow_groups);
1860 	dump_cfg_strarray(sDenyGroups, o->num_deny_groups, o->deny_groups);
1861 	dump_cfg_strarray(sAcceptEnv, o->num_accept_env, o->accept_env);
1862 
1863 	/* other arguments */
1864 	for (i = 0; i < o->num_subsystems; i++)
1865 		printf("subsystem %s %s\n", o->subsystem_name[i],
1866 		    o->subsystem_args[i]);
1867 
1868 	printf("maxstartups %d:%d:%d\n", o->max_startups_begin,
1869 	    o->max_startups_rate, o->max_startups);
1870 
1871 	for (i = 0; tunmode_desc[i].val != -1; i++)
1872 		if (tunmode_desc[i].val == o->permit_tun) {
1873 			s = tunmode_desc[i].text;
1874 			break;
1875 		}
1876 	dump_cfg_string(sPermitTunnel, s);
1877 
1878 	printf("ipqos %s ", iptos2str(o->ip_qos_interactive));
1879 	printf("%s\n", iptos2str(o->ip_qos_bulk));
1880 
1881 	channel_print_adm_permitted_opens();
1882 }
1883