152 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* See http://www.python-ldap.org/ for details.
 | 
						|
 * $Id: functions.c,v 1.27 2009/08/17 05:00:57 leonard Exp $ */
 | 
						|
 | 
						|
#include "common.h"
 | 
						|
#include "functions.h"
 | 
						|
#include "LDAPObject.h"
 | 
						|
#include "berval.h"
 | 
						|
#include "errors.h"
 | 
						|
#include "options.h"
 | 
						|
 | 
						|
/* ldap_initialize */
 | 
						|
 | 
						|
static PyObject*
 | 
						|
l_ldap_initialize(PyObject* unused, PyObject *args)
 | 
						|
{
 | 
						|
    char *uri;
 | 
						|
    LDAP *ld = NULL;
 | 
						|
    int ret;
 | 
						|
 | 
						|
    if (!PyArg_ParseTuple(args, "s", &uri))
 | 
						|
    	return NULL;
 | 
						|
 | 
						|
    Py_BEGIN_ALLOW_THREADS
 | 
						|
    ret = ldap_initialize(&ld, uri);
 | 
						|
    Py_END_ALLOW_THREADS
 | 
						|
    if (ret != LDAP_SUCCESS)
 | 
						|
    	return LDAPerror(ld, "ldap_initialize");
 | 
						|
    return (PyObject*)newLDAPObject(ld);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* ldap_str2dn */
 | 
						|
 | 
						|
static PyObject*
 | 
						|
l_ldap_str2dn( PyObject* unused, PyObject *args )
 | 
						|
{
 | 
						|
    struct berval str;
 | 
						|
    LDAPDN dn;
 | 
						|
    int flags = 0;
 | 
						|
    PyObject *result = NULL, *tmp;
 | 
						|
    int res, i, j;
 | 
						|
    Py_ssize_t str_len;
 | 
						|
 | 
						|
    /*
 | 
						|
     * From a DN string such as "a=b,c=d;e=f", build
 | 
						|
     * a list-equivalent of AVA structures; namely:
 | 
						|
     * ((('a','b',1),('c','d',1)),(('e','f',1),))
 | 
						|
     * The integers are a bit combination of the AVA_* flags
 | 
						|
     */
 | 
						|
    if (!PyArg_ParseTuple( args, "z#|i:str2dn", 
 | 
						|
	    &str.bv_val, &str_len, &flags )) 
 | 
						|
	return NULL;
 | 
						|
    str.bv_len = (ber_len_t) str_len;
 | 
						|
 | 
						|
    res = ldap_bv2dn(&str, &dn, flags);
 | 
						|
    if (res != LDAP_SUCCESS)
 | 
						|
	return LDAPerr(res);
 | 
						|
 | 
						|
    tmp = PyList_New(0);
 | 
						|
    if (!tmp)
 | 
						|
	goto failed;
 | 
						|
 | 
						|
    for (i = 0; dn[i]; i++) {
 | 
						|
	LDAPRDN rdn;
 | 
						|
	PyObject *rdnlist;
 | 
						|
 | 
						|
	rdn = dn[i];
 | 
						|
	rdnlist = PyList_New(0);
 | 
						|
	if (!rdnlist)
 | 
						|
	    goto failed;
 | 
						|
	if (PyList_Append(tmp, rdnlist) == -1) {
 | 
						|
	    Py_DECREF(rdnlist);
 | 
						|
	    goto failed;
 | 
						|
	}
 | 
						|
 | 
						|
	for (j = 0; rdn[j]; j++) {
 | 
						|
	    LDAPAVA *ava = rdn[j];
 | 
						|
	    PyObject *tuple;
 | 
						|
 | 
						|
	    tuple = Py_BuildValue("(O&O&i)", 
 | 
						|
		LDAPberval_to_object, &ava->la_attr,
 | 
						|
		LDAPberval_to_object, &ava->la_value,
 | 
						|
		ava->la_flags & ~(LDAP_AVA_FREE_ATTR|LDAP_AVA_FREE_VALUE));
 | 
						|
	    if (!tuple) {
 | 
						|
		Py_DECREF(rdnlist);
 | 
						|
		goto failed;
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (PyList_Append(rdnlist, tuple) == -1) {
 | 
						|
		Py_DECREF(tuple);
 | 
						|
		goto failed;
 | 
						|
	    }
 | 
						|
	    Py_DECREF(tuple);
 | 
						|
	}
 | 
						|
	Py_DECREF(rdnlist);
 | 
						|
    }
 | 
						|
 | 
						|
    result = tmp;
 | 
						|
    tmp = NULL;
 | 
						|
 | 
						|
failed:
 | 
						|
    Py_XDECREF(tmp);
 | 
						|
    ldap_dnfree(dn);
 | 
						|
    return result;
 | 
						|
}
 | 
						|
 | 
						|
/* ldap_set_option (global options) */
 | 
						|
 | 
						|
static PyObject*
 | 
						|
l_ldap_set_option(PyObject* self, PyObject *args)
 | 
						|
{
 | 
						|
    PyObject *value;
 | 
						|
    int option;
 | 
						|
 | 
						|
    if (!PyArg_ParseTuple(args, "iO:set_option", &option, &value))
 | 
						|
	return NULL;
 | 
						|
    if (!LDAP_set_option(NULL, option, value))
 | 
						|
	return NULL;
 | 
						|
    Py_INCREF(Py_None);
 | 
						|
    return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
/* ldap_get_option (global options) */
 | 
						|
 | 
						|
static PyObject*
 | 
						|
l_ldap_get_option(PyObject* self, PyObject *args)
 | 
						|
{
 | 
						|
    int option;
 | 
						|
 | 
						|
    if (!PyArg_ParseTuple(args, "i:get_option", &option))
 | 
						|
	return NULL;
 | 
						|
    return LDAP_get_option(NULL, option);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* methods */
 | 
						|
 | 
						|
static PyMethodDef methods[] = {
 | 
						|
    { "initialize",	(PyCFunction)l_ldap_initialize,		METH_VARARGS },
 | 
						|
    { "str2dn",	    (PyCFunction)l_ldap_str2dn,			METH_VARARGS },
 | 
						|
    { "set_option", (PyCFunction)l_ldap_set_option,		METH_VARARGS },
 | 
						|
    { "get_option", (PyCFunction)l_ldap_get_option,		METH_VARARGS },
 | 
						|
    { NULL, NULL }
 | 
						|
};
 | 
						|
 | 
						|
/* initialisation */
 | 
						|
 | 
						|
void
 | 
						|
LDAPinit_functions( PyObject* d ) {
 | 
						|
    LDAPadd_methods( d, methods );
 | 
						|
}
 |