Blob Blame History Raw
diff -rupN python-kerberos-1.1.orig/src/kerberos.c python-kerberos-1.1/src/kerberos.c
--- python-kerberos-1.1.orig/src/kerberos.c	2014-01-16 20:52:24.684000000 -0700
+++ python-kerberos-1.1/src/kerberos.c	2014-01-16 20:53:14.182000000 -0700
@@ -250,6 +250,30 @@ static PyObject *authGSSClientWrap(PyObj
 	return Py_BuildValue("i", result);
 }
 
+static PyObject *authGSSClientInquireCred(PyObject *self, PyObject *args)
+{
+	gss_client_state *state;
+	PyObject *pystate;
+	int result = 0;
+	if (!PyArg_ParseTuple(args, "O", &pystate))
+		return NULL;
+
+	if (!PyCObject_Check(pystate)) {
+		PyErr_SetString(PyExc_TypeError, "Expected a context object");
+		return NULL;
+	}
+
+	state = (gss_client_state *)PyCObject_AsVoidPtr(pystate);
+	if (state == NULL)
+		return NULL;
+
+	result = authenticate_gss_client_inquire_cred(state);
+	if (result == AUTH_GSS_ERROR)
+		return NULL;
+
+	return Py_BuildValue("i", result);
+}
+
 static PyObject *authGSSServerInit(PyObject *self, PyObject *args)
 {
     const char *service;
@@ -379,12 +403,16 @@ static PyMethodDef KerberosMethods[] = {
      "Get the response from the last client-side GSSAPI step."},
     {"authGSSClientUserName",  authGSSClientUserName, METH_VARARGS,
      "Get the user name from the last client-side GSSAPI step."},
+    {"authGSSClientInquireCred",  authGSSClientInquireCred, METH_VARARGS,
+     "Get the current user name, if any, without a client-side GSSAPI step"},
     {"authGSSServerInit",  authGSSServerInit, METH_VARARGS,
      "Initialize server-side GSSAPI operations."},
     {"authGSSClientWrap",  authGSSClientWrap, METH_VARARGS,
      "Do a GSSAPI wrap."},
     {"authGSSClientUnwrap",  authGSSClientUnwrap, METH_VARARGS,
      "Do a GSSAPI unwrap."},
+    {"authGSSClientInquireCred", authGSSClientInquireCred, METH_VARARGS,
+     "Get the current user name, if any."},
     {"authGSSServerClean",  authGSSServerClean, METH_VARARGS,
      "Terminate server-side GSSAPI operations."},
     {"authGSSServerStep",  authGSSServerStep, METH_VARARGS,
diff -rupN python-kerberos-1.1.orig/src/kerberosgss.c python-kerberos-1.1/src/kerberosgss.c
--- python-kerberos-1.1.orig/src/kerberosgss.c	2014-01-16 20:52:24.739000000 -0700
+++ python-kerberos-1.1/src/kerberosgss.c	2014-01-16 20:53:14.183000000 -0700
@@ -388,6 +388,60 @@ end:
 	return ret;
 }
 
+int authenticate_gss_client_inquire_cred(gss_client_state* state)
+{
+    OM_uint32 maj_stat;
+    OM_uint32 min_stat;
+    gss_cred_id_t client_creds = GSS_C_NO_CREDENTIAL;
+    gss_buffer_desc name_token = GSS_C_EMPTY_BUFFER;
+    gss_name_t name = GSS_C_NO_NAME;
+    int ret = AUTH_GSS_COMPLETE;
+
+    // Get credentials
+    maj_stat = gss_acquire_cred(&min_stat, GSS_C_NO_NAME, GSS_C_INDEFINITE,
+                               GSS_C_NO_OID_SET, GSS_C_INITIATE, &client_creds, NULL, NULL);
+
+    if (GSS_ERROR(maj_stat))
+    {
+       set_gss_error(maj_stat, min_stat);
+       ret = AUTH_GSS_ERROR;
+       goto end;
+    }
+
+    // Get the name
+    maj_stat = gss_inquire_cred(&min_stat, client_creds, &name, 
+                                NULL, NULL, NULL);
+
+    if (GSS_ERROR(maj_stat))
+    {
+       set_gss_error(maj_stat, min_stat);
+       ret = AUTH_GSS_ERROR;
+       goto end;
+    }
+
+    maj_stat = gss_display_name(&min_stat, name, &name_token, NULL);
+
+    if (GSS_ERROR(maj_stat))
+    {
+        set_gss_error(maj_stat, min_stat);
+        ret = AUTH_GSS_ERROR;
+        goto end;
+    }
+
+    state->username = strndup(name_token.value, name_token.length);
+    if (!state->username) {
+        set_gss_error(GSS_S_FAILURE, ENOMEM);
+        ret = AUTH_GSS_ERROR;
+    }
+
+end:
+    (void)gss_release_cred(&min_stat, &client_creds);
+    (void)gss_release_buffer(&min_stat, &name_token);
+    (void)gss_release_name(&min_stat, &name);
+
+    return ret;
+}
+
 int authenticate_gss_server_init(const char *service, gss_server_state *state)
 {
     OM_uint32 maj_stat;
diff -rupN python-kerberos-1.1.orig/src/kerberosgss.h python-kerberos-1.1/src/kerberosgss.h
--- python-kerberos-1.1.orig/src/kerberosgss.h	2014-01-16 20:52:24.759000000 -0700
+++ python-kerberos-1.1/src/kerberosgss.h	2014-01-16 20:53:37.505000000 -0700
@@ -55,6 +55,7 @@ int authenticate_gss_client_clean(gss_cl
 int authenticate_gss_client_step(gss_client_state *state, const char *challenge);
 int authenticate_gss_client_unwrap(gss_client_state* state, const char* challenge); 
 int authenticate_gss_client_wrap(gss_client_state* state, const char* challenge, const char* user);
+int authenticate_gss_client_inquire_cred(gss_client_state* state);
 
 int authenticate_gss_server_init(const char* service, gss_server_state* state);
 int authenticate_gss_server_clean(gss_server_state *state);