version 1.212, 2004/07/27 10:25:07
|
version 1.213, 2004/07/27 10:50:37
|
Line 1079 sub process_request {
|
Line 1079 sub process_request {
|
} |
} |
Debug("process_request: $userinput\n"); |
Debug("process_request: $userinput\n"); |
|
|
|
# |
|
# The 'correct way' to add a command to lond is now to |
|
# write a sub to execute it and Add it to the command dispatch |
|
# hash via a call to register_handler.. The comments to that |
|
# sub should give you enough to go on to show how to do this |
|
# along with the examples that are building up as this code |
|
# is getting refactored. Until all branches of the |
|
# if/elseif monster below have been factored out into |
|
# separate procesor subs, if the dispatch hash is missing |
|
# the command keyword, we will fall through to the remainder |
|
# of the if/else chain below in order to keep this thing in |
|
# working order throughout the transmogrification. |
|
|
|
my ($command, $tail) = split(/:/, $userinput, 2); |
|
chomp($command); |
|
chomp($tail); |
|
$tail =~ s/(\r)//; # This helps people debugging with e.g. telnet. |
|
|
|
&Debug("Command received: $command, encoded = $wasenc"); |
|
|
|
if(defined $Dispatcher{$command}) { |
|
|
|
my $dispatch_info = $Dispatcher{$command}; |
|
my $handler = $$dispatch_info[0]; |
|
my $need_encode = $$dispatch_info[1]; |
|
my $client_types = $$dispatch_info[2]; |
|
Debug("Matched dispatch hash: mustencode: $need_encode " |
|
."ClientType $client_types"); |
|
|
|
# Validate the request: |
|
|
|
my $ok = 1; |
|
my $requesterprivs = 0; |
|
if(&isClient()) { |
|
$requesterprivs |= $CLIENT_OK; |
|
} |
|
if(&isManager()) { |
|
$requesterprivs |= $MANAGER_OK; |
|
} |
|
if($need_encode && (!$wasenc)) { |
|
Debug("Must encode but wasn't: $need_encode $wasenc"); |
|
$ok = 0; |
|
} |
|
if(($client_types & $requesterprivs) == 0) { |
|
Debug("Client not privileged to do this operation"); |
|
$ok = 0; |
|
} |
|
|
|
if($ok) { |
|
Debug("Dispatching to handler $command $tail"); |
|
my $keep_going = &$handler($command, $tail, $client); |
|
return $keep_going; |
|
} else { |
|
Debug("Refusing to dispatch because client did not match requirements"); |
|
Failure($client, "refused\n", $userinput); |
|
return 1; |
|
} |
|
|
|
} |
|
|
# ------------------------------------------------------------- Normal commands |
# ------------------------------------------------------------- Normal commands |
# ------------------------------------------------------------------------ ping |
# ------------------------------------------------------------------------ ping |
if ($userinput =~ /^ping/) { # client only |
if ($userinput =~ /^ping/) { # client only |