| Server IP : 176.32.38.42 / Your IP : 216.73.216.70 Web Server : LiteSpeed System : Linux ha006.mymail.zone 4.18.0-553.51.1.lve.1.el8.x86_64 #1 SMP Wed May 14 14:34:57 UTC 2025 x86_64 User : s1225329 ( 1835) PHP Version : 7.4.33 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /usr/share/perl5/Mail/SpamAssassin/Plugin/ |
Upload File : |
# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>
package Mail::SpamAssassin::Plugin::URIEval;
use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use strict;
use warnings;
# use bytes;
use re 'taint';
our @ISA = qw(Mail::SpamAssassin::Plugin);
# constructor: register the eval rule
sub new {
my $class = shift;
my $mailsaobject = shift;
# some boilerplate...
$class = ref($class) || $class;
my $self = $class->SUPER::new($mailsaobject);
bless ($self, $class);
# the important bit!
$self->register_eval_rule("check_for_http_redirector"); # type does not matter
$self->register_eval_rule("check_https_ip_mismatch"); # type does not matter
$self->register_eval_rule("check_uri_truncated"); # type does not matter
return $self;
}
###########################################################################
sub check_for_http_redirector {
my ($self, $pms) = @_;
foreach ($pms->get_uri_list()) {
while (s{^https?://([^/:\?]+).+?(https?:/{0,2}?([^/:\?]+).*)$}{$2}i) {
my ($redir, $dest) = ($1, $3);
foreach ($redir, $dest) {
$_ = $self->{main}->{registryboundaries}->uri_to_domain($_) || $_;
}
next if ($redir eq $dest);
dbg("eval: redirect: found $redir to $dest, flagging");
return 1;
}
}
return 0;
}
###########################################################################
sub check_https_ip_mismatch {
my ($self, $pms) = @_;
foreach my $html (@{$pms->{html_all}}) {
foreach my $k (keys %{$html->{uri_detail}}) {
my $v = $html->{uri_detail}->{$k};
next if ($k !~ m%^https?:/*(?:[^\@/]+\@)?\d+\.\d+\.\d+\.\d+%i);
foreach (@{$v->{anchor_text}}) {
next if (m%^https:/*(?:[^\@/]+\@)?\d+\.\d+\.\d+\.\d+%i);
if (m%https:%i) {
return 1;
}
}
}
}
return 0;
}
###########################################################################
# is there a better way to do this?
sub check_uri_truncated {
my ($self, $pms) = @_;
return $pms->{'uri_truncated'} ? 1 : 0;
}
1;