Mail-MtPolicyd
view release on metacpan or search on metacpan
lib/Mail/MtPolicyd/Plugin/LdapUserConfig.pm view on Meta::CPAN
package Mail::MtPolicyd::Plugin::LdapUserConfig;
use Moose;
use namespace::autoclean;
our $VERSION = '2.05'; # VERSION
# ABSTRACT: mtpolicyd plugin for retrieving per user configuration from LDAP
extends 'Mail::MtPolicyd::Plugin';
use Mail::MtPolicyd::Plugin::Result;
use Net::LDAP::Util qw( escape_filter_value );
has 'basedn' => ( is => 'rw', isa => 'Str', default => '' );
has 'filter' => ( is => 'rw', isa => 'Str', required => 1 );
with 'Mail::MtPolicyd::Plugin::Role::ConfigurableFields' => {
'fields' => {
'filter' => {
isa => 'Str',
default => 'sasl_username',
value_isa => 'Str',
},
},
};
has 'config_fields' => ( is => 'rw', isa => 'Str', required => 1 );
has '_config_fields' => (
is => 'ro', isa => 'ArrayRef[Str]', lazy => 1,
default => sub {
my $self = shift;
return [ split(/\s*,\s*/, $self->config_fields ) ];
},
);
has 'connection' => ( is => 'ro', isa => 'Str', default => 'ldap' );
has 'connection_type' => ( is => 'ro', isa => 'Str', default => 'Ldap' );
with 'Mail::MtPolicyd::Role::Connection' => {
name => 'ldap',
type => 'Ldap',
};
sub retrieve_ldap_entry {
my ( $self, $r ) = @_;
my $ldap = $self->_ldap_handle;
my $value = $self->get_filter_value( $r );
if( ! defined $value ) {
$self->log( $r, 'filter_field('.$self->filter_field.') is not defined in request. skipping ldap search.');
return;
}
my $filter = $self->filter;
my $filter_value = escape_filter_value($value);
$filter =~ s/%s/$filter_value/g;
$self->log( $r, 'ldap filter is: '.$filter);
my $msg;
eval {
$msg = $ldap->search(
base => $self->basedn,
filter => $filter,
);
};
if( $@ ) {
$self->log( $r, 'ldap search failed: '.$@ );
return;
}
if( $msg->count != 1 ) {
$self->log( $r, 'ldap search return '.$msg->count.' entries' );
return;
}
my $entry = $msg->entry( 0 );
$self->log( $r, 'found in ldap: '.$entry->dn );
return $entry;
}
sub run {
my ( $self, $r ) = @_;
my $entry = $self->retrieve_ldap_entry( $r );
if( defined $entry ) {
foreach my $field ( @{$self->_config_fields} ) {
my ($value) = $entry->get_value( $field );
if( defined $value && $value ne '' ) {
$self->log( $r, 'retrieved ldap attribute: '.$field.'='.$value );
$r->session->{$field} = $value;
( run in 0.633 second using v1.01-cache-2.11-cpan-f56aa216473 )