Diff for /loncom/publisher/loncfile.pm between versions 1.19 and 1.37

version 1.19, 2002/10/28 23:23:41 version 1.37, 2003/08/04 17:45:06
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 34 Line 33
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 #  
 # (Handler to retrieve an old version of a file  
 #  
 # (Publication Handler  
 #   
 # (TeX Content Handler  
 #  
 # 05/29/00,05/30,10/11 Gerd Kortemeyer)  
 #  
 # 11/28,11/29,11/30,12/01,12/02,12/04,12/23 Gerd Kortemeyer  
 # 03/23 Guy Albertelli  
 # 03/24,03/29 Gerd Kortemeyer)  
 #  
 # 03/31,04/03,05/02,05/09,06/23,06/24 Gerd Kortemeyer)  
 #  
 # 06/23 Gerd Kortemeyer  
 # 05/07/02 Ron Fox:  
 #           - Added Debug log output so that I can trace what the heck this  
 #             undocumented thingy does.  
 # 05/28/02  Ron Fox:  
 #           - Started putting in pod in standard format.  
 =pod  =pod
   
 =head1 NAME  =head1 NAME
Line 93  use Apache::Constants qw(:common :http : Line 71  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 107  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 173  Global References Line 152  Global References
 sub URLToPath {  sub URLToPath {
   my $Url = shift;    my $Url = shift;
   &Debug($r, "UrlToPath got: $Url");    &Debug($r, "UrlToPath got: $Url");
   $Url=~ s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;    $Url=~ s/\/+/\//g;
   $Url=~ s/^http\:\/\/[^\/]+//;    $Url=~ s/^http\:\/\/[^\/]+//;
     $Url=~ s/^\///;
     $Url=~ s/(\~|priv\/)(\w+)\//\/home\/$2\/public_html\//;
   &Debug($r, "Returning $Url \n");    &Debug($r, "Returning $Url \n");
   return $Url;    return $Url;
 }  }
   
   sub url {
       my $fn=shift;
       $fn=~s/^\/home\/(\w+)\/public\_html/\/priv\/$1/;
       return $fn;
   }
   
   sub display {
       my $fn=shift;
       $fn=~s/^\/home\/(\w+)\/public\_html//;
       return '<tt>'.$fn.'</tt>';
   }
   
 =pod  =pod
   
 =item PublicationPath($domain, $user, $dir, $file)  =item PublicationPath($domain, $user, $dir, $file)
Line 248  sub ConstructionPath { Line 241  sub ConstructionPath {
   return '/home/'.$user.'/public_html/'.$dir.'/'.$file;    return '/home/'.$user.'/public_html/'.$dir.'/'.$file;
   
 }  }
 =pod  
   
 =item  ConstructionPathFromRelative($user, $relname)  
   
    Determines the path to a construction space file given  
 the username and the path relative to the root of construction space.  
   
 Parameters:  
   
 =over 4  
   
 =item  $user  - string [in] Name of the user in whose construction space the  
            file [will] live.  
   
 =item  $relname - string[in] Path to the file relative to the root of the  
             construction space.  
   
 =back  
   
 Returns:  
   
 =over 4     
   
 =item  string - Full path to the file.  
   
 =back  
   
 =cut  
   
 sub ConstructionPathFromRelative {  
   
   my ($user, $relname) = @_;  
   return '/home/'.$user.'/public_html'.$relname;  
   
 }  
   
 =pod  =pod
   
Line 323  sub exists { Line 281  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) {
         $result.='<p><font color="red">Warning: target file exists!</font></p>';
   }    }
   elsif ( -e $construct) {  
     $result.='<p><font color=red>Warning: target file exists!</font></p>';  
    }  
   
   return $result;    return $result;
   
Line 380  sub checksuffix { Line 341  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;
   }
   
   sub relativeDest {
       my ($fn,$newfilename,$uname)=@_;
       if ($newfilename=~/^\//) {
   # absolute, simply add path
    $newfilename='/home/'.$uname.'/public_html/';
       } else {
    my $dir=$fn;
    $dir=~s/\/[^\/]+$//;
    $newfilename=$dir.'/'.$newfilename;
       }
       $newfilename=~s://+:/:g; # remove duplicate /
       while ($newfilename=~m:/\.\./:) {
    $newfilename=~ s:/[^/]+/\.\./:/:g; #remove dir/..
       }
       return $newfilename;
   }
   
 =pod  =pod
   
 =item CloseForm1($request, $user, $file)  =item CloseForm1($request, $user, $file)
Line 403  Parameters: Line 392  Parameters:
 =cut  =cut
   
 sub CloseForm1 {  sub CloseForm1 {
    my ($request,  $cancelurl) = @_;     my ($request,  $fn) = @_;
      $request->print('<p><input type="submit" value="Continue" /></p></form>');
      $request->print('<form action="'.&url($fn).
    &Debug($request, "Cancel url is: ".$cancelurl);       '" method="POST"><p><input type="submit" value="Cancel" /></p></form>');
    $request->print('<p><input type=submit value=Continue></p></form>');  
    $request->print('<form action="'.$cancelurl.  
    '" method=GET"><p><input type=submit value=Cancel><p></form>');  
   
 }  }
   
   
Line 439  Parameters: Line 424  Parameters:
 =cut  =cut
   
 sub CloseForm2 {  sub CloseForm2 {
   my ($request, $user, $directory) = @_;    my ($request, $user, $fn) = @_;
     $request->print('<h3><a href="'.&url($fn).'/">Done</a></h3>');
   $request->print('<h3><a=href="/priv/'.$user.$directory.'/">Done </a> </h3>');  
 }  }
   
 =pod  =pod
Line 480  new filename relative to the current dir Line 464  new filename relative to the current dir
 =cut    =cut  
   
 sub Rename1 {  sub Rename1 {
     my ($request, $filename, $user, $domain, $dir) = @_;      my ($request, $user, $domain, $fn, $newfilename) = @_;
     &Debug($request, "Username - ".$user." filename: ".$filename."\n");  
     my $conspace = $filename;      if(-e $fn) {
    if($newfilename) {
     my $cancelurl = "/priv/".$filename;      if ($newfilename =~ m|/[^\.]+$|) {
     $cancelurl    =~ s/\/home\///;   #no extension add on original extension
     $cancelurl    =~ s/\/public_html//;   if ($fn =~ m|/[^\.]*\.([^\.]+)$|) {
           $newfilename.='.'.$1;
     if(-e $conspace) {   }
  if($ENV{'form.newfilename'}) {      }
     my $newfilename = $ENV{'form.newfilename'};      $request->print(&checksuffix($fn, $newfilename));
     $request->print(&checksuffix($filename, $newfilename));      #renaming a dir, delete the trailing /
     $request->print(&exists($user, $domain, $dir, $newfilename));              #remove last element for current dir
     my $dest=&SimplifyDir($dir,$newfilename);      my $dir=$fn;
     $request->print('<input type=hidden name=newfilename value="'.      if ($fn =~ m|/$|) {
    $fn =~ s|/$||;
    $dir =~ s|/[^/]*$||;
       }
       my $return=&exists($user, $domain, $dir, $newfilename);
       $request->print($return);
       if ($return =~/^Error:/) {
    $request->print('<br /><a href="'.&url($fn).'">Cancel</a>');
    return;
       }
       $request->print('<input type="hidden" name="newfilename" value="'.
     $newfilename.      $newfilename.
     '"><p>Rename <tt>'.$filename.'</tt><br /> to <tt>'.      '" /><p>Rename '.&display($fn).
     $dest.'</tt>?</p>');      '</tt><br />to '.&display($newfilename).'?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $fn);
  } else {   } else {
     $request->print('<p>No new filename specified</p></form>');      $request->print('<p>No new filename specified.</p></form>');
     return;      return;
  }   }
     } else {      } else {
  $request->print('<p> No such File </p> </form>');   $request->print('<p> No such file: '.&display($fn).'</p></form>');
  return;   return;
     }      }
           
Line 520  Parameters: Line 514  Parameters:
   
 =over 4  =over 4
   
 =item   $request   - Apache Request Object [in] request object for the current  =item   $request   - Apache Request Object [in] request object for the current 
                 request.                  request.
   
 =item   $user      - string [in] Name of session user.  =item   $user      - string [in]  Name of the user initiating the request.
   
   =item   $domain    - string [in]  Domain the initiating user is logged in as
   
 =item   $filename  - string [in] Name fo the file to be deleted:  =item   $filename  - string [in]  Source filename.
                 Filename is the full filesystem path to the file.  
   
 =back  =back
   
 =cut  =cut
   
 sub Delete1 {  sub Delete1 {
   my ($request, $user,  $filename) = @_;    my ($request, $user, $domain, $fn) = @_;
   
   my $cancelurl = '/priv/'.$filename;  
   $cancelurl    =~ s/\/home\///;  
   $cancelurl    =~ s/\/public_html//;  
     
   
   if( -e $filename) {    if( -e $fn) {
     $request->print('<input type=hidden name=newfilename value="'.      $request->print('<input type="hidden" name="newfilename" value="'.
     $filename.'">');      $fn.'"/>');
     $request->print('<p> Delete <tt>'.$filename.'</tt>?</p>');      $request->print('<p>Delete '.&display($fn).'?</p>');
     &CloseForm1($request, $cancelurl);      &CloseForm1($request, $fn);
   } else {    } else {
     $request->print('<p> No Such file: <tt>'.$filename.'</tt></p></form>');      $request->print('<p>No such file: '.&display($fn).'</p></form>');
   }    }
 }  }
   
Line 570  Parameters: Line 559  Parameters:
   
 =item   $domain    - string [in]  Domain the initiating user is logged in as  =item   $domain    - string [in]  Domain the initiating user is logged in as
   
 =item   $dir       - string [in]  Directory path.  =item   $fn  - string [in]  Source filename.
   
 =item   $filename  - string [in]  Source filename.  
   
 =item   $newfilename-string [in]  Destination filename.  =item   $newfilename-string [in]  Destination filename.
   
Line 581  Parameters: Line 568  Parameters:
 =cut  =cut
   
 sub Copy1 {  sub Copy1 {
   my ($request, $user, $domain, $dir, $filename, $newfilename) = @_;    my ($request, $user, $domain, $fn, $newfilename) = @_;
   
   my $cancelurl = "/priv/".$filename;    if(-e $fn) {
   $cancelurl    =~ s/\/home\///;      $request->print(&checksuffix($fn,$newfilename));
   $cancelurl    =~ s/\/public_html//;      my $return=&exists($user, $domain, $fn, $newfilename);
           $request->print($return);
       if ($return =~/^Error:/) {
   if(-e $filename) {   $request->print('<br /><a href="'.&url($fn).'">Cancel</a>');
     $request->print(&checksuffix($filename,$newfilename));   return;
     $request->print(&exists($user, $domain, $dir, $newfilename));      }
     my $dest=&SimplifyDir($dir,$newfilename);      $request->print('<input type = "hidden" name = "newfilename" value = "'.
     $request->print('<input type = hidden name = newfilename value = "'.      $newfilename.
     $dir.'/'.$newfilename.      '" /><p>Copy '.&display($fn).'<br />to '.
     '"><p>Copy <tt>'.$filename.'</tt><br />  to '.      &display($newfilename).'?</p>');
     '<tt>'.$dest.'</tt>?</p>');      &CloseForm1($request, $fn);
     &CloseForm1($request, $cancelurl);  
   } else {    } else {
     $request->print('<p>No such file <tt>'.$filename.'</p></form>');      $request->print('<p>No such file: '.&display($fn).'</p></form>');
   }    }
 }  }
   
 =pod  =pod
   
 =item SimplifyDir  =item NewDir1
    
   Removes all extra / and all .. references    Does all phase 1 processing of directory creation:
     Ensures that the user provides a new directory name,
     and that the directory does not already exist.
   
 Parameters:  Parameters:
   
 =over 4  =over 4
   
 =item $dir - string [in] a directory name  =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 $file - string [in] a file reference relative to $dir  =item $domain - Domain user is in
   
   =item   $fn     - source file.
   
   =item   $newdir   - Name of the directory to be created; path relative to the 
                  top level of construction space.
 =back  =back
   
 Results: the concatenated path.  Side Effects:
   
   =over 4
   
   =item A new form is displayed.  Clicking on the confirmation button
   causes the newdir operation to transition into phase 2.  The hidden field
   "newfilename" is set with the construction space path to the new directory.
   
   
   =back
   
 =cut  =cut
   
 sub SimplifyDir {  
     my ($dir,$file) = @_;  sub NewDir1
     my $location = $dir. '/'.$file;  {
     $location=~s://+:/:g; # remove duplicate /    my ($request, $username, $domain, $fn, $newfilename) = @_;
     while ($location=~m:/\.\./:) {$location=~s:/[^/]+/\.\./:/:g;}#remove dir/..  
     return $location;    if(-e $newfilename) {
       $request->print('<p>Directory exists.</p></form>');
     }
     else {
       $request->print('<input type="hidden" name="newfilename" value="'.
       $newfilename.'" /><p>Make new directory '.
       &display($newfilename).'?</p>');
       &CloseForm1($request, $fn);
     }
 }  }
   
 =pod  =pod
   
 =item NewDir1  =item NewFile1
     
   Does all phase 1 processing of directory creation:    Does all phase 1 processing of file creation:
   Ensures that the user provides a new directory name,    Ensures that the user provides a new filename, adds proper extension
   and that the directory does not already exist.    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:  Parameters:
   
Line 647  Parameters: Line 661  Parameters:
   
 =item   $username - Name of the user that is requesting the directory creation.  =item   $username - Name of the user that is requesting the directory creation.
   
 =item   $path     - current directory relative to construction space.  =item   $domain   - Name of the domain of the user
   
 =item   $newdir   - Name of the directory to be created; path relative to the   =item   $fn      - Source file name
                top level of construction space.  
   =item   $newfilename
                     - Name of the file to be created; no path information
 =back  =back
   
 Side Effects:  Side Effects:
   
 =over 4  =over 4
   
 =item A new form is displayed.  Clicking on the confirmation button  =item 2 new forms are displayed.  Clicking on the confirmation button
 causes the newdir operation to transition into phase 2.  The hidden field  causes the browser to attempt to load the specfied URL, allowing the
 "newfilename" is set with the construction space path to the new directory.  proper handler to take care of file creation. There is also a Cancel
   button which returns you to the driectory listing you came from
   
 =back  =back
   
 =cut  =cut
   
   
 sub NewDir1  sub NewFile1 {
 {      my ($request, $user, $domain, $fn, $newfilename) = @_;
   my ($request, $username, $path, $newdir) = @_;  
   
   my $fullpath = '/home/'.$username.'/public_html/'.  
     $path.'/'.$newdir;  
   
   my $cancelurl = '/priv/'.$username.'/'.$path;  
   
   &Debug($request, "Full path is : ".$fullpath);      if ($ENV{'form.action'} =~ /new(.+)file/) {
    my $extension=$1;
   if(-e $fullpath) {   if ($newfilename !~ /\Q.$extension\E$/) {
     $request->print('<p>Directory exists.</p></form>');      if ($newfilename =~ m|^[^\.]*\.([^\.]+)$|) {
   }   #already has an extension strip it and add in expected one
   else {   $newfilename =~ s|.([^\.]+)$||;
     $request->print('<input type=hidden name=newfilename value="'.      }
     $newdir.'"><p>Make new directory <tt>'.      $newfilename.=".$extension";
     $path."/".$newdir.'</tt>?</p>');   }
     &CloseForm1($request, $cancelurl);      }
   
   }      if(-e $newfilename) {
    $request->print('<p>File exists.</p></form>');
       }
       else {
    $request->print('<p>Make new file '.&display($newfilename).'?</p>');
    $request->print('</form>');
    $request->print('<form action="'.&url($newfilename).
    '" method="POST"><p><input type="submit" value="Continue" /></p></form>');
    $request->print('<form action="'.&url($fn).
    '" method="POST"><p><input type="submit" value="Cancel" /></p></form>');
       }
 }  }
   
 =pod  =pod
Line 721  performed and reported to the user. Line 741  performed and reported to the user.
 sub phaseone {  sub phaseone {
   my ($r,$fn,$uname,$udom)=@_;    my ($r,$fn,$uname,$udom)=@_;
       
   $fn=~m:(.*)/([^/]+)\.(\w+)$:;    my $newfilename=&cleanDest($r,$ENV{'form.newfilename'});
   my $dir=$1;    $newfilename=&relativeDest($fn,$newfilename,$uname);
   my $main=$2;  
   my $suffix=$3;    $r->print('<form action="/adm/cfile" method="post">'.
           '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
   #  my $conspace=ConstructionPathFromRelative($uname, $fn);        '<input type="hidden" name="phase" value="two" />'.
           '<input type="hidden" name="action" value="'.$ENV{'form.action'}.'" />');
     
   $r->print('<form action=/adm/cfile method=post>'.  
     '<input type=hidden name=filename value="/~'.$uname.$fn.'">'.  
     '<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') {
             &Rename1($r, $uname, $udom, $fn, $newfilename);
     &Rename1($r, $fn, $uname, $udom, $dir);  
       
   } elsif ($ENV{'form.action'} eq 'delete') {     } elsif ($ENV{'form.action'} eq 'delete') { 
             &Delete1($r, $uname, $udom, $fn);
     &Delete1($r, $uname, $fn);  
       
   } elsif ($ENV{'form.action'} eq 'copy') {     } elsif ($ENV{'form.action'} eq 'copy') { 
     if($ENV{'form.newfilename'}) {        if($newfilename) {
       my $newfilename = $ENV{'form.newfilename'};    &Copy1($r, $uname, $udom, $fn, $newfilename);
       &Copy1($r, $uname, $udom, $dir, $fn, $newfilename);        } else {
     }else {    $r->print('<p>No new filename specified.</p></form>');
       $r->print('<p>No new filename specified.</p></form>');        }
     }  
   } elsif ($ENV{'form.action'} eq 'newdir') {    } elsif ($ENV{'form.action'} eq 'newdir') {
     &NewDir1($r, $uname, $dir, $ENV{'form.newfilename'});        &NewDir1($r, $uname, $udom, $fn, $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 'newrightsfile' ||
               $ENV{'form.action'} eq 'newstyfile' ||
               $ENV{'form.action'} eq 'Select Action') {
         if ($newfilename) {
     &NewFile1($r, $uname, $udom, $fn, $newfilename);
         } else {
     $r->print('<p>No new filename specified.</p></form>');
         }
   }    }
     
 }  }
   
 =pod  =pod
Line 799  sub Rename2 { Line 821  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 878  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 921  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 962  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 1011  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 1040  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 1017  sub phasetwo { Line 1062  sub phasetwo {
  # 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'})) {
Line 1026  sub phasetwo { Line 1071  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 1090  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=''; }
     $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 1067  sub handler { Line 1118  sub handler {
   &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
   # This could come in as "filename", which actually is a URL, or
   # as "qualifiedfilename", which is indeed a real filename in filesystem
   #
   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");        $fn=&URLToPath($fn);
 #      $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;    } elsif ($ENV{'form.qualifiedfilename'}) {
 #      $fn=~s/^http\:\/\/[^\/]+//;        $fn=$ENV{'form.qualifiedfilename'};
       $fn=URLToPath($fn);  
       &Debug($r, "loncfile::handler - doctored url: $fn");  
   
   } 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'}.
Line 1108  sub handler { Line 1160  sub handler {
      return HTTP_NOT_ACCEPTABLE;       return HTTP_NOT_ACCEPTABLE;
   }    }
   
   $fn=~s/\/\~(\w+)//;  
   &Debug($r, "loncfile::handler ~ removed filename: $fn");  
   
   $r->content_type('text/html');    $r->content_type('text/html');
   $r->send_http_header;    $r->send_http_header;
   
   $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('Construction Space File Operation'));
    '<body bgcolor="#FFFFFF"><img align=right src=/adm/lonIcons/lonlogos.gif>');  
   
       
   $r->print('<h1>Construction Space <tt>'.$fn.'</tt></h1>');    $r->print('<h3>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">Co-Author: '.$uname.' at '.$udom.
                '</font></h3>');                 '</font></h3>');
   }    }
   
Line 1138  sub handler { Line 1187  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 'newrightsfile' ||
      $ENV{'form.action'} eq 'newstyfile' ||
              $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.19  
changed lines
  Added in v.1.37


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