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

Diff for /src/usr.bin/ssh/readconf.c between version 1.31 and 1.31.2.3

version 1.31, 2000/05/08 17:12:15 version 1.31.2.3, 2000/11/08 21:31:07
Line 1 
Line 1 
 /*  /*
  *  
  * readconf.c  
  *  
  * Author: Tatu Ylonen <ylo@cs.hut.fi>   * Author: Tatu Ylonen <ylo@cs.hut.fi>
  *  
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland   * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved   *                    All rights reserved
  *  
  * Created: Sat Apr 22 00:03:10 1995 ylo  
  *  
  * Functions for reading the configuration files.   * Functions for reading the configuration files.
  *   *
    * As far as I am concerned, the code I have written for this software
    * can be used freely for any purpose.  Any derived versions of this
    * software must be clearly marked as such, and if the derived work is
    * incompatible with the protocol description in the RFC file, it must be
    * called by a name other than "ssh" or "Secure Shell".
  */   */
   
 #include "includes.h"  #include "includes.h"
 RCSID("$Id$");  RCSID("$OpenBSD$");
   
 #include "ssh.h"  #include "ssh.h"
 #include "cipher.h"  
 #include "readconf.h"  #include "readconf.h"
 #include "match.h"  #include "match.h"
 #include "xmalloc.h"  #include "xmalloc.h"
Line 92 
Line 89 
         oBadOption,          oBadOption,
         oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,          oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,
         oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,          oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,
         oSkeyAuthentication,          oSkeyAuthentication, oXAuthLocation,
 #ifdef KRB4  #ifdef KRB4
         oKerberosAuthentication,          oKerberosAuthentication,
 #endif /* KRB4 */  #endif /* KRB4 */
Line 105 
Line 102 
         oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,          oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
         oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,          oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,
         oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oIdentityFile2,          oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oIdentityFile2,
         oGlobalKnownHostsFile2, oUserKnownHostsFile2, oDSAAuthentication          oGlobalKnownHostsFile2, oUserKnownHostsFile2, oDSAAuthentication,
           oKbdInteractiveAuthentication, oKbdInteractiveDevices
 } OpCodes;  } OpCodes;
   
 /* Textual representations of the tokens. */  /* Textual representations of the tokens. */
Line 116 
Line 114 
 } keywords[] = {  } keywords[] = {
         { "forwardagent", oForwardAgent },          { "forwardagent", oForwardAgent },
         { "forwardx11", oForwardX11 },          { "forwardx11", oForwardX11 },
           { "xauthlocation", oXAuthLocation },
         { "gatewayports", oGatewayPorts },          { "gatewayports", oGatewayPorts },
         { "useprivilegedport", oUsePrivilegedPort },          { "useprivilegedport", oUsePrivilegedPort },
         { "rhostsauthentication", oRhostsAuthentication },          { "rhostsauthentication", oRhostsAuthentication },
         { "passwordauthentication", oPasswordAuthentication },          { "passwordauthentication", oPasswordAuthentication },
           { "kbdinteractiveauthentication", oKbdInteractiveAuthentication },
           { "kbdinteractivedevices", oKbdInteractiveDevices },
         { "rsaauthentication", oRSAAuthentication },          { "rsaauthentication", oRSAAuthentication },
         { "dsaauthentication", oDSAAuthentication },          { "dsaauthentication", oDSAAuthentication },
         { "skeyauthentication", oSkeyAuthentication },          { "skeyauthentication", oSkeyAuthentication },
Line 163 
Line 164 
         { NULL, 0 }          { NULL, 0 }
 };  };
   
 /* Characters considered whitespace in strtok calls. */  
 #define WHITESPACE " \t\r\n"  
   
   
 /*  /*
  * Adds a local TCP/IP port forward to options.  Never returns if there is an   * Adds a local TCP/IP port forward to options.  Never returns if there is an
  * error.   * error.
Line 236 
Line 233 
                     char *line, const char *filename, int linenum,                      char *line, const char *filename, int linenum,
                     int *activep)                      int *activep)
 {  {
         char buf[256], *cp, *string, **charptr, *cp2;          char buf[256], *s, *string, **charptr, *endofnumber, *keyword, *arg;
         int opcode, *intptr, value;          int opcode, *intptr, value;
         u_short fwd_port, fwd_host_port;          u_short fwd_port, fwd_host_port;
   
         /* Skip leading whitespace. */          s = line;
         cp = line + strspn(line, WHITESPACE);          /* Get the keyword. (Each line is supposed to begin with a keyword). */
         if (!*cp || *cp == '\n' || *cp == '#')          keyword = strdelim(&s);
           /* Ignore leading whitespace. */
           if (*keyword == '\0')
                   keyword = strdelim(&s);
           if (!*keyword || *keyword == '\n' || *keyword == '#')
                 return 0;                  return 0;
   
         /* Get the keyword. (Each line is supposed to begin with a keyword). */          opcode = parse_token(keyword, filename, linenum);
         cp = strtok(cp, WHITESPACE);  
         opcode = parse_token(cp, filename, linenum);  
   
         switch (opcode) {          switch (opcode) {
         case oBadOption:          case oBadOption:
Line 257 
Line 256 
         case oForwardAgent:          case oForwardAgent:
                 intptr = &options->forward_agent;                  intptr = &options->forward_agent;
 parse_flag:  parse_flag:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);                          fatal("%.200s line %d: Missing yes/no argument.", filename, linenum);
                 value = 0;      /* To avoid compiler warning... */                  value = 0;      /* To avoid compiler warning... */
                 if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)                  if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)
                         value = 1;                          value = 1;
                 else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)                  else if (strcmp(arg, "no") == 0 || strcmp(arg, "false") == 0)
                         value = 0;                          value = 0;
                 else                  else
                         fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);                          fatal("%.200s line %d: Bad yes/no argument.", filename, linenum);
Line 291 
Line 290 
                 intptr = &options->password_authentication;                  intptr = &options->password_authentication;
                 goto parse_flag;                  goto parse_flag;
   
           case oKbdInteractiveAuthentication:
                   intptr = &options->kbd_interactive_authentication;
                   goto parse_flag;
   
           case oKbdInteractiveDevices:
                   charptr = &options->kbd_interactive_devices;
                   goto parse_string;
   
         case oDSAAuthentication:          case oDSAAuthentication:
                 intptr = &options->dsa_authentication;                  intptr = &options->dsa_authentication;
                 goto parse_flag;                  goto parse_flag;
Line 343 
Line 350 
   
         case oStrictHostKeyChecking:          case oStrictHostKeyChecking:
                 intptr = &options->strict_host_key_checking;                  intptr = &options->strict_host_key_checking;
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing yes/no argument.",                          fatal("%.200s line %d: Missing yes/no argument.",
                               filename, linenum);                                filename, linenum);
                 value = 0;      /* To avoid compiler warning... */                  value = 0;      /* To avoid compiler warning... */
                 if (strcmp(cp, "yes") == 0 || strcmp(cp, "true") == 0)                  if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)
                         value = 1;                          value = 1;
                 else if (strcmp(cp, "no") == 0 || strcmp(cp, "false") == 0)                  else if (strcmp(arg, "no") == 0 || strcmp(arg, "false") == 0)
                         value = 0;                          value = 0;
                 else if (strcmp(cp, "ask") == 0)                  else if (strcmp(arg, "ask") == 0)
                         value = 2;                          value = 2;
                 else                  else
                         fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);                          fatal("%.200s line %d: Bad yes/no/ask argument.", filename, linenum);
Line 378 
Line 385 
   
         case oIdentityFile:          case oIdentityFile:
         case oIdentityFile2:          case oIdentityFile2:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (*activep) {                  if (*activep) {
                         intptr = (opcode == oIdentityFile) ?                          intptr = (opcode == oIdentityFile) ?
Line 391 
Line 398 
                         charptr = (opcode == oIdentityFile) ?                          charptr = (opcode == oIdentityFile) ?
                             &options->identity_files[*intptr] :                              &options->identity_files[*intptr] :
                             &options->identity_files2[*intptr];                              &options->identity_files2[*intptr];
                         *charptr = xstrdup(cp);                          *charptr = xstrdup(arg);
                         *intptr = *intptr + 1;                          *intptr = *intptr + 1;
                 }                  }
                 break;                  break;
   
           case oXAuthLocation:
                   charptr=&options->xauth_location;
                   goto parse_string;
   
         case oUser:          case oUser:
                 charptr = &options->user;                  charptr = &options->user;
 parse_string:  parse_string:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (*activep && *charptr == NULL)                  if (*activep && *charptr == NULL)
                         *charptr = xstrdup(cp);                          *charptr = xstrdup(arg);
                 break;                  break;
   
         case oGlobalKnownHostsFile:          case oGlobalKnownHostsFile:
Line 429 
Line 440 
         case oProxyCommand:          case oProxyCommand:
                 charptr = &options->proxy_command;                  charptr = &options->proxy_command;
                 string = xstrdup("");                  string = xstrdup("");
                 while ((cp = strtok(NULL, WHITESPACE)) != NULL) {                  while ((arg = strdelim(&s)) != NULL && *arg != '\0') {
                         string = xrealloc(string, strlen(string) + strlen(cp) + 2);                          string = xrealloc(string, strlen(string) + strlen(arg) + 2);
                         strcat(string, " ");                          strcat(string, " ");
                         strcat(string, cp);                          strcat(string, arg);
                 }                  }
                 if (*activep && *charptr == NULL)                  if (*activep && *charptr == NULL)
                         *charptr = string;                          *charptr = string;
Line 443 
Line 454 
         case oPort:          case oPort:
                 intptr = &options->port;                  intptr = &options->port;
 parse_int:  parse_int:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (cp[0] < '0' || cp[0] > '9')                  if (arg[0] < '0' || arg[0] > '9')
                         fatal("%.200s line %d: Bad number.", filename, linenum);                          fatal("%.200s line %d: Bad number.", filename, linenum);
   
                 /* Octal, decimal, or hex format? */                  /* Octal, decimal, or hex format? */
                 value = strtol(cp, &cp2, 0);                  value = strtol(arg, &endofnumber, 0);
                 if (cp == cp2)                  if (arg == endofnumber)
                         fatal("%.200s line %d: Bad number.", filename, linenum);                          fatal("%.200s line %d: Bad number.", filename, linenum);
                 if (*activep && *intptr == -1)                  if (*activep && *intptr == -1)
                         *intptr = value;                          *intptr = value;
Line 463 
Line 474 
   
         case oCipher:          case oCipher:
                 intptr = &options->cipher;                  intptr = &options->cipher;
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 value = cipher_number(cp);                  if (!arg || *arg == '\0')
                           fatal("%.200s line %d: Missing argument.", filename, linenum);
                   value = cipher_number(arg);
                 if (value == -1)                  if (value == -1)
                         fatal("%.200s line %d: Bad cipher '%s'.",                          fatal("%.200s line %d: Bad cipher '%s'.",
                               filename, linenum, cp ? cp : "<NONE>");                                filename, linenum, arg ? arg : "<NONE>");
                 if (*activep && *intptr == -1)                  if (*activep && *intptr == -1)
                         *intptr = value;                          *intptr = value;
                 break;                  break;
   
         case oCiphers:          case oCiphers:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!ciphers_valid(cp))                  if (!arg || *arg == '\0')
                           fatal("%.200s line %d: Missing argument.", filename, linenum);
                   if (!ciphers_valid(arg))
                         fatal("%.200s line %d: Bad SSH2 cipher spec '%s'.",                          fatal("%.200s line %d: Bad SSH2 cipher spec '%s'.",
                               filename, linenum, cp ? cp : "<NONE>");                                filename, linenum, arg ? arg : "<NONE>");
                 if (*activep && options->ciphers == NULL)                  if (*activep && options->ciphers == NULL)
                         options->ciphers = xstrdup(cp);                          options->ciphers = xstrdup(arg);
                 break;                  break;
   
         case oProtocol:          case oProtocol:
                 intptr = &options->protocol;                  intptr = &options->protocol;
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 value = proto_spec(cp);                  if (!arg || *arg == '\0')
                           fatal("%.200s line %d: Missing argument.", filename, linenum);
                   value = proto_spec(arg);
                 if (value == SSH_PROTO_UNKNOWN)                  if (value == SSH_PROTO_UNKNOWN)
                         fatal("%.200s line %d: Bad protocol spec '%s'.",                          fatal("%.200s line %d: Bad protocol spec '%s'.",
                               filename, linenum, cp ? cp : "<NONE>");                                filename, linenum, arg ? arg : "<NONE>");
                 if (*activep && *intptr == SSH_PROTO_UNKNOWN)                  if (*activep && *intptr == SSH_PROTO_UNKNOWN)
                         *intptr = value;                          *intptr = value;
                 break;                  break;
   
         case oLogLevel:          case oLogLevel:
                 intptr = (int *) &options->log_level;                  intptr = (int *) &options->log_level;
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 value = log_level_number(cp);                  value = log_level_number(arg);
                 if (value == (LogLevel) - 1)                  if (value == (LogLevel) - 1)
                         fatal("%.200s line %d: unsupported log level '%s'\n",                          fatal("%.200s line %d: unsupported log level '%s'\n",
                               filename, linenum, cp ? cp : "<NONE>");                                filename, linenum, arg ? arg : "<NONE>");
                 if (*activep && (LogLevel) * intptr == -1)                  if (*activep && (LogLevel) * intptr == -1)
                         *intptr = (LogLevel) value;                          *intptr = (LogLevel) value;
                 break;                  break;
   
         case oRemoteForward:          case oRemoteForward:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (cp[0] < '0' || cp[0] > '9')                  if (arg[0] < '0' || arg[0] > '9')
                         fatal("%.200s line %d: Badly formatted port number.",                          fatal("%.200s line %d: Badly formatted port number.",
                               filename, linenum);                                filename, linenum);
                 fwd_port = atoi(cp);                  fwd_port = atoi(arg);
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing second argument.",                          fatal("%.200s line %d: Missing second argument.",
                               filename, linenum);                                filename, linenum);
                 if (sscanf(cp, "%255[^:]:%hu", buf, &fwd_host_port) != 2)                  if (sscanf(arg, "%255[^:]:%hu", buf, &fwd_host_port) != 2)
                         fatal("%.200s line %d: Badly formatted host:port.",                          fatal("%.200s line %d: Badly formatted host:port.",
                               filename, linenum);                                filename, linenum);
                 if (*activep)                  if (*activep)
Line 523 
Line 540 
                 break;                  break;
   
         case oLocalForward:          case oLocalForward:
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (cp[0] < '0' || cp[0] > '9')                  if (arg[0] < '0' || arg[0] > '9')
                         fatal("%.200s line %d: Badly formatted port number.",                          fatal("%.200s line %d: Badly formatted port number.",
                               filename, linenum);                                filename, linenum);
                 fwd_port = atoi(cp);                  fwd_port = atoi(arg);
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing second argument.",                          fatal("%.200s line %d: Missing second argument.",
                               filename, linenum);                                filename, linenum);
                 if (sscanf(cp, "%255[^:]:%hu", buf, &fwd_host_port) != 2)                  if (sscanf(arg, "%255[^:]:%hu", buf, &fwd_host_port) != 2)
                         fatal("%.200s line %d: Badly formatted host:port.",                          fatal("%.200s line %d: Badly formatted host:port.",
                               filename, linenum);                                filename, linenum);
                 if (*activep)                  if (*activep)
Line 543 
Line 560 
   
         case oHost:          case oHost:
                 *activep = 0;                  *activep = 0;
                 while ((cp = strtok(NULL, WHITESPACE)) != NULL)                  while ((arg = strdelim(&s)) != NULL && *arg != '\0')
                         if (match_pattern(host, cp)) {                          if (match_pattern(host, arg)) {
                                 debug("Applying options for %.100s", cp);                                  debug("Applying options for %.100s", arg);
                                 *activep = 1;                                  *activep = 1;
                                 break;                                  break;
                         }                          }
                 /* Avoid garbage check below, as strtok already returned NULL. */                  /* Avoid garbage check below, as strdelim is done. */
                 return 0;                  return 0;
   
         case oEscapeChar:          case oEscapeChar:
                 intptr = &options->escape_char;                  intptr = &options->escape_char;
                 cp = strtok(NULL, WHITESPACE);                  arg = strdelim(&s);
                 if (!cp)                  if (!arg || *arg == '\0')
                         fatal("%.200s line %d: Missing argument.", filename, linenum);                          fatal("%.200s line %d: Missing argument.", filename, linenum);
                 if (cp[0] == '^' && cp[2] == 0 &&                  if (arg[0] == '^' && arg[2] == 0 &&
                     (unsigned char) cp[1] >= 64 && (unsigned char) cp[1] < 128)                      (unsigned char) arg[1] >= 64 && (unsigned char) arg[1] < 128)
                         value = (unsigned char) cp[1] & 31;                          value = (unsigned char) arg[1] & 31;
                 else if (strlen(cp) == 1)                  else if (strlen(arg) == 1)
                         value = (unsigned char) cp[0];                          value = (unsigned char) arg[0];
                 else if (strcmp(cp, "none") == 0)                  else if (strcmp(arg, "none") == 0)
                         value = -2;                          value = -2;
                 else {                  else {
                         fatal("%.200s line %d: Bad escape character.",                          fatal("%.200s line %d: Bad escape character.",
Line 579 
Line 596 
         }          }
   
         /* Check that there is no garbage at end of line. */          /* Check that there is no garbage at end of line. */
         if (strtok(NULL, WHITESPACE) != NULL)          if ((arg = strdelim(&s)) != NULL && *arg != '\0')
                 fatal("%.200s line %d: garbage at end of line.",          {
                       filename, linenum);                  fatal("%.200s line %d: garbage at end of line; \"%.200s\".",
                         filename, linenum, arg);
           }
         return 0;          return 0;
 }  }
   
Line 638 
Line 657 
         memset(options, 'X', sizeof(*options));          memset(options, 'X', sizeof(*options));
         options->forward_agent = -1;          options->forward_agent = -1;
         options->forward_x11 = -1;          options->forward_x11 = -1;
           options->xauth_location = NULL;
         options->gateway_ports = -1;          options->gateway_ports = -1;
         options->use_privileged_port = -1;          options->use_privileged_port = -1;
         options->rhosts_authentication = -1;          options->rhosts_authentication = -1;
Line 652 
Line 672 
         options->afs_token_passing = -1;          options->afs_token_passing = -1;
 #endif  #endif
         options->password_authentication = -1;          options->password_authentication = -1;
           options->kbd_interactive_authentication = -1;
           options->kbd_interactive_devices = NULL;
         options->rhosts_rsa_authentication = -1;          options->rhosts_rsa_authentication = -1;
         options->fallback_to_rsh = -1;          options->fallback_to_rsh = -1;
         options->use_rsh = -1;          options->use_rsh = -1;
Line 691 
Line 713 
 fill_default_options(Options * options)  fill_default_options(Options * options)
 {  {
         if (options->forward_agent == -1)          if (options->forward_agent == -1)
                 options->forward_agent = 1;                  options->forward_agent = 0;
         if (options->forward_x11 == -1)          if (options->forward_x11 == -1)
                 options->forward_x11 = 0;                  options->forward_x11 = 0;
   #ifdef XAUTH_PATH
           if (options->xauth_location == NULL)
                   options->xauth_location = XAUTH_PATH;
   #endif /* XAUTH_PATH */
         if (options->gateway_ports == -1)          if (options->gateway_ports == -1)
                 options->gateway_ports = 0;                  options->gateway_ports = 0;
         if (options->use_privileged_port == -1)          if (options->use_privileged_port == -1)
Line 718 
Line 744 
 #endif /* AFS */  #endif /* AFS */
         if (options->password_authentication == -1)          if (options->password_authentication == -1)
                 options->password_authentication = 1;                  options->password_authentication = 1;
           if (options->kbd_interactive_authentication == -1)
                   options->kbd_interactive_authentication = 0;
         if (options->rhosts_rsa_authentication == -1)          if (options->rhosts_rsa_authentication == -1)
                 options->rhosts_rsa_authentication = 1;                  options->rhosts_rsa_authentication = 1;
         if (options->fallback_to_rsh == -1)          if (options->fallback_to_rsh == -1)
                 options->fallback_to_rsh = 1;                  options->fallback_to_rsh = 0;
         if (options->use_rsh == -1)          if (options->use_rsh == -1)
                 options->use_rsh = 0;                  options->use_rsh = 0;
         if (options->batch_mode == -1)          if (options->batch_mode == -1)

Legend:
Removed from v.1.31  
changed lines
  Added in v.1.31.2.3