/usr/local/CPAN/RTx-EmailCompletion/RTx/EmailCompletion/Ldap.pm
package RTx::EmailCompletion::Ldap;
use Net::LDAP;
use Net::LDAP::Constant qw(LDAP_SUCCESS LDAP_PARTIAL_RESULTS);
use Net::LDAP::Util qw (ldap_error_name);
use RT::Users;
sub search_ldap {
my $param = shift;
my $CurrentUser = shift;
return if length($param) < $RT::EmailCompletionLdapMinLength;
# if user isn't privileged and we want only show privileged user, return now
return if not $CurrentUser->Privileged() and $RT::EmailCompletionUnprivileged eq 'privileged';
my $ldap = new Net::LDAP($RT::EmailCompletionLdapServer);
my $mesg = defined $RT::EmailCompletionLdapUser && $RT::EmailCompletionLdapUser ne '' ?
$ldap->bind($RT::EmailCompletionLdapUser, password => $RT::EmailCompletionLdapPass)
: $ldap->bind();
if ($mesg->code != LDAP_SUCCESS) {
$RT::Logger->crit("Unable to bind to $RT::EmailCompletionLdapServer: ", ldap_error_name($mesg->code), "\n");
return;
}
my $filter = "(|" . join('', map { "($_=*$param*)" } @{ $RT::EmailCompletionLdapAttrSearch }) . ")";
$filter = "(&" . $RT::EmailCompletionLdapFilter . $filter . ")" if $RT::EmailCompletionLdapFilter;
$RT::Logger->debug("LDAP filter is: $filter\n") if RTx::EmailCompletion::DEBUG;
$mesg = $ldap->search(base => $RT::EmailCompletionLdapBase,
filter => $filter,
attrs => $RT::EmailCompletionLdapAttrShow);
if ($mesg->code != LDAP_SUCCESS and $mesg->code != LDAP_PARTIAL_RESULTS) {
$RT::Logger->crit("Unable to search in LDAP: ", ldap_error_name($mesg->code), "\n");
}
my @emails = map { $_->get_attribute( $RT::EmailCompletionLdapAttrShow ) } $mesg->entries;
@emails = grep { m/$RT::EmailCompletionUnprivileged/ } @emails
if ref($RT::EmailCompletionUnprivileged) eq 'Regexp' and not $CurrentUser->Privileged();
$mesg = $ldap->unbind();
if ($mesg->code != LDAP_SUCCESS) {
$RT::Logger->crit("Unable to unbind from LDAP:", ldap_error_name($mesg->code), "\n");
return;
}
$RT::Logger->debug("emails returned are: @emails\n") if RTx::EmailCompletion::DEBUG;
sort @emails;
}
1;