Diff for /loncom/publisher/loncfile.pm between versions 1.13 and 1.58

version 1.13, 2002/07/29 01:55:51 version 1.58, 2004/07/02 08:07:17
Line 8 Line 8
 #  and requests confirmation.  The second phase commits the action  #  and requests confirmation.  The second phase commits the action
 #  and displays a page showing the results of the action.  #  and displays a page showing the results of the action.
 #  #
   
 #  #
 # $Id$  # $Id$
 #  #
Line 34 Line 33
 #  #
 # http://www.lon-capa.org/  # 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  =pod
   
 =head1 NAME  =head1 NAME
Line 69  directory. Line 47  directory.
 =head1 INTRODUCTION  =head1 INTRODUCTION
   
   loncfile is invoked when buttons in the top frame of the construction     loncfile is invoked when buttons in the top frame of the construction 
 space directory listing are clicked.   All operations procede in two phases.  space directory listing are clicked.   All operations proceed in two phases.
 The first phase describes to the user exactly what will be done.  If the user  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  confirms the operation, the second phase commits the operation and indicates
 completion.  When the user dismisses the output of phase2, they are returned to  completion.  When the user dismisses the output of phase2, they are returned to
Line 86  package Apache::loncfile; Line 64  package Apache::loncfile;
   
 use strict;  use strict;
 use Apache::File;  use Apache::File;
   use File::Basename;
 use File::Copy;  use File::Copy;
   use HTML::Entities();
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  use Apache::loncacc;
 use Apache::Log ();  use Apache::Log ();
   use Apache::lonnet;
   use Apache::loncommon();
   use Apache::lonlocal;
   
 my $DEBUG=0;  my $DEBUG=0;
 my $r; # Needs to be global for some stuff RF.  my $r; # Needs to be global for some stuff RF.
Line 98  my $r;    # Needs to be global for some Line 81  my $r;    # Needs to be global for some
   
 =item Debug($request, $message)  =item Debug($request, $message)
   
   If debugging is enabled puts out a debuggin message determined by the    If debugging is enabled puts out a debugging message determined by the
   caller.  The debug message goes to the Apache error log file. Debugging    caller.  The debug message goes to the Apache error log file. Debugging
   is enabled by ssetting the module global DEBUG variable to nonzero (TRUE).    is enabled by setting the module global DEBUG variable to nonzero (TRUE).
   
  Parameters:   Parameters:
   
 =over 4  =over 4
     
 =item $request - The curretn request operation.  =item $request - The current request operation.
   
 =item $message - The message to put inthe log file.  =item $message - The message to put in the log file.
   
 =back  =back
       
Line 119  my $r;    # Needs to be global for some Line 102  my $r;    # Needs to be global for some
   
 sub Debug {  sub Debug {
       
   # Marshall the parameters.      # Marshall the parameters.
       
   my $r       = shift;      my $r       = shift;
   my $log     = $r->log;      my $log     = $r->log;
   my $message = shift;      my $message = shift;
       
   # Put out the indicated message butonly if DEBUG is false.      # Put out the indicated message butonly if DEBUG is true.
       
   if ($DEBUG) {      if ($DEBUG) {
     $log->debug($message);   $r->log_reason($message);
   }      }
 }  }
   
 =pod  =pod
Line 153  sub Debug { Line 136  sub Debug {
   
 =over 4  =over 4
   
 =item  The corresponing file system path.   =item  The corresponding file system path. 
   
 =back  =back
   
Line 168  Global References Line 151  Global References
 =cut  =cut
   
 sub URLToPath {  sub URLToPath {
   my $Url = shift;      my $Url = shift;
   &Debug($r, "UrlToPath got: $Url");      &Debug($r, "UrlToPath got: $Url");
   $Url=~ s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;      $Url=~ s/\/+/\//g;
   $Url=~ s/^http\:\/\/[^\/]+//;      $Url=~ s/^http\:\/\/[^\/]+//;
   &Debug($r, "Returning $Url \n");      $Url=~ s/^\///;
   return $Url;      $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;
       &Debug($r, "Returning $Url \n");
       return $Url;
 }  }
   
 =pod  sub url {
       my $fn=shift;
 =item PublicationPath($domain, $user, $dir, $file)      $fn=~s/^\/home\/(\w+)\/public\_html/\/priv\/$1/;
       $fn=&HTML::Entities::encode($fn,'<>"&');
    Determines the filesystem path corersponding to a published resource      return $fn;
    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  sub display {
       my $fn=shift;
 =item ConstructionPath($domain, $user, $dir, $file)      $fn=~s-^/home/(\w+)/public_html-/priv/$1-;
       return '<tt>'.$fn.'</tt>';
    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  # see if the file is
 the username and the path relative to the root of construction space.  # a) published (return 0 if not)
   # b) if, so obsolete (return 0 if not)
 Parameters:  
   sub obsolete_unpub {
 =over 4      my ($user,$domain,$construct)=@_;
       my $published=$construct;
 =item  $user  - string [in] Name of the user in whose construction space the      $published=~
            file [will] live.   s/^\/home\/$user\/public\_html\//\/home\/httpd\/html\/res\/$domain\/$user\//;
       if (-e $published) {
 =item  $relname - string[in] Path to the file relative to the root of the   if (&Apache::lonnet::metadata($published,'obsolete')) {
             construction space.      return 1;
    }
 =back   return 0;
       } else {
 Returns:   return 1;
       }
 =over 4     }
   
 =item  string - Full path to the file.  
   
 =back  
   
 =cut  
   
 sub ConstructionPathFromRelative {  
   
   my ($user, $relname) = @_;  
   return '/home/'.$user.'/public_html'.$relname;  
   
 }  
   
 =pod  =pod
   
 =item exists($user, $domain, $directory, $file)  =item exists($user, $domain, $file)
   
    Determine if a resource file name has been publisehd or exists     Determine if a resource file name has been published or exists
    in the construction space.     in the construction space.
   
  Parameters:   Parameters:
Line 297  sub ConstructionPathFromRelative { Line 212  sub ConstructionPathFromRelative {
 =item  $domain - string [in] - Name of the domain in which the resource  =item  $domain - string [in] - Name of the domain in which the resource
                           might have been published.                            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.  =item  $file   - string [in] - Name of the file.
   
 =back  =back
Line 317  Returns: Line 229  Returns:
 =cut  =cut
   
 sub exists {  sub exists {
   my ($user, $domain, $dir, $file) = @_;      my ($user, $domain, $construct) = @_;
       my $published=$construct;
   # Create complete paths in publication and construction space.      $published=~
    s/^\/home\/$user\/public\_html\//\/home\/httpd\/html\/res\/$domain\/$user\//;
   my $published = &PublicationPath($domain, $user, $dir, $file);      my $result='';    
   my $construct = &ConstructionPath($user, $dir, $file);      if ( -d $construct ) {
    return &mt('Error: destination for operation is an existing directory.');
   # If the resource exists in either space indicate this fact.      }
   # Note that the check for existence in resource space is stricter.      if ( -e $published) {
    $result.='<p><font color="red">'.&mt('Warning: target file exists, and has been published!').'</font></p>';
   my $result;          } elsif ( -e $construct) {
   if ( -e $published) {   $result.='<p><font color="red">'.&mt('Warning: target file exists!').'</font></p>';
     $result.='<p><font color=red>Warning: target file exists, and has been published!</font></p>';      }
   }      return $result;
   elsif ( -e $construct) {  
     $result.='<p><font color=red>Warning: target file exists!</font></p>';  
    }  
   
   return $result;  
   
 }  }
   
 =pod  =pod
Line 360  as a result of this operation. Line 266  as a result of this operation.
   
 =over 4  =over 4
   
 =item    Empty string if everythikng worked.  =item    Empty string if everything worked.
   
 =item    String containing an error message if there was a problem.  =item    String containing an error message if there was a problem.
   
Line 377  sub checksuffix { Line 283  sub checksuffix {
     if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }      if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }
     if ($oldsuffix ne $newsuffix) {      if ($oldsuffix ne $newsuffix) {
  $result.=   $result.=
             '<p><font color=red>Warning: change of MIME type!</font></p>';              '<p><font color="red">'.&mt('Warning: change of MIME type!').'</font></p>';
     }      }
     return $result;      return $result;
 }  }
   
   sub cleanDest {
       my ($request,$dest,$subdir)=@_;
       #remove bad characters
       my $foundbad=0;
       if ($subdir && $dest =~/\./) {
    $foundbad=1;
    $dest=~s/\.//g;
       }
       if  ($dest=~/[\#\?&%\"]/) {
    $foundbad=1;
    $dest=~s/[\#\?&%]//g;
       }
       if ($foundbad) {
    $request->print("<p><font color=\"red\">".&mt('Invalid characters in requested name have been removed.')."</font></p>");
       }
       return $dest;
   }
   
   sub relativeDest {
       my ($fn,$newfilename,$uname)=@_;
       if ($newfilename=~/^\//) {
   # absolute, simply add path
    $newfilename='/home/'.$uname.'/public_html/';
       } else {
    my $dir=$fn;
    $dir=~s/\/[^\/]+$//;
    $newfilename=$dir.'/'.$newfilename;
       }
       $newfilename=~s://+:/:g; # remove duplicate /
       while ($newfilename=~m:/\.\./:) {
    $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
       }
       return $newfilename;
   }
   
 =pod  =pod
   
 =item CloseForm1($request, $user, $file)  =item CloseForm1($request, $user, $file)
Line 400  Parameters: Line 342  Parameters:
 =cut  =cut
   
 sub CloseForm1 {  sub CloseForm1 {
    my ($request,  $cancelurl) = @_;      my ($request,  $fn) = @_;
       $request->print('<p><input type="submit" value="'.&mt('Continue').'" /></p></form>');
       $request->print('<form action="'.&url($fn).
    &Debug($request, "Cancel url is: ".$cancelurl);      '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
    $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>');  
   
 }  }
   
   
Line 436  Parameters: Line 374  Parameters:
 =cut  =cut
   
 sub CloseForm2 {  sub CloseForm2 {
   my ($request, $user, $directory) = @_;      my ($request, $user, $fn) = @_;
       $request->print('<h3><a href="'.&url($fn).'/">'.&mt('Done').'</a></h3>');
   $request->print('<h3><a=href="/priv/'.$user.$directory.'/">Done </a> </h3>');  
 }  }
   
 =pod  =pod
Line 477  new filename relative to the current dir Line 414  new filename relative to the current dir
 =cut    =cut  
   
 sub Rename1 {  sub Rename1 {
     my ($request, $filename, $user, $domain, $dir) = @_;      my ($request, $user, $domain, $fn, $newfilename, $style) = @_;
     &Debug($request, "Username - ".$user." filename: ".$filename."\n");  
     my $conspace = $filename;      if(-e $fn) {
    if($newfilename) {
     my $cancelurl = "/priv/".$filename;      # is dest a dir
     $cancelurl    =~ s/\/home\///;      if ($style eq 'move') {
     $cancelurl    =~ s/\/public_html//;   if (-d $newfilename) {
           if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
     if(-e $conspace) {   }
  if($ENV{'form.newfilename'}) {      }
     my $newfilename = $ENV{'form.newfilename'};      if ($newfilename =~ m|/[^\.]+$|) {
     $request->print(&checksuffix($filename, $newfilename));   #no extension add on original extension
     $request->print(&exists($user, $domain, $dir, $newfilename));   if ($fn =~ m|/[^\.]*\.([^\.]+)$|) {
     $request->print('<input type=hidden name=newfilename value="'.      $newfilename.='.'.$1;
    }
       }
       $request->print(&checksuffix($fn, $newfilename));
       #renaming a dir, delete the trailing /
               #remove second to last element for current dir
       if (-d $fn) {
    $newfilename=~/\.(\w+)$/;
    if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
       $request->print('<br /><font color="red">'.
       &mt('Cannot change MIME type of a directory').
       '</font>'.
       '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
       return;
    }
    $newfilename=~s/\/[^\/]+\/([^\/]+)$/\/$1/;
       }
       $newfilename=~s://+:/:g; # remove duplicate /
       while ($newfilename=~m:/\.\./:) {
    $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
       }
       my $return=&exists($user, $domain, $newfilename);
       $request->print($return);
       if ($return =~/^Error:/) {
    $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
    return;
       }
       unless (&obsolete_unpub($user,$domain,$fn)) {
    $request->print('<h3>'.&mt('Cannot rename or move non-obsolete published file').'</h3>'.
    '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
    return;
       }
       my $action;
       if ($style eq 'rename') {
    $action=&mt('Rename');
       } else {
    $action=&mt('Move');
       }
       $request->print('<input type="hidden" name="newfilename" value="'.
     $newfilename.      $newfilename.
     '"><p>Rename <tt>'.$filename.'</tt> to <tt>'.      '" /><p>'.$action.' '.&display($fn).
     $dir.'/'.$newfilename.'</tt>?</p>');      '</tt><br />to '.&display($newfilename).'?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $fn);
  } else {   } else {
     $request->print('<p>No new filename specified</p></form>');      $request->print('<p>'.&mt('No new filename specified.').'</p></form>');
     return;      return;
  }   }
     } else {      } else {
  $request->print('<p> No such File </p> </form>');   $request->print('<p> '.&mt('No such file').': '.&display($fn).'</p></form>');
  return;   return;
     }      }
           
 }  }
   
 =pod  =pod
   
 =item Delete1  =item Delete1
Line 516  Parameters: Line 492  Parameters:
   
 =over 4  =over 4
   
 =item   $request   - Apache Request Object [in] request object for the current  =item   $request   - Apache Request Object [in] request object for the current 
                 request.                  request.
   
 =item   $user      - string [in] Name of session user.  =item   $user      - string [in]  Name of the user initiating the request.
   
   =item   $domain    - string [in]  Domain the initiating user is logged in as
   
 =item   $filename  - string [in] Name fo the file to be deleted:  =item   $filename  - string [in]  Source filename.
                 Filename is the full filesystem path to the file.  
   
 =back  =back
   
 =cut  =cut
   
 sub Delete1 {  sub Delete1 {
   my ($request, $user,  $filename) = @_;      my ($request, $user, $domain, $fn) = @_;
   
   my $cancelurl = '/priv/'.$filename;      if( -e $fn) {
   $cancelurl    =~ s/\/home\///;   $request->print('<input type="hidden" name="newfilename" value="'.
   $cancelurl    =~ s/\/public_html//;   $fn.'"/>');
      unless (&obsolete_unpub($user,$domain,$fn)) {
       $request->print('<h3>'.&mt('Cannot delete non-obsolete published file').'</h3>'.
   if( -e $filename) {      '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
     $request->print('<input type=hidden name=newfilename value="'.      return;
     $filename.'">');   }
     $request->print('<p> Delete <tt>'.$filename.'</tt>?</p>');   $request->print('<p>'.&mt('Delete').' '.&display($fn).'?</p>');
     &CloseForm1($request, $cancelurl);   &CloseForm1($request, $fn);
   } else {      } else {
     $request->print('<p> No Such file: <tt>'.$filename.'</tt></p></form>');   $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
   }      }
 }  }
   
 =pod  =pod
Line 552  sub Delete1 { Line 528  sub Delete1 {
 =item Copy1($request, $user, $domain, $filename, $newfilename)  =item Copy1($request, $user, $domain, $filename, $newfilename)
   
    Performs phase 1 processing of the construction space copy command.     Performs phase 1 processing of the construction space copy command.
    Ensure that the source fil eexists.  Ensure that a destination exists,     Ensure that the source file exists.  Ensure that a destination exists,
    also warn if the detination already exists.     also warn if the destination already exists.
   
 Parameters:  Parameters:
   
Line 566  Parameters: Line 542  Parameters:
   
 =item   $domain    - string [in]  Domain the initiating user is logged in as  =item   $domain    - string [in]  Domain the initiating user is logged in as
   
 =item   $dir       - string [in]  Directory path.  =item   $fn  - string [in]  Source filename.
   
 =item   $filename  - string [in]  Source filename.  
   
 =item   $newfilename-string [in]  Destination filename.  =item   $newfilename-string [in]  Destination filename.
   
Line 577  Parameters: Line 551  Parameters:
 =cut  =cut
   
 sub Copy1 {  sub Copy1 {
   my ($request, $user, $domain, $dir, $filename, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename) = @_;
   
   my $cancelurl = "/priv/".$filename;      if(-e $fn) {
   $cancelurl    =~ s/\/home\///;   # is dest a dir
   $cancelurl    =~ s/\/public_html//;   if (-d $newfilename) {
           if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
    }
    if ($newfilename =~ m|/[^\.]+$|) {
   if(-e $filename) {      #no extension add on original extension
     $request->print(&checksuffix($filename,$newfilename));      if ($fn =~ m|/[^\.]*\.([^\.]+)$|) { $newfilename.='.'.$1; }
     $request->print(&exists($user, $domain, $dir, $newfilename));   } 
     $request->print('<input type = hidden name = newfilename value = "'.   $newfilename=~s://+:/:g; # remove duplicate /
     $dir.'/'.$newfilename.   while ($newfilename=~m:/\.\./:) {
     '"><p>Copy <tt>'.$filename.'</tt> to'.      $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
     '<tt>'.$dir.'/'.$newfilename.'</tt>/?</p>');   }
     &CloseForm1($request, $cancelurl);   $request->print(&checksuffix($fn,$newfilename));
   } else {   my $return=&exists($user, $domain, $newfilename);
     $request->print('<p>No such file <tt>'.$filename.'</p></form>');   $request->print($return);
   }   if ($return =~/^Error:/) {
       $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
       return;
    }
    $request->print('<input type="hidden" name="newfilename" value="'.
    $newfilename.
    '" /><p>'.&mt('Copy').' '.&display($fn).'<br />to '.
    &display($newfilename).'?</p>');
    &CloseForm1($request, $fn);
       } else {
    $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
       }
 }  }
   
 =pod  =pod
Line 611  Parameters: Line 596  Parameters:
 =over 4  =over 4
   
 =item   $request  - Apache Request Object [in] - Server request object for the  =item   $request  - Apache Request Object [in] - Server request object for the
                current url..                 current url.
   
 =item   $username - Name of the user that is requesting the directory creation.  =item   $username - Name of the user that is requesting the directory creation.
   
 =item   $path     - current directory relative to construction spacee.  =item $domain - Domain user is in
   
   =item   $fn     - source file.
   
 =item   $newdir   - Name of the directory to be created; path relative to the   =item   $newdir   - Name of the directory to be created; path relative to the 
                top level of construction space.                 top level of construction space.
Line 635  causes the newdir operation to transitio Line 622  causes the newdir operation to transitio
 =cut  =cut
   
   
 sub NewDir1  sub NewDir1 {
 {      my ($request, $username, $domain, $fn, $newfilename, $mode) = @_;
   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);  
   
   }      my $result=&exists($username,$domain,$newfilename);
       if ($result) {
    $request->print('<font color="red">'.$result.'</font></form>');
       } else {
    if ($mode eq 'testbank') {
       $request->print('<input type="hidden" name="callingmode" value="testbank">');
    } elsif ($mode eq 'imsimport') {
       $request->print('<input type="hidden" name="callingmode" value="imsimport">');
    }
    $request->print('<input type="hidden" name="newfilename" value="'.
    $newfilename.'" /><p>'.&mt('Make new directory').' '.
    &display($newfilename).'?</p>');
    &CloseForm1($request, $fn);
       }
   }
   
   
   sub Decompress1 {
       my ($request, $user, $domain, $fn) = @_;
       if( -e $fn) {
       $request->print('<input type="hidden" name="newfilename" value="'.$fn.'"/>');
       $request->print('<p>'.&mt('Decompress').' '.&display($fn).'?</p>');
       &CloseForm1($request, $fn);
       } else {
    $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
       }
   }
   
   =pod
   
   =item NewFile1
    
     Does all phase 1 processing of file creation:
     Ensures that the user provides a new filename, adds proper extension
     if needed and that the file does not already exist, if it is a html,
     problem, page, or sequence, it then creates a form link to hand the
     actual creation off to the proper handler.
   
   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   $domain   - Name of the domain of the user
   
   =item   $fn      - Source file name
   
   =item   $newfilename
                     - Name of the file to be created; no path information
   =back
   
   Side Effects:
   
   =over 4
   
   =item 2 new forms are displayed.  Clicking on the confirmation button
   causes the browser to attempt to load the specfied URL, allowing the
   proper handler to take care of file creation. There is also a Cancel
   button which returns you to the driectory listing you came from
   
   =back
   
   =cut
   
   sub NewFile1 {
       my ($request, $user, $domain, $fn, $newfilename) = @_;
   
       if ($ENV{'form.action'} =~ /new(.+)file/) {
    my $extension=$1;
   
           ##Informs User (name).(number).(extension) not allowed 
    if($newfilename =~ /\.(\d+)\.(\w+)$/){
       $r->print('<font color="red">'.$newfilename.
         ' - '.&mt('Bad Filename').'<br />('.&mt('name').').('.&mt('number').').('.&mt('extension').')'.
         ' '.&mt('Not Allowed').'</font>');
       return;
    }
    if ($newfilename !~ /\Q.$extension\E$/) {
       if ($newfilename =~ m|^[^\.]*\.([^\.]+)$|) {
    #already has an extension strip it and add in expected one
    $newfilename =~ s|.([^\.]+)$||;
       }
       $newfilename.=".$extension";
    }
       }
       my $result=&exists($user,$domain,$newfilename);
       if($result) {
    $request->print('<font color="red">'.$result.'</font></form>');
       } else {
    $request->print('<p>'.&mt('Make new file').' '.&display($newfilename).'?</p>');
    $request->print('</form>');
    $request->print('<form action="'.&url($newfilename).
    '" method="POST"><p><input type="submit" value="'.&mt('Continue').'" /></p></form>');
    $request->print('<form action="'.&url($fn).
    '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
       }
 }  }
   
 =pod  =pod
Line 680  performed and reported to the user. Line 749  performed and reported to the user.
   
 =item $uname - string [in] Name of user logged in and doing this action.  =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.   =item $udom  - string [in] Domain name under which the user logged in. 
   
 =back  =back
   
 =cut  =cut
   
 sub phaseone {  sub phaseone {
   my ($r,$fn,$uname,$udom)=@_;      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>'.      my $doingdir=0;
     '<input type=hidden name=filename value="/~'.$uname.$fn.'">'.      if ($ENV{'form.action'} eq 'newdir') { $doingdir=1; }
     '<input type=hidden name=phase value=two>'.      my $newfilename=&cleanDest($r,$ENV{'form.newfilename'},$doingdir);
     '<input type=hidden name=action value='.$ENV{'form.action'}.'>');      $newfilename=&relativeDest($fn,$newfilename,$uname);
         $r->print('<form action="/adm/cfile" method="post">'.
   if ($ENV{'form.action'} eq 'rename') {        '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
             '<input type="hidden" name="phase" value="two" />'.
     &Rename1($r, $fn, $uname, $udom, $dir);        '<input type="hidden" name="action" value="'.$ENV{'form.action'}.'" />');
       
   } 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'});  
   }  
       
       if ($ENV{'form.action'} eq 'rename') {
    &Rename1($r, $uname, $udom, $fn, $newfilename, 'rename');
       } elsif ($ENV{'form.action'} eq 'move') {
    &Rename1($r, $uname, $udom, $fn, $newfilename, 'move');
       } elsif ($ENV{'form.action'} eq 'delete') { 
    &Delete1($r, $uname, $udom, $fn);
       } elsif ($ENV{'form.action'} eq 'decompress') {
    &Decompress1($r, $uname, $udom, $fn);
       } elsif ($ENV{'form.action'} eq 'copy') { 
    if($newfilename) {
       &Copy1($r, $uname, $udom, $fn, $newfilename);
    } else {
       $r->print('<p>'.&mt('No new filename specified.').'</p></form>');
    }
       } elsif ($ENV{'form.action'} eq 'newdir') {
    my $mode = '';
    if (exists($ENV{'form.callingmode'}) ) {
       $mode = $ENV{'form.callingmode'};
    }   
    &NewDir1($r, $uname, $udom, $fn, $newfilename, $mode);
       }  elsif ($ENV{'form.action'} eq 'newfile' ||
         $ENV{'form.action'} eq 'newhtmlfile' ||
         $ENV{'form.action'} eq 'newproblemfile' ||
         $ENV{'form.action'} eq 'newpagefile' ||
         $ENV{'form.action'} eq 'newsequencefile' ||
         $ENV{'form.action'} eq 'newrightsfile' ||
         $ENV{'form.action'} eq 'newstyfile' ||
         $ENV{'form.action'} eq 'Select Action') {
    if ($newfilename) {
       &NewFile1($r, $uname, $udom, $fn, $newfilename);
    } else {
       $r->print('<p>'.&mt('No new filename specified.').'</p></form>');
    }
       }
 }  }
   
 =pod  =pod
   
 =item Rename2($request, $user, $directory, $oldfile, $newfile)  =item Rename2($request, $user, $directory, $oldfile, $newfile)
   
 Performs phase 2 procesing of a rename reequest.   This is where the  Performs phase 2 processing of a rename reequest.   This is where the
 actual rename is performed.  actual rename is performed.
   
 Parameters  Parameters
Line 759  Returns: Line 839  Returns:
   
 sub Rename2 {  sub Rename2 {
   
   my ($request, $user, $directory, $oldfile, $newfile) = @_;      my ($request, $user, $directory, $oldfile, $newfile) = @_;
   
   &Debug($request, "Rename2 directory: ".$directory." old file: ".$oldfile.      &Debug($request, "Rename2 directory: ".$directory." old file: ".$oldfile.
  " new file ".$newfile."\n");     " new file ".$newfile."\n");
   &Debug($request, "Target is: ".$directory.'/'.      &Debug($request, "Target is: ".$directory.'/'.
  $newfile);     $newfile);
       if (-e $oldfile) {
   if(-e $oldfile) {  
       unless(rename($oldfile,   my $oRN=$oldfile;
     $directory.'/'.$newfile)) {   my $nRN=$newfile;
   $request->print('<font color=red>Error: '.$!.'</font>');   unless (rename($oldfile,$newfile)) {
   return 0;      $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
       } else {}      return 0;
   } else {   }
       $request->print("<p> No such file: /home".$user.'/public_html'.   ## If old name.(extension) exits, move under new name.
       $oldfile.' </p></form>');   ## If it doesn't exist and a new.(extension) exists  
       return 0;   ## delete it (only concern when renaming over files)
   }   my $tmp1=$oRN.'.meta';
   return 1;   my $tmp2=$nRN.'.meta';
    if(-e $tmp1){
       unless(rename($tmp1,$tmp2)){ }
    } elsif(-e $tmp2){
       unlink $tmp2;
    }
    $tmp1=$oRN.'.save';
    $tmp2=$nRN.'.save';
    if(-e $tmp1){
       unless(rename($tmp1,$tmp2)){ }
    } elsif(-e $tmp2){
       unlink $tmp2;
    }
    $tmp1=$oRN.'.log';
    $tmp2=$nRN.'.log';
    if(-e $tmp1){
       unless(rename($tmp1,$tmp2)){ }
    } elsif(-e $tmp2){
       unlink $tmp2;
    }
    $tmp1=$oRN.'.bak';
    $tmp2=$nRN.'.bak';
    if(-e $tmp1){
       unless(rename($tmp1,$tmp2)){ }
    } elsif(-e $tmp2){
       unlink $tmp2;
    }
       } else {
    $request->print("<p> ".&mt('No such file').": ".&display($oldfile).'</p></form>');
    return 0;
       }
       return 1;
 }  }
   
 =pod  =pod
   
 =item Delete2($request, $user, $filename)  =item Delete2($request, $user, $filename)
Line 797  Parameters: Line 909  Parameters:
 =item $user    - string [in]  The name of the user initiating the delete  =item $user    - string [in]  The name of the user initiating the delete
                  request.                   request.
   
 =item $filename - string [in] The name of the file, relative to construction space,  =item $filename - string [in] The name of the file, relative to construction
                   to delete.                    space, to delete.
   
 =back  =back
   
Line 809  Returns: Line 921  Returns:
 =cut  =cut
   
 sub Delete2 {  sub Delete2 {
   my ($request, $user, $filename) = @_;      my ($request, $user, $filename) = @_;
       if(opendir DIR, $filename) { 
   if(-e $filename) {   my @files=readdir(DIR);
     unless(unlink($filename)) {   shift @files; shift @files; # takes off . and ..
       $request->print('<font color=red>Error: '.$!.'</font>');   if(@files) { 
       return 0;      $request->print('<font color="red"> '.&mt('Error: Directory Non Empty').'</font>'); 
     }      return 0;
   } else {   } else {   
     $request->print('<p> No such file. </form');      if(-e $filename) {
     return 0;   unless(rmdir($filename)) {
   }      $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
   return 1;      return 0;
    }
       } else {
    $request->print('<p> '.&mt('No such file').'. </p></form>');
    return 0;
       }
    }
       } else {
    if(-e $filename) {
       unless(unlink($filename)) {
    $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
    return 0;
       }
    } else {
       $request->print('<p> '.&mt('No such file').'. </p></form>');
       return 0;
    }
       }
       return 1;
 }  }
   
 =pod  =pod
Line 856  sub Copy2 { Line 986  sub Copy2 {
     &Debug($request ,"Will try to copy $oldfile to $newfile");      &Debug($request ,"Will try to copy $oldfile to $newfile");
     if(-e $oldfile) {      if(-e $oldfile) {
  unless (copy($oldfile, $newfile)) {   unless (copy($oldfile, $newfile)) {
     $request->print('<font color=red> Error: '.$!.'</font>');      $request->print('<font color="red"> '.&mt('copy Error').': '.$!.'</font>');
     return 0;      return 0;
  } else {   } else {
       unless (chmod(0660, $newfile)) {
    $request->print('<font color="red"> '.&mt('chmod error').': '.$!.'</font>');
    return 0;
       }
     return 1;      return 1;
  }   }
     } else {      } else {
  $request->print('<p> No such file </p>');   $request->print('<p> '.&mt('No such file').' </p>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
 }  }
   
 =pod  =pod
   
 =item NewDir2($request, $user, $newdirectory)  =item NewDir2($request, $user, $newdirectory)
Line 890  Returns 0 - failure 1 - success. Line 1025  Returns 0 - failure 1 - success.
 =cut  =cut
   
 sub NewDir2 {  sub NewDir2 {
   my ($request, $user, $newdirectory) = @_;      my ($request, $user, $newdirectory) = @_;
       
   unless(mkdir($newdirectory, 02770)) {      unless(mkdir($newdirectory, 02770)) {
     $request->print('<font color=red>Error: '.$!.'</font>');   $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
     return 0;   return 0;
   }      }
   unless(chmod(02770, ($newdirectory))) {      unless(chmod(02770, ($newdirectory))) {
       $request->print('<font color=red> Error: '.$!.'</font>');   $request->print('<font color="red"> '.&mt('Error').': '.$!.'</font>');
       return 0;   return 0;
   }      }
   return 1;      return 1;
   }
   
   sub decompress2 {
       my ($r, $user, $dir, $file) = @_;
       &Apache::lonnet::appenv('cgi.file' => $file);
       &Apache::lonnet::appenv('cgi.dir' => $dir);
       my $result=&Apache::lonnet::ssi_body('/cgi-bin/decompress.pl');
       $r->print($result);
       &Apache::lonnet::delenv('cgi.file');
       &Apache::lonnet::delenv('cgi.dir');
       return 1;
 }  }
   
 =pod  =pod
Line 942  sub phasetwo { Line 1088  sub phasetwo {
           
     # Break down the file into it's component pieces.      # Break down the file into it's component pieces.
           
     $fn=~/(.*)\/([^\/]+)\.(\w+)$/;      my $dir; # Directory path
     my $dir=$1; # Directory path      my $main; # Filename.
     my $main=$2; # Filename.      my $suffix; # Extension.
     my $suffix=$3; # Extension.      if ($fn=~m:(.*)/([^/]+):) {
        $dir=$1; # Directory path
    $main=$2; # Filename.
       }
       if($main=~m:\.(\w+)$:){ # Fixes problems with filenames with no extensions
    $main=$`; #This is what is before the match (.) so it's just the main filename, yea it's nasty
    $suffix=$1; #This is the actually filename extension if it exists
       }
     my $dest;                   # On success this is where we'll go.      my $dest;                   # On success this is where we'll go.
           
     &Debug($r,       &Debug($r,"loncfile::phase2 dir = $dir main = $main suffix = $suffix");
    "loncfile::phase2 dir = $dir main = $main suffix = $suffix");      &Debug($r,"    newfilename = ".$ENV{'form.newfilename'});
     &Debug($r,  
    "    newfilename = ".$ENV{'form.newfilename'});  
   
     my $conspace=$fn;      my $conspace=$fn;
           
     &Debug($r,       &Debug($r,"loncfile::phase2 Full construction space name: $conspace");
    "loncfile::phase2 Full construction space name: $conspace");  
           
     &Debug($r,       &Debug($r,"loncfie::phase2 action is $ENV{'form.action'}");
    "loncfie::phase2 action is $ENV{'form.action'}");  
           
     # Select the appropriate processing sub.      # Select the appropriate processing sub.
           if ($ENV{'form.action'} eq 'decompress') { 
     if ($ENV{'form.action'} eq 'rename') { # Rename.   $main .= '.';
    $main .= $suffix;
    if(!&decompress2($r, $uname, $dir, $main)) {
       return ;
    }
    $dest = $dir."/.";
       } elsif ($ENV{'form.action'} eq 'rename') { # Rename.
  if($ENV{'form.newfilename'}) {   if($ENV{'form.newfilename'}) {
       if (!defined($dir)) {
    $fn=~m:^(.*)/:;
    $dir=$1; 
       }
     if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {      if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
  return;   return;
     }      }
     # Prepend the directory to the new name to form the basis of the      $dest = $ENV{'form.newfilename'};
     # url of the new resource.  
     #  
     $dest = $dir."/".$ENV{'form.newfilename'};  
  }   }
     } elsif ($ENV{'form.action'} eq 'delete') {       } elsif ($ENV{'form.action'} eq 'delete') { 
  if(!&Delete2($r, $uname, $ENV{'form.newfilename'})) {   if(!&Delete2($r, $uname, $ENV{'form.newfilename'})) {
Line 981  sub phasetwo { Line 1136  sub phasetwo {
  # Once a resource is deleted, we just list the directory that   # Once a resource is deleted, we just list the directory that
  # previously held it.   # previously held it.
  #   #
  $dest = $dir."/"; # Parent dir.   $dest = $dir."/."; # Parent dir.
     } elsif ($ENV{'form.action'} eq 'copy') {       } elsif ($ENV{'form.action'} eq 'copy') { 
  if($ENV{'form.newfilename'}) {   if($ENV{'form.newfilename'}) {
     if(!&Copy2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {      if(!&Copy2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
  return   return ;
  }      }
     $dest = $ENV{'form.newfilename'};      $dest = $ENV{'form.newfilename'};
              } else {
  } else {      $r->print('<p>'.&mt('No New filename specified').'</p></form>');
     $r->print('<p>No New filename specified</form>');  
     return;      return;
  }   }
   
     } elsif ($ENV{'form.action'} eq 'newdir') {      } elsif ($ENV{'form.action'} eq 'newdir') {
  #          my $newdir= $ENV{'form.newfilename'};
  # 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)) {   if(!&NewDir2($r, $uname, $newdir)) {
     return;      return;
  }   }
  $dest = $newdir."/"   $dest = $newdir."/";
       }
       if ( ($ENV{'form.action'} eq 'newdir') && ($ENV{'form.phase'} eq 'two') && ( ($ENV{'form.callingmode'} eq 'testbank') || ($ENV{'form.callingmode'} eq 'imsimport') ) ) {
    $r->print('<h3><a href="javascript:self.close()">'.&mt('Done').'</a></h3>');
       } else {
    $r->print('<h3><a href="'.&url($dest).'">'.&mt('Done').'</a></h3>');
     }      }
     #  
     #  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//;  
     &Debug($r, "Final url after rewrite: $dest");  
   
     $r->print('<h3><a href="'.$dest.'">Done</a></h3>');  
 }  }
   
 sub handler {  sub handler {
   
   $r=shift;      $r=shift;
   
   
   &Debug($r, "loncfile.pm - handler entered");      &Debug($r, "loncfile.pm - handler entered");
   &Debug($r, " filename: ".$ENV{'form.filename'});      &Debug($r, " filename: ".$ENV{'form.filename'});
   &Debug($r, " newfilename: ".$ENV{'form.newfilename'});      &Debug($r, " newfilename: ".$ENV{'form.newfilename'});
   #
   my $fn;  # Determine the root filename
   # This could come in as "filename", which actually is a URL, or
   if ($ENV{'form.filename'}) {  # as "qualifiedfilename", which is indeed a real filename in filesystem
       $fn=$ENV{'form.filename'};  #
       &Debug($r, "loncfile::handler - raw url: $fn");      my $fn;
 #      $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;  
 #      $fn=~s/^http\:\/\/[^\/]+//;      if ($ENV{'form.filename'}) {
       $fn=URLToPath($fn);   &Debug($r, "test: $ENV{'form.filename'}");
       &Debug($r, "loncfile::handler - doctored url: $fn");   $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
    $fn=&URLToPath($fn);
   } else {      }  elsif($ENV{'QUERY_STRING'} && $ENV{'form.phase'} ne 'two') {  
       &Debug($r, "loncfile::handler - no form.filename");   #Just hijack the script only the first time around to inject the
      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.   #correct information for further processing
          ' unspecified filename for cfile', $r->filename);    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress']);
      return HTTP_NOT_FOUND;   $fn=&Apache::lonnet::unescape($ENV{'form.decompress'});
   }   $fn=&URLToPath($fn);
    $ENV{'form.action'}="decompress";
   unless ($fn) {       } elsif ($ENV{'form.qualifiedfilename'}) {
       &Debug($r, "loncfile::handler - doctored url is empty");   $fn=$ENV{'form.qualifiedfilename'};
      $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.      } else {
          ' trying to cfile non-existing file', $r->filename);    &Debug($r, "loncfile::handler - no form.filename");
      return HTTP_NOT_FOUND;   $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  # ----------------------------------------------------------- Start page output
   my $uname;      my $uname;
   my $udom;      my $udom;
   
   ($uname,$udom)=      ($uname,$udom)=
     &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));   &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));
   &Debug($r,       &Debug($r, 
  "loncfile::handler constructaccess uname = $uname domain = $udom");     "loncfile::handler constructaccess uname = $uname domain = $udom");
   unless (($uname) && ($udom)) {      unless (($uname) && ($udom)) {
      $r->log_reason($uname.' at '.$udom.   $r->log_reason($uname.' at '.$udom.
          ' trying to manipulate file '.$ENV{'form.filename'}.         ' trying to manipulate file '.$ENV{'form.filename'}.
          ' ('.$fn.') - not authorized',          ' ('.$fn.') - not authorized', 
          $r->filename);          $r->filename); 
      return HTTP_NOT_ACCEPTABLE;   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>');      &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
   
   $r->print(      if ( ($ENV{'form.action'} eq 'newdir') && ($ENV{'form.phase'} eq 'two') && ( ($ENV{'form.callingmode'} eq 'testbank') || ($ENV{'form.callingmode'} eq 'imsimport') ) ) {
    '<body bgcolor="#FFFFFF"><img align=right src=/adm/lonIcons/lonlogos.gif>');   my $newdirname = $ENV{'form.newfilename'};
    $r->print('<html><head><title>LON-CAPA Construction Space</title><script language="Javascript">');
    $r->print(qq|
   function writeDone() {
       var winName = window.opener
       window.focus();
       winName.document.dataForm.newdir.value = "$newdirname"
       setTimeout("self.close()",10000)
   }
     </script>
     </head>|);
    my $loaditem = 'onLoad="writeDone()"';
    $r->print(&Apache::loncommon::bodytag('Construction Space File Operation','',$loaditem));
       } else {
    $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
    $r->print(&Apache::loncommon::bodytag('Construction Space File Operation'));
       }
   
       
   $r->print('<h1>Construction Space <tt>'.$fn.'</tt></h1>');      $r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>');
       
   if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {      if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})) {
           $r->print('<h3><font color=red>Co-Author: '.$uname.' at '.$udom.   $r->print('<h3><font color="red">'.&mt('Co-Author').': '.$uname.' at '.$udom.
                '</font></h3>');    '</font></h3>');
   }      }
   
   
   &Debug($r, "loncfile::handler Form action is $ENV{'form.action'} ");      &Debug($r, "loncfile::handler Form action is $ENV{'form.action'} ");
   if ($ENV{'form.action'} eq 'delete') {      if ($ENV{'form.action'} eq 'delete') {
               $r->print('<h3>'.&mt('Delete').'</h3>');
       $r->print('<h3>Delete</h3>');      } elsif ($ENV{'form.action'} eq 'rename') {
   } elsif ($ENV{'form.action'} eq 'rename') {   $r->print('<h3>'.&mt('Rename').'</h3>');
       $r->print('<h3>Rename</h3>');      } elsif ($ENV{'form.action'} eq 'move') {
   } elsif ($ENV{'form.action'} eq 'newdir') {   $r->print('<h3>'.&mt('Move').'</h3>');
       $r->print('<h3>New Directory</h3>');      } elsif ($ENV{'form.action'} eq 'newdir') {
   } elsif ($ENV{'form.action'} eq 'copy') {   $r->print('<h3>'.&mt('New Directory').'</h3>');
       $r->print('<h3>Copy</h3>');      } elsif ($ENV{'form.action'} eq 'decompress') {
   } else {   $r->print('<h3>'.&mt('Decompress').'</h3>');
      $r->print('<p>Unknown Action</body></html>');      } elsif ($ENV{'form.action'} eq 'copy') {
      return OK;     $r->print('<h3>'.&mt('Copy').'</h3>');
   }      } elsif ($ENV{'form.action'} eq 'newfile' ||
   if ($ENV{'form.phase'} eq 'two') {       $ENV{'form.action'} eq 'newhtmlfile' ||
       &Debug($r, "loncfile::handler  entering phase2");       $ENV{'form.action'} eq 'newproblemfile' ||
       &phasetwo($r,$fn,$uname,$udom);       $ENV{'form.action'} eq 'newpagefile' ||
   } else {       $ENV{'form.action'} eq 'newsequencefile' ||
       &Debug($r, "loncfile::handler  entering phase1");       $ENV{'form.action'} eq 'newrightsfile' ||
       &phaseone($r,$fn,$uname,$udom);       $ENV{'form.action'} eq 'newstyfile' ||
   }       $ENV{'form.action'} eq 'Select Action' ) {
    $r->print('<h3>'.&mt('New Resource').'</h3>');
       } else {
    $r->print('<p>'.&mt('Unknown Action').' '.$ENV{'form.action'}.' </p></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>');      $r->print('</body></html>');
   return OK;        return OK;  
 }  }
   
 1;  1;

Removed from v.1.13  
changed lines
  Added in v.1.58


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>