/* Set distinguished name for a LDAPEntry. */ static int LDAPEntry_setDN(LDAPEntry *self, PyObject *value, void *closure) { PyObject *dn = NULL; PyObject *ldapdn_type = load_python_object("pyLDAP.ldapdn", "LDAPDN"); if (ldapdn_type == NULL) return -1; if (value == NULL) { PyErr_SetString(PyExc_TypeError, "Cannot delete the DN attribute."); return -1; } if (PyUnicode_Check(value)) { dn = PyObject_CallFunctionObjArgs(ldapdn_type, value, NULL); /* Check for valid DN. */ if (dn == NULL) { return -1; } else { Py_DECREF(self->dn); self->dn = dn; } } else if (PyObject_IsInstance(value, ldapdn_type)) { Py_DECREF(self->dn); Py_INCREF(value); self->dn = value; } else { PyErr_SetString(PyExc_TypeError, "The DN attribute value must be an LDAPDN or a string."); return -1; } Py_DECREF(ldapdn_type); return 0; }
PyObject * get_error_by_code(int code) { PyObject *error; PyObject *get_error = load_python_object("pyLDAP.errors", "get_error"); if (get_error == NULL) return NULL; error = PyObject_CallFunction(get_error, "(i)", code); return error; }
/* Initialize the LDAPConnection. */ static int LDAPConnection_init(LDAPConnection *self, PyObject *args, PyObject *kwds) { PyObject *async_obj = NULL; PyObject *client = NULL; PyObject *ldapclient_type = NULL; PyObject *tmp = NULL; PyObject *page_size = NULL, *sort_list = NULL; static char *kwlist[] = {"client", "async", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O!", kwlist, &client, &PyBool_Type, &async_obj)) { return -1; } if (async_obj != NULL) self->async = PyObject_IsTrue(async_obj); ldapclient_type = load_python_object("pyldap.ldapclient", "LDAPClient"); if (ldapclient_type == NULL || !PyObject_IsInstance(client, ldapclient_type)) { return -1; } Py_DECREF(ldapclient_type); if (client) { tmp = self->client; Py_INCREF(client); self->client = client; Py_XDECREF(tmp); /* Get page size from the client. */ page_size = PyObject_GetAttrString(self->client, "_LDAPClient__page_size"); if (page_size == NULL) return -1; self->page_size = (int)PyLong_AsLong(page_size); Py_DECREF(page_size); if (PyErr_Occurred()) return -1; /* Get sort list from the client. */ sort_list = PyObject_GetAttrString(self->client, "_LDAPClient__sort_attrs"); if (PyList_Size(sort_list) > 0) { self->sort_list = PyList2LDAPSortKeyList(sort_list); if (self->sort_list == NULL) { PyErr_BadInternalCall(); return -1; } } return connecting(self); } return -1; }
PyObject * get_error(char *error_name) { return load_python_object("pyLDAP.errors", error_name); }
/* Searches for LDAP entries. */ static PyObject * LDAPConnection_Search(LDAPConnection *self, PyObject *args, PyObject *kwds) { int scope = -1; int timeout = 0, sizelimit = 0, attrsonly = 0; char *basestr = NULL; char *filterstr = NULL; char **attrs = NULL; PyObject *ldapdn_type = NULL; PyObject *basedn = NULL; PyObject *attrlist = NULL; PyObject *attrsonlyo = NULL; PyObject *url = NULL; LDAPSearchIter *search_iter = NULL; static char *kwlist[] = {"base", "scope", "filter", "attrlist", "timeout", "sizelimit", "attrsonly", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OizO!iiO!", kwlist, &basedn, &scope, &filterstr, &PyList_Type, &attrlist, &timeout, &sizelimit, &PyBool_Type, &attrsonlyo)) { PyErr_SetString(PyExc_AttributeError, "Wrong parameters (base<str|LDAPDN>, scope<int>, filter<str>, attrlist<List>, timeout<int>, attrsonly<bool>)."); return NULL; } /* Load LDAPDN to check basedn's type.*/ ldapdn_type = load_python_object("pyldap.ldapdn", "LDAPDN"); if (ldapdn_type == NULL) return NULL; /* Get additional informations from the LDAP URL. */ url = PyObject_GetAttrString(self->client, "_LDAPClient__url"); if (url == NULL) return NULL; if (basedn != NULL && (PyObject_IsInstance(basedn, ldapdn_type) || PyUnicode_Check(basedn))) { /* If basedn is an LDAPDN object convert to Python string. If basedn already a string increment reference. */ basedn = PyObject_Str(basedn); if (basedn == NULL) { Py_DECREF(url); Py_DECREF(ldapdn_type); return NULL; } /* Convert the basedn to char*. */ basestr = PyObject2char(basedn); Py_DECREF(basedn); basedn = NULL; } Py_DECREF(ldapdn_type); if (basedn != NULL) { PyErr_SetString(PyExc_AttributeError, "Wrong parameters, `base` must be string or LDAPDN"); return NULL; } search_iter = LDAPSearchIter_New(self); if (search_iter == NULL) { return PyErr_NoMemory(); } if (basestr == NULL) { basedn = PyObject_GetAttrString(url, "basedn"); if (basedn == NULL) { Py_DECREF(search_iter); Py_DECREF(url); return NULL; } if (basedn == Py_None) { Py_DECREF(basedn); PyErr_SetString(PyExc_AttributeError, "Search base DN cannot be None."); Py_DECREF(search_iter); Py_DECREF(url); return NULL; } else { basestr = PyObject2char(basedn); Py_DECREF(basedn); if (basestr == NULL) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } } } if (scope == -1) { PyObject *scopeobj = PyObject_GetAttrString(url, "scope_num"); if (scopeobj == NULL) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } if (scopeobj == Py_None) { Py_DECREF(scopeobj); Py_DECREF(url); PyErr_SetString(PyExc_AttributeError, "Search scope cannot be None."); return NULL; } else { scope = PyLong_AsLong(scopeobj); Py_DECREF(scopeobj); if (scope == -1) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } } } if (filterstr == NULL) { PyObject *filter = PyObject_GetAttrString(url, "filter"); if (filter == NULL) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } if (filter == Py_None) { Py_DECREF(filter); } else { filterstr = PyObject2char(filter); Py_DECREF(filter); if (filterstr == NULL) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } } } if (attrsonlyo != NULL) { attrsonly = PyObject_IsTrue(attrsonlyo); } if (attrlist == NULL) { PyObject *attr_list = PyObject_GetAttrString(url, "attributes"); if (attr_list == NULL) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } attrs = PyList2StringList(attr_list); Py_DECREF(attr_list); } else { attrs = PyList2StringList(attrlist); } Py_DECREF(url); if (LDAPSearchIter_SetParams(search_iter, attrs, attrsonly, basestr, filterstr, scope, sizelimit, timeout) != 0) { Py_DECREF(url); Py_DECREF(search_iter); return NULL; } if (self->page_size > 0) { /* Create cookie for the page result. */ search_iter->cookie = (struct berval *)malloc(sizeof(struct berval)); if (search_iter->cookie == NULL) return PyErr_NoMemory(); search_iter->cookie->bv_len = 0; search_iter->cookie->bv_val = NULL; /* Get the first page, and create an iterator for the next. */ search_iter->buffer = LDAPConnection_Searching(self, (PyObject *)search_iter); if (search_iter->buffer == NULL) return NULL; return (PyObject *)search_iter; } return LDAPConnection_Searching(self, (PyObject *)search_iter); }