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