use strict;
use vars qw(%Cache %cmd_cache $errstr %aliases $scriptbase %nothereslug
$maxbadcount $msgpolltime $default_pagelth $cmdimportdir $users $maxusers
+ $maxcmdlth
);
%Cache = (); # cache of dynamically loaded routine's mod times
$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
#
}
$self->lastmsgpoll($main::systime);
+ $self->{user_interval} = $self->user->user_interval || $main::user_interval; # allow user to change idle time between prompts
$self->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);
}
$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);