Diff for /loncom/publisher/loncfile.pm between versions 1.22 and 1.45

version 1.22, 2003/02/04 21:54:17 version 1.45, 2003/11/19 15:06:33
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 131  sub Debug { Line 110  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);    $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;
 }  }
   
 =pod  sub url {
       my $fn=shift;
 =item PublicationPath($domain, $user, $dir, $file)      $fn=~s/^\/home\/(\w+)\/public\_html/\/priv\/$1/;
       return $fn;
    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.  
   
 =back  
        
 =cut  
   
 sub PublicationPath  
 {  
   my ($domain, $user, $dir, $file)=@_;  
   
   return '/home/httpd/html/res/'.$domain.'/'.$user.'/'.$dir.'/'.  
  $file;  
 }  
   
 =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  
   
 =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;  
   
   sub display {
       my $fn=shift;
       $fn=~s-^/home/(\w+)/public_html-/priv/$1-;
       return '<tt>'.$fn.'</tt>';
 }  }
   
 =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 300  sub ConstructionPathFromRelative { Line 188  sub ConstructionPathFromRelative {
 =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 320  Returns: Line 205  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 '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">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 384  sub checksuffix { Line 260  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 407  Parameters: Line 311  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 443  Parameters: Line 343  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 484  new filename relative to the current dir Line 383  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;      # is dest a dir
     $cancelurl    =~ s/\/home\///;      if (-d $newfilename) {
     $cancelurl    =~ s/\/public_html//;   if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
           }
     if(-e $conspace) {      if ($newfilename =~ m|/[^\.]+$|) {
  if($ENV{'form.newfilename'}) {   #no extension add on original extension
     my $newfilename = $ENV{'form.newfilename'};   if ($fn =~ m|/[^\.]*\.([^\.]+)$|) {
     $request->print(&checksuffix($filename, $newfilename));      $newfilename.='.'.$1;
     my $return=&exists($user, $domain, $dir, $newfilename);   }
       }
       $request->print(&checksuffix($fn, $newfilename));
       #renaming a dir, delete the trailing /
               #remove second to last element for current dir
       if (-d $fn) {
    $newfilename=~s/\/[^\/]+\/([^\/]+)$/\/$1/;
       }
       $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="'.$cancelurl.'">Cancel</a>');   $request->print('<br /><a href="'.&url($fn).'">Cancel</a>');
  return;   return;
     }      }
     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 '.&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 529  Parameters: Line 439  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 579  Parameters: Line 484  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 590  Parameters: Line 493  Parameters:
 =cut  =cut
   
 sub Copy1 {  sub Copy1 {
   my ($request, $user, $domain, $dir, $filename, $newfilename) = @_;      my ($request, $user, $domain, $fn, $newfilename) = @_;
   
   my $cancelurl = "/priv/".$filename;  
   $cancelurl    =~ s/\/home\///;  
   $cancelurl    =~ s/\/public_html//;  
       
   
   if(-e $filename) {      if(-e $fn) {
     $request->print(&checksuffix($filename,$newfilename));   # is dest a dir
     my $return=&exists($user, $domain, $dir, $newfilename);   if (-d $newfilename) {
     $request->print($return);      if ($fn =~ m|/([^/]*)$|) { $newfilename .= '/'.$1; }
     if ($return =~/^Error:/) {   }
  $request->print('<br /><a href="'.$cancelurl.'">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).'">Cancel</a>');
       return;
    }
    $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>');
     }      }
     my $dest=&SimplifyDir($dir,$newfilename);  
     $request->print('<input type = hidden name = newfilename value = "'.  
     $dir.'/'.$newfilename.  
     '"><p>Copy <tt>'.$filename.'</tt><br />  to '.  
     '<tt>'.$dest.'</tt>?</p>');  
     &CloseForm1($request, $cancelurl);  
   } else {  
     $request->print('<p>No such file <tt>'.$filename.'</p></form>');  
   }  
 }  
   
 =pod  
   
 =item SimplifyDir  
   
   Removes all extra / and all .. references  
   
 Parameters:  
   
 =over 4  
   
 =item $dir - string [in] a directory name  
   
 =item $file - string [in] a file reference relative to $dir  
   
 =back  
   
 Results: the concatenated path.  
   
 =cut  
   
 sub SimplifyDir {  
     my ($dir,$file) = @_;  
     my $location = $dir. '/'.$file;  
     $location=~s://+:/:g; # remove duplicate /  
     while ($location=~m:/\.\./:) {$location=~s:/[^/]+/\.\./:/:g;}#remove dir/..  
     return $location;  
 }  }
   
 =pod  =pod
Line 661  Parameters: Line 542  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 - Domain user is in
   
   =item   $fn     - source file.
   
 =item   $newdir   - Name of the directory to be created; path relative to the   =item   $newdir   - Name of the directory to be created; path relative to the 
                top level of construction space.                 top level of construction space.
Line 683  causes the newdir operation to transitio Line 566  causes the newdir operation to transitio
   
 sub NewDir1  sub NewDir1
 {  {
   my ($request, $username, $path, $newdir) = @_;    my ($request, $username, $domain, $fn, $newfilename) = @_;
   
   my $fullpath = '/home/'.$username.'/public_html/'.  
     $path.'/'.$newdir;  
   
   my $cancelurl = '/priv/'.$username.'/'.$path;  
   
   &Debug($request, "Full path is : ".$fullpath);  
   
   if(-e $fullpath) {  
     $request->print('<p>Directory exists.</p></form>');  
   }  
   else {  
     $request->print('<input type=hidden name=newfilename value="'.  
     $newdir.'"><p>Make new directory <tt>'.  
     $path."/".$newdir.'</tt>?</p>');  
     &CloseForm1($request, $cancelurl);  
   
     my $result=&exists($username,$domain,$newfilename);
     if ($result) {
       $request->print('<font color="red">'.$result.'</font></form>');
     } else {
       $request->print('<input type="hidden" name="newfilename" value="'.
       $newfilename.'" /><p>Make new directory '.
       &display($newfilename).'?</p>');
       &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>Decompress '.&display($fn).'?</p>');
       &CloseForm1($request, $fn);
       } else {
           $request->print('<p>No such file: '.&display($fn).'</p></form>');
          }
   }
 =pod  =pod
   
 =item NewFile1  =item NewFile1
Line 725  Parameters: Line 611  Parameters:
   
 =item   $domain   - Name of the domain of the user  =item   $domain   - Name of the domain of the user
   
 =item   $dir      - current absolute diretory  =item   $fn      - Source file name
   
 =item   $newfilename  =item   $newfilename
                   - Name of the file to be created; no path information                    - Name of the file to be created; no path information
Line 737  Side Effects: Line 623  Side Effects:
   
 =item 2 new forms are displayed.  Clicking on the confirmation button  =item 2 new forms are displayed.  Clicking on the confirmation button
 causes the browser to attempt to load the specfied URL, allowing the  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  proper handler to take care of file creation. There is also a Cancel
 button which returns you to the driectory listing you came from  button which returns you to the driectory listing you came from
   
 =back  =back
Line 746  button which returns you to the driector Line 632  button which returns you to the driector
   
   
 sub NewFile1 {  sub NewFile1 {
     my ($request, $user, $domain, $dir, $newfilename) = @_;      my ($request, $user, $domain, $fn, $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/) {      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.
         ' - Bad Filename<br />(name).(number).(extension)'.
         ' Not Allowed</font>');
       return;
    }
  if ($newfilename !~ /\Q.$extension\E$/) {   if ($newfilename !~ /\Q.$extension\E$/) {
       if ($newfilename =~ m|^[^\.]*\.([^\.]+)$|) {
    #already has an extension strip it and add in expected one
    $newfilename =~ s|.([^\.]+)$||;
       }
     $newfilename.=".$extension";      $newfilename.=".$extension";
  }   }
     }      }
       my $result=&exists($user,$domain,$newfilename);
     my $fullpath = $dir.'/'.$newfilename;      if($result) {
    $request->print('<font color="red">'.$result.'</font></form>');
     &Debug($request, "Full path is : ".$fullpath);      } else {
    $request->print('<p>Make new file '.&display($newfilename).'?</p>');
     if(-e $fullpath) {  
  $request->print('<p>File exists.</p></form>');  
     }  
     else {  
  $request->print('<p>Make new file <tt>'.$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>');
  $request->print('<form action="'.$dest.   $request->print('<form action="'.&url($newfilename).
  '" method="GET"><p><input type="submit" value="Continue" /></p></form>');   '" method="POST"><p><input type="submit" value="Continue" /></p></form>');
  $request->print('<form action="'.$cancelurl.   $request->print('<form action="'.&url($fn).
  '" method="GET"><p><input type="submit" value="Cancel" /></p></form>');   '" method="POST"><p><input type="submit" value="Cancel" /></p></form>');
     }      }
 }  }
   
Line 813  performed and reported to the user. Line 696  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;    $r->print('<form action="/adm/cfile" method="post">'.
   my $suffix=$3;        '<input type="hidden" name="qualifiedfilename" value="'.$fn.'" />'.
           '<input type="hidden" name="phase" value="two" />'.
   #  my $conspace=ConstructionPathFromRelative($uname, $fn);        '<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 'decompress') {
             &Decompress1($r, $uname, $udom, $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' ||    }  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' ||
     if($ENV{'form.newfilename'}) {              $ENV{'form.action'} eq 'newpagefile' ||
       my $newfilename = $ENV{'form.newfilename'};              $ENV{'form.action'} eq 'newsequencefile' ||
       if (!defined($dir)) {              $ENV{'form.action'} eq 'newrightsfile' ||
   $fn=~m:(.*)/:;              $ENV{'form.action'} eq 'newstyfile' ||
   $dir=$1;              $ENV{'form.action'} eq 'Select Action') {
         if ($newfilename) {
     &NewFile1($r, $uname, $udom, $fn, $newfilename);
         } else {
     $r->print('<p>No new filename specified.</p></form>');
       }        }
       &NewFile1($r, $uname, $udom, $dir, $fn, $newfilename);  
     }else {  
       $r->print('<p>No new filename specified.</p></form>');  
     }  
   }    }
 }  }
   
Line 901  sub Rename2 { Line 775  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;
       unless(rename($oldfile,        my $nRN=$newfile;
     $directory.'/'.$newfile)) {        unless (rename($oldfile,$newfile)) {
   $request->print('<font color=red>Error: '.$!.'</font>');    $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> No such file: ".&display($oldfile).'</p></form>');
       $oldfile.' </p></form>');  
       return 0;        return 0;
   }    }
   return 1;    return 1;
Line 949  sub Delete2 { Line 854  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 992  sub Copy2 { Line 897  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 1033  sub NewDir2 { Line 938  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;
 }  }
   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 1082  sub phasetwo { Line 996  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 1103  sub phasetwo { Line 1022  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)) {
    $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      $dest = &url($ENV{'form.newfilename'});
     # url of the new resource.  
     #  
     $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 1125  sub phasetwo { Line 1053  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</form>');      $r->print('<p>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."/"
     }      }
     #      $r->print('<h3><a href="'.&url($dest).'">Done</a></h3>');
     #  Substitute for priv for the first home in $dir to get our  
     # 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");  
     $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 1177  sub handler { Line 1080  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'}) {
   
    &Debug($r, "test: $ENV{'form.filename'}");
       $fn=&Apache::lonnet::unescape($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/;    }  
 #      $fn=~s/^http\:\/\/[^\/]+//;   #Just hijack the script only the first time around to inject the correct information for further processing
       $fn=URLToPath($fn);      elsif($ENV{'QUERY_STRING'} && $ENV{'form.phase'} ne 'two') {
       &Debug($r, "loncfile::handler - doctored url: $fn");    &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'};
   } 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 1218  sub handler { Line 1133  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 1246  sub handler { Line 1158  sub handler {
       $r->print('<h3>Rename</h3>');        $r->print('<h3>Rename</h3>');
   } elsif ($ENV{'form.action'} eq 'newdir') {    } elsif ($ENV{'form.action'} eq 'newdir') {
       $r->print('<h3>New Directory</h3>');        $r->print('<h3>New Directory</h3>');
     } elsif ($ENV{'form.action'} eq 'decompress') {
         $r->print('<h3>Decompress</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' ||    } elsif ($ENV{'form.action'} eq 'newfile' ||
    $ENV{'form.action'} eq 'newhtmlfile' ||     $ENV{'form.action'} eq 'newhtmlfile' ||
    $ENV{'form.action'} eq 'newproblemfile') {     $ENV{'form.action'} eq 'newproblemfile' ||
              $ENV{'form.action'} eq 'newpagefile' ||
              $ENV{'form.action'} eq 'newsequencefile' ||
      $ENV{'form.action'} eq 'newrightsfile' ||
      $ENV{'form.action'} eq 'newstyfile' ||
              $ENV{'form.action'} eq 'Select Action' ) {
       $r->print('<h3>New Resource</h3>');        $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.22  
changed lines
  Added in v.1.45


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