LCOV - code coverage report
Current view: top level - Modules - constants.c (source / functions) Hit Total Coverage
Test: python-ldap LCOV report Lines: 53 68 77.9 %
Date: 2017-12-08 13:03:20 Functions: 3 3 100.0 %

          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             : }

Generated by: LCOV version 1.12