diff options
Diffstat (limited to 'lualdap/src')
-rwxr-xr-x | lualdap/src/lualdap.c | 1000 | ||||
-rwxr-xr-x | lualdap/src/lualdap.def | 6 | ||||
-rwxr-xr-x | lualdap/src/open2winldap.h | 47 |
3 files changed, 0 insertions, 1053 deletions
diff --git a/lualdap/src/lualdap.c b/lualdap/src/lualdap.c deleted file mode 100755 index b3a56be..0000000 --- a/lualdap/src/lualdap.c +++ /dev/null @@ -1,1000 +0,0 @@ -/* -** LuaLDAP -** See Copyright Notice in license.html -** $Id: lualdap.c,v 1.48 2007-12-14 15:11:22 carregal Exp $ -*/ - -#include <stdlib.h> -#include <string.h> - -#ifdef WIN32 -#include <Winsock2.h> -#else -#include <sys/time.h> -#endif - -#ifdef WINLDAP -#include "open2winldap.h" -#else -#include "ldap.h" -#endif - -#include "lua.h" -#include "lauxlib.h" -#if ! defined (LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 -#include "compat-5.1.h" -#endif - -#ifdef WINLDAPAPI -#define timeval l_timeval -typedef ULONG ldap_int_t; -typedef PCHAR ldap_pchar_t; -#else -typedef int ldap_int_t; -typedef const char * ldap_pchar_t; -#endif - -#define LUALDAP_PREFIX "LuaLDAP: " -#define LUALDAP_TABLENAME "lualdap" -#define LUALDAP_CONNECTION_METATABLE "LuaLDAP connection" -#define LUALDAP_SEARCH_METATABLE "LuaLDAP search" - -#define LUALDAP_MOD_ADD (LDAP_MOD_ADD | LDAP_MOD_BVALUES) -#define LUALDAP_MOD_DEL (LDAP_MOD_DELETE | LDAP_MOD_BVALUES) -#define LUALDAP_MOD_REP (LDAP_MOD_REPLACE | LDAP_MOD_BVALUES) -#define LUALDAP_NO_OP 0 - -/* Maximum number of attributes manipulated in an operation */ -#ifndef LUALDAP_MAX_ATTRS -#define LUALDAP_MAX_ATTRS 100 -#endif - -/* Size of buffer of NULL-terminated arrays of pointers to struct values */ -#ifndef LUALDAP_ARRAY_VALUES_SIZE -#define LUALDAP_ARRAY_VALUES_SIZE (2 * LUALDAP_MAX_ATTRS) -#endif - -/* Maximum number of values structures */ -#ifndef LUALDAP_MAX_VALUES -#define LUALDAP_MAX_VALUES (LUALDAP_ARRAY_VALUES_SIZE / 2) -#endif - - -/* LDAP connection information */ -typedef struct { - int version; /* LDAP version */ - LDAP *ld; /* LDAP connection */ -} conn_data; - - -/* LDAP search context information */ -typedef struct { - int conn; /* conn_data reference */ - int msgid; -} search_data; - - -/* LDAP attribute modification structure */ -typedef struct { - LDAPMod *attrs[LUALDAP_MAX_ATTRS + 1]; - LDAPMod mods[LUALDAP_MAX_ATTRS]; - int ai; - BerValue *values[LUALDAP_ARRAY_VALUES_SIZE]; - int vi; - BerValue bvals[LUALDAP_MAX_VALUES]; - int bi; -} attrs_data; - - -int luaopen_lualdap (lua_State *L); - - -/* -** Typical error situation. -*/ -static int faildirect (lua_State *L, const char *errmsg) { - lua_pushnil (L); - lua_pushstring (L, errmsg); - return 2; -} - - -/* -** Get a connection object from the first stack position. -*/ -static conn_data *getconnection (lua_State *L) { - conn_data *conn = (conn_data *)luaL_checkudata (L, 1, LUALDAP_CONNECTION_METATABLE); - luaL_argcheck(L, conn!=NULL, 1, LUALDAP_PREFIX"LDAP connection expected"); - luaL_argcheck(L, conn->ld, 1, LUALDAP_PREFIX"LDAP connection is closed"); - return conn; -} - - -/* -** Get a search object from the first upvalue position. -*/ -static search_data *getsearch (lua_State *L) { - /* don't need to check upvalue's integrity */ - search_data *search = (search_data *)lua_touserdata (L, lua_upvalueindex (1)); - luaL_argcheck (L,search->conn!=LUA_NOREF,1,LUALDAP_PREFIX"LDAP search is closed"); - return search; -} - - -/* -** Set metatable of userdata on top of the stack. -*/ -static void lualdap_setmeta (lua_State *L, const char *name) { - luaL_getmetatable (L, name); - lua_setmetatable (L, -2); -} - - -/* -** Error on option. -*/ -static int option_error (lua_State *L, const char *name, const char *type) { - return luaL_error (L, LUALDAP_PREFIX"invalid value on option `%s': %s expected, got %s", name, type, lua_typename (L, lua_type (L, -1))); -} - - -/* -** Get the field called name of the table at position 2. -*/ -static void strgettable (lua_State *L, const char *name) { - lua_pushstring (L, name); - lua_gettable (L, 2); -} - - -/* -** Get the field named name as a string. -** The table MUST be at position 2. -*/ -static const char *strtabparam (lua_State *L, const char *name, char *def) { - strgettable (L, name); - if (lua_isnil (L, -1)) - return def; - else if (lua_isstring (L, -1)) - return lua_tostring (L, -1); - else { - option_error (L, name, "string"); - return NULL; - } -} - - -/* -** Get the field named name as an integer. -** The table MUST be at position 2. -*/ -static long longtabparam (lua_State *L, const char *name, int def) { - strgettable (L, name); - if (lua_isnil (L, -1)) - return def; - else if (lua_isnumber (L, -1)) - return (long)lua_tonumber (L, -1); - else - return option_error (L, name, "number"); -} - - -/* -** Get the field named name as a double. -** The table MUST be at position 2. -*/ -static double numbertabparam (lua_State *L, const char *name, double def) { - strgettable (L, name); - if (lua_isnil (L, -1)) - return def; - else if (lua_isnumber (L, -1)) - return lua_tonumber (L, -1); - else - return option_error (L, name, "number"); -} - - -/* -** Get the field named name as a boolean. -** The table MUST be at position 2. -*/ -static int booltabparam (lua_State *L, const char *name, int def) { - strgettable (L, name); - if (lua_isnil (L, -1)) - return def; - else if (lua_isboolean (L, -1)) - return lua_toboolean (L, -1); - else - return option_error (L, name, "boolean"); -} - - -/* -** Error on attribute's value. -*/ -static void value_error (lua_State *L, const char *name) { - luaL_error (L, LUALDAP_PREFIX"invalid value of attribute `%s' (%s)", - name, lua_typename (L, lua_type (L, -1))); -} - - -/* -** Initialize attributes structure. -*/ -static void A_init (attrs_data *attrs) { - attrs->ai = 0; - attrs->attrs[0] = NULL; - attrs->vi = 0; - attrs->values[0] = NULL; - attrs->bi = 0; -} - - -/* -** Store the string on top of the stack on the attributes structure. -** Increment the bvals counter. -*/ -static BerValue *A_setbval (lua_State *L, attrs_data *a, const char *n) { - BerValue *ret = &(a->bvals[a->bi]); - if (a->bi >= LUALDAP_MAX_VALUES) { - luaL_error (L, LUALDAP_PREFIX"too many values"); - return NULL; - } else if (!lua_isstring (L, -1)) { - value_error (L, n); - return NULL; - } - a->bvals[a->bi].bv_len = lua_strlen (L, -1); - a->bvals[a->bi].bv_val = (char *)lua_tostring (L, -1); - a->bi++; - return ret; -} - - -/* -** Store a pointer to the value on top of the stack on the attributes structure. -*/ -static BerValue **A_setval (lua_State *L, attrs_data *a, const char *n) { - BerValue **ret = &(a->values[a->vi]); - if (a->vi >= LUALDAP_ARRAY_VALUES_SIZE) { - luaL_error (L, LUALDAP_PREFIX"too many values"); - return NULL; - } - a->values[a->vi] = A_setbval (L, a, n); - a->vi++; - return ret; -} - - -/* -** Store a NULL pointer on the attributes structure. -*/ -static BerValue **A_nullval (lua_State *L, attrs_data *a) { - BerValue **ret = &(a->values[a->vi]); - if (a->vi >= LUALDAP_ARRAY_VALUES_SIZE) { - luaL_error (L, LUALDAP_PREFIX"too many values"); - return NULL; - } - a->values[a->vi] = NULL; - a->vi++; - return ret; -} - - -/* -** Store the value of an attribute. -** Valid values are: -** true => no values; -** string => one value; or -** table of strings => many values. -*/ -static BerValue **A_tab2val (lua_State *L, attrs_data *a, const char *name) { - int tab = lua_gettop (L); - BerValue **ret = &(a->values[a->vi]); - if (lua_isboolean (L, tab) && (lua_toboolean (L, tab) == 1)) /* true */ - return NULL; - else if (lua_isstring (L, tab)) /* string */ - A_setval (L, a, name); - else if (lua_istable (L, tab)) { /* list of strings */ - int i; - int n = luaL_getn (L, tab); - for (i = 1; i <= n; i++) { - lua_rawgeti (L, tab, i); /* push table element */ - A_setval (L, a, name); - } - lua_pop (L, n); - } else { - value_error (L, name); - return NULL; - } - A_nullval (L, a); - return ret; -} - - -/* -** Set a modification value (which MUST be on top of the stack). -*/ -static void A_setmod (lua_State *L, attrs_data *a, int op, const char *name) { - if (a->ai >= LUALDAP_MAX_ATTRS) { - luaL_error (L, LUALDAP_PREFIX"too many attributes"); - return; - } - a->mods[a->ai].mod_op = op; - a->mods[a->ai].mod_type = (char *)name; - a->mods[a->ai].mod_bvalues = A_tab2val (L, a, name); - a->attrs[a->ai] = &a->mods[a->ai]; - a->ai++; -} - - -/* -** Convert a Lua table into an array of modifications. -** An array of modifications is a NULL-terminated array of LDAPMod's. -*/ -static void A_tab2mod (lua_State *L, attrs_data *a, int tab, int op) { - lua_pushnil (L); /* first key for lua_next */ - while (lua_next (L, tab) != 0) { - /* attribute must be a string and not a number */ - if ((!lua_isnumber (L, -2)) && (lua_isstring (L, -2))) - A_setmod (L, a, op, lua_tostring (L, -2)); - /* pop value and leave last key on the stack as next key for lua_next */ - lua_pop (L, 1); - } -} - - -/* -** Terminate the array of attributes. -*/ -static void A_lastattr (lua_State *L, attrs_data *a) { - if (a->ai >= LUALDAP_MAX_ATTRS) { - luaL_error (L, LUALDAP_PREFIX"too many attributes"); - return; - } - a->attrs[a->ai] = NULL; - a->ai++; -} - - -/* -** Copy a string or a table of strings from Lua to a NULL-terminated array -** of C-strings. -*/ -static int table2strarray (lua_State *L, int tab, char *array[], int limit) { - if (lua_isstring (L, tab)) { - if (limit < 2) - return luaL_error (L, LUALDAP_PREFIX"too many arguments"); - array[0] = (char *)lua_tostring (L, tab); - array[1] = NULL; - } else if (lua_istable (L, tab)) { - int i; - int n = luaL_getn (L, tab); - if (limit < (n+1)) - return luaL_error (L, LUALDAP_PREFIX"too many arguments"); - for (i = 0; i < n; i++) { - lua_rawgeti (L, tab, i+1); /* push table element */ - if (lua_isstring (L, -1)) - array[i] = (char *)lua_tostring (L, -1); - else { - return luaL_error (L, LUALDAP_PREFIX"invalid value #%d", i+1); - } - } - array[n] = NULL; - } else - return luaL_error (L, LUALDAP_PREFIX"bad argument #%d (table or string expected, got %s)", tab, lua_typename (L, lua_type (L, tab))); - return 0; -} - - -/* -** Get the result message of an operation. -** #1 upvalue == connection -** #2 upvalue == msgid -** #3 upvalue == result code of the message (ADD, DEL etc.) to be received. -*/ -static int result_message (lua_State *L) { - struct timeval *timeout = NULL; /* ??? function parameter ??? */ - LDAPMessage *res; - int rc; - conn_data *conn = (conn_data *)lua_touserdata (L, lua_upvalueindex (1)); - int msgid = (int)lua_tonumber (L, lua_upvalueindex (2)); - /*int res_code = (int)lua_tonumber (L, lua_upvalueindex (3));*/ - - luaL_argcheck (L, conn->ld, 1, LUALDAP_PREFIX"LDAP connection is closed"); - rc = ldap_result (conn->ld, msgid, LDAP_MSG_ONE, timeout, &res); - if (rc == 0) - return faildirect (L, LUALDAP_PREFIX"result timeout expired"); - else if (rc < 0) { - ldap_msgfree (res); - return faildirect (L, LUALDAP_PREFIX"result error"); - } else { - int err, ret = 1; - char *mdn, *msg; - rc = ldap_parse_result (conn->ld, res, &err, &mdn, &msg, NULL, NULL, 1); - if (rc != LDAP_SUCCESS) - return faildirect (L, ldap_err2string (rc)); - switch (err) { - case LDAP_SUCCESS: - case LDAP_COMPARE_TRUE: - lua_pushboolean (L, 1); - break; - case LDAP_COMPARE_FALSE: - lua_pushboolean (L, 0); - break; - default: - lua_pushnil (L); - lua_pushliteral (L, LUALDAP_PREFIX); - lua_pushstring (L, msg); - lua_pushliteral (L, " "); - lua_pushstring (L, ldap_err2string(err)); - lua_concat (L, 4); - ret = 2; - } - ldap_memfree (mdn); - ldap_memfree (msg); - return ret; - } -} - - -/* -** Push a function to process the LDAP result. -*/ -static int create_future (lua_State *L, ldap_int_t rc, int conn, ldap_int_t msgid, int code) { - if (rc != LDAP_SUCCESS) - return faildirect (L, ldap_err2string (rc)); - lua_pushvalue (L, conn); /* push connection as #1 upvalue */ - lua_pushnumber (L, msgid); /* push msgid as #2 upvalue */ - lua_pushnumber (L, code); /* push code as #3 upvalue */ - lua_pushcclosure (L, result_message, 3); - return 1; -} - - -/* -** Unbind from the directory. -** @param #1 LDAP connection. -** @return 1 in case of success; nothing when already closed. -*/ -static int lualdap_close (lua_State *L) { - conn_data *conn = (conn_data *)luaL_checkudata (L, 1, LUALDAP_CONNECTION_METATABLE); - luaL_argcheck(L, conn!=NULL, 1, LUALDAP_PREFIX"LDAP connection expected"); - if (conn->ld == NULL) /* already closed */ - return 0; - ldap_unbind (conn->ld); - conn->ld = NULL; - lua_pushnumber (L, 1); - return 1; -} - - -/* -** Add a new entry to the directory. -** @param #1 LDAP connection. -** @param #2 String with new entry's DN. -** @param #3 Table with new entry's attributes and values. -** @return Function to process the LDAP result. -*/ -static int lualdap_add (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); - attrs_data attrs; - ldap_int_t rc, msgid; - A_init (&attrs); - if (lua_istable (L, 3)) - A_tab2mod (L, &attrs, 3, LUALDAP_MOD_ADD); - A_lastattr (L, &attrs); - rc = ldap_add_ext (conn->ld, dn, attrs.attrs, NULL, NULL, &msgid); - return create_future (L, rc, 1, msgid, LDAP_RES_ADD); -} - - -/* -** Compare a value against an entry. -** @param #1 LDAP connection. -** @param #2 String with entry's DN. -** @param #3 String with attribute's name. -** @param #4 String with attribute's value. -** @return Function to process the LDAP result. -*/ -static int lualdap_compare (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); - ldap_pchar_t attr = (ldap_pchar_t) luaL_checkstring (L, 3); - BerValue bvalue; - ldap_int_t rc, msgid; - bvalue.bv_val = (char *)luaL_checkstring (L, 4); - bvalue.bv_len = lua_strlen (L, 4); - rc = ldap_compare_ext (conn->ld, dn, attr, &bvalue, NULL, NULL, &msgid); - return create_future (L, rc, 1, msgid, LDAP_RES_COMPARE); -} - - -/* -** Delete an entry. -** @param #1 LDAP connection. -** @param #2 String with entry's DN. -** @return Boolean. -*/ -static int lualdap_delete (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); - ldap_int_t rc, msgid; - rc = ldap_delete_ext (conn->ld, dn, NULL, NULL, &msgid); - return create_future (L, rc, 1, msgid, LDAP_RES_DELETE); -} - - -/* -** Convert a string into an internal LDAP_MOD operation code. -*/ -static int op2code (const char *s) { - if (!s) - return LUALDAP_NO_OP; - switch (*s) { - case '+': - return LUALDAP_MOD_ADD; - case '-': - return LUALDAP_MOD_DEL; - case '=': - return LUALDAP_MOD_REP; - default: - return LUALDAP_NO_OP; - } -} - - -/* -** Modify an entry. -** @param #1 LDAP connection. -** @param #2 String with entry's DN. -** @param #3, #4... Tables with modifications to apply. -** @return True on success or nil, error message otherwise. -*/ -static int lualdap_modify (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); - attrs_data attrs; - ldap_int_t rc, msgid; - int param = 3; - A_init (&attrs); - while (lua_istable (L, param)) { - int op; - /* get operation ('+','-','=' operations allowed) */ - lua_rawgeti (L, param, 1); - op = op2code (lua_tostring (L, -1)); - if (op == LUALDAP_NO_OP) - return luaL_error (L, LUALDAP_PREFIX"forgotten operation on argument #%d", param); - /* get array of attributes and values */ - A_tab2mod (L, &attrs, param, op); - param++; - } - A_lastattr (L, &attrs); - rc = ldap_modify_ext (conn->ld, dn, attrs.attrs, NULL, NULL, &msgid); - return create_future (L, rc, 1, msgid, LDAP_RES_MODIFY); -} - - -/* -** Change the distinguished name of an entry. -*/ -static int lualdap_rename (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); - ldap_pchar_t rdn = (ldap_pchar_t) luaL_checkstring (L, 3); - ldap_pchar_t par = (ldap_pchar_t) luaL_optlstring (L, 4, NULL, NULL); - const int del = luaL_optnumber (L, 5, 0); - ldap_int_t msgid; - ldap_int_t rc = ldap_rename (conn->ld, dn, rdn, par, del, NULL, NULL, &msgid); - return create_future (L, rc, 1, msgid, LDAP_RES_MODDN); -} - - -/* -** Push an attribute value (or a table of values) on top of the stack. -** @param L lua_State. -** @param ld LDAP Connection. -** @param entry Current entry. -** @param attr Name of entry's attribute to get values from. -** @return 1 in case of success. -*/ -static int push_values (lua_State *L, LDAP *ld, LDAPMessage *entry, char *attr) { - int i, n; - BerValue **vals = ldap_get_values_len (ld, entry, attr); - n = ldap_count_values_len (vals); - if (n == 0) /* no values */ - lua_pushboolean (L, 1); - else if (n == 1) /* just one value */ - lua_pushlstring (L, vals[0]->bv_val, vals[0]->bv_len); - else { /* Multiple values */ - lua_newtable (L); - for (i = 0; i < n; i++) { - lua_pushlstring (L, vals[i]->bv_val, vals[i]->bv_len); - lua_rawseti (L, -2, i+1); - } - } - ldap_value_free_len (vals); - return 1; -} - - -/* -** Store entry's attributes and values at the given table. -** @param entry Current entry. -** @param tab Absolute stack index of the table. -*/ -static void set_attribs (lua_State *L, LDAP *ld, LDAPMessage *entry, int tab) { - char *attr; - BerElement *ber = NULL; - for (attr = ldap_first_attribute (ld, entry, &ber); - attr != NULL; - attr = ldap_next_attribute (ld, entry, ber)) - { - lua_pushstring (L, attr); - push_values (L, ld, entry, attr); - lua_rawset (L, tab); /* tab[attr] = vals */ - ldap_memfree (attr); - } - ber_free (ber, 0); /* don't need to test if (ber == NULL) */ -} - - -/* -** Get the distinguished name of the given entry and pushes it on the stack. -*/ -static void push_dn (lua_State *L, LDAP *ld, LDAPMessage *entry) { - char *dn = ldap_get_dn (ld, entry); - lua_pushstring (L, dn); - ldap_memfree (dn); -} - - -/* -** Release connection reference. -*/ -static void search_close (lua_State *L, search_data *search) { - luaL_unref (L, LUA_REGISTRYINDEX, search->conn); - search->conn = LUA_NOREF; -} - - -/* -** Retrieve next message... -** @return #1 entry's distinguished name. -** @return #2 table with entry's attributes and values. -*/ -static int next_message (lua_State *L) { - search_data *search = getsearch (L); - conn_data *conn; - struct timeval *timeout = NULL; /* ??? function parameter ??? */ - LDAPMessage *res; - int rc; - int ret; - - lua_rawgeti (L, LUA_REGISTRYINDEX, search->conn); - conn = (conn_data *)lua_touserdata (L, -1); /* get connection */ - - rc = ldap_result (conn->ld, search->msgid, LDAP_MSG_ONE, timeout, &res); - if (rc == 0) - return faildirect (L, LUALDAP_PREFIX"result timeout expired"); - else if (rc == -1) - return faildirect (L, LUALDAP_PREFIX"result error"); - else if (rc == LDAP_RES_SEARCH_RESULT) { /* last message => nil */ - /* close search object to avoid reuse */ - search_close (L, search); - ret = 0; - } else { - LDAPMessage *msg = ldap_first_message (conn->ld, res); - switch (ldap_msgtype (msg)) { - case LDAP_RES_SEARCH_ENTRY: { - LDAPMessage *entry = ldap_first_entry (conn->ld, msg); - push_dn (L, conn->ld, entry); - lua_newtable (L); - set_attribs (L, conn->ld, entry, lua_gettop (L)); - ret = 2; /* two return values */ - break; - } -/*No reference to LDAP_RES_SEARCH_REFERENCE on MSDN. Maybe there is a replacement to it?*/ -#ifdef LDAP_RES_SEARCH_REFERENCE - case LDAP_RES_SEARCH_REFERENCE: { - LDAPMessage *ref = ldap_first_reference (conn->ld, msg); - push_dn (L, conn->ld, ref); /* is this supposed to work? */ - lua_pushnil (L); - ret = 2; /* two return values */ - break; - } -#endif - case LDAP_RES_SEARCH_RESULT: - /* close search object to avoid reuse */ - search_close (L, search); - ret = 0; - break; - default: - ldap_msgfree (res); - return luaL_error (L, LUALDAP_PREFIX"error on search result chain"); - } - } - ldap_msgfree (res); - return ret; -} - - -/* -** Convert a string to one of the possible scopes of the search. -*/ -static int string2scope (lua_State *L, const char *s) { - if ((s == NULL) || (*s == '\0')) - return LDAP_SCOPE_DEFAULT; - switch (*s) { - case 'b': - return LDAP_SCOPE_BASE; - case 'o': - return LDAP_SCOPE_ONELEVEL; - case 's': - return LDAP_SCOPE_SUBTREE; - default: - return luaL_error (L, LUALDAP_PREFIX"invalid search scope `%s'", s); - } -} - - -/* -** Close the search object. -*/ -static int lualdap_search_close (lua_State *L) { - search_data *search = (search_data *)luaL_checkudata (L, 1, LUALDAP_SEARCH_METATABLE); - luaL_argcheck (L, search!=NULL, 1, LUALDAP_PREFIX"LDAP search expected"); - if (search->conn == LUA_NOREF) - return 0; - search_close (L, search); - lua_pushnumber (L, 1); - return 1; -} - - -/* -** Create a search object and leaves it on top of the stack. -*/ -static void create_search (lua_State *L, int conn_index, int msgid) { - search_data *search = (search_data *)lua_newuserdata (L, sizeof (search_data)); - lualdap_setmeta (L, LUALDAP_SEARCH_METATABLE); - search->conn = LUA_NOREF; - search->msgid = msgid; - lua_pushvalue (L, conn_index); - search->conn = luaL_ref (L, LUA_REGISTRYINDEX); -} - - -/* -** Fill in the attrs array, according to the attrs parameter. -*/ -static int get_attrs_param (lua_State *L, char *attrs[]) { - lua_pushstring (L, "attrs"); - lua_gettable (L, 2); - if (lua_isstring (L, -1)) { - attrs[0] = (char *)lua_tostring (L, -1); - attrs[1] = NULL; - } else if (!lua_istable (L, -1)) - attrs[0] = NULL; - else - if (table2strarray (L, lua_gettop (L), attrs, LUALDAP_MAX_ATTRS)) - return 0; - return 1; -} - - -/* -** Fill in the struct timeval, according to the timeout parameter. -*/ -static struct timeval *get_timeout_param (lua_State *L, struct timeval *st) { - double t = numbertabparam (L, "timeout", 0); - st->tv_sec = (long)t; - st->tv_usec = (long)(1000000 * (t - st->tv_sec)); - if (st->tv_sec == 0 && st->tv_usec == 0) - return NULL; - else - return st; -} - - -/* -** Perform a search operation. -** @return #1 Function to iterate over the result entries. -** @return #2 nil. -** @return #3 nil as first entry. -** The search result is defined as an upvalue of the iterator. -*/ -static int lualdap_search (lua_State *L) { - conn_data *conn = getconnection (L); - ldap_pchar_t base; - ldap_pchar_t filter; - char *attrs[LUALDAP_MAX_ATTRS]; - int scope, attrsonly, msgid, rc, sizelimit; - struct timeval st, *timeout; - - if (!lua_istable (L, 2)) - return luaL_error (L, LUALDAP_PREFIX"no search specification"); - if (!get_attrs_param (L, attrs)) - return 2; - /* get other parameters */ - attrsonly = booltabparam (L, "attrsonly", 0); - base = (ldap_pchar_t) strtabparam (L, "base", NULL); - filter = (ldap_pchar_t) strtabparam (L, "filter", NULL); - scope = string2scope (L, strtabparam (L, "scope", NULL)); - sizelimit = longtabparam (L, "sizelimit", LDAP_NO_LIMIT); - timeout = get_timeout_param (L, &st); - - rc = ldap_search_ext (conn->ld, base, scope, filter, attrs, attrsonly, - NULL, NULL, timeout, sizelimit, &msgid); - if (rc != LDAP_SUCCESS) - return luaL_error (L, LUALDAP_PREFIX"%s", ldap_err2string (rc)); - - create_search (L, 1, msgid); - lua_pushcclosure (L, next_message, 1); - return 1; -} - - -/* -** Return the name of the object's metatable. -** This function is used by `tostring'. -*/ -static int lualdap_conn_tostring (lua_State *L) { - char buff[100]; - conn_data *conn = (conn_data *)lua_touserdata (L, 1); - if (conn->ld == NULL) - strcpy (buff, "closed"); - else - sprintf (buff, "%p", conn); - lua_pushfstring (L, "%s (%s)", LUALDAP_CONNECTION_METATABLE, buff); - return 1; -} - - -/* -** Return the name of the object's metatable. -** This function is used by `tostring'. -*/ -static int lualdap_search_tostring (lua_State *L) { - char buff[100]; - search_data *search = (search_data *)lua_touserdata (L, 1); - luaL_argcheck (L,search->conn!=LUA_NOREF,1,LUALDAP_PREFIX"LDAP search is closed"); - if (search->conn == LUA_NOREF) - strcpy (buff, "closed"); - else - sprintf (buff, "%p", search); - lua_pushfstring (L, "%s (%s)", LUALDAP_SEARCH_METATABLE, buff); - return 1; -} - - -/* -** Create a metatable. -*/ -static int lualdap_createmeta (lua_State *L) { - const luaL_reg methods[] = { - {"close", lualdap_close}, - {"add", lualdap_add}, - {"compare", lualdap_compare}, - {"delete", lualdap_delete}, - {"modify", lualdap_modify}, - {"rename", lualdap_rename}, - {"search", lualdap_search}, - {NULL, NULL} - }; - - if (!luaL_newmetatable (L, LUALDAP_CONNECTION_METATABLE)) - return 0; - - /* define methods */ - luaL_openlib (L, NULL, methods, 0); - - /* define metamethods */ - lua_pushliteral (L, "__gc"); - lua_pushcfunction (L, lualdap_close); - lua_settable (L, -3); - - lua_pushliteral (L, "__index"); - lua_pushvalue (L, -2); - lua_settable (L, -3); - - lua_pushliteral (L, "__tostring"); - lua_pushcfunction (L, lualdap_conn_tostring); - lua_settable (L, -3); - - lua_pushliteral (L, "__metatable"); - lua_pushliteral(L,LUALDAP_PREFIX"you're not allowed to get this metatable"); - lua_settable (L, -3); - - if (!luaL_newmetatable (L, LUALDAP_SEARCH_METATABLE)) - return 0; - - lua_pushliteral (L, "__gc"); - lua_pushcfunction (L, lualdap_search_close); - lua_settable (L, -3); - - lua_pushliteral (L, "__tostring"); - lua_pushcclosure (L, lualdap_search_tostring, 1); - lua_settable (L, -3); - - lua_pushliteral (L, "__metatable"); - lua_pushliteral(L,LUALDAP_PREFIX"you're not allowed to get this metatable"); - lua_settable (L, -3); - - return 0; -} - - -/* -** Open and initialize a connection to a server. -** @param #1 String with hostname. -** @param #2 String with username. -** @param #3 String with password. -** @param #4 Boolean indicating if TLS must be used. -** @return #1 Userdata with connection structure. -*/ -static int lualdap_open_simple (lua_State *L) { - ldap_pchar_t host = (ldap_pchar_t) luaL_checkstring (L, 1); - ldap_pchar_t who = (ldap_pchar_t) luaL_optstring (L, 2, NULL); - const char *password = luaL_optstring (L, 3, NULL); - int use_tls = lua_toboolean (L, 4); - conn_data *conn = (conn_data *)lua_newuserdata (L, sizeof(conn_data)); - int err; - - /* Initialize */ - lualdap_setmeta (L, LUALDAP_CONNECTION_METATABLE); - conn->version = 0; - conn->ld = ldap_init (host, LDAP_PORT); - if (conn->ld == NULL) - return faildirect(L,LUALDAP_PREFIX"Error connecting to server"); - /* Set protocol version */ - conn->version = LDAP_VERSION3; - if (ldap_set_option (conn->ld, LDAP_OPT_PROTOCOL_VERSION, &conn->version) - != LDAP_OPT_SUCCESS) - return faildirect(L, LUALDAP_PREFIX"Error setting LDAP version"); - /* Use TLS */ - if (use_tls) { - int rc = ldap_start_tls_s (conn->ld, NULL, NULL); - if (rc != LDAP_SUCCESS) - return faildirect (L, ldap_err2string (rc)); - } - /* Bind to a server */ - err = ldap_bind_s (conn->ld, who, password, LDAP_AUTH_SIMPLE); - if (err != LDAP_SUCCESS) - return faildirect (L, ldap_err2string (err)); - - return 1; -} - - -/* -** Assumes the table is on top of the stack. -*/ -static void set_info (lua_State *L) { - lua_pushliteral (L, "_COPYRIGHT"); - lua_pushliteral (L, "Copyright (C) 2003-2007 Kepler Project"); - lua_settable (L, -3); - lua_pushliteral (L, "_DESCRIPTION"); - lua_pushliteral (L, "LuaLDAP is a simple interface from Lua to an LDAP client"); - lua_settable (L, -3); - lua_pushliteral (L, "_VERSION"); - lua_pushliteral (L, "LuaLDAP 1.1.1"); - lua_settable (L, -3); -} - - -/* -** Create ldap table and register the open method. -*/ -int luaopen_lualdap (lua_State *L) { - struct luaL_reg lualdap[] = { - {"open_simple", lualdap_open_simple}, - {NULL, NULL}, - }; - - lualdap_createmeta (L); - luaL_openlib (L, LUALDAP_TABLENAME, lualdap, 0); - set_info (L); - - return 1; -} diff --git a/lualdap/src/lualdap.def b/lualdap/src/lualdap.def deleted file mode 100755 index 40fe17c..0000000 --- a/lualdap/src/lualdap.def +++ /dev/null @@ -1,6 +0,0 @@ -LIBRARY lualdap.dll
-DESCRIPTION "LuaLDAP"
-VERSION 1.1.1
-EXPORTS
-luaopen_lualdap
-
diff --git a/lualdap/src/open2winldap.h b/lualdap/src/open2winldap.h deleted file mode 100755 index ad592d8..0000000 --- a/lualdap/src/open2winldap.h +++ /dev/null @@ -1,47 +0,0 @@ -#include <winldap.h> - -/* For some reason MSDN mentions LDAP_RES_MODDN, but not LDAP_RES_MODRDN. */ -#ifndef LDAP_RES_MODDN -#define LDAP_RES_MODDN LDAP_RES_MODRDN -#endif - -/* MSDN doesn't mention LDAP_OPT_SUCCESS, it uses LDAP_SUCCESS intead */ -#ifndef LDAP_OPT_SUCCESS -#define LDAP_OPT_SUCCESS LDAP_SUCCESS -#endif - -/* MSDN doesn't mention LDAP_SCOPE_DEFAULT, so default will be LDAP_SCOPE_SUBTREE */ -#ifndef LDAP_SCOPE_DEFAULT -#define LDAP_SCOPE_DEFAULT LDAP_SCOPE_SUBTREE -#endif - -/* MSDN doesn't mention this function at all. Unfortunately, LDAPMessage an opaque type. */ -#define ldap_msgtype(m) ((m)->lm_msgtype) - -#define ldap_first_message ldap_first_entry - -/* The WinLDAP API allows comparisons against either string or binary values */ -#undef ldap_compare_ext - -/* The WinLDAP API uses ULONG seconds instead of a struct timeval. */ -#undef ldap_search_ext - -/* The WinLDAP API has a different number of arguments for this */ -#undef ldap_start_tls_s - -#ifdef UNICODE -#define ldap_compare_ext(ld,dn,a,v,sc,cc,msg) \ - ldap_compare_extW(ld,dn,a,0,v,sc,cc,msg) -#define ldap_search_ext(ld,base,scope,f,a,o,sc,cc,t,s,msg) \ - ldap_search_extW(ld,base,scope,f,a,o,sc,cc,(t)?(t)->tv_sec:0,s,msg) -#define ldap_start_tls_s(ld,sc,cc) \ - ldap_start_tls_sW(ld,0,0,sc,cc) -#else -#define ldap_compare_ext(ld,dn,a,v,sc,cc,msg) \ - ldap_compare_extA(ld,dn,a,0,v,sc,cc,msg) -#define ldap_search_ext(ld,base,scope,f,a,o,sc,cc,t,s,msg) \ - ldap_search_extA(ld,base,scope,f,a,o,sc,cc,(t)?(t)->tv_sec:0,s,msg) -#define ldap_start_tls_s(ld,sc,cc) \ - ldap_start_tls_sA(ld,0,0,sc,cc) -#endif - |