X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXProtHandle.pm;h=e2e8e983998a75f2b137a313f9b043af65714a25;hb=0ae2756b512f3783efe7f7e3c124b0a074227e81;hp=a42ba33e871de8496d1f138414140ca37470d479;hpb=ca3a14c5a22a621e9b69ecf0acc2a5da08c5ab91;p=spider.git diff --git a/perl/DXProtHandle.pm b/perl/DXProtHandle.pm index a42ba33e..e2e8e983 100644 --- a/perl/DXProtHandle.pm +++ b/perl/DXProtHandle.pm @@ -41,14 +41,17 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim $last_hour $last10 %eph %pings %rcmds $ann_to_talk $pingint $obscount %pc19list $chatdupeage $chatimportfn $investigation_int $pc19_version $myprot_version - %nodehops $baddx $badspotter $badnode $censorpc $rspfcheck + %nodehops $baddx $badspotter $badnode $censorpc $allowzero $decode_dk0wcy $send_opernam @checklist $eph_pc15_restime $pc9x_past_age $pc9x_future_age + $pc10_dupe_age ); $pc9x_past_age = 62*60; # maximum age in the past of a px9x (a config record might be the only # thing a node might send - once an hour) $pc9x_future_age = 5*60; # maximum age in the future ditto +$pc10_dupe_age = 45; # just something to catch duplicate PC10->PC93 conversions + # incoming talk commands sub handle_10 @@ -58,8 +61,10 @@ sub handle_10 my $line = shift; my $origin = shift; - # rsfp check - return if $rspfcheck and !$self->rspfcheck(0, $_[6], $_[1]); + # this is to catch loops caused by bad software ... + if (eph_dup($line, $pc10_dupe_age)) { + return; + } # will we allow it at all? if ($censorpc) { @@ -106,8 +111,8 @@ sub handle_10 RouteDB::update($_[6], $self->{call}); # RouteDB::update($to, $_[6]); - # convert this to a PC93 and process it as such - $self->normal(pc93($to, $from, $via, $_[3], $_[6])); + # convert this to a PC93, coming from mycall with origin set and process it as such + $main::me->normal(pc93($to, $from, $via, $_[3], $_[6])); } # DX Spot handling @@ -126,9 +131,6 @@ sub handle_11 } } - # rsfp check - # return if $rspfcheck and !$self->rspfcheck(1, $_[7], $_[6]); - # is the spotted callsign blank? This should really be trapped earlier but it # could break other protocol sentences. Also check for lower case characters. if ($_[2] =~ /^\s*$/) { @@ -286,8 +288,6 @@ sub handle_12 my $line = shift; my $origin = shift; - # return if $rspfcheck and !$self->rspfcheck(1, $_[5], $_[1]); - # announce duplicate checking $_[3] =~ s/^\s+//; # remove leading blanks @@ -360,7 +360,7 @@ sub handle_15 my $origin = shift; if (eph_dup($line, $eph_pc15_restime)) { - dbg("PCPROT: Ephemeral dup, dropped") if isdbg('chanerr'); + return; } else { unless ($self->{isolate}) { DXChannel::broadcast_nodes($line, $self) if $line =~ /\^H\d+\^?~?$/; # send it to everyone but me @@ -402,7 +402,6 @@ sub handle_16 } if (eph_dup($line)) { - dbg("PCPROT: dup PC16 detected") if isdbg('chanerr'); return; } @@ -545,7 +544,6 @@ sub handle_17 $self->tell_buddies('logoutb', $ucall, $ncall); if (eph_dup($line)) { - dbg("PCPROT: dup PC17 detected") if isdbg('chanerr'); return; } @@ -833,7 +831,6 @@ sub handle_21 } if (eph_dup($line)) { - dbg("PCPROT: dup PC21 detected") if isdbg('chanerr'); return; } @@ -878,10 +875,6 @@ sub handle_23 } } - # only do a rspf check on PC23 (not 27) - if ($pcno == 23) { - return if $rspfcheck and !$self->rspfcheck(1, $_[8], $_[7]) - } # do some de-duping my $d = cltounix($_[1], sprintf("%02d18Z", $_[2])); @@ -941,7 +934,6 @@ sub handle_24 return unless $nref || $uref; # if we don't know where they are, it's pointless sending it on if (eph_dup($line)) { - dbg("PCPROT: Dup PC24 ignored\n") if isdbg('chanerr'); return; } @@ -1022,7 +1014,7 @@ sub handle_34 my $line = shift; my $origin = shift; if (eph_dup($line, $eph_pc34_restime)) { - dbg("PCPROT: dupe PC34, ignored") if isdbg('chanerr'); + return; } else { $self->process_rcmd($_[1], $_[2], $_[2], $_[3]); } @@ -1095,7 +1087,6 @@ sub handle_41 my $l = "PC41^$call^$sort"; if (eph_dup($l, $eph_info_restime)) { - dbg("PCPROT: dup PC41, ignored") if isdbg('chanerr'); return; } @@ -1176,7 +1167,6 @@ sub handle_49 my $origin = shift; if (eph_dup($line)) { - dbg("PCPROT: Dup PC49 ignored\n") if isdbg('chanerr'); return; } @@ -1235,7 +1225,6 @@ sub handle_51 RouteDB::update($from, $self->{call}); if (eph_dup($line)) { - dbg("PCPROT: dup PC51 detected") if isdbg('chanerr'); return; } # route down an appropriate thingy @@ -1560,12 +1549,14 @@ sub handle_92 dbg("PCPROT: $call looped back onto $main::mycall, ignored") if isdbg('chanerr'); return; } + # this is only accepted from my "self". + # this also kills configs from PC92 nodes with external PC19 nodes that are also + # locally connected. Local nodes always take precedence. + if (DXChannel::get($call) && $call ne $self->{call}) { + dbg("PCPROT: locally connected node $call from other another node $self->{call}, ignored") if isdbg('chanerr'); + return; + } if ($is_extnode) { - # this is only accepted from my "self" - if (DXChannel::get($call) && $call ne $self->{call}) { - dbg("PCPROT: locally connected node config for $call from other another node $self->{call}, ignored") if isdbg('chanerr'); - return; - } # reparent to external node (note that we must have received a 'C' or 'A' record # from the true parent node for this external before we get one for the this node unless ($parent = Route::Node::get($call)) { @@ -1694,6 +1685,7 @@ sub handle_93 return; } + # remember that we are converting PC10->PC93 unless ($self->{do_pc9x}) { dbg("PCPROT: PC9x come in from non-PC9x node, ignored") if isdbg('chanerr'); return; @@ -1709,6 +1701,11 @@ sub handle_93 my $onode = $_[7]; $onode = $pcall if @_ <= 8; + # this is catch loops caused by bad software ... + if (eph_dup("PC93|$from|$text|$onode", $pc10_dupe_age)) { + return; + } + # will we allow it at all? if ($censorpc) { my @bad; @@ -1718,11 +1715,6 @@ sub handle_93 } } - # this is catch loops caused by bad software ... - if (eph_dup("PC93|$from|$text|$onode")) { - return; - } - # if this is a 'bad spotter' user then ignore it my $nossid = $from; $nossid =~ s/-\d+$//; @@ -1736,9 +1728,16 @@ sub handle_93 my $dxchan; $dxchan = DXChannel::get($main::myalias) if $to eq $main::mycall; $dxchan = DXChannel::get($to) unless $dxchan; - if ($dxchan && $dxchan->is_user) { - $dxchan->talk($from, $to, $via, $text, $onode); - return; + # check it... + if ($dxchan) { + if (ref $dxchan && $dxchan->isa('DXChannel')) { + if ($dxchan->is_user) { + $dxchan->talk($from, $to, $via, $text, $onode); + return; + } + } else { + dbg("ERROR: $to -> $dxchan is not a DXChannel! (local talk)"); + } } # convert to PC10 talks where appropriate @@ -1746,14 +1745,17 @@ sub handle_93 if ($ref) { # just go for the "best" one for now (rather than broadcast) $dxchan = $ref->dxchan; -# my @dxchan = $ref->alldxchan; -# for $dxchan (@dxchan) { + + # check it... + if (ref $dxchan && $dxchan->isa('DXChannel')) { if ($dxchan->{do_pc9x}) { $dxchan->send($line); } else { $dxchan->talk($from, $to, $via, $text, $onode); } -# } + } else { + dbg("ERROR: $to -> $dxchan is not a DXChannel! (convert to pc10)"); + } return; } @@ -1764,7 +1766,7 @@ sub handle_93 my $wx = uc $to eq 'WX' ? '1' : '0'; my $local = $via eq 'LOCAL' ? '*' : $via; - $self->send_announce(1, pc12($from, $text, $local, $via, $sysop, $wx, $pcall), $from, $local, $text, $sysop, $pcall, $wx, $via eq 'LOCAL' ? $via : undef); + $self->send_announce(1, pc12($from, $text, $local, $sysop, $wx, $pcall), $from, $local, $text, $sysop, $pcall, $wx, $via eq 'LOCAL' ? $via : undef); return if $via eq 'LOCAL'; } else { # chat messages to non-pc9x nodes