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
1 change: 0 additions & 1 deletion PyKAdminCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "PyKAdminXDR.h"
#include "PyKAdminObject.h"


#ifndef PYTHON3
#define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days)
#define PyDateTime_DELTA_GET_SECONDS(o) (((PyDateTime_Delta*)o)->seconds)
Expand Down
552 changes: 442 additions & 110 deletions PyKAdminErrors.c

Large diffs are not rendered by default.

34 changes: 27 additions & 7 deletions PyKAdminErrors.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

#ifndef PYKADMINERRORS_H
#define PYKADMINERRORS_H
#ifndef PyKAdminError_H
#define PyKAdminError_H

#include <Python.h>
#include <kadm5/admin.h>
Expand All @@ -10,13 +10,33 @@
#include <string.h>
#include <structmember.h>

#define PyKAdmin_HandleKAdminError(retval, caller) if (retval != 0x0) { (PyKAdmin_RaiseKAdminError(retval, caller)); return NULL; }
#include "pykadmin.h"

PyObject *KAdminError;
PyObject *KAdminErrorsDict;

void PyKAdminError_init(PyObject *module);
#ifdef KADMIN_LOCAL
#define kBASE_ERROR_NAME "kadmin_local.KAdminError"
#define kKADM_ERROR_NAME "kadmin_local.AdminError"
#define kKRB5_ERROR_NAME "kadmin_local.KerberosError"
#else
#define kBASE_ERROR_NAME "kadmin.KAdminError"
#define kKADM_ERROR_NAME "kadmin.AdminError"
#define kKRB5_ERROR_NAME "kadmin.KerberosError"
#endif

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

// Base Exception Objects

PyObject *PyKAdminError_base;
PyObject *PyKAdminError_kadm;
PyObject *PyKAdminError_krb5;

int PyKAdminError_init_kadm(PyObject *modle);
int PyKAdminError_init_krb5(PyObject *modle);

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

PyObject *PyKAdmin_RaiseKAdminError(kadm5_ret_t retval, char *caller);

#endif
8 changes: 4 additions & 4 deletions PyKAdminObject.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ static PyObject *PyKAdminObject_new(PyTypeObject *type, PyObject *args, PyObject

if (retval) {
Py_DECREF(self);
PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_password");
PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_password");
return NULL;
}

Expand Down Expand Up @@ -87,10 +87,10 @@ static PyObject *PyKAdminObject_delete_principal(PyKAdminObject *self, PyObject
if (self->server_handle) {

retval = krb5_parse_name(self->context, client_name, &princ);
if (retval != 0x0) { PyKAdmin_RaiseKAdminError(retval, "krb5_parse_name"); return NULL; }
if (retval != 0x0) { PyKAdminError_raise_kadm_error(retval, "krb5_parse_name"); return NULL; }

retval = kadm5_delete_principal(self->server_handle, princ);
if (retval != 0x0) { PyKAdmin_RaiseKAdminError(retval, "kadm5_delete_principal"); return NULL; }
if (retval != 0x0) { PyKAdminError_raise_kadm_error(retval, "kadm5_delete_principal"); return NULL; }

}

Expand Down Expand Up @@ -130,7 +130,7 @@ static PyObject *PyKAdminObject_create_principal(PyKAdminObject *self, PyObject

retval = kadm5_create_principal(self->server_handle, &entry, KADM5_PRINCIPAL, princ_pass);

if (retval != 0x0) { PyKAdmin_RaiseKAdminError(retval, "kadm5_create_principal"); return NULL; }
if (retval != 0x0) { PyKAdminError_raise_kadm_error(retval, "kadm5_create_principal"); return NULL; }
}
}

Expand Down
14 changes: 7 additions & 7 deletions PyKAdminPrincipalObject.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ static PyObject *PyKAdminPrincipal_set_attributes(PyKAdminPrincipalObject *self,
self->mask |= KADM5_ATTRIBUTES;

//retval = kadm5_modify_principal(self->kadmin->server_handle, &self->entry, KADM5_ATTRIBUTES);
//if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_modify_principal"); return NULL; }
//if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_modify_principal"); return NULL; }
}

Py_RETURN_TRUE;
Expand All @@ -127,7 +127,7 @@ static PyObject *PyKAdminPrincipal_unset_attributes(PyKAdminPrincipalObject *sel
self->mask |= KADM5_ATTRIBUTES;

//retval = kadm5_modify_principal(self->kadmin->server_handle, &self->entry, KADM5_ATTRIBUTES);
//if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_modify_principal"); return NULL; }
//if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_modify_principal"); return NULL; }
}

Py_RETURN_TRUE;
Expand All @@ -142,7 +142,7 @@ static PyObject *PyKAdminPrincipal_commit(PyKAdminPrincipalObject *self) {
if (self && self->mask) {

retval = kadm5_modify_principal(self->kadmin->server_handle, &self->entry, self->mask);
if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_modify_principal"); }
if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_modify_principal"); }

self->mask = 0;
}
Expand All @@ -164,11 +164,11 @@ static PyObject *PyKAdminPrincipal_reload(PyKAdminPrincipalObject *self) {
if (ret) {}

retval = kadm5_free_principal_ent(self->kadmin->server_handle, &self->entry);
if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_free_principal_ent"); }
if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_free_principal_ent"); }

if (retval == KADM5_OK) {
retval = kadm5_get_principal(self->kadmin->server_handle, temp, &self->entry, KADM5_PRINCIPAL_NORMAL_MASK);
if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_get_principal"); }
if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_get_principal"); }
}

krb5_free_principal(self->kadmin->context, temp);
Expand All @@ -194,7 +194,7 @@ static PyObject *PyKAdminPrincipal_change_password(PyKAdminPrincipalObject *self
return NULL;

retval = kadm5_chpass_principal(self->kadmin->server_handle, self->entry.principal, password);
if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_chpass_principal"); return NULL; }
if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_chpass_principal"); return NULL; }

Py_RETURN_TRUE;
}
Expand All @@ -204,7 +204,7 @@ static PyObject *PyKAdminPrincipal_randomize_key(PyKAdminPrincipalObject *self)
kadm5_ret_t retval = KADM5_OK;

retval = kadm5_randkey_principal(self->kadmin->server_handle, self->entry.principal, NULL, NULL);
if (retval != KADM5_OK) { PyKAdmin_RaiseKAdminError(retval, "kadm5_randkey_principal"); return NULL; }
if (retval != KADM5_OK) { PyKAdminError_raise_kadm_error(retval, "kadm5_randkey_principal"); return NULL; }

Py_RETURN_TRUE;
}
Expand Down
99 changes: 45 additions & 54 deletions kadmin.c
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@


#include <Python.h>
#include <kadm5/admin.h>
#include <krb5/krb5.h>
#include <kdb.h>
#include <stdio.h>
#include <string.h>
#include <structmember.h>
#include "pykadmin.h"

#include "PyKAdminObject.h"
#include "PyKAdminErrors.h"
#include "PyKAdminIterator.h"
#include "PyKAdminPrincipalObject.h"
#include "PyKAdminPolicyObject.h"


#ifdef KADMIN_LOCAL
static PyKAdminObject *_kadmin_local(PyObject *self, PyObject *args);
#endif
Expand Down Expand Up @@ -41,28 +35,6 @@ static struct PyMethodDef module_methods[] = {
{NULL, NULL, 0, NULL}
};

/*
#define KRB5_KDB_DISALLOW_POSTDATED 0x00000001
#define KRB5_KDB_DISALLOW_FORWARDABLE 0x00000002
#define KRB5_KDB_DISALLOW_TGT_BASED 0x00000004
#define KRB5_KDB_DISALLOW_RENEWABLE 0x00000008
#define KRB5_KDB_DISALLOW_PROXIABLE 0x00000010
#define KRB5_KDB_DISALLOW_DUP_SKEY 0x00000020
#define KRB5_KDB_DISALLOW_ALL_TIX 0x00000040
#define KRB5_KDB_REQUIRES_PRE_AUTH 0x00000080
#define KRB5_KDB_REQUIRES_HW_AUTH 0x00000100
#define KRB5_KDB_REQUIRES_PWCHANGE 0x00000200
#define KRB5_KDB_DISALLOW_SVR 0x00001000
#define KRB5_KDB_PWCHANGE_SERVICE 0x00002000
#define KRB5_KDB_SUPPORT_DESMD5 0x00004000
#define KRB5_KDB_NEW_PRINC 0x00008000
#define KRB5_KDB_OK_AS_DELEGATE 0x00100000
#define KRB5_KDB_OK_TO_AUTH_AS_DELEGATE 0x00200000
#define KRB5_KDB_NO_AUTH_DATA_REQUIRED 0x00400000


*/

void PyKAdminConstant_init(PyObject *module) {

PyModule_AddIntConstant(module, "DISALLOW_POSTDATED", KRB5_KDB_DISALLOW_POSTDATED);
Expand Down Expand Up @@ -104,26 +76,45 @@ PyMODINIT_FUNC
Py_XINCREF(&PyKAdminObject_Type);
Py_XINCREF(&PyKAdminPrincipalObject_Type);

#ifdef KADMIN_LOCAL
PyObject *module = Py_InitModule3("kadmin_local", module_methods, module_docstring);
#else
PyObject *module = Py_InitModule3("kadmin", module_methods, module_docstring);
#endif
PyObject *module = Py_InitModule3(kMODULE_NAME, module_methods, module_docstring);

if (!module)
return;

#ifdef KADMIN_LOCAL
KAdminError = PyErr_NewException("kadmin_local.KAdminError", NULL, NULL);
#else
KAdminError = PyErr_NewException("kadmin.KAdminError", NULL, NULL);
#endif
/*
Initialize Error Classes

Py_XINCREF(KAdminError);
kadmin.KAdminError(exceptions.Exception)
AdminErrors
... All kadm5_ret_t Errors
KerberosErrors
... All krb5_error_code Errors

PyModule_AddObject(module, "KAdminError", KAdminError);
*/

PyKAdminError_base = PyErr_NewException(kBASE_ERROR_NAME, NULL, NULL);

if (PyKAdminError_base) {

Py_INCREF(PyKAdminError_base);
PyModule_AddObject(module, "KAdminError", PyKAdminError_base);

PyKAdminError_kadm = PyErr_NewException(kKADM_ERROR_NAME, PyKAdminError_base, NULL);
PyKAdminError_krb5 = PyErr_NewException(kKRB5_ERROR_NAME, PyKAdminError_base, NULL);

if (PyKAdminError_kadm) {
Py_INCREF(PyKAdminError_kadm);
PyModule_AddObject(module, "AdminError", PyKAdminError_kadm);
PyKAdminError_init_kadm(module);
}

if (PyKAdminError_krb5) {
Py_INCREF(PyKAdminError_krb5);
PyModule_AddObject(module, "KerberosError", PyKAdminError_krb5);
PyKAdminError_init_krb5(module);
}
}

PyKAdminError_init(module);
PyKAdminConstant_init(module);

}
Expand Down Expand Up @@ -158,7 +149,7 @@ static PyKAdminObject *_kadmin_local(PyObject *self, PyObject *args) {
db_args,
&kadmin->server_handle);

if (retval) { PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_password"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_password"); return NULL; }

return kadmin;

Expand Down Expand Up @@ -188,18 +179,18 @@ static PyKAdminObject *_kadmin_init_with_ccache(PyObject *self, PyObject *args)

if (ccache_name == NULL) {
retval = krb5_cc_default(kadmin->context, &cc);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_cc_default"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_cc_default"); return NULL; }
} else {
retval = krb5_cc_resolve(kadmin->context, ccache_name, &cc);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_cc_resolve"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_cc_resolve"); return NULL; }
}

if (client_name == NULL) {
retval = krb5_cc_get_principal(kadmin->context, cc, &princ);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_cc_get_principal"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_cc_get_principal"); return NULL; }

retval = krb5_unparse_name(kadmin->context, princ, &client_name);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_unparse_name"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_unparse_name"); return NULL; }

krb5_free_principal(kadmin->context, princ);
}
Expand All @@ -215,7 +206,7 @@ static PyKAdminObject *_kadmin_init_with_ccache(PyObject *self, PyObject *args)
db_args,
&kadmin->server_handle);

if (retval) { PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_creds"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_creds"); return NULL; }

Py_XINCREF(kadmin);
return kadmin;
Expand Down Expand Up @@ -246,10 +237,10 @@ static PyKAdminObject *_kadmin_init_with_keytab(PyObject *self, PyObject *args)
if (client_name == NULL) {

retval = krb5_sname_to_principal(kadmin->context, NULL, "host", KRB5_NT_SRV_HST, &princ);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_sname_to_principal"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_sname_to_principal"); return NULL; }

retval = krb5_unparse_name(kadmin->context, princ, &client_name);
if (retval) { PyKAdmin_RaiseKAdminError(retval, "krb5_unparse_name"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "krb5_unparse_name"); return NULL; }

krb5_free_principal(kadmin->context, princ);
}
Expand All @@ -267,7 +258,7 @@ static PyKAdminObject *_kadmin_init_with_keytab(PyObject *self, PyObject *args)
db_args,
&kadmin->server_handle);

if (retval) { PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_skey"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_skey"); return NULL; }


// kadmin->context = kadmin->server_handle->context;
Expand All @@ -278,7 +269,7 @@ static PyKAdminObject *_kadmin_init_with_keytab(PyObject *self, PyObject *args)
// printf("retval [%d] %s\n", retval, krb5_get_error_message(kadmin->context, retval));
//
//}
//if (retval) { PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_skey"); return NULL; }
//if (retval) { PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_skey"); return NULL; }


Py_XINCREF(kadmin);
Expand Down Expand Up @@ -311,7 +302,7 @@ static PyKAdminObject *_kadmin_init_with_password(PyObject *self, PyObject *args
db_args,
&kadmin->server_handle);

if (retval) { PyKAdmin_RaiseKAdminError(retval, "kadm5_init_with_password"); return NULL; }
if (retval) { PyKAdminError_raise_kadm_error(retval, "kadm5_init_with_password"); return NULL; }

Py_XINCREF(kadmin);
return kadmin;
Expand Down