#!/bin/env perluse strict;
#use warnings;
use Net::LDAP;
sub _log
{
my $msg=shift;
my $now_string=localtime;
print LOG $now_string." : ".$msg."\n";
}
my @ldap_hosts=("dc.contoso.com"); # Хосты к которым подключаться
my $binddn='user@contoso.com'; # Пользователь которым будем подключаться
my $bindpw='password'; # Пароль
my $basedn='dc=contoso,dc=com'; # Поиск по каталогу
my $user=$ENV{'USER'}; # Какого пользователя будем искать
my $log_file="/tmp/dovecot.postlogin-script.log";
my ($day ,$month, $year) = (localtime)[3,4,5];
$month++;
$year += 1900;
my $date = "$year-$month-$day";
open(LOG, ">>", $log_file."-".$date) or exit 1;
_log "user = $user";
if (! @ARGV){
_log "\texit with ARGV is null";
exit 1;
}
if(!$user or $user eq ""){
_log "\tUser not set\n";
exit 1;
}
# Фильтр для поиска
my $searchFilter='(&(objectClass=user)(mail=*)(sAMAccountName='.$user.')(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
my $searchAttrs=['memberOf', 'primaryGroupId']; # Какие атрибуты возвращать
my @groups; # Здесь будем сохранять имена групп
# Подключемся и выполняем запрос
my $ldap=Net::LDAP->new(\@ldap_hosts, port=>3268, async=>1) or die("Cannot connect to ldap server: $@");
my $mesg=$ldap->bind($binddn,password=>$bindpw);
my $searchResult=$ldap->search(base=>$basedn, scope=>"sub",filter=>$searchFilter, attrs=>$searchAttrs);
my $data=$searchResult->as_struct;
# Для каждого возвращенного элемента получаем атрибуты (при запросе как указан выше всегда должен быть только один результат)
foreach my $dn (keys %$data){
foreach my $attrname (keys %{$data->{$dn}}){
if($attrname eq "memberof"){
foreach my $group_dn (@{$data->{$dn}{$attrname}}){
$group_dn=~s/([^=]*)=([^,]*).*/$2/;
push @groups, $group_dn;
}
}
if($attrname eq "primarygroupid"){
my $searchGroup=$ldap->search(base=>$basedn, scope=>"sub", filter=>'(objectClass=group)', attrs=> ['primarygrouptoken']);
my $g_data=$searchGroup->as_struct;
foreach my $group_dn (keys %$g_data){
next if(!defined(@{$g_data->{$group_dn}{'primarygrouptoken'}}));
if(@{$g_data->{$group_dn}{'primarygrouptoken'}}[0] eq @{$data->{$dn}{$attrname}}[0]){
$group_dn =~ s/([^=]*)=([^,]*).*/$2/;
push @groups, $group_dn;
last;
}
}
}
}
}
$ldap->unbind();
foreach my $g (@groups){
_log "\t\t$g";
}
my $env_group = join ",",@groups;
$ENV{'ACL_GROUPS'} = $env_group;
if(!defined($ENV{'USERDB_KEYS'} or !$ENV{'USERDB_KEYS'})){
$ENV{'USERDB_KEYS'}="acl_groups";
}else{
$ENV{'USERDB_KEYS'}=$ENV{'USERDB_KEYS'}." acl_groups";
}
_log "\t\t$ENV{'ACL_GROUPS'}";
_log "\t\t$ENV{'USERDB_KEYS'}";
close LOG;
exec(@ARGV) or die "Unable to exec @ARGV: $!";