Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion PyKAdminCommon.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,72 @@ inline char *PyUnicode_or_PyBytes_asCString(PyObject *in_str) {
PyObject *ascii = PyUnicode_AsASCIIString(in_str);

if (ascii) {
out_str = PyBytes_AsString(in_str);
out_str = PyBytes_AsString(ascii);
Py_XDECREF(ascii);
}

} else if (PyBytes_CheckExact(in_str)) {

out_str = PyBytes_AsString(in_str);
}

return out_str;
}


char *pykadmin_timestamp_as_isodate(time_t timestamp, const char *zero) {

struct tm *timeinfo;
char *isodate = NULL;

if (timestamp) {
isodate = malloc(32);

if (isodate) {

timeinfo = localtime(&timestamp);
strftime(isodate, 32, "%FT%T%z", timeinfo);
}
} else {
isodate = strdup(zero);
}

return isodate;
}

char *pykadmin_timestamp_as_deltastr(int seconds, const char *zero) {

char *deltastr = NULL;
int negative, days, hours, minutes;

if (seconds != 0) {

if (seconds < 0) {
seconds *= -1;
negative = 1;
}

days = seconds / (24 * 3600);
seconds %= 24 * 3600;
hours = seconds / 3600;
seconds %= 3600;
minutes = seconds / 60;
seconds %= 60;

deltastr = malloc(64);

if (deltastr) {
snprintf(deltastr, 64, "%s%d %s %02d:%02d:%02d", negative ? "-" : "", days, days == 1 ? "day" : "days", hours, minutes, seconds);
}

} else {

deltastr = strdup(zero);
}

return deltastr;
}



inline PyObject *pykadmin_pydatetime_from_timestamp(time_t timestamp) {
Expand Down
8 changes: 6 additions & 2 deletions PyKAdminCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,22 @@
# define PyDateTime_DELTA_GET_MICROSECONDS(o) (((PyDateTime_Delta*)o)->microseconds)
#endif

#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);

int pykadmin_seconds_from_pydatetime(PyObject *delta);


char *pykadmin_timestamp_as_isodate(time_t timestamp, const char *zero);
char *pykadmin_timestamp_as_deltastr(int seconds, const char *zero);



krb5_error_code pykadmin_kadm_from_kdb(PyKAdminObject *kadmin, krb5_db_entry *kdb, kadm5_principal_ent_rec *entry, long mask);

krb5_error_code pykadmin_policy_kadm_from_osa(krb5_context ctx, osa_policy_ent_rec *osa, kadm5_policy_ent_rec *entry, long mask);
Expand Down
731 changes: 417 additions & 314 deletions PyKAdminErrors.c

Large diffs are not rendered by default.

10 changes: 6 additions & 4 deletions PyKAdminErrors.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@

#include "pykadmin.h"

#define PyKAdmin_RETURN_ERROR(value, caller) { PyKAdminError_raise_error((long)value, caller); return NULL; }

#define PyKAdmin_RETURN_KADM5_ERROR(retval, caller) { PyKAdminError_raise_kadm_error(retval, caller); return NULL; }
#define PyKAdmin_RETURN_KRB5_ERROR(code, caller) { PyKAdminError_raise_krb5_error(code, caller); return NULL; }
//#define PyKAdmin_RETURN_KADM5_ERROR(retval, caller) { PyKAdminError_raise_kadm_error(retval, caller); return NULL; }
//#define PyKAdmin_RETURN_KRB5_ERROR(code, caller) { PyKAdminError_raise_krb5_error(code, caller); return NULL; }

PyObject *PyKAdminError_init(PyObject *module);

void PyKAdminError_raise_kadm_error(kadm5_ret_t retval, char *caller);
void PyKAdminError_raise_krb5_error(krb5_error_code code, char *caller);
//void PyKAdminError_raise_kadm_error(kadm5_ret_t retval, char *caller);
//void PyKAdminError_raise_krb5_error(krb5_error_code code, char *caller);
void PyKAdminError_raise_error(long code, char *caller);


#endif
60 changes: 33 additions & 27 deletions PyKAdminIterator.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,13 @@
static void PyKAdminIterator_dealloc(PyKAdminIterator *self) {

kadm5_free_name_list(self->kadmin->server_handle, self->names, self->count);
Py_XDECREF(self->kadmin);
Py_DECREF(self->kadmin);

Py_TYPE(self)->tp_free((PyObject *)self);
//self->ob_type->tp_free((PyObject*)self);
}


static int PyKAdminIterator_init(PyKAdminIterator *self, PyObject *args, PyObject *kwds) {

self->count = 0x0;
self->index = 0x0;

if (self->kadmin->server_handle) {

if (self->mode & iterate_principals) {
kadm5_get_principals(self->kadmin->server_handle, self->match, &self->names, &self->count);
} else if (self->mode & iterate_policies) {
kadm5_get_policies(self->kadmin->server_handle, self->match, &self->names, &self->count);
}
}


return 0;
}

Expand All @@ -41,7 +26,7 @@ static PyObject *PyKAdminIterator_next(PyKAdminIterator *self) {
if (self->index < self->count) {

name = self->names[self->index];
next = Py_BuildValue("s", name);
next = PyUnicode_FromString(name);

self->index++;
}
Expand Down Expand Up @@ -93,25 +78,46 @@ PyTypeObject PyKAdminIterator_Type = {
};


PyKAdminIterator *PyKAdminIterator_principal_iterator(PyKAdminObject *kadmin, char *match) {

PyKAdminIterator *PyKAdminIterator_create(PyKAdminObject *kadmin, PyKadminIteratorModes mode, char *match) {

kadm5_ret_t retval = KADM5_OK;
PyKAdminIterator *iter = PyObject_New(PyKAdminIterator, &PyKAdminIterator_Type);

if (iter) {
Py_XINCREF(kadmin);
iter->kadmin = kadmin;
iter->mode = mode;
iter->match = match;

iter->count = 0x0;
iter->index = 0x0;

iter->kadmin = kadmin;
Py_INCREF(kadmin);

retval = kadm5_get_principals(kadmin->server_handle, match, &iter->names, &iter->count);
if (retval != KADM5_OK) { PyKAdmin_RETURN_ERROR(retval, "kadm5_get_principals"); }
}

PyKAdminIterator_init(iter, NULL, NULL);
Py_XINCREF(iter);

return iter;
}

void PyKAdminIterator_destroy(PyKAdminIterator *self) {
PyKAdminIterator_dealloc(self);

PyKAdminIterator *PyKAdminIterator_policy_iterator(PyKAdminObject *kadmin, char *match) {

kadm5_ret_t retval = KADM5_OK;
PyKAdminIterator *iter = PyObject_New(PyKAdminIterator, &PyKAdminIterator_Type);

if (iter) {

iter->count = 0x0;
iter->index = 0x0;

iter->kadmin = kadmin;
Py_INCREF(kadmin);

retval = kadm5_get_policies(kadmin->server_handle, match, &iter->names, &iter->count);
if (retval != KADM5_OK) { PyKAdmin_RETURN_ERROR(retval, "kadm5_get_policies"); }
}

Py_XINCREF(iter);
return iter;
}

15 changes: 4 additions & 11 deletions PyKAdminIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,12 @@
#include <string.h>
#include <structmember.h>

typedef enum {
iterate_principals = 0x1,
iterate_policies = 0x2
// iterate_unpack = 0x4
} PyKadminIteratorModes;

typedef struct {
PyObject_HEAD

//Py_ssize_t count;
Py_ssize_t index;
PyKadminIteratorModes mode;

int count;
char *match;
char **names;

PyKAdminObject *kadmin;
Expand All @@ -32,7 +23,9 @@ typedef struct {

PyTypeObject PyKAdminIterator_Type;

PyKAdminIterator *PyKAdminIterator_create(PyKAdminObject *kadmin, PyKadminIteratorModes mode, char *filter);
void PyKAdminIterator_destroy(PyKAdminIterator *self);
PyKAdminIterator *PyKAdminIterator_principal_iterator(PyKAdminObject *kadmin, char *match);
PyKAdminIterator *PyKAdminIterator_policy_iterator(PyKAdminObject *kadmin, char *match);

//PyKAdminIterator *PyKAdminIterator_create(PyKAdminObject *kadmin, PyKadminIteratorModes mode, char *filter);

#endif
Loading