[BACK]Return to servconf.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/servconf.c between version 1.89.2.7 and 1.90

version 1.89.2.7, 2002/10/11 14:53:07 version 1.90, 2001/11/11 13:02:31
Line 36 
Line 36 
   
 /* AF_UNSPEC or AF_INET or AF_INET6 */  /* AF_UNSPEC or AF_INET or AF_INET6 */
 extern int IPv4or6;  extern int IPv4or6;
 /* Use of privilege separation or not */  
 extern int use_privsep;  
   
 /* Initializes the server options to their default values. */  /* Initializes the server options to their default values. */
   
Line 60 
Line 58 
         options->print_lastlog = -1;          options->print_lastlog = -1;
         options->x11_forwarding = -1;          options->x11_forwarding = -1;
         options->x11_display_offset = -1;          options->x11_display_offset = -1;
         options->x11_use_localhost = -1;  
         options->xauth_location = NULL;          options->xauth_location = NULL;
         options->strict_modes = -1;          options->strict_modes = -1;
         options->keepalives = -1;          options->keepalives = -1;
         options->log_facility = SYSLOG_FACILITY_NOT_SET;          options->log_facility = (SyslogFacility) - 1;
         options->log_level = SYSLOG_LEVEL_NOT_SET;          options->log_level = (LogLevel) - 1;
         options->rhosts_authentication = -1;          options->rhosts_authentication = -1;
         options->rhosts_rsa_authentication = -1;          options->rhosts_rsa_authentication = -1;
         options->hostbased_authentication = -1;          options->hostbased_authentication = -1;
Line 87 
Line 84 
         options->kbd_interactive_authentication = -1;          options->kbd_interactive_authentication = -1;
         options->challenge_response_authentication = -1;          options->challenge_response_authentication = -1;
         options->permit_empty_passwd = -1;          options->permit_empty_passwd = -1;
         options->permit_user_env = -1;  
         options->use_login = -1;          options->use_login = -1;
         options->compression = -1;  
         options->allow_tcp_forwarding = -1;          options->allow_tcp_forwarding = -1;
         options->num_allow_users = 0;          options->num_allow_users = 0;
         options->num_deny_users = 0;          options->num_deny_users = 0;
Line 104 
Line 99 
         options->max_startups_rate = -1;          options->max_startups_rate = -1;
         options->max_startups = -1;          options->max_startups = -1;
         options->banner = NULL;          options->banner = NULL;
         options->verify_reverse_mapping = -1;          options->reverse_mapping_check = -1;
         options->client_alive_interval = -1;          options->client_alive_interval = -1;
         options->client_alive_count_max = -1;          options->client_alive_count_max = -1;
         options->authorized_keys_file = NULL;          options->authorized_keys_file = NULL;
         options->authorized_keys_file2 = NULL;          options->authorized_keys_file2 = NULL;
   
         /* Needs to be accessable in many places */  
         use_privsep = -1;  
 }  }
   
 void  void
Line 122 
Line 114 
         if (options->num_host_key_files == 0) {          if (options->num_host_key_files == 0) {
                 /* fill default hostkeys for protocols */                  /* fill default hostkeys for protocols */
                 if (options->protocol & SSH_PROTO_1)                  if (options->protocol & SSH_PROTO_1)
                         options->host_key_files[options->num_host_key_files++] =                          options->host_key_files[options->num_host_key_files++] = _PATH_HOST_KEY_FILE;
                             _PATH_HOST_KEY_FILE;                  if (options->protocol & SSH_PROTO_2)
                 if (options->protocol & SSH_PROTO_2) {                          options->host_key_files[options->num_host_key_files++] = _PATH_HOST_DSA_KEY_FILE;
                         options->host_key_files[options->num_host_key_files++] =  
                             _PATH_HOST_RSA_KEY_FILE;  
                         options->host_key_files[options->num_host_key_files++] =  
                             _PATH_HOST_DSA_KEY_FILE;  
                 }  
         }          }
         if (options->num_ports == 0)          if (options->num_ports == 0)
                 options->ports[options->num_ports++] = SSH_DEFAULT_PORT;                  options->ports[options->num_ports++] = SSH_DEFAULT_PORT;
Line 140 
Line 127 
         if (options->server_key_bits == -1)          if (options->server_key_bits == -1)
                 options->server_key_bits = 768;                  options->server_key_bits = 768;
         if (options->login_grace_time == -1)          if (options->login_grace_time == -1)
                 options->login_grace_time = 120;                  options->login_grace_time = 600;
         if (options->key_regeneration_time == -1)          if (options->key_regeneration_time == -1)
                 options->key_regeneration_time = 3600;                  options->key_regeneration_time = 3600;
         if (options->permit_root_login == PERMIT_NOT_SET)          if (options->permit_root_login == PERMIT_NOT_SET)
Line 157 
Line 144 
                 options->x11_forwarding = 0;                  options->x11_forwarding = 0;
         if (options->x11_display_offset == -1)          if (options->x11_display_offset == -1)
                 options->x11_display_offset = 10;                  options->x11_display_offset = 10;
         if (options->x11_use_localhost == -1)  #ifdef _PATH_XAUTH
                 options->x11_use_localhost = 1;  
         if (options->xauth_location == NULL)          if (options->xauth_location == NULL)
                 options->xauth_location = _PATH_XAUTH;                  options->xauth_location = _PATH_XAUTH;
   #endif
         if (options->strict_modes == -1)          if (options->strict_modes == -1)
                 options->strict_modes = 1;                  options->strict_modes = 1;
         if (options->keepalives == -1)          if (options->keepalives == -1)
                 options->keepalives = 1;                  options->keepalives = 1;
         if (options->log_facility == SYSLOG_FACILITY_NOT_SET)          if (options->log_facility == (SyslogFacility) (-1))
                 options->log_facility = SYSLOG_FACILITY_AUTH;                  options->log_facility = SYSLOG_FACILITY_AUTH;
         if (options->log_level == SYSLOG_LEVEL_NOT_SET)          if (options->log_level == (LogLevel) (-1))
                 options->log_level = SYSLOG_LEVEL_INFO;                  options->log_level = SYSLOG_LEVEL_INFO;
         if (options->rhosts_authentication == -1)          if (options->rhosts_authentication == -1)
                 options->rhosts_authentication = 0;                  options->rhosts_authentication = 0;
Line 183 
Line 170 
                 options->pubkey_authentication = 1;                  options->pubkey_authentication = 1;
 #if defined(KRB4) || defined(KRB5)  #if defined(KRB4) || defined(KRB5)
         if (options->kerberos_authentication == -1)          if (options->kerberos_authentication == -1)
                 options->kerberos_authentication = 0;                  options->kerberos_authentication = (access(KEYFILE, R_OK) == 0);
         if (options->kerberos_or_local_passwd == -1)          if (options->kerberos_or_local_passwd == -1)
                 options->kerberos_or_local_passwd = 1;                  options->kerberos_or_local_passwd = 1;
         if (options->kerberos_ticket_cleanup == -1)          if (options->kerberos_ticket_cleanup == -1)
Line 193 
Line 180 
         if (options->kerberos_tgt_passing == -1)          if (options->kerberos_tgt_passing == -1)
                 options->kerberos_tgt_passing = 0;                  options->kerberos_tgt_passing = 0;
 #endif  #endif
 #ifdef AFS  #ifdef AFS
         if (options->afs_token_passing == -1)          if (options->afs_token_passing == -1)
                 options->afs_token_passing = 0;                  options->afs_token_passing = k_hasafs();
 #endif  #endif
         if (options->password_authentication == -1)          if (options->password_authentication == -1)
                 options->password_authentication = 1;                  options->password_authentication = 1;
Line 205 
Line 192 
                 options->challenge_response_authentication = 1;                  options->challenge_response_authentication = 1;
         if (options->permit_empty_passwd == -1)          if (options->permit_empty_passwd == -1)
                 options->permit_empty_passwd = 0;                  options->permit_empty_passwd = 0;
         if (options->permit_user_env == -1)  
                 options->permit_user_env = 0;  
         if (options->use_login == -1)          if (options->use_login == -1)
                 options->use_login = 0;                  options->use_login = 0;
         if (options->compression == -1)  
                 options->compression = 1;  
         if (options->allow_tcp_forwarding == -1)          if (options->allow_tcp_forwarding == -1)
                 options->allow_tcp_forwarding = 1;                  options->allow_tcp_forwarding = 1;
         if (options->gateway_ports == -1)          if (options->gateway_ports == -1)
Line 221 
Line 204 
                 options->max_startups_rate = 100;               /* 100% */                  options->max_startups_rate = 100;               /* 100% */
         if (options->max_startups_begin == -1)          if (options->max_startups_begin == -1)
                 options->max_startups_begin = options->max_startups;                  options->max_startups_begin = options->max_startups;
         if (options->verify_reverse_mapping == -1)          if (options->reverse_mapping_check == -1)
                 options->verify_reverse_mapping = 0;                  options->reverse_mapping_check = 0;
         if (options->client_alive_interval == -1)          if (options->client_alive_interval == -1)
                 options->client_alive_interval = 0;                  options->client_alive_interval = 0;
         if (options->client_alive_count_max == -1)          if (options->client_alive_count_max == -1)
                 options->client_alive_count_max = 3;                  options->client_alive_count_max = 3;
           if (options->authorized_keys_file == NULL)
                   options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;
         if (options->authorized_keys_file2 == NULL) {          if (options->authorized_keys_file2 == NULL) {
                 /* authorized_keys_file2 falls back to authorized_keys_file */                  /* authorized_keys_file2 falls back to authorized_keys_file */
                 if (options->authorized_keys_file != NULL)                  if (options->authorized_keys_file != NULL)
Line 236 
Line 221 
         }          }
         if (options->authorized_keys_file == NULL)          if (options->authorized_keys_file == NULL)
                 options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;                  options->authorized_keys_file = _PATH_SSH_USER_PERMITTED_KEYS;
   
         /* Turn privilege separation on by default */  
         if (use_privsep == -1)  
                 use_privsep = 1;  
 }  }
   
 /* Keyword tokens. */  /* Keyword tokens. */
Line 260 
Line 241 
         sChallengeResponseAuthentication,          sChallengeResponseAuthentication,
         sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,          sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,
         sPrintMotd, sPrintLastLog, sIgnoreRhosts,          sPrintMotd, sPrintLastLog, sIgnoreRhosts,
         sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost,          sX11Forwarding, sX11DisplayOffset,
         sStrictModes, sEmptyPasswd, sKeepAlives,          sStrictModes, sEmptyPasswd, sKeepAlives,
         sPermitUserEnvironment, sUseLogin, sAllowTcpForwarding, sCompression,          sUseLogin, sAllowTcpForwarding,
         sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,          sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups,
         sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,          sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile,
         sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, sMaxStartups,          sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, sMaxStartups,
         sBanner, sVerifyReverseMapping, sHostbasedAuthentication,          sBanner, sReverseMappingCheck, sHostbasedAuthentication,
         sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,          sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
         sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,          sClientAliveCountMax, sAuthorizedKeysFile, sAuthorizedKeysFile2,
         sUsePrivilegeSeparation,  
         sDeprecated          sDeprecated
 } ServerOpCodes;  } ServerOpCodes;
   
Line 318 
Line 298 
         { "ignoreuserknownhosts", sIgnoreUserKnownHosts },          { "ignoreuserknownhosts", sIgnoreUserKnownHosts },
         { "x11forwarding", sX11Forwarding },          { "x11forwarding", sX11Forwarding },
         { "x11displayoffset", sX11DisplayOffset },          { "x11displayoffset", sX11DisplayOffset },
         { "x11uselocalhost", sX11UseLocalhost },  
         { "xauthlocation", sXAuthLocation },          { "xauthlocation", sXAuthLocation },
         { "strictmodes", sStrictModes },          { "strictmodes", sStrictModes },
         { "permitemptypasswords", sEmptyPasswd },          { "permitemptypasswords", sEmptyPasswd },
         { "permituserenvironment", sPermitUserEnvironment },  
         { "uselogin", sUseLogin },          { "uselogin", sUseLogin },
         { "compression", sCompression },  
         { "keepalive", sKeepAlives },          { "keepalive", sKeepAlives },
         { "allowtcpforwarding", sAllowTcpForwarding },          { "allowtcpforwarding", sAllowTcpForwarding },
         { "allowusers", sAllowUsers },          { "allowusers", sAllowUsers },
Line 338 
Line 315 
         { "subsystem", sSubsystem },          { "subsystem", sSubsystem },
         { "maxstartups", sMaxStartups },          { "maxstartups", sMaxStartups },
         { "banner", sBanner },          { "banner", sBanner },
         { "verifyreversemapping", sVerifyReverseMapping },          { "reversemappingcheck", sReverseMappingCheck },
         { "reversemappingcheck", sVerifyReverseMapping },  
         { "clientaliveinterval", sClientAliveInterval },          { "clientaliveinterval", sClientAliveInterval },
         { "clientalivecountmax", sClientAliveCountMax },          { "clientalivecountmax", sClientAliveCountMax },
         { "authorizedkeysfile", sAuthorizedKeysFile },          { "authorizedkeysfile", sAuthorizedKeysFile },
         { "authorizedkeysfile2", sAuthorizedKeysFile2 },          { "authorizedkeysfile2", sAuthorizedKeysFile2 },
         { "useprivilegeseparation", sUsePrivilegeSeparation},          { NULL, 0 }
         { NULL, sBadOption }  
 };  };
   
 /*  /*
Line 392 
Line 367 
         hints.ai_family = IPv4or6;          hints.ai_family = IPv4or6;
         hints.ai_socktype = SOCK_STREAM;          hints.ai_socktype = SOCK_STREAM;
         hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;          hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
         snprintf(strport, sizeof strport, "%u", port);          snprintf(strport, sizeof strport, "%d", port);
         if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)          if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
                 fatal("bad addr or host: %s (%s)",                  fatal("bad addr or host: %s (%s)",
                     addr ? addr : "<NULL>",                      addr ? addr : "<NULL>",
Line 403 
Line 378 
         options->listen_addrs = aitop;          options->listen_addrs = aitop;
 }  }
   
 int  /* Reads the server configuration file. */
 process_server_config_line(ServerOptions *options, char *line,  
     const char *filename, int linenum)  void
   read_server_config(ServerOptions *options, const char *filename)
 {  {
           FILE *f;
           char line[1024];
         char *cp, **charptr, *arg, *p;          char *cp, **charptr, *arg, *p;
         int *intptr, value, i, n;          int linenum, *intptr, value;
           int bad_options = 0;
         ServerOpCodes opcode;          ServerOpCodes opcode;
           int i, n;
   
         cp = line;          f = fopen(filename, "r");
         arg = strdelim(&cp);          if (!f) {
         /* Ignore leading whitespace */                  perror(filename);
         if (*arg == '\0')                  exit(1);
           }
           linenum = 0;
           while (fgets(line, sizeof(line), f)) {
                   linenum++;
                   cp = line;
                 arg = strdelim(&cp);                  arg = strdelim(&cp);
         if (!arg || !*arg || *arg == '#')                  /* Ignore leading whitespace */
                 return 0;                  if (*arg == '\0')
         intptr = NULL;                          arg = strdelim(&cp);
         charptr = NULL;                  if (!arg || !*arg || *arg == '#')
         opcode = parse_token(arg, filename, linenum);                          continue;
         switch (opcode) {                  intptr = NULL;
         case sBadOption:                  charptr = NULL;
                 return -1;                  opcode = parse_token(arg, filename, linenum);
         case sPort:                  switch (opcode) {
                 /* ignore ports from configfile if cmdline specifies ports */                  case sBadOption:
                 if (options->ports_from_cmdline)                          bad_options++;
                         return 0;                          continue;
                 if (options->listen_addrs != NULL)                  case sPort:
                         fatal("%s line %d: ports must be specified before "                          /* ignore ports from configfile if cmdline specifies ports */
                             "ListenAddress.", filename, linenum);                          if (options->ports_from_cmdline)
                 if (options->num_ports >= MAX_PORTS)                                  continue;
                         fatal("%s line %d: too many ports.",                          if (options->listen_addrs != NULL)
                             filename, linenum);                                  fatal("%s line %d: ports must be specified before "
                 arg = strdelim(&cp);                                      "ListenAdress.", filename, linenum);
                 if (!arg || *arg == '\0')                          if (options->num_ports >= MAX_PORTS)
                         fatal("%s line %d: missing port number.",                                  fatal("%s line %d: too many ports.",
                             filename, linenum);                                      filename, linenum);
                 options->ports[options->num_ports++] = a2port(arg);                          arg = strdelim(&cp);
                 if (options->ports[options->num_ports-1] == 0)                          if (!arg || *arg == '\0')
                         fatal("%s line %d: Badly formatted port number.",                                  fatal("%s line %d: missing port number.",
                             filename, linenum);                                      filename, linenum);
                 break;                          options->ports[options->num_ports++] = a2port(arg);
                           if (options->ports[options->num_ports-1] == 0)
                                   fatal("%s line %d: Badly formatted port number.",
                                       filename, linenum);
                           break;
   
         case sServerKeyBits:                  case sServerKeyBits:
                 intptr = &options->server_key_bits;                          intptr = &options->server_key_bits;
 parse_int:  parse_int:
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: missing integer value.",                                  fatal("%s line %d: missing integer value.",
                             filename, linenum);                                      filename, linenum);
                 value = atoi(arg);                          value = atoi(arg);
                 if (*intptr == -1)                          if (*intptr == -1)
                         *intptr = value;                                  *intptr = value;
                 break;                          break;
   
         case sLoginGraceTime:                  case sLoginGraceTime:
                 intptr = &options->login_grace_time;                          intptr = &options->login_grace_time;
 parse_time:  parse_time:
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: missing time value.",                                  fatal("%s line %d: missing time value.",
                             filename, linenum);  
                 if ((value = convtime(arg)) == -1)  
                         fatal("%s line %d: invalid time value.",  
                             filename, linenum);  
                 if (*intptr == -1)  
                         *intptr = value;  
                 break;  
   
         case sKeyRegenerationTime:  
                 intptr = &options->key_regeneration_time;  
                 goto parse_time;  
   
         case sListenAddress:  
                 arg = strdelim(&cp);  
                 if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0)  
                         fatal("%s line %d: missing inet addr.",  
                             filename, linenum);  
                 if (*arg == '[') {  
                         if ((p = strchr(arg, ']')) == NULL)  
                                 fatal("%s line %d: bad ipv6 inet addr usage.",  
                                     filename, linenum);                                      filename, linenum);
                         arg++;                          if ((value = convtime(arg)) == -1)
                         memmove(p, p+1, strlen(p+1)+1);                                  fatal("%s line %d: invalid time value.",
                 } else if (((p = strchr(arg, ':')) == NULL) ||                                      filename, linenum);
                             (strchr(p+1, ':') != NULL)) {                          if (*intptr == -1)
                         add_listen_addr(options, arg, 0);                                  *intptr = value;
                         break;                          break;
                 }  
                 if (*p == ':') {  
                         u_short port;  
   
                         p++;                  case sKeyRegenerationTime:
                         if (*p == '\0')                          intptr = &options->key_regeneration_time;
                                 fatal("%s line %d: bad inet addr:port usage.",                          goto parse_time;
   
                   case sListenAddress:
                           arg = strdelim(&cp);
                           if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0)
                                   fatal("%s line %d: missing inet addr.",
                                     filename, linenum);                                      filename, linenum);
                         else {                          if (*arg == '[') {
                                 *(p-1) = '\0';                                  if ((p = strchr(arg, ']')) == NULL)
                                 if ((port = a2port(p)) == 0)                                          fatal("%s line %d: bad ipv6 inet addr usage.",
                                         fatal("%s line %d: bad port number.",  
                                             filename, linenum);                                              filename, linenum);
                                 add_listen_addr(options, arg, port);                                  arg++;
                                   memmove(p, p+1, strlen(p+1)+1);
                           } else if (((p = strchr(arg, ':')) == NULL) ||
                                       (strchr(p+1, ':') != NULL)) {
                                   add_listen_addr(options, arg, 0);
                                   break;
                         }                          }
                 } else if (*p == '\0')                          if (*p == ':') {
                         add_listen_addr(options, arg, 0);                                  u_short port;
                 else  
                         fatal("%s line %d: bad inet addr usage.",  
                             filename, linenum);  
                 break;  
   
         case sHostKeyFile:                                  p++;
                 intptr = &options->num_host_key_files;                                  if (*p == '\0')
                 if (*intptr >= MAX_HOSTKEYS)                                          fatal("%s line %d: bad inet addr:port usage.",
                         fatal("%s line %d: too many host keys specified (max %d).",                                              filename, linenum);
                             filename, linenum, MAX_HOSTKEYS);                                  else {
                 charptr = &options->host_key_files[*intptr];                                          *(p-1) = '\0';
                                           if ((port = a2port(p)) == 0)
                                                   fatal("%s line %d: bad port number.",
                                                       filename, linenum);
                                           add_listen_addr(options, arg, port);
                                   }
                           } else if (*p == '\0')
                                   add_listen_addr(options, arg, 0);
                           else
                                   fatal("%s line %d: bad inet addr usage.",
                                       filename, linenum);
                           break;
   
                   case sHostKeyFile:
                           intptr = &options->num_host_key_files;
                           if (*intptr >= MAX_HOSTKEYS)
                                   fatal("%s line %d: too many host keys specified (max %d).",
                                       filename, linenum, MAX_HOSTKEYS);
                           charptr = &options->host_key_files[*intptr];
 parse_filename:  parse_filename:
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: missing file name.",                                  fatal("%s line %d: missing file name.",
                             filename, linenum);                                      filename, linenum);
                 if (*charptr == NULL) {                          if (*charptr == NULL) {
                         *charptr = tilde_expand_filename(arg, getuid());                                  *charptr = tilde_expand_filename(arg, getuid());
                         /* increase optional counter */                                  /* increase optional counter */
                         if (intptr != NULL)                                  if (intptr != NULL)
                                 *intptr = *intptr + 1;                                          *intptr = *intptr + 1;
                 }                          }
                 break;                          break;
   
         case sPidFile:                  case sPidFile:
                 charptr = &options->pid_file;                          charptr = &options->pid_file;
                 goto parse_filename;                          goto parse_filename;
   
         case sPermitRootLogin:                  case sPermitRootLogin:
                 intptr = &options->permit_root_login;                          intptr = &options->permit_root_login;
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: missing yes/"                                  fatal("%s line %d: missing yes/"
                             "without-password/forced-commands-only/no "                                      "without-password/forced-commands-only/no "
                             "argument.", filename, linenum);                                      "argument.", filename, linenum);
                 value = 0;      /* silence compiler */                          value = 0;      /* silence compiler */
                 if (strcmp(arg, "without-password") == 0)                          if (strcmp(arg, "without-password") == 0)
                         value = PERMIT_NO_PASSWD;                                  value = PERMIT_NO_PASSWD;
                 else if (strcmp(arg, "forced-commands-only") == 0)                          else if (strcmp(arg, "forced-commands-only") == 0)
                         value = PERMIT_FORCED_ONLY;                                  value = PERMIT_FORCED_ONLY;
                 else if (strcmp(arg, "yes") == 0)                          else if (strcmp(arg, "yes") == 0)
                         value = PERMIT_YES;                                  value = PERMIT_YES;
                 else if (strcmp(arg, "no") == 0)                          else if (strcmp(arg, "no") == 0)
                         value = PERMIT_NO;                                  value = PERMIT_NO;
                 else                          else
                         fatal("%s line %d: Bad yes/"                                  fatal("%s line %d: Bad yes/"
                             "without-password/forced-commands-only/no "                                      "without-password/forced-commands-only/no "
                             "argument: %s", filename, linenum, arg);                                      "argument: %s", filename, linenum, arg);
                 if (*intptr == -1)                          if (*intptr == -1)
                         *intptr = value;                                  *intptr = value;
                 break;                          break;
   
         case sIgnoreRhosts:                  case sIgnoreRhosts:
                 intptr = &options->ignore_rhosts;                          intptr = &options->ignore_rhosts;
 parse_flag:  parse_flag:
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: missing yes/no argument.",                                  fatal("%s line %d: missing yes/no argument.",
                             filename, linenum);                                      filename, linenum);
                 value = 0;      /* silence compiler */                          value = 0;      /* silence compiler */
                 if (strcmp(arg, "yes") == 0)                          if (strcmp(arg, "yes") == 0)
                         value = 1;                                  value = 1;
                 else if (strcmp(arg, "no") == 0)                          else if (strcmp(arg, "no") == 0)
                         value = 0;                                  value = 0;
                 else                          else
                         fatal("%s line %d: Bad yes/no argument: %s",                                  fatal("%s line %d: Bad yes/no argument: %s",
                                 filename, linenum, arg);                                          filename, linenum, arg);
                 if (*intptr == -1)                          if (*intptr == -1)
                         *intptr = value;                                  *intptr = value;
                 break;                          break;
   
         case sIgnoreUserKnownHosts:                  case sIgnoreUserKnownHosts:
                 intptr = &options->ignore_user_known_hosts;                          intptr = &options->ignore_user_known_hosts;
                 goto parse_flag;                          goto parse_flag;
   
         case sRhostsAuthentication:                  case sRhostsAuthentication:
                 intptr = &options->rhosts_authentication;                          intptr = &options->rhosts_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sRhostsRSAAuthentication:                  case sRhostsRSAAuthentication:
                 intptr = &options->rhosts_rsa_authentication;                          intptr = &options->rhosts_rsa_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sHostbasedAuthentication:                  case sHostbasedAuthentication:
                 intptr = &options->hostbased_authentication;                          intptr = &options->hostbased_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sHostbasedUsesNameFromPacketOnly:                  case sHostbasedUsesNameFromPacketOnly:
                 intptr = &options->hostbased_uses_name_from_packet_only;                          intptr = &options->hostbased_uses_name_from_packet_only;
                 goto parse_flag;                          goto parse_flag;
   
         case sRSAAuthentication:                  case sRSAAuthentication:
                 intptr = &options->rsa_authentication;                          intptr = &options->rsa_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sPubkeyAuthentication:                  case sPubkeyAuthentication:
                 intptr = &options->pubkey_authentication;                          intptr = &options->pubkey_authentication;
                 goto parse_flag;                          goto parse_flag;
 #if defined(KRB4) || defined(KRB5)  #if defined(KRB4) || defined(KRB5)
         case sKerberosAuthentication:                  case sKerberosAuthentication:
                 intptr = &options->kerberos_authentication;                          intptr = &options->kerberos_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sKerberosOrLocalPasswd:                  case sKerberosOrLocalPasswd:
                 intptr = &options->kerberos_or_local_passwd;                          intptr = &options->kerberos_or_local_passwd;
                 goto parse_flag;                          goto parse_flag;
   
         case sKerberosTicketCleanup:                  case sKerberosTicketCleanup:
                 intptr = &options->kerberos_ticket_cleanup;                          intptr = &options->kerberos_ticket_cleanup;
                 goto parse_flag;                          goto parse_flag;
 #endif  #endif
 #if defined(AFS) || defined(KRB5)  #if defined(AFS) || defined(KRB5)
         case sKerberosTgtPassing:                  case sKerberosTgtPassing:
                 intptr = &options->kerberos_tgt_passing;                          intptr = &options->kerberos_tgt_passing;
                 goto parse_flag;                          goto parse_flag;
 #endif  #endif
 #ifdef AFS  #ifdef AFS
         case sAFSTokenPassing:                  case sAFSTokenPassing:
                 intptr = &options->afs_token_passing;                          intptr = &options->afs_token_passing;
                 goto parse_flag;                          goto parse_flag;
 #endif  #endif
   
         case sPasswordAuthentication:                  case sPasswordAuthentication:
                 intptr = &options->password_authentication;                          intptr = &options->password_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sKbdInteractiveAuthentication:                  case sKbdInteractiveAuthentication:
                 intptr = &options->kbd_interactive_authentication;                          intptr = &options->kbd_interactive_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sChallengeResponseAuthentication:                  case sChallengeResponseAuthentication:
                 intptr = &options->challenge_response_authentication;                          intptr = &options->challenge_response_authentication;
                 goto parse_flag;                          goto parse_flag;
   
         case sPrintMotd:                  case sPrintMotd:
                 intptr = &options->print_motd;                          intptr = &options->print_motd;
                 goto parse_flag;                          goto parse_flag;
   
         case sPrintLastLog:                  case sPrintLastLog:
                 intptr = &options->print_lastlog;                          intptr = &options->print_lastlog;
                 goto parse_flag;                          goto parse_flag;
   
         case sX11Forwarding:                  case sX11Forwarding:
                 intptr = &options->x11_forwarding;                          intptr = &options->x11_forwarding;
                 goto parse_flag;                          goto parse_flag;
   
         case sX11DisplayOffset:                  case sX11DisplayOffset:
                 intptr = &options->x11_display_offset;                          intptr = &options->x11_display_offset;
                 goto parse_int;                          goto parse_int;
   
         case sX11UseLocalhost:                  case sXAuthLocation:
                 intptr = &options->x11_use_localhost;                          charptr = &options->xauth_location;
                 goto parse_flag;                          goto parse_filename;
   
         case sXAuthLocation:                  case sStrictModes:
                 charptr = &options->xauth_location;                          intptr = &options->strict_modes;
                 goto parse_filename;                          goto parse_flag;
   
         case sStrictModes:                  case sKeepAlives:
                 intptr = &options->strict_modes;                          intptr = &options->keepalives;
                 goto parse_flag;                          goto parse_flag;
   
         case sKeepAlives:                  case sEmptyPasswd:
                 intptr = &options->keepalives;                          intptr = &options->permit_empty_passwd;
                 goto parse_flag;                          goto parse_flag;
   
         case sEmptyPasswd:                  case sUseLogin:
                 intptr = &options->permit_empty_passwd;                          intptr = &options->use_login;
                 goto parse_flag;                          goto parse_flag;
   
         case sPermitUserEnvironment:                  case sGatewayPorts:
                 intptr = &options->permit_user_env;                          intptr = &options->gateway_ports;
                 goto parse_flag;                          goto parse_flag;
   
         case sUseLogin:                  case sReverseMappingCheck:
                 intptr = &options->use_login;                          intptr = &options->reverse_mapping_check;
                 goto parse_flag;                          goto parse_flag;
   
         case sCompression:                  case sLogFacility:
                 intptr = &options->compression;                          intptr = (int *) &options->log_facility;
                 goto parse_flag;                          arg = strdelim(&cp);
                           value = log_facility_number(arg);
                           if (value == (SyslogFacility) - 1)
                                   fatal("%.200s line %d: unsupported log facility '%s'",
                                       filename, linenum, arg ? arg : "<NONE>");
                           if (*intptr == -1)
                                   *intptr = (SyslogFacility) value;
                           break;
   
         case sGatewayPorts:                  case sLogLevel:
                 intptr = &options->gateway_ports;                          intptr = (int *) &options->log_level;
                 goto parse_flag;                          arg = strdelim(&cp);
                           value = log_level_number(arg);
                           if (value == (LogLevel) - 1)
                                   fatal("%.200s line %d: unsupported log level '%s'",
                                       filename, linenum, arg ? arg : "<NONE>");
                           if (*intptr == -1)
                                   *intptr = (LogLevel) value;
                           break;
   
         case sVerifyReverseMapping:                  case sAllowTcpForwarding:
                 intptr = &options->verify_reverse_mapping;                          intptr = &options->allow_tcp_forwarding;
                 goto parse_flag;                          goto parse_flag;
   
         case sLogFacility:                  case sAllowUsers:
                 intptr = (int *) &options->log_facility;                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                 arg = strdelim(&cp);                                  if (options->num_allow_users >= MAX_ALLOW_USERS)
                 value = log_facility_number(arg);                                          fatal("%s line %d: too many allow users.",
                 if (value == SYSLOG_FACILITY_NOT_SET)                                              filename, linenum);
                         fatal("%.200s line %d: unsupported log facility '%s'",                                  options->allow_users[options->num_allow_users++] = xstrdup(arg);
                             filename, linenum, arg ? arg : "<NONE>");                          }
                 if (*intptr == -1)                          break;
                         *intptr = (SyslogFacility) value;  
                 break;  
   
         case sLogLevel:                  case sDenyUsers:
                 intptr = (int *) &options->log_level;                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                 arg = strdelim(&cp);                                  if (options->num_deny_users >= MAX_DENY_USERS)
                 value = log_level_number(arg);                                          fatal( "%s line %d: too many deny users.",
                 if (value == SYSLOG_LEVEL_NOT_SET)                                              filename, linenum);
                         fatal("%.200s line %d: unsupported log level '%s'",                                  options->deny_users[options->num_deny_users++] = xstrdup(arg);
                             filename, linenum, arg ? arg : "<NONE>");                          }
                 if (*intptr == -1)                          break;
                         *intptr = (LogLevel) value;  
                 break;  
   
         case sAllowTcpForwarding:                  case sAllowGroups:
                 intptr = &options->allow_tcp_forwarding;                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                 goto parse_flag;                                  if (options->num_allow_groups >= MAX_ALLOW_GROUPS)
                                           fatal("%s line %d: too many allow groups.",
                                               filename, linenum);
                                   options->allow_groups[options->num_allow_groups++] = xstrdup(arg);
                           }
                           break;
   
         case sUsePrivilegeSeparation:                  case sDenyGroups:
                 intptr = &use_privsep;                          while ((arg = strdelim(&cp)) && *arg != '\0') {
                 goto parse_flag;                                  if (options->num_deny_groups >= MAX_DENY_GROUPS)
                                           fatal("%s line %d: too many deny groups.",
                                               filename, linenum);
                                   options->deny_groups[options->num_deny_groups++] = xstrdup(arg);
                           }
                           break;
   
         case sAllowUsers:                  case sCiphers:
                 while ((arg = strdelim(&cp)) && *arg != '\0') {                          arg = strdelim(&cp);
                         if (options->num_allow_users >= MAX_ALLOW_USERS)                          if (!arg || *arg == '\0')
                                 fatal("%s line %d: too many allow users.",                                  fatal("%s line %d: Missing argument.", filename, linenum);
                                     filename, linenum);                          if (!ciphers_valid(arg))
                         options->allow_users[options->num_allow_users++] =                                  fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
                             xstrdup(arg);                                      filename, linenum, arg ? arg : "<NONE>");
                 }                          if (options->ciphers == NULL)
                 break;                                  options->ciphers = xstrdup(arg);
                           break;
   
         case sDenyUsers:                  case sMacs:
                 while ((arg = strdelim(&cp)) && *arg != '\0') {                          arg = strdelim(&cp);
                         if (options->num_deny_users >= MAX_DENY_USERS)                          if (!arg || *arg == '\0')
                                 fatal( "%s line %d: too many deny users.",                                  fatal("%s line %d: Missing argument.", filename, linenum);
                                     filename, linenum);                          if (!mac_valid(arg))
                         options->deny_users[options->num_deny_users++] =                                  fatal("%s line %d: Bad SSH2 mac spec '%s'.",
                             xstrdup(arg);                                      filename, linenum, arg ? arg : "<NONE>");
                 }                          if (options->macs == NULL)
                 break;                                  options->macs = xstrdup(arg);
                           break;
   
         case sAllowGroups:                  case sProtocol:
                 while ((arg = strdelim(&cp)) && *arg != '\0') {                          intptr = &options->protocol;
                         if (options->num_allow_groups >= MAX_ALLOW_GROUPS)                          arg = strdelim(&cp);
                                 fatal("%s line %d: too many allow groups.",                          if (!arg || *arg == '\0')
                                     filename, linenum);                                  fatal("%s line %d: Missing argument.", filename, linenum);
                         options->allow_groups[options->num_allow_groups++] =                          value = proto_spec(arg);
                             xstrdup(arg);                          if (value == SSH_PROTO_UNKNOWN)
                 }                                  fatal("%s line %d: Bad protocol spec '%s'.",
                 break;                                        filename, linenum, arg ? arg : "<NONE>");
                           if (*intptr == SSH_PROTO_UNKNOWN)
                                   *intptr = value;
                           break;
   
         case sDenyGroups:                  case sSubsystem:
                 while ((arg = strdelim(&cp)) && *arg != '\0') {                          if(options->num_subsystems >= MAX_SUBSYSTEMS) {
                         if (options->num_deny_groups >= MAX_DENY_GROUPS)                                  fatal("%s line %d: too many subsystems defined.",
                                 fatal("%s line %d: too many deny groups.",                                        filename, linenum);
                                     filename, linenum);                          }
                         options->deny_groups[options->num_deny_groups++] = xstrdup(arg);                          arg = strdelim(&cp);
                 }                          if (!arg || *arg == '\0')
                 break;                                  fatal("%s line %d: Missing subsystem name.",
                                         filename, linenum);
                           for (i = 0; i < options->num_subsystems; i++)
                                   if(strcmp(arg, options->subsystem_name[i]) == 0)
                                           fatal("%s line %d: Subsystem '%s' already defined.",
                                                 filename, linenum, arg);
                           options->subsystem_name[options->num_subsystems] = xstrdup(arg);
                           arg = strdelim(&cp);
                           if (!arg || *arg == '\0')
                                   fatal("%s line %d: Missing subsystem command.",
                                         filename, linenum);
                           options->subsystem_command[options->num_subsystems] = xstrdup(arg);
                           options->num_subsystems++;
                           break;
   
         case sCiphers:                  case sMaxStartups:
                 arg = strdelim(&cp);                          arg = strdelim(&cp);
                 if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                         fatal("%s line %d: Missing argument.", filename, linenum);                                  fatal("%s line %d: Missing MaxStartups spec.",
                 if (!ciphers_valid(arg))                                        filename, linenum);
                         fatal("%s line %d: Bad SSH2 cipher spec '%s'.",                          if ((n = sscanf(arg, "%d:%d:%d",
                             filename, linenum, arg ? arg : "<NONE>");                              &options->max_startups_begin,
                 if (options->ciphers == NULL)                              &options->max_startups_rate,
                         options->ciphers = xstrdup(arg);                              &options->max_startups)) == 3) {
                 break;                                  if (options->max_startups_begin >
                                       options->max_startups ||
         case sMacs:                                      options->max_startups_rate > 100 ||
                 arg = strdelim(&cp);                                      options->max_startups_rate < 1)
                 if (!arg || *arg == '\0')                                          fatal("%s line %d: Illegal MaxStartups spec.",
                         fatal("%s line %d: Missing argument.", filename, linenum);                                              filename, linenum);
                 if (!mac_valid(arg))                          } else if (n != 1)
                         fatal("%s line %d: Bad SSH2 mac spec '%s'.",  
                             filename, linenum, arg ? arg : "<NONE>");  
                 if (options->macs == NULL)  
                         options->macs = xstrdup(arg);  
                 break;  
   
         case sProtocol:  
                 intptr = &options->protocol;  
                 arg = strdelim(&cp);  
                 if (!arg || *arg == '\0')  
                         fatal("%s line %d: Missing argument.", filename, linenum);  
                 value = proto_spec(arg);  
                 if (value == SSH_PROTO_UNKNOWN)  
                         fatal("%s line %d: Bad protocol spec '%s'.",  
                             filename, linenum, arg ? arg : "<NONE>");  
                 if (*intptr == SSH_PROTO_UNKNOWN)  
                         *intptr = value;  
                 break;  
   
         case sSubsystem:  
                 if (options->num_subsystems >= MAX_SUBSYSTEMS) {  
                         fatal("%s line %d: too many subsystems defined.",  
                             filename, linenum);  
                 }  
                 arg = strdelim(&cp);  
                 if (!arg || *arg == '\0')  
                         fatal("%s line %d: Missing subsystem name.",  
                             filename, linenum);  
                 for (i = 0; i < options->num_subsystems; i++)  
                         if (strcmp(arg, options->subsystem_name[i]) == 0)  
                                 fatal("%s line %d: Subsystem '%s' already defined.",  
                                     filename, linenum, arg);  
                 options->subsystem_name[options->num_subsystems] = xstrdup(arg);  
                 arg = strdelim(&cp);  
                 if (!arg || *arg == '\0')  
                         fatal("%s line %d: Missing subsystem command.",  
                             filename, linenum);  
                 options->subsystem_command[options->num_subsystems] = xstrdup(arg);  
                 options->num_subsystems++;  
                 break;  
   
         case sMaxStartups:  
                 arg = strdelim(&cp);  
                 if (!arg || *arg == '\0')  
                         fatal("%s line %d: Missing MaxStartups spec.",  
                             filename, linenum);  
                 if ((n = sscanf(arg, "%d:%d:%d",  
                     &options->max_startups_begin,  
                     &options->max_startups_rate,  
                     &options->max_startups)) == 3) {  
                         if (options->max_startups_begin >  
                             options->max_startups ||  
                             options->max_startups_rate > 100 ||  
                             options->max_startups_rate < 1)  
                                 fatal("%s line %d: Illegal MaxStartups spec.",                                  fatal("%s line %d: Illegal MaxStartups spec.",
                                     filename, linenum);                                      filename, linenum);
                 } else if (n != 1)                          else
                         fatal("%s line %d: Illegal MaxStartups spec.",                                  options->max_startups = options->max_startups_begin;
                             filename, linenum);                          break;
                 else  
                         options->max_startups = options->max_startups_begin;  
                 break;  
   
         case sBanner:                  case sBanner:
                 charptr = &options->banner;                          charptr = &options->banner;
                 goto parse_filename;                          goto parse_filename;
         /*                  /*
          * These options can contain %X options expanded at                   * These options can contain %X options expanded at
          * connect time, so that you can specify paths like:                   * connect time, so that you can specify paths like:
          *                   *
          * AuthorizedKeysFile   /etc_keys/%u                   * AuthorizedKeysFile   /etc/ssh_keys/%u
          */                   */
         case sAuthorizedKeysFile:                  case sAuthorizedKeysFile:
         case sAuthorizedKeysFile2:                  case sAuthorizedKeysFile2:
                 charptr = (opcode == sAuthorizedKeysFile ) ?                          charptr = (opcode == sAuthorizedKeysFile ) ?
                     &options->authorized_keys_file :                              &options->authorized_keys_file :
                     &options->authorized_keys_file2;                              &options->authorized_keys_file2;
                 goto parse_filename;                          goto parse_filename;
   
         case sClientAliveInterval:                  case sClientAliveInterval:
                 intptr = &options->client_alive_interval;                          intptr = &options->client_alive_interval;
                 goto parse_time;                          goto parse_time;
   
         case sClientAliveCountMax:                  case sClientAliveCountMax:
                 intptr = &options->client_alive_count_max;                          intptr = &options->client_alive_count_max;
                 goto parse_int;                          goto parse_int;
   
         case sDeprecated:                  case sDeprecated:
                 log("%s line %d: Deprecated option %s",                          log("%s line %d: Deprecated option %s",
                     filename, linenum, arg);                              filename, linenum, arg);
                 while (arg)                          while(arg)
                     arg = strdelim(&cp);                              arg = strdelim(&cp);
                 break;                          break;
   
         default:                  default:
                 fatal("%s line %d: Missing handler for opcode %s (%d)",                          fatal("%s line %d: Missing handler for opcode %s (%d)",
                     filename, linenum, arg, opcode);                              filename, linenum, arg, opcode);
         }                  }
         if ((arg = strdelim(&cp)) != NULL && *arg != '\0')                  if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
                 fatal("%s line %d: garbage at end of line; \"%.200s\".",                          fatal("%s line %d: garbage at end of line; \"%.200s\".",
                     filename, linenum, arg);                              filename, linenum, arg);
         return 0;  
 }  
   
 /* Reads the server configuration file. */  
   
 void  
 read_server_config(ServerOptions *options, const char *filename)  
 {  
         int linenum, bad_options = 0;  
         char line[1024];  
         FILE *f;  
   
         f = fopen(filename, "r");  
         if (!f) {  
                 perror(filename);  
                 exit(1);  
         }  
         linenum = 0;  
         while (fgets(line, sizeof(line), f)) {  
                 /* Update line number counter. */  
                 linenum++;  
                 if (process_server_config_line(options, line, filename, linenum) != 0)  
                         bad_options++;  
         }          }
         fclose(f);          fclose(f);
         if (bad_options > 0)          if (bad_options > 0)

Legend:
Removed from v.1.89.2.7  
changed lines
  Added in v.1.90