made filtering work properly for spots
[spider.git] / perl / DXProt.pm
index 0d137e529bd3710f7dd391eadf9ee126f4fe0083..5211b7aa622ec6553084b3371925bd0919d8405a 100644 (file)
@@ -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) {