[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.53.2.3 and 1.53.2.4

version 1.53.2.3, 2001/03/21 19:46:28 version 1.53.2.4, 2001/05/07 21:09:33
Line 31 
Line 31 
 #include "kex.h"  #include "kex.h"
 #include "mac.h"  #include "mac.h"
   
 /* add listen address */  void add_listen_addr(ServerOptions *options, char *addr, u_short port);
 void add_listen_addr(ServerOptions *options, char *addr);  void add_one_listen_addr(ServerOptions *options, char *addr, u_short port);
   
 /* AF_UNSPEC or AF_INET or AF_INET6 */  /* AF_UNSPEC or AF_INET or AF_INET6 */
 extern int IPv4or6;  extern int IPv4or6;
Line 55 
Line 55 
         options->ignore_rhosts = -1;          options->ignore_rhosts = -1;
         options->ignore_user_known_hosts = -1;          options->ignore_user_known_hosts = -1;
         options->print_motd = -1;          options->print_motd = -1;
           options->print_lastlog = -1;
         options->check_mail = -1;          options->check_mail = -1;
         options->x11_forwarding = -1;          options->x11_forwarding = -1;
         options->x11_display_offset = -1;          options->x11_display_offset = -1;
Line 65 
Line 66 
         options->log_level = (LogLevel) - 1;          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_uses_name_from_packet_only = -1;
         options->rsa_authentication = -1;          options->rsa_authentication = -1;
         options->pubkey_authentication = -1;          options->pubkey_authentication = -1;
 #ifdef KRB4  #ifdef KRB4
Line 96 
Line 99 
         options->max_startups = -1;          options->max_startups = -1;
         options->banner = NULL;          options->banner = NULL;
         options->reverse_mapping_check = -1;          options->reverse_mapping_check = -1;
           options->client_alive_interval = -1;
           options->client_alive_count_max = -1;
 }  }
   
 void  void
Line 113 
Line 118 
         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;
         if (options->listen_addrs == NULL)          if (options->listen_addrs == NULL)
                 add_listen_addr(options, NULL);                  add_listen_addr(options, NULL, 0);
         if (options->pid_file == NULL)          if (options->pid_file == NULL)
                 options->pid_file = _PATH_SSH_DAEMON_PID_FILE;                  options->pid_file = _PATH_SSH_DAEMON_PID_FILE;
         if (options->server_key_bits == -1)          if (options->server_key_bits == -1)
Line 132 
Line 137 
                 options->check_mail = 0;                  options->check_mail = 0;
         if (options->print_motd == -1)          if (options->print_motd == -1)
                 options->print_motd = 1;                  options->print_motd = 1;
           if (options->print_lastlog == -1)
                   options->print_lastlog = 1;
         if (options->x11_forwarding == -1)          if (options->x11_forwarding == -1)
                 options->x11_forwarding = 0;                  options->x11_forwarding = 0;
         if (options->x11_display_offset == -1)          if (options->x11_display_offset == -1)
Line 152 
Line 159 
                 options->rhosts_authentication = 0;                  options->rhosts_authentication = 0;
         if (options->rhosts_rsa_authentication == -1)          if (options->rhosts_rsa_authentication == -1)
                 options->rhosts_rsa_authentication = 0;                  options->rhosts_rsa_authentication = 0;
           if (options->hostbased_authentication == -1)
                   options->hostbased_authentication = 0;
           if (options->hostbased_uses_name_from_packet_only == -1)
                   options->hostbased_uses_name_from_packet_only = 0;
         if (options->rsa_authentication == -1)          if (options->rsa_authentication == -1)
                 options->rsa_authentication = 1;                  options->rsa_authentication = 1;
         if (options->pubkey_authentication == -1)          if (options->pubkey_authentication == -1)
Line 192 
Line 203 
                 options->max_startups_begin = options->max_startups;                  options->max_startups_begin = options->max_startups;
         if (options->reverse_mapping_check == -1)          if (options->reverse_mapping_check == -1)
                 options->reverse_mapping_check = 0;                  options->reverse_mapping_check = 0;
           if (options->client_alive_interval == -1)
                   options->client_alive_interval = 0;
           if (options->client_alive_count_max == -1)
                   options->client_alive_count_max = 3;
 }  }
   
 /* Keyword tokens. */  /* Keyword tokens. */
Line 208 
Line 223 
 #endif  #endif
         sChallengeResponseAuthentication,          sChallengeResponseAuthentication,
         sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,          sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress,
         sPrintMotd, sIgnoreRhosts, sX11Forwarding, sX11DisplayOffset,          sPrintMotd, sPrintLastLog, sIgnoreRhosts,
           sX11Forwarding, sX11DisplayOffset,
         sStrictModes, sEmptyPasswd, sKeepAlives, sCheckMail,          sStrictModes, sEmptyPasswd, sKeepAlives, sCheckMail,
         sUseLogin, sAllowTcpForwarding,          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, sReverseMappingCheck          sBanner, sReverseMappingCheck, sHostbasedAuthentication,
           sHostbasedUsesNameFromPacketOnly, sClientAliveInterval,
           sClientAliveCountMax
 } ServerOpCodes;  } ServerOpCodes;
   
 /* Textual representation of the tokens. */  /* Textual representation of the tokens. */
Line 234 
Line 252 
         { "loglevel", sLogLevel },          { "loglevel", sLogLevel },
         { "rhostsauthentication", sRhostsAuthentication },          { "rhostsauthentication", sRhostsAuthentication },
         { "rhostsrsaauthentication", sRhostsRSAAuthentication },          { "rhostsrsaauthentication", sRhostsRSAAuthentication },
           { "hostbasedauthentication", sHostbasedAuthentication },
           { "hostbasedusesnamefrompacketonly", sHostbasedUsesNameFromPacketOnly },
         { "rsaauthentication", sRSAAuthentication },          { "rsaauthentication", sRSAAuthentication },
         { "pubkeyauthentication", sPubkeyAuthentication },          { "pubkeyauthentication", sPubkeyAuthentication },
         { "dsaauthentication", sPubkeyAuthentication },                 /* alias */          { "dsaauthentication", sPubkeyAuthentication },                 /* alias */
Line 253 
Line 273 
         { "checkmail", sCheckMail },          { "checkmail", sCheckMail },
         { "listenaddress", sListenAddress },          { "listenaddress", sListenAddress },
         { "printmotd", sPrintMotd },          { "printmotd", sPrintMotd },
           { "printlastlog", sPrintLastLog },
         { "ignorerhosts", sIgnoreRhosts },          { "ignorerhosts", sIgnoreRhosts },
         { "ignoreuserknownhosts", sIgnoreUserKnownHosts },          { "ignoreuserknownhosts", sIgnoreUserKnownHosts },
         { "x11forwarding", sX11Forwarding },          { "x11forwarding", sX11Forwarding },
Line 275 
Line 296 
         { "maxstartups", sMaxStartups },          { "maxstartups", sMaxStartups },
         { "banner", sBanner },          { "banner", sBanner },
         { "reversemappingcheck", sReverseMappingCheck },          { "reversemappingcheck", sReverseMappingCheck },
           { "clientaliveinterval", sClientAliveInterval },
           { "clientalivecountmax", sClientAliveCountMax },
         { NULL, 0 }          { NULL, 0 }
 };  };
   
 /*  /*
  * Returns the number of the token pointed to by cp of length len. Never   * Returns the number of the token pointed to by cp or sBadOption.
  * returns if the token is not known.  
  */   */
   
 static ServerOpCodes  static ServerOpCodes
Line 293 
Line 315 
                 if (strcasecmp(cp, keywords[i].name) == 0)                  if (strcasecmp(cp, keywords[i].name) == 0)
                         return keywords[i].opcode;                          return keywords[i].opcode;
   
         fprintf(stderr, "%s: line %d: Bad configuration option: %s\n",          error("%s: line %d: Bad configuration option: %s",
                 filename, linenum, cp);              filename, linenum, cp);
         return sBadOption;          return sBadOption;
 }  }
   
 /*  
  * add listen address  
  */  
 void  void
 add_listen_addr(ServerOptions *options, char *addr)  add_listen_addr(ServerOptions *options, char *addr, u_short port)
 {  {
         struct addrinfo hints, *ai, *aitop;  
         char strport[NI_MAXSERV];  
         int gaierr;  
         int i;          int i;
   
         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;
         for (i = 0; i < options->num_ports; i++) {          if (port == 0)
                 memset(&hints, 0, sizeof(hints));                  for (i = 0; i < options->num_ports; i++)
                 hints.ai_family = IPv4or6;                          add_one_listen_addr(options, addr, options->ports[i]);
                 hints.ai_socktype = SOCK_STREAM;          else
                 hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;                  add_one_listen_addr(options, addr, port);
                 snprintf(strport, sizeof strport, "%d", options->ports[i]);  
                 if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)  
                         fatal("bad addr or host: %s (%s)",  
                             addr ? addr : "<NULL>",  
                             gai_strerror(gaierr));  
                 for (ai = aitop; ai->ai_next; ai = ai->ai_next)  
                         ;  
                 ai->ai_next = options->listen_addrs;  
                 options->listen_addrs = aitop;  
         }  
 }  }
   
   void
   add_one_listen_addr(ServerOptions *options, char *addr, u_short port)
   {
           struct addrinfo hints, *ai, *aitop;
           char strport[NI_MAXSERV];
           int gaierr;
   
           memset(&hints, 0, sizeof(hints));
           hints.ai_family = IPv4or6;
           hints.ai_socktype = SOCK_STREAM;
           hints.ai_flags = (addr == NULL) ? AI_PASSIVE : 0;
           snprintf(strport, sizeof strport, "%d", port);
           if ((gaierr = getaddrinfo(addr, strport, &hints, &aitop)) != 0)
                   fatal("bad addr or host: %s (%s)",
                       addr ? addr : "<NULL>",
                       gai_strerror(gaierr));
           for (ai = aitop; ai->ai_next; ai = ai->ai_next)
                   ;
           ai->ai_next = options->listen_addrs;
           options->listen_addrs = aitop;
   }
   
 /* Reads the server configuration file. */  /* Reads the server configuration file. */
   
 void  void
Line 335 
Line 363 
 {  {
         FILE *f;          FILE *f;
         char line[1024];          char line[1024];
         char *cp, **charptr, *arg;          char *cp, **charptr, *arg, *p;
         int linenum, *intptr, value;          int linenum, *intptr, value;
         int bad_options = 0;          int bad_options = 0;
         ServerOpCodes opcode;          ServerOpCodes opcode;
Line 377 
Line 405 
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0')
                                 fatal("%s line %d: missing port number.",                                  fatal("%s line %d: missing port number.",
                                     filename, linenum);                                      filename, linenum);
                         options->ports[options->num_ports++] = atoi(arg);                          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;                          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')
                                 fprintf(stderr, "%s line %d: missing integer value.\n",                                  fatal("%s line %d: missing integer value.",
                                         filename, linenum);                                      filename, linenum);
                                 exit(1);  
                         }  
                         value = atoi(arg);                          value = atoi(arg);
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
Line 404 
Line 433 
   
                 case sListenAddress:                  case sListenAddress:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0')                          if (!arg || *arg == '\0' || strncmp(arg, "[]", 2) == 0)
                                 fatal("%s line %d: missing inet addr.",                                  fatal("%s line %d: missing inet addr.",
                                     filename, linenum);                                      filename, linenum);
                         add_listen_addr(options, arg);                          if (*arg == '[') {
                                   if ((p = strchr(arg, ']')) == NULL)
                                           fatal("%s line %d: bad ipv6 inet addr usage.",
                                               filename, linenum);
                                   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;
                           }
                           if (*p == ':') {
                                   u_short port;
   
                                   p++;
                                   if (*p == '\0')
                                           fatal("%s line %d: bad inet addr:port usage.",
                                               filename, linenum);
                                   else {
                                           *(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;                          break;
   
                 case sHostKeyFile:                  case sHostKeyFile:
                         intptr = &options->num_host_key_files;                          intptr = &options->num_host_key_files;
                         if (*intptr >= MAX_HOSTKEYS) {                          if (*intptr >= MAX_HOSTKEYS)
                                 fprintf(stderr,                                  fatal("%s line %d: too many host keys specified (max %d).",
                                     "%s line %d: too many host keys specified (max %d).\n",  
                                     filename, linenum, MAX_HOSTKEYS);                                      filename, linenum, MAX_HOSTKEYS);
                                 exit(1);  
                         }  
                         charptr = &options->host_key_files[*intptr];                          charptr = &options->host_key_files[*intptr];
 parse_filename:  parse_filename:
                         arg = strdelim(&cp);                          arg = strdelim(&cp);
                         if (!arg || *arg == '\0') {                          if (!arg || *arg == '\0')
                                 fprintf(stderr, "%s line %d: missing file name.\n",                                  fatal("%s line %d: missing file name.",
                                     filename, linenum);                                      filename, linenum);
                                 exit(1);  
                         }  
                         if (*charptr == NULL) {                          if (*charptr == NULL) {
                                 *charptr = tilde_expand_filename(arg, getuid());                                  *charptr = tilde_expand_filename(arg, getuid());
                                 /* increase optional counter */                                  /* increase optional counter */
Line 441 
Line 494 
                 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')
                                 fprintf(stderr, "%s line %d: missing yes/"                                  fatal("%s line %d: missing yes/"
                                     "without-password/forced-commands-only/no "                                      "without-password/forced-commands-only/no "
                                     "argument.\n", filename, linenum);                                      "argument.", filename, linenum);
                                 exit(1);                          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)
Line 455 
Line 507 
                                 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
                                 fprintf(stderr, "%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\n", filename, linenum, arg);                                      "argument: %s", filename, linenum, arg);
                                 exit(1);  
                         }  
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
                         break;                          break;
Line 469 
Line 519 
                         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')
                                 fprintf(stderr, "%s line %d: missing yes/no argument.\n",                                  fatal("%s line %d: missing yes/no argument.",
                                         filename, linenum);                                      filename, linenum);
                                 exit(1);                          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
                                 fprintf(stderr, "%s line %d: Bad yes/no argument: %s\n",                                  fatal("%s line %d: Bad yes/no argument: %s",
                                         filename, linenum, arg);                                          filename, linenum, arg);
                                 exit(1);  
                         }  
                         if (*intptr == -1)                          if (*intptr == -1)
                                 *intptr = value;                                  *intptr = value;
                         break;                          break;
Line 499 
Line 546 
                         intptr = &options->rhosts_rsa_authentication;                          intptr = &options->rhosts_rsa_authentication;
                         goto parse_flag;                          goto parse_flag;
   
                   case sHostbasedAuthentication:
                           intptr = &options->hostbased_authentication;
                           goto parse_flag;
   
                   case sHostbasedUsesNameFromPacketOnly:
                           intptr = &options->hostbased_uses_name_from_packet_only;
                           goto parse_flag;
   
                 case sRSAAuthentication:                  case sRSAAuthentication:
                         intptr = &options->rsa_authentication;                          intptr = &options->rsa_authentication;
                         goto parse_flag;                          goto parse_flag;
Line 551 
Line 606 
                         intptr = &options->print_motd;                          intptr = &options->print_motd;
                         goto parse_flag;                          goto parse_flag;
   
                   case sPrintLastLog:
                           intptr = &options->print_lastlog;
                           goto parse_flag;
   
                 case sX11Forwarding:                  case sX11Forwarding:
                         intptr = &options->x11_forwarding;                          intptr = &options->x11_forwarding;
                         goto parse_flag;                          goto parse_flag;
Line 729 
Line 788 
                 case sBanner:                  case sBanner:
                         charptr = &options->banner;                          charptr = &options->banner;
                         goto parse_filename;                          goto parse_filename;
                   case sClientAliveInterval:
                           intptr = &options->client_alive_interval;
                           goto parse_int;
                   case sClientAliveCountMax:
                           intptr = &options->client_alive_count_max;
                           goto parse_int;
                 default:                  default:
                         fprintf(stderr, "%s line %d: Missing handler for opcode %s (%d)\n",                          fatal("%s line %d: Missing handler for opcode %s (%d)",
                                 filename, linenum, arg, opcode);                              filename, linenum, arg, opcode);
                         exit(1);  
                 }                  }
                 if ((arg = strdelim(&cp)) != NULL && *arg != '\0') {                  if ((arg = strdelim(&cp)) != NULL && *arg != '\0')
                         fprintf(stderr,                          fatal("%s line %d: garbage at end of line; \"%.200s\".",
                                 "%s line %d: garbage at end of line; \"%.200s\".\n",                              filename, linenum, arg);
                                 filename, linenum, arg);  
                         exit(1);  
                 }  
         }          }
         fclose(f);          fclose(f);
         if (bad_options > 0) {          if (bad_options > 0)
                 fprintf(stderr, "%s: terminating, %d bad configuration options\n",                  fatal("%s: terminating, %d bad configuration options",
                         filename, bad_options);                      filename, bad_options);
                 exit(1);  
         }  
 }  }

Legend:
Removed from v.1.53.2.3  
changed lines
  Added in v.1.53.2.4