X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProt.pm;h=1f2a642809e31b97637b3ea5b24e22fe74dcfd86;hb=c5e90df0d93d141f8687556a708068521b9b8f77;hp=4f02d5193275b866d9577f3e31bc716d5420e1e8;hpb=334765d047bc6f15f8c15686afc07b0242c6919f;p=spider.git diff --git a/perl/DXProt.pm b/perl/DXProt.pm index 4f02d519..1f2a6428 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -29,11 +29,12 @@ use AnnTalk; use Geomag; use WCY; use Time::HiRes qw(gettimeofday tv_interval); +use BadWords; use strict; use vars qw($me $pc11_max_age $pc23_max_age $last_hour %pings %rcmds - %nodehops @baddx $baddxfn + %nodehops @baddx $baddxfn $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist); $me = undef; # the channel id for this cluster @@ -45,13 +46,13 @@ $last_hour = time; # last time I did an hourly periodic update %rcmds = (); # outstanding rcmd requests outbound %nodehops = (); # node specific hop control @baddx = (); # list of illegal spotted callsigns - +$censorpc = 0; # Do a BadWords::check on text fields and reject things $baddxfn = "$main::data/baddx.pl"; @checklist = ( - [ qw(c c m p bc c) ], # pc10 + [ qw(c c m bp bc c) ], # pc10 [ qw(f m d t m c c h) ], # pc11 [ qw(c bc m bp bm p h) ], # pc12 [ qw(c h) ], # @@ -177,15 +178,6 @@ sub init confess $@ if $@; $me->{sort} = 'S'; # S for spider - # now prime the spot and wwv duplicates file with data -# my @today = Julian::unixtoj(time); -# for (Spot::readfile(@today), Spot::readfile(Julian::sub(@today, 1))) { -# Spot::dup(@{$_}[0..3]); -# } -# for (Geomag::readfile(time)) { -# Geomag::dup(@{$_}[1..5]); -# } - # load the baddx file do "$baddxfn" if -e "$baddxfn"; print "$@\n" if $@; @@ -239,7 +231,7 @@ sub start # send initialisation string unless ($self->{outbound}) { - $self->send(pc38()) if DXNode->get_all(); +# $self->send(pc38()) if DXNode->get_all(); $self->send(pc18()); $self->{lastping} = $main::systime; } else { @@ -263,6 +255,8 @@ sub normal { my ($self, $line) = @_; my @field = split /\^/, $line; + return unless @field; + pop @field if $field[-1] eq '~'; # print join(',', @field), "\n"; @@ -292,20 +286,27 @@ sub normal SWITCH: { if ($pcno == 10) { # incoming talk - + + # will we allow it at all? + if ($censorpc) { + my @bad; + if (@bad = BadWords::check($field[3])) { + dbg('chan', "Bad words: @bad, dropped" ); + return; + } + } + # is it for me or one of mine? my ($to, $via, $call, $dxchan); if ($field[5] gt ' ') { $call = $via = $field[2]; $to = $field[5]; - unless (is_callsign($to)) { - dbg('chan', "Corrupt talk, rejected"); - return; - } } else { $call = $to = $field[2]; } - if ($dxchan = DXChannel->get($call)) { + $dxchan = DXChannel->get($call); + if ($dxchan && $dxchan->is_user) { + $field[3] =~ s/\%5E/^/g; $dxchan->talk($field[1], $to, $via, $field[3]); } else { $self->route($field[2], $line); # relay it on its way @@ -349,6 +350,13 @@ sub normal dbg('chan', "Duplicate Spot ignored\n"); return; } + if ($censorpc) { + my @bad; + if (@bad = BadWords::check($field[5])) { + dbg('chan', "Bad words: @bad, dropped" ); + return; + } + } my @spot = Spot::add($field[1], $field[2], $d, $field[5], $field[6], $field[7]); @@ -425,6 +433,14 @@ sub normal dbg('chan', "Duplicate Announce ignored"); return; } + + if ($censorpc) { + my @bad; + if (@bad = BadWords::check($field[3])) { + dbg('chan', "Bad words: @bad, dropped" ); + return; + } + } if ($field[2] eq '*' || $field[2] eq $main::mycall) { @@ -615,12 +631,16 @@ sub normal if ($call ne $main::mycall) { # don't allow malicious buggers to disconnect me! my $node = DXCluster->get_exact($call); if ($node) { + if ($call eq $self->{call}) { + dbg('chan', "LOOP: Trying to disconnect myself with PC21"); + return; + } if ($node->dxchan != $self) { dbg('chan', "LOOP: $call come in on wrong channel"); return; } my $dxchan; - if (($dxchan = DXChannel->get($call)) && $dxchan != $self) { + if ($dxchan = DXChannel->get($call)) { dbg('chan', "LOOP: $call connected locally"); return; } @@ -725,7 +745,7 @@ sub normal if ($pcno == 49 || $field[1] eq $main::mycall) { DXMsg::process($self, $line); } else { - $self->route($field[1], $line); + $self->route($field[1], $line) unless $self->is_clx; } return; } @@ -886,6 +906,13 @@ sub normal return; } + if ($pcno == 75) { # dunno but route it + if ($field[1] ne $main::mycall) { + $self->route($field[1], $line); + } + return; + } + if ($pcno == 73) { # WCY broadcasts # do some de-duping @@ -1112,6 +1139,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}; + $buf =~ s/\%5E/^/g; if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { $dxchan->send($buf); } else { @@ -1265,6 +1293,7 @@ sub send_announce } next if $target eq 'SYSOP' && $dxchan->{priv} < 5; my $buf = "$to$target de $_[0]: $text"; + $buf =~ s/\%5E/^/g; $buf .= "\a\a" if $dxchan->{beep}; if ($dxchan->{state} eq 'prompt' || $dxchan->{state} eq 'talk') { $dxchan->send($buf); @@ -1324,19 +1353,22 @@ sub send_local_config sub route { my ($self, $call, $line) = @_; - my $cl = DXCluster->get_exact($call); - if ($cl) { # don't route it back down itself - if (ref $self && $call eq $self->{call}) { - dbg('chan', "Trying to route back to source, dropped"); - return; - } - my $hops; - my $dxchan = $cl->{dxchan}; - if ($dxchan) { - my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name - if ($routeit) { - $dxchan->send($routeit) if $dxchan; - } + + if (ref $self && $call eq $self->{call}) { + dbg('chan', "Trying to route back to source, dropped"); + return; + } + + # always send it down the local interface if available + my $dxchan = DXChannel->get($call); + unless ($dxchan) { + my $cl = DXCluster->get_exact($call); + $dxchan = $cl->dxchan if $cl; + } + if ($dxchan) { + my $routeit = adjust_hops($dxchan, $line); # adjust its hop count by node name + if ($routeit) { + $dxchan->send($routeit); } } } @@ -1347,7 +1379,7 @@ sub broadcast_ak1a { my $s = shift; # the line to be rebroadcast my @except = @_; # to all channels EXCEPT these (dxchannel refs) - my @dxchan = DXChannel::get_all_ak1a(); + my @dxchan = DXChannel::get_all_nodes(); my $dxchan; # send it if it isn't the except list and isn't isolated and still has a hop count @@ -1364,7 +1396,7 @@ sub broadcast_all_ak1a { my $s = shift; # the line to be rebroadcast my @except = @_; # to all channels EXCEPT these (dxchannel refs) - my @dxchan = DXChannel::get_all_ak1a(); + my @dxchan = DXChannel::get_all_nodes(); my $dxchan; # send it if it isn't the except list and isn't isolated and still has a hop count