]> andersk Git - openssh.git/blobdiff - readconf.c
- markus@cvs.openbsd.org 2001/02/06 22:43:02
[openssh.git] / readconf.c
index f31b1c4e65380f50819cbac4021c606bd0d0f6a7..e3a1dd742267843ce6f0b98fae7a0cd25fe4ef03 100644 (file)
@@ -1,27 +1,28 @@
 /*
- *
- * readconf.c
- *
  * Author: Tatu Ylonen <ylo@cs.hut.fi>
- *
  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
  *                    All rights reserved
- *
- * Created: Sat Apr 22 00:03:10 1995 ylo
- *
  * 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"
-RCSID("$OpenBSD: readconf.c,v 1.45 2000/08/02 17:27:04 provos Exp $");
+RCSID("$OpenBSD: readconf.c,v 1.60 2001/01/28 20:36:16 stevesk Exp $");
 
 #include "ssh.h"
+#include "xmalloc.h"
+#include "compat.h"
 #include "cipher.h"
+#include "pathnames.h"
+#include "log.h"
 #include "readconf.h"
 #include "match.h"
-#include "xmalloc.h"
-#include "compat.h"
+#include "misc.h"
 
 /* Format of the configuration file:
 
@@ -71,7 +72,7 @@ RCSID("$OpenBSD: readconf.c,v 1.45 2000/08/02 17:27:04 provos Exp $");
    # Defaults for various options
    Host *
      ForwardAgent no
-     ForwardX11 yes
+     ForwardX11 no
      RhostsAuthentication yes
      PasswordAuthentication yes
      RSAAuthentication yes
@@ -92,7 +93,7 @@ typedef enum {
        oBadOption,
        oForwardAgent, oForwardX11, oGatewayPorts, oRhostsAuthentication,
        oPasswordAuthentication, oRSAAuthentication, oFallBackToRsh, oUseRsh,
-       oSkeyAuthentication, oXAuthLocation,
+       oChallengeResponseAuthentication, oXAuthLocation,
 #ifdef KRB4
        oKerberosAuthentication,
 #endif /* KRB4 */
@@ -103,9 +104,10 @@ typedef enum {
        oUser, oHost, oEscapeChar, oRhostsRSAAuthentication, oProxyCommand,
        oGlobalKnownHostsFile, oUserKnownHostsFile, oConnectionAttempts,
        oBatchMode, oCheckHostIP, oStrictHostKeyChecking, oCompression,
-       oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts, oTISAuthentication,
-       oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol, oIdentityFile2,
-       oGlobalKnownHostsFile2, oUserKnownHostsFile2, oDSAAuthentication
+       oCompressionLevel, oKeepAlives, oNumberOfPasswordPrompts,
+       oUsePrivilegedPort, oLogLevel, oCiphers, oProtocol,
+       oGlobalKnownHostsFile2, oUserKnownHostsFile2, oPubkeyAuthentication,
+       oKbdInteractiveAuthentication, oKbdInteractiveDevices, oHostKeyAlias
 } OpCodes;
 
 /* Textual representations of the tokens. */
@@ -121,9 +123,14 @@ static struct {
        { "useprivilegedport", oUsePrivilegedPort },
        { "rhostsauthentication", oRhostsAuthentication },
        { "passwordauthentication", oPasswordAuthentication },
+       { "kbdinteractiveauthentication", oKbdInteractiveAuthentication },
+       { "kbdinteractivedevices", oKbdInteractiveDevices },
        { "rsaauthentication", oRSAAuthentication },
-       { "dsaauthentication", oDSAAuthentication },
-       { "skeyauthentication", oSkeyAuthentication },
+       { "pubkeyauthentication", oPubkeyAuthentication },
+       { "dsaauthentication", oPubkeyAuthentication },             /* alias */
+       { "challengeresponseauthentication", oChallengeResponseAuthentication },
+       { "skeyauthentication", oChallengeResponseAuthentication }, /* alias */
+       { "tisauthentication", oChallengeResponseAuthentication },  /* alias */
 #ifdef KRB4
        { "kerberosauthentication", oKerberosAuthentication },
 #endif /* KRB4 */
@@ -134,8 +141,9 @@ static struct {
        { "fallbacktorsh", oFallBackToRsh },
        { "usersh", oUseRsh },
        { "identityfile", oIdentityFile },
-       { "identityfile2", oIdentityFile2 },
+       { "identityfile2", oIdentityFile },                     /* alias */
        { "hostname", oHostName },
+       { "hostkeyalias", oHostKeyAlias },
        { "proxycommand", oProxyCommand },
        { "port", oPort },
        { "cipher", oCipher },
@@ -159,7 +167,6 @@ static struct {
        { "compressionlevel", oCompressionLevel },
        { "keepalive", oKeepAlives },
        { "numberofpasswordprompts", oNumberOfPasswordPrompts },
-       { "tisauthentication", oTISAuthentication },
        { "loglevel", oLogLevel },
        { NULL, 0 }
 };
@@ -174,9 +181,11 @@ add_local_forward(Options *options, u_short port, const char *host,
                  u_short host_port)
 {
        Forward *fwd;
+#ifndef HAVE_CYGWIN
        extern uid_t original_real_uid;
        if (port < IPPORT_RESERVED && original_real_uid != 0)
                fatal("Privileged ports can only be forwarded by root.\n");
+#endif
        if (options->num_local_forwards >= SSH_MAX_FORWARDS_PER_DIRECTION)
                fatal("Too many local forwards (max %d).", SSH_MAX_FORWARDS_PER_DIRECTION);
        fwd = &options->local_forwards[options->num_local_forwards++];
@@ -212,7 +221,7 @@ add_remote_forward(Options *options, u_short port, const char *host,
 static OpCodes
 parse_token(const char *cp, const char *filename, int linenum)
 {
-       unsigned int i;
+       u_int i;
 
        for (i = 0; keywords[i].name; i++)
                if (strcasecmp(cp, keywords[i].name) == 0)
@@ -243,7 +252,7 @@ process_config_line(Options *options, const char *host,
        /* Ignore leading whitespace. */
        if (*keyword == '\0')
                keyword = strdelim(&s);
-       if (!*keyword || *keyword == '\n' || *keyword == '#')
+       if (keyword == NULL || !*keyword || *keyword == '\n' || *keyword == '#')
                return 0;
 
        opcode = parse_token(keyword, filename, linenum);
@@ -290,8 +299,16 @@ parse_flag:
                intptr = &options->password_authentication;
                goto parse_flag;
 
-       case oDSAAuthentication:
-               intptr = &options->dsa_authentication;
+       case oKbdInteractiveAuthentication:
+               intptr = &options->kbd_interactive_authentication;
+               goto parse_flag;
+
+       case oKbdInteractiveDevices:
+               charptr = &options->kbd_interactive_devices;
+               goto parse_string;
+
+       case oPubkeyAuthentication:
+               intptr = &options->pubkey_authentication;
                goto parse_flag;
 
        case oRSAAuthentication:
@@ -302,10 +319,8 @@ parse_flag:
                intptr = &options->rhosts_rsa_authentication;
                goto parse_flag;
 
-       case oTISAuthentication:
-               /* fallthrough, there is no difference on the client side */
-       case oSkeyAuthentication:
-               intptr = &options->skey_authentication;
+       case oChallengeResponseAuthentication:
+               intptr = &options->challenge_reponse_authentication;
                goto parse_flag;
 
 #ifdef KRB4
@@ -344,7 +359,7 @@ parse_flag:
                intptr = &options->strict_host_key_checking;
                arg = strdelim(&s);
                if (!arg || *arg == '\0')
-                       fatal("%.200s line %d: Missing yes/no argument.",
+                       fatal("%.200s line %d: Missing yes/no/ask argument.",
                              filename, linenum);
                value = 0;      /* To avoid compiler warning... */
                if (strcmp(arg, "yes") == 0 || strcmp(arg, "true") == 0)
@@ -376,20 +391,15 @@ parse_flag:
                goto parse_int;
 
        case oIdentityFile:
-       case oIdentityFile2:
                arg = strdelim(&s);
                if (!arg || *arg == '\0')
                        fatal("%.200s line %d: Missing argument.", filename, linenum);
                if (*activep) {
-                       intptr = (opcode == oIdentityFile) ?
-                           &options->num_identity_files :
-                           &options->num_identity_files2;
+                       intptr = &options->num_identity_files;
                        if (*intptr >= SSH_MAX_IDENTITY_FILES)
                                fatal("%.200s line %d: Too many identity files specified (max %d).",
                                      filename, linenum, SSH_MAX_IDENTITY_FILES);
-                       charptr = (opcode == oIdentityFile) ?
-                           &options->identity_files[*intptr] :
-                           &options->identity_files2[*intptr];
+                       charptr =  &options->identity_files[*intptr];
                        *charptr = xstrdup(arg);
                        *intptr = *intptr + 1;
                }
@@ -429,6 +439,10 @@ parse_string:
                charptr = &options->hostname;
                goto parse_string;
 
+       case oHostKeyAlias:
+               charptr = &options->host_key_alias;
+               goto parse_string;
+
        case oProxyCommand:
                charptr = &options->proxy_command;
                string = xstrdup("");
@@ -567,10 +581,10 @@ parse_int:
                if (!arg || *arg == '\0')
                        fatal("%.200s line %d: Missing argument.", filename, linenum);
                if (arg[0] == '^' && arg[2] == 0 &&
-                   (unsigned char) arg[1] >= 64 && (unsigned char) arg[1] < 128)
-                       value = (unsigned char) arg[1] & 31;
+                   (u_char) arg[1] >= 64 && (u_char) arg[1] < 128)
+                       value = (u_char) arg[1] & 31;
                else if (strlen(arg) == 1)
-                       value = (unsigned char) arg[0];
+                       value = (u_char) arg[0];
                else if (strcmp(arg, "none") == 0)
                        value = -2;
                else {
@@ -588,8 +602,7 @@ parse_int:
        }
 
        /* Check that there is no garbage at end of line. */
-       if ((arg = strdelim(&s)) != NULL && *arg != '\0')
-       {
+       if ((arg = strdelim(&s)) != NULL && *arg != '\0') {
                fatal("%.200s line %d: garbage at end of line; \"%.200s\".",
                      filename, linenum, arg);
        }
@@ -654,8 +667,8 @@ initialize_options(Options * options)
        options->use_privileged_port = -1;
        options->rhosts_authentication = -1;
        options->rsa_authentication = -1;
-       options->dsa_authentication = -1;
-       options->skey_authentication = -1;
+       options->pubkey_authentication = -1;
+       options->challenge_reponse_authentication = -1;
 #ifdef KRB4
        options->kerberos_authentication = -1;
 #endif
@@ -664,6 +677,8 @@ initialize_options(Options * options)
        options->afs_token_passing = -1;
 #endif
        options->password_authentication = -1;
+       options->kbd_interactive_authentication = -1;
+       options->kbd_interactive_devices = NULL;
        options->rhosts_rsa_authentication = -1;
        options->fallback_to_rsh = -1;
        options->use_rsh = -1;
@@ -680,8 +695,8 @@ initialize_options(Options * options)
        options->ciphers = NULL;
        options->protocol = SSH_PROTO_UNKNOWN;
        options->num_identity_files = 0;
-       options->num_identity_files2 = 0;
        options->hostname = NULL;
+       options->host_key_alias = NULL;
        options->proxy_command = NULL;
        options->user = NULL;
        options->escape_char = -1;
@@ -718,10 +733,10 @@ fill_default_options(Options * options)
                options->rhosts_authentication = 1;
        if (options->rsa_authentication == -1)
                options->rsa_authentication = 1;
-       if (options->dsa_authentication == -1)
-               options->dsa_authentication = 1;
-       if (options->skey_authentication == -1)
-               options->skey_authentication = 0;
+       if (options->pubkey_authentication == -1)
+               options->pubkey_authentication = 1;
+       if (options->challenge_reponse_authentication == -1)
+               options->challenge_reponse_authentication = 0;
 #ifdef KRB4
        if (options->kerberos_authentication == -1)
                options->kerberos_authentication = 1;
@@ -734,6 +749,8 @@ fill_default_options(Options * options)
 #endif /* AFS */
        if (options->password_authentication == -1)
                options->password_authentication = 1;
+       if (options->kbd_interactive_authentication == -1)
+               options->kbd_interactive_authentication = 1;
        if (options->rhosts_rsa_authentication == -1)
                options->rhosts_rsa_authentication = 1;
        if (options->fallback_to_rsh == -1)
@@ -765,30 +782,33 @@ fill_default_options(Options * options)
        if (options->protocol == SSH_PROTO_UNKNOWN)
                options->protocol = SSH_PROTO_1|SSH_PROTO_2|SSH_PROTO_1_PREFERRED;
        if (options->num_identity_files == 0) {
-               options->identity_files[0] =
-                       xmalloc(2 + strlen(SSH_CLIENT_IDENTITY) + 1);
-               sprintf(options->identity_files[0], "~/%.100s", SSH_CLIENT_IDENTITY);
-               options->num_identity_files = 1;
-       }
-       if (options->num_identity_files2 == 0) {
-               options->identity_files2[0] =
-                       xmalloc(2 + strlen(SSH_CLIENT_ID_DSA) + 1);
-               sprintf(options->identity_files2[0], "~/%.100s", SSH_CLIENT_ID_DSA);
-               options->num_identity_files2 = 1;
+               if (options->protocol & SSH_PROTO_1) {
+                       options->identity_files[options->num_identity_files] =
+                           xmalloc(2 + strlen(_PATH_SSH_CLIENT_IDENTITY) + 1);
+                       sprintf(options->identity_files[options->num_identity_files++],
+                           "~/%.100s", _PATH_SSH_CLIENT_IDENTITY);
+               }
+               if (options->protocol & SSH_PROTO_2) {
+                       options->identity_files[options->num_identity_files] =
+                           xmalloc(2 + strlen(_PATH_SSH_CLIENT_ID_DSA) + 1);
+                       sprintf(options->identity_files[options->num_identity_files++],
+                           "~/%.100s", _PATH_SSH_CLIENT_ID_DSA);
+               }
        }
        if (options->escape_char == -1)
                options->escape_char = '~';
        if (options->system_hostfile == NULL)
-               options->system_hostfile = SSH_SYSTEM_HOSTFILE;
+               options->system_hostfile = _PATH_SSH_SYSTEM_HOSTFILE;
        if (options->user_hostfile == NULL)
-               options->user_hostfile = SSH_USER_HOSTFILE;
+               options->user_hostfile = _PATH_SSH_USER_HOSTFILE;
        if (options->system_hostfile2 == NULL)
-               options->system_hostfile2 = SSH_SYSTEM_HOSTFILE2;
+               options->system_hostfile2 = _PATH_SSH_SYSTEM_HOSTFILE2;
        if (options->user_hostfile2 == NULL)
-               options->user_hostfile2 = SSH_USER_HOSTFILE2;
+               options->user_hostfile2 = _PATH_SSH_USER_HOSTFILE2;
        if (options->log_level == (LogLevel) - 1)
                options->log_level = SYSLOG_LEVEL_INFO;
        /* options->proxy_command should not be set by default */
        /* options->user will be set in the main program if appropriate */
        /* options->hostname will be set in the main program if appropriate */
+       /* options->host_key_alias should not be set by default */
 }
This page took 0.078777 seconds and 4 git commands to generate.