Line data Source code
1 : /* constants defined for LDAP
2 : * See https://www.python-ldap.org/ for details. */
3 :
4 : #include "common.h"
5 : #include "constants.h"
6 : #include "lber.h"
7 : #include "ldap.h"
8 :
9 : /* the base exception class */
10 :
11 : PyObject*
12 : LDAPexception_class;
13 :
14 : /* list of exception classes */
15 :
16 : #define LDAP_ERROR_MIN LDAP_REFERRAL_LIMIT_EXCEEDED
17 :
18 : #ifdef LDAP_PROXIED_AUTHORIZATION_DENIED
19 : #define LDAP_ERROR_MAX LDAP_PROXIED_AUTHORIZATION_DENIED
20 : #else
21 : #ifdef LDAP_ASSERTION_FAILED
22 : #define LDAP_ERROR_MAX LDAP_ASSERTION_FAILED
23 : #else
24 : #define LDAP_ERROR_MAX LDAP_OTHER
25 : #endif
26 : #endif
27 :
28 : #define LDAP_ERROR_OFFSET -LDAP_ERROR_MIN
29 :
30 : static PyObject* errobjects[ LDAP_ERROR_MAX-LDAP_ERROR_MIN+1 ];
31 :
32 :
33 : /* Convert a bare LDAP error number into an exception */
34 : PyObject*
35 10 : LDAPerr(int errnum)
36 : {
37 10 : if (errnum >= LDAP_ERROR_MIN && errnum <= LDAP_ERROR_MAX) {
38 10 : PyErr_SetNone(errobjects[errnum+LDAP_ERROR_OFFSET]);
39 : } else {
40 0 : PyObject *args = Py_BuildValue("{s:i}", "errnum", errnum);
41 0 : if (args == NULL)
42 0 : return NULL;
43 0 : PyErr_SetObject(LDAPexception_class, args);
44 0 : Py_DECREF(args);
45 : }
46 10 : return NULL;
47 : }
48 :
49 : /* Convert an LDAP error into an informative python exception */
50 : PyObject*
51 25 : LDAPerror( LDAP *l, char *msg )
52 : {
53 25 : if (l == NULL) {
54 0 : PyErr_SetFromErrno( LDAPexception_class );
55 0 : return NULL;
56 : }
57 : else {
58 : int myerrno, errnum, opt_errnum;
59 : PyObject *errobj;
60 : PyObject *info;
61 : PyObject *str;
62 : PyObject *pyerrno;
63 : char *matched, *error;
64 :
65 : /* at first save errno for later use before it gets overwritten by another call */
66 25 : myerrno = errno;
67 :
68 25 : opt_errnum = ldap_get_option(l, LDAP_OPT_ERROR_NUMBER, &errnum);
69 25 : if (opt_errnum != LDAP_OPT_SUCCESS)
70 0 : errnum = opt_errnum;
71 :
72 25 : if (errnum == LDAP_NO_MEMORY)
73 25 : return PyErr_NoMemory();
74 :
75 25 : if (errnum >= LDAP_ERROR_MIN && errnum <= LDAP_ERROR_MAX)
76 25 : errobj = errobjects[errnum+LDAP_ERROR_OFFSET];
77 : else
78 0 : errobj = LDAPexception_class;
79 :
80 25 : info = PyDict_New();
81 25 : if (info == NULL)
82 0 : return NULL;
83 :
84 25 : str = PyUnicode_FromString(ldap_err2string(errnum));
85 25 : if (str)
86 25 : PyDict_SetItemString( info, "desc", str );
87 25 : Py_XDECREF(str);
88 :
89 25 : if (myerrno != 0) {
90 6 : pyerrno = PyInt_FromLong(myerrno);
91 6 : if (pyerrno)
92 6 : PyDict_SetItemString( info, "errno", pyerrno );
93 6 : Py_XDECREF(pyerrno);
94 : }
95 :
96 25 : if (ldap_get_option(l, LDAP_OPT_MATCHED_DN, &matched) >= 0
97 25 : && matched != NULL) {
98 3 : if (*matched != '\0') {
99 3 : str = PyUnicode_FromString(matched);
100 3 : if (str)
101 3 : PyDict_SetItemString( info, "matched", str );
102 3 : Py_XDECREF(str);
103 : }
104 3 : ldap_memfree(matched);
105 : }
106 :
107 25 : if (errnum == LDAP_REFERRAL) {
108 0 : str = PyUnicode_FromString(msg);
109 0 : if (str)
110 0 : PyDict_SetItemString( info, "info", str );
111 0 : Py_XDECREF(str);
112 25 : } else if (ldap_get_option(l, LDAP_OPT_ERROR_STRING, &error) >= 0) {
113 25 : if (error != NULL && *error != '\0') {
114 3 : str = PyUnicode_FromString(error);
115 3 : if (str)
116 3 : PyDict_SetItemString( info, "info", str );
117 3 : Py_XDECREF(str);
118 : }
119 25 : ldap_memfree(error);
120 : }
121 25 : PyErr_SetObject( errobj, info );
122 25 : Py_DECREF(info);
123 25 : return NULL;
124 : }
125 : }
126 :
127 : /* initialise the module constants */
128 :
129 : int
130 1 : LDAPinit_constants( PyObject* m )
131 : {
132 : PyObject *exc;
133 :
134 : /* simple constants */
135 :
136 1 : if (PyModule_AddIntConstant(m, "OPT_ON", 1) != 0) return -1;
137 1 : if (PyModule_AddIntConstant(m, "OPT_OFF", 0) != 0) return -1;
138 :
139 : /* exceptions */
140 :
141 1 : LDAPexception_class = PyErr_NewException("ldap.LDAPError", NULL, NULL);
142 1 : if (LDAPexception_class == NULL) {
143 0 : return -1;
144 : }
145 :
146 1 : if (PyModule_AddObject(m, "LDAPError", LDAPexception_class) != 0) return -1;
147 1 : Py_INCREF(LDAPexception_class);
148 :
149 : /* XXX - backward compatibility with pre-1.8 */
150 1 : if (PyModule_AddObject(m, "error", LDAPexception_class) != 0) return -1;
151 1 : Py_INCREF(LDAPexception_class);
152 :
153 : /* Generated constants -- see Lib/ldap/constants.py */
154 :
155 : #define add_err(n) do { \
156 : exc = PyErr_NewException("ldap." #n, LDAPexception_class, NULL); \
157 : if (exc == NULL) return -1; \
158 : errobjects[LDAP_##n+LDAP_ERROR_OFFSET] = exc; \
159 : if (PyModule_AddObject(m, #n, exc) != 0) return -1; \
160 : Py_INCREF(exc); \
161 : } while (0)
162 :
163 : #define add_int(n) do { \
164 : if (PyModule_AddIntConstant(m, #n, LDAP_##n) != 0) return -1; \
165 : } while (0)
166 :
167 : #define add_string(n) do { \
168 : if (PyModule_AddStringConstant(m, #n, LDAP_##n) != 0) return -1; \
169 : } while (0)
170 :
171 : #include "constants_generated.h"
172 :
173 1 : return 0;
174 : }
|