Increase default hop counts all round
[spider.git] / perl / DXProt.pm
index 7a324625f4e9342304b1545cf2718c83ea5efa89..90506ed4df9ee6c44ea80e115fe0abef9b6c38bc 100644 (file)
@@ -96,7 +96,7 @@ sub start
        # remember type of connection
        $self->{consort} = $line;
        $self->{outbound} = $sort eq 'O';
-       $self->{priv} = $user->priv;
+       $self->{priv} = $user->priv || 1;     # other clusters can always be 'normal' users
        $self->{lang} = $user->lang || 'en';
        $self->{isolate} = $user->{isolate};
        $self->{consort} = $line;       # save the connection type
@@ -221,11 +221,15 @@ sub normal
                                return;
                        }
 
-                       # are any of the crucial fields invalid?
-            if ($field[2] =~ /(?:^\s*$|[a-z])/ || $field[6] =~ /(?:^\s*$|[a-z])/ || $field[7] =~ /(?:^\s*$|[a-z])/) {
+                       # are any of the callsign fields invalid?
+            if ($field[2] =~ m/[^A-Z0-9\-\/]/ || $field[6] =~ m/[^A-Z0-9\-]/ || $field[7] =~ m/[^A-Z0-9\-]/) {
                                dbg('chan', "Spot contains lower case callsigns or blanks, rejected");
                                return;
                        }
+            if ($field[1] =~ m/[^0-9\.]/) {
+                               dbg('chan', "Spot frequency not numeric, rejected");
+                               return;
+                       }
                        
                        # do some de-duping
                        $field[5] =~ s/^\s+//;      # take any leading blanks off
@@ -619,7 +623,7 @@ sub normal
                                my $ref = DXUser->get_current($field[2]);
                                my $cref = DXCluster->get($field[2]);
                                Log('rcmd', 'in', $ref->{priv}, $field[2], $field[3]);
-                               unless ($field[3] =~ /rcmd/i || !$cref || !$ref || $cref->mynode->call ne $ref->homenode) {    # not allowed to relay RCMDS!
+                               unless (!$cref || !$ref || $cref->mynode->call ne $ref->homenode) {    # not allowed to relay RCMDS!
                                        if ($ref->{priv}) {     # you have to have SOME privilege, the commands have further filtering
                                                $self->{remotecmd} = 1; # for the benefit of any command that needs to know
                                                my $oldpriv = $self->{priv};
@@ -656,6 +660,10 @@ sub normal
                                        my $dxchan = DXChannel->get($s->{call});
                                        $dxchan->send($field[3]) if $dxchan;
                                        delete $rcmds{$field[2]} if !$dxchan;
+                               } else {
+                                       # send unsolicited ones to the sysop
+                                       my $dxchan = DXChannel->get($main::myalias);
+                                       $dxchan->send($field[3]) if $dxchan;
                                }
                        } else {
                                my $ref = DXUser->get_current($field[1]);
@@ -697,9 +705,7 @@ sub normal
                                my ($lat, $long) = DXBearing::stoll($field[3]);
                                $user->lat($lat);
                                $user->long($long);
-                               my $qra = $user->qra || DXBearing::lltoqra($lat, $long);
-                               $qra = DXBearing::lltoqra($lat, $long) unless $qra && DXBearing::is_qra($qra);
-                               $user->qra($qra) if $qra ne $user->qra;
+                               $user->qra(DXBearing::lltoqra($lat, $long)) unless $user->qra && DXBearing::is_qra($user->qra);
                        } elsif ($field[2] == 4) {
                                $user->homenode($field[3]);
                        }
@@ -842,6 +848,10 @@ sub normal
                                                $dxchan = DXChannel->get($s->{call});
                                                $dxchan->send($field[4]) if $dxchan;
                                                delete $rcmds{$field[2]} if !$dxchan;
+                                       } else {
+                                               # send unsolicited ones to the sysop
+                                               my $dxchan = DXChannel->get($main::myalias);
+                                               $dxchan->send($field[4]) if $dxchan;
                                        }
                                }
                        } else {
@@ -990,7 +1000,7 @@ sub send_dx_spot
                } elsif ($dxchan->is_user && $dxchan->{dx}) {
                        my $buf = Spot::formatb($dxchan->{user}->wantgrid, $_[0], $_[1], $_[2], $_[3], $_[4]);
                        $buf .= "\a\a" if $dxchan->{beep};
-                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
                                $dxchan->send($buf);
                        } else {
                                $dxchan->delay($buf);
@@ -1034,7 +1044,7 @@ sub send_wwv_spot
                } elsif ($dxchan->is_user && $dxchan->{wwv}) {
                        my $buf = "WWV de $_[6] <$_[1]>:   SFI=$_[2], A=$_[3], K=$_[4], $_[5]";
                        $buf .= "\a\a" if $dxchan->{beep};
-                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
                                $dxchan->send($buf);
                        } else {
                                $dxchan->delay($buf);
@@ -1077,7 +1087,7 @@ sub send_wcy_spot
                } elsif ($dxchan->is_user && $dxchan->{wcy}) {
                        my $buf = "WCY de $_[10] <$_[1]> : K=$_[4] expK=$_[5] A=$_[3] R=$_[6] SFI=$_[2] SA=$_[7] GMF=$_[8] Au=$_[9]";
                        $buf .= "\a\a" if $dxchan->{beep};
-                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
                                $dxchan->send($buf);
                        } else {
                                $dxchan->delay($buf);
@@ -1141,7 +1151,7 @@ sub send_announce
                        next if $target eq 'SYSOP' && $dxchan->{priv} < 5;
                        my $buf = "$to$target de $_[0]: $text";
                        $buf .= "\a\a" if $dxchan->{beep};
-                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+                       if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
                                $dxchan->send($buf);
                        } else {
                                $dxchan->delay($buf);
@@ -1292,7 +1302,7 @@ sub broadcast_list
 
                $s =~ s/\a//og unless $dxchan->{beep};
 
-               if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'convers') {
+               if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') {
                        $dxchan->send($s);      
                } else {
                        $dxchan->delay($s);
@@ -1402,5 +1412,17 @@ sub disconnect
 
        $self->SUPER::disconnect;
 }
+
+# 
+# send a talk message to this thingy
+#
+sub talk
+{
+       my ($self, $from, $to, $via, $line) = @_;
+       
+       $line =~ s/\^/\\5E/g;                   # remove any ^ characters
+       $self->send(DXProt::pc10($from, $to, $via, $line));
+       Log('talk', $self->call, $from, $via?$via:$main::mycall, $line);
+}
 1;
 __END__