]> andersk Git - gssapi-openssh.git/blobdiff - openssh/gss-serv.c
merged OpenSSH 4.6p1, openssh-4.6p1-gsskex-20070312.patch, and openssh-4.6p1-hpn12v16...
[gssapi-openssh.git] / openssh / gss-serv.c
index 5a69d6657aa66d277282eb8f87abd319f6aefcb1..39184d72055583e99e3527c3055ab8e7e6683417 100644 (file)
@@ -1,7 +1,7 @@
-/*     $OpenBSD: gss-serv.c,v 1.13 2005/10/13 22:24:31 stevesk Exp $   */
+/* $OpenBSD: gss-serv.c,v 1.20 2006/08/03 03:34:42 deraadt Exp $ */
 
 /*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
+ * Copyright (c) 2001-2006 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 <string.h>
+#include <unistd.h>
+
+#include "xmalloc.h"
 #include "buffer.h"
-#include "bufaux.h"
-#include "compat.h"
-#include <openssl/evp.h>
-#include "kex.h"
+#include "key.h"
+#include "hostfile.h"
 #include "auth.h"
 #include "log.h"
 #include "channels.h"
 #include "session.h"
+#include "misc.h"
 #include "servconf.h"
-#include "monitor_wrap.h"
-#include "xmalloc.h"
-#include "getput.h"
 
+#include "xmalloc.h"
 #include "ssh-gss.h"
+#include "monitor_wrap.h"
+
+extern ServerOptions options;
+extern Authctxt *the_authctxt;
 
 static ssh_gssapi_client gssapi_client =
     { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER,
@@ -84,8 +92,8 @@ ssh_gssapi_server_mechanisms() {
 
 /* Unprivileged */
 int
-ssh_gssapi_server_check_mech(gss_OID oid, void *data) {
-       Gssctxt * ctx = NULL;
+ssh_gssapi_server_check_mech(Gssctxt **dum, gss_OID oid, const char *data) {
+       Gssctxt *ctx = NULL;
        int res;
  
        res = !GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctx, oid)));
@@ -116,6 +124,58 @@ ssh_gssapi_supported_oids(gss_OID_set *oidset)
                            &supported_mechs[i]->oid, oidset);
                i++;
        }
+
+       gss_release_oid_set(&min_status, &supported);
+}
+
+OM_uint32
+ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid)
+{
+       if (*ctx)
+               ssh_gssapi_delete_ctx(ctx);
+       ssh_gssapi_build_ctx(ctx);
+       ssh_gssapi_set_oid(*ctx, oid);
+       return (ssh_gssapi_acquire_cred(*ctx));
+}
+
+/* Acquire credentials for a server running on the current host.
+ * Requires that the context structure contains a valid OID
+ */
+
+/* Returns a GSSAPI error code */
+OM_uint32
+ssh_gssapi_acquire_cred(Gssctxt *ctx)
+{
+       OM_uint32 status;
+       char lname[MAXHOSTNAMELEN];
+       gss_OID_set oidset;
+
+       if (options.gss_strict_acceptor) {
+               gss_create_empty_oid_set(&status, &oidset);
+               gss_add_oid_set_member(&status, ctx->oid, &oidset);
+
+               if (gethostname(lname, MAXHOSTNAMELEN)) {
+                       gss_release_oid_set(&status, &oidset);
+                       return (-1);
+               }
+
+               if (GSS_ERROR(ssh_gssapi_import_name(ctx, lname))) {
+                       gss_release_oid_set(&status, &oidset);
+                       return (ctx->major);
+               }
+
+               if ((ctx->major = gss_acquire_cred(&ctx->minor,
+                   ctx->name, 0, oidset, GSS_C_ACCEPT, &ctx->creds, 
+                   NULL, NULL)))
+                       ssh_gssapi_error(ctx);
+
+               gss_release_oid_set(&status, &oidset);
+               return (ctx->major);
+       } else {
+               ctx->name = GSS_C_NO_NAME;
+               ctx->creds = GSS_C_NO_CREDENTIAL;
+       }
+       return GSS_S_COMPLETE;
 }
 
 
@@ -204,7 +264,7 @@ ssh_gssapi_parse_ename(Gssctxt *ctx, gss_buffer_t ename, gss_buffer_t name)
         * second without.
         */
 
-       oidl = GET_16BIT(tok+2); /* length including next two bytes */
+       oidl = get_u16(tok+2); /* length including next two bytes */
        oidl = oidl-2; /* turn it into the _real_ length of the variable OID */
 
        /*
@@ -221,14 +281,14 @@ ssh_gssapi_parse_ename(Gssctxt *ctx, gss_buffer_t ename, gss_buffer_t name)
        if (ename->length < offset+4)
                return GSS_S_FAILURE;
 
-       name->length = GET_32BIT(tok+offset);
+       name->length = get_u32(tok+offset);
        offset += 4;
 
        if (ename->length < offset+name->length)
                return GSS_S_FAILURE;
 
        name->value = xmalloc(name->length+1);
-       memcpy(name->value, tok+offset,name->length);
+       memcpy(name->value, tok+offset, name->length);
        ((char *)name->value)[name->length] = 0;
 
        return GSS_S_COMPLETE;
@@ -278,6 +338,10 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
        /* We can't copy this structure, so we just move the pointer to it */
        client->creds = ctx->client_creds;
        ctx->client_creds = GSS_C_NO_CREDENTIAL;
+
+    /* needed for globus_gss_assist_map_and_authorize() */
+    client->context = ctx->context;
+
        return (ctx->major);
 }
 
@@ -287,7 +351,8 @@ ssh_gssapi_cleanup_creds(void)
 {
        if (gssapi_client.store.filename != NULL) {
                /* Unlink probably isn't sufficient */
-               debug("removing gssapi cred file\"%s\"", gssapi_client.store.filename);
+               debug("removing gssapi cred file\"%s\"",
+                   gssapi_client.store.filename);
                unlink(gssapi_client.store.filename);
        }
 }
@@ -297,6 +362,11 @@ void
 ssh_gssapi_storecreds(void)
 {
        if (gssapi_client.mech && gssapi_client.mech->storecreds) {
+        if (options.gss_creds_path) {
+            gssapi_client.store.filename =
+                expand_authorized_keys(options.gss_creds_path,
+                                       the_authctxt->pw);
+        }
                (*gssapi_client.mech->storecreds)(&gssapi_client);
        } else
                debug("ssh_gssapi_storecreds: Not a GSSAPI mechanism");
@@ -331,7 +401,7 @@ ssh_gssapi_userok(char *user)
                return 0;
        }
 #ifdef GSS_C_GLOBUS_LIMITED_PROXY_FLAG
-       if (limited) {
+       if (limited && options.gsi_allow_limited_proxy != 1) {
                debug("limited proxy not acceptable for remote login");
                return 0;
        }
This page took 0.074234 seconds and 4 git commands to generate.