]> andersk Git - gssapi-openssh.git/blobdiff - openssh/auth2-gss.c
wrap new GSSAPI code (from Simon) in #ifdef GSSAPI
[gssapi-openssh.git] / openssh / auth2-gss.c
index 6fcecb897ebb6e88e9aa6882582ac2e281a0933e..1db62c438bad6e035735e5522ccb8ae31ce9ed82 100644 (file)
@@ -1,7 +1,7 @@
-/*     $OpenBSD: auth2-gss.c,v 1.12 2005/10/13 22:24:31 stevesk Exp $  */
+/* $OpenBSD: auth2-gss.c,v 1.16 2007/10/29 00:52:45 dtucker Exp $ */
 
 /*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
+ * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #ifdef GSSAPI
 
+#include <sys/types.h>
+
+#include <stdarg.h>
+
+#include "xmalloc.h"
+#include "key.h"
+#include "hostfile.h"
 #include "auth.h"
 #include "ssh2.h"
-#include "xmalloc.h"
 #include "log.h"
 #include "dispatch.h"
+#include "buffer.h"
 #include "servconf.h"
 #include "packet.h"
-#include "monitor_wrap.h"
-
 #include "ssh-gss.h"
+#include "monitor_wrap.h"
 
 extern ServerOptions options;
 
@@ -56,7 +62,7 @@ userauth_external(Authctxt *authctxt)
         packet_check_eom();
 
        if (authctxt->valid && authctxt->user && authctxt->user[0]) {
-               return(PRIVSEP(ssh_gssapi_userok(authctxt->user)));
+               return(PRIVSEP(ssh_gssapi_userok(authctxt->user, authctxt->pw)));
        }
        return 0;
 }
@@ -96,7 +102,8 @@ userauth_gsskeyex(Authctxt *authctxt)
            !GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gss_kex_context, 
                                                   &gssbuf2, &mic)))) {
            if (authctxt->valid && authctxt->user && authctxt->user[0]) {
-               authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+            authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
+                                                      authctxt->pw));
            }
        }
        
@@ -165,6 +172,8 @@ userauth_gssapi(Authctxt *authctxt)
        }
 
        if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, &goid)))) {
+               if (ctxt != NULL)
+                       ssh_gssapi_delete_ctx(&ctxt);
                xfree(doid);
                authctxt->server_caused_failure = 1;
                return (0);
@@ -279,29 +288,28 @@ input_gssapi_errtok(int type, u_int32_t plen, void *ctxt)
 }
 
 static void
-gssapi_set_implicit_username(Authctxt *authctxt)
+gssapi_set_username(Authctxt *authctxt)
 {
+    char *lname = NULL;
+
     if ((authctxt->user == NULL) || (authctxt->user[0] == '\0')) {
-       char *lname = NULL;
-       PRIVSEP(ssh_gssapi_localname(&lname));
-       if (lname && lname[0] != '\0') {
-           if (authctxt->user) xfree(authctxt->user);
-           authctxt->user = lname;
-           debug("set username to %s from gssapi context", lname);
-           authctxt->pw = PRIVSEP(getpwnamallow(authctxt->user));
-           if (authctxt->pw) {
-               authctxt->valid = 1;
-           }
-       } else {
-           debug("failed to set username from gssapi context");
-           packet_send_debug("failed to set username from gssapi context");
-       }
-    }
-    if (authctxt->pw) {
+        PRIVSEP(ssh_gssapi_localname(&lname));
+        if (lname && lname[0] != '\0') {
+            if (authctxt->user) xfree(authctxt->user);
+            authctxt->user = lname;
+            debug("set username to %s from gssapi context", lname);
+            authctxt->pw = PRIVSEP(getpwnamallow(authctxt->user));
+            if (authctxt->pw) {
+                authctxt->valid = 1;
 #ifdef USE_PAM
-       if (options.use_pam)
-               PRIVSEP(start_pam(authctxt));
+                if (options.use_pam)
+                    PRIVSEP(start_pam(authctxt));
 #endif
+            }
+        } else {
+            debug("failed to set username from gssapi context");
+            packet_send_debug("failed to set username from gssapi context");
+        }
     }
 }
 
@@ -321,7 +329,7 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt)
        if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
                fatal("No authentication or GSSAPI context");
 
-       gssapi_set_implicit_username(authctxt);
+       gssapi_set_username(authctxt);
 
        gssctxt = authctxt->methoddata;
 
@@ -334,7 +342,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt)
 
        /* user should be set if valid but we double-check here */
        if (authctxt->valid && authctxt->user && authctxt->user[0]) {
-           authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+           authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
+                                                  authctxt->pw));
        } else {
            authenticated = 0;
        }
@@ -375,8 +384,6 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
        if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
                fatal("No authentication or GSSAPI context");
 
-       gssapi_set_implicit_username(authctxt);
-
        gssctxt = authctxt->methoddata;
 
        mic.value = packet_get_string(&len);
@@ -388,11 +395,14 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
        gssbuf.value = buffer_ptr(&b);
        gssbuf.length = buffer_len(&b);
 
+    gssapi_set_username(authctxt);
+
        if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
            if (authctxt->valid && authctxt->user && authctxt->user[0]) {
-               authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+            authenticated =
+                PRIVSEP(ssh_gssapi_userok(authctxt->user, authctxt->pw));
            } else {
-               authenticated = 0;
+            authenticated = 0;
            }
        else
                logit("GSSAPI MIC check failed");
This page took 0.079332 seconds and 4 git commands to generate.