From fe19b6787269b449bd9fcd1fb60f771038ae2544 Mon Sep 17 00:00:00 2001 From: Russell Jancewicz Date: Thu, 17 Jul 2014 20:16:56 -0400 Subject: [PATCH] prepare for python 3 and add unicode support to principals. --- PyKAdminCommon.c | 32 ++++++++++++++++---- PyKAdminCommon.h | 9 +++++- PyKAdminErrors.c | 2 +- PyKAdminPrincipalObject.c | 63 ++++++++++++++------------------------- 4 files changed, 59 insertions(+), 47 deletions(-) diff --git a/PyKAdminCommon.c b/PyKAdminCommon.c index b0f8a53..b3e1fc9 100644 --- a/PyKAdminCommon.c +++ b/PyKAdminCommon.c @@ -13,16 +13,38 @@ kadm5_get_principal(void *server_handle, krb5_principal principal, #include "PyKAdminCommon.h" #include + #define TIME_NONE ((time_t) -1) -int pykadmin_policy_exists(void *server_handle, char *name) { + +inline char *PyUnicode_or_PyBytes_asCString(PyObject *in_str) { + + char *out_str = NULL; + + if (PyUnicode_CheckExact(in_str)) { + + PyObject *ascii = PyUnicode_AsASCIIString(in_str); + + if (ascii) { + out_str = PyBytes_AsString(in_str); + Py_XDECREF(ascii); + } + + } else if (PyBytes_CheckExact(in_str)) { + out_str = PyBytes_AsString(in_str); + } + + return out_str; +} + +int pykadmin_policy_exists(void *server_handle, const char *name) { kadm5_ret_t retval = KADM5_OK; - kadm5_policy_ent_rec *policy = NULL; + kadm5_policy_ent_rec policy; - retval = kadm5_get_policy(server_handle, name, policy); - if (retval == KADM5_OK) - kadm5_free_policy_ent(server_handle, policy); + retval = kadm5_get_policy(server_handle, (char *)name, &policy); + if (retval == KADM5_OK) + kadm5_free_policy_ent(server_handle, &policy); return (retval == KADM5_OK); } diff --git a/PyKAdminCommon.h b/PyKAdminCommon.h index 848262e..fdc2ef2 100644 --- a/PyKAdminCommon.h +++ b/PyKAdminCommon.h @@ -11,6 +11,8 @@ #include "PyKAdminXDR.h" #include "PyKAdminObject.h" +#include + #ifndef PYTHON3 #define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) @@ -18,7 +20,12 @@ #define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds) #endif -int pykadmin_policy_exists(void *server_handle, char *name); +#define PyUnicodeBytes_Check(obj) (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) + +inline char *PyUnicode_or_PyBytes_asCString(PyObject *in_str); + + +int pykadmin_policy_exists(void *server_handle, const char *name); inline PyObject *pykadmin_pydatetime_from_timestamp(time_t timestamp); int pykadmin_timestamp_from_pydatetime(PyObject *datetime); diff --git a/PyKAdminErrors.c b/PyKAdminErrors.c index 0600dcb..d252126 100644 --- a/PyKAdminErrors.c +++ b/PyKAdminErrors.c @@ -102,7 +102,7 @@ static void _PyKAdminError_raise_exception(PyObject *storage, PyObject *error, c } if (!error_string) { - error_string = PyString_FromString(caller); + error_string = PyUnicode_FromString(caller); } PyDict_SetItemString(error_dict, kERROR_STRING, error_string); diff --git a/PyKAdminPrincipalObject.c b/PyKAdminPrincipalObject.c index ff21fea..aaf4931 100644 --- a/PyKAdminPrincipalObject.c +++ b/PyKAdminPrincipalObject.c @@ -7,6 +7,7 @@ #include "PyKAdminCommon.h" +#include #include #define TIME_NONE ((time_t) -1) @@ -115,7 +116,6 @@ static PyObject *PyKAdminPrincipal_set_attributes(PyKAdminPrincipalObject *self, static PyObject *PyKAdminPrincipal_unset_attributes(PyKAdminPrincipalObject *self, PyObject *args, PyObject *kwds) { - //kadm5_ret_t retval = KADM5_OK; unsigned int flag = 0; if (!PyArg_ParseTuple(args, "(i)", &flag)) @@ -125,9 +125,6 @@ static PyObject *PyKAdminPrincipal_unset_attributes(PyKAdminPrincipalObject *sel self->entry.attributes &= ~flag; self->mask |= KADM5_ATTRIBUTES; - - //retval = kadm5_modify_principal(self->kadmin->server_handle, &self->entry, KADM5_ATTRIBUTES); - //if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_modify_principal"); return NULL; } } Py_RETURN_TRUE; @@ -249,15 +246,16 @@ PyObject *PyKAdminPrincipal_RichCompare(PyObject *o1, PyObject *o2, int opid) { static PyObject *PyKAdminPrincipal_get_principal(PyKAdminPrincipalObject *self, void *closure) { - krb5_error_code ret = 0; + krb5_error_code code = 0; PyObject *principal = NULL; char *client_name = NULL; - // todo: handle error - ret = krb5_unparse_name(self->kadmin->context, self->entry.principal, &client_name); + // todo: handle krb5_error_code + code = krb5_unparse_name(self->kadmin->context, self->entry.principal, &client_name); + if (code) {} if (client_name) { - principal = PyString_FromString(client_name); + principal = PyUnicode_FromString(client_name); free(client_name); } @@ -275,7 +273,7 @@ static PyObject *PyKAdminPrincipal_get_mod_name(PyKAdminPrincipalObject *self, v ret = krb5_unparse_name(self->kadmin->context, self->entry.mod_name, &client_name); if (client_name) { - principal = PyString_FromString(client_name); + principal = PyUnicode_FromString(client_name); free(client_name); } @@ -353,7 +351,7 @@ static PyObject *PyKAdminPrincipal_get_policy(PyKAdminPrincipalObject *self, voi if (self) { if (self->entry.policy) { - result = PyString_FromString(self->entry.policy); + result = PyUnicode_FromString(self->entry.policy); } } @@ -382,6 +380,8 @@ static PyObject *PyKAdminPrincipal_get_kvno(PyKAdminPrincipalObject *self, void * SETTERS */ +static char kNEVER[] = "never"; + static krb5_deltat _decode_timedelta_input(PyObject *timedelta) { PyDateTime_IMPORT; @@ -395,13 +395,10 @@ static krb5_deltat _decode_timedelta_input(PyObject *timedelta) { if (PyDelta_CheckExact(timedelta)) { delta = pykadmin_seconds_from_pydatetime(timedelta); - } else if (PyUnicode_CheckExact(timedelta)) { - // TODO: unicode - } else if (PyString_CheckExact(timedelta)) { - date_string = PyString_AsString(timedelta); - + } else if (PyUnicodeBytes_Check(timedelta)) { + date_string = PyUnicode_or_PyBytes_asCString(timedelta); } else if (timedelta == Py_None) { - date_string = "never"; + date_string = kNEVER; } if (date_string) { @@ -433,15 +430,10 @@ static krb5_timestamp _decode_timestamp_input(PyObject *date) { if (PyDate_CheckExact(date) || PyDateTime_CheckExact(date)) { timestamp = pykadmin_timestamp_from_pydatetime(date); - - } else if (PyUnicode_CheckExact(date)) { - // TODO: unicode - } else if (PyString_CheckExact(date)) { - date_string = PyString_AsString(date); - + } else if (PyUnicodeBytes_Check(date)) { + date_string = PyUnicode_or_PyBytes_asCString(date); } else if (date == Py_None) { - date_string = "never"; - + date_string = kNEVER; } if (date_string) { @@ -551,16 +543,10 @@ int PyKAdminPrincipal_set_policy(PyKAdminPrincipalObject *self, PyObject *value, self->mask |= KADM5_POLICY_CLR; } - if (PyUnicode_CheckExact(value)) { - // TODO - } else if (PyString_CheckExact(value)) { - - policy_string = PyString_AsString(value); - - } else if (PyKAdminPolicyObject_CheckExact(value)) { + policy_string = PyUnicode_or_PyBytes_asCString(value); + if (PyKAdminPolicyObject_CheckExact(value)) { policy_string = PyKAdminPolicyObject_policy_name((PyKAdminPolicyObject *)value); - } if (policy_string) { @@ -724,7 +710,7 @@ PyKAdminPrincipalObject *PyKAdminPrincipalObject_principal_with_name(PyKAdminObj PyKAdminPrincipalObject *principal = (PyKAdminPrincipalObject *)Py_None; krb5_principal temp = NULL; - if (client_name) { + if (kadmin && client_name) { principal = (PyKAdminPrincipalObject *)PyKAdminPrincipal_new(&PyKAdminPrincipalObject_Type, NULL, NULL); @@ -740,13 +726,13 @@ PyKAdminPrincipalObject *PyKAdminPrincipalObject_principal_with_name(PyKAdminObj if ((retval != KADM5_OK) || errno) { PyKAdminPrincipal_dealloc(principal); - Py_INCREF(Py_None); principal = (PyKAdminPrincipalObject *)Py_None; } } } + Py_INCREF(principal); return principal; } @@ -756,23 +742,20 @@ PyKAdminPrincipalObject *PyKAdminPrincipalObject_principal_with_db_entry(PyKAdmi PyKAdminPrincipalObject *principal = (PyKAdminPrincipalObject *)PyKAdminPrincipal_new(&PyKAdminPrincipalObject_Type, NULL, NULL); - if (kdb) { + if (kadmin && kdb) { - Py_XINCREF(kadmin); + Py_INCREF(kadmin); principal->kadmin = kadmin; retval = pykadmin_kadm_from_kdb(kadmin, kdb, &principal->entry, KADM5_PRINCIPAL_NORMAL_MASK); if (retval) { - PyKAdminPrincipal_dealloc(principal); - - // todo: set exception principal = NULL; - } } + Py_XINCREF(principal); return principal; }