diff options
Diffstat (limited to 'lib/DJabberd/Plugin/VCard')
| -rw-r--r-- | lib/DJabberd/Plugin/VCard/LDAP.pm | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/lib/DJabberd/Plugin/VCard/LDAP.pm b/lib/DJabberd/Plugin/VCard/LDAP.pm index 4606ea4..63a2a6a 100644 --- a/lib/DJabberd/Plugin/VCard/LDAP.pm +++ b/lib/DJabberd/Plugin/VCard/LDAP.pm | |||
| @@ -15,11 +15,11 @@ DJabberd::VCard::LDAP - LDAP VCard Provider for DJabberd | |||
| 15 | 15 | ||
| 16 | =head1 VERSION | 16 | =head1 VERSION |
| 17 | 17 | ||
| 18 | Version 0.01 | 18 | Version 0.02 |
| 19 | 19 | ||
| 20 | =cut | 20 | =cut |
| 21 | 21 | ||
| 22 | our $VERSION = '0.01'; | 22 | our $VERSION = '0.02'; |
| 23 | 23 | ||
| 24 | =head1 SYNOPSIS | 24 | =head1 SYNOPSIS |
| 25 | 25 | ||
| @@ -38,7 +38,9 @@ Provides an LDAP VCard backend for DJabberd | |||
| 38 | LDAPURI , LDAPBaseDN, and LDAPFilter are required | 38 | LDAPURI , LDAPBaseDN, and LDAPFilter are required |
| 39 | Everything else is optional. | 39 | Everything else is optional. |
| 40 | 40 | ||
| 41 | LDAPFilter is an LDAP filter with a %u that will be substituted with the incoming userid (w/o the domain) | 41 | LDAPFilter is an LDAP filter substutions |
| 42 | - %u will be substituted with the incoming userid (w/o the domain) (ie. myuser) | ||
| 43 | - %d will be substituted with the incoming userid's domain (ie. mydoman.com) | ||
| 42 | 44 | ||
| 43 | =cut | 45 | =cut |
| 44 | 46 | ||
| @@ -98,34 +100,62 @@ sub _isdef { | |||
| 98 | sub load_vcard { | 100 | sub load_vcard { |
| 99 | my ($self, $user) = @_; | 101 | my ($self, $user) = @_; |
| 100 | 102 | ||
| 101 | my $suser = $user; | 103 | $user =~ /^(.+)\@(.+)$/; |
| 102 | $suser =~ s/^(.*)\@.*$/$1/; | 104 | my ($userid,$domain) = ($1, $2); |
| 103 | 105 | ||
| 104 | my $filter = $self->{'ldap_filter'}; | 106 | my $filter = $self->{'ldap_filter'}; |
| 105 | $filter =~ s/%u/$suser/; | 107 | $filter =~ s/%u/$userid/; |
| 108 | $filter =~ s/%d/$domain/; | ||
| 106 | $logger->info("Searching $filter on ".$self->{'ldap_basedn'}); | 109 | $logger->info("Searching $filter on ".$self->{'ldap_basedn'}); |
| 107 | my $srch = $self->{'ldap_conn'}->search( | 110 | my $srch = $self->{'ldap_conn'}->search( |
| 108 | base=>$self->{'ldap_basedn'}, | 111 | base=>$self->{'ldap_basedn'}, |
| 109 | filter=>$filter, | 112 | filter=>$filter, |
| 110 | attrs=>['dn','sn','cn','givenName','mail','telephoneNumber','title','description','displayName']); | 113 | attrs=>['dn','sn','cn','givenName','mail','telephoneNumber','title','description','displayName', |
| 114 | 'mobile','company','department','wWWHomePage','homePhone','facsimileTelephoneNumber','pager', | ||
| 115 | 'streetAddress','co','postalCode','postOfficeBox','st','l','jpegPhoto']); | ||
| 111 | if ($srch->code || $srch->count < 1) { | 116 | if ($srch->code || $srch->count < 1) { |
| 112 | $logger->info("Account $user not found."); | 117 | $logger->info("Account $user not found."); |
| 113 | return; | 118 | return; |
| 114 | } else { | 119 | } else { |
| 115 | my $entry = $srch->entry(0); | 120 | my $entry = $srch->entry(0); |
| 121 | my $photo = $entry->get_value('jpegPhoto'); | ||
| 122 | if (defined $photo) { | ||
| 123 | $photo = '<PHOTO><BINVAL>'.$photo.'</BINVAL></PHOTO>'; | ||
| 124 | } else { | ||
| 125 | $photo = ''; | ||
| 126 | } | ||
| 116 | my $vCard = '<vCard xmlns="vcard-temp" version="3.0">' | 127 | my $vCard = '<vCard xmlns="vcard-temp" version="3.0">' |
| 117 | .'<FN>'._isdef($entry->get_value('cn')).'</FN>' | 128 | .'<FN>'._isdef($entry->get_value('cn')).'</FN>' |
| 118 | .'<N>' | 129 | .'<N>' |
| 119 | .'<FAMILY>'._isdef($entry->get_value('sn')).'</FAMILY>' | 130 | .'<FAMILY>'._isdef($entry->get_value('sn')).'</FAMILY>' |
| 120 | .'<GIVEN>'._isdef($entry->get_value('givenName')).'</GIVEN>' | 131 | .'<GIVEN>'._isdef($entry->get_value('givenName')).'</GIVEN>' |
| 121 | .'</N>' | 132 | .'</N>' |
| 122 | .'<TITLE>'._isdef($entry->get_value('title')).'</TITLE>' | ||
| 123 | .'<NICKNAME>'._isdef($entry->get_value('displayName')).'</NICKNAME>' | 133 | .'<NICKNAME>'._isdef($entry->get_value('displayName')).'</NICKNAME>' |
| 124 | .'<TEL><HOME/><VOICE/><NUMBER>'._isdef($entry->get_value('telephoneNumber')).'</NUMBER></TEL>' | 134 | .'<ORG>' |
| 135 | .'<ORGNAME>'._isdef($entry->get_value('company')).'</ORGNAME>' | ||
| 136 | .'<ORGUNIT>'._isdef($entry->get_value('department')).'</ORGUNIT>' | ||
| 137 | .'</ORG>' | ||
| 138 | .'<TITLE>'._isdef($entry->get_value('title')).'</TITLE>' | ||
| 139 | .'<TEL><HOME/><VOICE/><NUMBER>'._isdef($entry->get_value('homePhone')).'</NUMBER></TEL>' | ||
| 140 | .'<TEL><WORK/><VOICE/><NUMBER>'._isdef($entry->get_value('telephoneNumber')).'</NUMBER></TEL>' | ||
| 141 | .'<TEL><WORK/><FAX/><NUMBER>'._isdef($entry->get_value('facsimileTelephoneNumber')).'</NUMBER></TEL>' | ||
| 142 | .'<TEL><WORK/><MSG/><NUMBER>'._isdef($entry->get_value('pager')).'</NUMBER></TEL>' | ||
| 143 | .'<TEL><HOME/><CELL/><NUMBER>'._isdef($entry->get_value('mobile')).'</NUMBER></TEL>' | ||
| 125 | .'<EMAIL><INTERNET/><PREF/><USERID>'._isdef($entry->get_value('mail')).'</USERID></EMAIL>' | 144 | .'<EMAIL><INTERNET/><PREF/><USERID>'._isdef($entry->get_value('mail')).'</USERID></EMAIL>' |
| 145 | .'<ADR>' | ||
| 146 | .'<HOME/>' | ||
| 147 | .'<EXTADDR/>' | ||
| 148 | .'<STREET>'._isdef($entry->get_value('streetAddress')).'</STREET>' | ||
| 149 | .'<LOCALITY>'._isdef($entry->get_value('l')).'</LOCALITY>' | ||
| 150 | .'<REGION>'._isdef($entry->get_value('st')).'</REGION>' | ||
| 151 | .'<PCODE>'._isdef($entry->get_value('postalCode')).'</PCODE>' | ||
| 152 | .'<CTRY>'._isdef($entry->get_value('co')).'</CTRY>' | ||
| 153 | .'</ADR>' | ||
| 126 | .'<JABBERID>'.$user.'</JABBERID>' | 154 | .'<JABBERID>'.$user.'</JABBERID>' |
| 155 | .$photo | ||
| 127 | .'<DESC>'._isdef($entry->get_value('description')).'</DESC>' | 156 | .'<DESC>'._isdef($entry->get_value('description')).'</DESC>' |
| 128 | .'</vCard>'; | 157 | .'</vCard>'; |
| 158 | $logger->info($vCard); | ||
| 129 | undef($entry); | 159 | undef($entry); |
| 130 | undef($srch); | 160 | undef($srch); |
| 131 | return $vCard; | 161 | return $vCard; |
