use Fcntl;
use strict;
+
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
use vars qw(%work @msg $msgdir %valid %busy $maxage $last_clean
@badmsg @swop $swopfn $badmsgfn $forwardfn @forward $timeout $waittime
$queueinterval $lastq $importfn $minchunk $maxchunk $bulltopriv);
to => '0,To',
from => '0,From',
t => '0,Msg Time,cldatetime',
- private => '5,Private',
+ private => '5,Private,yesno',
subject => '0,Subject',
linesreq => '0,Lines per Gob',
- rrreq => '5,Read Confirm',
+ rrreq => '5,Read Confirm,yesno',
origin => '0,Origin',
lines => '5,Data',
stream => '9,Stream No',
if (exists $busy{$fromnode}) {
my $ref = $busy{$fromnode};
- my $tonode = $ref->{tonode};
+ my $tonode = $ref->{tonode} || "unknown";
dbg("Busy, stopping msgno: $ref->{msgno} $fromnode->$tonode") if isdbg('msg');
$ref->stop_msg($self->call);
}
if ($ref->{subject} eq $m->{subject} && $ref->{t} == $m->{t} && $ref->{from} eq $m->{from} && $ref->{to} eq $m->{to}) {
$ref->stop_msg($self->call);
my $msgno = $m->{msgno};
- dbg("duplicate message from $ref->{from} -> $ref->{to} to $msgno") if isdbg('msg');
- Log('msg', "duplicate message from $ref->{from} -> $ref->{to} to $msgno");
+ dbg("duplicate message from $ref->{from} -> $ref->{to} to msg: $msgno") if isdbg('msg');
+ Log('msg', "duplicate message from $ref->{from} -> $ref->{to} to msg: $msgno");
return;
}
}
$ref->swop_it($self->call);
# look for 'bad' to addresses
- if ($ref->dump_it) {
+ if ($ref->dump_it($self->call)) {
$ref->stop_msg($self->call);
dbg("'Bad' message $ref->{to}") if isdbg('msg');
Log('msg', "'Bad' message $ref->{to}");
return;
}
+ # check the message for bad words
+ my @words;
+ for (@{$ref->{lines}}) {
+ push @words, BadWords::check($_);
+ }
+ push @words, BadWords::check($ref->{subject});
+ if (@words) {
+ dbg("message with badwords '@words' $ref->{from} -> $ref->{to} '$ref->{subject}' origin: $ref->{origin} via " . $self->call) if isdbg('msg');
+ Log('msg',"message with badwords '@words' $ref->{from} -> $ref->{to} origin: $ref->{origin} via " . $self->call);
+ Log('msg',"subject: $ref->{subject}");
+ for (@{$ref->{lines}}) {
+ Log('msg', "line: $_");
+ }
+ $ref->stop_msg($self->call);
+ return;
+ }
+
$ref->{msgno} = next_transno("Msgno");
push @{$ref->{gotit}}, $f[2]; # mark this up as being received
$ref->store($ref->{lines});
if ($_->{from} eq $f[1] && $_->{subject} eq $f[2]) {
$_->del_msg();
Log('msg', "Message $_->{msgno} from $_->{from} ($_->{subject}) fully deleted");
- DXProt::broadcast_ak1a($line, $self);
+ DXChannel::broadcast_nodes($line, $self);
}
}
}
sub queue_msg
{
my $sort = shift;
- my $call = shift;
my $ref;
my $clref;
dbg("Route: No dxchan for $ref->{to} " . ref($clref) ) if isdbg('msg');
}
}
- }
-
- # otherwise we are dealing with a bulletin or forwarded private message
- # compare the gotit list with
- # the nodelist up above, if there are sites that haven't got it yet
- # then start sending it - what happens when we get loops is anyone's
- # guess, use (to, from, time, subject) tuple?
- foreach $dxchan (@nodelist) {
- my $call = $dxchan->call;
- next unless $call;
- next if $call eq $main::mycall;
- next if ref $ref->{gotit} && grep $_ eq $call, @{$ref->{gotit}};
- next unless $ref->forward_it($call); # check the forwarding file
-
- # if we are here we have a node that doesn't have this message
- $ref->start_msg($dxchan) if !get_busy($call) && $dxchan->state eq 'normal';
- last;
+ } else {
+
+ # otherwise we are dealing with a bulletin or forwarded private message
+ # compare the gotit list with
+ # the nodelist up above, if there are sites that haven't got it yet
+ # then start sending it - what happens when we get loops is anyone's
+ # guess, use (to, from, time, subject) tuple?
+ foreach $dxchan (@nodelist) {
+ my $call = $dxchan->call;
+ next unless $call;
+ next if $call eq $main::mycall;
+ next if ref $ref->{gotit} && grep $_ eq $call, @{$ref->{gotit}};
+ next unless $ref->forward_it($call); # check the forwarding file
+
+ # if we are here we have a node that doesn't have this message
+ if (!get_busy($call) && $dxchan->state eq 'normal') {
+ $ref->start_msg($dxchan);
+ last;
+ }
+ }
}
# if all the available nodes are busy then stop
$busy{$self->{tonode}} = $self;
$work{$self->{tonode}} = $self;
$self->{lastt} = $main::systime;
- $dxchan->send(DXProt::pc28($self->{tonode}, $self->{fromnode}, $self->{to}, $self->{from}, $self->{t}, $self->{private}, $self->{subject}, $self->{origin}, $self->{rrreq}));
+ my ($fromnode, $origin);
+ if ($dxchan->is_arcluster) {
+ $fromnode = $self->{origin};
+ $origin = $self->{fromnode};
+ } else {
+ $fromnode = $self->{fromnode};
+ $origin = $self->{origin};
+ }
+ $dxchan->send(DXProt::pc28($self->{tonode}, $fromnode, $self->{to}, $self->{from}, $self->{t}, $self->{private}, $self->{subject}, $origin, $self->{rrreq}));
}
# get the ref of a busy node
}
# delete any messages to 'badmsg.pl' places
- if ($ref->dump_it) {
+ if ($ref->dump_it('')) {
dbg("'Bad' TO address $ref->{to}") if isdbg('msg');
Log('msg', "'Bad' TO address $ref->{to}");
$ref->del_msg;
# $DB::single = 1;
confess "local var gone missing" if !ref $self->{loc};
my $loc = $self->{loc};
+ if (my @ans = BadWords::check($line)) {
+ $self->{badcount} += @ans;
+ Log('msg', $self->call . " used badwords: @ans to @{$loc->{to}} in msg");
+ return ($self->msg('e17', @ans), $self->msg('m1'));
+ }
$loc->{subject} = $line;
$loc->{lines} = [];
$self->state('sendbody');
$self->func(undef);
$self->state('prompt');
} else {
+ if (my @ans = BadWords::check($line)) {
+ $self->{badcount} += @ans;
+ Log('msg', $self->call . " used badwords: @ans to @{$loc->{to}} subject: '$loc->{subject}' in msg");
+ Log('msg', "line: $line");
+ return ($self->msg('e17', @ans));
+ }
# i.e. it ain't and end or abort, therefore store the line
push @{$loc->{lines}}, length($line) > 0 ? $line : " ";
}
}
- return (1, @out);
+ return @out;
}
# return the standard directory line for this ref
sub dump_it
{
my $ref = shift;
+ my $call = shift;
my $i;
for ($i = 0; $i < @badmsg; $i += 3) {
$tested = $ref->{from} if $field eq 'F';
$tested = $ref->{origin} if $field eq 'O';
$tested = $ref->{subject} if $field eq 'S';
+ $tested = $call if $field eq 'I';
if (!$pattern || $tested =~ m{$pattern}i) {
return 1;
my @msg = map { chomp; $_ } <MSG>;
close(MSG);
unlink($fn);
- my @out = import_one($DXProt::me, \@msg, $splitit);
+ my @out = import_one($main::me, \@msg, $splitit);
Log('msg', @out);
}
}