Diff for /loncom/publisher/loncfile.pm between versions 1.60 and 1.113

version 1.60, 2004/08/20 16:29:15 version 1.113, 2011/11/02 19:12:40
Line 69  use File::Copy; Line 69  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::loncacc;
 use Apache::Log ();  
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
   use LONCAPA qw(:DEFAULT :match);
   
   
 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 101  my $r;    # Needs to be global for some Line 102  my $r;    # Needs to be global for some
 =cut  =cut
   
 sub Debug {  sub Debug {
     
     # Marshall the parameters.  
     
     my $r       = shift;  
     my $log     = $r->log;  
     my $message = shift;  
     
     # Put out the indicated message butonly if DEBUG is true.      # Put out the indicated message butonly if DEBUG is true.
     
     if ($DEBUG) {      if ($DEBUG) {
    my ($r,$message) = @_;
  $r->log_reason($message);   $r->log_reason($message);
     }      }
 }  }
   
   sub done {
      my ($url)=@_;
      my $done=&mt("Done");
      return(<<ENDDONE);
   <a href="$url">$done</a>
   <script type="text/javascript">
   location.href="$url";
   </script>
   ENDDONE
   }
   
 =pod  =pod
   
 =item URLToPath($url)  =item URLToPath($url)
Line 153  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/^http\:\/\/[^\/]+//;      $Url=~ s{//+}{/}g;
     $Url=~ s/^\///;      $Url=~ s{^/}{};
     $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;      $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=shift;
     $fn=~s/^\/home\/(\w+)\/public\_html/\/priv\/$1/;      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
       $fn=~ s/^\Q$londocroot\E//;
       $fn=~s{/\./}{/}g;
     $fn=&HTML::Entities::encode($fn,'<>"&');      $fn=&HTML::Entities::encode($fn,'<>"&');
     return $fn;      return $fn;
 }  }
   
 sub display {  sub display {
     my $fn=shift;      my $fn=shift;
     $fn=~s-^/home/(\w+)/public_html-/priv/$1-;      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     return '<tt>'.$fn.'</tt>';      $fn=~s/^\Q$londocroot\E//;
       $fn=~s{/\./}{/}g;
       return '<span class="LC_filename">'.$fn.'</span>';
 }  }
   
   
Line 181  sub display { Line 190  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 194  sub obsolete_unpub { Line 203  sub obsolete_unpub {
     }      }
 }  }
   
   # see if directory is empty
   # ignores any .meta, .save, .bak, and .log files created for a previously
   # published file, which has since been marked obsolete and deleted.
   sub empty_directory {
       my ($dirname,$phase) = @_;
       if (opendir DIR, $dirname) {
           my @files = grep(!/^\.\.?$/, readdir(DIR)); # ignore . and ..
           if (@files) { 
               my @orphans = grep(/\.(meta|save|log|bak)$/,@files);
               if (scalar(@files) - scalar(@orphans) > 0) { 
                   return 0;
               } else {
                   if (($phase eq 'Delete2') && (@orphans > 0)) {
                       foreach my $file (@orphans) {
                           if ($file =~ /\.(meta|save|log|bak)$/) {
                               unlink($dirname.$file);
                           }
                       }
                   }
               }
           }
           closedir(DIR);
           return 1;
       }
       return 0;
   }
   
 =pod  =pod
   
Line 207  sub obsolete_unpub { Line 241  sub obsolete_unpub {
   
 =over 4  =over 4
   
 =item  $user   - string [in] - Name of the user for which to check.  =item  $user     - string [in] - Name of the user for which to check.
   
 =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  $file   - string [in] - Name of the file.  =item  $file     - string [in] - Name of the file.
   
   =item  $creating - string [in] - optional, type of object being created,
                                  either 'directory' or 'file'. Defaults to
                                  'file' if unspecified.
   
 =back  =back
   
Line 220  Returns: Line 258  Returns:
   
 =over 4  =over 4
   
   =item  string - Either undef, 'warning' or 'error' depending on the
                   type of problem
   
 =item  string - Either where the resource exists as an html string that can  =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             be embedded in a dialog or an empty string if the resource
            does not exist.             does not exist.
Line 229  Returns: Line 270  Returns:
 =cut  =cut
   
 sub exists {  sub exists {
     my ($user, $domain, $construct) = @_;      my ($user, $domain, $construct, $creating) = @_;
       $creating ||= 'file';
   
       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\//;      my ($type,$result);
     my $result='';      
     if ( -d $construct ) {      if ( -d $construct ) {
  return &mt('Error: destination for operation is an existing directory.');   return ('error','<p><span class="LC_error">'.&mt('Error: destination for operation is an existing directory.').'</span></p>');
   
     }      }
   
     if ( -e $published) {      if ( -e $published) {
  $result.='<p><font color="red">'.&mt('Warning: target file exists, and has been published!').'</font></p>';   if ( -e $construct ) {
       $type = 'warning';
       $result.='<p><span class="LC_warning">'.&mt('Warning: target file exists, and has been published!').'</span></p>';
    } else {
       my $published_type = (-d $published) ? 'directory' : 'file';
   
       if ($published_type eq $creating) {
    $type = 'warning';
    $result.='<p><span class="LC_warning">'.&mt("Warning: a published $published_type of this name exists.").'</span></p>';
       } else {
    $type = 'error';
    $result.='<p><span class="LC_error">'.&mt("Error: a published $published_type of this name exists.").'</span></p>';
       }
    }
     } elsif ( -e $construct) {      } elsif ( -e $construct) {
  $result.='<p><font color="red">'.&mt('Warning: target file exists!').'</font></p>';   $type = 'warning';
    $result.='<p><span class="LC_warning">'.&mt('Warning: target file exists!').'</span></p>';
     }      }
     return $result;  
       return ($type,$result);
 }  }
   
 =pod  =pod
Line 281  sub checksuffix { Line 341  sub checksuffix {
     my $newsuffix;      my $newsuffix;
     if ($new=~m:(.*/*)([^/]+)\.(\w+)$:) { $newsuffix=$3; }      if ($new=~m:(.*/*)([^/]+)\.(\w+)$:) { $newsuffix=$3; }
     if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }      if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }
     if ($oldsuffix ne $newsuffix) {      if (lc($oldsuffix) ne lc($newsuffix)) {
  $result.=   $result.=
             '<p><font color="red">'.&mt('Warning: change of MIME type!').'</font></p>';              '<p><span class="LC_warning">'.&mt('Warning: change of MIME type!').'</span></p>';
     }      }
     return $result;      return $result;
 }  }
   
 sub cleanDest {  sub cleanDest {
     my ($request,$dest,$subdir)=@_;      my ($request,$dest,$subdir,$fn,$uname,$udom)=@_;
     #remove bad characters      #remove bad characters
     my $foundbad=0;      my $foundbad=0;
       my $error='';
     if ($subdir && $dest =~/\./) {      if ($subdir && $dest =~/\./) {
  $foundbad=1;   $foundbad=1;
  $dest=~s/\.//g;   $dest=~s/\.//g;
     }      }
     if  ($dest=~/[\#\?&%\"]/) {      $dest =~ s/(\s+$|^\s+)//g;
       if  ($dest=~/[\#\?&%\":]/) {
  $foundbad=1;   $foundbad=1;
  $dest=~s/[\#\?&%\"]//g;   $dest=~s/[\#\?&%\":]//g;
       }
       if ($dest=~m|/|) {
    my ($newpath)=($dest=~m|(.*)/|);
    ($newpath,$error)=&relativeDest($fn,$newpath,$uname,$udom);
    if (! -d "$newpath") {
       $request->print('<p><span 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."
                                  ,&display($newpath))
                              .'</span></p>');
       $dest=~s|.*/||;
    }
       }
       if ($dest =~ /\.(\d+)\.(\w+)$/){
    $request->print('<p><span class="LC_warning">'
    .&mt('Bad filename [_1]',&display($dest))
                           .'<br />'
                           .&mt('[_1](name).(number).(extension)[_2] not allowed.','<tt>','</tt>')
                           .'<br />'
                           .&mt('Removing the [_1].number.[_2] from requested filename.','<tt>','</tt>')
    .'</span></p>');
    $dest =~ s/\.(\d+)(\.\w+)$/$2/;
     }      }
     if ($foundbad) {      if ($foundbad) {
  $request->print("<p><font color=\"red\">".&mt('Invalid characters in requested name have been removed.')."</font></p>");          $request->print('<p><span class="LC_warning">'
                          .&mt('Invalid characters in requested name have been removed.')
                           .'</span></p>'
           );
     }      }
     return $dest;      return ($dest,$error);
 }  }
   
 sub relativeDest {  sub relativeDest {
     my ($fn,$newfilename,$uname)=@_;      my ($fn,$newfilename,$uname,$udom)=@_;
       my $error = '';
     if ($newfilename=~/^\//) {      if ($newfilename=~/^\//) {
 # absolute, simply add path  # absolute, simply add path
  $newfilename='/home/'.$uname.'/public_html/';          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/..
       }
       my ($authorname,$authordom)=&Apache::loncacc::constructaccess($newfilename);
       unless (($authorname) && ($authordom)) {
          my $otherdir = &display($newfilename);
          $error = &mt('Access denied to [_1]',$otherdir);
     }      }
     return $newfilename;      return ($newfilename,$error);
 }  }
   
 =pod  =pod
Line 345  sub CloseForm1 { Line 438  sub CloseForm1 {
     my ($request,  $fn) = @_;      my ($request,  $fn) = @_;
     $request->print('<p><input type="submit" value="'.&mt('Continue').'" /></p></form>');      $request->print('<p><input type="submit" value="'.&mt('Continue').'" /></p></form>');
     $request->print('<form action="'.&url($fn).      $request->print('<form action="'.&url($fn).
     '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');      '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
 }  }
   
   
Line 375  Parameters: Line 468  Parameters:
   
 sub CloseForm2 {  sub CloseForm2 {
     my ($request, $user, $fn) = @_;      my ($request, $user, $fn) = @_;
     $request->print('<h3><a href="'.&url($fn).'/">'.&mt('Done').'</a></h3>');      $request->print(&done(&url($fn)));
 }  }
   
 =pod  =pod
Line 436  sub Rename1 { Line 529  sub Rename1 {
     if (-d $fn) {      if (-d $fn) {
  $newfilename=~/\.(\w+)$/;   $newfilename=~/\.(\w+)$/;
  if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {   if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
     $request->print('<br /><font color="red">'.      $request->print('<p><span class="LC_error">'.
     &mt('Cannot change MIME type of a directory').      &mt('Cannot change MIME type of a directory.').
     '</font>'.      '</span>'.
     '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');      '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a></p>');
     return;      return;
  }   }
  $newfilename=~s/\/[^\/]+\/([^\/]+)$/\/$1/;   $newfilename=~s/\/[^\/]+\/([^\/]+)$/\/$1/;
Line 448  sub Rename1 { Line 541  sub Rename1 {
     while ($newfilename=~m:/\.\./:) {      while ($newfilename=~m:/\.\./:) {
  $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..   $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
     }      }
     my $return=&exists($user, $domain, $newfilename);      my ($type, $return)=&exists($user, $domain, $newfilename);
     $request->print($return);      $request->print($return);
     if ($return =~/^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>');
  return;   return;
     }      }
     unless (&obsolete_unpub($user,$domain,$fn)) {      unless (&obsolete_unpub($user,$domain,$fn)) {
  $request->print('<h3>'.&mt('Cannot rename or move non-obsolete published file').'</h3>'.                  $request->print('<p><span class="LC_error">'
  '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');                                 .&mt('Cannot rename or move non-obsolete published file.')
                                  .'</span><br />'
                                  .'<a href="'.&url($fn).'">'.&mt('Cancel').'</a></p>'
                   );
  return;   return;
     }      }
     my $action;      my $action;
     if ($style eq 'rename') {      if ($style eq 'rename') {
  $action=&mt('Rename');   $action='Rename';
     } else {      } else {
  $action=&mt('Move');   $action='Move';
     }      }
     $request->print('<input type="hidden" name="newfilename" value="'.              $request->print('<input type="hidden" name="newfilename" value="'
     $newfilename.                             .$newfilename.'" />'
     '" /><p>'.$action.' '.&display($fn).                             .'<p>'
     '</tt><br />to '.&display($newfilename).'?</p>');                             .&mt($action.' [_1] to [_2]?',
                                   &display($fn),
                                   &display($newfilename))
                              .'</p>'
           );
     &CloseForm1($request, $fn);      &CloseForm1($request, $fn);
  } else {   } else {
     $request->print('<p>'.&mt('No new filename specified.').'</p></form>');      $request->print('<p class="LC_error">'.&mt('No new filename specified.').'</p></form>');
     return;      return;
  }   }
     } else {      } else {
  $request->print('<p> '.&mt('No such file').': '.&display($fn).'</p></form>');          $request->print('<p class="LC_error">'
                          .&mt('No such file: [_1]',
                               &display($fn))
                          .'</p></form>'
           );
  return;   return;
     }      }
           
Line 510  sub Delete1 { Line 614  sub Delete1 {
   
     if( -e $fn) {      if( -e $fn) {
  $request->print('<input type="hidden" name="newfilename" value="'.   $request->print('<input type="hidden" name="newfilename" value="'.
  $fn.'"/>');   $fn.'" />');
  unless (&obsolete_unpub($user,$domain,$fn)) {          if (-d $fn) {
     $request->print('<h3>'.&mt('Cannot delete non-obsolete published file').'</h3>'.              unless (&empty_directory($fn,'Delete1')) {
     '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');                  $request->print('<p>'
     return;                                 .'<span class="LC_error">'
  }                                 .&mt('Only empty directories may be deleted.')
  $request->print('<p>'.&mt('Delete').' '.&display($fn).'?</p>');                                 .'</span><br />'
                                  .&mt('You must delete the contents of the directory first.')
                                  .'</p>'
                                  .'<p><a href="'.&url($fn).'">'.&mt('Cancel').'</a></p>'
                   );
                   return;
               }
           } else { 
       unless (&obsolete_unpub($user,$domain,$fn)) {
                   $request->print('<p><span class="LC_error">'
                                  .&mt('Cannot delete non-obsolete published file.')
                                  .'</span><br />'
                                  .'<a href="'.&url($fn).'">'.&mt('Cancel').'</a></p>'
                   );
           return;
       }
           }
           $request->print('<p>'
                          .&mt('Delete [_1]?',
                               &display($fn))
                          .'</p>'
           );
  &CloseForm1($request, $fn);   &CloseForm1($request, $fn);
     } else {      } else {
  $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');          $request->print('<p class="LC_error">'
                          .&mt('No such file: [_1]',
                               &display($fn))
                          .'</p></form>'
           );
     }      }
 }  }
   
Line 567  sub Copy1 { Line 696  sub Copy1 {
     $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..      $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
  }   }
  $request->print(&checksuffix($fn,$newfilename));   $request->print(&checksuffix($fn,$newfilename));
  my $return=&exists($user, $domain, $newfilename);   my ($type,$return)=&exists($user, $domain, $newfilename);
  $request->print($return);   $request->print($return);
  if ($return =~/^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>');
     return;      return;
  }   }
  $request->print('<input type="hidden" name="newfilename" value="'.      $request->print(
  $newfilename.          '<input type="hidden" name="newfilename"'
  '" /><p>'.&mt('Copy').' '.&display($fn).'<br />to '.         .' value="'.$newfilename.'" />'
  &display($newfilename).'?</p>');         .'<p>'
          .&mt('Copy [_1] to [_2]?',
               &display($fn),
               &display($newfilename))
          .'</p>'
           );
  &CloseForm1($request, $fn);   &CloseForm1($request, $fn);
     } else {      } else {
  $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');          $request->print('<p class="LC_error">'
                          .&mt('No such file: [_1]',
                               &display($fn))
                          .'</p></form>'
           );
     }      }
 }  }
   
Line 625  causes the newdir operation to transitio Line 763  causes the newdir operation to transitio
 sub NewDir1 {  sub NewDir1 {
     my ($request, $username, $domain, $fn, $newfilename, $mode) = @_;      my ($request, $username, $domain, $fn, $newfilename, $mode) = @_;
   
     my $result=&exists($username,$domain,$newfilename);      my ($type, $result)=&exists($username,$domain,$newfilename,'directory');
     if ($result) {      $request->print($result);
  $request->print('<font color="red">'.$result.'</font></form>');      if ($type eq 'error') {
    $request->print('</form>');
     } else {      } else {
  if ($mode eq 'testbank') {   if (($mode eq 'testbank') || ($mode eq 'imsimport')) {
     $request->print('<input type="hidden" name="callingmode" value="testbank">');      $request->print('<input type="hidden" name="callingmode" value="'.$mode.'" />'."\n".
  } elsif ($mode eq 'imsimport') {                              '<input type="hidden" name="inhibitmenu" value="yes" />');
     $request->print('<input type="hidden" name="callingmode" value="imsimport">');   }
  }          $request->print('<input type="hidden" name="newfilename" value="'
  $request->print('<input type="hidden" name="newfilename" value="'.                         .$newfilename.'" />'
  $newfilename.'" /><p>'.&mt('Make new directory').' '.                         .'<p>'
  &display($newfilename).'?</p>');                         .&mt('Make new directory [_1]?',
                               &display($newfilename))
                          .'</p>'
           );
  &CloseForm1($request, $fn);   &CloseForm1($request, $fn);
     }      }
 }  }
Line 645  sub NewDir1 { Line 787  sub NewDir1 {
 sub Decompress1 {  sub Decompress1 {
     my ($request, $user, $domain, $fn) = @_;      my ($request, $user, $domain, $fn) = @_;
     if( -e $fn) {      if( -e $fn) {
     $request->print('<input type="hidden" name="newfilename" value="'.$fn.'"/>');      $request->print('<input type="hidden" name="newfilename" value="'.$fn.'" />');
     $request->print('<p>'.&mt('Decompress').' '.&display($fn).'?</p>');      $request->print('<p>'
                      .&mt('Decompress [_1]?',
                           &display($fn))
                      .'</p>'
       );
     &CloseForm1($request, $fn);      &CloseForm1($request, $fn);
     } else {      } else {
  $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');          $request->print('<p class="LC_error">'
                          .&mt('No such file: [_1]',
                               &display($fn))
                          .'</p></form>'
           );
     }      }
 }  }
   
Line 695  button which returns you to the driector Line 845  button which returns you to the driector
   
 sub NewFile1 {  sub NewFile1 {
     my ($request, $user, $domain, $fn, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename) = @_;
       return if (&filename_check($newfilename) ne 'ok');
   
     if ($ENV{'form.action'} =~ /new(.+)file/) {      if ($env{'form.action'} =~ /new(.+)file/) {
  my $extension=$1;   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 !~ /\Q.$extension\E$/) {
     if ($newfilename =~ m|^[^\.]*\.([^\.]+)$|) {      if ($newfilename =~ m|/[^/.]*\.(?:[^/.]+)$|) {
  #already has an extension strip it and add in expected one   #already has an extension strip it and add in expected one
  $newfilename =~ s|.([^\.]+)$||;   $newfilename =~ s|(/[^./])\.(?:[^.]+)$|$1|;
     }      }
     $newfilename.=".$extension";      $newfilename.=".$extension";
  }   }
     }      }
     my $result=&exists($user,$domain,$newfilename);      my ($type, $result)=&exists($user,$domain,$newfilename);
     if($result) {      $request->print($result);
  $request->print('<font color="red">'.$result.'</font></form>');      if ($type eq 'error') {
    $request->print('</form>');
     } else {      } else {
           my $extension;
   
           if ($newfilename =~ m{[^/.]+\.([^/.]+)$}) {
               $extension = $1;
           }
   
           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))) {
               my $validexts = '.'.join(', .',@okexts);
               $request->print('<p class="LC_warning">'.
                   &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 following are valid extensions: [_1].',$validexts).
                   '</p></form><p>'.
    '<form name="fileaction" action="/adm/cfile" method="post">'.
                   '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
    '<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></form></p>'.
                   '<p><form action="'.&url($fn).
                   '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></form></p>');
               return;
           }
   
  $request->print('<p>'.&mt('Make new file').' '.&display($newfilename).'?</p>');   $request->print('<p>'.&mt('Make new file').' '.&display($newfilename).'?</p>');
  $request->print('</form>');   $request->print('</form>');
   
  $request->print('<form action="'.&url($newfilename).   $request->print('<form action="'.&url($newfilename).
  '" method="POST"><p><input type="submit" value="'.&mt('Continue').'" /></p></form>');   '" method="post"><p><input type="submit" value="'.&mt('Continue').'" /></p></form>');
  $request->print('<form action="'.&url($fn).   $request->print('<form action="'.&url($fn).
  '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');   '" method="post"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
     }      }
       return;
   }
   
   sub filename_check {
       my ($newfilename) = @_;
       ##Informs User (name).(number).(extension) not allowed
       if($newfilename =~ /\.(\d+)\.(\w+)$/){
           $r->print('<span class="LC_error">'.$newfilename.
                     ' - '.&mt('Bad Filename').'<br />('.&mt('name').').('.&mt('number').').('.&mt('extension').') '.
                     ' '.&mt('Not Allowed').'</span>');
           return;
       }
       if($newfilename =~ /(\:\:\:|\&\&\&|\_\_\_)/){
           $r->print('<span class="LC_error">'.$newfilename.
                     ' - '.&mt('Bad Filename').'<br />('.&mt('Must not include').' '.$1.') '.
                     ' '.&mt('Not Allowed').'</span>');
           return;
       }
       return 'ok'; 
 }  }
   
 =pod  =pod
Line 759  sub phaseone { Line 947  sub phaseone {
     my ($r,$fn,$uname,$udom)=@_;      my ($r,$fn,$uname,$udom)=@_;
       
     my $doingdir=0;      my $doingdir=0;
     if ($ENV{'form.action'} eq 'newdir') { $doingdir=1; }      if ($env{'form.action'} eq 'newdir') { $doingdir=1; }
     my $newfilename=&cleanDest($r,$ENV{'form.newfilename'},$doingdir);      my ($newfilename,$error) = 
     $newfilename=&relativeDest($fn,$newfilename,$uname);          &cleanDest($r,$env{'form.newfilename'},$doingdir,$fn,$uname,$udom);
       unless ($error) {
           ($newfilename,$error)=&relativeDest($fn,$newfilename,$uname,$udom);
       }
       if ($error) {
           my $dirlist;
           if ($fn=~m{^(.*/)[^/]+$}) {
               $dirlist=$1;
           } else {
               $dirlist=$fn; 
           }
           $r->print('<div class="LC_error">'.$error.'</div>'.
                     '<h3><a href="'.&url($dirlist).'">'.&mt('Return to Directory').
                     '</a></h3>');
           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 'rename') {
  &Rename1($r, $uname, $udom, $fn, $newfilename, 'rename');   &Rename1($r, $uname, $udom, $fn, $newfilename, 'rename');
     } elsif ($ENV{'form.action'} eq 'move') {      } elsif ($env{'form.action'} eq 'move') {
  &Rename1($r, $uname, $udom, $fn, $newfilename, 'move');   &Rename1($r, $uname, $udom, $fn, $newfilename, 'move');
     } elsif ($ENV{'form.action'} eq 'delete') {       } elsif ($env{'form.action'} eq 'delete') { 
  &Delete1($r, $uname, $udom, $fn);   &Delete1($r, $uname, $udom, $fn);
     } elsif ($ENV{'form.action'} eq 'decompress') {      } elsif ($env{'form.action'} eq 'decompress') {
  &Decompress1($r, $uname, $udom, $fn);   &Decompress1($r, $uname, $udom, $fn);
     } elsif ($ENV{'form.action'} eq 'copy') {       } elsif ($env{'form.action'} eq 'copy') { 
  if($newfilename) {   if($newfilename) {
     &Copy1($r, $uname, $udom, $fn, $newfilename);      &Copy1($r, $uname, $udom, $fn, $newfilename);
  } else {   } else {
     $r->print('<p>'.&mt('No new filename specified.').'</p></form>');              $r->print('<p class="LC_error">'
                        .&mt('No new filename specified.')
                        .'</p></form>'
               );
  }   }
     } elsif ($ENV{'form.action'} eq 'newdir') {      } elsif ($env{'form.action'} eq 'newdir') {
  my $mode = '';   my $mode = '';
  if (exists($ENV{'form.callingmode'}) ) {   if (exists($env{'form.callingmode'}) ) {
     $mode = $ENV{'form.callingmode'};      $mode = $env{'form.callingmode'};
  }      }   
  &NewDir1($r, $uname, $udom, $fn, $newfilename, $mode);   &NewDir1($r, $uname, $udom, $fn, $newfilename, $mode);
     }  elsif ($ENV{'form.action'} eq 'newfile' ||      }  elsif ($env{'form.action'} eq 'newfile' ||
       $ENV{'form.action'} eq 'newhtmlfile' ||        $env{'form.action'} eq 'newhtmlfile' ||
       $ENV{'form.action'} eq 'newproblemfile' ||        $env{'form.action'} eq 'newproblemfile' ||
       $ENV{'form.action'} eq 'newpagefile' ||        $env{'form.action'} eq 'newpagefile' ||
       $ENV{'form.action'} eq 'newsequencefile' ||        $env{'form.action'} eq 'newsequencefile' ||
       $ENV{'form.action'} eq 'newrightsfile' ||        $env{'form.action'} eq 'newrightsfile' ||
       $ENV{'form.action'} eq 'newstyfile' ||        $env{'form.action'} eq 'newstyfile' ||
       $ENV{'form.action'} eq 'Select Action') {        $env{'form.action'} eq 'newtaskfile' ||
  if ($newfilename) {                $env{'form.action'} eq 'newlibraryfile' ||
         $env{'form.action'} eq 'Select Action') {
           my $empty=&mt('Type Name Here');
    if (($newfilename!~/\/$/) && ($newfilename!~/$empty$/)) {
     &NewFile1($r, $uname, $udom, $fn, $newfilename);      &NewFile1($r, $uname, $udom, $fn, $newfilename);
  } else {   } else {
     $r->print('<p>'.&mt('No new filename specified.').'</p></form>');              $r->print('<p class="LC_error">'
                        .&mt('No new filename specified.')
                        .'</p></form>'
               );
  }   }
     }      }
 }  }
Line 850  sub Rename2 { Line 1062  sub Rename2 {
  my $oRN=$oldfile;   my $oRN=$oldfile;
  my $nRN=$newfile;   my $nRN=$newfile;
  unless (rename($oldfile,$newfile)) {   unless (rename($oldfile,$newfile)) {
     $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');      $request->print('<span class="LC_error">'.&mt('Error').': '.$!.'</span>');
     return 0;      return 0;
  }   }
  ## If old name.(extension) exits, move under new name.   ## If old name.(extension) exits, move under new name.
Line 885  sub Rename2 { Line 1097  sub Rename2 {
     unlink $tmp2;      unlink $tmp2;
  }   }
     } else {      } else {
  $request->print("<p> ".&mt('No such file').": ".&display($oldfile).'</p></form>');          $request->print(
               '<p>'
              .&mt('No such file: [_1]',
                   &display($oldfile))
              .'</p></form>'
           );
  return 0;   return 0;
     }      }
     return 1;      return 1;
Line 922  Returns: Line 1139  Returns:
   
 sub Delete2 {  sub Delete2 {
     my ($request, $user, $filename) = @_;      my ($request, $user, $filename) = @_;
     if(opendir DIR, $filename) {       if (-d $filename) { 
  my @files=readdir(DIR);   unless (&empty_directory($filename,'Delete2')) { 
  shift @files; shift @files; # takes off . and ..      $request->print('<span class="LC_error">'.&mt('Error: Directory Non Empty').'</span>'); 
  if(@files) {   
     $request->print('<font color="red"> '.&mt('Error: Directory Non Empty').'</font>');   
     return 0;      return 0;
  } else {      } else {   
     if(-e $filename) {      if(-e $filename) {
  unless(rmdir($filename)) {   unless(rmdir($filename)) {
     $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');      $request->print('<span class="LC_error">'.&mt('Error').': '.$!.'</span>');
     return 0;      return 0;
  }   }
     } else {      } else {
  $request->print('<p> '.&mt('No such file').'. </p></form>');          $request->print('<p class="LC_error">'.&mt('No such file').'</p></form>');
  return 0;   return 0;
     }      }
  }   }
     } else {      } else {
  if(-e $filename) {   if(-e $filename) {
     unless(unlink($filename)) {      unless(unlink($filename)) {
  $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');   $request->print('<span class="LC_error">'.&mt('Error').': '.$!.'</span>');
  return 0;   return 0;
     }      }
  } else {   } else {
     $request->print('<p> '.&mt('No such file').'. </p></form>');              $request->print('<p class="LC_error">'.&mt('No such file').'</p></form>');
     return 0;      return 0;
  }   }
     }      }
Line 977  sub Delete2 { Line 1192  sub Delete2 {
   
 =back  =back
   
 Returns 0 failure, and 0 successs.  Returns 0 failure, and 1 successs.
   
 =cut  =cut
   
Line 985  sub Copy2 { Line 1200  sub Copy2 {
     my ($request, $username, $dir, $oldfile, $newfile) = @_;      my ($request, $username, $dir, $oldfile, $newfile) = @_;
     &Debug($request ,"Will try to copy $oldfile to $newfile");      &Debug($request ,"Will try to copy $oldfile to $newfile");
     if(-e $oldfile) {      if(-e $oldfile) {
           if ($oldfile eq $newfile) {
               $request->print('<span class="LC_error">'.&mt('Warning').': '.&mt('Name of new file is the same as name of old file').' - '.&mt('no action taken').'.</span>');
               return 1;
           }
  unless (copy($oldfile, $newfile)) {   unless (copy($oldfile, $newfile)) {
     $request->print('<font color="red"> '.&mt('copy Error').': '.$!.'</font>');      $request->print('<span class="LC_error">'.&mt('copy Error').': '.$!.'</span>');
       return 0;
    } elsif (!chmod(0660, $newfile)) {
       $request->print('<span class="LC_error">'.&mt('chmod error').': '.$!.'</span>');
       return 0;
    } elsif (-e $oldfile.'.meta' && 
    !copy($oldfile.'.meta', $newfile.'.meta') &&
    !chmod(0660, $newfile.'.meta')) {
       $request->print('<span class="LC_error">'.&mt('copy metadata error').
       ': '.$!.'</span>');
     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> '.&mt('No such file').' </p>');          $request->print('<p class="LC_error">'.&mt('No such file').'</p>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
Line 1028  sub NewDir2 { Line 1252  sub NewDir2 {
     my ($request, $user, $newdirectory) = @_;      my ($request, $user, $newdirectory) = @_;
       
     unless(mkdir($newdirectory, 02770)) {      unless(mkdir($newdirectory, 02770)) {
  $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');   $request->print('<span class="LC_error">'.&mt('Error').': '.$!.'</span>');
  return 0;   return 0;
     }      }
     unless(chmod(02770, ($newdirectory))) {      unless(chmod(02770, ($newdirectory))) {
  $request->print('<font color="red"> '.&mt('Error').': '.$!.'</font>');   $request->print('<span class="LC_error">'.&mt('Error').': '.$!.'</span>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
Line 1040  sub NewDir2 { Line 1264  sub NewDir2 {
   
 sub decompress2 {  sub decompress2 {
     my ($r, $user, $dir, $file) = @_;      my ($r, $user, $dir, $file) = @_;
     &Apache::lonnet::appenv('cgi.file' => $file);      &Apache::lonnet::appenv({'cgi.file' => $file});
     &Apache::lonnet::appenv('cgi.dir' => $dir);      &Apache::lonnet::appenv({'cgi.dir' => $dir});
     my $result=&Apache::lonnet::ssi_body('/cgi-bin/decompress.pl');      my $result=&Apache::lonnet::ssi_body('/cgi-bin/decompress.pl');
     $r->print($result);      $r->print($result);
     &Apache::lonnet::delenv('cgi.file');      &Apache::lonnet::delenv('cgi.file');
Line 1086  sub phasetwo { Line 1310  sub phasetwo {
           
     &Debug($r, "loncfile - Entering phase 2 for $fn");      &Debug($r, "loncfile - Entering phase 2 for $fn");
           
     # Break down the file into it's component pieces.      # Break down the file into its component pieces.
           
     my $dir; # Directory path      my $dir; # Directory path
     my $main; # Filename.      my $main; # Filename.
Line 1096  sub phasetwo { Line 1320  sub phasetwo {
  $main=$2; # Filename.   $main=$2; # Filename.
     }      }
     if($main=~m:\.(\w+)$:){ # Fixes problems with filenames with no extensions      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   $suffix=$1; #This is the actually filename extension if it exists
    $main=~s/\.\w+$//; #strip the extension
     }      }
     my $dest;                   # On success this is where we'll go.      my $dest;                       #
           my $dest_dir;                   # On success this is where we'll go.
       my $disp_newname;               #
       my $dest_newname;               #
     &Debug($r,"loncfile::phase2 dir = $dir main = $main suffix = $suffix");      &Debug($r,"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,"loncfile::phase2 Full construction space name: $conspace");      &Debug($r,"loncfile::phase2 Full construction space name: $conspace");
           
     &Debug($r,"loncfie::phase2 action is $ENV{'form.action'}");      &Debug($r,"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 'decompress') { 
  $main .= '.';   $main .= '.'.$suffix;
  $main .= $suffix;  
  if(!&decompress2($r, $uname, $dir, $main)) {   if(!&decompress2($r, $uname, $dir, $main)) {
     return ;      return ;
  }   }
  $dest = $dir."/.";   $dest = $dir."/.";
     } elsif ($ENV{'form.action'} eq 'rename') { # Rename.      } elsif ($env{'form.action'} eq 'rename' ||
  if($ENV{'form.newfilename'}) {       $env{'form.action'} eq 'move') {
    if($env{'form.newfilename'}) {
     if (!defined($dir)) {      if (!defined($dir)) {
  $fn=~m:^(.*)/:;   $fn=~m:^(.*)/:;
  $dir=$1;    $dir=$1; 
     }      }
     if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {      if(!&Rename2($r, $uname, $dir, $fn, $env{'form.newfilename'})) {
  return;   return;
     }      }
     $dest = $ENV{'form.newfilename'};      $dest = $dir."/";
       $dest_newname = $env{'form.newfilename'};
       $env{'form.newfilename'} =~ /.+(\/.+$)/;
       $disp_newname = $1;
       $disp_newname =~ s/\///;
  }   }
     } 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'})) {
     return ;      return ;
  }   }
  # 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 class="LC_error">'.&mt('No New filename specified').'</p></form>');
     return;      return;
  }   }
   
     } elsif ($ENV{'form.action'} eq 'newdir') {      } elsif ($env{'form.action'} eq 'newdir') {
         my $newdir= $ENV{'form.newfilename'};          my $newdir= $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') ) ) {      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('<h3><a href="javascript:self.close()">'.&mt('Done').'</a></h3>');
     } else {      } else {
  $r->print('<h3><a href="'.&url($dest).'">'.&mt('Done').'</a></h3>');          if ($env{'form.action'} eq 'rename') {
               $r->print('<h3><a href="'.&url($dest).'">'.&mt('Return to Directory').'</a></h3>');
               $r->print('<h3><a href="'.&url($dest_newname).'">'.$disp_newname.'</a></h3>');
           } else {
       $r->print(&done(&url($dest)));
    }
     }      }
 }  }
   
Line 1169  sub handler { Line 1404  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress','action','filename','newfilename']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress','action','filename','newfilename']);
   
     &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'});
 #  #
 # Determine the root filename  # Determine the root filename
 # This could come in as "filename", which actually is a URL, or  # This could come in as "filename", which actually is a URL, or
Line 1178  sub handler { Line 1413  sub handler {
 #  #
     my $fn;      my $fn;
   
     if ($ENV{'form.filename'}) {      if ($env{'form.filename'}) {
  &Debug($r, "test: $ENV{'form.filename'}");   &Debug($r, "test: $env{'form.filename'}");
  $fn=&Apache::lonnet::unescape($ENV{'form.filename'});   $fn=&unescape($env{'form.filename'});
  $fn=&URLToPath($fn);   $fn=&URLToPath($fn);
     }  elsif($ENV{'QUERY_STRING'} && $ENV{'form.phase'} ne 'two') {        }  elsif($ENV{'QUERY_STRING'} && $env{'form.phase'} ne 'two') {  
  #Just hijack the script only the first time around to inject the   #Just hijack the script only the first time around to inject the
  #correct information for further processing   #correct information for further processing
  $fn=&Apache::lonnet::unescape($ENV{'form.decompress'});   $fn=&unescape($env{'form.decompress'});
  $fn=&URLToPath($fn);   $fn=&URLToPath($fn);
  $ENV{'form.action'}="decompress";   $env{'form.action'}="decompress";
     } elsif ($ENV{'form.qualifiedfilename'}) {      } elsif ($env{'form.qualifiedfilename'}) {
  $fn=$ENV{'form.qualifiedfilename'};   $fn=$env{'form.qualifiedfilename'};
     } else {      } else {
  &Debug($r, "loncfile::handler - no form.filename");   &Debug($r, "loncfile::handler - no form.filename");
  $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.   $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
        ' unspecified filename for cfile', $r->filename);          ' unspecified filename for cfile', $r->filename); 
  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); 
  return HTTP_NOT_FOUND;   return HTTP_NOT_FOUND;
     }       } 
   
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
     my $uname;  
     my $udom;  
   
     ($uname,$udom)=      my ($uname,$udom) = &Apache::loncacc::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', 
        $r->filename);          $r->filename); 
  return HTTP_NOT_ACCEPTABLE;   return HTTP_NOT_ACCEPTABLE;
Line 1224  sub handler { Line 1456  sub handler {
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
   
     if ( ($ENV{'form.action'} eq 'newdir') && ($ENV{'form.phase'} eq 'two') && ( ($ENV{'form.callingmode'} eq 'testbank') || ($ENV{'form.callingmode'} eq 'imsimport') ) ) {      my (%loaditem,$js);
  my $newdirname = $ENV{'form.newfilename'};  
  $r->print('<html><head><title>LON-CAPA Construction Space</title><script language="Javascript">');      if ( ($env{'form.action'} eq 'newdir') && ($env{'form.phase'} eq 'two') && ( ($env{'form.callingmode'} eq 'testbank') || ($env{'form.callingmode'} eq 'imsimport') ) ) {
  $r->print(qq|   my $newdirname = $env{'form.newfilename'};
    $js = qq|
   <script type="text/javascript">
 function writeDone() {  function writeDone() {
     var winName = window.opener  
     window.focus();      window.focus();
     winName.document.dataForm.newdir.value = "$newdirname"      opener.document.info.newdir.value = "$newdirname";
     setTimeout("self.close()",10000)      setTimeout("self.close()",10000);
 }  }
   </script>    </script>
   </head>|);  |;
  my $loaditem = 'onLoad="writeDone()"';   $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'));  
     }      }
   
       my $londocroot = $r->dir_config('lonDocRoot');
       my $trailfile = $fn;
       $trailfile =~ s{^/(priv/)}{$londocroot/$1};
       
       # Breadcrumbs
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => 'Construction Space',
           'href'  => &Apache::loncommon::authorspace(),
       });
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => 'File Operation',
           'title' => 'Construction Space File Operation',
           'href'  => '',
       });
   
       $r->print(&Apache::loncommon::start_page('Construction Space File Operation',
        $js,
        {'add_entries' => \%loaditem,})
                .&Apache::lonhtmlcommon::breadcrumbs()
                .&Apache::loncommon::head_subbox(
                     &Apache::loncommon::CSTR_pageheader($trailfile))
       );
       
     $r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>');      $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">'.&mt('Co-Author').': '.$uname.' at '.$udom.          $r->print('<p class="LC_info">'
   '</font></h3>');                   .&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') {      if ($env{'form.action'} eq 'delete') {
       $r->print('<h3>'.&mt('Delete').'</h3>');        $r->print('<h3>'.&mt('Delete').'</h3>');
     } elsif ($ENV{'form.action'} eq 'rename') {      } elsif ($env{'form.action'} eq 'rename') {
  $r->print('<h3>'.&mt('Rename').'</h3>');   $r->print('<h3>'.&mt('Rename').'</h3>');
     } elsif ($ENV{'form.action'} eq 'move') {      } elsif ($env{'form.action'} eq 'move') {
  $r->print('<h3>'.&mt('Move').'</h3>');   $r->print('<h3>'.&mt('Move').'</h3>');
     } elsif ($ENV{'form.action'} eq 'newdir') {      } elsif ($env{'form.action'} eq 'newdir') {
  $r->print('<h3>'.&mt('New Directory').'</h3>');   $r->print('<h3>'.&mt('New Directory').'</h3>');
     } elsif ($ENV{'form.action'} eq 'decompress') {      } elsif ($env{'form.action'} eq 'decompress') {
  $r->print('<h3>'.&mt('Decompress').'</h3>');   $r->print('<h3>'.&mt('Decompress').'</h3>');
     } elsif ($ENV{'form.action'} eq 'copy') {      } elsif ($env{'form.action'} eq 'copy') {
  $r->print('<h3>'.&mt('Copy').'</h3>');   $r->print('<h3>'.&mt('Copy').'</h3>');
     } elsif ($ENV{'form.action'} eq 'newfile' ||      } elsif ($env{'form.action'} eq 'newfile' ||
      $ENV{'form.action'} eq 'newhtmlfile' ||       $env{'form.action'} eq 'newhtmlfile' ||
      $ENV{'form.action'} eq 'newproblemfile' ||       $env{'form.action'} eq 'newproblemfile' ||
      $ENV{'form.action'} eq 'newpagefile' ||       $env{'form.action'} eq 'newpagefile' ||
      $ENV{'form.action'} eq 'newsequencefile' ||       $env{'form.action'} eq 'newsequencefile' ||
      $ENV{'form.action'} eq 'newrightsfile' ||       $env{'form.action'} eq 'newrightsfile' ||
      $ENV{'form.action'} eq 'newstyfile' ||       $env{'form.action'} eq 'newstyfile' ||
      $ENV{'form.action'} eq 'Select Action' ) {       $env{'form.action'} eq 'newtaskfile' ||
                $env{'form.action'} eq 'newlibraryfile' ||
        $env{'form.action'} eq 'Select Action' ) {
  $r->print('<h3>'.&mt('New Resource').'</h3>');   $r->print('<h3>'.&mt('New Resource').'</h3>');
     } else {      } else {
  $r->print('<p>'.&mt('Unknown Action').' '.$ENV{'form.action'}.' </p></body></html>');          $r->print('<p class="LC_error">'
                    .&mt('Unknown Action').' '.$env{'form.action'}
                    .'</p>'
                    .&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);
     } else {      } else {
Line 1286  function writeDone() { Line 1546  function writeDone() {
  &phaseone($r,$fn,$uname,$udom);   &phaseone($r,$fn,$uname,$udom);
     }      }
   
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_page());
     return OK;        return OK;  
 }  }
   

Removed from v.1.60  
changed lines
  Added in v.1.113


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