Skip to content

Commit

Permalink
Add additional exception fields
Browse files Browse the repository at this point in the history
Work to improve how we raise exceptions on result, deals with controls and msgid being missing

Fixes: https://github.com/python-ldap/python-ldap/issues/177
Fixes: https://github.com/python-ldap/python-ldap/issues/208

https://github.com/python-ldap/python-ldap/pull/288
  • Loading branch information
Petr Viktorin authored and GitHub committed Jun 5, 2020
2 parents 63058a0 + 5f083fe commit 3c0f7ef
Show file tree
Hide file tree
Showing 9 changed files with 153 additions and 92 deletions.
3 changes: 3 additions & 0 deletions Doc/reference/ldap.rst
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,9 @@ The module defines the following exceptions:
is set to a truncated form of the name provided or alias dereferenced
for the lowest entry (object or alias) that was matched.

Most exceptions from protocol results also carry the :py:attr:`errnum`
attribute.


.. py:exception:: ADMINLIMIT_EXCEEDED
Expand Down
65 changes: 23 additions & 42 deletions Modules/LDAPObject.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ l_ldap_unbind_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_unbind_ext");
return LDAPerror(self->ldap);

self->valid = 0;
Py_INCREF(Py_None);
Expand Down Expand Up @@ -461,7 +461,7 @@ l_ldap_abandon_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_abandon_ext");
return LDAPerror(self->ldap);

Py_INCREF(Py_None);
return Py_None;
Expand Down Expand Up @@ -517,7 +517,7 @@ l_ldap_add_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_add_ext");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -568,7 +568,7 @@ l_ldap_simple_bind(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_simple_bind");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -727,7 +727,7 @@ l_ldap_sasl_bind_s(LDAPObject *self, PyObject *args)
servercred->bv_len);
}
else if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "l_ldap_sasl_bind_s");
return LDAPerror(self->ldap);
return PyInt_FromLong(ldaperror);
}

Expand Down Expand Up @@ -806,7 +806,7 @@ l_ldap_sasl_interactive_bind_s(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (msgid != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_sasl_interactive_bind_s");
return LDAPerror(self->ldap);
return PyInt_FromLong(msgid);
}
#endif
Expand Down Expand Up @@ -854,7 +854,7 @@ l_ldap_cancel(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_cancel");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -908,7 +908,7 @@ l_ldap_compare_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_compare_ext");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -954,7 +954,7 @@ l_ldap_delete_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_delete_ext");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -1011,7 +1011,7 @@ l_ldap_modify_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_modify_ext");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -1061,7 +1061,7 @@ l_ldap_rename(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_rename");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand All @@ -1081,12 +1081,11 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
struct timeval *tvp;
int res_type;
LDAPMessage *msg = NULL;
PyObject *result_str, *retval, *pmsg, *pyctrls = 0;
PyObject *retval, *pmsg, *pyctrls = 0;
int res_msgid = 0;
char *retoid = 0;
PyObject *valuestr = NULL;
int result = LDAP_SUCCESS;
char **refs = NULL;
LDAPControl **serverctrls = 0;

if (!PyArg_ParseTuple
Expand All @@ -1109,7 +1108,7 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
LDAP_END_ALLOW_THREADS(self);

if (res_type < 0) /* LDAP or system error */
return LDAPerror(self->ldap, "ldap_result4");
return LDAPerror(self->ldap);

if (res_type == 0) {
/* Polls return (None, None, None, None); timeouts raise an exception */
Expand Down Expand Up @@ -1157,24 +1156,15 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
}

LDAP_BEGIN_ALLOW_THREADS(self);
rc = ldap_parse_result(self->ldap, msg, &result, NULL, NULL, &refs,
rc = ldap_parse_result(self->ldap, msg, &result, NULL, NULL, NULL,
&serverctrls, 0);
LDAP_END_ALLOW_THREADS(self);
}

if (result != LDAP_SUCCESS) { /* result error */
char *e, err[1024];

if (result == LDAP_REFERRAL && refs && refs[0]) {
snprintf(err, sizeof(err), "Referral:\n%s", refs[0]);
e = err;
}
else
e = "ldap_parse_result";
ldap_controls_free(serverctrls);
ldap_msgfree(msg);
Py_XDECREF(valuestr);
return LDAPerror(self->ldap, e);
return LDAPraise_for_message(self->ldap, msg);
}

if (!(pyctrls = LDAPControls_to_List(serverctrls))) {
Expand All @@ -1186,34 +1176,26 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
ldap_controls_free(serverctrls);
ldap_msgfree(msg);
Py_XDECREF(valuestr);
return LDAPerror(self->ldap, "LDAPControls_to_List");
return LDAPerror(self->ldap);
}
ldap_controls_free(serverctrls);

pmsg =
LDAPmessage_to_python(self->ldap, msg, add_ctrls, add_intermediates);

if (res_type == 0) {
result_str = Py_None;
Py_INCREF(Py_None);
}
else {
result_str = PyInt_FromLong(res_type);
}

if (pmsg == NULL) {
retval = NULL;
}
else {
/* s handles NULL, but O does not */
if (add_extop) {
retval = Py_BuildValue("(OOiOsO)", result_str, pmsg, res_msgid,
retval = Py_BuildValue("(iOiOsO)", res_type, pmsg, res_msgid,
pyctrls, retoid,
valuestr ? valuestr : Py_None);
}
else {
retval =
Py_BuildValue("(OOiO)", result_str, pmsg, res_msgid, pyctrls);
Py_BuildValue("(iOiO)", res_type, pmsg, res_msgid, pyctrls);
}

if (pmsg != Py_None) {
Expand All @@ -1222,7 +1204,6 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
}
Py_XDECREF(valuestr);
Py_XDECREF(pyctrls);
Py_DECREF(result_str);
return retval;
}

Expand Down Expand Up @@ -1296,7 +1277,7 @@ l_ldap_search_ext(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_search_ext");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -1343,7 +1324,7 @@ l_ldap_whoami_s(LDAPObject *self, PyObject *args)

if (ldaperror != LDAP_SUCCESS) {
ber_bvfree(bvalue);
return LDAPerror(self->ldap, "ldap_whoami_s");
return LDAPerror(self->ldap);
}

result = LDAPberval_to_unicode_object(bvalue);
Expand All @@ -1370,7 +1351,7 @@ l_ldap_start_tls_s(LDAPObject *self, PyObject *args)
LDAP_END_ALLOW_THREADS(self);
if (ldaperror != LDAP_SUCCESS) {
ldap_set_option(self->ldap, LDAP_OPT_ERROR_NUMBER, &ldaperror);
return LDAPerror(self->ldap, "ldap_start_tls_s");
return LDAPerror(self->ldap);
}

Py_INCREF(Py_None);
Expand Down Expand Up @@ -1462,7 +1443,7 @@ l_ldap_passwd(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_passwd");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down Expand Up @@ -1513,7 +1494,7 @@ l_ldap_extended_operation(LDAPObject *self, PyObject *args)
LDAPControl_List_DEL(client_ldcs);

if (ldaperror != LDAP_SUCCESS)
return LDAPerror(self->ldap, "ldap_extended_operation");
return LDAPerror(self->ldap);

return PyInt_FromLong(msgid);
}
Expand Down
Loading

0 comments on commit 3c0f7ef

Please sign in to comment.