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: python-ldap#177 Fixes: python-ldap#208 python-ldap#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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy