--- loncom/lond 2004/08/09 10:34:18 1.225 +++ loncom/lond 2004/08/16 10:54:19 1.229 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.225 2004/08/09 10:34:18 foxr Exp $ +# $Id: lond,v 1.229 2004/08/16 10:54:19 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -57,7 +57,7 @@ my $DEBUG = 0; # Non zero to ena my $status=''; my $lastlog=''; -my $VERSION='$Revision: 1.225 $'; #' stupid emacs +my $VERSION='$Revision: 1.229 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -162,8 +162,6 @@ sub ResetStatistics { $Failures = 0; } - - #------------------------------------------------------------------------ # # LocalConnection @@ -372,7 +370,6 @@ sub isClient { # - This allows dynamic changes to the manager table # without the need to signal to the lond. # - sub ReadManagerTable { # Clean out the old table first.. @@ -1743,7 +1740,8 @@ sub update_resource_handler { ®ister_handler("update", \&update_resource_handler, 0 ,1, 0); # -# Fetch a user file from a remote server: +# Fetch a user file from a remote server to the user's home directory +# userfiles subdir. # Parameters: # $cmd - The command that got us here. # $tail - Tail of the command (remaining parameters). @@ -1798,6 +1796,113 @@ sub fetch_user_file_handler { } ®ister_handler("fetchuserfile", \&fetch_user_file_handler, 0, 1, 0); +# +# Remove a file from a user's home directory userfiles subdirectory. +# Parameters: +# cmd - the Lond request keyword that got us here. +# tail - the part of the command past the keyword. +# client- File descriptor connected with the client. +# +# Returns: +# 1 - Continue processing. + +sub remove_user_file_handler { + my ($cmd, $tail, $client) = @_; + + my ($fname) = split(/:/, $tail); # Get rid of any tailing :'s lonc may have sent. + + my ($udom,$uname,$ufile) = ($fname =~ m|^([^/]+)/([^/]+)/(.+)$|); + if ($ufile =~m|/\.\./|) { + # any files paths with /../ in them refuse + # to deal with + &Failure($client, "refused\n", "$cmd:$tail"); + } else { + my $udir = &propath($udom,$uname); + if (-e $udir) { + my $file=$udir.'/userfiles/'.$ufile; + if (-e $file) { + unlink($file); + if (-e $file) { + &Failure($client, "failed\n", "$cmd:$tail"); + } else { + &Reply($client, "ok\n", "$cmd:$tail"); + } + } else { + &Failure($client, "not_found\n", "$cmd:$tail"); + } + } else { + &Failure($client, "not_home\n", "$cmd:$tail"); + } + } + return 1; +} +®ister_handler("removeuserfile", \&remove_user_file_handler, 0,1,0); + + +# +# Authenticate access to a user file by checking the user's +# session token(?) +# +# Parameters: +# cmd - The request keyword that dispatched to tus. +# tail - The tail of the request (colon separated parameters). +# client - Filehandle open on the client. +# Return: +# 1. + +sub token_auth_user_file_handler { + my ($cmd, $tail, $client) = @_; + + my ($fname, $session) = split(/:/, $tail); + + chomp($session); + my $reply='non_auth'; + if (open(ENVIN,$perlvar{'lonIDsDir'}.'/'. + $session.'.id')) { + while (my $line=) { + if ($line=~ m|userfile\.\Q$fname\E\=|) { $reply='ok'; } + } + close(ENVIN); + &Reply($client, $reply); + } else { + &Failure($client, "invalid_token\n", "$cmd:$tail"); + } + return 1; + +} + +®ister_handler("tokenauthuserfile", \&token_auth_user_file_handler, 0,1,0); + + +# +# Unsubscribe from a resource. +# +# Parameters: +# $cmd - The command that got us here. +# $tail - Tail of the command (remaining parameters). +# $client - File descriptor connected to client. +# Returns +# 0 - Requested to exit, caller should shut down. +# 1 - Continue processing. +# +sub unsubscribe_handler { + my ($cmd, $tail, $client) = @_; + + my $userinput= "$cmd:$tail"; + + my ($fname) = split(/:/,$tail); # Split in case there's extrs. + + &Debug("Unsubscribing $fname"); + if (-e $fname) { + &Debug("Exists"); + &Reply($client, &unsub($fname,$clientip), $userinput); + } else { + &Failure($client, "not_found\n", $userinput); + } + return 1; +} +®ister_handler("unsub", \&unsubscribe_handler, 0, 1, 0); + #--------------------------------------------------------------- # # Getting, decoding and dispatching requests: @@ -1808,11 +1913,11 @@ sub fetch_user_file_handler { # Gets a Request message from the client. The transaction # is defined as a 'line' of text. We remove the new line # from the text line. -# +# sub get_request { my $input = <$client>; chomp($input); -j + Debug("get_request: Request = $input\n"); &status('Processing '.$clientname.':'.$input); @@ -1912,72 +2017,10 @@ sub process_request { #------------------- Commands not yet in spearate handlers. -------------- -# --------------------------------------------------------- remove a user file - if ($userinput =~ /^removeuserfile/) { # Client clear or enc. - if(isClient) { - my ($cmd,$fname)=split(/:/,$userinput); - my ($udom,$uname,$ufile) = ($fname =~ m|^([^/]+)/([^/]+)/(.+)$|); - &logthis("$udom - $uname - $ufile"); - if ($ufile =~m|/\.\./|) { - # any files paths with /../ in them refuse - # to deal with - print $client "refused\n"; - } else { - my $udir=propath($udom,$uname); - if (-e $udir) { - my $file=$udir.'/userfiles/'.$ufile; - if (-e $file) { - unlink($file); - if (-e $file) { - print $client "failed\n"; - } else { - print $client "ok\n"; - } - } else { - print $client "not_found\n"; - } - } else { - print $client "not_home\n"; - } - } - } else { - Reply($client, "refused\n", $userinput); - } -# ------------------------------------------ authenticate access to a user file - } elsif ($userinput =~ /^tokenauthuserfile/) { # Client only - if(isClient) { - my ($cmd,$fname,$session)=split(/:/,$userinput); - chomp($session); - my $reply='non_auth'; - if (open(ENVIN,$perlvar{'lonIDsDir'}.'/'. - $session.'.id')) { - while (my $line=) { - if ($line=~ m|userfile\.\Q$fname\E\=|) { $reply='ok'; } - } - close(ENVIN); - print $client $reply."\n"; - } else { - print $client "invalid_token\n"; - } - } else { - Reply($client, "refused\n", $userinput); - - } -# ----------------------------------------------------------------- unsubscribe - } elsif ($userinput =~ /^unsub/) { - if(isClient) { - my ($cmd,$fname)=split(/:/,$userinput); - if (-e $fname) { - print $client &unsub($fname,$clientip); - } else { - print $client "not_found\n"; - } - } else { - Reply($client, "refused\n", $userinput); - - } + + # ------------------------------------------------------------------- subscribe - } elsif ($userinput =~ /^sub/) { + if ($userinput =~ /^sub/) { if(isClient) { print $client &subscribe($userinput,$clientip); } else { @@ -3104,7 +3147,6 @@ sub register_handler { $Dispatcher{$request_name} = \@entry; - } @@ -3151,7 +3193,6 @@ sub catchexception { $server->close(); die($error); } - sub timeout { &status("Handling Timeout"); &logthis("CRITICAL: TIME OUT ".$$.""); @@ -3159,6 +3200,7 @@ sub timeout { } # -------------------------------- Set signal handlers to record abnormal exits + $SIG{'QUIT'}=\&catchexception; $SIG{__DIE__}=\&catchexception;