Author: gbechis
Date: Wed Jan 14 14:22:35 2026
New Revision: 1931315
Log:
add support for 4tld domains in order to be able to query S3 endpoints in RBLs
Modified:
spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
spamassassin/trunk/lib/Mail/SpamAssassin/RegistryBoundaries.pm
spamassassin/trunk/rules/20_aux_tlds.cf
spamassassin/trunk/t/cross_user_config_leak.t
spamassassin/trunk/t/uri.t
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Wed Jan 14 13:36:52 2026 (r1931314)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Wed Jan 14 14:22:35 2026 (r1931315)
@@ -3941,6 +3941,32 @@ Unicode labels encoded as UTF-8 octets.
}
});
+=item util_rb_4tld 4tld1.some.other.tld 4tld2.another.other.tld ...
+
+This option maintains list of valid 4th-level TLDs in the RegistryBoundaries
+code. 4TLDs can include things like domain.s3.us-east-2.amazonaws.com, etc. International
+domain names may be specified in ASCII-compatible encoding (ACE), or with
+Unicode labels encoded as UTF-8 octets.
+
+=cut
+
+ push (@cmds, {
+ setting => 'util_rb_4tld',
+ is_admin => 1,
+ code => sub {
+ my ($self, $key, $value, $line) = @_;
+ unless (defined $value && $value !~ /^$/) {
+ return $MISSING_REQUIRED_VALUE;
+ }
+ unless ($value =~ /^[^\s.]+\.[^\s.]+\.[^\s.]+\.[^\s.]+(?:\s+[^\s.]+\.[^\s.]+\.[^\s.]+\.[^\s.]+)*$/) {
+ return $INVALID_VALUE;
+ }
+ foreach (split(/\s+/, $value)) {
+ $self->{four_level_domains}{idn_to_ascii($_)} = 1;
+ }
+ }
+ });
+
=item clear_util_rb
Empty internal list of valid TLDs (including 2nd and 3rd level) which
@@ -3960,6 +3986,7 @@ standard lists supplied by sa-update.
undef $self->{valid_tlds};
undef $self->{two_level_domains};
undef $self->{three_level_domains};
+ undef $self->{four_level_domains};
dbg("config: cleared tld lists");
}
});
@@ -5611,6 +5638,7 @@ sub has_tflags_nosubject { 1 } # tflags
sub has_tflags_nolog { 1 } # tflags nolog
sub perl_min_version_5010000 { return $] >= 5.010000 } # perl version check ("perl_version" not neatly backwards-compatible)
sub has_dns_max_cname_cache { 1 } # supports 'dns_max_cname_cache' option
+sub has_util_rb_4tld { 1 } # supports 'util_rb_4tld' option
###########################################################################
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/RegistryBoundaries.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/RegistryBoundaries.pm Wed Jan 14 13:36:52 2026 (r1931314)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/RegistryBoundaries.pm Wed Jan 14 14:22:35 2026 (r1931315)
@@ -157,7 +157,11 @@ sub split_domain {
# "Fire-Dept.CI.Los-Angeles.CA.US"
# "<school-name>.PVT.K12.<state>.US"
last if ($US_STATES{$domparts[2]});
- }
+ } else {
+ my $temp = join(".", @domparts);
+ # International domain names in ASCII-compatible encoding (ACE)
+ last if ($self->{conf}->{four_level_domains}{$temp});
+ }
}
push(@hostname, shift @domparts);
}
Modified: spamassassin/trunk/rules/20_aux_tlds.cf
==============================================================================
--- spamassassin/trunk/rules/20_aux_tlds.cf Wed Jan 14 13:36:52 2026 (r1931314)
+++ spamassassin/trunk/rules/20_aux_tlds.cf Wed Jan 14 14:22:35 2026 (r1931315)
@@ -941,3 +941,42 @@ util_rb_3tld us-central-1.ionoscloud.com
endif
+
+if can(Mail::SpamAssassin::Conf::has_util_rb_4tld)
+ util_rb_4tld s3.us-east-1.amazonaws.com
+ util_rb_4tld s3.us-east-2.amazonaws.com
+ util_rb_4tld s3.us-west-1.amazonaws.com
+ util_rb_4tld s3.us-west-2.amazonaws.com
+ util_rb_4tld s3.af-south-1.amazonaws.com
+ util_rb_4tld s3.ap-east-1.amazonaws.com
+ util_rb_4tld s3.ap-east-2.amazonaws.com
+ util_rb_4tld s3.ap-south-1.amazonaws.com
+ util_rb_4tld s3.ap-south-2.amazonaws.com
+ util_rb_4tld s3.ap-southeast-1.amazonaws.com
+ util_rb_4tld s3.ap-southeast-2.amazonaws.com
+ util_rb_4tld s3.ap-southeast-3.amazonaws.com
+ util_rb_4tld s3.ap-southeast-4.amazonaws.com
+ util_rb_4tld s3.ap-southeast-5.amazonaws.com
+ util_rb_4tld s3.ap-southeast-6.amazonaws.com
+ util_rb_4tld s3.ap-southeast-7.amazonaws.com
+ util_rb_4tld s3.ap-nordeast-1.amazonaws.com
+ util_rb_4tld s3.ap-nordeast-2.amazonaws.com
+ util_rb_4tld s3.ap-nordeast-3.amazonaws.com
+ util_rb_4tld s3.ca-central-1.amazonaws.com
+ util_rb_4tld s3.ca-west-1.amazonaws.com
+ util_rb_4tld s3.eu-central-1.amazonaws.com
+ util_rb_4tld s3.eu-central-2.amazonaws.com
+ util_rb_4tld s3.eu-west-1.amazonaws.com
+ util_rb_4tld s3.eu-west-2.amazonaws.com
+ util_rb_4tld s3.eu-west-3.amazonaws.com
+ util_rb_4tld s3.eu-south-1.amazonaws.com
+ util_rb_4tld s3.eu-south-2.amazonaws.com
+ util_rb_4tld s3.eu-north-1.amazonaws.com
+ util_rb_4tld s3.il-central-1.amazonaws.com
+ util_rb_4tld s3.mx-central-1.amazonaws.com
+ util_rb_4tld s3.me-south-1.amazonaws.com
+ util_rb_4tld s3.me-central-1.amazonaws.com
+ util_rb_4tld s3.sa-east-1.amazonaws.com
+ util_rb_4tld s3.us-gov-east-1.amazonaws.com
+ util_rb_4tld s3.us-gov-west-1.amazonaws.com
+endif
Modified: spamassassin/trunk/t/cross_user_config_leak.t
==============================================================================
--- spamassassin/trunk/t/cross_user_config_leak.t Wed Jan 14 13:36:52 2026 (r1931314)
+++ spamassassin/trunk/t/cross_user_config_leak.t Wed Jan 14 14:22:35 2026 (r1931315)
@@ -18,7 +18,7 @@ my @ignored_commands = qw(
version_tag uri_detail uridnssub uridnsbl urirhsbl urirhssub urinsrhsbl
urinsrhssub urifullnsrhsbl urifullnsrhssub add_header remove_header
redirector_pattern reuse mimeheader rbl_timeout uridnsbl_timeout
- util_rb_tld util_rb_2tld util_rb_3tld shortcircuit asn_lookup asn_lookup_ipv6
+ util_rb_tld util_rb_2tld util_rb_3tld util_rb_4tld shortcircuit asn_lookup asn_lookup_ipv6
);
Modified: spamassassin/trunk/t/uri.t
==============================================================================
--- spamassassin/trunk/t/uri.t Wed Jan 14 13:36:52 2026 (r1931314)
+++ spamassassin/trunk/t/uri.t Wed Jan 14 14:22:35 2026 (r1931315)
@@ -8,7 +8,7 @@ use SATest; sa_t_init("uri");
use constant HAS_LIBIDN => eval { require Net::LibIDN; };
use constant HAS_LIBIDN2 => eval { require Net::LibIDN2; };
-my $tests = 105;
+my $tests = 106;
$tests += 7 if (HAS_LIBIDN);
$tests += 7 if (HAS_LIBIDN2);
@@ -23,6 +23,7 @@ use Mail::SpamAssassin::Util;
tstlocalrules ("
util_rb_2tld live.com
util_rb_3tld three.3ldlive.com
+ util_rb_4tld four.three.3ldlive.com
");
# initialize SpamAssassin
@@ -379,5 +380,6 @@ ok(try($base, "http:g", "http://a/b/c/g"
ok(try_domains('WWW.LIVE.com', 'www.live.com'));
ok(try_domains('WWW.foo.LIVE.com', 'foo.live.com'));
ok(try_domains('WWW.three.3ldLIVE.com', 'www.three.3ldlive.com'));
+ok(try_domains('WWW.four.three.3ldLIVE.com', 'www.four.three.3ldlive.com'));
ok(try_domains('WWW.foo.basicLIVE.com', 'basiclive.com'));
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.