X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=5211b7aa622ec6553084b3371925bd0919d8405a;hb=3ac88c21abe28b60bd5b26a8dae2474ad3e81f8a;hp=0d137e529bd3710f7dd391eadf9ee126f4fe0083;hpb=f0ac8322367c66080b6dbb74da4de72dae126dc3;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 0d137e52..5211b7aa 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -28,13 +28,14 @@ use Local; use Carp; use strict; -use vars qw($me $pc11_max_age $pc11_dup_age $pc23_dup_age - %spotdup %wwvdup $last_hour %pings %rcmds +use vars qw($me $pc11_max_age $pc23_max_age $pc11_dup_age $pc23_dup_age + %spotdup %wwvdup $last_hour %pings %rcmds %nodehops @baddx $baddxfn $pc12_dup_age %anndup $allowzero); $me = undef; # the channel id for this cluster $pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11 +$pc23_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc23 $pc11_dup_age = 24*3600; # the maximum time to keep the spot dup list for $pc23_dup_age = 24*3600; # the maximum time to keep the wwv dup list for $pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for @@ -149,7 +150,13 @@ sub normal my ($pcno) = $field[0] =~ /^PC(\d\d)/; # just get the number return unless $pcno; return if $pcno < 10 || $pcno > 51; - + + # dump bad protocol messages unless it is a PC29 + if ($line =~ /\%[0-9A-F][0-9A-F]/o && $pcno != 29) { + dbg('chan', "CORRUPT protocol message - dumped"); + return; + } + # local processing 1 my $pcr; eval { @@ -203,7 +210,7 @@ sub normal # store it away my $spotter = $field[6]; - $spotter =~ s/-\d+$//o; # strip off the ssid from the spotter + $spotter =~ s/-[\@\d]+$//o; # strip off the ssid from the spotter # do some de-duping my $freq = $field[1] - 0; @@ -220,6 +227,12 @@ sub normal dbg('chan', "Bad DX spot, ignored"); return; } + + # are any of the crucial fields invalid? + if ($field[2] =~ /[a-z]/ || $field[6] =~ /[a-z]/ || $field[7] =~ /[a-z]/) { + dbg('chan', "Spot contains lower case callsigns, rejected"); + return; + } my @spot = Spot::add($freq, $field[2], $d, $text, $spotter, $field[7]); @@ -421,7 +434,7 @@ sub normal # unbusy and stop and outgoing mail (ie if somehow we receive another PC19 without a disconnect) my $mref = DXMsg::get_busy($call); - $mref->stop_msg($self) if $mref; + $mref->stop_msg($call) if $mref; # add this station to the user database, if required (don't remove SSID from nodes) my $user = DXUser->get_current($call); @@ -437,8 +450,6 @@ sub normal $user->put; } - # queue up any messages - DXMsg::queue_msg(0) if $self->state eq 'normal'; return if $newline eq "PC19^"; # add hop count @@ -451,10 +462,6 @@ sub normal $self->send_local_config(); $self->send(pc22()); $self->state('normal'); - - # queue mail - DXMsg::queue_msg(0); - return; } @@ -483,12 +490,9 @@ sub normal if ($pcno == 22) { $self->state('normal'); - - # queue mail - DXMsg::queue_msg(0); return; } - + if ($pcno == 23 || $pcno == 27) { # WWV info # route 'foreign' pc27s @@ -509,7 +513,7 @@ sub normal dbg('chan', "Dup WWV Spot ignored\n"); return; } - if ($d > $main::systime + 900 || $field[2] < 0 || $field[2] > 23) { + if ($d < $main::systime - $pc23_max_age || $d > $main::systime + 900 || $field[2] < 0 || $field[2] > 23) { dbg('chan', "WWV Date ($field[1] $field[2]) out of range"); return; } @@ -573,7 +577,7 @@ sub normal } if (($pcno >= 28 && $pcno <= 33) || $pcno == 40 || $pcno == 42 || $pcno == 49) { # mail/file handling - if ($field[1] eq $main::mycall) { + if ($pcno == 49 || $field[1] eq $main::mycall) { DXMsg::process($self, $line); } else { route($field[1], $line); @@ -663,7 +667,7 @@ sub normal if ($pcno == 43) { last SWITCH; } - if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47 || $pcno == 49) { + if ($pcno == 37 || $pcno == 44 || $pcno == 45 || $pcno == 46 || $pcno == 47) { if ($field[1] eq $main::mycall) { ; } else { @@ -772,7 +776,7 @@ sub finish # unbusy and stop and outgoing mail my $mref = DXMsg::get_busy($call); - $mref->stop_msg($self) if $mref; + $mref->stop_msg($call) if $mref; # broadcast to all other nodes that all the nodes connected to via me are gone my @gonenodes = map { $_->dxchan == $self ? $_ : () } DXNode::get_all(); @@ -808,7 +812,13 @@ sub send_dx_spot # taking into account filtering and so on foreach $dxchan (@dxchan) { my $routeit; - my ($filter, $hops) = Filter::it($dxchan->{spotfilter}, @_, $self->{call} ) if $dxchan->{spotfilter}; + my ($filter, $hops); + + if ($dxchan->{spotfilter}) { + ($filter, $hops) = Filter::it($dxchan->{spotfilter}, @_, $self->{call} ); + next unless $filter; + } + if ($dxchan->is_ak1a) { next if $dxchan == $self; if ($hops) {