4 my $vcardtpl = "../ldap/vcard.xml";
5 my $jabberd = "jabber.domain.com";
6 my $groupname = "Iris";
8 my $basedn = "dc=nodomain";
9 my $ldapserver = "localhost";
10 my $disname="cn=admin,dc=nodomain";
11 my $ldappass= "secret";
12 my $ldapperson = "irisPerson";
15 my $db = "Pg"; # Pg : PostgresSQL, mysql: MySQL...
16 my $dbuser = "jabber";
17 my $dbpass = "secret";
18 my $dbname = "jabberd2";
20 ##########################
26 use Net
::LDAP
::Control
;
31 "NICKNAME" => "nickname",
33 "TEL/NUMBER" => "tel",
34 "EMAIL/USERID" => "email",
39 "N/FAMILY" => "n-family",
40 "N/GIVEN" => "n-given",
41 "N/MIDDLE" => "n-middle",
42 "N/PREFIX" => "n-prefix",
43 "N/SUFFIX" => "n-suffix",
44 "ADR/STREET" => "adr-street",
45 "ADR/POBOX" => "adr-pobox",
46 "ADR/EXTADD" => "adr-extadd",
47 "ADR/LOCALITY" => "adr-locality",
48 "ADR/REGION" => "adr-region",
49 "ADR/PCODE" => "adr-pcode",
50 "ADR/CTRY" => "adr-country",
51 "ORG/ORGNAME" => "org-orgname",
52 "ORG/ORGUNIT" => "org-orgunit",
55 "GEO/LAT" => "geo-lat",
56 "GEO/LON" => "geo-lon",
57 "AGENT/EXTVAL" => "agent-extval",
60 "SORT-STRING" => "sort-string",
62 "KEY/TYPE" => "key-type",
63 "KEY/CRED" => "key-cred",
65 "PHOTO/TYPE" => "photo-type",
66 "PHOTO/BINVAL" => "photo-binval",
67 "PHOTO/EXTVAL" => "photo-extval",
69 "LOGO/TYPE" => "logo-type",
70 "LOGO/BINVAL" => "logo-binval",
71 "LOGO/EXTVAL" => "logo-extval",
73 "SOUND/PHONETIC" => "sound-phonetic",
74 "SOUND/BINVAL" => "sound-binval",
75 "SOUND/EXTVAL" => "sound-extval"
78 my (@users, $ldap, $dbh, $vcard2ldap);
79 my $option_populate = 0;
80 my $option_one_user = 0;
84 if ($ARGV[0] eq "-p" || $ARGV[0] eq "--populate") {
86 } elsif ($ARGV[0] =~ /^[a-z\-_\.]+\@$jabberd/){
91 } elsif ($#ARGV > 0) {
97 $vcard2ldap = vcard2ldap_map
();
99 set_all_vcards
($basedn, $ldapgroup);
101 populate_user_roster
($ARGV[0]) if $option_one_user;
102 populate_all_rosters
() if $option_populate;
107 print "usage: jabber2db [-p|--purge]\n";
112 my $searchdn = shift;
113 my $rostergroup = shift;
115 db_delete_vcards
() if $option_populate;
117 # query the user names
118 my $us = $ldap->search(
121 filter
=> "(&(objectClass=$ldapperson)($ldapgroup=*))"
123 die $us->error if $us->code;
125 # fetch the usernames
126 foreach ($us->entries) {
131 sub db_delete_vcards
{
134 $query = "DELETE FROM \"vcard\"";
135 $dbh->do("$query") or die ("Cannot delete vcards!\n");
138 sub db_delete_rosters
{
141 $query = "DELETE FROM \"roster-items\"";
142 $dbh->do("$query") or die ("Cannot delete roster-items!\n");
143 $query = "DELETE FROM \"roster-groups\"";
144 $dbh->do("$query") or die ("Cannot delete roster-groups!\n");
147 sub db_insert_vcard
{
155 my $collection_owner = $pers->get_value("cn"). '@' . $jabberd;
157 $query = "INSERT INTO vcard (\"collection-owner\"";
159 while (my ($key, $value) = each(%$vcard2db)) {
160 if ($vcard2ldap->{$key} && $pers->get_value ($vcard2ldap->{$key})) {
161 $squery = $squery . ", \"". $value . "\"";
162 $ssquery = $ssquery .
163 $dbh->quote ($pers->get_value ($vcard2ldap->{$key})) . ",";
169 $query = $query . $squery . ") VALUES ('$collection_owner', " .
172 $sth = $dbh->prepare($query) or die("Cannot prepare query! ($!)");
173 $sth->execute or die("Cannot execute query! ($!) \n $query");
177 sub db_update_vcard
{
185 my $collection_owner = $pers->get_value("cn"). '@' . $jabberd;
187 $query = "UPDATE vcard SET ";
189 while (my ($key, $value) = each(%$vcard2db)) {
190 if ($vcard2ldap->{$key} && $pers->get_value ($vcard2ldap->{$key})) {
191 $query = $query . "\"". $value . "\" = " .
192 $dbh->quote ($pers->get_value ($vcard2ldap->{$key})) . ",";
198 $query = $query . " WHERE \"collection-owner\" = " .
199 $dbh->quote ($collection_owner);
201 $sth = $dbh->prepare($query) or die ("Cannot prepare query! ($!)");
202 $sth->execute or die ("Cannot execute query! ($!) \n $query");
212 my $collection_owner = $pers->get_value("cn"). '@' . $jabberd;
214 if (!$option_populate) {
215 $query = "SELECT * FROM vcard WHERE \"collection-owner\" = " .
216 $dbh->quote ($collection_owner);
217 $sth = $dbh->prepare($query) or die("Cannot prepare query! ($!)");
218 $sth->execute or die ("Cannot execute query! ($!) \n $query");
219 $is_update = $sth->rows > 0;
224 db_update_vcard
($pers);
226 db_insert_vcard
($pers);
230 "jid" => $collection_owner,
231 "rostergroup" => $pers->get_value ($ldapgroup)
235 sub populate_all_rosters
{
238 db_delete_rosters
();
240 foreach $item (@users) {
241 populate_user_roster
($item->{"jid"})
245 sub populate_user_roster
{
249 foreach $item (@users) {
250 db_add_user_to_roster
(
258 sub db_add_user_to_roster
{
261 my $groupname = shift;
266 $query = "INSERT INTO \"roster-items\" (\"collection-owner\", \"jid\", \"to\", \"from\", \"ask\") VALUES (" .
267 $dbh->quote ($ujid) . "," .
268 $dbh->quote ($rjid) . "," .
271 $sth = $dbh->prepare($query);
272 $sth->execute or die ("Cannot execute query! ($!)");
275 $query = "INSERT INTO \"roster-groups\" (\"collection-owner\", \"jid\", \"group\") VALUES (" .
276 $dbh->quote ($ujid) . "," .
277 $dbh->quote ($rjid) . "," .
278 $dbh->quote ($groupname) . ")";
280 $sth = $dbh->prepare($query);
281 $sth->execute or warn ("Cannot add roster group! ($!)");
286 my $ldap = Net
::LDAP
->new ($ldapserver, debug
=> 0) or die "$@";
287 my $mesg = $ldap->bind (
289 password
=> $ldappass,
290 version
=> 3) or die "Cannot bind to ldap server. $!";
292 die $mesg->error if $mesg->code;
298 return DBI
->connect (
299 "DBI:$db:database=$dbname;host=localhost",
306 my $xs = new XML
::Simple
(keeproot
=> 0, suppressempty
=> 1);
307 my $vcard = $xs->XMLin($vcardtpl);
310 while (my ($key, $value) = each(%$vcard)) {
311 for (split(/\n/, parse_vcard
($key, $value))) {
313 $vcard2ldap->{$_[0]} = $_[1];
325 if (!ref ($value) && !($key eq "xmlns")) {
326 $ret = $ret.$key." ".$value."\n";
327 } elsif (ref ($value) eq "HASH" ) {
328 for my $k2 ( keys %$value ) {
331 } elsif ($k2 eq "content") {
332 $ret = $ret."$key".parse_vcard
('', $value->{$k2});
334 $ret = $ret."$key/".parse_vcard
($k2, $value->{$k2});
337 } elsif (ref ($value) eq "ARRAY") {
339 $ret = $ret."$key".parse_vcard
('', $_);