static PyObject * LDAPSearchIter_AcquireNextPage(LDAPSearchIter *self) { int msgid = -1; /* If paged LDAP search is in progress. */ if ((self->cookie != NULL) && (self->cookie->bv_val != NULL) && (strlen(self->cookie->bv_val) > 0)) { msgid = LDAPConnection_Searching(self->conn, (PyObject *)self); if (msgid < 0) return NULL; return PyLong_FromLong((long int)msgid); } else { ber_bvfree(self->cookie); self->cookie = NULL; Py_RETURN_NONE; } }
/* 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); }