Diff for /loncom/publisher/loncfile.pm between versions 1.69 and 1.80

version 1.69, 2005/05/30 16:56:46 version 1.80, 2006/12/20 22:41:08
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);
     }      }
 }  }
Line 156  sub URLToPath { Line 150  sub URLToPath {
     $Url=~ s/\/+/\//g;      $Url=~ s/\/+/\//g;
     $Url=~ s/^http\:\/\/[^\/]+//;      $Url=~ s/^http\:\/\/[^\/]+//;
     $Url=~ s/^\///;      $Url=~ s/^\///;
     $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;      $Url=~ s/(\~|priv\/)($match_username)\//\/home\/$2\/public_html\//;
     &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/;      $fn=~s/^\/home\/($match_username)\/public\_html/\/priv\/$1/;
     $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-;      $fn=~s-^/home/($match_username)/public_html-/priv/$1-;
     return '<tt>'.$fn.'</tt>';      return '<tt>'.$fn.'</tt>';
 }  }
   
Line 194  sub obsolete_unpub { Line 188  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 296  sub cleanDest { Line 315  sub cleanDest {
  $foundbad=1;   $foundbad=1;
  $dest=~s/\.//g;   $dest=~s/\.//g;
     }      }
     if  ($dest=~/[\#\?&%\"]/) {      if  ($dest=~/[\#\?&%\":]/) {
  $foundbad=1;   $foundbad=1;
  $dest=~s/[\#\?&%\"]//g;   $dest=~s/[\#\?&%\":]//g;
     }      }
     if ($dest=~m|/|) {      if ($dest=~m|/|) {
  my ($newpath)=($dest=~m|(.*)/|);   my ($newpath)=($dest=~m|(.*)/|);
Line 519  sub Delete1 { Line 538  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')) {
                   $request->print('<h3>'.&mt('Only empty directories may be deleted.').'</h3>'.
                               'You must delete the contents of the directory first.<br />'.
                               '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
                   return;
               }
           } else { 
       unless (&obsolete_unpub($user,$domain,$fn)) {
           $request->print('<h3>'.&mt('Cannot delete non-obsolete published file').'</h3>'.
     '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');      '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
     return;          return;
  }      }
           }
  $request->print('<p>'.&mt('Delete').' '.&display($fn).'?</p>');   $request->print('<p>'.&mt('Delete').' '.&display($fn).'?</p>');
  &CloseForm1($request, $fn);   &CloseForm1($request, $fn);
     } else {      } else {
Line 938  Returns: Line 966  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 ..  
  if(@files) {   
     $request->print('<font color="red"> '.&mt('Error: Directory Non Empty').'</font>');       $request->print('<font color="red"> '.&mt('Error: Directory Non Empty').'</font>'); 
     return 0;      return 0;
  } else {      } else {   
Line 993  sub Delete2 { Line 1019  sub Delete2 {
   
 =back  =back
   
 Returns 0 failure, and 0 successs.  Returns 0 failure, and 1 successs.
   
 =cut  =cut
   
Line 1001  sub Copy2 { Line 1027  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('<font color="red"> '.&mt('Warning').': '.&mt('Name of new file is the same as name of old file').' - '.&mt('no action taken').'.</font>');
               return 1;
           }
  unless (copy($oldfile, $newfile)) {   unless (copy($oldfile, $newfile)) {
     $request->print('<font color="red"> '.&mt('copy Error').': '.$!.'</font>');      $request->print('<font color="red"> '.&mt('copy Error').': '.$!.'</font>');
     return 0;      return 0;
Line 1107  sub phasetwo { Line 1137  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 1120  sub phasetwo { Line 1150  sub phasetwo {
  $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   $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'});
   
Line 1148  sub phasetwo { Line 1180  sub phasetwo {
     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'})) {
Line 1179  sub phasetwo { Line 1215  sub phasetwo {
     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('<h3><a href="'.&url($dest).'">'.&mt('Done').'</a></h3>');
    }
     }      }
 }  }
   
Line 1201  sub handler { Line 1242  sub handler {
   
     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'}) {
Line 1245  sub handler { Line 1286  sub handler {
     &Apache::loncommon::content_type($r,'text/html');      &Apache::loncommon::content_type($r,'text/html');
     $r->send_http_header;      $r->send_http_header;
   
       my (%loaditem,$js);
   
     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') ) ) {
  my $newdirname = $env{'form.newfilename'};   my $newdirname = $env{'form.newfilename'};
  $r->print('<html><head><title>LON-CAPA Construction Space</title><script language="Javascript">');   $js = qq|
  $r->print(qq|  <script type="text/javascript">
 function writeDone() {  function writeDone() {
     var winName = window.opener      var winName = window.opener
     window.focus();      window.focus();
Line 1256  function writeDone() { Line 1299  function writeDone() {
     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'));  
     }      }
       
       $r->print(&Apache::loncommon::start_page('Construction Space File Operation',
        $js,
        {'add_entries' => \%loaditem,}));
       
     $r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>');      $r->print('<h3>'.&mt('Location').': '.&display($fn).'</h3>');
       
Line 1297  function writeDone() { Line 1339  function writeDone() {
      $env{'form.action'} eq 'Select Action' ) {       $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>'.&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') {
Line 1308  function writeDone() { Line 1351  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.69  
changed lines
  Added in v.1.80


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