From b97babbc25401713be5e2b9cb3eff742031b6359 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jorge=20Rodr=C3=ADguez?= Date: Mon, 20 Aug 2007 16:01:25 +0200 Subject: [PATCH] More consistent and clearer API. New approach for supporting jabberd2 --- Makefile | 4 +- include/v2l_config.h | 12 +- include/v2l_conn.h | 12 +- include/v2l_vcard.h | 12 +- src/Makefile.j2 | 22 --- src/main_j2.c | 200 --------------------- src/v2l_config.c | 30 ++-- src/v2l_conn.c | 413 +++++++++++++++++++++++++++++++++++--------- src/v2l_main.c | 83 ++------- src/v2l_vcard.c | 478 +++++++++++++++------------------------------------ v2l.xml | 20 +++ vcard2ldap.pws | 2 +- 12 files changed, 537 insertions(+), 751 deletions(-) delete mode 100644 src/Makefile.j2 delete mode 100644 src/main_j2.c create mode 100644 v2l.xml diff --git a/Makefile b/Makefile index e1a33e7..5574df7 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,8 @@ SRC = ./src all: cd $(SRC) && $(MAKE) $@ -j2: - cd $(SRC) && $(MAKE) -f Makefile.j2 all commit: $(MAKE) clean git commit -a clean: - cd $(SRC) && $(MAKE) $@ && $(MAKE) -f Makefile.j2 $@ + cd $(SRC) && $(MAKE) $@ diff --git a/include/v2l_config.h b/include/v2l_config.h index e744821..0741859 100644 --- a/include/v2l_config.h +++ b/include/v2l_config.h @@ -17,15 +17,15 @@ #ifndef __V2L_CONFIG_H #define __V2L_CONFIG_H -#include - #define V2L_ADMIN "jabberadmin" +typedef struct v2l_LdapConn *v2l_LdapConnPtr; + /* passed to request handler */ typedef struct v2l_Config { pool poolref; /* reference to the instance pool */ - v2l_LdapConn *master_conn; /* root connection to LDAP */ + v2l_LdapConnPtr master_conn; /* root connection to LDAP */ xmlnode config; /* node from config file */ char *host; /* LDAP hostname */ int port; /* LDAP port */ @@ -35,7 +35,7 @@ typedef struct v2l_Config char *bindpw; /* pw used for "master" connections */ } v2l_Config; -extern int v2l_config_init (v2l_Config * self, xmlnode cfgroot); -/* NOTE: Allocated memory must be freed by the caller */ -extern char* v2l_ldap_get_passwd (v2l_Config * self, char * user); +#ifndef _V2L_JABBER2 +extern int v2l_config_init (v2l_Config *self, xmlnode cfgroot); +#endif #endif diff --git a/include/v2l_conn.h b/include/v2l_conn.h index b82c631..94863f6 100644 --- a/include/v2l_conn.h +++ b/include/v2l_conn.h @@ -20,6 +20,8 @@ #include #include +#include + typedef struct v2l_LdapConn { pool p; @@ -48,13 +50,15 @@ typedef struct v2l_LdapEvt LDAPMessage *result; } v2l_LdapEvt; -extern v2l_LdapConn *v2l_create_conn (char *host, int port, - const char *binddn, const char *user, - const char *passwd, int add_in_list); -extern v2l_LdapConn *v2l_get_conn (const char *user); +extern v2l_LdapConn *v2l_get_conn (v2l_Config *self, const char *user); +extern v2l_LdapConn *v2l_get_master_conn (v2l_Config *self); extern void v2l_free_allconn (); extern void v2l_ldap_sync (v2l_LdapEvt *evt_res); /* wait for LDAP results */ extern int v2l_ldap_search (char *dn, char *suffix, char **attrs, int subtree, v2l_LdapEvt *evt_res); extern int v2l_ldap_modify (char *dn, LDAPMod **attrs, v2l_LdapEvt *evt_res); +extern int v2l_request_record (v2l_Config *self, v2l_LdapConn * curr_conn, + v2l_LdapRequest *req); +extern v2l_LdapRequest *v2l_add_attr_str (v2l_LdapRequest *req, + const char *attr, const char *str); #endif diff --git a/include/v2l_vcard.h b/include/v2l_vcard.h index 99c9a50..cec7db0 100644 --- a/include/v2l_vcard.h +++ b/include/v2l_vcard.h @@ -20,9 +20,8 @@ #include /* vCard <-> LDAP mapping functions */ -typedef v2l_LdapRequest *(*v2l_Vcard2LdapHandler) ( - v2l_LdapRequest * - cur, xmlnode x); +typedef v2l_LdapRequest *(*v2l_Vcard2LdapHandler) (v2l_LdapRequest *cur, + xmlnode x); typedef xmlnode (*v2l_Ldap2VcardHandler) (char *attr, char **vals, xmlnode x); /* mapping from vCard to LDAP */ @@ -39,8 +38,7 @@ typedef struct v2l_Ldap2Vcard v2l_Ldap2VcardHandler set; } v2l_Ldap2Vcard; -extern xmlnode v2l_vcard_get (v2l_Config * self, - v2l_LdapConn * curr_conn); -extern int v2l_vcard_set (v2l_Config * self, - v2l_LdapConn * curr_conn, xmlnode data); +extern xmlnode v2l_vcard_get (v2l_Config *self, v2l_LdapConn *curr_conn); +extern int v2l_vcard_set (v2l_Config * self, v2l_LdapConn * curr_conn, + xmlnode data); #endif diff --git a/src/Makefile.j2 b/src/Makefile.j2 deleted file mode 100644 index 9c402d9..0000000 --- a/src/Makefile.j2 +++ /dev/null @@ -1,22 +0,0 @@ -LIBS := $(LIBS) -ljcomp -lm `pkg-config --libs glib-2.0` `pkg-config --libs gthread-2.0` -LIBS := $(LIBS) -lresolv -lldap -llber -LDFLAGS := -L ../../jcr/lib - -CFLAGS:=$(CFLAGS) -I../../jcr/lib `pkg-config --cflags glib-2.0` -D_JCOMP -D_REENTRANT -CFLAGS := $(CFLAGS) -I ../include - -v2l_OBJECTS = main_j2.o \ - v2l_main.o \ - v2l_config.o \ - v2l_vcard.o \ - v2l_conn.o - -all: v2l - -v2l: $(v2l_OBJECTS) - $(CC) $(CFLAGS) $(MCFLAGS) -o v2l $(v2l_OBJECTS) $(LDFLAGS) $(LIBS) - -clean: - rm -f $(v2l_OBJECTS) *~ v2l *.nccout - - diff --git a/src/main_j2.c b/src/main_j2.c deleted file mode 100644 index fee40f9..0000000 --- a/src/main_j2.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - JCR - Jabber Component Runtime - Copyright (C) 2003 Paul Curtis - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -$Id: main.c,v 1.18 2004/07/09 14:59:43 pcurtis Exp $ - -*/ - -#include "jcomp.h" - -int main(int argc, char *argv[]) { - extern char *optarg; - extern int optind, opterr, optopt; - int inBackground = 0; - int rc, pid, c; - int message_mask_set = 0; - int message_stderr_set = 0; - int fdlimit, fd; - struct sigaction act; - FILE *pid_stream; - struct stat st; - char *config_file = NULL; - pool p; - - GThread *dthread; /* the packet delivery thread */ - GMainLoop *gmain; /* the receive packet event loop */ - - jcr = (jcr_instance)malloc(sizeof(_jcr_instance)); - - g_thread_init(NULL); - fprintf(stderr, "%s -- %s\n%s\n\n", _JCOMP_NAME, _JCOMP_VERS, _JCOMP_COPY); - - while ((c = getopt(argc, argv, "Bsd:c:")) != EOF) - switch (c) { - case 'B': - inBackground = 1; - break; - - case 'c': - config_file = optarg; - break; - - case 'd': - jcr->message_mask = j_atoi(optarg, 124); - message_mask_set = 1; - break; - - case 's': - jcr->message_stderr = 1; - message_stderr_set = 1; - break; - - } - - - /* The configuration file must be specified, and there is no default */ - if (config_file == NULL) { - fprintf(stderr, "%s: Configuration file not specified, exiting.\n", JDBG); - return 1; - } - - /* Parse the XML in the config file -- store it as a node */ - jcr->config = xmlnode_file(config_file); - if (jcr->config == NULL) { - fprintf(stderr, "%s: XML parsing failed in configuration file '%s'\n%s\n", JDBG, config_file, xmlnode_file_borked(config_file)); - return 1; - } - - /* The spool directory --- for all xdb calls. */ - if ((xmlnode_get_type(xmlnode_get_tag(jcr->config,"spool")) == NTYPE_TAG) == 0) { - fprintf(stderr, "%s: No spool directory specified in configuration file '%s'\n", JDBG, config_file); - return 1; - } - jcr->spool_dir = strdup(xmlnode_get_data(xmlnode_get_tag(jcr->config,"spool"))); - rc = stat(jcr->spool_dir, &st); - if (rc < 0) { - fprintf(stderr, "%s: '%s': ", JDBG, jcr->spool_dir); - perror(NULL); - return 1; - } - if (!(S_ISDIR(st.st_mode))) { - fprintf(stderr, "%s: '%s' is not a directory.\n", JDBG, jcr->spool_dir); - return 1; - } - - /* The log directory --- for the log_* functions */ - if ((xmlnode_get_type(xmlnode_get_tag(jcr->config,"logdir")) == NTYPE_TAG) == 0) { - fprintf(stderr, "%s: No log directory specified in configuration file '%s'\n", JDBG, config_file); - return 1; - } - jcr->log_dir = strdup(xmlnode_get_data(xmlnode_get_tag(jcr->config,"logdir"))); - rc = stat(jcr->log_dir, &st); - if (rc < 0) { - fprintf(stderr, "%s: '%s': ", JDBG, jcr->log_dir); - perror(NULL); - return 1; - } - if (!(S_ISDIR(st.st_mode))) { - fprintf(stderr, "%s: '%s' is not a directory.\n", JDBG, jcr->log_dir); - return 1; - } - - if (!message_mask_set) - jcr->message_mask = j_atoi(xmlnode_get_data(xmlnode_get_tag(jcr->config,"loglevel")), 124); - if (!message_stderr_set) - jcr->message_stderr = (xmlnode_get_type(xmlnode_get_tag(jcr->config,"logstderr")) == NTYPE_TAG); - - - if (inBackground == 1) { - if ((pid = fork()) == -1) { - fprintf(stderr, "%s: Could not start in background\n", JDBG); - exit(1); - } - if (pid) - exit(0); - - /* in child process .... process and terminal housekeeping */ - setsid(); - fdlimit = sysconf(_SC_OPEN_MAX); - fd = 0; - while (fd < fdlimit) - close(fd++); - open("/dev/null",O_RDWR); - dup(0); - dup(0); - } - pid = getpid(); - - /* We now can initialize the resources */ - g_log_set_handler (NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL - | G_LOG_FLAG_RECURSION, jcr_log_handler, jcr); - - - log_warn(JDBG, "%s -- %s starting.", _JCOMP_NAME, _JCOMP_VERS); - - config_file = xmlnode_get_data(xmlnode_get_tag(jcr->config,"pidfile")); - if (config_file == NULL) - config_file = "./jcr.pid"; - pid_stream = fopen(config_file, "w"); - if (pid_stream != NULL) { - fprintf(pid_stream, "%d", pid); - fclose(pid_stream); - } - jcr->pid_file = j_strdup(config_file); - - jcr->dqueue = g_async_queue_new(); - gmain = g_main_loop_new(NULL, FALSE); - jcr->gmain = gmain; - jcr->recv_buffer_size = j_atoi(xmlnode_get_data(xmlnode_get_tag(jcr->config,"recv-buffer")), 8192); - jcr->recv_buffer = (char *)malloc(jcr->recv_buffer_size); - jcr->in_shutdown = 0; - - sigemptyset(&act.sa_mask); - sigaddset(&act.sa_mask, SIGTERM); - sigaddset(&act.sa_mask, SIGINT); - sigaddset(&act.sa_mask, SIGKILL); - act.sa_handler = jcr_server_shutdown; -//act.sa_restorer = NULL; - act.sa_flags = 0; - - sigaction(SIGINT, &act, NULL); - sigaction(SIGTERM, &act, NULL); - sigaction(SIGKILL, &act, NULL); - - p = pool_new(); - jcr->jcr_i = (instance)pmalloc(p, sizeof(instance)); - jcr->jcr_i->p = p; - jcr->jcr_i->id = pstrdup(p, xmlnode_get_data(xmlnode_get_tag(jcr->config,"host"))); - - /* The component call */ - xdb_v2l(jcr->jcr_i, NULL); - - - jcr->fd = -1; - - while(jcr_socket_connect()) { - sleep(2); - } - - log_warn(JDBG, "Main loop starting."); - jcr_main_new_stream(); - g_main_loop_run(gmain); - log_warn(JDBG, "Main loop exiting."); - - return 0; -} diff --git a/src/v2l_config.c b/src/v2l_config.c index a853960..6927b8b 100644 --- a/src/v2l_config.c +++ b/src/v2l_config.c @@ -17,17 +17,16 @@ #include #include #include -#include #include +#include -static char *v2l_config_get_tag(xmlnode conn_base, const char *tag); +static char *_v2l_config_get_tag(xmlnode conn_base, const char *tag); int v2l_config_init (v2l_Config * self, xmlnode cfgroot) { xmlnode conn_base; const char *portstr; - v2l_LdapConn *ldap_conn; if (!cfgroot) { @@ -44,7 +43,7 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) return 0; } - self->host = v2l_config_get_tag(conn_base, "host"); + self->host = _v2l_config_get_tag(conn_base, "host"); if (self->host == NULL) { @@ -52,10 +51,10 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) return 0; } - portstr = v2l_config_get_tag(conn_base, "port"); + portstr = _v2l_config_get_tag(conn_base, "port"); self->port = portstr != NULL ? atoi (portstr) : LDAP_PORT; - self->suffix = v2l_config_get_tag(conn_base, "suffix"); + self->suffix = _v2l_config_get_tag(conn_base, "suffix"); if (self->suffix == NULL) { @@ -63,7 +62,7 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) return 0; } - self->uniqattr = v2l_config_get_tag(conn_base, "uniqattr"); + self->uniqattr = _v2l_config_get_tag(conn_base, "uniqattr"); if (self->uniqattr == NULL) { @@ -71,7 +70,7 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) return 0; } - self->binddn = v2l_config_get_tag(conn_base, "binddn"); + self->binddn = _v2l_config_get_tag(conn_base, "binddn"); if (self->binddn == NULL) { @@ -79,7 +78,7 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) return 0; } - self->bindpw = v2l_config_get_tag(conn_base, "bindpw"); + self->bindpw = _v2l_config_get_tag(conn_base, "bindpw"); if (self->bindpw == NULL) { @@ -89,25 +88,22 @@ v2l_config_init (v2l_Config * self, xmlnode cfgroot) } /* Get a handle to an LDAP connection. */ - log_debug (ZONE, "LDAP server: %s / port : %d", - self->host, self->port); + log_debug (ZONE, "LDAP server: %s / port : %d", self->host, self->port); - if ((ldap_conn = - v2l_create_conn (self->host, self->port, self->binddn, - V2L_ADMIN, self->bindpw, 0)) == NULL) + self->master_conn = v2l_get_master_conn (self); + + if (self->master_conn == NULL) { log_error (ZONE, "Unable to create the LDAP main connection"); return 0; } - self->master_conn = ldap_conn; - return 1; } static char * -v2l_config_get_tag(xmlnode conn_base, const char *tag) +_v2l_config_get_tag(xmlnode conn_base, const char *tag) { xmlnode tmp; diff --git a/src/v2l_conn.c b/src/v2l_conn.c index 860561a..157f050 100644 --- a/src/v2l_conn.c +++ b/src/v2l_conn.c @@ -30,29 +30,278 @@ /* Global hashtable of all currently active LDAP connections */ static xht global_conn_list = NULL; -static void v2l_free_conn (xht h, const char *user, void *val); -static void v2l_add_conn (v2l_LdapConn * ldap_conn); -static void v2l_free_callback (xht h, const char *key, void *val, +static v2l_LdapConn *_v2l_create_conn (char *host, int port, const char *binddn, + const char *user, const char *passwd, int add_in_list); +/* NOTE: Allocated memory must be freed by the caller */ +static char* _v2l_ldap_get_passwd (v2l_Config * self, const char * user); +static void _v2l_free_conn (xht h, const char *user, void *val); +static int _v2l_count_attrs (v2l_LdapRequest * req); +static v2l_LdapRequest *_v2l_add_attr (v2l_LdapRequest *req, LDAPMod * attr); +static void _v2l_add_conn (v2l_LdapConn * ldap_conn); +static void _v2l_free_callback (xht h, const char *key, void *val, void *arg); /* Free connections when its time has expired (periodic thread) */ -static void v2l_purge_conn_callback (void *arg); +static void _v2l_purge_conn_callback (void *arg); /* Free connections in a hashtable, walker function */ -static void v2l_free_expired (xht h, const char *key, void *val, +static void _v2l_free_expired (xht h, const char *key, void *val, void *arg); /* A thread for wait for LDAP results */ -static int v2l_ldap_wait_callback(void *arg); +static int _v2l_ldap_wait_callback(void *arg); -#ifdef _JCOMP -static gpointer v2l_ldap_wait_callback_g (gpointer arg); -static gpointer v2l_purge_conn_callback_g (gpointer arg); +#ifdef _V2L_JABBER2 +static gpointer _v2l_ldap_wait_callback_g (gpointer arg); +static gpointer _v2l_purge_conn_callback_g (gpointer arg); #endif /* public api */ v2l_LdapConn * -v2l_create_conn (char *host, int port, const char *binddn, +v2l_get_conn (v2l_Config *self, const char *user) +{ + v2l_LdapConn *user_conn; + + user_conn = (v2l_LdapConn *) xhash_get (global_conn_list, user); + + if(user_conn == NULL) + { + char *passwd, *binddn; + + /* Get the user password for connecting him to LDAP server */ + passwd = _v2l_ldap_get_passwd (self, user); + + /* user exists? */ + if (passwd == NULL) + { + log_error (ZONE, "User \"%s\" not found in the directory", user); + return NULL; + } + + binddn = (char *) malloc (sizeof(char) * (strlen (self->suffix) + + strlen (self->uniqattr) + strlen (user) + 3)); + + if (binddn == NULL) + { + log_error (ZONE, "Unable to allocate memory"); + free (passwd); + return NULL; + } + + sprintf (binddn, "%s=%s,%s", self->uniqattr, user, self->suffix); + + log_debug (ZONE, "Attempting to connect with DN: %s", binddn); + + user_conn = _v2l_create_conn (self->host, self->port, binddn, user, + passwd, 1); + + free (passwd); + free (binddn); + + } /* user_conn == NULL */ + + return user_conn; +} + +v2l_LdapConn * +v2l_get_master_conn (v2l_Config *self) +{ + return _v2l_create_conn (self->host, self->port, self->binddn, V2L_ADMIN, + self->bindpw, 0); +} + +void +v2l_free_allconn () +{ + xhash_walk (global_conn_list, _v2l_free_callback, NULL); + xhash_free (global_conn_list); +} + +void +v2l_ldap_sync (v2l_LdapEvt *evt_res) +{ +#ifndef _V2L_JABBER2 + pth_event_t evt; + + evt = pth_event (PTH_EVENT_FUNC, &_v2l_ldap_wait_callback, + (void *) evt_res, pth_time (V2L_POLL_INTERVAL, 0)); + pth_wait (evt); +#else + GThread *thr; + GError *err = NULL; + + thr = g_thread_create((GThreadFunc) _v2l_ldap_wait_callback_g, + (void *) evt_res, TRUE, &err); + + if (thr == NULL) + { + log_error (ZONE, "Thread create failed: %s\n", err->message); + g_error_free (err); + } + + g_thread_join(thr); +#endif +} + +int +v2l_ldap_search (char *dn, char *suffix, char **attrs, int subtree, + v2l_LdapEvt *evt_res) +{ + int scope; + + scope = subtree ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_ONELEVEL; + + return ldap_search_ext (evt_res->ld, suffix, scope, + dn, attrs, 0, NULL, NULL, NULL, LDAP_NO_LIMIT, + &(evt_res->msgid)); +} + +int +v2l_ldap_modify (char *dn, LDAPMod **attrs, v2l_LdapEvt *evt_res) +{ + return ldap_modify_ext (evt_res->ld, dn, attrs, NULL, NULL, + &(evt_res->msgid)); +} + +int +v2l_request_record (v2l_Config *self, v2l_LdapConn * curr_conn, + v2l_LdapRequest *req) +{ + LDAPMod **attrs; + int i, nbmod, ret; + v2l_LdapRequest *cur_req, *cur_temp; + v2l_LdapEvt *evt_res; + + if (req == NULL) + { + log_warn (ZONE, "LDAP request is NULL? I cannot record anything"); + return 1; + } + + nbmod = _v2l_count_attrs (req); + + attrs = (LDAPMod **) malloc ((nbmod + 1) * sizeof (LDAPMod *)); + + if (attrs == NULL) + { + LOG_ERROR_MEM; + return 0; + } + + /* to wait for the results */ + evt_res = (v2l_LdapEvt *) malloc (sizeof (v2l_LdapEvt)); + + if (evt_res == NULL) + { + LOG_ERROR_MEM; + free (attrs); + return 0; + } + + for (i = 0; i < nbmod; i++) + { + attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); + + if (attrs[i] == NULL) + { + while (--i >= 0) + { + free (attrs[i]); + } + + LOG_ERROR_MEM; + free (attrs); + free (evt_res); + return 0; + } + } + + for (cur_req = req, i = 0; i < nbmod; i++) + { + memcpy (attrs[i], cur_req->attr, sizeof (LDAPMod)); + cur_req = cur_req->next; + } + + attrs[nbmod] = NULL; + + evt_res->ld = curr_conn->ld; + evt_res->rc = v2l_ldap_modify (curr_conn->binddn, attrs, evt_res); + + if (evt_res->rc != LDAP_SUCCESS) + { + log_error(ZONE, "LDAP error attempting to modify user info: %s", + ldap_err2string (evt_res->rc)); + ret = 0; + } + else + { + v2l_ldap_sync (evt_res); + ret = 1; + } + + ldap_msgfree (evt_res->result); + free (evt_res); + + for (cur_req = req, i = 0; i < nbmod; i++) + { + cur_temp = cur_req; + cur_req = cur_req->next; + + free (attrs[i]); + free (cur_temp->attr->mod_values[0]); + free (cur_temp->attr->mod_values); + free (cur_temp->attr); + free (cur_temp); + } + + free (attrs); + + return ret; +} + +v2l_LdapRequest * +v2l_add_attr_str (v2l_LdapRequest *req, const char *attr, const char *str) +{ + LDAPMod *mod; + + mod = (LDAPMod *) malloc (sizeof (LDAPMod)); + + if (mod == NULL) + { + return NULL; + } + + mod->mod_op = LDAP_MOD_REPLACE; + mod->mod_type = (char *) attr; + + mod->mod_values = (char **) malloc (2 * sizeof (char *)); + + if (mod->mod_values == NULL) + { + free (mod); + return NULL; + } + + mod->mod_values[0] = (char *) malloc ((strlen (str) + 1) * sizeof (char)); + + if (mod->mod_values[0] == NULL) + { + free (mod->mod_values); + free (mod); + return NULL; + } + + memcpy (mod->mod_values[0], str, strlen (str) + 1); + mod->mod_values[1] = NULL; + + return _v2l_add_attr (req, mod); +} + +/************************/ +/* public api ends here */ + +static v2l_LdapConn * +_v2l_create_conn (char *host, int port, const char *binddn, const char *user, const char *passwd, int add_in_list) { LDAP *ld; @@ -114,21 +363,15 @@ v2l_create_conn (char *host, int port, const char *binddn, if (add_in_list == 1) /* Add it to global_conn_list */ { - v2l_add_conn (ldap_conn); + _v2l_add_conn (ldap_conn); } free (tmp_str); return ldap_conn; } -v2l_LdapConn * -v2l_get_conn (const char *user) -{ - return (v2l_LdapConn *) xhash_get (global_conn_list, user); -} - -char * -v2l_ldap_get_passwd(v2l_Config *self, char *user) +static char * +_v2l_ldap_get_passwd(v2l_Config *self, const char *user) { LDAPMessage *e; v2l_LdapEvt *evt_res; @@ -209,64 +452,66 @@ v2l_ldap_get_passwd(v2l_Config *self, char *user) return data; } -void -v2l_free_allconn () +/* count the number of LDAPMod in the structure */ +static int +_v2l_count_attrs (v2l_LdapRequest * req) { - xhash_walk (global_conn_list, v2l_free_callback, NULL); - xhash_free (global_conn_list); -} + v2l_LdapRequest *ptr; + int nbmod; -void -v2l_ldap_sync (v2l_LdapEvt *evt_res) -{ -#ifndef _JCOMP - pth_event_t evt; + for (nbmod = 0, ptr = req; ptr != NULL; ptr = ptr->next, nbmod++); - evt = pth_event (PTH_EVENT_FUNC, &v2l_ldap_wait_callback, - (void *) evt_res, pth_time (V2L_POLL_INTERVAL, 0)); - pth_wait (evt); -#else - GThread *thr; - GError *err = NULL; + return nbmod; +} - thr = g_thread_create((GThreadFunc) v2l_ldap_wait_callback_g, - (void *) evt_res, TRUE, &err); - - if (thr == NULL) +static v2l_LdapRequest * +_v2l_add_attr (v2l_LdapRequest *req, LDAPMod * attr) +{ + if (attr == NULL) { - log_error (ZONE, "Thread create failed: %s\n", err->message); - g_error_free (err); + log_warn (ZONE, "LDAP attribute is NULL? I cannot add anything"); + return NULL; } - g_thread_join(thr); -#endif -} + if (req == NULL) + { + req = (v2l_LdapRequest *) malloc (sizeof (v2l_LdapRequest)); -int -v2l_ldap_search (char *dn, char *suffix, char **attrs, int subtree, - v2l_LdapEvt *evt_res) -{ - int scope; + if (req == NULL) + { + LOG_ERROR_MEM; + return NULL; + } - scope = subtree ? LDAP_SCOPE_SUBTREE : LDAP_SCOPE_ONELEVEL; + req->attr = attr; + req->next = NULL; + } + else + { + v2l_LdapRequest *ptr; + v2l_LdapRequest *new_req; - return ldap_search_ext (evt_res->ld, suffix, scope, - dn, attrs, 0, NULL, NULL, NULL, LDAP_NO_LIMIT, - &(evt_res->msgid)); -} + new_req = (v2l_LdapRequest *) malloc (sizeof (v2l_LdapRequest)); -int -v2l_ldap_modify (char *dn, LDAPMod **attrs, v2l_LdapEvt *evt_res) -{ - return ldap_modify_ext (evt_res->ld, dn, attrs, NULL, NULL, - &(evt_res->msgid)); -} + if (new_req == NULL) + { + LOG_ERROR_MEM; + return NULL; + } -/************************/ -/* public api ends here */ + new_req->attr = attr; + new_req->next = NULL; + + for (ptr = req; ptr->next != NULL; ptr = ptr->next); + + ptr->next = new_req; + } + + return req; +} -static -int v2l_ldap_wait_callback(void *arg) +static int +_v2l_ldap_wait_callback(void *arg) { v2l_LdapEvt *evt_res = (v2l_LdapEvt *) arg; LDAPMessage *result; @@ -297,11 +542,11 @@ int v2l_ldap_wait_callback(void *arg) return 0; /* still waiting */ } -#ifdef _JCOMP +#ifdef _V2L_JABBER2 static gpointer -v2l_ldap_wait_callback_g (gpointer arg) +_v2l_ldap_wait_callback_g (gpointer arg) { - while (!v2l_ldap_wait_callback (arg)) + while (!_v2l_ldap_wait_callback (arg)) { g_usleep (V2L_POLL_INTERVAL * 1000000); } @@ -311,13 +556,13 @@ v2l_ldap_wait_callback_g (gpointer arg) #endif static void -v2l_free_callback (xht h, const char *key, void *val, void *arg) +_v2l_free_callback (xht h, const char *key, void *val, void *arg) { - v2l_free_conn (h, key, val); + _v2l_free_conn (h, key, val); } static void -v2l_free_conn (xht h, const char *user, void *val) +_v2l_free_conn (xht h, const char *user, void *val) { v2l_LdapConn *temp_conn = (v2l_LdapConn *) val; @@ -329,19 +574,19 @@ v2l_free_conn (xht h, const char *user, void *val) } static void -v2l_free_expired (xht h, const char *key, void *val, void *arg) +_v2l_free_expired (xht h, const char *key, void *val, void *arg) { v2l_LdapConn *temp_conn = (v2l_LdapConn *) val; /* kill connections older than V2L_CONN_LIFETIME */ if ((time (NULL) - temp_conn->creation_time) > (time_t) V2L_CONN_LIFETIME) { - v2l_free_conn (h, key, val); + _v2l_free_conn (h, key, val); } } static void -v2l_purge_conn_callback (void *arg) +_v2l_purge_conn_callback (void *arg) { log_debug (ZONE, "Checking connections lifetime"); @@ -350,9 +595,9 @@ v2l_purge_conn_callback (void *arg) /* global_conn_list has been freed? */ if (global_conn_list != NULL) { - xhash_walk (global_conn_list, v2l_free_expired, NULL); + xhash_walk (global_conn_list, _v2l_free_expired, NULL); } -#ifndef _JCOMP +#ifndef _V2L_JABBER2 pth_sleep (V2L_CONN_LIFETIME); #else g_usleep (V2L_CONN_LIFETIME * 1000000); @@ -361,19 +606,19 @@ v2l_purge_conn_callback (void *arg) } -#ifdef _JCOMP +#ifdef _V2L_JABBER2 static gpointer -v2l_purge_conn_callback_g (gpointer arg) +_v2l_purge_conn_callback_g (gpointer arg) { - v2l_purge_conn_callback(arg); + _v2l_purge_conn_callback(arg); return NULL; } #endif static void -v2l_add_conn (v2l_LdapConn * ldap_conn) +_v2l_add_conn (v2l_LdapConn * ldap_conn) { -#ifndef _JCOMP +#ifndef _V2L_JABBER2 pth_attr_t attr; #else GThread *thr; @@ -388,14 +633,14 @@ v2l_add_conn (v2l_LdapConn * ldap_conn) global_conn_list = xhash_new (509); /* spawn the thread which deletes expired connections */ -#ifndef _JCOMP +#ifndef _V2L_JABBER2 attr = pth_attr_new (); pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE); - pth_spawn (attr, (void *) v2l_purge_conn_callback, NULL); + pth_spawn (attr, (void *) _v2l_purge_conn_callback, NULL); pth_attr_destroy (attr); #else - thr = g_thread_create ((GThreadFunc) v2l_purge_conn_callback, NULL, FALSE, - &err); + thr = g_thread_create ((GThreadFunc) _v2l_purge_conn_callback, NULL, + FALSE, &err); if (thr == NULL) { diff --git a/src/v2l_main.c b/src/v2l_main.c index c41e722..0ac920b 100644 --- a/src/v2l_main.c +++ b/src/v2l_main.c @@ -17,21 +17,16 @@ #include #include #include -#include #include +#include #include -#ifdef _JCOMP - #define xdbcache void* -#endif - #define LOG_ERROR_MEM log_error(ZONE, "Unable to allocate memory") -static result v2l_packets_handler (instance i, dpacket p, void *args); -static short v2l_check_attr_value (xmlnode node, char *attr_name, - char *attr_value); - -static void v2l_shutdown (void *arg); +static result _v2l_packets_handler (instance i, dpacket p, void *args); +static short _v2l_check_attr_value (xmlnode node, char *attr_name, + char *attr_value); +static void _v2l_shutdown (void *arg); /* * xdb_v2l (), module entry point. @@ -53,14 +48,10 @@ xdb_v2l (instance i, xmlnode x) self->poolref = i->p; -#ifndef _JCOMP /* Load config from xdb */ xc = xdb_cache (i); self->config = xdb_get (xc, jid_new (xmlnode_pool (x), "config@-internal"), "jabberd:xdb_v2l:config"); -#else - self->config = xmlnode_get_tag (jcr->config, "config"); -#endif /* Parse config */ if (!v2l_config_init (self, self->config)) @@ -69,14 +60,14 @@ xdb_v2l (instance i, xmlnode x) exit (1); } - register_phandler (i, o_DELIVER, v2l_packets_handler, (void *) self); - register_shutdown (v2l_shutdown, (void *) self); + register_phandler (i, o_DELIVER, _v2l_packets_handler, (void *) self); + register_shutdown (_v2l_shutdown, (void *) self); log_debug (ZONE, "xdb_v2l has been successfully initialized"); } static void -v2l_shutdown (void *arg) +_v2l_shutdown (void *arg) { v2l_Config *self = (v2l_Config *) arg; @@ -91,7 +82,7 @@ v2l_shutdown (void *arg) * Main callback. Handle xdb packets */ static result -v2l_packets_handler (instance i, dpacket p, void *args) +_v2l_packets_handler (instance i, dpacket p, void *args) { v2l_Config *self = (v2l_Config *) args; v2l_LdapConn *user_conn; @@ -103,66 +94,30 @@ v2l_packets_handler (instance i, dpacket p, void *args) return r_ERR; } - if (v2l_check_attr_value (p->x, "type", "error")) + if (_v2l_check_attr_value (p->x, "type", "error")) { xmlnode_free (p->x); log_warn (ZONE, "xdb_v2l received an error packet"); return r_DONE; } - if (!v2l_check_attr_value (p->x, "ns", NS_VCARD)) + if (!_v2l_check_attr_value (p->x, "ns", NS_VCARD)) { log_warn (ZONE, "xdb_v2l received a packet for other namespace than NS_VCARD"); return r_PASS; } - user_conn = v2l_get_conn (p->id->user); + user_conn = v2l_get_conn (self, p->id->user); if (user_conn == NULL) { - char *passwd, *binddn; - - /* Get the user password for connecting him to LDAP server */ - passwd = v2l_ldap_get_passwd (self, p->id->user); - - /* user exists? */ - if (passwd == NULL) - { - log_error (ZONE, "User \"%s\" not found in the directory", - p->id->user); - return r_ERR; - } - - binddn = (char *) malloc (sizeof (char) * (strlen (self->suffix) + - strlen (self->uniqattr) + strlen (p->id->user) + 3)); - - if (binddn == NULL) - { - LOG_ERROR_MEM; - free (passwd); - return r_ERR; - } - - sprintf (binddn, "%s=%s,%s", self->uniqattr, p->id->user, self->suffix); - - log_debug (ZONE, "Attempting to connect with DN: %s", binddn); - - user_conn = v2l_create_conn (self->host, self->port, binddn, - p->id->user, passwd, 1); - - free (passwd); - free (binddn); - - if (user_conn == NULL) - { - log_error (ZONE, "Unable to create connection for \"%s\" user", - p->id->user); - return r_ERR; - } - } /* user_conn == NULL */ + log_error (ZONE, "Unable to create connection for \"%s\" user", + p->id->user); + return r_ERR; + } - if (v2l_check_attr_value (p->x, "type", "set")) + if (_v2l_check_attr_value (p->x, "type", "set")) { xmlnode child = xmlnode_get_firstchild (p->x); @@ -201,11 +156,11 @@ v2l_packets_handler (instance i, dpacket p, void *args) } static short -v2l_check_attr_value (xmlnode node, char *attr_name, char *value) +_v2l_check_attr_value (xmlnode node, char *attr_name, char *value) { if ((node == NULL) || (attr_name == NULL) || (value == NULL)) { - log_debug (ZONE, "v2l_check_attr_value() parameters are not valid"); + log_debug (ZONE, "_v2l_check_attr_value() parameters are not valid"); return 0; } diff --git a/src/v2l_vcard.c b/src/v2l_vcard.c index ec321a9..0342f4a 100644 --- a/src/v2l_vcard.c +++ b/src/v2l_vcard.c @@ -23,87 +23,73 @@ #define LOG_ERROR_MEM log_error(ZONE, "Unable to allocate memory") - -/* create the whole LDAP request and executes it */ -static int v2l_vcard_record (v2l_Config * self, - v2l_LdapConn * curr_conn, v2l_LdapRequest * req); -/* counts the number of attributes in the request */ -static int v2l_count_attrs (v2l_LdapRequest * req); /* create the tag */ -static int v2l_create_fn (xmlnode vcard); -/* add an attribute in the LDAP request */ -static v2l_LdapRequest *v2l_add_attr (v2l_LdapRequest * req, LDAPMod * attr); -/* add an attribute in the LDAP request (higher level) */ -static v2l_LdapRequest *v2l_add_attr_str (v2l_LdapRequest * req, - const char *attr, const char *str); +static int _v2l_create_fn (xmlnode vcard); /* mapping functions from LDAP to XML vCard */ -static xmlnode v2l_ldap2vcard_generic (char *attr, char **vals, xmlnode res, - const char *tag); -static xmlnode v2l_ldap2vcard_generic_group (char *attr, char **vals, - xmlnode res, const char *gtag, - const char **tags); - -static xmlnode v2l_ldap2vcard_n (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_nickname (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_url (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_org (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_title (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_tel (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_adr (char *attr, char **vals, xmlnode res); -static xmlnode v2l_ldap2vcard_email (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_generic (char *attr, char **vals, xmlnode res, + const char *tag); +static xmlnode _v2l_ldap2vcard_generic_group (char *attr, char **vals, + xmlnode res, const char *gtag, const char **tags); + +static xmlnode _v2l_ldap2vcard_n (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_nickname (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_url (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_org (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_title (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_tel (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_adr (char *attr, char **vals, xmlnode res); +static xmlnode _v2l_ldap2vcard_email (char *attr, char **vals, xmlnode res); /* mapping functions from XML Vcard to LDAP */ -static v2l_LdapRequest *v2l_vcard2ldap_generic (v2l_LdapRequest * req, - xmlnode data, - const char **tags); - -static v2l_LdapRequest *v2l_vcard2ldap_n (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_nickname (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_url (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_org (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_title (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_tel (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_adr (v2l_LdapRequest * req, - xmlnode data); -static v2l_LdapRequest *v2l_vcard2ldap_email (v2l_LdapRequest * req, - xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_generic (v2l_LdapRequest *req, + xmlnode data, const char **tags); + +static v2l_LdapRequest *_v2l_vcard2ldap_n (v2l_LdapRequest *req, xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_nickname (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_url (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_org (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_title (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_tel (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_adr (v2l_LdapRequest *req, + xmlnode data); +static v2l_LdapRequest *_v2l_vcard2ldap_email (v2l_LdapRequest *req, + xmlnode data); /******* Translation maps */ static v2l_Ldap2Vcard static_map_ldap[] = { - {"givenName", v2l_ldap2vcard_n}, - {"sn", v2l_ldap2vcard_n}, - {"displayName", v2l_ldap2vcard_nickname}, - {"labeledURI", v2l_ldap2vcard_url}, - {"o", v2l_ldap2vcard_org}, - {"ou", v2l_ldap2vcard_org}, - {"title", v2l_ldap2vcard_title}, - {"telephoneNumber", v2l_ldap2vcard_tel}, - {"street", v2l_ldap2vcard_adr}, - {"l", v2l_ldap2vcard_adr}, - {"st", v2l_ldap2vcard_adr}, - {"postalCode", v2l_ldap2vcard_adr}, - {"c", v2l_ldap2vcard_adr}, - {"mail", v2l_ldap2vcard_email}, + {"givenName", _v2l_ldap2vcard_n}, + {"sn", _v2l_ldap2vcard_n}, + {"displayName", _v2l_ldap2vcard_nickname}, + {"labeledURI", _v2l_ldap2vcard_url}, + {"o", _v2l_ldap2vcard_org}, + {"ou", _v2l_ldap2vcard_org}, + {"title", _v2l_ldap2vcard_title}, + {"telephoneNumber", _v2l_ldap2vcard_tel}, + {"street", _v2l_ldap2vcard_adr}, + {"l", _v2l_ldap2vcard_adr}, + {"st", _v2l_ldap2vcard_adr}, + {"postalCode", _v2l_ldap2vcard_adr}, + {"c", _v2l_ldap2vcard_adr}, + {"mail", _v2l_ldap2vcard_email}, {NULL, NULL} }; /* is not handled but created in v2l_create_fn() */ static v2l_Vcard2Ldap static_map_vcard[] = { - {"N", v2l_vcard2ldap_n}, - {"NICKNAME", v2l_vcard2ldap_nickname}, - {"URL", v2l_vcard2ldap_url}, - {"ORG", v2l_vcard2ldap_org}, - {"TITLE", v2l_vcard2ldap_title}, - {"TEL", v2l_vcard2ldap_tel}, - {"ADR", v2l_vcard2ldap_adr}, - {"EMAIL", v2l_vcard2ldap_email}, + {"N", _v2l_vcard2ldap_n}, + {"NICKNAME", _v2l_vcard2ldap_nickname}, + {"URL", _v2l_vcard2ldap_url}, + {"ORG", _v2l_vcard2ldap_org}, + {"TITLE", _v2l_vcard2ldap_title}, + {"TEL", _v2l_vcard2ldap_tel}, + {"ADR", _v2l_vcard2ldap_adr}, + {"EMAIL", _v2l_vcard2ldap_email}, {NULL, NULL} }; @@ -204,7 +190,7 @@ v2l_vcard_get (v2l_Config * self, v2l_LdapConn * curr_conn) ldap_msgfree (evt_res->result); free (evt_res); - v2l_create_fn (vcard); + _v2l_create_fn (vcard); log_debug (ZONE, "vCard read from LDAP: %s", xmlnode2str (vcard)); return vcard; @@ -233,166 +219,12 @@ v2l_vcard_set (v2l_Config * self, v2l_LdapConn * curr_conn, xmlnode data) } } - return v2l_vcard_record (self, curr_conn, ldap_req); + return v2l_request_record (self, curr_conn, ldap_req); } /* public api ends here */ static int -v2l_vcard_record (v2l_Config * self, v2l_LdapConn * curr_conn, - struct v2l_LdapRequest *req) -{ - LDAPMod **attrs; - int i, nbmod, ret; - v2l_LdapRequest *cur_req, *cur_temp; - v2l_LdapEvt *evt_res; - - if (req == NULL) - { - log_warn (ZONE, "LDAP request is NULL? I cannot record anything"); - return 1; - } - - nbmod = v2l_count_attrs (req); - - attrs = (LDAPMod **) malloc ((nbmod + 1) * sizeof (LDAPMod *)); - - if (attrs == NULL) - { - LOG_ERROR_MEM; - return 0; - } - - /* to wait for the results */ - evt_res = (v2l_LdapEvt *) malloc (sizeof (v2l_LdapEvt)); - - if (evt_res == NULL) - { - LOG_ERROR_MEM; - free (attrs); - return 0; - } - - for (i = 0; i < nbmod; i++) - { - attrs[i] = (LDAPMod *) malloc (sizeof (LDAPMod)); - - if (attrs[i] == NULL) - { - while (--i >= 0) - { - free (attrs[i]); - } - - LOG_ERROR_MEM; - free (attrs); - free (evt_res); - return 0; - } - } - - for (cur_req = req, i = 0; i < nbmod; i++) - { - memcpy (attrs[i], cur_req->attr, sizeof (LDAPMod)); - cur_req = cur_req->next; - } - - attrs[nbmod] = NULL; - - evt_res->ld = curr_conn->ld; - evt_res->rc = v2l_ldap_modify (curr_conn->binddn, attrs, evt_res); - - if (evt_res->rc != LDAP_SUCCESS) - { - log_error(ZONE, "LDAP error attempting to modify user info: %s", - ldap_err2string (evt_res->rc)); - ret = 0; - } - else - { - v2l_ldap_sync (evt_res); - ret = 1; - } - - ldap_msgfree (evt_res->result); - free (evt_res); - - for (cur_req = req, i = 0; i < nbmod; i++) - { - cur_temp = cur_req; - cur_req = cur_req->next; - - free (attrs[i]); - free (cur_temp->attr->mod_values[0]); - free (cur_temp->attr->mod_values); - free (cur_temp->attr); - free (cur_temp); - } - - free (attrs); - - return ret; -} - -/* count the number of LDAPMod in the structure */ -static int -v2l_count_attrs (v2l_LdapRequest * req) -{ - v2l_LdapRequest *ptr; - int nbmod; - - for (nbmod = 0, ptr = req; ptr != NULL; ptr = ptr->next, nbmod++); - - return nbmod; -} - -static v2l_LdapRequest * -v2l_add_attr (v2l_LdapRequest * req, LDAPMod * attr) -{ - if (attr == NULL) - { - log_warn (ZONE, "LDAP attribute is NULL? I cannot add anything"); - return NULL; - } - - if (req == NULL) - { - req = (v2l_LdapRequest *) malloc (sizeof (v2l_LdapRequest)); - - if (req == NULL) - { - LOG_ERROR_MEM; - return NULL; - } - - req->attr = attr; - req->next = NULL; - } - else - { - v2l_LdapRequest *ptr; - v2l_LdapRequest *new_req; - - new_req = (v2l_LdapRequest *) malloc (sizeof (v2l_LdapRequest)); - - if (new_req == NULL) - { - LOG_ERROR_MEM; - return NULL; - } - - new_req->attr = attr; - new_req->next = NULL; - - for (ptr = req; ptr->next != NULL; ptr = ptr->next); - - ptr->next = new_req; - } - - return req; -} - -static int -v2l_create_fn (xmlnode vcard) +_v2l_create_fn (xmlnode vcard) { xmlnode n, fn; char *family, *given, *fn_str; @@ -432,7 +264,7 @@ v2l_create_fn (xmlnode vcard) /* LDAP -> vCard */ static xmlnode -v2l_ldap2vcard_generic (char *attr, char **vals, xmlnode res, const char *tag) +_v2l_ldap2vcard_generic (char *attr, char **vals, xmlnode res, const char *tag) { xmlnode node; @@ -451,10 +283,8 @@ v2l_ldap2vcard_generic (char *attr, char **vals, xmlnode res, const char *tag) } static xmlnode -v2l_ldap2vcard_generic_group (char *attr, - char **vals, - xmlnode res, - const char *gtag, const char **tags) +_v2l_ldap2vcard_generic_group (char *attr, char **vals, xmlnode res, + const char *gtag, const char **tags) { xmlnode node; int first; @@ -492,61 +322,60 @@ v2l_ldap2vcard_generic_group (char *attr, } static xmlnode -v2l_ldap2vcard_n (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_n (char *attr, char **vals, xmlnode res) { const char *tags[] = { V2L_N_TAGS, NULL }; - return v2l_ldap2vcard_generic_group (attr, vals, res, "N", tags); + return _v2l_ldap2vcard_generic_group (attr, vals, res, "N", tags); } static xmlnode -v2l_ldap2vcard_nickname (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_nickname (char *attr, char **vals, xmlnode res) { - return v2l_ldap2vcard_generic (attr, vals, res, "NICKNAME"); + return _v2l_ldap2vcard_generic (attr, vals, res, "NICKNAME"); } static xmlnode -v2l_ldap2vcard_url (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_url (char *attr, char **vals, xmlnode res) { - return v2l_ldap2vcard_generic (attr, vals, res, "URL"); + return _v2l_ldap2vcard_generic (attr, vals, res, "URL"); } static xmlnode -v2l_ldap2vcard_org (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_org (char *attr, char **vals, xmlnode res) { const char *tags[] = { V2L_ORG_TAGS, NULL }; - return v2l_ldap2vcard_generic_group (attr, vals, res, "ORG", tags); + return _v2l_ldap2vcard_generic_group (attr, vals, res, "ORG", tags); } static xmlnode -v2l_ldap2vcard_title (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_title (char *attr, char **vals, xmlnode res) { - return v2l_ldap2vcard_generic (attr, vals, res, "TITLE"); + return _v2l_ldap2vcard_generic (attr, vals, res, "TITLE"); } static xmlnode -v2l_ldap2vcard_tel (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_tel (char *attr, char **vals, xmlnode res) { - return v2l_ldap2vcard_generic (attr, vals, res, "TEL"); + return _v2l_ldap2vcard_generic (attr, vals, res, "TEL"); } static xmlnode -v2l_ldap2vcard_adr (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_adr (char *attr, char **vals, xmlnode res) { const char *tags[] = { V2L_ADR_TAGS, NULL }; - return v2l_ldap2vcard_generic_group (attr, vals, res, "ADR", tags); + return _v2l_ldap2vcard_generic_group (attr, vals, res, "ADR", tags); } static xmlnode -v2l_ldap2vcard_email (char *attr, char **vals, xmlnode res) +_v2l_ldap2vcard_email (char *attr, char **vals, xmlnode res) { - return v2l_ldap2vcard_generic (attr, vals, res, "EMAIL"); + return _v2l_ldap2vcard_generic (attr, vals, res, "EMAIL"); } /* vCard -> LDAP */ static v2l_LdapRequest * -v2l_vcard2ldap_generic (v2l_LdapRequest * req, xmlnode data, - const char **tags) +_v2l_vcard2ldap_generic (v2l_LdapRequest *req, xmlnode data, const char **tags) { xmlnode node; const char **handled, *str; @@ -582,49 +411,11 @@ v2l_vcard2ldap_generic (v2l_LdapRequest * req, xmlnode data, } static v2l_LdapRequest * -v2l_add_attr_str (v2l_LdapRequest * req, const char *attr, const char *str) -{ - LDAPMod *mod; - - mod = (LDAPMod *) malloc (sizeof (LDAPMod)); - - if (mod == NULL) - { - return NULL; - } - - mod->mod_op = LDAP_MOD_REPLACE; - mod->mod_type = (char *) attr; - - mod->mod_values = (char **) malloc (2 * sizeof (char *)); - - if (mod->mod_values == NULL) - { - free (mod); - return NULL; - } - - mod->mod_values[0] = (char *) malloc ((strlen (str) + 1) * sizeof (char)); - - if (mod->mod_values[0] == NULL) - { - free (mod->mod_values); - free (mod); - return NULL; - } - - memcpy (mod->mod_values[0], str, strlen (str) + 1); - mod->mod_values[1] = NULL; - - return v2l_add_attr (req, mod); -} - -static v2l_LdapRequest * -v2l_vcard2ldap_n (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_n (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_N_TAGS, NULL }; - req = v2l_vcard2ldap_generic (req, data, tags); + req = _v2l_vcard2ldap_generic (req, data, tags); if (req != NULL) { @@ -632,110 +423,111 @@ v2l_vcard2ldap_n (v2l_LdapRequest * req, xmlnode data) char *sn; for (ptr = req, sn = NULL; ptr != NULL; ptr = ptr->next) - { - if (strcmp (ptr->attr->mod_type, "sn") == 0) - { - sn = ptr->attr->mod_values[0]; - break; - } - } + { + if (strcmp (ptr->attr->mod_type, "sn") == 0) + { + sn = ptr->attr->mod_values[0]; + break; + } + } if (sn != NULL) - { - char *sit, *sn1, *sn2; + { + char *sit, *sn1, *sn2; - for (sit = sn; *sit != ' ' && *sit != 0; sit++); + for (sit = sn; *sit != ' ' && *sit != 0; sit++); - sn1 = (char *) malloc (sizeof (char) * (sit - sn + 1)); + sn1 = (char *) malloc (sizeof (char) * (sit - sn + 1)); - if (sn1 == NULL) - { - return req; - } + if (sn1 == NULL) + { + return req; + } - strncpy (sn1, sn, sizeof (char) * (sit - sn)); - sn1[sit - sn] = 0; - ptr = v2l_add_attr_str (req, "sn1", sn1); - free (sn1); + strncpy (sn1, sn, sizeof (char) * (sit - sn)); + sn1[sit - sn] = 0; + ptr = v2l_add_attr_str (req, "sn1", sn1); + free (sn1); - if (ptr == NULL) - { - return req; - } + if (ptr == NULL) + { + return req; + } - req = ptr; + req = ptr; - if (sit - sn != strlen (sn)) - { - sn2 = (char *) malloc (sizeof (char) * (strlen (sit) + 1)); + if (sit - sn != strlen (sn)) + { + sn2 = (char *) malloc (sizeof (char) * (strlen (sit) + 1)); - if (sn2 == NULL) - { - return req; - } + if (sn2 == NULL) + { + LOG_ERROR_MEM; + return req; + } - strcpy (sn2, sit); - ptr = v2l_add_attr_str (req, "sn2", sn2); - free (sn2); + strcpy (sn2, sit); + ptr = v2l_add_attr_str (req, "sn2", sn2); + free (sn2); - if (ptr == NULL) - { - return req; - } + if (ptr == NULL) + { + return req; + } - req = ptr; - } - } /* sn != NULL */ + req = ptr; + } + } /* sn != NULL */ } /* req != NULL */ return req; } static v2l_LdapRequest * -v2l_vcard2ldap_nickname (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_nickname (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_NICKNAME_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_url (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_url (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_URL_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_org (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_org (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_ORG_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_title (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_title (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_TITLE_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_tel (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_tel (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_TEL_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_adr (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_adr (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_ADR_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } static v2l_LdapRequest * -v2l_vcard2ldap_email (v2l_LdapRequest * req, xmlnode data) +_v2l_vcard2ldap_email (v2l_LdapRequest * req, xmlnode data) { const char *tags[] = { V2L_EMAIL_TAGS, NULL }; - return v2l_vcard2ldap_generic (req, data, tags); + return _v2l_vcard2ldap_generic (req, data, tags); } diff --git a/v2l.xml b/v2l.xml new file mode 100644 index 0000000..f0c8bb3 --- /dev/null +++ b/v2l.xml @@ -0,0 +1,20 @@ + + vcard-temp + + + ./vcard2ldap/src/v2l.so + + + + localhost + + dc=nodomain + cn + cn=admin,dc=nodomain + lilo + dc=nodomain + + ./spool + + + diff --git a/vcard2ldap.pws b/vcard2ldap.pws index ac9069b..f0c5764 100644 --- a/vcard2ldap.pws +++ b/vcard2ldap.pws @@ -8,7 +8,7 @@ clean before build=false [filenumbers] 0=10 1=51 -2=28 +2=170 3=358 4=15 5=148 -- 2.11.4.GIT