our
@ISA
=
qw()
;
sub
new {
my
$class
=
shift
;
$class
=
ref
(
$class
) ||
$class
;
my
(
$main
) =
@_
;
my
$self
= {
'main'
=>
$main
};
bless
(
$self
,
$class
);
$self
;
}
sub
load_modules {
dbg(
"ldap: loading Net::LDAP and URI"
);
eval
{
};
}
sub
load {
my
(
$self
,
$username
) =
@_
;
my
$conf
=
$self
->{main}->{conf};
my
$url
=
$conf
->{user_scores_dsn};
dbg(
"ldap: URL is $url"
);
if
(!
defined
(
$url
) ||
$url
eq
''
) {
dbg(
"ldap: No URL defined; skipping LDAP"
);
return
;
}
eval
{
local
$SIG
{
'__DIE__'
} =
sub
{
warn
"$_[0]"
; };
load_with_ldap(
$self
,
$username
,
$url
);
1;
} or
do
{
my
$eval_stat
= $@ ne
''
? $@ :
"errno=$!"
;
chomp
$eval_stat
;
if
(
$conf
->{user_scores_fail_to_global}) {
info(
"ldap: failed to load user (%s) scores from LDAP server, "
.
"using a global default: %s"
,
$username
,
$eval_stat
);
return
1;
}
else
{
warn
sprintf
(
"ldap: failed to load user (%s) scores from LDAP server: %s\n"
,
$username
,
$eval_stat
);
return
0;
}
};
}
sub
load_with_ldap {
my
(
$self
,
$username
,
$url
) =
@_
;
my
$uri
= URI->new(
"$url"
);
my
$host
=
$uri
->host;
if
(!
defined
(
$host
) ||
$host
eq
''
) {
dbg(
"ldap: No server specified, assuming localhost"
);
$host
=
"localhost"
;
}
my
$port
=
$uri
->port;
my
$base
=
$uri
->dn;
my
@attr
=
$uri
->attributes;
my
$scope
=
$uri
->scope;
my
$filter
=
$uri
->filter;
my
$scheme
=
$uri
->scheme;
my
%extn
=
$uri
->extensions;
$filter
=~ s/__USERNAME__/
$username
/g;
dbg(
"ldap: host=$host, port=$port, base='$base', attr=${attr[0]}, scope=$scope, filter='$filter'"
);
my
$main
=
$self
->{main};
my
$conf
=
$main
->{conf};
my
$ldapuser
=
$conf
->{user_scores_ldap_username};
my
$ldappass
=
$conf
->{user_scores_ldap_password};
if
(!
$ldapuser
) {
undef
(
$ldapuser
);
}
else
{
dbg(
"ldap: user='$ldapuser'"
);
}
if
(!
$ldappass
) {
undef
(
$ldappass
);
}
else
{
}
my
$f_attribute
=
$attr
[0];
my
$ldap
= Net::LDAP->new (
"$host:$port"
,
onerror
=>
"warn"
,
scheme
=>
$scheme
);
if
(!
defined
(
$ldapuser
) && !
defined
(
$ldappass
)) {
$ldap
->
bind
;
}
else
{
$ldap
->
bind
(
$ldapuser
,
password
=>
$ldappass
);
}
my
$result
=
$ldap
->search(
base
=>
$base
,
filter
=>
$filter
,
scope
=>
$scope
,
attrs
=> \
@attr
);
my
$config_text
=
''
;
foreach
my
$entry
(
$result
->all_entries) {
my
@v
=
$entry
->get_value(
$f_attribute
);
foreach
my
$v
(
@v
) {
dbg(
"ldap: retrieving prefs for $username: $v"
);
$config_text
.=
$v
.
"\n"
;
}
}
if
(
$config_text
ne
''
) {
$conf
->{main} =
$main
;
$config_text
=
"file start (ldap config)\n"
.
$config_text
.
"file end (ldap config)\n"
;
$conf
->parse_scores_only(
$config_text
);
delete
$conf
->{main};
}
return
;
}
sub
sa_die { Mail::SpamAssassin::sa_die(
@_
); }
1;