-/* $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.
#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;
}
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);
}
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");
- }
- }
- 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");
+ }
}
}
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;
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);
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));