OSDN Git Service

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