File:
[LON-CAPA] /
loncom /
publisher /
loncfile.pm
Revision
1.15:
download - view:
text,
annotated -
select for diffs
Sat Aug 24 03:56:58 2002 UTC (22 years ago) by
foxr
Branches:
MAIN
CVS tags:
HEAD
Bug 442: Two issues with special chars. solved here:
1. spaces in names - escape works fine on this issue.
2. apostrophe's in uploaded file names:
Apostrophe solution not so easy as spaces: The problem was in the
Frame src tag for the lower frame of construction space.. it's of the form:
<frame> src='$lowerframe' ...Thanks to matt for finding this.
The embedded ' closes the src from the point of view of the html. Amazingly the
extra characters don't cause browsers to complain. The problem: demonstrably,
escaping via lonnet::escape does nothing worth while. Using my handy dandy
html pocket guide, I determined that lonnet::escape is too simple minded
and may in fact be not quite right. did a:
1. made the quotations " rather than '
2. Substituted for " in $lowerframe by:
$lowerframe=~s/\"/"\;/g;
Turning " -> " as per the entity chart on pg 82 of HTML Pocket ref.
This works fine.
# The LearningOnline Network with CAPA
# Handler to rename files, etc, in construction space
#
# This file responds to the various buttons and events
# in the top frame of the construction space directory.
# Each event is processed in two phases. The first phase
# presents a page that describes the proposed action to the user
# and requests confirmation. The second phase commits the action
# and displays a page showing the results of the action.
#
#
# $Id: loncfile.pm,v 1.15 2002/08/24 03:56:58 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
#
# (Handler to retrieve an old version of a file
#
# (Publication Handler
#
# (TeX Content Handler
#
# 05/29/00,05/30,10/11 Gerd Kortemeyer)
#
# 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer
# 03/23 Guy Albertelli
# 03/24,03/29 Gerd Kortemeyer)
#
# 03/31,04/03,05/02,05/09,06/23,06/24 Gerd Kortemeyer)
#
# 06/23 Gerd Kortemeyer
# 05/07/02 Ron Fox:
# - Added Debug log output so that I can trace what the heck this
# undocumented thingy does.
# 05/28/02 Ron Fox:
# - Started putting in pod in standard format.
=pod
=head1 NAME
Apache::loncfile - Construction space file management.
=head1 SYNOPSIS
Content handler for buttons on the top frame of the construction space
directory.
=head1 INTRODUCTION
loncfile is invoked when buttons in the top frame of the construction
space directory listing are clicked. All operations procede in two phases.
The first phase describes to the user exactly what will be done. If the user
confirms the operation, the second phase commits the operation and indicates
completion. When the user dismisses the output of phase2, they are returned to
an "appropriate" directory listing in general.
This is part of the LearningOnline Network with CAPA project
described at http://www.lon-capa.org.
=head2 Subroutines
=cut
package Apache::loncfile;
use strict;
use Apache::File;
use File::Basename;
use File::Copy;
use Apache::Constants qw(:common :http :methods);
use Apache::loncacc;
use Apache::Log ();
use Apache::lonnet;
my $DEBUG=0;
my $r; # Needs to be global for some stuff RF.
=pod
=item Debug($request, $message)
If debugging is enabled puts out a debuggin message determined by the
caller. The debug message goes to the Apache error log file. Debugging
is enabled by ssetting the module global DEBUG variable to nonzero (TRUE).
Parameters:
=over 4
=item $request - The curretn request operation.
=item $message - The message to put inthe log file.
=back
Returns:
nothing.
=cut
sub Debug {
# Marshall the parameters.
my $r = shift;
my $log = $r->log;
my $message = shift;
# Put out the indicated message butonly if DEBUG is false.
if ($DEBUG) {
$log->debug($message);
}
}
=pod
=item URLToPath($url)
Convert a URL to a file system path.
In order to manipulate the construction space objects, it is necessary
to access url identified objects a filespace objects. This function
translates a construction space URL to a file system path.
Parameters:
=over 4
=item Url - string [in] The url to convert.
=back
Returns:
=over 4
=item The corresponing file system path.
=back
Global References
=over 4
=item $r - Request object [in] Referenced in the &Debug calls.
=back
=cut
sub URLToPath {
my $Url = shift;
&Debug($r, "UrlToPath got: $Url");
$Url=~ s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
$Url=~ s/^http\:\/\/[^\/]+//;
&Debug($r, "Returning $Url \n");
return $Url;
}
=pod
=item PublicationPath($domain, $user, $dir, $file)
Determines the filesystem path corersponding to a published resource
specification. The returned value is the path.
Parameters:
=over 4
=item $domain - string [in] Name of the domain within which the resource is
stored.
=item $user - string [in] Name of the user asking about the resource.
=item $dir - Directory pathr elatvie to the top of the resource space0
=item $file - name of the resource file itself without path info.
=back
=over 4
Returns:
=item string - full path to the file if it exists in publication space.
=back
=cut
sub PublicationPath
{
my ($domain, $user, $dir, $file)=@_;
return '/home/httpd/html/res/'.$domain.'/'.$user.'/'.$dir.'/'.
$file;
}
=pod
=item ConstructionPath($domain, $user, $dir, $file)
Determines the filesystem path corersponding to a construction space
resource specification. The returned value is the path
Parameters:
=over 4
=item $user - string [in] Name of the user asking about the resource.
=item $dir - Directory path relatvie to the top of the resource space
=item $file - name of the resource file itself without path info.
Returns:
=item string - full path to the file if it exists in Construction space.
=back
=cut
sub ConstructionPath {
my ($user, $dir, $file) = @_;
return '/home/'.$user.'/public_html/'.$dir.'/'.$file;
}
=pod
=item ConstructionPathFromRelative($user, $relname)
Determines the path to a construction space file given
the username and the path relative to the root of construction space.
Parameters:
=over 4
=item $user - string [in] Name of the user in whose construction space the
file [will] live.
=item $relname - string[in] Path to the file relative to the root of the
construction space.
=back
Returns:
=over 4
=item string - Full path to the file.
=back
=cut
sub ConstructionPathFromRelative {
my ($user, $relname) = @_;
return '/home/'.$user.'/public_html'.$relname;
}
=pod
=item exists($user, $domain, $directory, $file)
Determine if a resource file name has been publisehd or exists
in the construction space.
Parameters:
=over 4
=item $user - string [in] - Name of the user for which to check.
=item $domain - string [in] - Name of the domain in which the resource
might have been published.
=item $dir - string [in] - Path relative to construction or resource space
in which the resource might live.
=item $file - string [in] - Name of the file.
=back
Returns:
=over 4
=item string - Either where the resource exists as an html string that can
be embedded in a dialog or an empty string if the resource
does not exist.
=back
=cut
sub exists {
my ($user, $domain, $dir, $file) = @_;
# Create complete paths in publication and construction space.
my $published = &PublicationPath($domain, $user, $dir, $file);
my $construct = &ConstructionPath($user, $dir, $file);
# If the resource exists in either space indicate this fact.
# Note that the check for existence in resource space is stricter.
my $result;
if ( -e $published) {
$result.='<p><font color=red>Warning: target file exists, and has been published!</font></p>';
}
elsif ( -e $construct) {
$result.='<p><font color=red>Warning: target file exists!</font></p>';
}
return $result;
}
=pod
=item checksuffix($old, $new)
Determine if a resource filename suffix (the stuff after the .) would change
as a result of this operation.
Parameters:
=over 4
=item $old = string [in] Previous filename.
=item $new = string [in] Resultant filename.
=back
Returns:
=over 4
=item Empty string if everythikng worked.
=item String containing an error message if there was a problem.
=back
=cut
sub checksuffix {
my ($old,$new) = @_;
my $result;
my $oldsuffix;
my $newsuffix;
if ($new=~m:(.*/*)([^/]+)\.(\w+)$:) { $newsuffix=$3; }
if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }
if ($oldsuffix ne $newsuffix) {
$result.=
'<p><font color=red>Warning: change of MIME type!</font></p>';
}
return $result;
}
=pod
=item CloseForm1($request, $user, $file)
Close of a form on the successful completion of phase 1 processing
Parameters:
=over 4
=item $request - Apache Request Object [in] - Apache server request object.
=item $cancelurl - the url to go to on cancel.
=back
=cut
sub CloseForm1 {
my ($request, $cancelurl) = @_;
&Debug($request, "Cancel url is: ".$cancelurl);
$request->print('<p><input type=submit value=Continue></p></form>');
$request->print('<form action="'.$cancelurl.
'" method=GET"><p><input type=submit value=Cancel><p></form>');
}
=pod
=item CloseForm2($request, $user, $directory)
Successfully close off the phase 2 form.
Parameters:
=over 4
=item $request - Apache Request object [in] - The request that is being
executed.
=item $user - string [in] - Name of the user that is initiating the
request.
=item $directory - string [in] - Directory in which the operation is
being done relative to the top level construction space
directory.
=back
=cut
sub CloseForm2 {
my ($request, $user, $directory) = @_;
$request->print('<h3><a=href="/priv/'.$user.$directory.'/">Done </a> </h3>');
}
=pod
=item Rename1($request, $filename, $user, $domain, $dir)
Perform phase 1 processing of the file rename operation.
Parameters:
=over 4
=item $request - Apache Request Object [in] The request object for the
current request.
=item $filename - The filename relative to construction space.
=item $user - Name of the user making the request.
=item $domain - User login domain.
=item $dir - Directory specification of the path to the file.
=back
Side effects:
=over 4
=item A new form is displayed prompting for confirmation. The newfilename
hidden field of this form is loaded with
new filename relative to the current directory ($dir).
=back
=cut
sub Rename1 {
my ($request, $filename, $user, $domain, $dir) = @_;
&Debug($request, "Username - ".$user." filename: ".$filename."\n");
my $conspace = $filename;
my $cancelurl = "/priv/".$filename;
$cancelurl =~ s/\/home\///;
$cancelurl =~ s/\/public_html//;
if(-e $conspace) {
if($ENV{'form.newfilename'}) {
my $newfilename = $ENV{'form.newfilename'};
$request->print(&checksuffix($filename, $newfilename));
$request->print(&exists($user, $domain, $dir, $newfilename));
$request->print('<input type=hidden name=newfilename value="'.
$newfilename.
'"><p>Rename <tt>'.$filename.'</tt> to <tt>'.
$dir.'/'.$newfilename.'</tt>?</p>');
&CloseForm1($request, $cancelurl);
} else {
$request->print('<p>No new filename specified</p></form>');
return;
}
} else {
$request->print('<p> No such File </p> </form>');
return;
}
}
=pod
=item Delete1
Performs phase 1 processing of the delete operation. In phase one
we just check to be sure the file exists.
Parameters:
=over 4
=item $request - Apache Request Object [in] request object for the current
request.
=item $user - string [in] Name of session user.
=item $filename - string [in] Name fo the file to be deleted:
Filename is the full filesystem path to the file.
=back
=cut
sub Delete1 {
my ($request, $user, $filename) = @_;
my $cancelurl = '/priv/'.$filename;
$cancelurl =~ s/\/home\///;
$cancelurl =~ s/\/public_html//;
if( -e $filename) {
$request->print('<input type=hidden name=newfilename value="'.
$filename.'">');
$request->print('<p> Delete <tt>'.$filename.'</tt>?</p>');
&CloseForm1($request, $cancelurl);
} else {
$request->print('<p> No Such file: <tt>'.$filename.'</tt></p></form>');
}
}
=pod
=item Copy1($request, $user, $domain, $filename, $newfilename)
Performs phase 1 processing of the construction space copy command.
Ensure that the source fil eexists. Ensure that a destination exists,
also warn if the detination already exists.
Parameters:
=over 4
=item $request - Apache Request Object [in] request object for the current
request.
=item $user - string [in] Name of the user initiating the request.
=item $domain - string [in] Domain the initiating user is logged in as
=item $dir - string [in] Directory path.
=item $filename - string [in] Source filename.
=item $newfilename-string [in] Destination filename.
=back
=cut
sub Copy1 {
my ($request, $user, $domain, $dir, $filename, $newfilename) = @_;
my $cancelurl = "/priv/".$filename;
$cancelurl =~ s/\/home\///;
$cancelurl =~ s/\/public_html//;
if(-e $filename) {
$request->print(&checksuffix($filename,$newfilename));
$request->print(&exists($user, $domain, $dir, $newfilename));
$request->print('<input type = hidden name = newfilename value = "'.
$dir.'/'.$newfilename.
'"><p>Copy <tt>'.$filename.'</tt> to'.
'<tt>'.$dir.'/'.$newfilename.'</tt>/?</p>');
&CloseForm1($request, $cancelurl);
} else {
$request->print('<p>No such file <tt>'.$filename.'</p></form>');
}
}
=pod
=item NewDir1
Does all phase 1 processing of directory creation:
Ensures that the user provides a new directory name,
and that the directory does not already exist.
Parameters:
=over 4
=item $request - Apache Request Object [in] - Server request object for the
current url..
=item $username - Name of the user that is requesting the directory creation.
=item $path - current directory relative to construction spacee.
=item $newdir - Name of the directory to be created; path relative to the
top level of construction space.
=back
Side Effects:
=over 4
=item A new form is displayed. Clicking on the confirmation button
causes the newdir operation to transition into phase 2. The hidden field
"newfilename" is set with the construction space path to the new directory.
=back
=cut
sub NewDir1
{
my ($request, $username, $path, $newdir) = @_;
my $fullpath = '/home/'.$username.'/public_html/'.
$path.'/'.$newdir;
my $cancelurl = '/priv/'.$username.'/'.$path;
&Debug($request, "Full path is : ".$fullpath);
if(-e $fullpath) {
$request->print('<p>Directory exists.</p></form>');
}
else {
$request->print('<input type=hidden name=newfilename value="'.
$newdir.'"><p>Make new directory <tt>'.
$path."/".$newdir.'</tt>?</p>');
&CloseForm1($request, $cancelurl);
}
}
=pod
=item phaseone($r, $fn, $uname, $udom)
Peforms phase one processing of the request. In phase one, error messages
are returned if the request cannot be performed (e.g. attempts to manipulate
files that are nonexistent). If the operation can be performed, what is
about to be done will be presented to the user for confirmation. If the
user confirms the request, then phase two is executed, the action
performed and reported to the user.
Parameters:
=over 4
=item $r - request object [in] - The Apache request being executed.
=item $fn = string [in] - The filename being manipulated by the
request.
=item $uname - string [in] Name of user logged in and doing this action.
=item $udom - string [in] Domain nmae under which the user logged in.
=back
=cut
sub phaseone {
my ($r,$fn,$uname,$udom)=@_;
$fn=~m:(.*)/([^/]+)\.(\w+)$:;
my $dir=$1;
my $main=$2;
my $suffix=$3;
# my $conspace=ConstructionPathFromRelative($uname, $fn);
$r->print('<form action=/adm/cfile method=post>'.
'<input type=hidden name=filename value="/~'.$uname.$fn.'">'.
'<input type=hidden name=phase value=two>'.
'<input type=hidden name=action value='.$ENV{'form.action'}.'>');
if ($ENV{'form.action'} eq 'rename') {
&Rename1($r, $fn, $uname, $udom, $dir);
} elsif ($ENV{'form.action'} eq 'delete') {
&Delete1($r, $uname, $fn);
} elsif ($ENV{'form.action'} eq 'copy') {
if($ENV{'form.newfilename'}) {
my $newfilename = $ENV{'form.newfilename'};
&Copy1($r, $uname, $udom, $dir, $fn, $newfilename);
}else {
$r->print('<p>No new filename specified.</p></form>');
}
} elsif ($ENV{'form.action'} eq 'newdir') {
&NewDir1($r, $uname, $dir, $ENV{'form.newfilename'});
}
}
=pod
=item Rename2($request, $user, $directory, $oldfile, $newfile)
Performs phase 2 procesing of a rename reequest. This is where the
actual rename is performed.
Parameters
=over 4
=item $request - Apache request object [in] The request being processed.
=item $user - string [in] The name of the user initiating the request.
=item $directory - string [in] The name of the directory relative to the
construction space top level of the renamed file.
=item $oldfile - Name of the file.
=item $newfile - Name of the new file.
=back
Returns:
=over 4
=item 1 Success.
=item 0 Failure.
=cut
sub Rename2 {
my ($request, $user, $directory, $oldfile, $newfile) = @_;
&Debug($request, "Rename2 directory: ".$directory." old file: ".$oldfile.
" new file ".$newfile."\n");
&Debug($request, "Target is: ".$directory.'/'.
$newfile);
if(-e $oldfile) {
unless(rename($oldfile,
$directory.'/'.$newfile)) {
$request->print('<font color=red>Error: '.$!.'</font>');
return 0;
} else {}
} else {
$request->print("<p> No such file: /home".$user.'/public_html'.
$oldfile.' </p></form>');
return 0;
}
return 1;
}
=pod
=item Delete2($request, $user, $filename)
Performs phase two of a delete. The user has confirmed that they want
to delete the selected file. The file is deleted and the results of the
delete attempt are indicated.
Parameters:
=over 4
=item $request - Apache Request object [in] the request object for the current
delete operation.
=item $user - string [in] The name of the user initiating the delete
request.
=item $filename - string [in] The name of the file, relative to construction space,
to delete.
=back
Returns:
1 - success.
0 - Failure.
=cut
sub Delete2 {
my ($request, $user, $filename) = @_;
if(-e $filename) {
unless(unlink($filename)) {
$request->print('<font color=red>Error: '.$!.'</font>');
return 0;
}
} else {
$request->print('<p> No such file. </form');
return 0;
}
return 1;
}
=pod
=item Copy2($request, $username, $dir, $oldfile, $newfile)
Performs phase 2 of a copy. The file is copied and the status
of that copy is reported back to the user.
=over 4
=item $request - Apache request object [in]; the apache request currently
being executed.
=item $username - string [in] Name of the user who is requesting the copy.
=item $dir - string [in] Directory path relative to the construction space
of the destination file.
=item $oldfile - string [in] Name of the source file.
=item $newfile - string [in] Name of the destination file.
=back
Returns 0 failure, and 0 successs.
=cut
sub Copy2 {
my ($request, $username, $dir, $oldfile, $newfile) = @_;
&Debug($request ,"Will try to copy $oldfile to $newfile");
if(-e $oldfile) {
unless (copy($oldfile, $newfile)) {
$request->print('<font color=red> copy Error: '.$!.'</font>');
return 0;
} else {
unless (chmod(0660, $newfile)) {
$request->print('<font color=red> chmod error: '.$!.'</font>');
return 0;
}
return 1;
}
} else {
$request->print('<p> No such file </p>');
return 0;
}
return 1;
}
=pod
=item NewDir2($request, $user, $newdirectory)
Performs phase 2 processing of directory creation. This involves creating the directory and
reporting the results of that creation to the user.
Parameters:
=over 4
=item $request - Apache request object [in]. Object representing the current HTTP request.
=item $user - string [in] The name of the user that is initiating the request.
=item $newdirectory - string [in] The full path of the directory being created.
=back
Returns 0 - failure 1 - success.
=cut
sub NewDir2 {
my ($request, $user, $newdirectory) = @_;
unless(mkdir($newdirectory, 02770)) {
$request->print('<font color=red>Error: '.$!.'</font>');
return 0;
}
unless(chmod(02770, ($newdirectory))) {
$request->print('<font color=red> Error: '.$!.'</font>');
return 0;
}
return 1;
}
=pod
=item phasetwo($r, $fn, $uname, $udom)
Controls the phase 2 processing of file management
requests for construction space. In phase one, the user
was asked to confirm the operation. In phase 2, the operation
is performed and the result is shown.
The strategy is to break out the processing into specific action processors
named action2 where action is the requested action and the 2 denotes
phase 2 processing.
Parameters:
=over 4
=item $r - Apache Request object [in] The request object for this httpd
transaction.
=item $fn - string [in] A filename indicating the object that is being
manipulated.
=item $uname - string [in] The name of the user initiating the file management
request.
=item $udom - string [in] The login domain of the user initiating the
file management request.
=back
=cut
sub phasetwo {
my ($r,$fn,$uname,$udom)=@_;
&Debug($r, "loncfile - Entering phase 2 for $fn");
# Break down the file into it's component pieces.
$fn=~/(.*)\/([^\/]+)\.(\w+)$/;
my $dir=$1; # Directory path
my $main=$2; # Filename.
my $suffix=$3; # Extension.
my $dest; # On success this is where we'll go.
&Debug($r,
"loncfile::phase2 dir = $dir main = $main suffix = $suffix");
&Debug($r,
" newfilename = ".$ENV{'form.newfilename'});
my $conspace=$fn;
&Debug($r,
"loncfile::phase2 Full construction space name: $conspace");
&Debug($r,
"loncfie::phase2 action is $ENV{'form.action'}");
# Select the appropriate processing sub.
if ($ENV{'form.action'} eq 'rename') { # Rename.
if($ENV{'form.newfilename'}) {
if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
return;
}
# Prepend the directory to the new name to form the basis of the
# url of the new resource.
#
$dest = $dir."/".$ENV{'form.newfilename'};
}
} elsif ($ENV{'form.action'} eq 'delete') {
if(!&Delete2($r, $uname, $ENV{'form.newfilename'})) {
return ;
}
# Once a resource is deleted, we just list the directory that
# previously held it.
#
$dest = $dir."/"; # Parent dir.
} elsif ($ENV{'form.action'} eq 'copy') {
if($ENV{'form.newfilename'}) {
if(!&Copy2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
return
}
$dest = $ENV{'form.newfilename'};
} else {
$r->print('<p>No New filename specified</form>');
return;
}
} elsif ($ENV{'form.action'} eq 'newdir') {
#
# Since the newfilename form field is construction space
# relative, ew need to prepend the current path; now in $fn.
#
my $newdir= $fn.$ENV{'form.newfilename'};
if(!&NewDir2($r, $uname, $newdir)) {
return;
}
$dest = $newdir."/"
}
#
# Substitute for priv for the first home in $dir to get our
# construction space path.
#
&Debug($r, "Final url is: $dest");
$dest =~ s/\/home\//\/priv\//;
$dest =~ s/\/public_html//;
my $base = &Apache::lonnet::escape(&File::Basename::basename($dest));
my $dpath= &File::Basename::dirname($dest);
$dest = $dpath.'/'.$base;
&Debug($r, "Final url after rewrite: $dest");
$r->print('<h3><a href="'.$dest.'">Done</a></h3>');
}
sub handler {
$r=shift;
&Debug($r, "loncfile.pm - handler entered");
&Debug($r, " filename: ".$ENV{'form.filename'});
&Debug($r, " newfilename: ".$ENV{'form.newfilename'});
my $fn;
if ($ENV{'form.filename'}) {
$fn=$ENV{'form.filename'};
&Debug($r, "loncfile::handler - raw url: $fn");
# $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
# $fn=~s/^http\:\/\/[^\/]+//;
$fn=URLToPath($fn);
&Debug($r, "loncfile::handler - doctored url: $fn");
} else {
&Debug($r, "loncfile::handler - no form.filename");
$r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
' unspecified filename for cfile', $r->filename);
return HTTP_NOT_FOUND;
}
unless ($fn) {
&Debug($r, "loncfile::handler - doctored url is empty");
$r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
' trying to cfile non-existing file', $r->filename);
return HTTP_NOT_FOUND;
}
# ----------------------------------------------------------- Start page output
my $uname;
my $udom;
($uname,$udom)=
&Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));
&Debug($r,
"loncfile::handler constructaccess uname = $uname domain = $udom");
unless (($uname) && ($udom)) {
$r->log_reason($uname.' at '.$udom.
' trying to manipulate file '.$ENV{'form.filename'}.
' ('.$fn.') - not authorized',
$r->filename);
return HTTP_NOT_ACCEPTABLE;
}
$fn=~s/\/\~(\w+)//;
&Debug($r, "loncfile::handler ~ removed filename: $fn");
$r->content_type('text/html');
$r->send_http_header;
$r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
$r->print(
'<body bgcolor="#FFFFFF"><img align=right src=/adm/lonIcons/lonlogos.gif>');
$r->print('<h1>Construction Space <tt>'.$fn.'</tt></h1>');
if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
$r->print('<h3><font color=red>Co-Author: '.$uname.' at '.$udom.
'</font></h3>');
}
&Debug($r, "loncfile::handler Form action is $ENV{'form.action'} ");
if ($ENV{'form.action'} eq 'delete') {
$r->print('<h3>Delete</h3>');
} elsif ($ENV{'form.action'} eq 'rename') {
$r->print('<h3>Rename</h3>');
} elsif ($ENV{'form.action'} eq 'newdir') {
$r->print('<h3>New Directory</h3>');
} elsif ($ENV{'form.action'} eq 'copy') {
$r->print('<h3>Copy</h3>');
} else {
$r->print('<p>Unknown Action</body></html>');
return OK;
}
if ($ENV{'form.phase'} eq 'two') {
&Debug($r, "loncfile::handler entering phase2");
&phasetwo($r,$fn,$uname,$udom);
} else {
&Debug($r, "loncfile::handler entering phase1");
&phaseone($r,$fn,$uname,$udom);
}
$r->print('</body></html>');
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>