use strict;
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
- $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers);
+ $maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers
+ $maxcmdlth
+);
%Cache = (); # cache of dynamically loaded routine's mod times
%cmd_cache = (); # cache of short names
$users = 0; # no of users on this node currently
$maxusers = 0; # max no users on this node for this run
+$maxcmdlth = 512; # max length of incoming cmd line (including the command and any arguments
+
#
# obtain a new connection this is derived from dxchannel
#
# routing, this must go out here to prevent race condx
my $pkg = shift;
my $call = shift;
-# my @rout = $main::routeroot->add_user($call, Route::here(1));
- DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $self->hostname], );
+ # my @rout = $main::routeroot->add_user($call, Route::here(1));
+ my $ipaddr = alias_localhost($self->hostname);
+ DXProt::_add_thingy($main::routeroot, [$call, 0, 0, 1, undef, undef, $ipaddr], );
- # ALWAYS output the user
+ # ALWAYS output the user (except if the updates not enabled)
my $ref = Route::User::get($call);
if ($ref) {
$main::me->route_pc16($main::mycall, undef, $main::routeroot, $ref);
- $main::me->route_pc92a($main::mycall, undef, $main::routeroot, $ref) unless $DXProt::pc92_slug_changes;
+ $main::me->route_pc92a($main::mycall, undef, $main::routeroot, $ref) unless $DXProt::pc92_slug_changes || ! $DXProt::pc92_ad_enable;
}
return $self;
}
$self->lastmsgpoll($main::systime);
+ $self->{user_interval} = $self->user->user_interval || $main::user_interval; # allow user to change idle time between prompts
$self->prompt;
}
}
$self->send_ans(@ans);
} else {
- if (@bad = BadWords::check($cmdline)) {
- $self->badcount(($self->badcount||0) + @bad);
- LogDbg('DXCommand', "$self->{call} swore: '$cmdline' with badwords: '" . join(',', @bad) . "'");
- } else {
+# if (@bad = BadWords::check($cmdline)) {
+# $self->badcount(($self->badcount||0) + @bad);
+# LogDbg('DXCommand', "$self->{call} swore: '$cmdline' with badwords: '" . join(',', @bad) . "'");
+# } else {
$self->send_ans(run_cmd($self, $cmdline));
- }
+# }
}
# check for excessive swearing
my $msgid = DXProt::nextchatmsgid();
$text = "#$msgid $text";
- $main::me->normal(DXProt::pc93($target, $self->{call}, undef, $text));
+ my $ipaddr = alias_localhost($self->hostname || '127.0.0.1');
+ $main::me->normal(DXProt::pc93($target, $self->{call}, undef, $text, undef, $ipaddr));
}
sub special_prompt
if ($cmd) {
- # check cmd
- if ($cmd =~ m|^/| || $cmd =~ m|[^-?\w/]|) {
+ # strip out // on command only
+ $cmd =~ s|//+|/|g;
+
+ # check for length of whole command line and any invalid characters
+ if (length $cmdline > $maxcmdlth || $cmd =~ m|\.| || $cmd !~ m|^\w+(?:/\w+){0,1}(?:/\d+)?$|) {
LogDbg('DXCommand', "cmd: $self->{call} - invalid characters in '$cmd'");
- return $self->_error_out('e1');
+ return $self->_error_out('e40');
}
- # strip out // on command only
- $cmd =~ s|//|/|g;
-
my ($path, $fcmd);
dbg("cmd: $cmd") if isdbg('command');
return $self->_error_out('e1');
}
} else {
- dbg("cmd: $cmd not found") if isdbg('command');
+ LogDbg('DXCommand', "$self->{call} cmd: '$cmd' not found");
return $self->_error_out('e1');
}
}
}
# send a prompt if no activity out on this channel
- if ($t >= $dxchan->t + $main::user_interval) {
+ if ($t >= $dxchan->t + $dxchan->{user_interval}) {
$dxchan->prompt() if $dxchan->{state} =~ /^prompt/o;
$dxchan->t($t);
}
# issue a pc17 to everybody interested
$main::me->route_pc17($main::mycall, undef, $main::routeroot, $uref);
- $main::me->route_pc92d($main::mycall, undef, $main::routeroot, $uref) unless $DXProt::pc92_slug_changes;
+ $main::me->route_pc92d($main::mycall, undef, $main::routeroot, $uref) unless $DXProt::pc92_slug_changes || ! $DXProt::pc92_ad_enable;
} else {
confess "trying to disconnect a non existant user $call";
}
$c =~ s/\t/ /g;
my $comment = substr (($c || ''), 0, $clth);
$comment .= ' ' x ($clth - (length($comment)));
-
- if (!$slot1 && $self->{user}->wantgrid) {
- my $ref = DXUser::get_current($_[1]);
- if ($ref && $ref->qra) {
- $slot1 = ' ' . substr($ref->qra, 0, 4);
+
+ if ($self->{user}) { # to allow the standalone program 'showdx' to work
+ if (!$slot1 && $self->{user}->wantgrid) {
+ my $ref = DXUser::get_current($_[1]);
+ if ($ref && $ref->qra) {
+ $slot1 = ' ' . substr($ref->qra, 0, 4);
+ }
}
- }
- if (!$slot1 && $self->{user}->wantusstate) {
- $slot1 = " $_[12]" if $_[12];
- }
- unless ($slot1) {
- if ($self->{user}->wantdxitu) {
- $slot1 = sprintf(" %2d", $_[8]) if defined $_[8];
- } elsif ($self->{user}->wantdxcq) {
- $slot1 = sprintf(" %2d", $_[9]) if defined $_[9];
+ if (!$slot1 && $self->{user}->wantusstate) {
+ $slot1 = " $_[12]" if $_[12];
}
- }
- $comment = substr($comment, 0, $clth-length($slot1)) . $slot1 if $slot1;
+ unless ($slot1) {
+ if ($self->{user}->wantdxitu) {
+ $slot1 = sprintf(" %2d", $_[8]) if defined $_[8];
+ }
+ elsif ($self->{user}->wantdxcq) {
+ $slot1 = sprintf(" %2d", $_[9]) if defined $_[9];
+ }
+ }
+ $comment = substr($comment, 0, $clth-length($slot1)) . $slot1 if $slot1;
- if (!$slot2 && $self->{user}->wantgrid) {
- my $origin = $_[4];
- $origin =~ s/-#$//; # sigh......
- my $ref = DXUser::get_current($origin);
- if ($ref && $ref->qra) {
- $slot2 = ' ' . substr($ref->qra, 0, 4);
+ if (!$slot2 && $self->{user}->wantgrid) {
+ my $origin = $_[4];
+ $origin =~ s/-#$//; # sigh......
+ my $ref = DXUser::get_current($origin);
+ if ($ref && $ref->qra) {
+ $slot2 = ' ' . substr($ref->qra, 0, 4);
+ }
}
- }
- if (!$slot2 && $self->{user}->wantusstate) {
- $slot2 = " $_[13]" if $_[13];
- }
- unless ($slot2) {
- if ($self->{user}->wantdxitu) {
- $slot2 = sprintf(" %2d", $_[10]) if defined $_[10];
- } elsif ($self->{user}->wantdxcq) {
- $slot2 = sprintf(" %2d", $_[11]) if defined $_[11];
+ if (!$slot2 && $self->{user}->wantusstate) {
+ $slot2 = " $_[13]" if $_[13];
+ }
+ unless ($slot2) {
+ if ($self->{user}->wantdxitu) {
+ $slot2 = sprintf(" %2d", $_[10]) if defined $_[10];
+ }
+ elsif ($self->{user}->wantdxcq) {
+ $slot2 = sprintf(" %2d", $_[11]) if defined $_[11];
+ }
}
}
no strict 'refs';
# just behave normally if something has set the "one-shot" _nospawn in the channel
- if ($self->{_nospawn}) {
+ if ($self->{_nospawn} || $main::is_win == 1) {
eval { @out = $cmdref->(@$args); };
if ($@) {
DXDebug::dbgprintring(25);
return ($users, $maxusers);
}
+# alias localhost if required. This is designed to repress all localhost and other
+# internal interfaces to a fixed (outside) IPv4 or IPV6 address
+sub alias_localhost
+{
+ my $hostname = shift;
+ if ($hostname =~ /./) {
+ return $hostname unless $main::localhost_alias_ipv4;
+ return (grep $hostname eq $_, @main::localhost_names) ? $main::localhost_alias_ipv4 : $hostname;
+ } elsif ($hostname =~ /:/) {
+ return $hostname unless $main::localhost_alias_ipv6;
+ return (grep $hostname eq $_, @main::localhost_names) ? $main::localhost_alias_ipv6 : $hostname;
+ }
+ return $hostname;
+}
+
1;
__END__