parent
dbc7ba5ff1
commit
f0062e5d6e
3 changed files with 105 additions and 0 deletions
@ -0,0 +1,97 @@ |
|||||||
|
--- /opt/zimbra/libexec/zmpostfixpolicyd.bak 2019-07-18 21:24:39.000000000 +0200
|
||||||
|
+++ /opt/zimbra/libexec/zmpostfixpolicyd 2020-11-22 17:07:32.387815282 +0100
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
my $syslog_facility="mail";
|
||||||
|
my $syslog_options="pid";
|
||||||
|
our $syslog_priority="info";
|
||||||
|
-our ($verbose, %attr, @ldap_url, $ldap_starttls_supported, $postfix_pw);
|
||||||
|
+our ($verbose, %attr, @ldap_url, $ldap_starttls_supported, $postfix_pw, $zimbra_pw, $delim_re);
|
||||||
|
my ($option, $action, $ldap_url, @val);
|
||||||
|
|
||||||
|
$ENV{'HOME'}='/opt/zimbra';
|
||||||
|
@@ -43,14 +43,17 @@
|
||||||
|
chomp ($ldap_starttls_supported);
|
||||||
|
$postfix_pw = $localxml->{key}->{ldap_postfix_password}->{value};
|
||||||
|
chomp($postfix_pw);
|
||||||
|
+$zimbra_pw = $localxml->{key}->{zimbra_ldap_password}->{value};
|
||||||
|
+chomp($zimbra_pw);
|
||||||
|
$ldap_url = $localxml->{key}->{ldap_url}->{value};
|
||||||
|
chomp($ldap_url);
|
||||||
|
@ldap_url = split / /, $ldap_url;
|
||||||
|
|
||||||
|
sub smtpd_access_policy {
|
||||||
|
- my($domain, $ldap, $mesg, $user, $daddr, @attrs, $result);
|
||||||
|
+ my($domain, $ldap, $mesg, $user, $canon_user, $daddr, @attrs, $result);
|
||||||
|
$daddr = lc $attr{recipient};
|
||||||
|
($user, $domain) = split /\@/, lc $attr{recipient};
|
||||||
|
+ $canon_user = (defined $delim_re) ? (split /$delim_re/, $user)[0] : $user;
|
||||||
|
syslog $syslog_priority, "Recipient Domain: %s", $domain if $verbose;
|
||||||
|
syslog $syslog_priority, "Recipient userid: %s", $user if $verbose;
|
||||||
|
foreach my $url (@ldap_url) {
|
||||||
|
@@ -90,8 +93,9 @@
|
||||||
|
$mesg = $ldap->search_s(
|
||||||
|
"",
|
||||||
|
LDAP_SCOPE_SUBTREE,
|
||||||
|
- "(&(|(zimbraMailDeliveryAddress=$user"."$robject)(zimbraMailDeliveryAddress=$daddr)(zimbraMailAlias=$user".
|
||||||
|
- "$robject)(zimbraMailAlias=$daddr)(zimbraMailCatchAllAddress=$user"."$robject)(zimbraMailCatchAllAddress=$robject)".
|
||||||
|
+ "(&(|(zimbraMailDeliveryAddress=$user"."$robject)(zimbraMailDeliveryAddress=$canon_user"."$robject)".
|
||||||
|
+ "(zimbraMailDeliveryAddress=$daddr)(zimbraMailAlias=$user"."$robject)(zimbraMailAlias=$daddr)".
|
||||||
|
+ "(zimbraMailCatchAllAddress=$user"."$robject)(zimbraMailCatchAllAddress=$robject)".
|
||||||
|
"(zimbraMailCatchAllAddress=$daddr))(zimbraMailStatus=enabled))",
|
||||||
|
\@attrs,
|
||||||
|
0,
|
||||||
|
@@ -140,6 +144,54 @@
|
||||||
|
#
|
||||||
|
select((select(STDOUT), $| = 1)[0]);
|
||||||
|
|
||||||
|
+# Try to get recipient delimiter, if defined
|
||||||
|
+# This will allow checking for valid recipient on alias domains
|
||||||
|
+# even for recipient using delimiter. Eg user+foobar@alias.example.org
|
||||||
|
+# will correctly check if user@example.org is valid
|
||||||
|
+my ($ldap, $mesg, @attrs, $result);
|
||||||
|
+foreach my $url (@ldap_url) {
|
||||||
|
+ $ldap=Net::LDAPapi->new(-url=>$url);
|
||||||
|
+ if ( $ldap_starttls_supported ) {
|
||||||
|
+ $mesg = $ldap->start_tls_s();
|
||||||
|
+ if ($mesg != 0) {
|
||||||
|
+ next;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ $mesg = $ldap->bind_s("uid=zimbra,cn=admins,cn=zimbra",$zimbra_pw);
|
||||||
|
+ if ($mesg != 0) {
|
||||||
|
+ next;
|
||||||
|
+ } else {
|
||||||
|
+ last;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+if ($mesg == 0){
|
||||||
|
+ @attrs=('zimbraMtaRecipientDelimiter');
|
||||||
|
+ $mesg = $ldap->search_s(
|
||||||
|
+ "",
|
||||||
|
+ LDAP_SCOPE_SUBTREE,
|
||||||
|
+ "(&(cn=config)(objectClass=zimbraGlobalConfig))",
|
||||||
|
+ \@attrs,
|
||||||
|
+ 0,
|
||||||
|
+ $result
|
||||||
|
+ );
|
||||||
|
+ my $ent = $ldap->first_entry();
|
||||||
|
+ if ($ent != 0){
|
||||||
|
+ my $delim = ($ldap->get_values('zimbraMtaRecipientDelimiter'))[0];
|
||||||
|
+ if ($delim ne ''){
|
||||||
|
+ $delim_re = qr{[$delim]};
|
||||||
|
+ syslog $syslog_priority, "Recipient delimiter regex is $delim_re" if $verbose;
|
||||||
|
+ } else {
|
||||||
|
+ syslog $syslog_priority, "Recipient delimiter is an empty string so it won't be used" if $verbose;
|
||||||
|
+ }
|
||||||
|
+ } else {
|
||||||
|
+ syslog $syslog_priority, "Recipient delimiter not found" if $verbose;
|
||||||
|
+ }
|
||||||
|
+ # Unbind, everything else will bind with the postfix LDAP user
|
||||||
|
+ $ldap->unbind;
|
||||||
|
+} else {
|
||||||
|
+ syslog $syslog_priority, "Couldn't bind with zimbra account, recipient delimiter won't be used" if $verbose;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#
|
||||||
|
# Receive a bunch of attributes, evaluate the policy, send the result.
|
||||||
|
#
|
Loading…
Reference in new issue