Skip to content

Commit 3c0f7ef

Browse files
authored
Add additional exception fields
Work to improve how we raise exceptions on result, deals with controls and msgid being missing Fixes: #177 Fixes: #208 #288
2 parents 63058a0 + 5f083fe commit 3c0f7ef

File tree

9 files changed

+153
-92
lines changed

9 files changed

+153
-92
lines changed

Doc/reference/ldap.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,9 @@ The module defines the following exceptions:
321321
is set to a truncated form of the name provided or alias dereferenced
322322
for the lowest entry (object or alias) that was matched.
323323

324+
Most exceptions from protocol results also carry the :py:attr:`errnum`
325+
attribute.
326+
324327

325328
.. py:exception:: ADMINLIMIT_EXCEEDED
326329

Modules/LDAPObject.c

Lines changed: 23 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ l_ldap_unbind_ext(LDAPObject *self, PyObject *args)
415415
LDAPControl_List_DEL(client_ldcs);
416416

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

420420
self->valid = 0;
421421
Py_INCREF(Py_None);
@@ -461,7 +461,7 @@ l_ldap_abandon_ext(LDAPObject *self, PyObject *args)
461461
LDAPControl_List_DEL(client_ldcs);
462462

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

466466
Py_INCREF(Py_None);
467467
return Py_None;
@@ -517,7 +517,7 @@ l_ldap_add_ext(LDAPObject *self, PyObject *args)
517517
LDAPControl_List_DEL(client_ldcs);
518518

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

522522
return PyInt_FromLong(msgid);
523523
}
@@ -568,7 +568,7 @@ l_ldap_simple_bind(LDAPObject *self, PyObject *args)
568568
LDAPControl_List_DEL(client_ldcs);
569569

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

573573
return PyInt_FromLong(msgid);
574574
}
@@ -727,7 +727,7 @@ l_ldap_sasl_bind_s(LDAPObject *self, PyObject *args)
727727
servercred->bv_len);
728728
}
729729
else if (ldaperror != LDAP_SUCCESS)
730-
return LDAPerror(self->ldap, "l_ldap_sasl_bind_s");
730+
return LDAPerror(self->ldap);
731731
return PyInt_FromLong(ldaperror);
732732
}
733733

@@ -806,7 +806,7 @@ l_ldap_sasl_interactive_bind_s(LDAPObject *self, PyObject *args)
806806
LDAPControl_List_DEL(client_ldcs);
807807

808808
if (msgid != LDAP_SUCCESS)
809-
return LDAPerror(self->ldap, "ldap_sasl_interactive_bind_s");
809+
return LDAPerror(self->ldap);
810810
return PyInt_FromLong(msgid);
811811
}
812812
#endif
@@ -854,7 +854,7 @@ l_ldap_cancel(LDAPObject *self, PyObject *args)
854854
LDAPControl_List_DEL(client_ldcs);
855855

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

859859
return PyInt_FromLong(msgid);
860860
}
@@ -908,7 +908,7 @@ l_ldap_compare_ext(LDAPObject *self, PyObject *args)
908908
LDAPControl_List_DEL(client_ldcs);
909909

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

913913
return PyInt_FromLong(msgid);
914914
}
@@ -954,7 +954,7 @@ l_ldap_delete_ext(LDAPObject *self, PyObject *args)
954954
LDAPControl_List_DEL(client_ldcs);
955955

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

959959
return PyInt_FromLong(msgid);
960960
}
@@ -1011,7 +1011,7 @@ l_ldap_modify_ext(LDAPObject *self, PyObject *args)
10111011
LDAPControl_List_DEL(client_ldcs);
10121012

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

10161016
return PyInt_FromLong(msgid);
10171017
}
@@ -1061,7 +1061,7 @@ l_ldap_rename(LDAPObject *self, PyObject *args)
10611061
LDAPControl_List_DEL(client_ldcs);
10621062

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

10661066
return PyInt_FromLong(msgid);
10671067
}
@@ -1081,12 +1081,11 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
10811081
struct timeval *tvp;
10821082
int res_type;
10831083
LDAPMessage *msg = NULL;
1084-
PyObject *result_str, *retval, *pmsg, *pyctrls = 0;
1084+
PyObject *retval, *pmsg, *pyctrls = 0;
10851085
int res_msgid = 0;
10861086
char *retoid = 0;
10871087
PyObject *valuestr = NULL;
10881088
int result = LDAP_SUCCESS;
1089-
char **refs = NULL;
10901089
LDAPControl **serverctrls = 0;
10911090

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

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

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

11591158
LDAP_BEGIN_ALLOW_THREADS(self);
1160-
rc = ldap_parse_result(self->ldap, msg, &result, NULL, NULL, &refs,
1159+
rc = ldap_parse_result(self->ldap, msg, &result, NULL, NULL, NULL,
11611160
&serverctrls, 0);
11621161
LDAP_END_ALLOW_THREADS(self);
11631162
}
11641163

11651164
if (result != LDAP_SUCCESS) { /* result error */
1166-
char *e, err[1024];
1167-
1168-
if (result == LDAP_REFERRAL && refs && refs[0]) {
1169-
snprintf(err, sizeof(err), "Referral:\n%s", refs[0]);
1170-
e = err;
1171-
}
1172-
else
1173-
e = "ldap_parse_result";
11741165
ldap_controls_free(serverctrls);
1175-
ldap_msgfree(msg);
11761166
Py_XDECREF(valuestr);
1177-
return LDAPerror(self->ldap, e);
1167+
return LDAPraise_for_message(self->ldap, msg);
11781168
}
11791169

11801170
if (!(pyctrls = LDAPControls_to_List(serverctrls))) {
@@ -1186,34 +1176,26 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
11861176
ldap_controls_free(serverctrls);
11871177
ldap_msgfree(msg);
11881178
Py_XDECREF(valuestr);
1189-
return LDAPerror(self->ldap, "LDAPControls_to_List");
1179+
return LDAPerror(self->ldap);
11901180
}
11911181
ldap_controls_free(serverctrls);
11921182

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

1196-
if (res_type == 0) {
1197-
result_str = Py_None;
1198-
Py_INCREF(Py_None);
1199-
}
1200-
else {
1201-
result_str = PyInt_FromLong(res_type);
1202-
}
1203-
12041186
if (pmsg == NULL) {
12051187
retval = NULL;
12061188
}
12071189
else {
12081190
/* s handles NULL, but O does not */
12091191
if (add_extop) {
1210-
retval = Py_BuildValue("(OOiOsO)", result_str, pmsg, res_msgid,
1192+
retval = Py_BuildValue("(iOiOsO)", res_type, pmsg, res_msgid,
12111193
pyctrls, retoid,
12121194
valuestr ? valuestr : Py_None);
12131195
}
12141196
else {
12151197
retval =
1216-
Py_BuildValue("(OOiO)", result_str, pmsg, res_msgid, pyctrls);
1198+
Py_BuildValue("(iOiO)", res_type, pmsg, res_msgid, pyctrls);
12171199
}
12181200

12191201
if (pmsg != Py_None) {
@@ -1222,7 +1204,6 @@ l_ldap_result4(LDAPObject *self, PyObject *args)
12221204
}
12231205
Py_XDECREF(valuestr);
12241206
Py_XDECREF(pyctrls);
1225-
Py_DECREF(result_str);
12261207
return retval;
12271208
}
12281209

@@ -1296,7 +1277,7 @@ l_ldap_search_ext(LDAPObject *self, PyObject *args)
12961277
LDAPControl_List_DEL(client_ldcs);
12971278

12981279
if (ldaperror != LDAP_SUCCESS)
1299-
return LDAPerror(self->ldap, "ldap_search_ext");
1280+
return LDAPerror(self->ldap);
13001281

13011282
return PyInt_FromLong(msgid);
13021283
}
@@ -1343,7 +1324,7 @@ l_ldap_whoami_s(LDAPObject *self, PyObject *args)
13431324

13441325
if (ldaperror != LDAP_SUCCESS) {
13451326
ber_bvfree(bvalue);
1346-
return LDAPerror(self->ldap, "ldap_whoami_s");
1327+
return LDAPerror(self->ldap);
13471328
}
13481329

13491330
result = LDAPberval_to_unicode_object(bvalue);
@@ -1370,7 +1351,7 @@ l_ldap_start_tls_s(LDAPObject *self, PyObject *args)
13701351
LDAP_END_ALLOW_THREADS(self);
13711352
if (ldaperror != LDAP_SUCCESS) {
13721353
ldap_set_option(self->ldap, LDAP_OPT_ERROR_NUMBER, &ldaperror);
1373-
return LDAPerror(self->ldap, "ldap_start_tls_s");
1354+
return LDAPerror(self->ldap);
13741355
}
13751356

13761357
Py_INCREF(Py_None);
@@ -1462,7 +1443,7 @@ l_ldap_passwd(LDAPObject *self, PyObject *args)
14621443
LDAPControl_List_DEL(client_ldcs);
14631444

14641445
if (ldaperror != LDAP_SUCCESS)
1465-
return LDAPerror(self->ldap, "ldap_passwd");
1446+
return LDAPerror(self->ldap);
14661447

14671448
return PyInt_FromLong(msgid);
14681449
}
@@ -1513,7 +1494,7 @@ l_ldap_extended_operation(LDAPObject *self, PyObject *args)
15131494
LDAPControl_List_DEL(client_ldcs);
15141495

15151496
if (ldaperror != LDAP_SUCCESS)
1516-
return LDAPerror(self->ldap, "ldap_extended_operation");
1497+
return LDAPerror(self->ldap);
15171498

15181499
return PyInt_FromLong(msgid);
15191500
}

0 commit comments

Comments
 (0)