Diff for /loncom/publisher/loncfile.pm between versions 1.20 and 1.33

version 1.20, 2002/11/27 17:05:50 version 1.33, 2003/06/20 15:30:13
Line 7 Line 7
 #  presents a page that describes the proposed action to the user  #  presents a page that describes the proposed action to the user
 #  and requests confirmation.  The second phase commits the action  #  and requests confirmation.  The second phase commits the action
 #  and displays a page showing the results of the action.  #  and displays a page showing the results of the action.
 #   #
   
 #  #
 # $Id$  # $Id$
 #  #
Line 93  use Apache::Constants qw(:common :http : Line 92  use Apache::Constants qw(:common :http :
 use Apache::loncacc;  use Apache::loncacc;
 use Apache::Log ();  use Apache::Log ();
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon();
   
 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 128  sub Debug { Line 128  sub Debug {
   my $log     = $r->log;    my $log     = $r->log;
   my $message = shift;    my $message = shift;
       
   # Put out the indicated message butonly if DEBUG is false.    # Put out the indicated message butonly if DEBUG is true.
       
   if ($DEBUG) {    if ($DEBUG) {
     $log->debug($message);      $log->debug($message);
Line 323  sub exists { Line 323  sub exists {
   my ($user, $domain, $dir, $file) = @_;    my ($user, $domain, $dir, $file) = @_;
   
   # Create complete paths in publication and construction space.    # Create complete paths in publication and construction space.
     my $relativedir=$dir;
   my $published = &PublicationPath($domain, $user, $dir, $file);    $relativedir=s|/home/\Q$user\E/public_html||;
   my $construct = &ConstructionPath($user, $dir, $file);    my $published = &PublicationPath($domain, $user, $relativedir, $file);
     my $construct = &ConstructionPath($user, $relativedir, $file);
   
   # If the resource exists in either space indicate this fact.    # If the resource exists in either space indicate this fact.
   # Note that the check for existence in resource space is stricter.    # Note that the check for existence in resource space is stricter.
   
   my $result;        my $result;    
     if ( -d $construct ) {
         return 'Error: destination for operation is a 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">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">Warning: target file exists!</font></p>';
    }    }
   
   return $result;    return $result;
   
Line 380  sub checksuffix { Line 384  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">Warning: change of MIME type!</font></p>';
     }      }
     return $result;      return $result;
 }  }
   
   sub cleanDest {
       my ($request,$dest)=@_;
       #remove bad characters
       if  ($dest=~/[\#\?&]/) {
    $request->print("<p><font color=\"red\">Invalid characters in requested name have been removed.</font></p>");
    $dest=~s/[\#\?&]//g;
       }
       return $dest;
   }
   
 =pod  =pod
   
 =item CloseForm1($request, $user, $file)  =item CloseForm1($request, $user, $file)
Line 407  sub CloseForm1 { Line 422  sub CloseForm1 {
   
   
    &Debug($request, "Cancel url is: ".$cancelurl);     &Debug($request, "Cancel url is: ".$cancelurl);
    $request->print('<p><input type=submit value=Continue></p></form>');     $request->print('<p><input type="submit" value="Continue" /></p></form>');
    $request->print('<form action="'.$cancelurl.     $request->print('<form action="'.$cancelurl.
    '" method=GET"><p><input type=submit value=Cancel><p></form>');     '" method="POST"><p><input type="submit" value="Cancel" /></p></form>');
   
 }  }
   
Line 441  Parameters: Line 456  Parameters:
 sub CloseForm2 {  sub CloseForm2 {
   my ($request, $user, $directory) = @_;    my ($request, $user, $directory) = @_;
   
   $request->print('<h3><a=href="/priv/'.$user.$directory.'/">Done </a> </h3>');    $request->print('<h3><a href="/priv/'.$user.$directory.'/">Done </a> </h3>');
 }  }
   
 =pod  =pod
Line 491  sub Rename1 { Line 506  sub Rename1 {
     if(-e $conspace) {      if(-e $conspace) {
  if($ENV{'form.newfilename'}) {   if($ENV{'form.newfilename'}) {
     my $newfilename = $ENV{'form.newfilename'};      my $newfilename = $ENV{'form.newfilename'};
       if ($newfilename =~ m|/[^\.]+$|) {
    #no extension add on orignal extension
    if ($filename =~ m|/[^\.]*\.([^\.]+)$|) {
       $newfilename.='.'.$1;
    }
       }
     $request->print(&checksuffix($filename, $newfilename));      $request->print(&checksuffix($filename, $newfilename));
     $request->print(&exists($user, $domain, $dir, $newfilename));      #renaming a dir, delete the trailing /
               #remove last element for current dir
       if ($filename =~ m|/$|) {
    $filename =~ s|/$||;
    $dir =~ s|/[^/]*$||;
       }
       my $return=&exists($user, $domain, $dir, $newfilename);
       $request->print($return);
       if ($return =~/^Error:/) {
    $request->print('<br /><a href="'.$cancelurl.'">Cancel</a>');
    return;
       }
     my $dest=&SimplifyDir($dir,$newfilename);      my $dest=&SimplifyDir($dir,$newfilename);
     $request->print('<input type=hidden name=newfilename value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $newfilename.      $newfilename.
     '"><p>Rename <tt>'.$filename.'</tt><br /> to <tt>'.      '" /><p>Rename <tt>'.$filename.
       '</tt><br /> to <tt>'.
     $dest.'</tt>?</p>');      $dest.'</tt>?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $cancelurl);
  } else {   } else {
Line 542  sub Delete1 { Line 575  sub Delete1 {
       
   
   if( -e $filename) {    if( -e $filename) {
     $request->print('<input type=hidden name=newfilename value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $filename.'">');      $filename.'"/>');
     $request->print('<p> Delete <tt>'.$filename.'</tt>?</p>');      $request->print('<p> Delete <tt>'.$filename.'</tt>?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $cancelurl);
   } else {    } else {
Line 590  sub Copy1 { Line 623  sub Copy1 {
   
   if(-e $filename) {    if(-e $filename) {
     $request->print(&checksuffix($filename,$newfilename));      $request->print(&checksuffix($filename,$newfilename));
     $request->print(&exists($user, $domain, $dir, $newfilename));      my $return=&exists($user, $domain, $dir, $newfilename);
       $request->print($return);
       if ($return =~/^Error:/) {
    $request->print('<br /><a href="'.$cancelurl.'">Cancel</a>');
    return;
       }
     my $dest=&SimplifyDir($dir,$newfilename);      my $dest=&SimplifyDir($dir,$newfilename);
     $request->print('<input type = hidden name = newfilename value = "'.      $request->print('<input type = "hidden" name = "newfilename" value = "'.
     $dir.'/'.$newfilename.      $dir.'/'.$newfilename.
     '"><p>Copy <tt>'.$filename.'</tt><br />  to '.      '" /><p>Copy <tt>'.$filename.'</tt><br />  to '.
     '<tt>'.$dest.'</tt>?</p>');      '<tt>'.$dest.'</tt>?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $cancelurl);
   } else {    } else {
Line 682  sub NewDir1 Line 720  sub NewDir1
     $request->print('<p>Directory exists.</p></form>');      $request->print('<p>Directory exists.</p></form>');
   }    }
   else {    else {
     $request->print('<input type=hidden name=newfilename value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $newdir.'"><p>Make new directory <tt>'.      $newdir.'" /><p>Make new directory <tt>'.
     $path."/".$newdir.'</tt>?</p>');      $path."/".$newdir.'</tt>?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $cancelurl);
   
Line 692  sub NewDir1 Line 730  sub NewDir1
   
 =pod  =pod
   
   =item NewFile1
    
     Does all phase 1 processing of file creation:
     Ensures that the user provides a new filename, adds proper extension
     if needed and that the file does not already exist, if it is a html,
     problem, page, or sequence, it then creates a form link to hand the
     actual creation off to the proper handler.
   
   Parameters:
   
   =over 4
   
   =item   $request  - Apache Request Object [in] - Server request object for the
                  current url.
   
   =item   $username - Name of the user that is requesting the directory creation.
   
   =item   $domain   - Name of the domain of the user
   
   =item   $dir      - current absolute diretory
   
   =item   $newfilename
                     - Name of the file to be created; no path information
   =back
   
   Side Effects:
   
   =over 4
   
   =item 2 new forms are displayed.  Clicking on the confirmation button
   causes the browser to attempt to load the specfied URL, allowing the
   proper handler to take care of file creation. There is also a Cancle
   button which returns you to the driectory listing you came from
   
   =back
   
   =cut
   
   
   sub NewFile1 {
       my ($request, $user, $domain, $dir, $newfilename) = @_;
   
       &Debug($request, "Dir is : ".$dir);
       &Debug($request, "Newfile is : ".$newfilename);
   
       my $cancelurl = "/priv/".$dir;
       $cancelurl    =~ s/\/home\///;
       $cancelurl    =~ s/\/public_html//;
   
       if ($ENV{'form.action'} =~ /new(.+)file/) {
    my $extension=$1;
    if ($newfilename !~ /\Q.$extension\E$/) {
       if ($newfilename =~ m|^[^\.]*\.([^\.]+)$|) {
    #already has an extension strip it and add in expected one
    $newfilename =~ s|.([^\.]+)$||;
       }
       $newfilename.=".$extension";
    }
       }
   
       my $fullpath = $dir.'/'.$newfilename;
   
       &Debug($request, "Full path is : ".$fullpath);
   
       if(-e $fullpath) {
    $request->print('<p>File exists.</p></form>');
       }
       else {
    $request->print('<p>Make new file <tt>'.$dir.'/'.$newfilename.'</tt>?</p>');
    my $dest=&MakeFinalUrl($request,$fullpath);
    &Debug($request, "Cancel url is: ".$cancelurl);
    &Debug($request, "Dest url is: ".$dest);
    $request->print('</form>');
    $request->print('<form action="'.$dest.
    '" method="POST"><p><input type="submit" value="Continue" /></p></form>');
    $request->print('<form action="'.$cancelurl.
    '" method="POST"><p><input type="submit" value="Cancel" /></p></form>');
       }
   }
   
   =pod
   
 =item phaseone($r, $fn, $uname, $udom)  =item phaseone($r, $fn, $uname, $udom)
   
   Peforms phase one processing of the request.  In phase one, error messages    Peforms phase one processing of the request.  In phase one, error messages
Line 728  sub phaseone { Line 848  sub phaseone {
       
   #  my $conspace=ConstructionPathFromRelative($uname, $fn);    #  my $conspace=ConstructionPathFromRelative($uname, $fn);
       
       $ENV{'form.newfilename'}=&cleanDest($r,$ENV{'form.newfilename'});
   $r->print('<form action=/adm/cfile method=post>'.  
     '<input type=hidden name=filename value="/~'.$uname.$fn.'">'.    $r->print('<form action="/adm/cfile" method="post">'.
     '<input type=hidden name=phase value=two>'.      '<input type="hidden" name="filename" value="/~'.$uname.$fn.'" />'.
     '<input type=hidden name=action value='.$ENV{'form.action'}.'>');      '<input type="hidden" name="phase" value="two" />'.
       '<input type="hidden" name="action" value="'.$ENV{'form.action'}.'" />');
       
   if ($ENV{'form.action'} eq 'rename') {    if ($ENV{'form.action'} eq 'rename') {
             if (!defined($dir)) {
     &Rename1($r, $fn, $uname, $udom, $dir);    $fn=~m:(.*)/:;
         $dir=$1;
         }
         &Rename1($r, $fn, $uname, $udom, $dir);
   } elsif ($ENV{'form.action'} eq 'delete') {     } elsif ($ENV{'form.action'} eq 'delete') { 
           
     &Delete1($r, $uname, $fn);      &Delete1($r, $uname, $fn);
Line 751  sub phaseone { Line 874  sub phaseone {
     }      }
   } elsif ($ENV{'form.action'} eq 'newdir') {    } elsif ($ENV{'form.action'} eq 'newdir') {
     &NewDir1($r, $uname, $dir, $ENV{'form.newfilename'});      &NewDir1($r, $uname, $dir, $ENV{'form.newfilename'});
     }  elsif ($ENV{'form.action'} eq 'newfile' ||
       $ENV{'form.action'} eq 'newhtmlfile' ||
       $ENV{'form.action'} eq 'newproblemfile' ||
               $ENV{'form.action'} eq 'newpagefile' ||
               $ENV{'form.action'} eq 'newsequencefile' ||
               $ENV{'form.action'} eq 'Select Action') {
         if($ENV{'form.newfilename'}) {
     my $newfilename = $ENV{'form.newfilename'};
     if (!defined($dir)) {
         $fn=~m:(.*)/:;
         $dir=$1;
     }
     &NewFile1($r, $uname, $udom, $dir, $newfilename);
         } else {
     $r->print('<p>No new filename specified.</p></form>');
         }
   }    }
     
 }  }
   
 =pod  =pod
Line 799  sub Rename2 { Line 937  sub Rename2 {
  $newfile);   $newfile);
   
   if(-e $oldfile) {    if(-e $oldfile) {
       unless(rename($oldfile,        my $dest;
     $directory.'/'.$newfile)) {  
   $request->print('<font color=red>Error: '.$!.'</font>');        if ($oldfile =~ m|/$|) {
     #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 {}        } else {}
   } else {    } else {
Line 845  sub Delete2 { Line 994  sub Delete2 {
   
   if(-e $filename) {    if(-e $filename) {
     unless(unlink($filename)) {      unless(unlink($filename)) {
       $request->print('<font color=red>Error: '.$!.'</font>');        $request->print('<font color="red">Error: '.$!.'</font>');
       return 0;        return 0;
     }      }
   } else {    } else {
     $request->print('<p> No such file. </form');      $request->print('<p> No such file. </p></form');
     return 0;      return 0;
   }    }
   return 1;    return 1;
Line 888  sub Copy2 { Line 1037  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"> 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"> chmod error: '.$!.'</font>');
  return 0;   return 0;
     }      }
     return 1;      return 1;
Line 929  sub NewDir2 { Line 1078  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">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"> Error: '.$!.'</font>');
       return 0;        return 0;
   }    }
   return 1;    return 1;
Line 978  sub phasetwo { Line 1127  sub phasetwo {
           
     # Break down the file into it's component pieces.      # Break down the file into it's component pieces.
           
     $fn=~/(.*)\/([^\/]+)\.(\w+)$/;      my $dir; # Directory path
     my $dir=$1; # Directory path      my $main; # Filename.
     my $main=$2; # Filename.      my $suffix; # Extension.
     my $suffix=$3; # Extension.  
           if ($fn=~m:(.*)/([^/]+)\.(\w+)$:) {
    $dir=$1; # Directory path
    $main=$2; # Filename.
    $suffix=$3; # Extension.
       }
           
     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 1002  sub phasetwo { Line 1156  sub phasetwo {
           
     if ($ENV{'form.action'} eq 'rename') { # Rename.      if ($ENV{'form.action'} eq 'rename') { # Rename.
  if($ENV{'form.newfilename'}) {   if($ENV{'form.newfilename'}) {
       if (!defined($dir)) {
    $fn=~m:^(.*)/:;
    $dir=$1;
       }
     if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {      if(!&Rename2($r, $uname, $dir, $fn, $ENV{'form.newfilename'})) {
  return;   return;
     }      }
     # Prepend the directory to the new name to form the basis of the      # Prepend the directory to the new name to form the basis of the
     # url of the new resource.      # url of the new resource.
     #      #
       #renaming a dir
               #remove last element for current dir
       if ($fn =~ m|/$|) { $dir =~ s|/[^/]*$||; }
     $dest = $dir."/".$ENV{'form.newfilename'};      $dest = $dir."/".$ENV{'form.newfilename'};
  }   }
     } elsif ($ENV{'form.action'} eq 'delete') {       } elsif ($ENV{'form.action'} eq 'delete') { 
Line 1026  sub phasetwo { Line 1187  sub phasetwo {
     $dest = $ENV{'form.newfilename'};      $dest = $ENV{'form.newfilename'};
             
  } else {   } else {
     $r->print('<p>No New filename specified</form>');      $r->print('<p>No New filename specified</p></form>');
     return;      return;
  }   }
   
Line 1045  sub phasetwo { Line 1206  sub phasetwo {
     #  Substitute for priv for the first home in $dir to get our      #  Substitute for priv for the first home in $dir to get our
     # construction space path.      # construction space path.
     #      #
       $dest=&MakeFinalUrl($r,$dest);
   
       $r->print('<h3><a href="'.$dest.'">Done</a></h3>');
   }
   
   sub MakeFinalUrl {
       my($r,$dest)=@_;
     &Debug($r, "Final url is: $dest");      &Debug($r, "Final url is: $dest");
     $dest =~ s|/home/|/priv/|;      $dest =~ s|/home/|/priv/|;
     $dest =~ s|/public_html||;      $dest =~ s|/public_html||;
       
     my $base = &File::Basename::basename($dest);      my $base = &File::Basename::basename($dest);
     my $dpath= &File::Basename::dirname($dest);      my $dpath= &File::Basename::dirname($dest);
     if ($base eq '.') { $base=''; }      if ($base eq '.') { $base=''; }
     $dest = &HTML::Entities::encode($dpath.'/'.$base);      $dest = &HTML::Entities::encode($dpath.'/'.$base);
   
   
     &Debug($r, "Final url after rewrite: $dest");      &Debug($r, "Final url after rewrite: $dest");
       return $dest;
     $r->print('<h3><a href="'.$dest.'">Done</a></h3>');  
 }  }
   
 sub handler {  sub handler {
Line 1072  sub handler { Line 1238  sub handler {
   my $fn;    my $fn;
   
   if ($ENV{'form.filename'}) {    if ($ENV{'form.filename'}) {
       $fn=$ENV{'form.filename'};        $fn=&Apache::lonnet::unescape($ENV{'form.filename'});
       &Debug($r, "loncfile::handler - raw url: $fn");        &Debug($r, "loncfile::handler - raw url: $fn");
 #      $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;  #      $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
 #      $fn=~s/^http\:\/\/[^\/]+//;  #      $fn=~s/^http\:\/\/[^\/]+//;
Line 1117  sub handler { Line 1283  sub handler {
   
   $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');    $r->print('<html><head><title>LON-CAPA Construction Space</title></head>');
   
   $r->print(    $r->print(&Apache::loncommon::bodytag('File Operation'));
    '<body bgcolor="#FFFFFF"><img align=right src=/adm/lonIcons/lonlogos.gif>');  
   
       
   $r->print('<h1>Construction Space <tt>'.$fn.'</tt></h1>');    $r->print('<h1>Construction Space <tt>'.$fn.'</tt></h1>');
       
   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">Co-Author: '.$uname.' at '.$udom.
                '</font></h3>');                 '</font></h3>');
   }    }
   
Line 1139  sub handler { Line 1304  sub handler {
       $r->print('<h3>New Directory</h3>');        $r->print('<h3>New Directory</h3>');
   } elsif ($ENV{'form.action'} eq 'copy') {    } elsif ($ENV{'form.action'} eq 'copy') {
       $r->print('<h3>Copy</h3>');        $r->print('<h3>Copy</h3>');
     } elsif ($ENV{'form.action'} eq 'newfile' ||
      $ENV{'form.action'} eq 'newhtmlfile' ||
      $ENV{'form.action'} eq 'newproblemfile' ||
              $ENV{'form.action'} eq 'newpagefile' ||
              $ENV{'form.action'} eq 'newsequencefile' ||
              $ENV{'form.action'} eq 'Select Action' ) {
         $r->print('<h3>New Resource</h3>');
   } else {    } else {
      $r->print('<p>Unknown Action</body></html>');       $r->print('<p>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.20  
changed lines
  Added in v.1.33


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