Hello list,
I used to patch amavis to use custom ldap attributes. I figured it
would be a better idea in the long run to allow these to be overiden in
the configuration file, and contribute the changes to the project in the
attached patch.
patch feature 1: specify ldap attribute in configuration file
----------------------------------------------------------------
The patch applies to amavisd, and updates RELEASE_NOTES + README.ldap
for usage specifics.
patch feature 2: add map virus_subject_tag2_maps
------------------------------------------------
the patch also exposes $subject_tag_maps_by_ccat{+CC_VIRUS} as new map
virus_subject_tag2_maps for consistency with spam_subject_tag2_maps.
LDAP.schema is updated to match.
RELEASE_NOTES changes:
NEW FEATURES SUMMARY
- LDAP attributes can be overriden from the default amavis schema. Avoids
having to make major changes to an existing LDAP directory if different
attribute names already contain required policy information.
See README.ldap for usage details.
- new map for specifying a subject tag on virus infected messages
virus_subject_tag2_maps. amavisVirusSubjectTag2 attribute added to
LDAP schema. Equivalent to: $subject_tag_maps_by_ccat{+CC_VIRUS}
I have placed a warning in the release notes regarding the original
documentation on specifying different ldap attributes, which hasn't been valid
for a while (amavisd-new
2.4.x or so?):
$virus_lovers_ldap = {res_attr => 'amavisVirusLover'}; # don't do this, no
effect
README.ldap changes:
Using custom LDAP attributes
----------------------------
This readme uses the default amavis attribute names, from the default amavis
LDAP schema. In order to facilitate integrating amavis into
environments where
required policy information is already be stored in a directory, but under
different attribute names, a facility is provided to specify a custom
attribute
name for a given amavis map.
The attributes used for a given map lookup are overriden by setting the
%ldap_attr (single-valued attributes) and %ldap_attr_mv (multi-valued
attributes) hashes in the configuration file.
Again take note that it is not the default attribute name that is specified,
but the amavis map name. (below: spam_tag2_level_maps, not
amavisSpamTag2Level)
examples:
single-valued example, specify in configuration file after enabling ldap.
use "spamThreshold" attribute instead of default "amavisSpamTag2Level":
$ldap_attr_maps{spam_tag2_level_maps} = "spamThreshold";
multi-valued example,
use "senderWhitelist" attribute instead of default "amavisWhitelistSender":
$ldap_attr_maps_mv{whitelist_sender_maps} = "senderWhitelist";
Amavis maps, LDAP attribute field type, default LDAP attribute name
-------------------------------------------------------------------
A helper table of all amavis maps that can be looked up per-use in LDAP,
the attribute field type for these maps, and the default LDAP attribute name
used in the lookup.
attribute field types, from amavis source:
B=boolean, N=numeric, S=string, L=list
B-, N-, S-, L- returns undef if field does not exist
B0: boolean, nonexistent field treated as false,
B1: boolean, nonexistent field treated as true
amavis map, single value default LDAP attribute field type
--------------------------------- ------------------------------- ----------
archive_quarantine_to_maps amavisArchiveQuarantineTo S-
bad_header_admin_maps amavisBadHeaderAdmin S-
bad_header_lovers_maps amavisBadHeaderLover B-
bad_header_quarantine_to_maps amavisBadHeaderQuarantineTo S-
banned_admin_maps amavisBannedAdmin S-
banned_filename_maps amavisBannedRuleNames S-
banned_files_lovers_maps amavisBannedFilesLover B-
banned_quarantine_to_maps amavisBannedQuarantineTo S-
bypass_banned_checks_maps amavisBypassBannedChecks B-
bypass_header_checks_maps amavisBypassHeaderChecks B-
bypass_spam_checks_maps amavisBypassSpamChecks B-
bypass_virus_checks_maps amavisBypassVirusChecks B-
clean_quarantine_to_maps amavisCleanQuarantineTo S-
local_domains_maps amavisLocal B1
message_size_limit_maps amavisMessageSizeLimit N-
newvirus_admin_maps amavisNewVirusAdmin S-
spam_admin_maps amavisSpamAdmin S-
spam_dsn_cutoff_level_maps amavisSpamDsnCutoffLevel N-
spam_kill_level_maps amavisSpamKillLevel N-
spam_lovers_maps amavisSpamLover B-
spam_modifies_subj_maps amavisSpamModifiesSubj B-
spam_quarantine_cutoff_level_maps amavisSpamQuarantineCutoffLevel N-
spam_quarantine_to_maps amavisSpamQuarantineTo S-
spam_subject_tag2_maps amavisSpamSubjectTag2 S-
spam_subject_tag_maps amavisSpamSubjectTag S-
spam_tag2_level_maps amavisSpamTag2Level N-
spam_tag_level_maps amavisSpamTagLevel N-
virus_admin_maps amavisVirusAdmin S-
virus_lovers_maps amavisVirusLover B-
virus_quarantine_to_maps amavisVirusQuarantineTo S-
virus_subject_tag2_maps amavisVirusSubjectTag2 S-
warnbadhrecip_maps amavisWarnBadHeaderRecip B-
warnbannedrecip_maps amavisWarnBannedRecip B-
warnvirusrecip_maps amavisWarnVirusRecip B-
amavis map, multiple values default LDAP attribute field type
--------------------------------- ------------------------------- ----------
blacklist_sender_maps amavisBlacklistSender L-
whitelist_sender_maps amavisWhitelistSender L-
Feedback welcome, of course.
-Martin Foster
martin_fos...@netlog.net
diff -urN amavisd-new-2.6.4.ORIG/amavisd amavisd-new-2.6.4/amavisd
--- amavisd-new-2.6.4.ORIG/amavisd 2009-06-25 22:39:01.000000000 +1000
+++ amavisd-new-2.6.4/amavisd 2010-03-03 12:42:56.000000000 +1100
@@ -219,7 +219,7 @@
fetch_modules('REQUIRED BASIC MODULES', 1, qw(
Exporter POSIX Fcntl Socket Errno Carp Time::HiRes
IO::Handle IO::File IO::Socket IO::Socket::UNIX IO::Socket::INET
- IO::Stringy Digest::MD5 Unix::Syslog File::Basename
+ IO::Stringy Digest::MD5 Unix::Syslog File::Basename Hash::Util
Compress::Zlib MIME::Base64 MIME::QuotedPrint MIME::Words
MIME::Head MIME::Body MIME::Entity MIME::Parser MIME::Decoder
MIME::Decoder::Base64 MIME::Decoder::Binary MIME::Decoder::QuotedPrint
@@ -332,6 +332,7 @@
@bypass_virus_checks_maps @bypass_spam_checks_maps
@bypass_banned_checks_maps @bypass_header_checks_maps
@viruses_that_fake_sender_maps @virus_name_to_spam_score_maps
+ @virus_subject_tag2_maps
@remove_existing_spam_headers_maps
%final_destiny_by_ccat %lovers_maps_by_ccat
@@ -378,7 +379,7 @@
$virus_check_negative_ttl $virus_check_positive_ttl
$spam_check_negative_ttl $spam_check_positive_ttl
$trim_trailing_space_in_lookup_result_fields
- $enable_ldap $default_ldap
+ $enable_ldap $default_ldap %ldap_attr_maps %ldap_attr_maps_mv
@keep_decoded_original_maps @map_full_type_to_short_type_maps
%banned_rules $penpals_threshold_low $penpals_threshold_high
$enable_dkim_verification $enable_dkim_signing
@@ -1481,6 +1482,7 @@
@addr_extension_bad_header_maps = (\$addr_extension_bad_header);
@debug_sender_maps = (\...@debug_sender_acl);
@remove_existing_spam_headers_maps = (\$remove_existing_spam_headers);
+ @virus_subject_tag2_maps = ( '***INFECTED*** ' ); # backwards compatibility
# new variables, no backwards compatibility needed
# @score_sender_maps, @author_to_policy_bank_maps, @signer_reputation_maps,
@@ -1538,7 +1540,7 @@
CC_BADH, sub { c('defang_bad_header') },
);
%subject_tag_maps_by_ccat = (
- CC_VIRUS, [ '***INFECTED*** ' ],
+ CC_VIRUS, sub { ca('virus_subject_tag2_maps') },
CC_BANNED, undef,
CC_UNCHECKED, sub { [ c('undecipherable_subject_tag') ] }, # not by-recip
CC_SPAM, undef,
@@ -1642,6 +1644,51 @@
);
%addr_rewrite_maps_by_ccat = ( );
+ # LDAP attribute default values for maps
+ %ldap_attr_maps = (
+ archive_quarantine_to_maps => 'amavisArchiveQuarantineTo',
+ bad_header_admin_maps => 'amavisBadHeaderAdmin',
+ bad_header_lovers_maps => 'amavisBadHeaderLover',
+ bad_header_quarantine_to_maps => 'amavisBadHeaderQuarantineTo',
+ banned_admin_maps => 'amavisBannedAdmin',
+ banned_filename_maps => 'amavisBannedRuleNames',
+ banned_files_lovers_maps => 'amavisBannedFilesLover',
+ banned_quarantine_to_maps => 'amavisBannedQuarantineTo',
+ bypass_banned_checks_maps => 'amavisBypassBannedChecks',
+ bypass_header_checks_maps => 'amavisBypassHeaderChecks',
+ bypass_spam_checks_maps => 'amavisBypassSpamChecks',
+ bypass_virus_checks_maps => 'amavisBypassVirusChecks',
+ clean_quarantine_to_maps => 'amavisCleanQuarantineTo',
+ local_domains_maps => 'amavisLocal',
+ message_size_limit_maps => 'amavisMessageSizeLimit',
+ newvirus_admin_maps => 'amavisNewVirusAdmin',
+ spam_admin_maps => 'amavisSpamAdmin',
+ spam_dsn_cutoff_level_maps => 'amavisSpamDsnCutoffLevel',
+ spam_kill_level_maps => 'amavisSpamKillLevel',
+ spam_lovers_maps => 'amavisSpamLover',
+ spam_modifies_subj_maps => 'amavisSpamModifiesSubj',
+ spam_quarantine_cutoff_level_maps =>
'amavisSpamQuarantineCutoffLevel',
+ spam_quarantine_to_maps => 'amavisSpamQuarantineTo',
+ spam_subject_tag2_maps => 'amavisSpamSubjectTag2',
+ spam_subject_tag_maps => 'amavisSpamSubjectTag',
+ spam_tag2_level_maps => 'amavisSpamTag2Level',
+ spam_tag_level_maps => 'amavisSpamTagLevel',
+ virus_admin_maps => 'amavisVirusAdmin',
+ virus_lovers_maps => 'amavisVirusLover',
+ virus_subject_tag2_maps => 'amavisVirusSubjectTag2',
+ virus_quarantine_to_maps => 'amavisVirusQuarantineTo',
+ warnbadhrecip_maps => 'amavisWarnBadHeaderRecip',
+ warnbannedrecip_maps => 'amavisWarnBannedRecip',
+ warnvirusrecip_maps => 'amavisWarnVirusRecip',
+ );
+ %ldap_attr_maps_mv = (
+ blacklist_sender_maps => 'amavisBlacklistSender',
+ whitelist_sender_maps => 'amavisWhitelistSender',
+ );
+ # Lock the keys to reduce the chance of a configuration file override error
+ Hash::Util::lock_keys(%ldap_attr_maps);
+ Hash::Util::lock_keys(%ldap_attr_maps_mv);
+
} # end BEGIN - init_tertiary
@@ -1756,6 +1803,7 @@
@spam_dsn_cutoff_level_maps @spam_dsn_cutoff_level_bysender_maps
@spam_quarantine_cutoff_level_maps @spam_notifyadmin_cutoff_level_maps
@spam_subject_tag_maps @spam_subject_tag2_maps @spam_subject_tag3_maps
+ @virus_subject_tag2_maps
@whitelist_sender_maps @blacklist_sender_maps @score_sender_maps
@author_to_policy_bank_maps @signer_reputation_maps
@message_size_limit_maps
@@ -9549,41 +9597,41 @@
# B0: boolean, nonexistent field treated as false,
# B1: boolean, nonexistent field treated as true
my $lf = sub{Amavis::Lookup::LDAPattr->new($ldap_policy,@_)};
- unshift(@Amavis::Conf::virus_lovers_maps,
$lf->('amavisVirusLover', 'B-'));
- unshift(@Amavis::Conf::spam_lovers_maps,
$lf->('amavisSpamLover', 'B-'));
- unshift(@Amavis::Conf::banned_files_lovers_maps,
$lf->('amavisBannedFilesLover', 'B-'));
- unshift(@Amavis::Conf::bad_header_lovers_maps,
$lf->('amavisBadHeaderLover', 'B-'));
- unshift(@Amavis::Conf::bypass_virus_checks_maps,
$lf->('amavisBypassVirusChecks', 'B-'));
- unshift(@Amavis::Conf::bypass_spam_checks_maps,
$lf->('amavisBypassSpamChecks', 'B-'));
-
unshift(@Amavis::Conf::bypass_banned_checks_maps,$lf->('amavisBypassBannedChecks',
'B-'));
-
unshift(@Amavis::Conf::bypass_header_checks_maps,$lf->('amavisBypassHeaderChecks',
'B-'));
- unshift(@Amavis::Conf::spam_tag_level_maps,
$lf->('amavisSpamTagLevel', 'N-'));
- unshift(@Amavis::Conf::spam_tag2_level_maps,
$lf->('amavisSpamTag2Level', 'N-'));
- unshift(@Amavis::Conf::spam_kill_level_maps,
$lf->('amavisSpamKillLevel', 'N-'));
-
unshift(@Amavis::Conf::spam_dsn_cutoff_level_maps,$lf->('amavisSpamDsnCutoffLevel','N-'));
-
unshift(@Amavis::Conf::spam_quarantine_cutoff_level_maps,$lf->('amavisSpamQuarantineCutoffLevel','N-'));
- unshift(@Amavis::Conf::spam_subject_tag_maps,
$lf->('amavisSpamSubjectTag', 'S-'));
- unshift(@Amavis::Conf::spam_subject_tag2_maps,
$lf->('amavisSpamSubjectTag2', 'S-'));
- unshift(@Amavis::Conf::spam_modifies_subj_maps,
$lf->('amavisSpamModifiesSubj', 'B-'));
- unshift(@Amavis::Conf::message_size_limit_maps,
$lf->('amavisMessageSizeLimit', 'N-'));
- unshift(@Amavis::Conf::virus_quarantine_to_maps,
$lf->('amavisVirusQuarantineTo', 'S-'));
- unshift(@Amavis::Conf::banned_quarantine_to_maps,
$lf->('amavisBannedQuarantineTo','S-'));
- unshift(@Amavis::Conf::spam_quarantine_to_maps,
$lf->('amavisSpamQuarantineTo', 'S-'));
- unshift(@Amavis::Conf::bad_header_quarantine_to_maps,
$lf->('amavisBadHeaderQuarantineTo', 'S-'));
- unshift(@Amavis::Conf::clean_quarantine_to_maps,
$lf->('amavisCleanQuarantineTo', 'S-'));
- unshift(@Amavis::Conf::archive_quarantine_to_maps,
$lf->('amavisArchiveQuarantineTo', 'S-'));
- unshift(@Amavis::Conf::local_domains_maps, $lf->('amavisLocal',
'B1'));
- unshift(@Amavis::Conf::warnvirusrecip_maps,
$lf->('amavisWarnVirusRecip', 'B-'));
- unshift(@Amavis::Conf::warnbannedrecip_maps,
$lf->('amavisWarnBannedRecip', 'B-'));
- unshift(@Amavis::Conf::warnbadhrecip_maps,
$lf->('amavisWarnBadHeaderRecip', 'B-'));
- unshift(@Amavis::Conf::virus_admin_maps,
$lf->('amavisVirusAdmin', 'S-'));
- unshift(@Amavis::Conf::newvirus_admin_maps,
$lf->('amavisNewVirusAdmin', 'S-'));
- unshift(@Amavis::Conf::spam_admin_maps,
$lf->('amavisSpamAdmin', 'S-'));
- unshift(@Amavis::Conf::banned_admin_maps,
$lf->('amavisBannedAdmin', 'S-'));
- unshift(@Amavis::Conf::bad_header_admin_maps,
$lf->('amavisBadHeaderAdmin', 'S-'));
- unshift(@Amavis::Conf::banned_filename_maps,
$lf->('amavisBannedRuleNames', 'S-'));
-# unshift(@Amavis::Conf::disclaimer_options_bysender_maps,
-#
$lf->('amavisDisclaimerOptions', 'S-'));
+ unshift(@Amavis::Conf::archive_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{archive_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::bad_header_admin_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bad_header_admin_maps}, 'S-'));
+ unshift(@Amavis::Conf::bad_header_lovers_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bad_header_lovers_maps}, 'B-'));
+ unshift(@Amavis::Conf::bad_header_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bad_header_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::banned_admin_maps,
$lf->($Amavis::Conf::ldap_attr_maps{banned_admin_maps}, 'S-'));
+ unshift(@Amavis::Conf::banned_filename_maps,
$lf->($Amavis::Conf::ldap_attr_maps{banned_filename_maps}, 'S-'));
+ unshift(@Amavis::Conf::banned_files_lovers_maps,
$lf->($Amavis::Conf::ldap_attr_maps{banned_files_lovers_maps}, 'B-'));
+ unshift(@Amavis::Conf::banned_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{banned_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::bypass_banned_checks_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bypass_banned_checks_maps}, 'B-'));
+ unshift(@Amavis::Conf::bypass_header_checks_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bypass_header_checks_maps}, 'B-'));
+ unshift(@Amavis::Conf::bypass_spam_checks_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bypass_spam_checks_maps}, 'B-'));
+ unshift(@Amavis::Conf::bypass_virus_checks_maps,
$lf->($Amavis::Conf::ldap_attr_maps{bypass_virus_checks_maps}, 'B-'));
+ unshift(@Amavis::Conf::clean_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{clean_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::local_domains_maps,
$lf->($Amavis::Conf::ldap_attr_maps{local_domains_maps}, 'B1'));
+ unshift(@Amavis::Conf::message_size_limit_maps,
$lf->($Amavis::Conf::ldap_attr_maps{message_size_limit_maps}, 'N-'));
+ unshift(@Amavis::Conf::newvirus_admin_maps,
$lf->($Amavis::Conf::ldap_attr_maps{newvirus_admin_maps}, 'S-'));
+ unshift(@Amavis::Conf::spam_admin_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_admin_maps}, 'S-'));
+ unshift(@Amavis::Conf::spam_dsn_cutoff_level_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_dsn_cutoff_level_maps}, 'N-'));
+ unshift(@Amavis::Conf::spam_kill_level_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_kill_level_maps}, 'N-'));
+ unshift(@Amavis::Conf::spam_lovers_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_lovers_maps}, 'B-'));
+ unshift(@Amavis::Conf::spam_modifies_subj_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_modifies_subj_maps}, 'B-'));
+ unshift(@Amavis::Conf::spam_quarantine_cutoff_level_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_quarantine_cutoff_level_maps}, 'N-'));
+ unshift(@Amavis::Conf::spam_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::spam_subject_tag2_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_subject_tag2_maps}, 'S-'));
+ unshift(@Amavis::Conf::spam_subject_tag_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_subject_tag_maps}, 'S-'));
+ unshift(@Amavis::Conf::spam_tag2_level_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_tag2_level_maps}, 'N-'));
+ unshift(@Amavis::Conf::spam_tag_level_maps,
$lf->($Amavis::Conf::ldap_attr_maps{spam_tag_level_maps}, 'N-'));
+ unshift(@Amavis::Conf::virus_admin_maps,
$lf->($Amavis::Conf::ldap_attr_maps{virus_admin_maps}, 'S-'));
+ unshift(@Amavis::Conf::virus_lovers_maps,
$lf->($Amavis::Conf::ldap_attr_maps{virus_lovers_maps}, 'B-'));
+ unshift(@Amavis::Conf::virus_quarantine_to_maps,
$lf->($Amavis::Conf::ldap_attr_maps{virus_quarantine_to_maps}, 'S-'));
+ unshift(@Amavis::Conf::virus_subject_tag2_maps,
$lf->($Amavis::Conf::ldap_attr_maps{virus_subject_tag2_maps}, 'S-'));
+ unshift(@Amavis::Conf::warnbadhrecip_maps,
$lf->($Amavis::Conf::ldap_attr_maps{warnbadhrecip_maps}, 'B-'));
+ unshift(@Amavis::Conf::warnbannedrecip_maps,
$lf->($Amavis::Conf::ldap_attr_maps{warnbannedrecip_maps}, 'B-'));
+ unshift(@Amavis::Conf::warnvirusrecip_maps,
$lf->($Amavis::Conf::ldap_attr_maps{warnvirusrecip_maps}, 'B-'));
+# unshift(@Amavis::Conf::disclaimer_options_bysender_maps,
$lf->($Amavis::Conf::ldap_attr_maps{disclaimer_options_bysender_maps}, 'S-'));
section_time('ldap-prepare');
}
if (defined $sql_policy && !$implicit_maps_inserted) {
@@ -15161,7 +15209,7 @@
1;
-#
+#
package Amavis::Lookup::LDAP;
use strict;
use re 'taint';
@@ -15169,7 +15217,7 @@
BEGIN {
require Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION
- $ldap_sys_default @ldap_attrs @mv_ldap_attrs);
+ $ldap_sys_default @ldap_attrs @mv_ldap_attrs $key);
$VERSION = '2.207';
@ISA = qw(Exporter);
import Amavis::Conf qw(:platform :confvars c cr ca);
@@ -15184,23 +15232,22 @@
query_filter => '(&(objectClass=amavisAccount)(mail=%m))',
};
- @ldap_attrs = qw(amavisVirusLover amavisSpamLover amavisBannedFilesLover
- amavisBadHeaderLover amavisBypassVirusChecks amavisBypassSpamChecks
- amavisBypassBannedChecks amavisBypassHeaderChecks amavisSpamTagLevel
- amavisSpamTag2Level amavisSpamKillLevel
- amavisSpamDsnCutoffLevel amavisSpamQuarantineCutoffLevel
- amavisSpamSubjectTag amavisSpamSubjectTag2 amavisSpamModifiesSubj
- amavisVirusQuarantineTo amavisSpamQuarantineTo amavisBannedQuarantineTo
- amavisBadHeaderQuarantineTo amavisArchiveQuarantineTo
- amavisBlacklistSender amavisWhitelistSender
- amavisLocal amavisMessageSizeLimit amavisWarnVirusRecip
- amavisWarnBannedRecip amavisWarnBadHeaderRecip amavisVirusAdmin
- amavisNewVirusAdmin amavisSpamAdmin amavisBannedAdmin
- amavisBadHeaderAdmin amavisBannedRuleNames
- );
-# amavisDisclaimerOptions
+ # single valued LDAP attribute, all future comparisons done lc()
+ @ldap_attrs = ();
+ foreach $key (sort keys %Amavis::Conf::ldap_attr_maps) {
+ $Amavis::Conf::ldap_attr_maps{$key} =
lc($Amavis::Conf::ldap_attr_maps{$key});
+ push(@ldap_attrs, $Amavis::Conf::ldap_attr_maps{$key});
+ }
- @mv_ldap_attrs = qw(amavisBlacklistSender amavisWhitelistSender);
+ # multi valued LDAP attributes, all future comparsions done lc()
+ # - separate array for MV attributes to quickly establish MV or SV
+ # - MV attrs need to be added to master list of attributes, ldap_attrs
+ @mv_ldap_attrs = ();
+ foreach $key (sort keys %Amavis::Conf::ldap_attr_maps_mv) {
+ $Amavis::Conf::ldap_attr_maps_mv{$key} =
lc($Amavis::Conf::ldap_attr_maps_mv{$key});
+ push(@mv_ldap_attrs, $Amavis::Conf::ldap_attr_maps_mv{$key});
+ push(@ldap_attrs, $Amavis::Conf::ldap_attr_maps_mv{$key});
+ }
}
sub new {
@@ -15311,11 +15358,12 @@
$match->{dn} = $entry->dn;
for my $attr (@ldap_attrs) {
my($value);
- do_log(9,'lookup_ldap: reading attribute "%s" from object', $attr);
$attr = lc($attr);
if ($mv_ldap_attrs{$attr}) { # multivalued
+ do_log(9,'lookup_ldap: reading multi-valued attribute "%s" from
object', $attr);
$value = $entry->get_value($attr, asref => 1);
} else {
+ do_log(9,'lookup_ldap: reading singlevalued attribute "%s" from
object', $attr);
$value = $entry->get_value($attr);
}
$match->{$attr} = $value if defined $value;
@@ -21234,7 +21282,7 @@
do_log(5,'wbl: (LDAP) query keys: %s', join(',
',map{"\"$_\""}...@keys));
$wblist = lookup(0,$recip,Amavis::Lookup::LDAPattr->new(
- $ldap_policy,'amavisBlacklistSender','L-'));
+
$ldap_policy,$Amavis::Conf::ldap_attr_maps_mv{blacklist_sender_maps},'L-'));
for my $key (@keys) {
if (grep {lc($_) eq lc($key)} @$wblist) {
$found=1; $wb = -1; $br = $recip; $any_b++;
@@ -21244,7 +21292,7 @@
}
}
$wblist = lookup(0,$recip,Amavis::Lookup::LDAPattr->new(
- $ldap_policy,'amavisWhitelistSender','L-'));
+
$ldap_policy,$Amavis::Conf::ldap_attr_maps_mv{whitelist_sender_maps},'L-'));
for my $key (@keys) {
if (grep {lc($_) eq lc($key)} @$wblist) {
$found=1; $wb = +1; $wr = $recip; $any_w++;
diff -urN amavisd-new-2.6.4.ORIG/LDAP.schema amavisd-new-2.6.4/LDAP.schema
--- amavisd-new-2.6.4.ORIG/LDAP.schema 2008-10-11 04:29:02.000000000 +1100
+++ amavisd-new-2.6.4/LDAP.schema 2010-03-03 16:11:46.000000000 +1100
@@ -388,6 +388,17 @@
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
SINGLE-VALUE )
+#dn: cn=schema
+#changetype: modify
+#add: attributetypes
+attributetype ( 1.3.6.1.4.1.15312.2.2.1.35
+ NAME 'amavisVirusSubjectTag2'
+ DESC 'Virus Subject Tag2'
+ EQUALITY caseExactIA5Match
+ SUBSTR caseExactSubstringsMatch
+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256}
+ SINGLE-VALUE )
+
# Classes
#---------
@@ -419,7 +430,7 @@
amavisSpamAdmin $ amavisBannedAdmin $ amavisBadHeaderAdmin $
amavisBannedRuleNames $
amavisSpamDsnCutoffLevel $ amavisSpamQuarantineCutoffLevel $
- amavisSpamSubjectTag $ amavisSpamSubjectTag2 $
+ amavisSpamSubjectTag $ amavisSpamSubjectTag2 $ amavisVirusSubjectTag2 $
cn $ description ) )
#--------------------------------------------------------------------------
diff -urN amavisd-new-2.6.4.ORIG/README_FILES/README.ldap
amavisd-new-2.6.4/README_FILES/README.ldap
--- amavisd-new-2.6.4.ORIG/README_FILES/README.ldap 2006-01-27
11:46:18.000000000 +1100
+++ amavisd-new-2.6.4/README_FILES/README.ldap 2010-03-03 15:55:03.000000000
+1100
@@ -149,3 +149,88 @@
In general LDAP lookups are similar to SQL lookups except for the low level
LDAP/SQL specific code. The overall functionality, lookup rules, etc. are
identical.
+
+Using custom LDAP attributes
+----------------------------
+
+This readme uses the default amavis attribute names, from the default amavis
+LDAP schema. In order to facilitate integrating amavis into environments where
+required policy information is already be stored in a directory, but under
+different attribute names, a facility is provided to specify a custom attribute
+name for a given amavis map.
+
+The attributes used for a given map lookup are overriden by setting the
+%ldap_attr (single-valued attributes) and %ldap_attr_mv (multi-valued
+attributes) hashes in the configuration file.
+
+Again take note that it is not the default attribute name that is specified,
+but the amavis map name. (below: spam_tag2_level_maps, not amavisSpamTag2Level)
+
+examples:
+
+single-valued example, specify in configuration file after enabling ldap.
+use "spamThreshold" attribute instead of default "amavisSpamTag2Level":
+
+ $ldap_attr_maps{spam_tag2_level_maps} = "spamThreshold";
+
+multi-valued example,
+use "senderWhitelist" attribute instead of default "amavisWhitelistSender":
+
+ $ldap_attr_maps_mv{whitelist_sender_maps} = "senderWhitelist";
+
+Amavis maps, LDAP attribute field type, default LDAP attribute name
+-------------------------------------------------------------------
+
+A helper table of all amavis maps that can be looked up per-use in LDAP,
+the attribute field type for these maps, and the default LDAP attribute name
+used in the lookup.
+
+attribute field types, from amavis source:
+
+B=boolean, N=numeric, S=string, L=list
+B-, N-, S-, L- returns undef if field does not exist
+B0: boolean, nonexistent field treated as false,
+B1: boolean, nonexistent field treated as true
+
+amavis map, single value default LDAP attribute field type
+--------------------------------- ------------------------------- ----------
+archive_quarantine_to_maps amavisArchiveQuarantineTo S-
+bad_header_admin_maps amavisBadHeaderAdmin S-
+bad_header_lovers_maps amavisBadHeaderLover B-
+bad_header_quarantine_to_maps amavisBadHeaderQuarantineTo S-
+banned_admin_maps amavisBannedAdmin S-
+banned_filename_maps amavisBannedRuleNames S-
+banned_files_lovers_maps amavisBannedFilesLover B-
+banned_quarantine_to_maps amavisBannedQuarantineTo S-
+bypass_banned_checks_maps amavisBypassBannedChecks B-
+bypass_header_checks_maps amavisBypassHeaderChecks B-
+bypass_spam_checks_maps amavisBypassSpamChecks B-
+bypass_virus_checks_maps amavisBypassVirusChecks B-
+clean_quarantine_to_maps amavisCleanQuarantineTo S-
+local_domains_maps amavisLocal B1
+message_size_limit_maps amavisMessageSizeLimit N-
+newvirus_admin_maps amavisNewVirusAdmin S-
+spam_admin_maps amavisSpamAdmin S-
+spam_dsn_cutoff_level_maps amavisSpamDsnCutoffLevel N-
+spam_kill_level_maps amavisSpamKillLevel N-
+spam_lovers_maps amavisSpamLover B-
+spam_modifies_subj_maps amavisSpamModifiesSubj B-
+spam_quarantine_cutoff_level_maps amavisSpamQuarantineCutoffLevel N-
+spam_quarantine_to_maps amavisSpamQuarantineTo S-
+spam_subject_tag2_maps amavisSpamSubjectTag2 S-
+spam_subject_tag_maps amavisSpamSubjectTag S-
+spam_tag2_level_maps amavisSpamTag2Level N-
+spam_tag_level_maps amavisSpamTagLevel N-
+virus_admin_maps amavisVirusAdmin S-
+virus_lovers_maps amavisVirusLover B-
+virus_quarantine_to_maps amavisVirusQuarantineTo S-
+virus_subject_tag2_maps amavisVirusSubjectTag2 S-
+warnbadhrecip_maps amavisWarnBadHeaderRecip B-
+warnbannedrecip_maps amavisWarnBannedRecip B-
+warnvirusrecip_maps amavisWarnVirusRecip B-
+
+amavis map, multiple values default LDAP attribute field type
+--------------------------------- ------------------------------- ----------
+blacklist_sender_maps amavisBlacklistSender L-
+whitelist_sender_maps amavisWhitelistSender L-
+
diff -urN amavisd-new-2.6.4.ORIG/RELEASE_NOTES amavisd-new-2.6.4/RELEASE_NOTES
--- amavisd-new-2.6.4.ORIG/RELEASE_NOTES 2009-06-26 03:56:55.000000000
+1000
+++ amavisd-new-2.6.4/RELEASE_NOTES 2010-03-03 16:14:26.000000000 +1100
@@ -1,4 +1,17 @@
---------------------------------------------------------------------------
+amavisd-new-2.6.X release notes
+
+NEW FEATURES SUMMARY
+
+- LDAP attributes can be overriden from the default amavis schema. Avoids
+ having to make major changes to an existing LDAP directory if different
+ attribute names already contain required policy information.
+ See README.ldap for usage details.
+- new map for specifying a subject tag on virus infected messages
+ virus_subject_tag2_maps. amavisVirusSubjectTag2 attribute added to
+ LDAP schema. Equivalent to: $subject_tag_maps_by_ccat{+CC_VIRUS}
+
+---------------------------------------------------------------------------
June 25, 2009
amavisd-new-2.6.4 release notes
@@ -10281,6 +10294,9 @@
| query_filter => '(&(objectClass=amavisAccount)(mail=%m))'
| };
+ WARNING: the information below relating to overriding LDAP attributes
+ is no longer valid, see README.ldap for the new form.
+
And then the lookups themselves:
| $virus_lovers_ldap = {res_attr => 'amavisVirusLover'};
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
AMaViS-user mailing list
AMaViS-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/amavis-user
AMaViS-FAQ:http://www.amavis.org/amavis-faq.php3
AMaViS-HowTos:http://www.amavis.org/howto/