Script for populate rosters. Bug fixed (xmlfile works now in jabberd2)
[vcard2ldap.git] / src / v2l_main.c
blob50edcf09785d54d4781bd3f0d509f651cc1c0bad
1 /*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <jabberd.h>
20 #include <v2l_config.h>
21 #include <v2l_conn.h>
22 #include <v2l_vcard.h>
24 #define LOG_ERROR_MEM log_error(ZONE, "Unable to allocate memory")
26 static result _v2l_packets_handler (instance i, dpacket p, void *args);
27 static short _v2l_check_attr_value (xmlnode node, char *attr_name,
28 char *attr_value);
29 static void _v2l_shutdown (void *arg);
32 * xdb_v2l (), module entry point.
34 #ifdef __cplusplus
35 extern "C"
36 #endif
37 void xdb_v2l (instance i, xmlnode x)
39 xdbcache xc = NULL; /* for config request */
40 v2l_Config *self = NULL;
42 log_debug (ZONE, "Loading xdb_v2l");
44 self = (v2l_Config *) pmalloco (i->p, sizeof (*self));
46 if (self == NULL)
48 return;
51 self->poolref = i->p;
53 /* Load config from xdb */
54 xc = xdb_cache (i);
55 self->config = xdb_get (xc, jid_new (xmlnode_pool (x), "config@-internal"),
56 "jabberd:xdb_v2l:config");
58 /* Parse config */
59 if (!v2l_config_init (self, self->config))
61 /* do no try to go on with a badly configured ldap component */
62 exit (1);
65 register_phandler (i, o_DELIVER, _v2l_packets_handler, (void *) self);
66 register_shutdown (_v2l_shutdown, (void *) self);
68 log_debug (ZONE, "xdb_v2l has been successfully initialized");
71 static void
72 _v2l_shutdown (void *arg)
74 v2l_config_shutdown ((v2l_Config *) arg);
78 * Main callback. Handle xdb packets
80 static result
81 _v2l_packets_handler (instance i, dpacket p, void *args)
83 v2l_Config *self = (v2l_Config *) args;
84 v2l_LdapConn *user_conn;
85 dpacket dp;
87 if ((p == NULL) || (p->x == NULL) || (p->id == NULL))
89 log_error (ZONE, "malformed xdb packet");
90 return r_ERR;
93 if (_v2l_check_attr_value (p->x, "type", "error"))
95 xmlnode_free (p->x);
96 log_warn (ZONE, "xdb_v2l received an error packet");
97 return r_DONE;
100 if (!_v2l_check_attr_value (p->x, "ns", NS_VCARD))
102 log_warn (ZONE,
103 "xdb_v2l received a packet for other namespace than NS_VCARD");
104 return r_PASS;
107 user_conn = v2l_get_conn (self, p->id->user);
109 if (user_conn == NULL)
111 log_error (ZONE, "Unable to create connection for \"%s\" user",
112 p->id->user);
113 return r_ERR;
116 if (_v2l_check_attr_value (p->x, "type", "set"))
118 xmlnode child = xmlnode_get_firstchild (p->x);
120 if (v2l_vcard_set (self, user_conn, child) != 1)
122 return r_ERR;
125 else
127 xmlnode data = v2l_vcard_get (self, user_conn);
129 if (data)
131 xmlnode_insert_tag_node (p->x, data);
132 xmlnode_free (data);
136 /* making XML reply */
137 xmlnode_put_attrib (p->x, "type", "result");
138 xmlnode_put_attrib (p->x, "to", xmlnode_get_attrib (p->x, "from"));
139 xmlnode_put_attrib (p->x, "from", jid_full (p->id));
141 dp = dpacket_new (p->x);
143 if (dp == NULL)
145 LOG_ERROR_MEM;
146 return r_ERR;
149 deliver (dp, NULL);
151 return r_DONE;
154 static short
155 _v2l_check_attr_value (xmlnode node, char *attr_name, char *value)
157 if ((node == NULL) || (attr_name == NULL) || (value == NULL))
159 log_debug (ZONE, "_v2l_check_attr_value() parameters are not valid");
160 return 0;
163 return strncmp (xmlnode_get_attrib (node, attr_name), value,
164 sizeof (char) * strlen (value)) == 0;