Ejemplo n.º 1
0
/*	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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
/*	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;
}
Ejemplo n.º 4
0
PyObject *
get_error(char *error_name) {
	return load_python_object("pyLDAP.errors", error_name);
}
Ejemplo n.º 5
0
/* 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);
}