diff -uPr python-kerberos-1.1/pysrc/kerberos.py python-kerberos-1.1-gssflags/pysrc/kerberos.py
|
old
|
new
|
|
| 90 | 90 | AUTH_GSS_CONTINUE=0 |
| 91 | 91 | AUTH_GSS_COMPLETE=1 |
| 92 | 92 | |
| 93 | | def authGSSClientInit(service): |
| | 93 | #Some useful gss flags |
| | 94 | GSS_C_DELEG_FLAG=1 |
| | 95 | GSS_C_MUTUAL_FLAG=2 |
| | 96 | GSS_C_REPLAY_FLAG=4 |
| | 97 | GSS_C_SEQUENCE_FLAG=8 |
| | 98 | GSS_C_CONF_FLAG=16 |
| | 99 | GSS_C_INTEG_FLAG=32 |
| | 100 | GSS_C_ANON_FLAG=64 |
| | 101 | GSS_C_PROT_READY_FLAG=128 |
| | 102 | GSS_C_TRANS_FLAG=256 |
| | 103 | |
| | 104 | def authGSSClientInit(service, gssflags=GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG): |
| 94 | 105 | """ |
| 95 | 106 | Initializes a context for GSSAPI client-side authentication with the given service principal. |
| 96 | 107 | authGSSClientClean must be called after this function returns an OK result to dispose of |
| … |
… |
|
| 98 | 109 | |
| 99 | 110 | @param service: a string containing the service principal in the form 'type@fqdn' |
| 100 | 111 | (e.g. 'imap@mail.apple.com'). |
| | 112 | @param gssflags: optional integer used to set GSS flags. |
| | 113 | (e.g. GSS_C_DELEG_FLAG|GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG will allow |
| | 114 | to forward credentials to the remote host) |
| 101 | 115 | @return: a tuple of (result, context) where result is the result code (see above) and |
| 102 | 116 | context is an opaque value that will need to be passed to subsequent functions. |
| 103 | 117 | """ |
diff -uPr python-kerberos-1.1/src/kerberos.c python-kerberos-1.1-gssflags/src/kerberos.c
|
old
|
new
|
|
| 84 | 84 | return NULL; |
| 85 | 85 | } |
| 86 | 86 | |
| 87 | | static PyObject* authGSSClientInit(PyObject* self, PyObject* args) |
| | 87 | static PyObject* authGSSClientInit(PyObject* self, PyObject* args, PyObject* keywds) |
| 88 | 88 | { |
| 89 | 89 | const char *service; |
| 90 | 90 | gss_client_state *state; |
| 91 | 91 | PyObject *pystate; |
| | 92 | static char *kwlist[] = {"service", "gssflags", NULL}; |
| | 93 | long int gss_flags = GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG; |
| 92 | 94 | int result = 0; |
| 93 | 95 | |
| 94 | | if (!PyArg_ParseTuple(args, "s", &service)) |
| | 96 | if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|l", kwlist, &service, &gss_flags)) |
| 95 | 97 | return NULL; |
| 96 | 98 | |
| 97 | 99 | state = (gss_client_state *) malloc(sizeof(gss_client_state)); |
| 98 | 100 | pystate = PyCObject_FromVoidPtr(state, NULL); |
| 99 | 101 | |
| 100 | | result = authenticate_gss_client_init(service, state); |
| | 102 | result = authenticate_gss_client_init(service, gss_flags, state); |
| 101 | 103 | if (result == AUTH_GSS_ERROR) |
| 102 | 104 | return NULL; |
| 103 | 105 | |
| … |
… |
|
| 367 | 369 | "Change the user password."}, |
| 368 | 370 | {"getServerPrincipalDetails", getServerPrincipalDetails, METH_VARARGS, |
| 369 | 371 | "Return the service principal for a given service and hostname."}, |
| 370 | | {"authGSSClientInit", authGSSClientInit, METH_VARARGS, |
| | 372 | {"authGSSClientInit", (PyCFunction)authGSSClientInit, METH_VARARGS|METH_KEYWORDS, |
| 371 | 373 | "Initialize client-side GSSAPI operations."}, |
| 372 | 374 | {"authGSSClientClean", authGSSClientClean, METH_VARARGS, |
| 373 | 375 | "Terminate client-side GSSAPI operations."}, |
| … |
… |
|
| 427 | 429 | PyDict_SetItemString(d, "AUTH_GSS_COMPLETE", PyInt_FromLong(AUTH_GSS_COMPLETE)); |
| 428 | 430 | PyDict_SetItemString(d, "AUTH_GSS_CONTINUE", PyInt_FromLong(AUTH_GSS_CONTINUE)); |
| 429 | 431 | |
| | 432 | PyDict_SetItemString(d, "GSS_C_DELEG_FLAG", PyInt_FromLong(GSS_C_DELEG_FLAG)); |
| | 433 | PyDict_SetItemString(d, "GSS_C_MUTUAL_FLAG", PyInt_FromLong(GSS_C_MUTUAL_FLAG)); |
| | 434 | PyDict_SetItemString(d, "GSS_C_REPLAY_FLAG", PyInt_FromLong(GSS_C_REPLAY_FLAG)); |
| | 435 | PyDict_SetItemString(d, "GSS_C_SEQUENCE_FLAG", PyInt_FromLong(GSS_C_SEQUENCE_FLAG)); |
| | 436 | PyDict_SetItemString(d, "GSS_C_CONF_FLAG", PyInt_FromLong(GSS_C_CONF_FLAG)); |
| | 437 | PyDict_SetItemString(d, "GSS_C_INTEG_FLAG", PyInt_FromLong(GSS_C_INTEG_FLAG)); |
| | 438 | PyDict_SetItemString(d, "GSS_C_ANON_FLAG", PyInt_FromLong(GSS_C_ANON_FLAG)); |
| | 439 | PyDict_SetItemString(d, "GSS_C_PROT_READY_FLAG", PyInt_FromLong(GSS_C_PROT_READY_FLAG)); |
| | 440 | PyDict_SetItemString(d, "GSS_C_TRANS_FLAG", PyInt_FromLong(GSS_C_TRANS_FLAG)); |
| 430 | 441 | error: |
| 431 | 442 | if (PyErr_Occurred()) |
| 432 | 443 | PyErr_SetString(PyExc_ImportError, "kerberos: init failed"); |
diff -uPr python-kerberos-1.1/src/kerberosgss.c python-kerberos-1.1-gssflags/src/kerberosgss.c
|
old
|
new
|
|
| 108 | 108 | return result; |
| 109 | 109 | } |
| 110 | 110 | |
| 111 | | int authenticate_gss_client_init(const char* service, gss_client_state* state) |
| | 111 | int authenticate_gss_client_init(const char* service, long int gss_flags, gss_client_state* state) |
| 112 | 112 | { |
| 113 | 113 | OM_uint32 maj_stat; |
| 114 | 114 | OM_uint32 min_stat; |
| … |
… |
|
| 119 | 119 | state->context = GSS_C_NO_CONTEXT; |
| 120 | 120 | state->username = NULL; |
| 121 | 121 | state->response = NULL; |
| | 122 | state->gss_flags = gss_flags; |
| 122 | 123 | |
| 123 | 124 | // Import server name first |
| 124 | 125 | name_token.length = strlen(service); |
| … |
… |
|
| 190 | 191 | &state->context, |
| 191 | 192 | state->server_name, |
| 192 | 193 | GSS_C_NO_OID, |
| 193 | | GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG, |
| | 194 | (OM_uint32)state->gss_flags, |
| 194 | 195 | 0, |
| 195 | 196 | GSS_C_NO_CHANNEL_BINDINGS, |
| 196 | 197 | &input_token, |
diff -uPr python-kerberos-1.1/src/kerberosgss.h python-kerberos-1.1-gssflags/src/kerberosgss.h
|
old
|
new
|
|
| 33 | 33 | typedef struct { |
| 34 | 34 | gss_ctx_id_t context; |
| 35 | 35 | gss_name_t server_name; |
| | 36 | long int gss_flags; |
| 36 | 37 | char* username; |
| 37 | 38 | char* response; |
| 38 | 39 | } gss_client_state; |
| … |
… |
|
| 49 | 50 | |
| 50 | 51 | char* server_principal_details(const char* service, const char* hostname); |
| 51 | 52 | |
| 52 | | int authenticate_gss_client_init(const char* service, gss_client_state* state); |
| | 53 | int authenticate_gss_client_init(const char* service, long int gss_flags, gss_client_state* state); |
| 53 | 54 | int authenticate_gss_client_clean(gss_client_state *state); |
| 54 | 55 | int authenticate_gss_client_step(gss_client_state *state, const char *challenge); |
| 55 | 56 | int authenticate_gss_client_unwrap(gss_client_state* state, const char* challenge); |