--- ricochet.orig Thu Feb 8 22:23:19 2001 +++ ricochet Sun May 19 12:24:58 2002 @@ -128,7 +128,10 @@ ## List of receipients at ORIG_DOMAN ## besides the CONTACTS. - EXTRA_HEADERS => [qw/from reply-to sender errors-to return-path/], +## Anything there can be easily faked, producing lots of unwanted +## complaints. Better will not use it. +## EXTRA_HEADERS => [qw/from reply-to sender errors-to return-path/], + EXTRA_HEADERS => undef, ## Headers to analyze besides ## 'Received' @@ -227,13 +230,19 @@ $self->debug (0, "\nANALYZING HEADERS...\n"); + my $ip = $header->get ('X-Originating-IP'); grep { my $header_text = $_; my $hdata = $header->get ($header_text); unless ($hdata eq '') { $hdata =~ s/\n*$//; $self->debug (1,"o [$_] -- $hdata"); - my $host = _host ($hdata); my ($NS, $MX); + my $host = _host ($hdata); + if ($host =~ /^(.*\.)?hotmail\.(msn\.)?com$/i && $ip eq '') { + $self->debug (2,"- FAKE hotmail.com, NO X-Originating-IP.\n"); + goto EXTFAKE; + } + my ($NS, $MX); if ((_nslookup ($host) && ($NS = 1)) || (_mxlookup ($host) && ($MX = 1))) { $self->debug (2,"+ $host EXISTS.\n") if $NS; $self->debug (2,"+ $host HAS A MX RECORD.\n") if $MX; @@ -244,6 +253,7 @@ } } else { $self->debug (2,"- POSSIBLY FAKED HEADER. $host DOESN'T EXIST.\n") } } +EXTFAKE: } @{$self->{EXTRA_HEADERS}}; while ($match == 0) { @@ -379,7 +389,7 @@ ## --------------------------------------------------------------------------- sub authentic { - my $HOSTRE = '[\dA-Za-z\-\.]+\.[A-Za-z]{2,3}(?=[^A-Za-z\-\d])'; + my $HOSTRE = '[\dA-Za-z\-\.]+\.[A-Za-z]{2,4}(?=[^A-Za-z\-\d])'; my $IPRE = '\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}'; my ($self, $received) = @_; @@ -401,13 +411,20 @@ $received =~ /from\s(.*?)$rfc/s; my $from = " $1 "; $received =~ /by\s(.*?)$rfc/s; my $by = " $1 "; - my @orig_hosts = $from =~ /($HOSTRE)/gs; + + ## Trust only "(host.name [" part, HELO can be fake + my @orig_hosts = $from =~ /\([^()\[\]]*?($HOSTRE)[^()\[\]]*?\[/gs; my @orig_ips = $from =~ /($IPRE)/gs; my @transmit_hosts = $by =~ /($HOSTRE)/gs; - my @ips = $by =~ /($IPRE)/gs; + + my $header = $self->{MAIL}->head; + my $ip = $header->get ('X-Originating-IP'); + grep { - if (_nslookup ($_)) { + if (/^(.*\.)?hotmail\.(msn\.)?com$/i && $ip eq '') { + $self->debug (2, "- FAKE originating hotmail.com, NO X-Originating-IP."); + } elsif (_nslookup ($_)) { $auth = 1; $self->{ORIG_HOSTS}->add ($_); $self->debug (2,"+ $_ EXISTS."); @@ -417,15 +434,21 @@ my $host; grep { if ($host = _ptrquery ($_)) { - $auth = 1; $self->debug (2,"+ $_ RESOLVES TO $host."); - $self->{ORIG_HOSTS}->add ($host); + if ($host =~ /^(.*\.)?hotmail\.(msn\.)?com$/i && $ip eq '') { + $self->debug (2, "- FAKE originating IP of hotmail.com, NO X-Originating-IP."); + } else { + $auth = 1; + $self->{ORIG_HOSTS}->add ($host); + } } } @orig_ips; if ($self->relaxed == 1) { ## Check the transmit headers too. grep { - if (_nslookup ($_)) { + if (/^(.*\.)?hotmail\.(msn\.)?com$/i && $ip eq '') { + $self->debug (2, "- FAKE transmitting hotmail.com, NO X-Originating-IP."); + } elsif (_nslookup ($_)) { $auth = 1; $self->{TRANSMIT_HOSTS}->add ($_); $self->debug (2,"+ $_ EXISTS."); @@ -439,7 +462,13 @@ } unless ($self->relaxed == 1) { - $self->{TRANSMIT_HOSTS}->add (@transmit_hosts); + grep { + if (/^(.*\.)?hotmail\.(msn\.)?com$/i && $ip eq '') { + $self->debug (2, "- FAKE transmitting hotmail.com, NO X-Originating-IP."); + } else { + $self->{TRANSMIT_HOSTS}->add ($_); + } + } @transmit_hosts; } $self->debug (2, "+ Seems Authentic.\n"); @@ -574,7 +603,8 @@ sub initialize { my $self = shift; - my $rc = "$ENV{RICOCHET}" || "$ENV{HOME}/.ricochet"; $rc .= "/ricochetrc"; + my $rc = "$ENV{RICOCHET}" || -d "$ENV{HOME}/.ricochet" ? "$ENV{HOME}/.ricochet" : "%%PREFIX%%/share/ricochet"; + $rc .= "/ricochetrc"; Carp::croak "** Ricochet configuration file $rc doesn't exist. Aborting.\n" unless -e $rc; open (RC, $rc); grep { @@ -758,8 +788,8 @@ sub _domain { my $host = shift; $host =~ y/A-Z/a-z/; my $domain = ''; - ($domain) = $host =~ /([\da-z\-]+\.[a-z]{2,3}\.[a-z]{2})$/; - ($domain) = $host =~ /([\da-z\-]+\.[a-z]{2,3})$/ unless $domain; + ($domain) = $host =~ /([\da-z\-]+\.(edu?|com?|net?|org?|gov?|int|ac|pp)\.[a-z]{2})$/; + ($domain) = $host =~ /([\da-z\-]+\.[a-z]{2,4})$/ unless $domain; return $domain ? $domain : undef; } @@ -769,7 +799,7 @@ ## --------------------------------------------------------------------------- sub _host { - my $hostre = '[\dA-Za-z\-\.]+\.[A-Za-z]{2,3}(?=[^A-Za-z\-\d]|$)'; + my $hostre = '[\dA-Za-z\-\.]+\.[A-Za-z]{2,4}(?=[^A-Za-z\-\d]|$)'; my $data = shift; my ($host) = $data =~ /($hostre)/; return $host if $host ne '';