Diff for /loncom/publisher/loncfile.pm between versions 1.36 and 1.54

version 1.36, 2003/08/03 00:40:00 version 1.54, 2004/05/26 22:15:19
Line 72  use Apache::loncacc; Line 72  use Apache::loncacc;
 use Apache::Log ();  use Apache::Log ();
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::loncommon();  use Apache::loncommon();
   use Apache::lonlocal;
   
 my $DEBUG=0;  my $DEBUG=0;
 my $r; # Needs to be global for some stuff RF.  my $r; # Needs to be global for some stuff RF.
Line 110  sub Debug { Line 111  sub Debug {
   # Put out the indicated message butonly if DEBUG is true.    # Put out the indicated message butonly if DEBUG is true.
       
   if ($DEBUG) {    if ($DEBUG) {
     $log->debug($message);    $r->log_reason($message);
   }    }
 }  }
   
Line 152  Global References Line 153  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/^http\:\/\/[^\/]+//;    $Url=~ s/^http\:\/\/[^\/]+//;
   $Url=~ s/^\///;    $Url=~ s/^\///;
   $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;    $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;
Line 167  sub url { Line 169  sub url {
   
 sub display {  sub display {
     my $fn=shift;      my $fn=shift;
     $fn=~s/^\/home\/(\w+)\/public\_html//;      $fn=~s-^/home/(\w+)/public_html-/priv/$1-;
     return '<tt>'.$fn.'</tt>';      return '<tt>'.$fn.'</tt>';
 }  }
   
 =pod  
   
 =item PublicationPath($domain, $user, $dir, $file)  
   
    Determines the filesystem path corresponding to a published resource  
    specification.  The returned value is the path.  
 Parameters:  
   
 =over 4  
   
 =item   $domain - string [in] Name of the domain within which the resource is   
              stored.  
   
 =item   $user   - string [in] Name of the user asking about the resource.  
   
 =item   $dir    - Directory path relative to the top of the resource space.  
   
 =item   $file   - name of the resource file itself without path info.  
   
 =back  
   
 =over 4  
   
 Returns:  
   
 =item  string - full path to the file if it exists in publication space.  # see if the file is
   # a) published (return 0 if not)
 =back  # b) if, so obsolete (return 0 if not)
        
 =cut  sub obsolete_unpub {
       my ($user,$domain,$construct)=@_;
 sub PublicationPath      my $published=$construct;
 {      $published=~
   my ($domain, $user, $dir, $file)=@_;   s/^\/home\/$user\/public\_html\//\/home\/httpd\/html\/res\/$domain\/$user\//;
       if (-e $published) {
   return '/home/httpd/html/res/'.$domain.'/'.$user.'/'.$dir.'/'.   if (&Apache::lonnet::metadata($published,'obsolete')) {
  $file;      return 1;
    }
    return 0;
       } else {
    return 1;
       }
 }  }
   
 =pod  
   
 =item ConstructionPath($domain, $user, $dir, $file)  
   
    Determines the filesystem path corresponding to a construction space  
    resource specification.  The returned value is the path  
 Parameters:  
   
 =over 4  
   
 =item   $user   - string [in] Name of the user asking about the resource.  
   
 =item   $dir    - Directory path relative to the top of the resource space.  
   
 =item   $file   - name of the resource file itself without path info.  
   
 Returns:  
   
 =item  string - full path to the file if it exists in Construction space.  
   
 =back  
        
 =cut  
   
 sub ConstructionPath {  
   my ($user, $dir, $file) = @_;  
   
   return '/home/'.$user.'/public_html/'.$dir.'/'.$file;  
   
 }  
   
 =pod  =pod
   
 =item exists($user, $domain, $directory, $file)  =item exists($user, $domain, $file)
   
    Determine if a resource file name has been published or exists     Determine if a resource file name has been published or exists
    in the construction space.     in the construction space.
Line 257  sub ConstructionPath { Line 211  sub ConstructionPath {
 =item  $domain - string [in] - Name of the domain in which the resource  =item  $domain - string [in] - Name of the domain in which the resource
                           might have been published.                            might have been published.
   
 =item  $dir    - string [in] - Path relative to construction or resource space  
                           in which the resource might live.  
   
 =item  $file   - string [in] - Name of the file.  =item  $file   - string [in] - Name of the file.
   
 =back  =back
Line 277  Returns: Line 228  Returns:
 =cut  =cut
   
 sub exists {  sub exists {
   my ($user, $domain, $dir, $file) = @_;    my ($user, $domain, $construct) = @_;
     my $published=$construct;
   # Create complete paths in publication and construction space.    $published=~
   my $relativedir=$dir;  s/^\/home\/$user\/public\_html\//\/home\/httpd\/html\/res\/$domain\/$user\//;
   $relativedir=s|/home/\Q$user\E/public_html||;    my $result='';    
   my $published = &PublicationPath($domain, $user, $relativedir, $file);  
   my $construct = &ConstructionPath($user, $relativedir, $file);  
   
   # If the resource exists in either space indicate this fact.  
   # Note that the check for existence in resource space is stricter.  
   
   my $result;      
   if ( -d $construct ) {    if ( -d $construct ) {
       return 'Error: destination for operation is a directory.';        return &mt('Error: destination for operation is an existing directory.');
   }    }
   if ( -e $published) {    if ( -e $published) {
       $result.='<p><font color="red">Warning: target file exists, and has been published!</font></p>';        $result.='<p><font color="red">'.&mt('Warning: target file exists, and has been published!').'</font></p>';
   } elsif ( -e $construct) {    } elsif ( -e $construct) {
       $result.='<p><font color="red">Warning: target file exists!</font></p>';        $result.='<p><font color="red">'.&mt('Warning: target file exists!').'</font></p>';
   }    }
   
   return $result;    return $result;
   
 }  }
Line 340  sub checksuffix { Line 283  sub checksuffix {
     if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }      if ($old=~m:(.*)/+([^/]+)\.(\w+)$:) { $oldsuffix=$3; }
     if ($oldsuffix ne $newsuffix) {      if ($oldsuffix ne $newsuffix) {
  $result.=   $result.=
             '<p><font color="red">Warning: change of MIME type!</font></p>';              '<p><font color="red">'.&mt('Warning: change of MIME type!').'</font></p>';
     }      }
     return $result;      return $result;
 }  }
Line 349  sub cleanDest { Line 292  sub cleanDest {
     my ($request,$dest)=@_;      my ($request,$dest)=@_;
     #remove bad characters      #remove bad characters
     if  ($dest=~/[\#\?&]/) {      if  ($dest=~/[\#\?&]/) {
  $request->print("<p><font color=\"red\">Invalid characters in requested name have been removed.</font></p>");   $request->print("<p><font color=\"red\">".&mt('Invalid characters in requested name have been removed.')."</font></p>");
  $dest=~s/[\#\?&]//g;   $dest=~s/[\#\?&]//g;
     }      }
     return $dest;      return $dest;
Line 392  Parameters: Line 335  Parameters:
   
 sub CloseForm1 {  sub CloseForm1 {
    my ($request,  $fn) = @_;     my ($request,  $fn) = @_;
    $request->print('<p><input type="submit" value="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="Cancel" /></p></form>');       '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
 }  }
   
   
Line 424  Parameters: Line 367  Parameters:
   
 sub CloseForm2 {  sub CloseForm2 {
   my ($request, $user, $fn) = @_;    my ($request, $user, $fn) = @_;
   $request->print('<h3><a href="'.&url($fn).'/">Done</a></h3>');    $request->print('<h3><a href="'.&url($fn).'/">'.&mt('Done').'</a></h3>');
 }  }
   
 =pod  =pod
Line 463  new filename relative to the current dir Line 406  new filename relative to the current dir
 =cut    =cut  
   
 sub Rename1 {  sub Rename1 {
     my ($request, $user, $domain, $fn, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename, $style) = @_;
   
     if(-e $fn) {      if(-e $fn) {
  if($newfilename) {   if($newfilename) {
       # is dest a dir
       if ($style eq 'move') {
    if (-d $newfilename) {
       if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
    }
       }
     if ($newfilename =~ m|/[^\.]+$|) {      if ($newfilename =~ m|/[^\.]+$|) {
  #no extension add on original extension   #no extension add on original extension
  if ($fn =~ m|/[^\.]*\.([^\.]+)$|) {   if ($fn =~ m|/[^\.]*\.([^\.]+)$|) {
Line 475  sub Rename1 { Line 424  sub Rename1 {
     }      }
     $request->print(&checksuffix($fn, $newfilename));      $request->print(&checksuffix($fn, $newfilename));
     #renaming a dir, delete the trailing /      #renaming a dir, delete the trailing /
             #remove last element for current dir              #remove second to last element for current dir
     my $dir=$fn;      if (-d $fn) {
     if ($fn =~ m|/$|) {   $newfilename=~/\.(\w+)$/;
  $fn =~ s|/$||;   if (&Apache::loncommon::fileembstyle($1) eq 'ssi') {
  $dir =~ s|/[^/]*$||;      $request->print('<br /><font color="red">'.
    &mt('Cannot change MIME type of a directory').
       '</font>'.
    '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
       return;
    }
    $newfilename=~s/\/[^\/]+\/([^\/]+)$/\/$1/;
     }      }
     my $return=&exists($user, $domain, $dir, $newfilename);      $newfilename=~s://+:/:g; # remove duplicate /
       while ($newfilename=~m:/\.\./:) {
    $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
       }
       my $return=&exists($user, $domain, $newfilename);
     $request->print($return);      $request->print($return);
     if ($return =~/^Error:/) {      if ($return =~/^Error:/) {
  $request->print('<br /><a href="'.&url($fn).'">Cancel</a>');   $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
    return;
       }
       unless (&obsolete_unpub($user,$domain,$fn)) {
    $request->print('<h3>'.&mt('Cannot rename or move non-obsolete published file').'</h3>'.
    '<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
  return;   return;
     }      }
       my $action;
       if ($style eq 'rename') {
    $action=&mt('Rename');
       } else {
    $action=&mt('Move');
       }
     $request->print('<input type="hidden" name="newfilename" value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $newfilename.      $newfilename.
     '" /><p>Rename '.&display($fn).      '" /><p>'.$action.' '.&display($fn).
     '</tt><br />to '.&display($newfilename).'?</p>');      '</tt><br />to '.&display($newfilename).'?</p>');
     &CloseForm1($request, $fn);      &CloseForm1($request, $fn);
  } else {   } else {
     $request->print('<p>No new filename specified.</p></form>');      $request->print('<p>'.&mt('No new filename specified.').'</p></form>');
     return;      return;
  }   }
     } else {      } else {
  $request->print('<p> No such file: '.&display($fn).'</p></form>');   $request->print('<p> '.&mt('No such file').': '.&display($fn).'</p></form>');
  return;   return;
     }      }
           
Line 532  sub Delete1 { Line 502  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.'"/>');
     $request->print('<p>Delete '.&display($fn).'?</p>');      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>');
    return;
       }
       $request->print('<p>'.&mt('Delete').' '.&display($fn).'?</p>');
     &CloseForm1($request, $fn);      &CloseForm1($request, $fn);
   } else {    } else {
     $request->print('<p>No such file: '.&display($fn).'</p></form>');      $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
   }    }
 }  }
   
Line 567  Parameters: Line 542  Parameters:
 =cut  =cut
   
 sub Copy1 {  sub Copy1 {
   my ($request, $user, $domain, $fn, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename) = @_;
   
   if(-e $fn) {      if(-e $fn) {
     $request->print(&checksuffix($fn,$newfilename));   # is dest a dir
     my $return=&exists($user, $domain, $fn, $newfilename);   if (-d $newfilename) {
     $request->print($return);      if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
     if ($return =~/^Error:/) {   }
  $request->print('<br /><a href="'.&url($fn).'">Cancel</a>');   if ($newfilename =~ m|/[^\.]+$|) {
  return;      #no extension add on original extension
       if ($fn =~ m|/[^\.]*\.([^\.]+)$|) { $newfilename.='.'.$1; }
    } 
    $newfilename=~s://+:/:g; # remove duplicate /
    while ($newfilename=~m:/\.\./:) {
       $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
    }
    $request->print(&checksuffix($fn,$newfilename));
    my $return=&exists($user, $domain, $newfilename);
    $request->print($return);
    if ($return =~/^Error:/) {
       $request->print('<br /><a href="'.&url($fn).'">'.&mt('Cancel').'</a>');
       return;
    }
    $request->print('<input type="hidden" name="newfilename" value="'.
    $newfilename.
    '" /><p>'.&mt('Copy').' '.&display($fn).'<br />to '.
    &display($newfilename).'?</p>');
    &CloseForm1($request, $fn);
       } else {
    $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
     }      }
     $request->print('<input type = "hidden" name = "newfilename" value = "'.  
     $newfilename.  
     '" /><p>Copy '.&display($fn).'<br />to '.  
     &display($newfilename).'?</p>');  
     &CloseForm1($request, $fn);  
   } else {  
     $request->print('<p>No such file: '.&display($fn).'</p></form>');  
   }  
 }  }
   
 =pod  =pod
Line 628  causes the newdir operation to transitio Line 615  causes the newdir operation to transitio
   
 sub NewDir1  sub NewDir1
 {  {
   my ($request, $username, $domain, $fn, $newfilename) = @_;    my ($request, $username, $domain, $fn, $newfilename, $mode) = @_;
   
   if(-e $newfilename) {    my $result=&exists($username,$domain,$newfilename);
     $request->print('<p>Directory exists.</p></form>');    if ($result) {
   }      $request->print('<font color="red">'.$result.'</font></form>');
   else {    } else {
       if ($mode eq 'testbank') {
           $request->print('<input type="hidden" name="callingmode" value="testbank">');
       } elsif ($mode eq 'imsimport') {
           $request->print('<input type="hidden" name="callingmode" value="imsimport">');
       }
     $request->print('<input type="hidden" name="newfilename" value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $newfilename.'" /><p>Make new directory '.      $newfilename.'" /><p>'.&mt('Make new directory').' '.
     &display($newfilename).'?</p>');      &display($newfilename).'?</p>');
     &CloseForm1($request, $fn);      &CloseForm1($request, $fn);
   }    }
 }  }
   
   
   sub Decompress1 {
      my ($request, $user, $domain, $fn) = @_;
      if( -e $fn) {
       $request->print('<input type="hidden" name="newfilename" value="'.$fn.'"/>');
       $request->print('<p>'.&mt('Decompress').' '.&display($fn).'?</p>');
       &CloseForm1($request, $fn);
       } else {
           $request->print('<p>'.&mt('No such file').': '.&display($fn).'</p></form>');
          }
   }
 =pod  =pod
   
 =item NewFile1  =item NewFile1
Line 687  sub NewFile1 { Line 690  sub NewFile1 {
   
     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
Line 695  sub NewFile1 { Line 706  sub NewFile1 {
     $newfilename.=".$extension";      $newfilename.=".$extension";
  }   }
     }      }
       my $result=&exists($user,$domain,$newfilename);
     if(-e $newfilename) {      if($result) {
  $request->print('<p>File exists.</p></form>');   $request->print('<font color="red">'.$result.'</font></form>');
     }      } else {
     else {   $request->print('<p>'.&mt('Make new file').' '.&display($newfilename).'?</p>');
  $request->print('<p>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="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="Cancel" /></p></form>');   '" method="POST"><p><input type="submit" value="'.&mt('Cancel').'" /></p></form>');
     }      }
 }  }
   
Line 742  sub phaseone { Line 752  sub phaseone {
       
   my $newfilename=&cleanDest($r,$ENV{'form.newfilename'});    my $newfilename=&cleanDest($r,$ENV{'form.newfilename'});
   $newfilename=&relativeDest($fn,$newfilename,$uname);    $newfilename=&relativeDest($fn,$newfilename,$uname);
   
   $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);        &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') {     } elsif ($ENV{'form.action'} eq 'delete') { 
       &Delete1($r, $uname, $udom, $fn);        &Delete1($r, $uname, $udom, $fn);
     } elsif ($ENV{'form.action'} eq 'decompress') {
         &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>No new filename specified.</p></form>');    $r->print('<p>'.&mt('No new filename specified.').'</p></form>');
       }        }
   } elsif ($ENV{'form.action'} eq 'newdir') {    } elsif ($ENV{'form.action'} eq 'newdir') {
       &NewDir1($r, $uname, $udom, $fn, $newfilename);        my $mode = '';
         if (exists($ENV{'form.callingmode'}) ) {
             $mode = $ENV{'form.callingmode'};
         }   
         &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' ||
Line 771  sub phaseone { Line 788  sub phaseone {
       if ($newfilename) {        if ($newfilename) {
   &NewFile1($r, $uname, $udom, $fn, $newfilename);    &NewFile1($r, $uname, $udom, $fn, $newfilename);
       } else {        } else {
   $r->print('<p>No new filename specified.</p></form>');    $r->print('<p>'.&mt('No new filename specified.').'</p></form>');
       }        }
   }    }
 }  }
Line 818  sub Rename2 { Line 835  sub Rename2 {
  " new file ".$newfile."\n");   " new file ".$newfile."\n");
   &Debug($request, "Target is: ".$directory.'/'.    &Debug($request, "Target is: ".$directory.'/'.
  $newfile);   $newfile);
     if (-e $oldfile) {
   
   if(-e $oldfile) {        my $oRN=$oldfile;
       my $dest;        my $nRN=$newfile;
         unless (rename($oldfile,$newfile)) {
       if ($oldfile =~ m|/$|) {    $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
   #renaming a dir  
   $oldfile =~ s|/$||;  
   $dest=$directory;  
   $dest=~s|(/)([^/]*)$|$1|;  
   $dest.='/'.$newfile;  
       } else {  
   $dest=$directory.'/'.$newfile;  
       }  
   
       unless(rename($oldfile,$dest)) {  
   $request->print('<font color="red">Error: '.$!.'</font>');  
   return 0;    return 0;
       } else {}        }
         ## If old name.(extension) exits, move under new name.
         ## If it doesn't exist and a new.(extension) exists  
         ## delete it (only concern when renaming over files)
         my $tmp1=$oRN.'.meta';
         my $tmp2=$nRN.'.meta';
         if(-e $tmp1){
     unless(rename($tmp1,$tmp2)){ }
         } elsif(-e $tmp2){
     unlink $tmp2;
         }
         $tmp1=$oRN.'.save';
         $tmp2=$nRN.'.save';
         if(-e $tmp1){
     unless(rename($tmp1,$tmp2)){ }
         } elsif(-e $tmp2){
     unlink $tmp2;
         }
         $tmp1=$oRN.'.log';
         $tmp2=$nRN.'.log';
         if(-e $tmp1){
     unless(rename($tmp1,$tmp2)){ }
         } elsif(-e $tmp2){
     unlink $tmp2;
         }
         $tmp1=$oRN.'.bak';
         $tmp2=$nRN.'.bak';
         if(-e $tmp1){
     unless(rename($tmp1,$tmp2)){ }
         } elsif(-e $tmp2){
     unlink $tmp2;
         }
   } else {    } else {
       $request->print("<p> No such file: /home".$user.'/public_html'.        $request->print("<p> ".&mt('No such file').": ".&display($oldfile).'</p></form>');
       $oldfile.' </p></form>');  
       return 0;        return 0;
   }    }
   return 1;    return 1;
Line 874  Returns: Line 911  Returns:
   
 sub Delete2 {  sub Delete2 {
   my ($request, $user, $filename) = @_;    my ($request, $user, $filename) = @_;
     if(opendir DIR, $filename) { 
   if(-e $filename) {      my @files=readdir(DIR);
     unless(unlink($filename)) {      shift @files; shift @files; # takes off . and ..
       $request->print('<font color="red">Error: '.$!.'</font>');      if(@files) { 
         $request->print('<font color="red"> '.&mt('Error: Directory Non Empty').'</font>'); 
         return 0;
       } else {   
         if(-e $filename) {
           unless(rmdir($filename)) {
             $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
             return 0;
           }
         } else {
           $request->print('<p> '.&mt('No such file').'. </p></form>');
           return 0;
         }
        }
      } else {
       if(-e $filename) {
         unless(unlink($filename)) {
           $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
           return 0;
         }
       } else {
         $request->print('<p> '.&mt('No such file').'. </p></form>');
       return 0;        return 0;
     }  
   } else {  
     $request->print('<p> No such file. </p></form');  
     return 0;  
   }    }
    }
   return 1;    return 1;
 }  }
   
Line 920  sub Copy2 { Line 975  sub Copy2 {
     &Debug($request ,"Will try to copy $oldfile to $newfile");      &Debug($request ,"Will try to copy $oldfile to $newfile");
     if(-e $oldfile) {      if(-e $oldfile) {
  unless (copy($oldfile, $newfile)) {   unless (copy($oldfile, $newfile)) {
     $request->print('<font color="red"> copy Error: '.$!.'</font>');      $request->print('<font color="red"> '.&mt('copy Error').': '.$!.'</font>');
     return 0;      return 0;
  } else {   } else {
     unless (chmod(0660, $newfile)) {      unless (chmod(0660, $newfile)) {
  $request->print('<font color="red"> chmod error: '.$!.'</font>');   $request->print('<font color="red"> '.&mt('chmod error').': '.$!.'</font>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
  }   }
     } else {      } else {
  $request->print('<p> No such file </p>');   $request->print('<p> '.&mt('No such file').' </p>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
Line 961  sub NewDir2 { Line 1016  sub NewDir2 {
   my ($request, $user, $newdirectory) = @_;    my ($request, $user, $newdirectory) = @_;
       
   unless(mkdir($newdirectory, 02770)) {    unless(mkdir($newdirectory, 02770)) {
     $request->print('<font color="red">Error: '.$!.'</font>');      $request->print('<font color="red">'.&mt('Error').': '.$!.'</font>');
     return 0;      return 0;
   }    }
   unless(chmod(02770, ($newdirectory))) {    unless(chmod(02770, ($newdirectory))) {
       $request->print('<font color="red"> Error: '.$!.'</font>');        $request->print('<font color="red"> '.&mt('Error').': '.$!.'</font>');
       return 0;        return 0;
   }    }
   return 1;    return 1;
 }  }
   sub decompress2 {
    my ($r, $user, $dir, $file) = @_;
    &Apache::lonnet::appenv('cgi.file' => $file);
    &Apache::lonnet::appenv('cgi.dir' => $dir);
    my $result=&Apache::lonnet::ssi_body('/cgi-bin/decompress.pl');
    $r->print($result);
    &Apache::lonnet::delenv('cgi.file');
    &Apache::lonnet::delenv('cgi.dir');
    return 1;
   }
 =pod  =pod
   
 =item phasetwo($r, $fn, $uname, $udom)  =item phasetwo($r, $fn, $uname, $udom)
Line 1013  sub phasetwo { Line 1077  sub phasetwo {
     my $dir; # Directory path      my $dir; # Directory path
     my $main; # Filename.      my $main; # Filename.
     my $suffix; # Extension.      my $suffix; # Extension.
       if ($fn=~m:(.*)/([^/]+):) {
     if ($fn=~m:(.*)/([^/]+)\.(\w+)$:) {  
  $dir=$1; # Directory path   $dir=$1; # Directory path
  $main=$2; # Filename.   $main=$2; # Filename.
  $suffix=$3; # Extension.  
     }      }
               if($main=~m:\.(\w+)$:){ # Fixes problems with filenames with no extensions
    $main=$`; #This is what is before the match (.) so it's just the main filename, yea it's nasty
    $suffix=$1; #This is the actually filename extension if it exists
       }
     my $dest;                   # On success this is where we'll go.      my $dest;                   # On success this is where we'll go.
           
     &Debug($r,       &Debug($r, 
Line 1036  sub phasetwo { Line 1101  sub phasetwo {
    "loncfie::phase2 action is $ENV{'form.action'}");     "loncfie::phase2 action is $ENV{'form.action'}");
           
     # Select the appropriate processing sub.      # Select the appropriate processing sub.
           if ($ENV{'form.action'} eq 'decompress') { 
     if ($ENV{'form.action'} eq 'rename') { # Rename.   $main .= '.';
    $main .= $suffix;
       if(!&decompress2($r, $uname, $dir, $main)) {
    return ;
    }
       $dest = $dir."/.";
        
   
       } elsif ($ENV{'form.action'} eq 'rename') { # Rename.
  if($ENV{'form.newfilename'}) {   if($ENV{'form.newfilename'}) {
     if (!defined($dir)) {      if (!defined($dir)) {
  $fn=~m:^(.*)/:;   $fn=~m:^(.*)/:;
Line 1046  sub phasetwo { Line 1119  sub phasetwo {
     if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {      if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
  return;   return;
     }      }
     # Prepend the directory to the new name to form the basis of the      $dest = &url($ENV{'form.newfilename'});
     # url of the new resource.  
     #  
     #renaming a dir  
             #remove last element for current dir  
     if ($fn =~ m|/$|) { $dir =~ s|/[^/]*$||; }  
     $dest = $dir."/".$ENV{'form.newfilename'};  
  }   }
     } elsif ($ENV{'form.action'} eq 'delete') {       } elsif ($ENV{'form.action'} eq 'delete') { 
  if(!&Delete2($r, $uname, $ENV{'form.newfilename'})) {   if(!&Delete2($r, $uname, $ENV{'form.newfilename'})) {
Line 1065  sub phasetwo { Line 1132  sub phasetwo {
     } 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>No New filename specified</p></form>');      $r->print('<p>'.&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'};
  # Since the newfilename form field is construction space  
  # relative, ew need to prepend the current path; now in $fn.  
  #  
         my $newdir= $fn.$ENV{'form.newfilename'};  
  if(!&NewDir2($r, $uname, $newdir)) {   if(!&NewDir2($r, $uname, $newdir)) {
     return;      return;
  }   }
  $dest = $newdir."/"   $dest = $newdir."/"
     }      }
     #      if ( ($ENV{'form.action'} eq 'newdir') && ($ENV{'form.phase'} eq 'two') && ( ($ENV{'form.callingmode'} eq 'testbank') || ($ENV{'form.callingmode'} eq 'imsimport') ) ) {
     #  Substitute for priv for the first home in $dir to get our           $r->print('<h3><a href="javascript:self.close()">'.&mt('Done').'</a></h3>');
     # construction space path.      } else {
     #           $r->print('<h3><a href="'.&url($dest).'">'.&mt('Done').'</a></h3>');
     $dest=&MakeFinalUrl($r,$dest);      }
   
     $r->print('<h3><a href="'.$dest.'">Done</a></h3>');  
 }  
   
 sub MakeFinalUrl {  
     my($r,$dest)=@_;  
     &Debug($r, "Final url is: $dest");  
     $dest =~ s|/home/|/priv/|;  
     $dest =~ s|/public_html||;  
   
     my $base = &File::Basename::basename($dest);  
     my $dpath= &File::Basename::dirname($dest);  
     if ($base eq '.') { $base=''; }  
     $dest = &HTML::Entities::encode($dpath.'/'.$base);  
   
     &Debug($r, "Final url after rewrite: $dest");  
     return $dest;  
 }  }
   
 sub handler {  sub handler {
Line 1125  sub handler { Line 1171  sub handler {
   my $fn;    my $fn;
   
   if ($ENV{'form.filename'}) {    if ($ENV{'form.filename'}) {
   
    &Debug($r, "test: $ENV{'form.filename'}");
       $fn=&Apache::lonnet::unescape($ENV{'form.filename'});        $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
       $fn=&URLToPath($fn);        $fn=&URLToPath($fn);
   } elsif ($ENV{'form.qualifiedfilename'}) {    }  
    #Just hijack the script only the first time around to inject the correct information for further processing
       elsif($ENV{'QUERY_STRING'} && $ENV{'form.phase'} ne 'two') {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['decompress']);
    $fn=&Apache::lonnet::unescape($ENV{'form.decompress'});
    $fn=&URLToPath($fn);
    $ENV{'form.action'}="decompress";
     }
   
       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");
Line 1160  sub handler { Line 1217  sub handler {
   }    }
   
   
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');    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'};
   $r->print(&Apache::loncommon::bodytag('Construction Space File Operation'));        $r->print('<html><head><title>LON-CAPA Construction Space</title><script language="Javascript">');
         $r->print(qq|
   function writeDone() {
       var winName = window.opener
       window.focus();
       winName.document.dataForm.newdir.value = "$newdirname"
       setTimeout("self.close()",10000)
   }
     </script>
     </head>|);
         my $loaditem = 'onLoad="writeDone()"';
         $r->print(&Apache::loncommon::bodytag('Construction Space File Operation','',$loaditem));
     } else {
         $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
         $r->print(&Apache::loncommon::bodytag('Construction Space File Operation'));
     }
   
       
   $r->print('<h3>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">Co-Author: '.$uname.' at '.$udom.            $r->print('<h3><font color="red">'.&mt('Co-Author').': '.$uname.' at '.$udom.
                '</font></h3>');                 '</font></h3>');
   }    }
   
Line 1179  sub handler { Line 1251  sub handler {
   &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>Delete</h3>');        $r->print('<h3>'.&mt('Delete').'</h3>');
   } elsif ($ENV{'form.action'} eq 'rename') {    } elsif ($ENV{'form.action'} eq 'rename') {
       $r->print('<h3>Rename</h3>');        $r->print('<h3>'.&mt('Rename').'</h3>');
     } elsif ($ENV{'form.action'} eq 'move') {
         $r->print('<h3>'.&mt('Move').'</h3>');
   } elsif ($ENV{'form.action'} eq 'newdir') {    } elsif ($ENV{'form.action'} eq 'newdir') {
       $r->print('<h3>New Directory</h3>');        $r->print('<h3>'.&mt('New Directory').'</h3>');
     } elsif ($ENV{'form.action'} eq 'decompress') {
         $r->print('<h3>'.&mt('Decompress').'</h3>');
   } elsif ($ENV{'form.action'} eq 'copy') {    } elsif ($ENV{'form.action'} eq 'copy') {
       $r->print('<h3>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' ||
Line 1194  sub handler { Line 1270  sub handler {
    $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 'Select Action' ) {
       $r->print('<h3>New Resource</h3>');        $r->print('<h3>'.&mt('New Resource').'</h3>');
   } else {    } else {
      $r->print('<p>Unknown Action '.$ENV{'form.action'}.' </p></body></html>');       $r->print('<p>'.&mt('Unknown Action').' '.$ENV{'form.action'}.' </p></body></html>');
      return OK;         return OK;  
   }    }
   if ($ENV{'form.phase'} eq 'two') {    if ($ENV{'form.phase'} eq 'two') {

Removed from v.1.36  
changed lines
  Added in v.1.54


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