Diff for /loncom/publisher/loncfile.pm between versions 1.110 and 1.126

version 1.110, 2011/10/23 23:46:07 version 1.126, 2023/07/14 14:32:57
Line 37 Line 37
   
 =head1 NAME  =head1 NAME
   
 Apache::loncfile - Construction space file management.  Apache::loncfile - Authoring space file management.
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
     
Line 68  use File::Basename; Line 68  use File::Basename;
 use File::Copy;  use File::Copy;
 use HTML::Entities();  use HTML::Entities();
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
Line 102  my $r;    # Needs to be global for some Line 101  my $r;    # Needs to be global for some
 =cut  =cut
   
 sub Debug {  sub Debug {
     # Put out the indicated message butonly if DEBUG is true.      # Put out the indicated message but only if DEBUG is true.
     if ($DEBUG) {      if ($DEBUG) {
  my ($r,$message) = @_;   my ($r,$message) = @_;
  $r->log_reason($message);   $r->log_reason($message);
Line 110  sub Debug { Line 109  sub Debug {
 }  }
   
 sub done {  sub done {
    my ($url)=@_;      my ($destfn) = @_;
    my $done=&mt("Done");      return
    return(<<ENDDONE);         '<p>'
 <a href="$url">$done</a>        .&Apache::lonhtmlcommon::confirm_success(&mt("Done"))
 <script type="text/javascript">        .'<br /><a href="'.&url($destfn).'">'.&mt("Continue").'</a>'
 location.href="$url";        .'<script type="text/javascript">'
 </script>        .'location.href="'.&url($destfn,'js').'";'
 ENDDONE        .'</script>'
         .'</p>';
 }  }
   
 =pod  =pod
Line 158  Global References Line 158  Global References
 sub URLToPath {  sub URLToPath {
     my $Url = shift;      my $Url = shift;
     &Debug($r, "UrlToPath got: $Url");      &Debug($r, "UrlToPath got: $Url");
     $Url=~ s/\/+/\//g;      $Url=~ s{^https?\://[^/]+}{};
     $Url=~ s/^https?\:\/\/[^\/]+//;      $Url=~ s{//+}{/}g;
     $Url=~ s/^\///;      $Url=~ s{^/}{};
     $Url='/home/httpd/html/'.$Url;      $Url=$Apache::lonnet::perlvar{'lonDocRoot'}."/$Url";
     &Debug($r, "Returning $Url \n");      &Debug($r, "Returning $Url \n");
     return $Url;      return $Url;
 }  }
   
 sub url {  sub url {
     my $fn=shift;      my ($fn,$context) = @_;
     $fn=~s/^\/home\/httpd\/html//;      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     $fn=~s/\/\.\//\//g;      $fn=~ s/^\Q$londocroot\E//;
     $fn=&HTML::Entities::encode($fn,'<>"&');      $fn=~s{/\./}{/}g;
       if ($context eq 'js') {
           &js_escape(\$fn);
       } else {
           $fn=&HTML::Entities::encode($fn,'\'<>"&');
       }
     return $fn;      return $fn;
 }  }
   
 sub display {  sub display {
     my $fn=shift;      my $fn=shift;
     $fn=~s/^\/home\/httpd\/html//;      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     $fn=~s/\/\.\//\//g;      $fn=~s/^\Q$londocroot\E//;
       $fn=~s{/\./}{/}g;
     return '<span class="LC_filename">'.$fn.'</span>';      return '<span class="LC_filename">'.$fn.'</span>';
 }  }
   
Line 188  sub display { Line 194  sub display {
   
 sub obsolete_unpub {  sub obsolete_unpub {
     my ($user,$domain,$construct)=@_;      my ($user,$domain,$construct)=@_;
       my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     my $published=$construct;      my $published=$construct;
     $published=~      $published=~s{^\Q$londocroot/priv/\E}{$londocroot/res/};
  s/^\/home\/$user\/public\_html\//\/home\/httpd\/html\/res\/$domain\/$user\//;  
     if (-e $published) {      if (-e $published) {
  if (&Apache::lonnet::metadata($published,'obsolete')) {   if (&Apache::lonnet::metadata($published,'obsolete')) {
     return 1;      return 1;
Line 204  sub obsolete_unpub { Line 210  sub obsolete_unpub {
 # see if directory is empty  # see if directory is empty
 # ignores any .meta, .save, .bak, and .log files created for a previously  # ignores any .meta, .save, .bak, and .log files created for a previously
 # published file, which has since been marked obsolete and deleted.  # published file, which has since been marked obsolete and deleted.
   # ignores a .DS_Store file put there when viewing directory via webDAV on MacOS. 
 sub empty_directory {  sub empty_directory {
     my ($dirname,$phase) = @_;      my ($dirname,$phase) = @_;
     if (opendir DIR, $dirname) {      if (opendir DIR, $dirname) {
         my @files = grep(!/^\.\.?$/, readdir(DIR)); # ignore . and ..          my @files = grep(!/^\.\.?$/, readdir(DIR)); # ignore . and ..
         if (@files) {           if (@files) { 
             my @orphans = grep(/\.(meta|save|log|bak)$/,@files);              my @orphans = grep(/\.(meta|save|log|bak|DS_Store)$/,@files);
             if (scalar(@files) - scalar(@orphans) > 0) {               if (scalar(@files) - scalar(@orphans) > 0) { 
                 return 0;                  return 0;
             } else {              } else {
Line 232  sub empty_directory { Line 239  sub empty_directory {
   
 =item exists($user, $domain, $file)  =item exists($user, $domain, $file)
   
    Determine if a resource file name has been published or exists     Determine if a resource filename has been published or exists
    in the construction space.     in the construction space.
   
  Parameters:   Parameters:
Line 271  sub exists { Line 278  sub exists {
     my ($user, $domain, $construct, $creating) = @_;      my ($user, $domain, $construct, $creating) = @_;
     $creating ||= 'file';      $creating ||= 'file';
   
       my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     my $published=$construct;      my $published=$construct;
     $published=~s{^/home/httpd/html/priv/}{/home/httpd/html/res/};      $published=~s{^\Q$londocroot/priv/\E}{$londocroot/res/};
     my ($type,$result);      my ($type,$result);
     if ( -d $construct ) {      if ( -d $construct ) {
  return ('error','<p><span class="LC_error">'.&mt('Error: destination for operation is an existing directory.').'</span></p>');   return ('error','<p class="LC_error">'.&mt('Error: destination for operation is an existing directory.').'</p>');
   
     }      }
   
     if ( -e $published) {      if ( -e $published) {
  if ( -e $construct ) {   if ( -e $construct ) {
     $type = 'warning';      $type = 'warning';
     $result.='<p><span class="LC_warning">'.&mt('Warning: target file exists, and has been published!').'</span></p>';      $result.='<p class="LC_warning">'.&mt('Warning: target file exists, and has been published!').'</p>';
  } else {   } else {
     my $published_type = (-d $published) ? 'directory' : 'file';      my $published_type = (-d $published) ? 'directory' : 'file';
   
     if ($published_type eq $creating) {      if ($published_type eq $creating) {
  $type = 'warning';   $type = 'warning';
  $result.='<p><span class="LC_warning">'.&mt("Warning: a published $published_type of this name exists.").'</span></p>';   $result.='<p class="LC_warning">'.&mt("Warning: a published $published_type of this name exists.").'</p>';
     } else {      } else {
  $type = 'error';   $type = 'error';
  $result.='<p><span class="LC_error">'.&mt("Error: a published $published_type of this name exists.").'</span></p>';   $result.='<p class="LC_error">'.&mt("Error: a published $published_type of this name exists.").'</p>';
     }      }
  }   }
     } elsif ( -e $construct) {      } elsif ( -e $construct) {
  $type = 'warning';   $type = 'warning';
  $result.='<p><span class="LC_warning">'.&mt('Warning: target file exists!').'</span></p>';   $result.='<p class="LC_warning">'.&mt('Warning: target file exists!').'</p>';
     }      }
   
     return ($type,$result);      return ($type,$result);
Line 340  sub checksuffix { Line 348  sub checksuffix {
     if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }      if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }
     if (lc($oldsuffix) ne lc($newsuffix)) {      if (lc($oldsuffix) ne lc($newsuffix)) {
  $result.=   $result.=
             '<p><span class="LC_warning">'.&mt('Warning: change of MIME type!').'</span></p>';              '<p class="LC_warning">'.&mt('Warning: change of MIME type!').'></p>';
     }      }
     return $result;      return $result;
 }  }
   
 sub cleanDest {  sub cleanDest {
     my ($request,$dest,$subdir,$fn,$uname,$udom)=@_;      my ($dest,$subdir,$fn,$uname,$udom)=@_;
     #remove bad characters      #remove bad characters
     my $foundbad=0;      my $foundbad=0;
       my $warnings;
     my $error='';      my $error='';
     if ($subdir && $dest =~/\./) {      if ($subdir && $dest =~/\./) {
  $foundbad=1;   $foundbad=1;
Line 363  sub cleanDest { Line 372  sub cleanDest {
  my ($newpath)=($dest=~m|(.*)/|);   my ($newpath)=($dest=~m|(.*)/|);
  ($newpath,$error)=&relativeDest($fn,$newpath,$uname,$udom);   ($newpath,$error)=&relativeDest($fn,$newpath,$uname,$udom);
  if (! -d "$newpath") {   if (! -d "$newpath") {
     $request->print('<p><span class="LC_warning">'      $warnings = '<p class="LC_warning">'
                            .&mt("You have requested to create file in directory [_1] which doesn't exist. The requested directory path has been removed from the requested file name."                         .&mt("You have requested to create file in directory [_1] which doesn't exist. The requested directory path has been removed from the requested filename."
                                ,&display($newpath))                             ,&display($newpath))
                            .'</span></p>');                         .'</p>';
     $dest=~s|.*/||;      $dest=~s|.*/||;
  }   }
     }      }
     if ($dest =~ /\.(\d+)\.(\w+)$/){      if ($dest =~ /\.(\d+)\.(\w+)$/) {
  $request->print('<p><span class="LC_warning">'   $warnings .= '<p class="LC_warning">'
  .&mt('Bad filename [_1]',&display($dest))                      .&mt('Bad filename [_1]',&display($dest))
                         .'<br />'                      .'<br />'
                         .&mt('[_1](name).(number).(extension)[_2] not allowed.','<tt>','</tt>')                      .&mt('[_1](name).(number).(extension)[_2] not allowed.','<tt>','</tt>')
                         .'<br />'                      .'<br />'
                         .&mt('Removing the [_1].number.[_2] from requested filename.','<tt>','</tt>')                      .&mt('Removing the [_1].number.[_2] from requested filename.','<tt>','</tt>')
  .'</span></p>');                      .'</p>';
  $dest =~ s/\.(\d+)(\.\w+)$/$2/;   $dest =~ s/\.(\d+)(\.\w+)$/$2/;
     }      }
     if ($foundbad) {      if ($foundbad) {
         $request->print('<p><span class="LC_warning">'          $warnings .= '<p class="LC_warning">'
                        .&mt('Invalid characters in requested name have been removed.')                      .&mt('Invalid characters in requested name have been removed.')
                         .'</span></p>'                      .'</p>';
         );  
     }      }
     return ($dest,$error);      return ($dest,$error,$warnings);
 }  }
   
 sub relativeDest {  sub relativeDest {
Line 394  sub relativeDest { Line 402  sub relativeDest {
     my $error = '';      my $error = '';
     if ($newfilename=~/^\//) {      if ($newfilename=~/^\//) {
 # absolute, simply add path  # absolute, simply add path
  $newfilename='/home/httpd/html/res/'.$udom.'/'.$uname.'/';          my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
    $newfilename="$londocroot/res/$udom/$uname/";
     } else {      } else {
  my $dir=$fn;   my $dir=$fn;
  $dir=~s/\/[^\/]+$//;   $dir=~s{/[^/]+$}{};
  $newfilename=$dir.'/'.$newfilename;   $newfilename=$dir.'/'.$newfilename;
     }      }
     $newfilename=~s://+:/:g; # remove duplicate /      $newfilename=~s{//+}{/}g; # remove duplicate /
     while ($newfilename=~m:/\.\./:) {      while ($newfilename=~m{/\.\./}) {
  $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..   $newfilename=~ s{/[^/]+/\.\./}{/}g; #remove dir/..
     }      }
     if ($newfilename =~ m{^/home/($match_username)/(?:public\_html|priv)/}) {      my ($authorname,$authordom)=&Apache::lonnet::constructaccess($newfilename);
         my $otheruname = $1;      unless (($authorname) && ($authordom)) {
         unless ($otheruname eq $uname) {         my $otherdir = &display($newfilename);
             my ($authorname,$authordom)=         $error = &mt('Access denied to [_1]',$otherdir);
                 &Apache::loncacc::constructaccess($newfilename,$env{'request.role.domain'});  
             unless (($authorname eq $otheruname) && ($authordom ne '')) {  
                 my $otherdir = &display($newfilename);  
                 $error = &mt('Access denied to [_1]',$otherdir);  
             }  
         }  
     }      }
     return ($newfilename,$error);      return ($newfilename,$error);
 }  }
Line 438  Parameters: Line 441  Parameters:
   
 sub CloseForm1 {  sub CloseForm1 {
     my ($request,  $fn) = @_;      my ($request,  $fn) = @_;
     $request->print('<p><input type="submit" value="'.&mt('Continue').'" /></p></form>');      $request->print('<input type="submit" value="'.&mt('Continue').'" /></form>');
     $request->print('<form action="'.&url($fn).      $request->print(' <form action="'.&url($fn).'" method="post">'.
     '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');                      '<input type="submit" value="'.&mt('Cancel').'" /></form>');
 }  }
   
   
Line 470  Parameters: Line 473  Parameters:
   
 sub CloseForm2 {  sub CloseForm2 {
     my ($request, $user, $fn) = @_;      my ($request, $user, $fn) = @_;
     $request->print(&done(&url($fn)));      $request->print(&done($fn));
 }  }
   
 =pod  =pod
Line 701  sub Copy1 { Line 704  sub Copy1 {
  my ($type,$return)=&exists($user, $domain, $newfilename);   my ($type,$return)=&exists($user, $domain, $newfilename);
  $request->print($return);   $request->print($return);
  if ($type eq 'error') {   if ($type eq 'error') {
     $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');      $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a></form>');
     return;      return;
  }   }
   # Check if there is enough space.
           my @fileinfo = stat($fn);
           my ($dir,$fname) = ($fn =~ m{^(.+/)([^/]+)$});
           my $filesize = $fileinfo[7];
           $filesize = int($filesize/1000); #expressed in kb
           my $output = &Apache::loncommon::excess_filesize_warning($user,$domain,'author',
                                                                    $fname,$filesize,'copy');
           if ($output) {
               $request->print($output.'<br /><a href="'.&url($dir).'">'.&mt('Cancel').'</a></form>');
               return;
           }
     $request->print(      $request->print(
         '<input type="hidden" name="newfilename"'          '<input type="hidden" name="newfilename"'
        .' value="'.$newfilename.'" />'         .' value="'.$newfilename.'" />'
Line 826  Parameters: Line 840  Parameters:
   
 =item   $domain   - Name of the domain of the user  =item   $domain   - Name of the domain of the user
   
 =item   $fn      - Source file name  =item   $fn      - Source filename
   
 =item   $newfilename  =item   $newfilename
                   - Name of the file to be created; no path information                    - Name of the file to be created; no path information
   
   =item   $warnings - Information about changes to filename made by cleanDest().
   
 =back  =back
   
 Side Effects:  Side Effects:
Line 839  Side Effects: Line 856  Side Effects:
 =item 2 new forms are displayed.  Clicking on the confirmation button  =item 2 new forms are displayed.  Clicking on the confirmation button
 causes the browser to attempt to load the specfied URL, allowing the  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  proper handler to take care of file creation. There is also a Cancel
 button which returns you to the driectory listing you came from  button which returns you to the directory listing you came from
   
 =back  =back
   
 =cut  =cut
   
 sub NewFile1 {  sub NewFile1 {
     my ($request, $user, $domain, $fn, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename, $warnings) = @_;
     return if (&filename_check($newfilename) ne 'ok');      return if (&filename_check($newfilename,$warnings) ne 'ok');
   
     if ($env{'form.action'} =~ /new(.+)file/) {      if ($env{'form.action'} =~ /new(.+)file/) {
  my $extension=$1;   my $extension=$1;
Line 860  sub NewFile1 { Line 877  sub NewFile1 {
  }   }
     }      }
     my ($type, $result)=&exists($user,$domain,$newfilename);      my ($type, $result)=&exists($user,$domain,$newfilename);
     $request->print($result);  
     if ($type eq 'error') {      if ($type eq 'error') {
           $request->print($warnings.$result);
  $request->print('</form>');   $request->print('</form>');
     } else {      } else {
         my $extension;          my $extension;
Line 873  sub NewFile1 { Line 890  sub NewFile1 {
         my @okexts = qw(xml html xhtml htm xhtm problem page sequence rights sty task library js css txt);          my @okexts = qw(xml html xhtml htm xhtm problem page sequence rights sty task library js css txt);
         if (($extension eq '') || (!grep(/^\Q$extension\E/,@okexts))) {          if (($extension eq '') || (!grep(/^\Q$extension\E/,@okexts))) {
             my $validexts = '.'.join(', .',@okexts);              my $validexts = '.'.join(', .',@okexts);
               $request->print($warnings.$result);
             $request->print('<p class="LC_warning">'.              $request->print('<p class="LC_warning">'.
                 &mt('Invalid filename: ').&display($newfilename).'</p><p>'.                  &mt('Invalid filename: ').&display($newfilename).'</p><p>'.
                 &mt('The name of the new file needs to end with an appropriate file extension to indicate the type of file to create.').'<br />'.                  &mt('The name of the new file needs to end with an appropriate file extension to indicate the type of file to create.').'<br />'.
Line 881  sub NewFile1 { Line 899  sub NewFile1 {
  '<form name="fileaction" action="/adm/cfile" method="post">'.   '<form name="fileaction" action="/adm/cfile" method="post">'.
                 '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.                  '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
  '<input type="hidden" name="action" value="newfile" />'.   '<input type="hidden" name="action" value="newfile" />'.
         '<span class ="LC_nobreak">'.&mt('Enter a file name: ').'<input type="text" name="newfilename" value="Type Name Here" onfocus="if (this.value == '."'Type Name Here') this.value=''".'" />&nbsp;<input type="submit" value="Go" />'.          '<span class ="LC_nobreak">'.&mt('Enter a filename: ').'<input type="text" name="newfilename" value="Type Name Here" onfocus="if (this.value == '."'Type Name Here') this.value=''".'" />&nbsp;<input type="submit" value="Go" />'.
                 '</span></form></p>'.                  '</span></form></p>'.
                 '<p><form action="'.&url($fn).                  '<p><form action="'.&url($fn).
                 '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></form></p>');                  '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></form></p>');
             return;          } elsif (($type ne 'warning') && ($warnings eq '') && ($result eq '')) {
               my $query = "";
               $query .= "?mode=" . $env{'form.mode'} unless (!exists($env{'form.mode'}) || !length($env{'form.mode'}));
               $request->print('
                   <script type="text/javascript">
                       window.location = "'.&url($newfilename,'js'). $query .'";
                   </script>');
           } else {
               $request->print($warnings.$result);
               $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>');
         }          }
   
  $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>');  
     }      }
     return;      return;
 }  }
Line 950  sub phaseone { Line 974  sub phaseone {
       
     my $doingdir=0;      my $doingdir=0;
     if ($env{'form.action'} eq 'newdir') { $doingdir=1; }      if ($env{'form.action'} eq 'newdir') { $doingdir=1; }
     my ($newfilename,$error) =       my ($newfilename,$error,$warnings) = 
         &cleanDest($r,$env{'form.newfilename'},$doingdir,$fn,$uname,$udom);          &cleanDest($env{'form.newfilename'},$doingdir,$fn,$uname,$udom);
     unless ($error) {      unless ($error) {
         ($newfilename,$error)=&relativeDest($fn,$newfilename,$uname,$udom);          ($newfilename,$error)=&relativeDest($fn,$newfilename,$uname,$udom);
     }      }
Line 962  sub phaseone { Line 986  sub phaseone {
         } else {          } else {
             $dirlist=$fn;               $dirlist=$fn; 
         }          }
           if ($warnings) {
               $r->print($warnings);
           }
         $r->print('<div class="LC_error">'.$error.'</div>'.          $r->print('<div class="LC_error">'.$error.'</div>'.
                   '<h3><a href="'.&url($dirlist).'">'.&mt('Return to Directory').                    '<p><a href="'.&url($dirlist).'">'.&mt('Return to Directory').
                   '</a></h3>');                    '</a></p>');
         return;          return;
     }      }
     $r->print('<form action="/adm/cfile" method="post">'.      $r->print('<form action="/adm/cfile" method="post">'.
       '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.        '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
       '<input type="hidden" name="phase" value="two" />'.        '<input type="hidden" name="phase" value="two" />'.
       '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />');        '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />');
     
     if ($env{'form.action'} eq 'rename') {      if ($env{'form.action'} eq 'newfile' ||
  &Rename1($r, $uname, $udom, $fn, $newfilename, 'rename');          $env{'form.action'} eq 'newhtmlfile' ||
     } elsif ($env{'form.action'} eq 'move') {          $env{'form.action'} eq 'newproblemfile' ||
  &Rename1($r, $uname, $udom, $fn, $newfilename, 'move');          $env{'form.action'} eq 'newpagefile' ||
     } elsif ($env{'form.action'} eq 'delete') {           $env{'form.action'} eq 'newsequencefile' ||
  &Delete1($r, $uname, $udom, $fn);          $env{'form.action'} eq 'newrightsfile' ||
     } elsif ($env{'form.action'} eq 'decompress') {          $env{'form.action'} eq 'newstyfile' ||
  &Decompress1($r, $uname, $udom, $fn);          $env{'form.action'} eq 'newtaskfile' ||
     } elsif ($env{'form.action'} eq 'copy') {           $env{'form.action'} eq 'newlibraryfile' ||
  if($newfilename) {          $env{'form.action'} eq 'Select Action') {
     &Copy1($r, $uname, $udom, $fn, $newfilename);  
  } else {  
             $r->print('<p class="LC_error">'  
                      .&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 'newtaskfile' ||  
               $env{'form.action'} eq 'newlibraryfile' ||  
       $env{'form.action'} eq 'Select Action') {  
         my $empty=&mt('Type Name Here');          my $empty=&mt('Type Name Here');
  if (($newfilename!~/\/$/) && ($newfilename!~/$empty$/)) {          if (($newfilename!~/\/$/) && ($newfilename!~/$empty$/)) {
     &NewFile1($r, $uname, $udom, $fn, $newfilename);              &NewFile1($r, $uname, $udom, $fn, $newfilename, $warnings);
  } else {          } else {
               if ($warnings) {
                   $r->print($warnings);
               }
             $r->print('<p class="LC_error">'              $r->print('<p class="LC_error">'
                      .&mt('No new filename specified.')                       .&mt('No new filename specified.')
                      .'</p></form>'                       .'</p></form>'
             );              );
  }          }
       } else {
           if ($warnings) {
               $r->print($warnings);
           }
           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 class="LC_error">'
                            .&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);
           }
     }      }
 }  }
   
Line 1100  sub Rename2 { Line 1135  sub Rename2 {
  }   }
     } else {      } else {
         $request->print(          $request->print(
             '<p>'              '<p class="LC_error">'
            .&mt('No such file: [_1]',             .&mt('No such file: [_1]',
                 &display($oldfile))                  &display($oldfile))
            .'</p></form>'             .'</p></form>'
Line 1388  sub phasetwo { Line 1423  sub phasetwo {
  $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') ) ) {      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>');          $r->print(
               '<p>'
              .&Apache::lonhtmlcommon::confirm_success(&mt('Done'))
              .'<br /><a href="javascript:self.close()">'.&mt('Continue').'</a>'
              .'</p>'
           );
     } else {      } else {
         if ($env{'form.action'} eq 'rename') {          if ($env{'form.action'} eq 'rename') {
             $r->print('<h3><a href="'.&url($dest).'">'.&mt('Return to Directory').'</a></h3>');              $r->print(
             $r->print('<h3><a href="'.&url($dest_newname).'">'.$disp_newname.'</a></h3>');                   '<p>'.&Apache::lonhtmlcommon::confirm_success(&mt('Done')).'</p>'
                   .&Apache::lonhtmlcommon::actionbox(
                        ['<a href="'.&url($dest).'">'.&mt('Return to Directory').'</a>',
                         '<a href="'.&url($dest_newname).'">'.$disp_newname.'</a>']));
         } else {          } else {
     $r->print(&done(&url($dest)));      $r->print(&done($dest));
  }   }
     }      }
 }  }
Line 1403  sub handler { Line 1446  sub handler {
   
     $r=shift;      $r=shift;
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress','action','filename','newfilename']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress','action','filename','newfilename','mode']);
   
     &Debug($r, "loncfile.pm - handler entered");      &Debug($r, "loncfile.pm - handler entered");
     &Debug($r, " filename: ".$env{'form.filename'});      &Debug($r, " filename: ".$env{'form.filename'});
Line 1434  sub handler { Line 1477  sub handler {
  return HTTP_NOT_FOUND;   return HTTP_NOT_FOUND;
     }      }
   
     unless ($fn) {       unless ($fn) {
  &Debug($r, "loncfile::handler - doctored url is empty");   &Debug($r, "loncfile::handler - doctored url is empty");
  $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.   $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
        ' trying to cfile non-existing file', $r->filename);          ' trying to cfile non-existing file', $r->filename); 
Line 1442  sub handler { Line 1485  sub handler {
     }       } 
   
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
     my $uname;  
     my $udom;  
   
     ($uname,$udom)=      my ($uname,$udom) = &Apache::lonnet::constructaccess($fn);
  &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)) {      if (($uname eq '') || ($udom eq '')) {
  $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', 
Line 1476  function writeDone() { Line 1516  function writeDone() {
 |;  |;
  $loaditem{'onload'} = "writeDone()";   $loaditem{'onload'} = "writeDone()";
     }      }
       
       my $londocroot = $r->dir_config('lonDocRoot');
       my $trailfile = $fn;
       $trailfile =~ s{^/(priv/)}{$londocroot/$1};
   
     # Breadcrumbs      # Breadcrumbs
       my $crsauthor;
       my $text = 'Authoring Space';
       my $title = 'Authoring Space File Operation',
       my $href = &Apache::loncommon::authorspace(&url($fn));
       if ($env{'request.course.id'}) {
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           if ($href eq "/priv/$cdom/$cnum/") {
               $text = 'Course Authoring Space';
               $title = 'Course Authoring Space File Operation',
               $crsauthor = 1;
           }
       }
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb({      &Apache::lonhtmlcommon::add_breadcrumb({
         'text'  => 'Construction Space',          'text'  => $text,
         'href'  => &Apache::loncommon::authorspace(),          'href'  => $href,
     });      });
     &Apache::lonhtmlcommon::add_breadcrumb({      &Apache::lonhtmlcommon::add_breadcrumb({
         'text'  => 'File Operation',          'text'  => 'File Operation',
         'title' => 'Construction Space File Operation',          'title' => $title,
         'href'  => '',          'href'  => '',
     });      });
   
     $r->print(&Apache::loncommon::start_page('Construction Space File Operation',      $r->print(&Apache::loncommon::start_page($title,
      $js,       $js,
      {'add_entries' => \%loaditem,})       {'add_entries' => \%loaditem,})
              .&Apache::lonhtmlcommon::breadcrumbs()               .&Apache::lonhtmlcommon::breadcrumbs()
              .&Apache::loncommon::head_subbox(               .&Apache::loncommon::head_subbox(
                   &Apache::loncommon::CSTR_pageheader())                    &Apache::loncommon::CSTR_pageheader($trailfile))
     );      );
       
     $r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>');      $r->print('<p>'.&mt('Location').': '.&display($fn).'</p>');
       
     if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {      if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
         $r->print('<p class="LC_info">'          unless ($crsauthor) {  
                  .&mt('Co-Author [_1]',$uname.':'.$udom)              $r->print('<p class="LC_info">'
                  .'</p>'                       .&mt('Co-Author [_1]',$uname.':'.$udom)
         );                       .'</p>'
               );
           }
     }      }
   
   
     &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') {      my %action = &Apache::lonlocal::texthash(
       $r->print('<h3>'.&mt('Delete').'</h3>');          'delete'          => 'Delete',
     } elsif ($env{'form.action'} eq 'rename') {          'rename'          => 'Rename',
  $r->print('<h3>'.&mt('Rename').'</h3>');          'move'            => 'Move',
     } elsif ($env{'form.action'} eq 'move') {          'newdir'          => 'New Directory',
  $r->print('<h3>'.&mt('Move').'</h3>');          'decompress'      => 'Decompress',
     } elsif ($env{'form.action'} eq 'newdir') {          'copy'            => 'Copy',
  $r->print('<h3>'.&mt('New Directory').'</h3>');          'newfile'         => 'New Resource',
     } elsif ($env{'form.action'} eq 'decompress') {   'newhtmlfile'     => 'New Resource',
  $r->print('<h3>'.&mt('Decompress').'</h3>');   'newproblemfile'  => 'New Resource',
     } elsif ($env{'form.action'} eq 'copy') {   'newpagefile'     => 'New Resource',
  $r->print('<h3>'.&mt('Copy').'</h3>');   'newsequencefile' => 'New Resource',
     } elsif ($env{'form.action'} eq 'newfile' ||   'newrightsfile'   => 'New Resource',
      $env{'form.action'} eq 'newhtmlfile' ||   'newstyfile'      => 'New Resource',
      $env{'form.action'} eq 'newproblemfile' ||   'newtaskfile'     => 'New Resource',
      $env{'form.action'} eq 'newpagefile' ||          'newlibraryfile'  => 'New Resource',
      $env{'form.action'} eq 'newsequencefile' ||   'Select Action'   => 'New Resource',
      $env{'form.action'} eq 'newrightsfile' ||      );
      $env{'form.action'} eq 'newstyfile' ||      if ($action{$env{'form.action'}}) {
      $env{'form.action'} eq 'newtaskfile' ||          if ($crsauthor) {
              $env{'form.action'} eq 'newlibraryfile' ||              my @disallowed = qw(page sequence rights library);
      $env{'form.action'} eq 'Select Action' ) {              my $newtype;
  $r->print('<h3>'.&mt('New Resource').'</h3>');              if ($env{'form.action'} =~ /^new(\w+)file$/) {
                   $newtype = $1;
               } elsif ($env{'form.action'} eq 'newfile') {
                   ($newtype) = ($env{'form.newfilename'} =~ m{\.([^/.]+)$});
                   $newtype = lc($newtype);
               }
               if (($newtype ne '') &&
                   (grep(/^\Q$newtype\E$/,@disallowed))) {
                   $r->print('<p class="LC_error">'
                            .&mt('Creation of a new file of type: [_1] is not permitted in Course Authoring Space',$newtype)
                            .'</p>'
                            .&Apache::loncommon::end_page()
                   );
                   return OK;
               }
           }
           $r->print('<h2>'.$action{$env{'form.action'}}.'</h2>');
     } else {      } else {
         $r->print('<p class="LC_error">'          $r->print('<p class="LC_error">'
                  .&mt('Unknown Action').' '.$env{'form.action'}                   .&mt('Unknown Action: [_1]',$env{'form.action'})
                  .'</p>'                   .'</p>'
                  .&Apache::loncommon::end_page()                   .&Apache::loncommon::end_page()
         );          );
  return OK;            return OK;
     }      }
   
     if ($env{'form.phase'} eq 'two') {      if ($env{'form.phase'} eq 'two') {
  &Debug($r, "loncfile::handler  entering phase2");   &Debug($r, "loncfile::handler  entering phase2");
  &phasetwo($r,$fn,$uname,$udom);   &phasetwo($r,$fn,$uname,$udom);

Removed from v.1.110  
changed lines
  Added in v.1.126


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