OSDN Git Service

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