]> andersk Git - openssh.git/blobdiff - auth2.c
- markus@cvs.openbsd.org 2001/12/27 20:39:58
[openssh.git] / auth2.c
diff --git a/auth2.c b/auth2.c
index 1d635d60cbfb46e9924e41e88f53b268dbd762bc..1ad905f18ef4bc4b6f4efbc65bb02617e5ce4451 100644 (file)
--- a/auth2.c
+++ b/auth2.c
@@ -23,7 +23,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: auth2.c,v 1.63 2001/06/22 21:55:49 markus Exp $");
+RCSID("$OpenBSD: auth2.c,v 1.79 2001/12/28 12:14:27 markus Exp $");
 
 #include <openssl/evp.h>
 
@@ -50,7 +50,6 @@ RCSID("$OpenBSD: auth2.c,v 1.63 2001/06/22 21:55:49 markus Exp $");
 #include "misc.h"
 #include "hostfile.h"
 #include "canohost.h"
-#include "tildexpand.h"
 #include "match.h"
 
 /* import */
@@ -58,10 +57,6 @@ extern ServerOptions options;
 extern u_char *session_id2;
 extern int session_id2_len;
 
-#ifdef WITH_AIXAUTHENTICATE
-extern char *aixloginmsg;
-#endif
-
 static Authctxt        *x_authctxt = NULL;
 static int one = 1;
 
@@ -74,25 +69,23 @@ struct Authmethod {
 
 /* protocol */
 
-void   input_service_request(int type, int plen, void *ctxt);
-void   input_userauth_request(int type, int plen, void *ctxt);
-void   protocol_error(int type, int plen, void *ctxt);
+static void input_service_request(int, int, u_int32_t, void *);
+static void input_userauth_request(int, int, u_int32_t, void *);
+static void protocol_error(int, int, u_int32_t, void *);
 
 /* helper */
-Authmethod     *authmethod_lookup(const char *name);
-char   *authmethods_get(void);
-int    user_key_allowed(struct passwd *pw, Key *key);
-int
-hostbased_key_allowed(struct passwd *pw, const char *cuser, char *chost,
-    Key *key);
+static Authmethod *authmethod_lookup(const char *);
+static char *authmethods_get(void);
+static int user_key_allowed(struct passwd *, Key *);
+static int hostbased_key_allowed(struct passwd *, const char *, char *, Key *);
 
 /* auth */
-void   userauth_banner(void);
-int    userauth_none(Authctxt *authctxt);
-int    userauth_passwd(Authctxt *authctxt);
-int    userauth_pubkey(Authctxt *authctxt);
-int    userauth_hostbased(Authctxt *authctxt);
-int    userauth_kbdint(Authctxt *authctxt);
+static void userauth_banner(void);
+static int userauth_none(Authctxt *);
+static int userauth_passwd(Authctxt *);
+static int userauth_pubkey(Authctxt *);
+static int userauth_hostbased(Authctxt *);
+static int userauth_kbdint(Authctxt *);
 
 Authmethod authmethods[] = {
        {"none",
@@ -118,13 +111,13 @@ Authmethod authmethods[] = {
  */
 
 void
-do_authentication2()
+do_authentication2(void)
 {
        Authctxt *authctxt = authctxt_new();
 
        x_authctxt = authctxt;          /*XXX*/
 
-       /* challenge-reponse is implemented via keyboard interactive */
+       /* challenge-response is implemented via keyboard interactive */
        if (options.challenge_response_authentication)
                options.kbd_interactive_authentication = 1;
        if (options.pam_authentication_via_kbd_int)
@@ -136,24 +129,24 @@ do_authentication2()
        do_authenticated(authctxt);
 }
 
-void
-protocol_error(int type, int plen, void *ctxt)
+static void
+protocol_error(int type, int plen, u_int32_t seq, void *ctxt)
 {
        log("auth: protocol error: type %d plen %d", type, plen);
        packet_start(SSH2_MSG_UNIMPLEMENTED);
-       packet_put_int(0);
+       packet_put_int(seq);
        packet_send();
        packet_write_wait();
 }
 
-void
-input_service_request(int type, int plen, void *ctxt)
+static void
+input_service_request(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Authctxt *authctxt = ctxt;
        u_int len;
        int accept = 0;
        char *service = packet_get_string(&len);
-       packet_done();
+       packet_check_eom();
 
        if (authctxt == NULL)
                fatal("input_service_request: no authctxt");
@@ -179,8 +172,8 @@ input_service_request(int type, int plen, void *ctxt)
        xfree(service);
 }
 
-void
-input_userauth_request(int type, int plen, void *ctxt)
+static void
+input_userauth_request(int type, int plen, u_int32_t seq, void *ctxt)
 {
        Authctxt *authctxt = ctxt;
        Authmethod *m = NULL;
@@ -227,14 +220,8 @@ input_userauth_request(int type, int plen, void *ctxt)
                    authctxt->user, authctxt->service, user, service);
        }
        /* reset state */
-       dispatch_set(SSH2_MSG_USERAUTH_INFO_RESPONSE, &protocol_error);
+       auth2_challenge_stop(authctxt);
        authctxt->postponed = 0;
-#ifdef BSD_AUTH
-       if (authctxt->as) {
-               auth_close(authctxt->as);
-               authctxt->as = NULL;
-       }
-#endif
 
        /* try to authenticate user */
        m = authmethod_lookup(method);
@@ -285,8 +272,14 @@ userauth_finish(Authctxt *authctxt, int authenticated, char *method)
                /* now we can break out */
                authctxt->success = 1;
        } else {
-               if (authctxt->failures++ > AUTH_FAIL_MAX)
+               if (authctxt->failures++ > AUTH_FAIL_MAX) {
+#ifdef WITH_AIXAUTHENTICATE
+                       loginfailed(authctxt->user,
+                           get_canonical_hostname(options.reverse_mapping_check),
+                           "ssh");
+#endif /* WITH_AIXAUTHENTICATE */
                        packet_disconnect(AUTH_FAIL_MSG, authctxt->user);
+               }
                methods = authmethods_get();
                packet_start(SSH2_MSG_USERAUTH_FAILURE);
                packet_put_cstring(methods);
@@ -297,7 +290,7 @@ userauth_finish(Authctxt *authctxt, int authenticated, char *method)
        }
 }
 
-void
+static void
 userauth_banner(void)
 {
        struct stat st;
@@ -328,21 +321,21 @@ done:
        return;
 }
 
-int
+static int
 userauth_none(Authctxt *authctxt)
 {
        /* disable method "none", only allowed one time */
        Authmethod *m = authmethod_lookup("none");
        if (m != NULL)
                m->enabled = NULL;
-       packet_done();
+       packet_check_eom();
        userauth_banner();
 
        if (authctxt->valid == 0)
                return(0);
 
 #ifdef HAVE_CYGWIN
-       if (check_nt_auth(1, authctxt->pw->pw_uid) == 0)
+       if (check_nt_auth(1, authctxt->pw) == 0)
                return(0);
 #endif
 #ifdef USE_PAM
@@ -354,7 +347,7 @@ userauth_none(Authctxt *authctxt)
 #endif /* USE_PAM */
 }
 
-int
+static int
 userauth_passwd(Authctxt *authctxt)
 {
        char *password;
@@ -365,10 +358,10 @@ userauth_passwd(Authctxt *authctxt)
        if (change)
                log("password change not supported");
        password = packet_get_string(&len);
-       packet_done();
+       packet_check_eom();
        if (authctxt->valid &&
 #ifdef HAVE_CYGWIN
-               check_nt_auth(1, authctxt->pw->pw_uid) &&
+           check_nt_auth(1, authctxt->pw) &&
 #endif
 #ifdef USE_PAM
            auth_pam_password(authctxt->pw, password) == 1)
@@ -383,7 +376,7 @@ userauth_passwd(Authctxt *authctxt)
        return authenticated;
 }
 
-int
+static int
 userauth_kbdint(Authctxt *authctxt)
 {
        int authenticated = 0;
@@ -391,7 +384,7 @@ userauth_kbdint(Authctxt *authctxt)
 
        lang = packet_get_string(NULL);
        devs = packet_get_string(NULL);
-       packet_done();
+       packet_check_eom();
 
        debug("keyboard-interactive devs %s", devs);
 
@@ -405,13 +398,13 @@ userauth_kbdint(Authctxt *authctxt)
        xfree(devs);
        xfree(lang);
 #ifdef HAVE_CYGWIN
-       if (check_nt_auth(0, authctxt->pw->pw_uid) == 0)
+       if (check_nt_auth(0, authctxt->pw) == 0)
                return(0);
 #endif
        return authenticated;
 }
 
-int
+static int
 userauth_pubkey(Authctxt *authctxt)
 {
        Buffer b;
@@ -451,7 +444,7 @@ userauth_pubkey(Authctxt *authctxt)
        if (key != NULL) {
                if (have_sig) {
                        sig = packet_get_string(&slen);
-                       packet_done();
+                       packet_check_eom();
                        buffer_init(&b);
                        if (datafellows & SSH_OLD_SESSIONID) {
                                buffer_append(&b, session_id2, session_id2_len);
@@ -484,7 +477,7 @@ userauth_pubkey(Authctxt *authctxt)
                        xfree(sig);
                } else {
                        debug("test whether pkalg/pkblob are acceptable");
-                       packet_done();
+                       packet_check_eom();
 
                        /* XXX fake reply and always send PK_OK ? */
                        /*
@@ -511,13 +504,13 @@ userauth_pubkey(Authctxt *authctxt)
        xfree(pkalg);
        xfree(pkblob);
 #ifdef HAVE_CYGWIN
-       if (check_nt_auth(0, authctxt->pw->pw_uid) == 0)
+       if (check_nt_auth(0, authctxt->pw) == 0)
                return(0);
 #endif
        return authenticated;
 }
 
-int
+static int
 userauth_hostbased(Authctxt *authctxt)
 {
        Buffer b;
@@ -602,7 +595,7 @@ auth_get_user(void)
 
 #define        DELIM   ","
 
-char *
+static char *
 authmethods_get(void)
 {
        Authmethod *method = NULL;
@@ -634,7 +627,7 @@ authmethods_get(void)
        return list;
 }
 
-Authmethod *
+static Authmethod *
 authmethod_lookup(const char *name)
 {
        Authmethod *method = NULL;
@@ -649,7 +642,7 @@ authmethod_lookup(const char *name)
 }
 
 /* return 1 if user allows given key */
-int
+static int
 user_key_allowed2(struct passwd *pw, Key *key, char *file)
 {
        char line[8192];
@@ -658,6 +651,7 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
        u_long linenum = 0;
        struct stat st;
        Key *found;
+       char *fp;
 
        if (pw == NULL)
                return 0;
@@ -681,7 +675,7 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
                return 0;
        }
        if (options.strict_modes &&
-           secure_filename(f, file, pw->pw_uid, line, sizeof(line)) != 0) {
+           secure_filename(f, file, pw, line, sizeof(line)) != 0) {
                fclose(f);
                log("Authentication refused: %s", line);
                restore_uid();
@@ -700,7 +694,7 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
                if (!*cp || *cp == '\n' || *cp == '#')
                        continue;
 
-               if (key_read(found, &cp) == -1) {
+               if (key_read(found, &cp) != 1) {
                        /* no key?  check if there are options for this key */
                        int quoted = 0;
                        debug2("user_key_allowed: check options: '%s'", cp);
@@ -714,7 +708,7 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
                        /* Skip remaining whitespace. */
                        for (; *cp == ' ' || *cp == '\t'; cp++)
                                ;
-                       if (key_read(found, &cp) == -1) {
+                       if (key_read(found, &cp) != 1) {
                                debug2("user_key_allowed: advance: '%s'", cp);
                                /* still no key?  advance to next line*/
                                continue;
@@ -723,8 +717,12 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
                if (key_equal(found, key) &&
                    auth_parse_options(pw, options, file, linenum) == 1) {
                        found_key = 1;
-                       debug("matching key found: file %s, line %ld",
+                       debug("matching key found: file %s, line %lu",
                            file, linenum);
+                       fp = key_fingerprint(found, SSH_FP_MD5, SSH_FP_HEX);
+                       verbose("Found matching %s key: %s",
+                           key_type(found), fp);
+                       xfree(fp);
                        break;
                }
        }
@@ -737,7 +735,7 @@ user_key_allowed2(struct passwd *pw, Key *key, char *file)
 }
 
 /* check whether given key is in .ssh/authorized_keys* */
-int
+static int
 user_key_allowed(struct passwd *pw, Key *key)
 {
        int success;
@@ -757,15 +755,13 @@ user_key_allowed(struct passwd *pw, Key *key)
 }
 
 /* return 1 if given hostkey is allowed */
-int
+static int
 hostbased_key_allowed(struct passwd *pw, const char *cuser, char *chost,
     Key *key)
 {
-       Key *found;
        const char *resolvedname, *ipaddr, *lookup;
-       struct stat st;
-       char *user_hostfile;
-       int host_status, len;
+       HostStatus host_status;
+       int len;
 
        resolvedname = get_canonical_hostname(options.reverse_mapping_check);
        ipaddr = get_remote_ipaddr();
@@ -792,32 +788,17 @@ hostbased_key_allowed(struct passwd *pw, const char *cuser, char *chost,
        }
        debug2("userauth_hostbased: access allowed by auth_rhosts2");
 
-       /* XXX this is copied from auth-rh-rsa.c and should be shared */
-       found = key_new(key->type);
-       host_status = check_host_in_hostfile(_PATH_SSH_SYSTEM_HOSTFILE2, lookup,
-           key, found, NULL);
-
-       if (host_status != HOST_OK && !options.ignore_user_known_hosts) {
-               user_hostfile = tilde_expand_filename(_PATH_SSH_USER_HOSTFILE2,
-                   pw->pw_uid);
-               if (options.strict_modes &&
-                   (stat(user_hostfile, &st) == 0) &&
-                   ((st.st_uid != 0 && st.st_uid != pw->pw_uid) ||
-                    (st.st_mode & 022) != 0)) {
-                       log("Hostbased authentication refused for %.100s: "
-                           "bad owner or modes for %.200s",
-                           pw->pw_name, user_hostfile);
-               } else {
-                       temporarily_use_uid(pw);
-                       host_status = check_host_in_hostfile(user_hostfile,
-                           lookup, key, found, NULL);
-                       restore_uid();
-               }
-               xfree(user_hostfile);
-       }
-       key_free(found);
+       host_status = check_key_in_hostfiles(pw, key, lookup,
+           _PATH_SSH_SYSTEM_HOSTFILE,
+           options.ignore_user_known_hosts ? NULL : _PATH_SSH_USER_HOSTFILE);
+
+       /* backward compat if no key has been found. */
+       if (host_status == HOST_NEW)
+               host_status = check_key_in_hostfiles(pw, key, lookup,
+                   _PATH_SSH_SYSTEM_HOSTFILE2,
+                   options.ignore_user_known_hosts ? NULL :
+                   _PATH_SSH_USER_HOSTFILE2);
 
-       debug2("userauth_hostbased: key %s for %s", host_status == HOST_OK ?
-           "ok" : "not found", lookup);
        return (host_status == HOST_OK);
 }
+
This page took 0.057727 seconds and 4 git commands to generate.