--- loncom/publisher/lonretrieve.pm 2001/04/01 02:58:51 1.1
+++ loncom/publisher/lonretrieve.pm 2008/11/10 14:11:08 1.35
@@ -1,17 +1,97 @@
# The LearningOnline Network with CAPA
# Handler to retrieve an old version of a file
#
-# (Publication Handler
-#
-# (TeX Content Handler
+# $Id: lonretrieve.pm,v 1.35 2008/11/10 14:11:08 jms Exp $
#
-# 05/29/00,05/30,10/11 Gerd Kortemeyer)
+# Copyright Michigan State University Board of Trustees
#
-# 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)
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
-# 03/31 Gerd Kortemeyer
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
+#
+###
+
+=head1 NAME
+
+Apache::lonretrieve - retrieves an old version of a file
+
+=head1 SYNOPSIS
+
+Invoked by /etc/httpd/conf/srm.conf:
+
+
+ PerlAccessHandler Apache::lonacc
+ SetHandler perl-script
+ PerlHandler Apache::lonretrieve
+ ErrorDocument 403 /adm/login
+ ErrorDocument 404 /adm/notfound.html
+ ErrorDocument 406 /adm/unauthorized.html
+ ErrorDocument 500 /adm/errorhandler
+
+
+=head1 INTRODUCTION
+
+This module retrieves an old published version of a file.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 HANDLER SUBROUTINE
+
+This routine is called by Apache and mod_perl.
+
+=over 4
+
+=item *
+
+Get query string for limited number of parameters
+
+=item *
+
+Start page output
+
+=item *
+
+print phase relevant output
+
+=item *
+
+(phase one is to select version; phase two retrieves version)
+
+=back
+
+=head1 OTHER SUBROUTINES
+
+=over 4
+
+=item *
+
+phaseone() : Interface for selecting previous version.
+
+=item *
+
+phasetwo() : Interface for presenting specified version.
+
+=back
+
+=cut
package Apache::lonretrieve;
@@ -19,63 +99,243 @@ use strict;
use Apache::File;
use File::Copy;
use Apache::Constants qw(:common :http :methods);
+use Apache::loncacc;
+use Apache::loncommon();
+use Apache::lonlocal;
+use Apache::lonnet;
+use LONCAPA();
+
+# ------------------------------------ Interface for selecting previous version
+sub phaseone {
+ my ($r,$fn,$uname,$udom)=@_;
+ my $docroot=$r->dir_config('lonDocRoot');
+
+ my $urldir='/res/'.$udom.'/'.$uname.$fn;
+ $urldir=~s/\/[^\/]+$/\//;
+
+ my $resfn=$docroot.'/res/'.$udom.'/'.$uname.$fn;
+ my $resdir=$resfn;
+ $resdir=~s/\/[^\/]+$/\//;
+
+ my ($main,$suffix,$is_meta) = &get_file_info($fn);
+
+ if (-e $resfn) {
+ $r->print('
');
+ } else {
+ $r->print(''.&mt('No previous versions published.').'
');
+ }
+ $r->print(''.&mt('Back to').' '.$fn.
+ '
');
+}
+
+# ---------------------------------- Interface for presenting specified version
+sub phasetwo {
+ my ($r,$fn,$uname,$udom)=@_;
+ if ($env{'form.version'}) {
+ my $version=$env{'form.version'};
+ if ($version eq 'new') {
+ $r->print(''.&mt('Retrieving current (most recent) version').'
');
+ } else {
+ $r->print(''.&mt('Retrieving old version').' '.$version.'
');
+ }
+ my ($main,$suffix,$is_meta) = &get_file_info($fn);
+
+ my $logfile;
+ my $ctarget='/home/'.$uname.'/public_html'.$fn;
+ my $vfn=$fn;
+ if ($version ne 'new') {
+ $vfn=~s/\.(\Q$suffix\E)$/\.$version\.$1/;
+ }
+
+ my $csource=$r->dir_config('lonDocRoot').'/res/'.$udom.'/'.$uname.$vfn;
+
+ my $logname = $ctarget;
+ if ($is_meta) { $logname =~ s/\.meta$//; }
+ $logname = $ctarget.'.log';
+ unless ($logfile=Apache::File->new('>>'.$logname)) {
+ $r->print(
+ ''.&mt('No write permission to user directory, FAIL').'');
+ }
+ print $logfile
+"\n\n================= Retrieve ".localtime()." ================\n".
+"Version: $version\nSource: $csource\nTarget: $ctarget\n";
+ $r->print(''.&mt('Copying file').': ');
+ if (copy($csource,$ctarget)) {
+ $r->print('ok
');
+ print $logfile "Copied sucessfully.\n\n";
+ } else {
+ my $error=$!;
+ $r->print('fail, '.$error.'
');
+ print $logfile "Copy failed: $error\n\n";
+ }
+ $r->print(''.&mt('Back to').' '.$fn.'');
+ } else {
+ $r->print(''.&mt('Please pick a version to retrieve').'
');
+ &phaseone($r,$fn,$uname,$udom);
+ }
+}
+sub get_file_info {
+ my ($fn) = @_;
+ my ($main,$suffix) = ($fn=~/\/([^\/]+)\.(\w+)$/);
+ my $is_meta=0;
+ if ($suffix eq 'meta') {
+ $is_meta = 1;
+ ($main,$suffix) = ($main=~/(.+)\.(\w+)$/);
+ $suffix .= '.meta';
+ }
+ return ($main,$suffix,$is_meta);
+}
+# ---------------------------------------------------------------- Main Handler
sub handler {
my $r=shift;
my $fn;
- if ($ENV{'form.filename'}) {
- $fn=$ENV{'form.filename'};
- $fn=~s/^http\:\/\/[^\/]+\/\~(\w+)/\/home\/$1\/public_html/;
- $fn=~s/\/[^\/]+$//;
+
+# Get query string for limited number of parameters
+
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['filename']);
+
+ if ($env{'form.filename'}) {
+ $fn=$env{'form.filename'};
+ $fn=~s/^http\:\/\/[^\/]+//;
} else {
- $fn=$r->filename();
+ $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
+ ' unspecified filename for retrieval', $r->filename);
+ return HTTP_NOT_FOUND;
}
-
unless ($fn) {
- $r->log_reason($ENV{'user.name'}.' at '.$ENV{'user.domain'}.
- ' trying to publish empty directory', $r->filename);
+ $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
+ ' trying to retrieve non-existing file', $r->filename);
return HTTP_NOT_FOUND;
}
# ----------------------------------------------------------- Start page output
+ my $uname;
+ my $udom;
+
+ ($uname,$udom)=
+ &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));
+ unless (($uname) && ($udom)) {
+ $r->log_reason($uname.' at '.$udom.
+ ' trying to publish file '.$env{'form.filename'}.
+ ' ('.$fn.') - not authorized',
+ $r->filename);
+ return HTTP_NOT_ACCEPTABLE;
+ }
- my $uname=$ENV{'user.name'};
- my $udom=$ENV{'user.domain'};
+ $fn=~s{/~($LONCAPA::username_re)}{};
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
- $r->print('
LON-CAPA Construction Space');
-
- $r->print(
- '');
+ $r->print(&Apache::loncommon::start_page('Retrieve Published Resources'));
- my $thisdisfn=$fn;
- $thisdisfn=~s/^\/home\/$uname\/public_html//;
- $r->print('Construction Space Directory '.$thisdisfn.'
');
-
- my $docroot=$r->dir_config('lonDocRoot');
-
- my $resdir=$docroot.'/res/'.$udom.'/'.$uname.$thisdisfn;
- my $linkdir='/~'.$uname.$thisdisfn;
+ $r->print(''.&mt('Retrieve previous versions of').' '.$fn.'
');
+
+ if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
+ $r->print(''.&mt('Co-Author').': '.$uname.
+ &mt(' at ').$udom.
+ '
');
+ }
- my $filename;
- opendir(DIR,$fn);
- while ($filename=readdir(DIR)) {
- $filename=~/\.(\w+)$/;
- if (($1 ne 'meta') && ($1 ne 'save') && ($1 ne 'log')) {
- $r->print($resdir.' - '.$linkdir.' = '.$filename.'
');
- }
- }
- closedir(DIR);
+ if ($env{'form.phase'} eq 'two') {
+ &phasetwo($r,$fn,$uname,$udom);
+ } else {
+ &phaseone($r,$fn,$uname,$udom);
+ }
- $r->print('');
+ $r->print(&Apache::loncommon::end_page());
return OK;
}
+
+1;
+__END__
+
+