1 /*
   2  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
   3  *                    All rights reserved
   4  *
   5  * As far as I am concerned, the code I have written for this software
   6  * can be used freely for any purpose.  Any derived versions of this
   7  * software must be clearly marked as such, and if the derived work is
   8  * incompatible with the protocol description in the RFC file, it must be
   9  * called by a name other than "ssh" or "Secure Shell".
  10  */
  11 /*
  12  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
  13  * Copyright 2012 Joyent, Inc.  All rights reserved.
  14  */
  15 
  16 #include "includes.h"
  17 RCSID("$OpenBSD: servconf.c,v 1.115 2002/09/04 18:52:42 stevesk Exp $");
  18 
  19 #ifdef HAVE_DEFOPEN
  20 #include <deflt.h>
  21 #endif /* HAVE_DEFOPEN */
  22 
  23 #if defined(KRB4)
  24 #include <krb.h>
  25 #endif
  26 #if defined(KRB5)
  27 #ifdef HEIMDAL
  28 #include <krb.h>
  29 #else
  30 /* Bodge - but then, so is using the kerberos IV KEYFILE to get a Kerberos V
  31  * keytab */
  32 #define KEYFILE "/etc/krb5.keytab"
  33 #endif
  34 #endif
  35 #ifdef AFS
  36 #include <kafs.h>
  37 #endif
  38 
  39 #include "ssh.h"
  40 #include "log.h"
  41 #include "buffer.h"
  42 #include "servconf.h"
  43 #include "xmalloc.h"
  44 #include "compat.h"
  45 #include "pathnames.h"
  46 #include "tildexpand.h"
  47 #include "misc.h"
  48 #include "cipher.h"
  49 #include "kex.h"
  50 #include "mac.h"
  51 #include "auth.h"
  52 #include "match.h"
  53 #include "groupaccess.h"
  54 
  55 static void add_listen_addr(ServerOptions *, char *, u_short);
  56 static void add_one_listen_addr(ServerOptions *, char *, u_short);
  57 
  58 extern Buffer cfg;
  59 
  60 /* AF_UNSPEC or AF_INET or AF_INET6 */
  61 extern int IPv4or6;
  62 
  63 /*
  64  * Initializes the server options to their initial (unset) values. Some of those
  65  * that stay unset after the command line options and configuration files are
  66  * read are set to their default values in fill_default_server_options().
  67  */
  68 void
  69 initialize_server_options(ServerOptions *options)
  70 {
  71         (void) memset(options, 0, sizeof(*options));
  72 
  73         /* Standard Options */
  74         options->num_ports = 0;
  75         options->ports_from_cmdline = 0;
  76         options->listen_addrs = NULL;
  77         options->num_host_key_files = 0;
  78         options->pid_file = NULL;
  79         options->server_key_bits = -1;
  80         options->login_grace_time = -1;
  81         options->key_regeneration_time = -1;
  82         options->permit_root_login = PERMIT_NOT_SET;
  83         options->ignore_rhosts = -1;
  84         options->ignore_user_known_hosts = -1;
  85         options->print_motd = -1;
  86         options->print_lastlog = -1;
  87         options->x11_forwarding = -1;
  88         options->x11_display_offset = -1;
  89         options->x11_use_localhost = -1;
  90         options->xauth_location = NULL;
  91         options->strict_modes = -1;
  92         options->keepalives = -1;
  93         options->log_facility = SYSLOG_FACILITY_NOT_SET;
  94         options->log_level = SYSLOG_LEVEL_NOT_SET;
  95         options->rhosts_authentication = -1;
  96         options->rhosts_rsa_authentication = -1;
  97         options->hostbased_authentication = -1;
  98         options->hostbased_uses_name_from_packet_only = -1;
  99         options->rsa_authentication = -1;
 100         options->pubkey_authentication = -1;
 101 #ifdef GSSAPI
 102         options->gss_authentication = -1;
 103         options->gss_keyex = -1;
 104         options->gss_store_creds = -1;
 105         options->gss_use_session_ccache = -1;
 106         options->gss_cleanup_creds = -1;
 107 #endif
 108 #if defined(KRB4) || defined(KRB5)
 109         options->kerberos_authentication = -1;
 110         options->kerberos_or_local_passwd = -1;
 111         options->kerberos_ticket_cleanup = -1;
 112 #endif
 113 #if defined(AFS) || defined(KRB5)
 114         options->kerberos_tgt_passing = -1;
 115 #endif
 116 #ifdef AFS
 117         options->afs_token_passing = -1;
 118 #endif
 119         options->password_authentication = -1;
 120         options->kbd_interactive_authentication = -1;
 121         options->challenge_response_authentication = -1;
 122         options->pam_authentication_via_kbd_int = -1;
 123         options->permit_empty_passwd = -1;
 124         options->permit_user_env = -1;
 125         options->compression = -1;
 126         options->allow_tcp_forwarding = -1;
 127         options->num_allow_users = 0;
 128         options->num_deny_users = 0;
 129         options->num_allow_groups = 0;
 130         options->num_deny_groups = 0;
 131         options->ciphers = NULL;
 132         options->macs = NULL;
 133         options->protocol = SSH_PROTO_UNKNOWN;
 134         options->gateway_ports = -1;
 135         options->num_subsystems = 0;
 136         options->max_startups_begin = -1;
 137         options->max_startups_rate = -1;
 138         options->max_startups = -1;
 139         options->banner = NULL;
 140         options->verify_reverse_mapping = -1;
 141         options->client_alive_interval = -1;
 142         options->client_alive_count_max = -1;
 143         options->authorized_keys_file = NULL;
 144         options->authorized_keys_file2 = NULL;
 145 
 146         options->max_auth_tries = -1;
 147         options->max_auth_tries_log = -1;
 148 
 149         options->max_init_auth_tries = -1;
 150         options->max_init_auth_tries_log = -1;
 151 
 152         options->lookup_client_hostnames = -1;
 153         options->use_openssl_engine = -1;
 154         options->chroot_directory = NULL;
 155         options->pre_userauth_hook = NULL;
 156         options->pam_service_name = NULL;
 157         options->pam_service_prefix = NULL;
 158         options->pubkey_plugin = NULL;
 159 }
 160 
 161 #ifdef HAVE_DEFOPEN
 162 /*
 163  * Reads /etc/default/login and defaults several ServerOptions:
 164  *
 165  * PermitRootLogin
 166  * PermitEmptyPasswords
 167  * LoginGraceTime
 168  *
 169  * CONSOLE=*      -> PermitRootLogin=without-password
 170  * #CONSOLE=*     -> PermitRootLogin=yes
 171  *
 172  * PASSREQ=YES    -> PermitEmptyPasswords=no
 173  * PASSREQ=NO     -> PermitEmptyPasswords=yes
 174  * #PASSREQ=*     -> PermitEmptyPasswords=no
 175  *
 176  * TIMEOUT=<secs> -> LoginGraceTime=<secs>
 177  * #TIMEOUT=<secs> -> LoginGraceTime=300
 178  */
 179 static
 180 void
 181 deflt_fill_default_server_options(ServerOptions *options)
 182 {
 183         int     flags;
 184         char    *ptr;
 185 
 186         if (defopen(_PATH_DEFAULT_LOGIN))
 187                 return;
 188 
 189         /* Ignore case */
 190         flags = defcntl(DC_GETFLAGS, 0);
 191         TURNOFF(flags, DC_CASE);
 192         (void) defcntl(DC_SETFLAGS, flags);
 193 
 194         if (options->permit_root_login == PERMIT_NOT_SET &&
 195             (ptr = defread("CONSOLE=")) != NULL)
 196                 options->permit_root_login = PERMIT_NO_PASSWD;
 197 
 198         if (options->permit_empty_passwd == -1 &&
 199             (ptr = defread("PASSREQ=")) != NULL) {
 200                 if (strcasecmp("YES", ptr) == 0)
 201                         options->permit_empty_passwd = 0;
 202                 else if (strcasecmp("NO", ptr) == 0)
 203                         options->permit_empty_passwd = 1;
 204         }
 205 
 206         if (options->max_init_auth_tries == -1 &&
 207             (ptr = defread("RETRIES=")) != NULL) {
 208                 options->max_init_auth_tries = atoi(ptr);
 209         }
 210 
 211         if (options->max_init_auth_tries_log == -1 &&
 212             (ptr = defread("SYSLOG_FAILED_LOGINS=")) != NULL) {
 213                 options->max_init_auth_tries_log = atoi(ptr);
 214         }
 215 
 216         if (options->login_grace_time == -1) {
 217                 if ((ptr = defread("TIMEOUT=")) != NULL)
 218                         options->login_grace_time = (unsigned)atoi(ptr);
 219                 else
 220                         options->login_grace_time = 300;
 221         }
 222 
 223         (void) defopen((char *)NULL);
 224 }
 225 #endif /* HAVE_DEFOPEN */
 226 
 227 void
 228 fill_default_server_options(ServerOptions *options)
 229 {
 230 
 231 #ifdef HAVE_DEFOPEN
 232         deflt_fill_default_server_options(options);
 233 #endif /* HAVE_DEFOPEN */
 234 
 235         /* Standard Options */
 236         if (options->protocol == SSH_PROTO_UNKNOWN)
 237                 options->protocol = SSH_PROTO_1|SSH_PROTO_2;
 238         if (options->num_host_key_files == 0) {
 239                 /* fill default hostkeys for protocols */
 240                 if (options->protocol & SSH_PROTO_1)
 241                         options->host_key_files[options->num_host_key_files++] =
 242                             _PATH_HOST_KEY_FILE;
 243 #ifndef GSSAPI
 244                 /* With GSS keyex we can run v2 w/ no host keys */
 245                 if (options->protocol & SSH_PROTO_2) {
 246                         options->host_key_files[options->num_host_key_files++] =
 247                             _PATH_HOST_RSA_KEY_FILE;
 248                         options->host_key_files[options->num_host_key_files++] =
 249                             _PATH_HOST_DSA_KEY_FILE;
 250                 }
 251 #endif /* GSSAPI */
 252         }
 253         if (options->num_ports == 0)
 254                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
 255         if (options->listen_addrs == NULL)
 256                 add_listen_addr(options, NULL, 0);
 257         if (options->pid_file == NULL)
 258                 options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
 259         if (options->server_key_bits == -1)
 260                 options->server_key_bits = 768;
 261         if (options->login_grace_time == -1)
 262                 options->login_grace_time = 120;
 263         if (options->key_regeneration_time == -1)
 264                 options->key_regeneration_time = 3600;
 265         if (options->permit_root_login == PERMIT_NOT_SET)
 266                 options->permit_root_login = PERMIT_YES;
 267         if (options->ignore_rhosts == -1)
 268                 options->ignore_rhosts = 1;
 269         if (options->ignore_user_known_hosts == -1)
 270                 options->ignore_user_known_hosts = 0;
 271         if (options->print_motd == -1)
 272                 options->print_motd = 1;
 273         if (options->print_lastlog == -1)
 274                 options->print_lastlog = 1;
 275         if (options->x11_forwarding == -1)
 276                 options->x11_forwarding = 1;
 277         if (options->x11_display_offset == -1)
 278                 options->x11_display_offset = 10;
 279         if (options->x11_use_localhost == -1)
 280                 options->x11_use_localhost = 1;
 281         if (options->xauth_location == NULL)
 282                 options->xauth_location = _PATH_XAUTH;
 283         if (options->strict_modes == -1)
 284                 options->strict_modes = 1;
 285         if (options->keepalives == -1)
 286                 options->keepalives = 1;
 287         if (options->log_facility == SYSLOG_FACILITY_NOT_SET)
 288                 options->log_facility = SYSLOG_FACILITY_AUTH;
 289         if (options->log_level == SYSLOG_LEVEL_NOT_SET)
 290                 options->log_level = SYSLOG_LEVEL_INFO;
 291         if (options->rhosts_authentication == -1)
 292                 options->rhosts_authentication = 0;
 293         if (options->rhosts_rsa_authentication == -1)
 294                 options->rhosts_rsa_authentication = 0;
 295         if (options->hostbased_authentication == -1)
 296                 options->hostbased_authentication = 0;
 297         if (options->hostbased_uses_name_from_packet_only == -1)
 298                 options->hostbased_uses_name_from_packet_only = 0;
 299         if (options->rsa_authentication == -1)
 300                 options->rsa_authentication = 1;
 301         if (options->pubkey_authentication == -1)
 302                 options->pubkey_authentication = 1;
 303 #ifdef GSSAPI
 304         if (options->gss_authentication == -1)
 305                 options->gss_authentication = 1;
 306         if (options->gss_keyex == -1)
 307                 options->gss_keyex = 1;
 308         if (options->gss_store_creds == -1)
 309                 options->gss_store_creds = 1;
 310         if (options->gss_use_session_ccache == -1)
 311                 options->gss_use_session_ccache = 1;
 312         if (options->gss_cleanup_creds == -1)
 313                 options->gss_cleanup_creds = 1;
 314 #endif
 315 #if defined(KRB4) || defined(KRB5)
 316         if (options->kerberos_authentication == -1)
 317                 options->kerberos_authentication = 0;
 318         if (options->kerberos_or_local_passwd == -1)
 319                 options->kerberos_or_local_passwd = 1;
 320         if (options->kerberos_ticket_cleanup == -1)
 321                 options->kerberos_ticket_cleanup = 1;
 322 #endif
 323 #if defined(AFS) || defined(KRB5)
 324         if (options->kerberos_tgt_passing == -1)
 325                 options->kerberos_tgt_passing = 0;
 326 #endif
 327 #ifdef AFS
 328         if (options->afs_token_passing == -1)
 329                 options->afs_token_passing = 0;
 330 #endif
 331         if (options->password_authentication == -1)
 332                 options->password_authentication = 1;
 333         /*
 334          * options->pam_authentication_via_kbd_int has intentionally no default
 335          * value since we do not need it.
 336          */
 337         if (options->kbd_interactive_authentication == -1)
 338                 options->kbd_interactive_authentication = 1;
 339         if (options->challenge_response_authentication == -1)
 340                 options->challenge_response_authentication = 1;
 341         if (options->permit_empty_passwd == -1)
 342                 options->permit_empty_passwd = 0;
 343         if (options->permit_user_env == -1)
 344                 options->permit_user_env = 0;
 345         if (options->compression == -1)
 346                 options->compression = 1;
 347         if (options->allow_tcp_forwarding == -1)
 348                 options->allow_tcp_forwarding = 1;
 349         if (options->gateway_ports == -1)
 350                 options->gateway_ports = 0;
 351         if (options->max_startups == -1)
 352                 options->max_startups = 10;
 353         if (options->max_startups_rate == -1)
 354                 options->max_startups_rate = 100;            /* 100% */
 355         if (options->max_startups_begin == -1)
 356                 options->max_startups_begin = options->max_startups;
 357         if (options->verify_reverse_mapping == -1)
 358                 options->verify_reverse_mapping = 0;
 359         if (options->client_alive_interval == -1)
 360                 options->client_alive_interval = 0;
 361         if (options->client_alive_count_max == -1)
 362                 options->client_alive_count_max = 3;
 363         if (options->authorized_keys_file2 == NULL) {
 364                 /* authorized_keys_file2 falls back to authorized_keys_file */
 365                 if (options->authorized_keys_file != NULL)
 366                         options->authorized_keys_file2 = options->authorized_keys_file;
 367                 else
 368                         options->authorized_keys_file2 = _PATH_SSH_USER_PERMITTED_KEYS2;
 369         }
 370         if (options->authorized_keys_file == NULL)
 371                 options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;
 372 
 373         if (options->max_auth_tries == -1)
 374                 options->max_auth_tries = AUTH_FAIL_MAX;
 375         if (options->max_auth_tries_log == -1)
 376                 options->max_auth_tries_log = options->max_auth_tries / 2;
 377 
 378         if (options->max_init_auth_tries == -1)
 379                 options->max_init_auth_tries = AUTH_FAIL_MAX;
 380         if (options->max_init_auth_tries_log == -1)
 381                 options->max_init_auth_tries_log = options->max_init_auth_tries / 2;
 382 
 383         if (options->lookup_client_hostnames == -1)
 384                 options->lookup_client_hostnames = 1;
 385         if (options->use_openssl_engine == -1)
 386                 options->use_openssl_engine = 1;
 387         if (options->pam_service_prefix == NULL)
 388                 options->pam_service_prefix = _SSH_PAM_SERVICE_PREFIX;
 389         if (options->pam_service_name == NULL)
 390                 options->pam_service_name = NULL;
 391 }
 392 
 393 /* Keyword tokens. */
 394 typedef enum {
 395         sBadOption,             /* == unknown option */
 396         /* Portable-specific options */
 397         sPAMAuthenticationViaKbdInt,
 398         /* Standard Options */
 399         sPort, sHostKeyFile, sServerKeyBits, sLoginGraceTime, sKeyRegenerationTime,
 400         sPermitRootLogin, sLogFacility, sLogLevel,
 401         sRhostsAuthentication, sRhostsRSAAuthentication, sRSAAuthentication,
 402 #ifdef GSSAPI
 403         sGssAuthentication, sGssKeyEx, sGssStoreDelegCreds,
 404         sGssUseSessionCredCache, sGssCleanupCreds,
 405 #endif /* GSSAPI */
 406 #if defined(KRB4) || defined(KRB5)
 407         sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup,
 408 #endif
 409 #if defined(AFS) || defined(KRB5)
 410         sKerberosTgtPassing,
 411 #endif
 412 #ifdef AFS
 413         sAFSTokenPassing,
 414 #endif
 415         sChallengeResponseAuthentication,
 416         sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,
 417         sPrintMotd, sPrintLastLog, sIgnoreRhosts,
 418         sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,
 419         sStrictModes, sEmptyPasswd, sKeepAlives,
 420         sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,
 421         sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
 422         sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
 423         sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, 
 424         sBanner, sVerifyReverseMapping, sHostbasedAuthentication,
 425         sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
 426         sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,
 427         sMaxAuthTries, sMaxAuthTriesLog, sUsePrivilegeSeparation,
 428         sLookupClientHostnames, sUseOpenSSLEngine, sChrootDirectory,
 429         sPreUserauthHook, sMatch, sPAMServicePrefix, sPAMServiceName,
 430         sMaxStartups, sPubKeyPlugin,
 431         sDeprecated
 432 } ServerOpCodes;
 433 
 434 #define SSHCFG_GLOBAL   0x01    /* allowed in main section of sshd_config */
 435 #define SSHCFG_MATCH    0x02    /* allowed inside a Match section */
 436 #define SSHCFG_ALL      (SSHCFG_GLOBAL|SSHCFG_MATCH)
 437 
 438 /* Textual representation of the tokens. */
 439 static struct {
 440         const char *name;
 441         ServerOpCodes opcode;
 442         u_int flags;
 443 } keywords[] = {
 444         /* Portable-specific options */
 445         { "PAMAuthenticationViaKbdInt", sPAMAuthenticationViaKbdInt, SSHCFG_GLOBAL },
 446         /* Standard Options */
 447         { "port", sPort, SSHCFG_GLOBAL },
 448         { "hostkey", sHostKeyFile, SSHCFG_GLOBAL },
 449         { "hostdsakey", sHostKeyFile, SSHCFG_GLOBAL },                  /* alias */
 450         { "pidfile", sPidFile, SSHCFG_GLOBAL },
 451         { "serverkeybits", sServerKeyBits, SSHCFG_GLOBAL },
 452         { "logingracetime", sLoginGraceTime, SSHCFG_GLOBAL },
 453         { "keyregenerationinterval", sKeyRegenerationTime, SSHCFG_GLOBAL },
 454         { "permitrootlogin", sPermitRootLogin, SSHCFG_ALL },
 455         { "syslogfacility", sLogFacility, SSHCFG_GLOBAL },
 456         { "loglevel", sLogLevel, SSHCFG_GLOBAL },
 457         { "rhostsauthentication", sRhostsAuthentication, SSHCFG_GLOBAL },
 458         { "rhostsrsaauthentication", sRhostsRSAAuthentication, SSHCFG_ALL },
 459         { "hostbasedauthentication", sHostbasedAuthentication, SSHCFG_ALL },
 460         { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly },
 461         { "rsaauthentication", sRSAAuthentication, SSHCFG_ALL },
 462         { "pubkeyauthentication", sPubkeyAuthentication, SSHCFG_ALL },
 463         { "dsaauthentication", sPubkeyAuthentication, SSHCFG_GLOBAL },  /* alias */
 464 #ifdef GSSAPI
 465         { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
 466         { "gssapikeyexchange", sGssKeyEx,   SSHCFG_GLOBAL },
 467         { "gssapistoredelegatedcredentials", sGssStoreDelegCreds, SSHCFG_GLOBAL },
 468         { "gssauthentication", sGssAuthentication, SSHCFG_GLOBAL },     /* alias */
 469         { "gsskeyex", sGssKeyEx, SSHCFG_GLOBAL },       /* alias */
 470         { "gssstoredelegcreds", sGssStoreDelegCreds, SSHCFG_GLOBAL },   /* alias */
 471 #ifndef SUNW_GSSAPI
 472         { "gssusesessionccache", sGssUseSessionCredCache, SSHCFG_GLOBAL },
 473         { "gssusesessioncredcache", sGssUseSessionCredCache, SSHCFG_GLOBAL },
 474         { "gsscleanupcreds", sGssCleanupCreds, SSHCFG_GLOBAL },
 475 #endif /* SUNW_GSSAPI */
 476 #endif
 477 #if defined(KRB4) || defined(KRB5)
 478         { "kerberosauthentication", sKerberosAuthentication, SSHCFG_ALL },
 479         { "kerberosorlocalpasswd", sKerberosOrLocalPasswd, SSHCFG_GLOBAL },
 480         { "kerberosticketcleanup", sKerberosTicketCleanup, SSHCFG_GLOBAL },
 481 #endif
 482 #if defined(AFS) || defined(KRB5)
 483         { "kerberostgtpassing", sKerberosTgtPassing, SSHCFG_GLOBAL },
 484 #endif
 485 #ifdef AFS
 486         { "afstokenpassing", sAFSTokenPassing, SSHCFG_GLOBAL },
 487 #endif
 488         { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
 489         { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
 490         { "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
 491         { "skeyauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, /* alias */
 492         { "checkmail", sDeprecated, SSHCFG_GLOBAL },
 493         { "listenaddress", sListenAddress, SSHCFG_GLOBAL },
 494         { "printmotd", sPrintMotd, SSHCFG_GLOBAL },
 495         { "printlastlog", sPrintLastLog, SSHCFG_GLOBAL },
 496         { "ignorerhosts", sIgnoreRhosts, SSHCFG_GLOBAL },
 497         { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL },
 498         { "x11forwarding", sX11Forwarding, SSHCFG_ALL },
 499         { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL },
 500         { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL },
 501         { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL },
 502         { "strictmodes", sStrictModes, SSHCFG_GLOBAL },
 503         { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL },
 504         { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL },
 505         { "uselogin", sUseLogin, SSHCFG_GLOBAL },
 506         { "compression", sCompression, SSHCFG_GLOBAL },
 507         { "tcpkeepalive", sKeepAlives, SSHCFG_GLOBAL },
 508         { "keepalive", sKeepAlives, SSHCFG_GLOBAL },            /* obsolete */
 509         { "allowtcpforwarding", sAllowTcpForwarding, SSHCFG_ALL },
 510         { "allowusers", sAllowUsers, SSHCFG_GLOBAL },
 511         { "denyusers", sDenyUsers, SSHCFG_GLOBAL },
 512         { "allowgroups", sAllowGroups, SSHCFG_GLOBAL },
 513         { "denygroups", sDenyGroups, SSHCFG_GLOBAL },
 514         { "ciphers", sCiphers, SSHCFG_GLOBAL },
 515         { "macs", sMacs, SSHCFG_GLOBAL},
 516         { "protocol", sProtocol,SSHCFG_GLOBAL },
 517         { "gatewayports", sGatewayPorts, SSHCFG_ALL },
 518         { "subsystem", sSubsystem, SSHCFG_GLOBAL},
 519         { "maxstartups", sMaxStartups, SSHCFG_GLOBAL },
 520         { "banner", sBanner, SSHCFG_ALL },
 521         { "verifyreversemapping", sVerifyReverseMapping, SSHCFG_GLOBAL },
 522         { "reversemappingcheck", sVerifyReverseMapping,SSHCFG_GLOBAL },
 523         { "clientaliveinterval", sClientAliveInterval, SSHCFG_GLOBAL },
 524         { "clientalivecountmax", sClientAliveCountMax, SSHCFG_GLOBAL },
 525         { "authorizedkeysfile", sAuthorizedKeysFile, SSHCFG_GLOBAL },
 526         { "authorizedkeysfile2", sAuthorizedKeysFile2, SSHCFG_GLOBAL },
 527         { "maxauthtries", sMaxAuthTries, SSHCFG_ALL },
 528         { "maxauthtrieslog", sMaxAuthTriesLog, SSHCFG_GLOBAL },
 529         { "useprivilegeseparation", sUsePrivilegeSeparation, SSHCFG_GLOBAL },
 530         { "lookupclienthostnames", sLookupClientHostnames, SSHCFG_GLOBAL },
 531         { "useopensslengine", sUseOpenSSLEngine, SSHCFG_GLOBAL },
 532         { "chrootdirectory", sChrootDirectory, SSHCFG_ALL },
 533         { "preuserauthhook", sPreUserauthHook, SSHCFG_ALL},
 534         { "match", sMatch, SSHCFG_ALL },
 535         { "pamserviceprefix", sPAMServicePrefix, SSHCFG_GLOBAL },
 536         { "pamservicename", sPAMServiceName, SSHCFG_GLOBAL },
 537         { "pubkeyplugin", sPubKeyPlugin, SSHCFG_ALL },
 538 
 539         { NULL, sBadOption, 0 }
 540 };
 541 
 542 /*
 543  * Returns the number of the token pointed to by cp or sBadOption.
 544  */
 545 
 546 static ServerOpCodes
 547 parse_token(const char *cp, const char *filename,
 548             int linenum, u_int *flags)
 549 {
 550         u_int i;
 551 
 552         for (i = 0; keywords[i].name; i++)
 553                 if (strcasecmp(cp, keywords[i].name) == 0) {
 554                         *flags = keywords[i].flags;
 555                         return keywords[i].opcode;
 556                 }
 557 
 558         error("%s: line %d: Bad configuration option: %s",
 559             filename, linenum, cp);
 560         return sBadOption;
 561 }
 562 
 563 static void
 564 add_listen_addr(ServerOptions *options, char *addr, u_short port)
 565 {
 566         int i;
 567 
 568         if (options->num_ports == 0)
 569                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
 570         if (port == 0)
 571                 for (i = 0; i < options->num_ports; i++)
 572                         add_one_listen_addr(options, addr, options->ports[i]);
 573         else
 574                 add_one_listen_addr(options, addr, port);
 575 }
 576 
 577 static void
 578 add_one_listen_addr(ServerOptions *options, char *addr, u_short port)
 579 {
 580         struct addrinfo hints, *ai, *aitop;
 581         char strport[NI_MAXSERV];
 582         int gaierr;
 583 
 584         (void) memset(&hints, 0, sizeof(hints));
 585         hints.ai_family = IPv4or6;
 586         hints.ai_socktype = SOCK_STREAM;
 587         hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
 588         (void) snprintf(strport, sizeof strport, "%u", port);
 589         if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
 590                 fatal("bad addr or host: %s (%s)",
 591                     addr ? addr : "<NULL>",
 592                     gai_strerror(gaierr));
 593         for (ai = aitop; ai->ai_next; ai = ai->ai_next)
 594                 ;
 595         ai->ai_next = options->listen_addrs;
 596         options->listen_addrs = aitop;
 597 }
 598 
 599 /*
 600  * The strategy for the Match blocks is that the config file is parsed twice.
 601  *
 602  * The first time is at startup.  activep is initialized to 1 and the
 603  * directives in the global context are processed and acted on.  Hitting a
 604  * Match directive unsets activep and the directives inside the block are
 605  * checked for syntax only.
 606  *
 607  * The second time is after a connection has been established but before
 608  * authentication.  activep is initialized to 2 and global config directives
 609  * are ignored since they have already been processed.  If the criteria in a
 610  * Match block is met, activep is set and the subsequent directives
 611  * processed and actioned until EOF or another Match block unsets it.  Any
 612  * options set are copied into the main server config.
 613  *
 614  * Potential additions/improvements:
 615  *  - Add Match support for pre-kex directives, eg Protocol, Ciphers.
 616  *
 617  *  - Add a Tag directive (idea from David Leonard) ala pf, eg:
 618  *      Match Address 192.168.0.*
 619  *              Tag trusted
 620  *      Match Group wheel
 621  *              Tag trusted
 622  *      Match Tag trusted
 623  *              AllowTcpForwarding yes
 624  *              GatewayPorts clientspecified
 625  *              [...]
 626  *
 627  *  - Add a PermittedChannelRequests directive
 628  *      Match Group shell
 629  *              PermittedChannelRequests session,forwarded-tcpip
 630  */
 631 
 632 static int
 633 match_cfg_line_group(const char *grps, int line, const char *user)
 634 {
 635         int result = 0;
 636         struct passwd *pw;
 637 
 638         if (user == NULL)
 639                 goto out;
 640 
 641         if ((pw = getpwnam(user)) == NULL) {
 642                 debug("Can't match group at line %d because user %.100s does "
 643                     "not exist", line, user);
 644         } else if (ga_init(pw->pw_name, pw->pw_gid) == 0) {
 645                 debug("Can't Match group because user %.100s not in any group "
 646                     "at line %d", user, line);
 647         } else if (ga_match_pattern_list(grps) != 1) {
 648                 debug("user %.100s does not match group list %.100s at line %d",
 649                     user, grps, line);
 650         } else {
 651                 debug("user %.100s matched group list %.100s at line %d", user,
 652                     grps, line);
 653                 result = 1;
 654         }
 655 out:
 656         ga_free();
 657         return result;
 658 }
 659 
 660 static int
 661 match_cfg_line(char **condition, int line, const char *user, const char *host,
 662     const char *address)
 663 {
 664         int result = 1;
 665         char *arg, *attrib, *cp = *condition;
 666         size_t len;
 667 
 668         if (user == NULL)
 669                 debug3("checking syntax for 'Match %s'", cp);
 670         else
 671                 debug3("checking match for '%s' user %s host %s addr %s", cp,
 672                     user ? user : "(null)", host ? host : "(null)",
 673                     address ? address : "(null)");
 674 
 675         while ((attrib = strdelim(&cp)) != NULL && *attrib != '\0') {
 676                 if ((arg = strdelim(&cp)) == NULL || *arg == '\0') {
 677                         error("Missing Match criteria for %s", attrib);
 678                         return -1;
 679                 }
 680                 len = strlen(arg);
 681                 if (strcasecmp(attrib, "user") == 0) {
 682                         if (!user) {
 683                                 result = 0;
 684                                 continue;
 685                         }
 686                         if (match_pattern_list(user, arg, len, 0) != 1)
 687                                 result = 0;
 688                         else
 689                                 debug("user %.100s matched 'User %.100s' at "
 690                                     "line %d", user, arg, line);
 691                 } else if (strcasecmp(attrib, "group") == 0) {
 692                         switch (match_cfg_line_group(arg, line, user)) {
 693                         case -1:
 694                                 return -1;
 695                         case 0:
 696                                 result = 0;
 697                         }
 698                 } else if (strcasecmp(attrib, "host") == 0) {
 699                         if (!host) {
 700                                 result = 0;
 701                                 continue;
 702                         }
 703                         if (match_hostname(host, arg, len) != 1)
 704                                 result = 0;
 705                         else
 706                                 debug("connection from %.100s matched 'Host "
 707                                     "%.100s' at line %d", host, arg, line);
 708                 } else if (strcasecmp(attrib, "address") == 0) {
 709                         switch (addr_match_list(address, arg)) {
 710                         case 1:
 711                                 debug("connection from %.100s matched 'Address "
 712                                     "%.100s' at line %d", address, arg, line);
 713                                 break;
 714                         case 0:
 715                         case -1:
 716                                 result = 0;
 717                                 break;
 718                         case -2:
 719                                 return -1;
 720                         }
 721                 } else {
 722                         error("Unsupported Match attribute %s", attrib);
 723                         return -1;
 724                 }
 725         }
 726         if (user != NULL)
 727                 debug3("match %sfound", result ? "" : "not ");
 728         *condition = cp;
 729         return result;
 730 }
 731 
 732 #define WHITESPACE " \t\r\n"
 733 
 734 int
 735 process_server_config_line(ServerOptions *options, char *line,
 736     const char *filename, int linenum, int *activep, const char *user,
 737     const char *host, const char *address)
 738 {
 739         char *cp, **charptr, *arg, *p;
 740         int cmdline = 0, *intptr, value, n;
 741         ServerOpCodes opcode;
 742         u_int i, flags = 0;
 743         size_t len;
 744 
 745         cp = line;
 746         arg = strdelim(&cp);
 747         /* Ignore leading whitespace */
 748         if (*arg == '\0')
 749                 arg = strdelim(&cp);
 750         if (!arg || !*arg || *arg == '#')
 751                 return 0;
 752         intptr = NULL;
 753         charptr = NULL;
 754         opcode = parse_token(arg, filename, linenum, &flags);
 755 
 756         if (activep == NULL) { /* We are processing a command line directive */
 757                 cmdline = 1;
 758                 activep = &cmdline;
 759         }
 760         if (*activep && opcode != sMatch)
 761                 debug3("%s:%d setting %s %s", filename, linenum, arg, cp);
 762         if (*activep == 0 && !(flags & SSHCFG_MATCH)) {
 763                 if (user == NULL) {
 764                         fatal("%s line %d: Directive '%s' is not allowed "
 765                             "within a Match block", filename, linenum, arg);
 766                 } else { /* this is a directive we have already processed */
 767                         while (arg)
 768                                 arg = strdelim(&cp);
 769                         return 0;
 770                 }
 771         }
 772 
 773         switch (opcode) {
 774         /* Portable-specific options */
 775         case sPAMAuthenticationViaKbdInt:
 776                 log("%s line %d: PAMAuthenticationViaKbdInt has been "
 777                     "deprecated. You should use KbdInteractiveAuthentication "
 778                     "instead (which defaults to \"yes\").", filename, linenum);
 779                 intptr = &options->pam_authentication_via_kbd_int;
 780                 goto parse_flag;
 781 
 782         /* Standard Options */
 783         case sBadOption:
 784                 return -1;
 785         case sPort:
 786                 /* ignore ports from configfile if cmdline specifies ports */
 787                 if (options->ports_from_cmdline)
 788                         return 0;
 789                 if (options->listen_addrs != NULL)
 790                         fatal("%s line %d: ports must be specified before "
 791                             "ListenAddress.", filename, linenum);
 792                 if (options->num_ports >= MAX_PORTS)
 793                         fatal("%s line %d: too many ports.",
 794                             filename, linenum);
 795                 arg = strdelim(&cp);
 796                 if (!arg || *arg == '\0')
 797                         fatal("%s line %d: missing port number.",
 798                             filename, linenum);
 799                 options->ports[options->num_ports++] = a2port(arg);
 800                 if (options->ports[options->num_ports-1] == 0)
 801                         fatal("%s line %d: Badly formatted port number.",
 802                             filename, linenum);
 803                 break;
 804 
 805         case sServerKeyBits:
 806                 intptr = &options->server_key_bits;
 807 parse_int:
 808                 arg = strdelim(&cp);
 809                 if (!arg || *arg == '\0')
 810                         fatal("%s line %d: missing integer value.",
 811                             filename, linenum);
 812                 value = atoi(arg);
 813                 if (*activep && *intptr == -1)
 814                         *intptr = value;
 815                 break;
 816 
 817         case sLoginGraceTime:
 818                 intptr = &options->login_grace_time;
 819 parse_time:
 820                 arg = strdelim(&cp);
 821                 if (!arg || *arg == '\0')
 822                         fatal("%s line %d: missing time value.",
 823                             filename, linenum);
 824                 if ((value = convtime(arg)) == -1)
 825                         fatal("%s line %d: invalid time value.",
 826                             filename, linenum);
 827                 if (*intptr == -1)
 828                         *intptr = value;
 829                 break;
 830 
 831         case sKeyRegenerationTime:
 832                 intptr = &options->key_regeneration_time;
 833                 goto parse_time;
 834 
 835         case sListenAddress:
 836                 arg = strdelim(&cp);
 837                 if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0)
 838                         fatal("%s line %d: missing inet addr.",
 839                             filename, linenum);
 840                 if (*arg == '[') {
 841                         if ((p = strchr(arg, ']')) == NULL)
 842                                 fatal("%s line %d: bad ipv6 inet addr usage.",
 843                                     filename, linenum);
 844                         arg++;
 845                         (void) memmove(p, p+1, strlen(p+1)+1);
 846                 } else if (((p = strchr(arg, ':')) == NULL) ||
 847                             (strchr(p+1, ':') != NULL)) {
 848                         add_listen_addr(options, arg, 0);
 849                         break;
 850                 }
 851                 if (*p == ':') {
 852                         u_short port;
 853 
 854                         p++;
 855                         if (*p == '\0')
 856                                 fatal("%s line %d: bad inet addr:port usage.",
 857                                     filename, linenum);
 858                         else {
 859                                 *(p-1) = '\0';
 860                                 if ((port = a2port(p)) == 0)
 861                                         fatal("%s line %d: bad port number.",
 862                                             filename, linenum);
 863                                 add_listen_addr(options, arg, port);
 864                         }
 865                 } else if (*p == '\0')
 866                         add_listen_addr(options, arg, 0);
 867                 else
 868                         fatal("%s line %d: bad inet addr usage.",
 869                             filename, linenum);
 870                 break;
 871 
 872         case sHostKeyFile:
 873                 intptr = &options->num_host_key_files;
 874                 if (*intptr >= MAX_HOSTKEYS)
 875                         fatal("%s line %d: too many host keys specified (max %d).",
 876                             filename, linenum, MAX_HOSTKEYS);
 877                 charptr = &options->host_key_files[*intptr];
 878 parse_filename:
 879                 arg = strdelim(&cp);
 880                 if (!arg || *arg == '\0')
 881                         fatal("%s line %d: missing file name.",
 882                             filename, linenum);
 883                 if (*activep && *charptr == NULL) {
 884                         *charptr = tilde_expand_filename(arg, getuid());
 885                         /* increase optional counter */
 886                         if (intptr != NULL)
 887                                 *intptr = *intptr + 1;
 888                 }
 889                 break;
 890 
 891         case sPidFile:
 892                 charptr = &options->pid_file;
 893                 goto parse_filename;
 894 
 895         case sPermitRootLogin:
 896                 intptr = &options->permit_root_login;
 897                 arg = strdelim(&cp);
 898                 if (!arg || *arg == '\0')
 899                         fatal("%s line %d: missing yes/"
 900                             "without-password/forced-commands-only/no "
 901                             "argument.", filename, linenum);
 902                 value = 0;      /* silence compiler */
 903                 if (strcmp(arg, "without-password") == 0)
 904                         value = PERMIT_NO_PASSWD;
 905                 else if (strcmp(arg, "forced-commands-only") == 0)
 906                         value = PERMIT_FORCED_ONLY;
 907                 else if (strcmp(arg, "yes") == 0)
 908                         value = PERMIT_YES;
 909                 else if (strcmp(arg, "no") == 0)
 910                         value = PERMIT_NO;
 911                 else
 912                         fatal("%s line %d: Bad yes/"
 913                             "without-password/forced-commands-only/no "
 914                             "argument: %s", filename, linenum, arg);
 915                 if (*activep && *intptr == -1)
 916                         *intptr = value;
 917                 break;
 918 
 919         case sIgnoreRhosts:
 920                 intptr = &options->ignore_rhosts;
 921 parse_flag:
 922                 arg = strdelim(&cp);
 923                 if (!arg || *arg == '\0')
 924                         fatal("%s line %d: missing yes/no argument.",
 925                             filename, linenum);
 926                 value = 0;      /* silence compiler */
 927                 if (strcmp(arg, "yes") == 0)
 928                         value = 1;
 929                 else if (strcmp(arg, "no") == 0)
 930                         value = 0;
 931                 else
 932                         fatal("%s line %d: Bad yes/no argument: %s",
 933                                 filename, linenum, arg);
 934                 if (*activep && *intptr == -1)
 935                         *intptr = value;
 936                 break;
 937 
 938         case sIgnoreUserKnownHosts:
 939                 intptr = &options->ignore_user_known_hosts;
 940                 goto parse_flag;
 941 
 942         case sRhostsAuthentication:
 943                 intptr = &options->rhosts_authentication;
 944                 goto parse_flag;
 945 
 946         case sRhostsRSAAuthentication:
 947                 intptr = &options->rhosts_rsa_authentication;
 948                 goto parse_flag;
 949 
 950         case sHostbasedAuthentication:
 951                 intptr = &options->hostbased_authentication;
 952                 goto parse_flag;
 953 
 954         case sHostbasedUsesNameFromPacketOnly:
 955                 intptr = &options->hostbased_uses_name_from_packet_only;
 956                 goto parse_flag;
 957 
 958         case sRSAAuthentication:
 959                 intptr = &options->rsa_authentication;
 960                 goto parse_flag;
 961 
 962         case sPubkeyAuthentication:
 963                 intptr = &options->pubkey_authentication;
 964                 goto parse_flag;
 965 #ifdef GSSAPI
 966         case sGssAuthentication:
 967                 intptr = &options->gss_authentication;
 968                 goto parse_flag;
 969         case sGssKeyEx:
 970                 intptr = &options->gss_keyex;
 971                 goto parse_flag;
 972         case sGssStoreDelegCreds:
 973                 intptr = &options->gss_keyex;
 974                 goto parse_flag;
 975 #ifndef SUNW_GSSAPI
 976         case sGssUseSessionCredCache:
 977                 intptr = &options->gss_use_session_ccache;
 978                 goto parse_flag;
 979         case sGssCleanupCreds:
 980                 intptr = &options->gss_cleanup_creds;
 981                 goto parse_flag;
 982 #endif /* SUNW_GSSAPI */
 983 #endif /* GSSAPI */
 984 #if defined(KRB4) || defined(KRB5)
 985         case sKerberosAuthentication:
 986                 intptr = &options->kerberos_authentication;
 987                 goto parse_flag;
 988 
 989         case sKerberosOrLocalPasswd:
 990                 intptr = &options->kerberos_or_local_passwd;
 991                 goto parse_flag;
 992 
 993         case sKerberosTicketCleanup:
 994                 intptr = &options->kerberos_ticket_cleanup;
 995                 goto parse_flag;
 996 #endif
 997 #if defined(AFS) || defined(KRB5)
 998         case sKerberosTgtPassing:
 999                 intptr = &options->kerberos_tgt_passing;
1000                 goto parse_flag;
1001 #endif
1002 #ifdef AFS
1003         case sAFSTokenPassing:
1004                 intptr = &options->afs_token_passing;
1005                 goto parse_flag;
1006 #endif
1007 
1008         case sPasswordAuthentication:
1009                 intptr = &options->password_authentication;
1010                 goto parse_flag;
1011 
1012         case sKbdInteractiveAuthentication:
1013                 intptr = &options->kbd_interactive_authentication;
1014                 goto parse_flag;
1015 
1016         case sChallengeResponseAuthentication:
1017                 intptr = &options->challenge_response_authentication;
1018                 goto parse_flag;
1019 
1020         case sPrintMotd:
1021                 intptr = &options->print_motd;
1022                 goto parse_flag;
1023 
1024         case sPrintLastLog:
1025                 intptr = &options->print_lastlog;
1026                 goto parse_flag;
1027 
1028         case sX11Forwarding:
1029                 intptr = &options->x11_forwarding;
1030                 goto parse_flag;
1031 
1032         case sX11DisplayOffset:
1033                 intptr = &options->x11_display_offset;
1034                 goto parse_int;
1035 
1036         case sX11UseLocalhost:
1037                 intptr = &options->x11_use_localhost;
1038                 goto parse_flag;
1039 
1040         case sXAuthLocation:
1041                 charptr = &options->xauth_location;
1042                 goto parse_filename;
1043 
1044         case sStrictModes:
1045                 intptr = &options->strict_modes;
1046                 goto parse_flag;
1047 
1048         case sKeepAlives:
1049                 intptr = &options->keepalives;
1050                 goto parse_flag;
1051 
1052         case sEmptyPasswd:
1053                 intptr = &options->permit_empty_passwd;
1054                 goto parse_flag;
1055 
1056         case sPermitUserEnvironment:
1057                 intptr = &options->permit_user_env;
1058                 goto parse_flag;
1059 
1060         case sUseLogin:
1061                 log("%s line %d: ignoring UseLogin option value."
1062                     " This option is always off.", filename, linenum);
1063                 while (arg)
1064                         arg = strdelim(&cp);
1065                 break;
1066 
1067         case sCompression:
1068                 intptr = &options->compression;
1069                 goto parse_flag;
1070 
1071         case sGatewayPorts:
1072                 intptr = &options->gateway_ports;
1073                 arg = strdelim(&cp);
1074                 if (!arg || *arg == '\0')
1075                         fatal("%s line %d: missing yes/no/clientspecified "
1076                             "argument.", filename, linenum);
1077                 value = 0;      /* silence compiler */
1078                 if (strcmp(arg, "clientspecified") == 0)
1079                         value = 2;
1080                 else if (strcmp(arg, "yes") == 0)
1081                         value = 1;
1082                 else if (strcmp(arg, "no") == 0)
1083                         value = 0;
1084                 else
1085                         fatal("%s line %d: Bad yes/no/clientspecified "
1086                             "argument: %s", filename, linenum, arg);
1087                 if (*activep && *intptr == -1)
1088                         *intptr = value;
1089                 break;
1090 
1091         case sVerifyReverseMapping:
1092                 intptr = &options->verify_reverse_mapping;
1093                 goto parse_flag;
1094 
1095         case sLogFacility:
1096                 intptr = (int *) &options->log_facility;
1097                 arg = strdelim(&cp);
1098                 value = log_facility_number(arg);
1099                 if (value == SYSLOG_FACILITY_NOT_SET)
1100                         fatal("%.200s line %d: unsupported log facility '%s'",
1101                             filename, linenum, arg ? arg : "<NONE>");
1102                 if (*intptr == -1)
1103                         *intptr = (SyslogFacility) value;
1104                 break;
1105 
1106         case sLogLevel:
1107                 intptr = (int *) &options->log_level;
1108                 arg = strdelim(&cp);
1109                 value = log_level_number(arg);
1110                 if (value == SYSLOG_LEVEL_NOT_SET)
1111                         fatal("%.200s line %d: unsupported log level '%s'",
1112                             filename, linenum, arg ? arg : "<NONE>");
1113                 if (*intptr == -1)
1114                         *intptr = (LogLevel) value;
1115                 break;
1116 
1117         case sAllowTcpForwarding:
1118                 intptr = &options->allow_tcp_forwarding;
1119                 goto parse_flag;
1120 
1121         case sUsePrivilegeSeparation:
1122                 log("%s line %d: ignoring UsePrivilegeSeparation option value."
1123                     " This option is always on.", filename, linenum);
1124                 while (arg)
1125                         arg = strdelim(&cp);
1126                 break;
1127 
1128         case sAllowUsers:
1129                 while (((arg = strdelim(&cp)) != NULL) && *arg != '\0') {
1130                         if (options->num_allow_users >= MAX_ALLOW_USERS)
1131                                 fatal("%s line %d: too many allow users.",
1132                                     filename, linenum);
1133                         options->allow_users[options->num_allow_users++] =
1134                             xstrdup(arg);
1135                 }
1136                 break;
1137 
1138         case sDenyUsers:
1139                 while (((arg = strdelim(&cp)) != NULL) && *arg != '\0') {
1140                         if (options->num_deny_users >= MAX_DENY_USERS)
1141                                 fatal( "%s line %d: too many deny users.",
1142                                     filename, linenum);
1143                         options->deny_users[options->num_deny_users++] =
1144                             xstrdup(arg);
1145                 }
1146                 break;
1147 
1148         case sAllowGroups:
1149                 while (((arg = strdelim(&cp)) != NULL) && *arg != '\0') {
1150                         if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
1151                                 fatal("%s line %d: too many allow groups.",
1152                                     filename, linenum);
1153                         options->allow_groups[options->num_allow_groups++] =
1154                             xstrdup(arg);
1155                 }
1156                 break;
1157 
1158         case sDenyGroups:
1159                 while (((arg = strdelim(&cp)) != NULL) && *arg != '\0') {
1160                         if (options->num_deny_groups >= MAX_DENY_GROUPS)
1161                                 fatal("%s line %d: too many deny groups.",
1162                                     filename, linenum);
1163                         options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
1164                 }
1165                 break;
1166 
1167         case sCiphers:
1168                 arg = strdelim(&cp);
1169                 if (!arg || *arg == '\0')
1170                         fatal("%s line %d: Missing argument.", filename, linenum);
1171                 if (!ciphers_valid(arg))
1172                         fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
1173                             filename, linenum, arg ? arg : "<NONE>");
1174                 if (options->ciphers == NULL)
1175                         options->ciphers = xstrdup(arg);
1176                 break;
1177 
1178         case sMacs:
1179                 arg = strdelim(&cp);
1180                 if (!arg || *arg == '\0')
1181                         fatal("%s line %d: Missing argument.", filename, linenum);
1182                 if (!mac_valid(arg))
1183                         fatal("%s line %d: Bad SSH2 mac spec '%s'.",
1184                             filename, linenum, arg ? arg : "<NONE>");
1185                 if (options->macs == NULL)
1186                         options->macs = xstrdup(arg);
1187                 break;
1188 
1189         case sProtocol:
1190                 intptr = &options->protocol;
1191                 arg = strdelim(&cp);
1192                 if (!arg || *arg == '\0')
1193                         fatal("%s line %d: Missing argument.", filename, linenum);
1194                 value = proto_spec(arg);
1195                 if (value == SSH_PROTO_UNKNOWN)
1196                         fatal("%s line %d: Bad protocol spec '%s'.",
1197                             filename, linenum, arg ? arg : "<NONE>");
1198                 if (*intptr == SSH_PROTO_UNKNOWN)
1199                         *intptr = value;
1200                 break;
1201 
1202         case sSubsystem:
1203                 if (options->num_subsystems >= MAX_SUBSYSTEMS) {
1204                         fatal("%s line %d: too many subsystems defined.",
1205                             filename, linenum);
1206                 }
1207                 arg = strdelim(&cp);
1208                 if (!arg || *arg == '\0')
1209                         fatal("%s line %d: Missing subsystem name.",
1210                             filename, linenum);
1211                 if (!*activep) {
1212                         arg = strdelim(&cp);
1213                         break;
1214                 }
1215                 for (i = 0; i < options->num_subsystems; i++)
1216                         if (strcmp(arg, options->subsystem_name[i]) == 0)
1217                                 fatal("%s line %d: Subsystem '%s' already defined.",
1218                                     filename, linenum, arg);
1219                 options->subsystem_name[options->num_subsystems] = xstrdup(arg);
1220                 arg = strdelim(&cp);
1221                 if (!arg || *arg == '\0')
1222                         fatal("%s line %d: Missing subsystem command.",
1223                             filename, linenum);
1224                 options->subsystem_command[options->num_subsystems] = xstrdup(arg);
1225 
1226                 /*
1227                  * Collect arguments (separate to executable), including the
1228                  * name of the executable, in a way that is easier to parse
1229                  * later.
1230                  */
1231                 p = xstrdup(arg);
1232                 len = strlen(p) + 1;
1233                 while ((arg = strdelim(&cp)) != NULL && *arg != '\0') {
1234                         len += 1 + strlen(arg);
1235                         p = xrealloc(p, len);
1236                         strlcat(p, " ", len);
1237                         strlcat(p, arg, len);
1238                 }
1239                 options->subsystem_args[options->num_subsystems] = p;
1240                 options->num_subsystems++;
1241                 break;
1242 
1243         case sMaxStartups:
1244                 arg = strdelim(&cp);
1245                 if (!arg || *arg == '\0')
1246                         fatal("%s line %d: Missing MaxStartups spec.",
1247                             filename, linenum);
1248                 if ((n = sscanf(arg, "%d:%d:%d",
1249                     &options->max_startups_begin,
1250                     &options->max_startups_rate,
1251                     &options->max_startups)) == 3) {
1252                         if (options->max_startups_begin >
1253                             options->max_startups ||
1254                             options->max_startups_rate > 100 ||
1255                             options->max_startups_rate < 1)
1256                                 fatal("%s line %d: Illegal MaxStartups spec.",
1257                                     filename, linenum);
1258                 } else if (n != 1)
1259                         fatal("%s line %d: Illegal MaxStartups spec.",
1260                             filename, linenum);
1261                 else
1262                         options->max_startups = options->max_startups_begin;
1263                 break;
1264 
1265         case sBanner:
1266                 charptr = &options->banner;
1267                 goto parse_filename;
1268         /*
1269          * These options can contain %X options expanded at
1270          * connect time, so that you can specify paths like:
1271          *
1272          * AuthorizedKeysFile   /etc/ssh_keys/%u
1273          */
1274         case sAuthorizedKeysFile:
1275         case sAuthorizedKeysFile2:
1276                 charptr = (opcode == sAuthorizedKeysFile) ?
1277                     &options->authorized_keys_file :
1278                     &options->authorized_keys_file2;
1279                 goto parse_filename;
1280 
1281         case sClientAliveInterval:
1282                 intptr = &options->client_alive_interval;
1283                 goto parse_time;
1284 
1285         case sClientAliveCountMax:
1286                 intptr = &options->client_alive_count_max;
1287                 goto parse_int;
1288 
1289         case sMaxAuthTries:
1290                 intptr = &options->max_auth_tries;
1291                 goto parse_int;
1292 
1293         case sMaxAuthTriesLog:
1294                 intptr = &options->max_auth_tries_log;
1295                 goto parse_int;
1296 
1297         case sLookupClientHostnames:
1298                 intptr = &options->lookup_client_hostnames;
1299                 goto parse_flag;
1300 
1301         case sUseOpenSSLEngine:
1302                 intptr = &options->use_openssl_engine;
1303                 goto parse_flag;
1304 
1305         case sChrootDirectory:
1306                 charptr = &options->chroot_directory;
1307 
1308                 arg = strdelim(&cp);
1309                 if (arg == NULL || *arg == '\0')
1310                         fatal("%s line %d: missing directory name for "
1311                             "ChrootDirectory.", filename, linenum);
1312                 if (*activep && *charptr == NULL)
1313                         *charptr = xstrdup(arg);
1314                 break;
1315 
1316         case sPreUserauthHook:
1317                 charptr = &options->pre_userauth_hook;
1318                 goto parse_filename;
1319 
1320         case sMatch:
1321                 if (cmdline)
1322                         fatal("Match directive not supported as a command-line "
1323                            "option");
1324                 value = match_cfg_line(&cp, linenum, user, host, address);
1325                 if (value < 0)
1326                         fatal("%s line %d: Bad Match condition", filename,
1327                             linenum);
1328                 *activep = value;
1329                 break;
1330 
1331         case sDeprecated:
1332                 log("%s line %d: Deprecated option %s",
1333                     filename, linenum, arg);
1334                 while (arg)
1335                     arg = strdelim(&cp);
1336                 break;
1337 
1338         case sPAMServicePrefix:
1339                 arg = strdelim(&cp);
1340                 if (!arg || *arg == '\0')
1341                         fatal("%s line %d: Missing argument.",
1342                             filename, linenum);
1343                 if (options->pam_service_name != NULL)
1344                         fatal("%s line %d: PAMServiceName and PAMServicePrefix "
1345                             "are mutually exclusive.", filename, linenum);
1346                 if (options->pam_service_prefix == NULL)
1347                         options->pam_service_prefix = xstrdup(arg);
1348                 break;
1349 
1350         case sPAMServiceName:
1351                 arg = strdelim(&cp);
1352                 if (!arg || *arg == '\0')
1353                         fatal("%s line %d: Missing argument.",
1354                             filename, linenum);
1355                 if (options->pam_service_prefix != NULL)
1356                         fatal("%s line %d: PAMServiceName and PAMServicePrefix "
1357                             "are mutually exclusive.", filename, linenum);
1358                 if (options->pam_service_name == NULL)
1359                         options->pam_service_name = xstrdup(arg);
1360                 break;
1361 
1362         case sPubKeyPlugin:
1363                 charptr = &options->pubkey_plugin;
1364                 goto parse_filename;
1365 
1366         default:
1367                 fatal("%s line %d: Missing handler for opcode %s (%d)",
1368                     filename, linenum, arg, opcode);
1369         }
1370         if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
1371                 fatal("%s line %d: garbage at end of line; \"%.200s\".",
1372                     filename, linenum, arg);
1373         return 0;
1374 }
1375 
1376 
1377 /* Reads the server configuration file. */
1378 
1379 void
1380 load_server_config(const char *filename, Buffer *conf)
1381 {
1382         char line[1024], *cp;
1383         FILE *f;
1384 
1385         debug2("%s: filename %s", __func__, filename);
1386         if ((f = fopen(filename, "r")) == NULL) {
1387                 perror(filename);
1388                 exit(1);
1389         }
1390         buffer_clear(conf);
1391         while (fgets(line, sizeof(line), f)) {
1392                 /*
1393                  * Trim out comments and strip whitespace
1394                  * NB - preserve newlines, they are needed to reproduce
1395                  * line numbers later for error messages
1396                  */
1397                 if ((cp = strchr(line, '#')) != NULL)
1398                         memcpy(cp, "\n", 2);
1399                 cp = line + strspn(line, " \t\r");
1400 
1401                 buffer_append(conf, cp, strlen(cp));
1402         }
1403         buffer_append(conf, "\0", 1);
1404         fclose(f);
1405         debug2("%s: done config len = %d", __func__, buffer_len(conf));
1406 }
1407 
1408 void
1409 parse_server_match_config(ServerOptions *options, const char *user,
1410     const char *host, const char *address)
1411 {
1412         ServerOptions mo;
1413 
1414         initialize_server_options(&mo);
1415         parse_server_config(&mo, "reprocess config", &cfg, user, host, address);
1416         copy_set_server_options(options, &mo, 0);
1417 }
1418 
1419 
1420 
1421 /* Helper macros */
1422 #define M_CP_INTOPT(n) do {\
1423         if (src->n != -1) \
1424                 dst->n = src->n; \
1425 } while (0)
1426 #define M_CP_STROPT(n) do {\
1427         if (src->n != NULL) { \
1428                 if (dst->n != NULL) \
1429                         xfree(dst->n); \
1430                 dst->n = src->n; \
1431         } \
1432 } while(0)
1433 
1434 /*
1435  * Copy any supported values that are set.
1436  *
1437  * If the preauth flag is set, we do not bother copying the the string or
1438  * array values that are not used pre-authentication, because any that we
1439  * do use must be explictly sent in mm_getpwnamallow().
1440  */
1441 void
1442 copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
1443 {
1444         M_CP_INTOPT(password_authentication);
1445         M_CP_INTOPT(gss_authentication);
1446         M_CP_INTOPT(rsa_authentication);
1447         M_CP_INTOPT(pubkey_authentication);
1448         M_CP_INTOPT(hostbased_authentication);
1449         M_CP_INTOPT(kbd_interactive_authentication);
1450         M_CP_INTOPT(permit_root_login);
1451         M_CP_INTOPT(permit_empty_passwd);
1452         M_CP_INTOPT(allow_tcp_forwarding);
1453         M_CP_INTOPT(gateway_ports);
1454         M_CP_INTOPT(x11_display_offset);
1455         M_CP_INTOPT(x11_forwarding);
1456         M_CP_INTOPT(x11_use_localhost);
1457         M_CP_INTOPT(max_auth_tries);
1458         M_CP_STROPT(banner);
1459 
1460         if (preauth)
1461                 return;
1462         M_CP_STROPT(chroot_directory);
1463 }
1464 
1465 #undef M_CP_INTOPT
1466 #undef M_CP_STROPT
1467 
1468 void
1469 parse_server_config(ServerOptions *options, const char *filename, Buffer *conf,
1470     const char *user, const char *host, const char *address)
1471 {
1472         int active, linenum, bad_options = 0;
1473         char *cp, *obuf, *cbuf;
1474 
1475         debug2("%s: config %s len %d", __func__, filename, buffer_len(conf));
1476 
1477         obuf = cbuf = xstrdup(buffer_ptr(conf));
1478         active = user ? 0 : 1;
1479         linenum = 1;
1480         while ((cp = strsep(&cbuf, "\n")) != NULL) {
1481                 if (process_server_config_line(options, cp, filename,
1482                     linenum++, &active, user, host, address) != 0)
1483                         bad_options++;
1484         }
1485         xfree(obuf);
1486         if (bad_options > 0)
1487                 fatal("%s: terminating, %d bad configuration options",
1488                     filename, bad_options);
1489 }
1490 
1491 
1492 /*
1493  * Note that "none" is a special path having the same affect on sshd
1494  * configuration as not specifying ChrootDirectory at all.
1495  */
1496 int
1497 chroot_requested(char *chroot_directory)
1498 {
1499         return (chroot_directory != NULL &&
1500             strcasecmp(chroot_directory, "none") != 0);
1501 }