mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-25 04:43:33 +00:00
LuaLDAP is a simple interface from Lua to an LDAP client.
In fact it is a bind to OpenLDAP or to ADSI. It enables a Lua program to: - connect to an LDAP server; - execute any operation (search, add, compare, delete, modify and rename); - retrieve entries and references of the search result. WWW: http://www.keplerproject.org/lualdap/ PR: 172415 Submitted by: Piotr Florczyk
This commit is contained in:
parent
47897d0dce
commit
22d3bcf652
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=310576
@ -366,6 +366,7 @@
|
||||
SUBDIR += lla
|
||||
SUBDIR += ltm
|
||||
SUBDIR += lua50-luasocket
|
||||
SUBDIR += lualdap
|
||||
SUBDIR += luasocket
|
||||
SUBDIR += lvwimax
|
||||
SUBDIR += mDNSResponder
|
||||
|
36
net/lualdap/Makefile
Normal file
36
net/lualdap/Makefile
Normal file
@ -0,0 +1,36 @@
|
||||
# Created by: Piotr Florczyk <pf@itwf.pl>
|
||||
# $FreeBSD$
|
||||
|
||||
PORTNAME= lualdap
|
||||
PORTVERSION= 1.1.0
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= http://files.luaforge.net/releases/${PORTNAME}/${PORTNAME}/LuaLDAP${PORTVERSION}/
|
||||
PKGNAMEPREFIX= ${LUA_PKGNAMEPREFIX}
|
||||
|
||||
MAINTAINER= pf@itwf.pl
|
||||
COMMENT= LDAP support for the Lua language
|
||||
|
||||
USE_GMAKE= yes
|
||||
USE_LUA= 5.1+
|
||||
USE_OPENLDAP= yes
|
||||
|
||||
# the CPPFLAGS fixes builds where PREFIX != LOCALBASE
|
||||
CPPFLAGS+= -I${LOCALBASE}/include/${LUA_SUBDIR}
|
||||
MAKE_ARGS+= LUA_LIBDIR="${LUA_LIBDIR}" \
|
||||
LUA_INC="${LUA_INCDIR}" \
|
||||
OPENLDAP_LIB="-L${LOCALBASE}/lib -lldap" \
|
||||
LUA_VERSION_NUM="${LUA_VER_STR}0"
|
||||
|
||||
ALL_TARGET=
|
||||
|
||||
.include <bsd.port.pre.mk>
|
||||
|
||||
do-install:
|
||||
${MKDIR} ${LUA_MODLIBDIR}
|
||||
${INSTALL_PROGRAM} ${WRKSRC}/src/lualdap.so.${PORTVERSION} ${LUA_MODLIBDIR}/${PORTNAME}.so
|
||||
.if ${PORT_OPTIONS:MDOCS}
|
||||
@${MKDIR} ${DOCSDIR}
|
||||
@${INSTALL_DATA} ${WRKSRC}/doc/us/* ${DOCSDIR}
|
||||
.endif
|
||||
|
||||
.include <bsd.port.post.mk>
|
2
net/lualdap/distinfo
Normal file
2
net/lualdap/distinfo
Normal file
@ -0,0 +1,2 @@
|
||||
SHA256 (lualdap-1.1.0.tar.gz) = c2875704b8cdc6398c2f1cf25199a16d217ded2c696d134ae591935ab3c98d33
|
||||
SIZE (lualdap-1.1.0.tar.gz) = 30087
|
346
net/lualdap/files/patch-src__lualdap.c
Normal file
346
net/lualdap/files/patch-src__lualdap.c
Normal file
@ -0,0 +1,346 @@
|
||||
--- ./src/lualdap.c.orig 2007-12-14 16:11:22.000000000 +0100
|
||||
+++ ./src/lualdap.c 2013-01-18 00:29:50.000000000 +0100
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
+#include <assert.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <Winsock2.h>
|
||||
@@ -19,10 +20,14 @@
|
||||
#include "ldap.h"
|
||||
#endif
|
||||
|
||||
-#include "lua.h"
|
||||
-#include "lauxlib.h"
|
||||
-#if ! defined (LUA_VERSION_NUM) || LUA_VERSION_NUM < 501
|
||||
-#include "compat-5.1.h"
|
||||
+#include <lua.h>
|
||||
+#include <lauxlib.h>
|
||||
+
|
||||
+#if LUA_VERSION_NUM < 502
|
||||
+/* lua_rawlen: Not entirely correct, but should work anyway */
|
||||
+# define lua_rawlen lua_objlen
|
||||
+# define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l))
|
||||
+# define luaL_setfuncs(L,l,n) (assert(n==0), luaL_register(L,NULL,l))
|
||||
#endif
|
||||
|
||||
#ifdef WINLDAPAPI
|
||||
@@ -141,9 +146,9 @@
|
||||
/*
|
||||
** Get the field called name of the table at position 2.
|
||||
*/
|
||||
-static void strgettable (lua_State *L, const char *name) {
|
||||
+static void strgettable (lua_State *L, int idx, const char *name) {
|
||||
lua_pushstring (L, name);
|
||||
- lua_gettable (L, 2);
|
||||
+ lua_gettable (L, idx);
|
||||
}
|
||||
|
||||
|
||||
@@ -151,8 +156,8 @@
|
||||
** 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);
|
||||
+static const char *strtabparam (lua_State *L, int idx, const char *name, char *def) {
|
||||
+ strgettable (L, idx, name);
|
||||
if (lua_isnil (L, -1))
|
||||
return def;
|
||||
else if (lua_isstring (L, -1))
|
||||
@@ -168,8 +173,8 @@
|
||||
** 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);
|
||||
+static long longtabparam (lua_State *L, int idx, const char *name, int def) {
|
||||
+ strgettable (L, idx, name);
|
||||
if (lua_isnil (L, -1))
|
||||
return def;
|
||||
else if (lua_isnumber (L, -1))
|
||||
@@ -183,8 +188,8 @@
|
||||
** 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);
|
||||
+static double numbertabparam (lua_State *L, int idx, const char *name, double def) {
|
||||
+ strgettable (L, idx, name);
|
||||
if (lua_isnil (L, -1))
|
||||
return def;
|
||||
else if (lua_isnumber (L, -1))
|
||||
@@ -199,7 +204,7 @@
|
||||
** The table MUST be at position 2.
|
||||
*/
|
||||
static int booltabparam (lua_State *L, const char *name, int def) {
|
||||
- strgettable (L, name);
|
||||
+ strgettable (L, 2, name);
|
||||
if (lua_isnil (L, -1))
|
||||
return def;
|
||||
else if (lua_isboolean (L, -1))
|
||||
@@ -243,7 +248,7 @@
|
||||
value_error (L, n);
|
||||
return NULL;
|
||||
}
|
||||
- a->bvals[a->bi].bv_len = lua_strlen (L, -1);
|
||||
+ a->bvals[a->bi].bv_len = lua_rawlen (L, -1);
|
||||
a->bvals[a->bi].bv_val = (char *)lua_tostring (L, -1);
|
||||
a->bi++;
|
||||
return ret;
|
||||
@@ -296,7 +301,7 @@
|
||||
A_setval (L, a, name);
|
||||
else if (lua_istable (L, tab)) { /* list of strings */
|
||||
int i;
|
||||
- int n = luaL_getn (L, tab);
|
||||
+ int n = lua_rawlen (L, tab);
|
||||
for (i = 1; i <= n; i++) {
|
||||
lua_rawgeti (L, tab, i); /* push table element */
|
||||
A_setval (L, a, name);
|
||||
@@ -368,7 +373,7 @@
|
||||
array[1] = NULL;
|
||||
} else if (lua_istable (L, tab)) {
|
||||
int i;
|
||||
- int n = luaL_getn (L, tab);
|
||||
+ int n = lua_rawlen (L, tab);
|
||||
if (limit < (n+1))
|
||||
return luaL_error (L, LUALDAP_PREFIX"too many arguments");
|
||||
for (i = 0; i < n; i++) {
|
||||
@@ -387,13 +392,25 @@
|
||||
|
||||
|
||||
/*
|
||||
+** Fill in the struct timeval, according to the timeout parameter.
|
||||
+*/
|
||||
+static struct timeval *get_timeout_param (lua_State *L, int idx, struct timeval *st) {
|
||||
+ double t = numbertabparam (L, idx, "timeout", -1);
|
||||
+ if(t < 0)
|
||||
+ return NULL; /* No timeout, block */
|
||||
+ st->tv_sec = (long)t;
|
||||
+ st->tv_usec = (long)(1000000 * (t - st->tv_sec));
|
||||
+ return st;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
** 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 ??? */
|
||||
+ struct timeval timeout;
|
||||
LDAPMessage *res;
|
||||
int rc;
|
||||
conn_data *conn = (conn_data *)lua_touserdata (L, lua_upvalueindex (1));
|
||||
@@ -401,7 +418,7 @@
|
||||
/*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);
|
||||
+ rc = ldap_result (conn->ld, msgid, LDAP_MSG_ONE, get_timeout_param (L, 1, &timeout), &res);
|
||||
if (rc == 0)
|
||||
return faildirect (L, LUALDAP_PREFIX"result timeout expired");
|
||||
else if (rc < 0) {
|
||||
@@ -424,10 +441,14 @@
|
||||
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);
|
||||
+ lua_concat (L, 2);
|
||||
+ if (msg != NULL) {
|
||||
+ lua_pushliteral (L, " (");
|
||||
+ lua_pushstring (L, msg);
|
||||
+ lua_pushliteral (L, ")");
|
||||
+ lua_concat (L, 4);
|
||||
+ }
|
||||
ret = 2;
|
||||
}
|
||||
ldap_memfree (mdn);
|
||||
@@ -461,7 +482,11 @@
|
||||
luaL_argcheck(L, conn!=NULL, 1, LUALDAP_PREFIX"LDAP connection expected");
|
||||
if (conn->ld == NULL) /* already closed */
|
||||
return 0;
|
||||
+#if defined(LDAP_API_FEATURE_X_OPENLDAP) && LDAP_API_FEATURE_X_OPENLDAP >= 20300
|
||||
+ ldap_unbind_ext (conn->ld, NULL, NULL);
|
||||
+#else
|
||||
ldap_unbind (conn->ld);
|
||||
+#endif
|
||||
conn->ld = NULL;
|
||||
lua_pushnumber (L, 1);
|
||||
return 1;
|
||||
@@ -504,7 +529,7 @@
|
||||
BerValue bvalue;
|
||||
ldap_int_t rc, msgid;
|
||||
bvalue.bv_val = (char *)luaL_checkstring (L, 4);
|
||||
- bvalue.bv_len = lua_strlen (L, 4);
|
||||
+ bvalue.bv_len = lua_rawlen (L, 4);
|
||||
rc = ldap_compare_ext (conn->ld, dn, attr, &bvalue, NULL, NULL, &msgid);
|
||||
return create_future (L, rc, 1, msgid, LDAP_RES_COMPARE);
|
||||
}
|
||||
@@ -666,15 +691,17 @@
|
||||
static int next_message (lua_State *L) {
|
||||
search_data *search = getsearch (L);
|
||||
conn_data *conn;
|
||||
- struct timeval *timeout = NULL; /* ??? function parameter ??? */
|
||||
+ struct timeval timeout;
|
||||
LDAPMessage *res;
|
||||
int rc;
|
||||
int ret;
|
||||
|
||||
+ luaL_checktype(L, 1, LUA_TTABLE);
|
||||
+
|
||||
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);
|
||||
+ rc = ldap_result (conn->ld, search->msgid, LDAP_MSG_ONE, get_timeout_param (L, 1, &timeout), &res);
|
||||
if (rc == 0)
|
||||
return faildirect (L, LUALDAP_PREFIX"result timeout expired");
|
||||
else if (rc == -1)
|
||||
@@ -724,8 +751,10 @@
|
||||
*/
|
||||
static int string2scope (lua_State *L, const char *s) {
|
||||
if ((s == NULL) || (*s == '\0'))
|
||||
- return LDAP_SCOPE_DEFAULT;
|
||||
+ return LDAP_SCOPE_SUBTREE;
|
||||
switch (*s) {
|
||||
+ case 'd':
|
||||
+ return LDAP_SCOPE_DEFAULT;
|
||||
case 'b':
|
||||
return LDAP_SCOPE_BASE;
|
||||
case 'o':
|
||||
@@ -784,20 +813,6 @@
|
||||
|
||||
|
||||
/*
|
||||
-** 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.
|
||||
@@ -818,11 +833,11 @@
|
||||
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);
|
||||
+ base = (ldap_pchar_t) strtabparam (L, 2, "base", NULL);
|
||||
+ filter = (ldap_pchar_t) strtabparam (L, 2, "filter", NULL);
|
||||
+ scope = string2scope (L, strtabparam (L, 2, "scope", NULL));
|
||||
+ sizelimit = longtabparam (L, 2, "sizelimit", LDAP_NO_LIMIT);
|
||||
+ timeout = get_timeout_param (L, 2, &st);
|
||||
|
||||
rc = ldap_search_ext (conn->ld, base, scope, filter, attrs, attrsonly,
|
||||
NULL, NULL, timeout, sizelimit, &msgid);
|
||||
@@ -831,7 +846,8 @@
|
||||
|
||||
create_search (L, 1, msgid);
|
||||
lua_pushcclosure (L, next_message, 1);
|
||||
- return 1;
|
||||
+ lua_pushvalue(L, 2);
|
||||
+ return 2;
|
||||
}
|
||||
|
||||
|
||||
@@ -872,7 +888,7 @@
|
||||
** Create a metatable.
|
||||
*/
|
||||
static int lualdap_createmeta (lua_State *L) {
|
||||
- const luaL_reg methods[] = {
|
||||
+ const luaL_Reg methods[] = {
|
||||
{"close", lualdap_close},
|
||||
{"add", lualdap_add},
|
||||
{"compare", lualdap_compare},
|
||||
@@ -887,7 +903,7 @@
|
||||
return 0;
|
||||
|
||||
/* define methods */
|
||||
- luaL_openlib (L, NULL, methods, 0);
|
||||
+ luaL_setfuncs(L, methods, 0);
|
||||
|
||||
/* define metamethods */
|
||||
lua_pushliteral (L, "__gc");
|
||||
@@ -939,13 +955,27 @@
|
||||
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));
|
||||
+#if defined(LDAP_API_FEATURE_X_OPENLDAP) && LDAP_API_FEATURE_X_OPENLDAP >= 20300
|
||||
+ struct berval cred = { 0, NULL };
|
||||
+ char *host_with_schema = NULL;
|
||||
+#endif
|
||||
int err;
|
||||
|
||||
/* Initialize */
|
||||
lualdap_setmeta (L, LUALDAP_CONNECTION_METATABLE);
|
||||
conn->version = 0;
|
||||
+#if defined(LDAP_API_FEATURE_X_OPENLDAP) && LDAP_API_FEATURE_X_OPENLDAP >= 20300
|
||||
+ host_with_schema = malloc(strlen(host) + 8);
|
||||
+ strcpy(host_with_schema, "ldap://");
|
||||
+ strcat(host_with_schema, host);
|
||||
+ err = ldap_initialize(&conn->ld, host_with_schema);
|
||||
+ free(host_with_schema);
|
||||
+ host_with_schema = NULL;
|
||||
+ if (err != LDAP_SUCCESS)
|
||||
+#else
|
||||
conn->ld = ldap_init (host, LDAP_PORT);
|
||||
if (conn->ld == NULL)
|
||||
+#endif
|
||||
return faildirect(L,LUALDAP_PREFIX"Error connecting to server");
|
||||
/* Set protocol version */
|
||||
conn->version = LDAP_VERSION3;
|
||||
@@ -959,7 +989,16 @@
|
||||
return faildirect (L, ldap_err2string (rc));
|
||||
}
|
||||
/* Bind to a server */
|
||||
+#if defined(LDAP_API_FEATURE_X_OPENLDAP) && LDAP_API_FEATURE_X_OPENLDAP >= 20300
|
||||
+ cred.bv_len = strlen(password);
|
||||
+ cred.bv_val = malloc(cred.bv_len+1);
|
||||
+ strcpy(cred.bv_val, password);
|
||||
+ err = ldap_sasl_bind_s (conn->ld, who, LDAP_SASL_SIMPLE, &cred, NULL, NULL, NULL);
|
||||
+ free(cred.bv_val);
|
||||
+ memset(&cred, 0, sizeof(cred));
|
||||
+#else
|
||||
err = ldap_bind_s (conn->ld, who, password, LDAP_AUTH_SIMPLE);
|
||||
+#endif
|
||||
if (err != LDAP_SUCCESS)
|
||||
return faildirect (L, ldap_err2string (err));
|
||||
|
||||
@@ -987,13 +1026,15 @@
|
||||
** Create ldap table and register the open method.
|
||||
*/
|
||||
int luaopen_lualdap (lua_State *L) {
|
||||
- struct luaL_reg lualdap[] = {
|
||||
+ struct luaL_Reg lualdap[] = {
|
||||
{"open_simple", lualdap_open_simple},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
lualdap_createmeta (L);
|
||||
- luaL_openlib (L, LUALDAP_TABLENAME, lualdap, 0);
|
||||
+ luaL_newlib(L, lualdap);
|
||||
+ lua_pushvalue(L, -1);
|
||||
+ lua_setglobal(L, LUALDAP_TABLENAME);
|
||||
set_info (L);
|
||||
|
||||
return 1;
|
8
net/lualdap/pkg-descr
Normal file
8
net/lualdap/pkg-descr
Normal file
@ -0,0 +1,8 @@
|
||||
LuaLDAP is a simple interface from Lua to an LDAP client.
|
||||
In fact it is a bind to OpenLDAP or to ADSI. It enables a Lua program to:
|
||||
|
||||
- connect to an LDAP server;
|
||||
- execute any operation (search, add, compare, delete, modify and rename);
|
||||
- retrieve entries and references of the search result.
|
||||
|
||||
WWW: http://www.keplerproject.org/lualdap/
|
6
net/lualdap/pkg-plist
Normal file
6
net/lualdap/pkg-plist
Normal file
@ -0,0 +1,6 @@
|
||||
%%LUA_MODLIBDIR%%/lualdap.so
|
||||
%%PORTDOCS%%%%DOCSDIR%%/index.html
|
||||
%%PORTDOCS%%%%DOCSDIR%%/license.html
|
||||
%%PORTDOCS%%%%DOCSDIR%%/lualdap.png
|
||||
%%PORTDOCS%%%%DOCSDIR%%/manual.html
|
||||
%%PORTDOCS%%@dirrm %%DOCSDIR%%
|
Loading…
Reference in New Issue
Block a user