Projects
Wiki     Timeline     Roadmap     Browse Source     View Tickets     New Ticket     Search

Ticket #311: PyKerberos-delegation.patch

File PyKerberos-delegation.patch, 6.1 KB (added by ssorce@…, 15 months ago)

Same patch as before but with defaults hardcoded in the C code.

  • pysrc/kerberos.py

    diff -uPr python-kerberos-1.1/pysrc/kerberos.py python-kerberos-1.1-gssflags/pysrc/kerberos.py
    old new  
    9090AUTH_GSS_CONTINUE=0  
    9191AUTH_GSS_COMPLETE=1  
    9292      
    93 def authGSSClientInit(service): 
     93#Some useful gss flags 
     94GSS_C_DELEG_FLAG=1 
     95GSS_C_MUTUAL_FLAG=2 
     96GSS_C_REPLAY_FLAG=4 
     97GSS_C_SEQUENCE_FLAG=8 
     98GSS_C_CONF_FLAG=16 
     99GSS_C_INTEG_FLAG=32 
     100GSS_C_ANON_FLAG=64 
     101GSS_C_PROT_READY_FLAG=128 
     102GSS_C_TRANS_FLAG=256 
     103 
     104def authGSSClientInit(service, gssflags=GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG): 
    94105    """ 
    95106    Initializes a context for GSSAPI client-side authentication with the given service principal. 
    96107    authGSSClientClean must be called after this function returns an OK result to dispose of 
     
    98109 
    99110    @param service: a string containing the service principal in the form 'type@fqdn' 
    100111        (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) 
    101115    @return:        a tuple of (result, context) where result is the result code (see above) and 
    102116        context is an opaque value that will need to be passed to subsequent functions. 
    103117    """ 
  • python-kerberos-1.

    diff -uPr python-kerberos-1.1/src/kerberos.c python-kerberos-1.1-gssflags/src/kerberos.c
    old new  
    8484        return NULL; 
    8585} 
    8686 
    87 static PyObject* authGSSClientInit(PyObject* self, PyObject* args) 
     87static PyObject* authGSSClientInit(PyObject* self, PyObject* args, PyObject* keywds) 
    8888{ 
    8989    const char *service; 
    9090    gss_client_state *state; 
    9191    PyObject *pystate; 
     92    static char *kwlist[] = {"service", "gssflags", NULL}; 
     93    long int gss_flags = GSS_C_MUTUAL_FLAG|GSS_C_SEQUENCE_FLAG; 
    9294    int result = 0; 
    9395     
    94     if (!PyArg_ParseTuple(args, "s", &service)) 
     96    if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|l", kwlist, &service, &gss_flags)) 
    9597        return NULL; 
    9698     
    9799    state = (gss_client_state *) malloc(sizeof(gss_client_state)); 
    98100    pystate = PyCObject_FromVoidPtr(state, NULL); 
    99101     
    100     result = authenticate_gss_client_init(service, state); 
     102    result = authenticate_gss_client_init(service, gss_flags, state); 
    101103    if (result == AUTH_GSS_ERROR) 
    102104        return NULL; 
    103105     
     
    367369     "Change the user password."}, 
    368370    {"getServerPrincipalDetails",  getServerPrincipalDetails, METH_VARARGS, 
    369371     "Return the service principal for a given service and hostname."}, 
    370     {"authGSSClientInit",  authGSSClientInit, METH_VARARGS, 
     372    {"authGSSClientInit",  (PyCFunction)authGSSClientInit, METH_VARARGS|METH_KEYWORDS, 
    371373     "Initialize client-side GSSAPI operations."}, 
    372374    {"authGSSClientClean",  authGSSClientClean, METH_VARARGS, 
    373375     "Terminate client-side GSSAPI operations."}, 
     
    427429    PyDict_SetItemString(d, "AUTH_GSS_COMPLETE", PyInt_FromLong(AUTH_GSS_COMPLETE));  
    428430    PyDict_SetItemString(d, "AUTH_GSS_CONTINUE", PyInt_FromLong(AUTH_GSS_CONTINUE));  
    429431 
     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));  
    430441error: 
    431442    if (PyErr_Occurred()) 
    432443        PyErr_SetString(PyExc_ImportError, "kerberos: init failed"); 
  • src/kerberosgss.c

    diff -uPr python-kerberos-1.1/src/kerberosgss.c python-kerberos-1.1-gssflags/src/kerberosgss.c
    old new  
    108108    return result; 
    109109} 
    110110 
    111 int authenticate_gss_client_init(const char* service, gss_client_state* state) 
     111int authenticate_gss_client_init(const char* service, long int gss_flags, gss_client_state* state) 
    112112{ 
    113113    OM_uint32 maj_stat; 
    114114    OM_uint32 min_stat; 
     
    119119    state->context = GSS_C_NO_CONTEXT; 
    120120    state->username = NULL; 
    121121    state->response = NULL; 
     122    state->gss_flags = gss_flags; 
    122123     
    123124    // Import server name first 
    124125    name_token.length = strlen(service); 
     
    190191                                    &state->context, 
    191192                                    state->server_name, 
    192193                                    GSS_C_NO_OID, 
    193                                     GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG, 
     194                                    (OM_uint32)state->gss_flags, 
    194195                                    0, 
    195196                                    GSS_C_NO_CHANNEL_BINDINGS, 
    196197                                    &input_token, 
  • src/kerberosgss.h

    diff -uPr python-kerberos-1.1/src/kerberosgss.h python-kerberos-1.1-gssflags/src/kerberosgss.h
    old new  
    3333typedef struct { 
    3434    gss_ctx_id_t     context; 
    3535    gss_name_t       server_name; 
     36    long int         gss_flags; 
    3637    char*            username; 
    3738    char*            response; 
    3839} gss_client_state; 
     
    4950 
    5051char* server_principal_details(const char* service, const char* hostname); 
    5152 
    52 int authenticate_gss_client_init(const char* service, gss_client_state* state); 
     53int authenticate_gss_client_init(const char* service, long int gss_flags, gss_client_state* state); 
    5354int authenticate_gss_client_clean(gss_client_state *state); 
    5455int authenticate_gss_client_step(gss_client_state *state, const char *challenge); 
    5556int authenticate_gss_client_unwrap(gss_client_state* state, const char* challenge);