コード例 #1
0
ファイル: ldapsearchiter.c プロジェクト: matepeter90/PyLDAP
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;
	}
}
コード例 #2
0
ファイル: ldapconnection.c プロジェクト: ihrwein/PyLDAP
/* 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);
}