deb-python-pyldap/Modules/errors.c

223 lines
5.8 KiB
C

/*
* errors that arise from ldap use
* Most errors become their own exception
* See http://www.python-ldap.org/ for details.
* $Id: errors.c,v 1.25 2015/06/23 09:45:09 stroeder Exp $ */
#include "common.h"
#include "errors.h"
/* the base exception class */
PyObject*
LDAPexception_class;
/* list of error objects */
#define LDAP_ERROR_MIN LDAP_REFERRAL_LIMIT_EXCEEDED
#ifdef LDAP_PROXIED_AUTHORIZATION_DENIED
#define LDAP_ERROR_MAX LDAP_PROXIED_AUTHORIZATION_DENIED
#else
#ifdef LDAP_ASSERTION_FAILED
#define LDAP_ERROR_MAX LDAP_ASSERTION_FAILED
#else
#define LDAP_ERROR_MAX LDAP_OTHER
#endif
#endif
#define LDAP_ERROR_OFFSET -LDAP_ERROR_MIN
static PyObject* errobjects[ LDAP_ERROR_MAX-LDAP_ERROR_MIN+1 ];
/* Convert a bare LDAP error number into an exception */
PyObject*
LDAPerr(int errnum)
{
if (errnum >= LDAP_ERROR_MIN && errnum <= LDAP_ERROR_MAX)
PyErr_SetNone(errobjects[errnum+LDAP_ERROR_OFFSET]);
else
PyErr_SetObject(LDAPexception_class,
Py_BuildValue("{s:i}", "errnum", errnum));
return NULL;
}
/* Convert an LDAP error into an informative python exception */
PyObject*
LDAPerror( LDAP *l, char *msg )
{
if (l == NULL) {
PyErr_SetFromErrno( LDAPexception_class );
return NULL;
}
else {
int errnum, opt_errnum;
PyObject *errobj;
PyObject *info;
PyObject *str;
char *matched, *error;
opt_errnum = ldap_get_option(l, LDAP_OPT_ERROR_NUMBER, &errnum);
if (opt_errnum != LDAP_OPT_SUCCESS)
errnum = opt_errnum;
if (errnum == LDAP_NO_MEMORY)
return PyErr_NoMemory();
if (errnum >= LDAP_ERROR_MIN && errnum <= LDAP_ERROR_MAX)
errobj = errobjects[errnum+LDAP_ERROR_OFFSET];
else
errobj = LDAPexception_class;
info = PyDict_New();
if (info == NULL)
return NULL;
str = PyUnicode_FromString(ldap_err2string(errnum));
if (str)
PyDict_SetItemString( info, "desc", str );
Py_XDECREF(str);
if (ldap_get_option(l, LDAP_OPT_MATCHED_DN, &matched) >= 0
&& matched != NULL) {
if (*matched != '\0') {
str = PyUnicode_FromString(matched);
if (str)
PyDict_SetItemString( info, "matched", str );
Py_XDECREF(str);
}
ldap_memfree(matched);
}
if (errnum == LDAP_REFERRAL) {
str = PyUnicode_FromString(msg);
if (str)
PyDict_SetItemString( info, "info", str );
Py_XDECREF(str);
} else if (ldap_get_option(l, LDAP_OPT_ERROR_STRING, &error) >= 0
&& error != NULL) {
if (error != '\0') {
str = PyUnicode_FromString(error);
if (str)
PyDict_SetItemString( info, "info", str );
Py_XDECREF(str);
}
ldap_memfree(error);
}
PyErr_SetObject( errobj, info );
Py_DECREF(info);
return NULL;
}
}
/* initialisation */
void
LDAPinit_errors( PyObject*d ) {
/* create the base exception class */
LDAPexception_class = PyErr_NewException("ldap.LDAPError",
NULL,
NULL);
PyDict_SetItemString( d, "LDAPError", LDAPexception_class );
/* XXX - backward compatibility with pre-1.8 */
PyDict_SetItemString( d, "error", LDAPexception_class );
/* create each LDAP error object */
# define seterrobj2(n,o) \
PyDict_SetItemString( d, #n, (errobjects[LDAP_##n+LDAP_ERROR_OFFSET] = o) )
# define seterrobj(n) { \
PyObject *e = PyErr_NewException("ldap." #n, \
LDAPexception_class, NULL); \
seterrobj2(n, e); \
Py_INCREF(e); \
}
seterrobj(ADMINLIMIT_EXCEEDED);
seterrobj(AFFECTS_MULTIPLE_DSAS);
seterrobj(ALIAS_DEREF_PROBLEM);
seterrobj(ALIAS_PROBLEM);
seterrobj(ALREADY_EXISTS);
seterrobj(AUTH_METHOD_NOT_SUPPORTED);
seterrobj(AUTH_UNKNOWN);
seterrobj(BUSY);
seterrobj(CLIENT_LOOP);
seterrobj(COMPARE_FALSE);
seterrobj(COMPARE_TRUE);
seterrobj(CONFIDENTIALITY_REQUIRED);
seterrobj(CONNECT_ERROR);
seterrobj(CONSTRAINT_VIOLATION);
seterrobj(CONTROL_NOT_FOUND);
seterrobj(DECODING_ERROR);
seterrobj(ENCODING_ERROR);
seterrobj(FILTER_ERROR);
seterrobj(INAPPROPRIATE_AUTH);
seterrobj(INAPPROPRIATE_MATCHING);
seterrobj(INSUFFICIENT_ACCESS);
seterrobj(INVALID_CREDENTIALS);
seterrobj(INVALID_DN_SYNTAX);
seterrobj(INVALID_SYNTAX);
seterrobj(IS_LEAF);
seterrobj(LOCAL_ERROR);
seterrobj(LOOP_DETECT);
seterrobj(MORE_RESULTS_TO_RETURN);
seterrobj(NAMING_VIOLATION);
seterrobj(NO_MEMORY);
seterrobj(NO_OBJECT_CLASS_MODS);
seterrobj(NO_OBJECT_CLASS_MODS);
seterrobj(NO_RESULTS_RETURNED);
seterrobj(NO_SUCH_ATTRIBUTE);
seterrobj(NO_SUCH_OBJECT);
seterrobj(NOT_ALLOWED_ON_NONLEAF);
seterrobj(NOT_ALLOWED_ON_RDN);
seterrobj(NOT_SUPPORTED);
seterrobj(OBJECT_CLASS_VIOLATION);
seterrobj(OPERATIONS_ERROR);
seterrobj(OTHER);
seterrobj(PARAM_ERROR);
seterrobj(PARTIAL_RESULTS);
seterrobj(PROTOCOL_ERROR);
seterrobj(REFERRAL);
seterrobj(REFERRAL_LIMIT_EXCEEDED);
seterrobj(RESULTS_TOO_LARGE);
seterrobj(SASL_BIND_IN_PROGRESS);
seterrobj(SERVER_DOWN);
seterrobj(SIZELIMIT_EXCEEDED);
seterrobj(STRONG_AUTH_NOT_SUPPORTED);
seterrobj(STRONG_AUTH_REQUIRED);
seterrobj(SUCCESS);
seterrobj(TIMELIMIT_EXCEEDED);
seterrobj(TIMEOUT);
seterrobj(TYPE_OR_VALUE_EXISTS);
seterrobj(UNAVAILABLE);
seterrobj(UNAVAILABLE_CRITICAL_EXTENSION);
seterrobj(UNDEFINED_TYPE);
seterrobj(UNWILLING_TO_PERFORM);
seterrobj(USER_CANCELLED);
seterrobj(VLV_ERROR);
seterrobj(X_PROXY_AUTHZ_FAILURE);
#ifdef LDAP_API_FEATURE_CANCEL
seterrobj(CANCELLED);
seterrobj(NO_SUCH_OPERATION);
seterrobj(TOO_LATE);
seterrobj(CANNOT_CANCEL);
#endif
#ifdef LDAP_ASSERTION_FAILED
seterrobj(ASSERTION_FAILED);
#endif
#ifdef LDAP_PROXIED_AUTHORIZATION_DENIED
seterrobj(PROXIED_AUTHORIZATION_DENIED);
#endif
}