Diff for /loncom/publisher/lonretrieve.pm between versions 1.34 and 1.53

version 1.34, 2006/12/06 22:22:39 version 1.53, 2023/07/23 12:24:16
Line 28 Line 28
 #  #
 ###  ###
   
   =head1 NAME
   
   Apache::lonretrieve - retrieves an old version of a file
   
   =head1 SYNOPSIS
   
   Invoked by /etc/httpd/conf/srm.conf:
   
    <Location /adm/retrieve>
    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
    </Location>
   
   =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;  package Apache::lonretrieve;
   
 use strict;  use strict;
 use Apache::File;  use Apache::File;
 use File::Copy;  use File::Copy;
 use Apache::Constants qw(:common :http :methods);  use Apache::Constants qw(:common :http :methods);
 use Apache::loncacc;  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
Line 43  use LONCAPA(); Line 107  use LONCAPA();
 # ------------------------------------ Interface for selecting previous version  # ------------------------------------ Interface for selecting previous version
 sub phaseone {  sub phaseone {
     my ($r,$fn,$uname,$udom)=@_;      my ($r,$fn,$uname,$udom)=@_;
     my $docroot=$r->dir_config('lonDocRoot');  
   
     my $urldir='/res/'.$udom.'/'.$uname.$fn;      my $urldir = "/res/$udom/$uname".$fn;
     $urldir=~s/\/[^\/]+$/\//;      my $resfn = $r->dir_config('lonDocRoot').$urldir;
   
     my $resfn=$docroot.'/res/'.$udom.'/'.$uname.$fn;      $urldir =~ s{[^/]+$}{};
     my $resdir=$resfn;      my $resdir = $r->dir_config('lonDocRoot').$urldir;
     $resdir=~s/\/[^\/]+$/\//;  
   
     my ($main,$suffix,$is_meta) = &get_file_info($fn);      my ($main,$suffix,$is_meta) = &get_file_info($fn);
           
     if (-e $resfn) {        if (-e $resfn) {  
  $r->print('<form action="/adm/retrieve" method="POST">'.   $r->print('<form action="/adm/retrieve?inhibitmenu=yes" method="post">'.
   '<input type="hidden" name="filename" value="/~'.$uname.$fn.'" />'.    '<input type="hidden" name="filename" value="/priv/'.$udom.'/'.$uname.$fn.'" />'.
   '<input type="hidden" name="phase" value="two" />'.    '<input type="hidden" name="phase" value="two" />'.
   &Apache::loncommon::start_data_table().    &Apache::loncommon::start_data_table().
   &Apache::loncommon::start_data_table_header_row().    &Apache::loncommon::start_data_table_header_row().
Line 87  sub phaseone { Line 149  sub phaseone {
  my $rmtime=&Apache::lonnet::metadata($resdir.'/'.$filename,'lastrevisiondate');   my $rmtime=&Apache::lonnet::metadata($resdir.'/'.$filename,'lastrevisiondate');
  $r->print(&Apache::loncommon::start_data_table_row().   $r->print(&Apache::loncommon::start_data_table_row().
   '<td><input type="radio" name="version" value="'.    '<td><input type="radio" name="version" value="'.
   $version.'" /></td><td>'.&mt('Previously published version').' '.$version.'</td><td>'.    $version.'" /></td><td>'.&mt('Previously published version').' '.$version.'</td>'.
   localtime($rmtime).'</td>');                '<td>'.&Apache::lonlocal::locallocaltime($rmtime).'</td>');
   
  if (!$is_meta) {   if (!$is_meta) {
     $r->print('<td><a href="'.$urldir.$filename.'.meta" target=cat>'.      $r->print('<td>'.
       &mt('Metadata Version').' '.$version.'</a></td>');                                &Apache::loncommon::modal_link($urldir.$filename.'.meta',
         &mt('Metadata Version [_1]',$version),550,450).'</td>');
  }   }
  if ($is_meta   if ($is_meta
     || &Apache::loncommon::fileembstyle($suffix) eq 'ssi') {      || &Apache::loncommon::fileembstyle($suffix) eq 'ssi') {
     $r->print(      $r->print('<td>'.
       '<td><a target="cat" href="/adm/diff?filename=/~'.                                &Apache::loncommon::modal_link(
       $uname.$fn.                                 '/adm/diff?filename=/priv/'.$udom.'/'.$uname.$fn.
       '&amp;versiontwo=priv&amp;versionone='.$version.        '&amp;versiontwo=priv&amp;versionone='.$version,
       '">'.&mt('Diffs with Version').' '.$version.         &mt('Diffs with Version [_1]',$version),550,450).
       '</a></td>');        '</td>');
  }   }
  $r->print(&Apache::loncommon::end_data_table_row());   $r->print(&Apache::loncommon::end_data_table_row());
     }      }
Line 110  sub phaseone { Line 173  sub phaseone {
  my $rmtime=&Apache::lonnet::metadata($resfn,'lastrevisiondate');   my $rmtime=&Apache::lonnet::metadata($resfn,'lastrevisiondate');
  $r->print(&Apache::loncommon::start_data_table_row().   $r->print(&Apache::loncommon::start_data_table_row().
   '<td><input type="radio" name="version" value="new" /></td>'.    '<td><input type="radio" name="version" value="new" /></td>'.
   '<td><b>'.&mt('Currently published version').'</b></td><td>'.localtime($rmtime).    '<td><b>'.&mt('Currently published version').'</b></td>'.
   '</td>');            '<td>'.&Apache::lonlocal::locallocaltime($rmtime).'</td>'
       );
  if (!$is_meta) {   if (!$is_meta) {
     $r->print('<td><a href="'.$urldir.$main.'.'.$suffix.'.meta" target=cat>'.      $r->print('<td>',
       &mt('Metadata current version').'</a></td>');                                   &Apache::loncommon::modal_link($urldir.$main.'.'.$suffix.'.meta',
         &mt('Metadata current version'),550,450).'</td>');           
  }   }
  if ($is_meta    if ($is_meta 
     || &Apache::loncommon::fileembstyle($suffix) eq 'ssi') {      || &Apache::loncommon::fileembstyle($suffix) eq 'ssi') {
     $r->print(      $r->print('<td>'.
       '<td><a target="cat" href="/adm/diff?filename=/~'.                        &Apache::loncommon::modal_link(
       $uname.$fn.                         '/adm/diff?filename=/priv/'.
       '&amp;versiontwo=priv'.        $udom.'/'.$uname.$fn.
       '">'.&mt('Diffs with current Version').'</a></td>');        '&amp;versiontwo=priv',
         &mt('Diffs with current Version'),550,450).
                         '</td>');
  }   }
  $r->print(&Apache::loncommon::end_data_table_row().   $r->print(&Apache::loncommon::end_data_table_row().
   &Apache::loncommon::end_data_table().    &Apache::loncommon::end_data_table().
   '<p>'.'<span class="LC_warning">'.    '<p>'.'<span class="LC_warning">'.
   &mt('Retrieval of an old version will overwrite the file currently in construction space').'</span></p>');    &mt('Retrieval of an old version will overwrite the file currently in Authoring Space.').'</span></p>');
  if (!$is_meta) {   if (!$is_meta) {
     $r->print('<p>'.'<span class="LC_warning">'.      $r->print('<p>'.'<span class="LC_warning">'.
       &mt('This will only retrieve the resource, if you want to retrieve the metadata you will need to do that separately.').        &mt('This will only retrieve the resource. If you want to retrieve the metadata, you will need to do that separately.').
       '</span></p>');        '</span></p>');
  }   }
  $r->print('<input type="submit" value="'.&mt('Retrieve version').'" /></form>');   $r->print('<input type="submit" value="'.&mt('Retrieve selected Version').'" /></form>');
     } else {      } else {
  $r->print('<h3>'.&mt('No previous versions published.').'</h3>');   $r->print('<p class="LC_warning">'.&mt('No previous versions published.').'</p>');
     }      }
     $r->print('<p><a href="/priv/'.$uname.$fn.'">'.&mt('Back to').' '.$fn.  
       '</a></p>');   
 }  }
   
 # ---------------------------------- Interface for presenting specified version  # ---------------------------------- Interface for presenting specified version
Line 154  sub phasetwo { Line 220  sub phasetwo {
  my ($main,$suffix,$is_meta) = &get_file_info($fn);   my ($main,$suffix,$is_meta) = &get_file_info($fn);
   
         my $logfile;          my $logfile;
         my $ctarget='/home/'.$uname.'/public_html'.$fn;          my $ctarget=$r->dir_config('lonDocRoot')."/priv/$udom/$uname".$fn;
         my $vfn=$fn;          my $vfn=$fn;
         if ($version ne 'new') {          if ($version ne 'new') {
     $vfn=~s/\.(\Q$suffix\E)$/\.$version\.$1/;      $vfn=~s/\.(\Q$suffix\E)$/\.$version\.$1/;
         }          }
   
         my $csource=$r->dir_config('lonDocRoot').'/res/'.$udom.'/'.$uname.$vfn;          my $csource=$r->dir_config('lonDocRoot')."/res/$udom/$uname".$vfn;
   
  my $logname = $ctarget;   my $logname = $ctarget;
  if ($is_meta) { $logname =~ s/\.meta$//; }   if ($is_meta) { $logname =~ s/\.meta$//; }
  $logname = $ctarget.'.log';   $logname = $ctarget.'.log';
         unless ($logfile=Apache::File->new('>>'.$logname)) {          unless ($logfile=Apache::File->new('>>'.$logname)) {
   $r->print(            $r->print('<span class="LC_error">'
          '<font color=red>'.&mt('No write permission to user directory, FAIL').'</font>');                     .&mt('No write permission to user directory, FAIL')
                      .'</span>');
         }          }
         print $logfile           print $logfile 
 "\n\n================= Retrieve ".localtime()." ================\n".  "\n\n================= Retrieve ".localtime()." ================\n".
 "Version: $version\nSource: $csource\nTarget: $ctarget\n";  "Version: $version\nSource: $csource\nTarget: $ctarget\n";
         $r->print('<p>'.&mt('Copying file').': ');          $r->print('<p>'.&mt('Copying file').': ');
  if (copy($csource,$ctarget)) {   if (copy($csource,$ctarget)) {
     $r->print('ok<p>');      $r->print('<span class="LC_success">'
                        .&mt('ok')
                        .'</span>');
             print $logfile "Copied sucessfully.\n\n";              print $logfile "Copied sucessfully.\n\n";
               $r->print(&Apache::lonhtmlcommon::scripttag('parent.location.reload();'));
         } else {          } else {
             my $error=$!;              my $error=$!;
     $r->print('fail, '.$error.'<p>');      $r->print('<span class="LC_error">'
                        .&mt('Copy failed: [_1]',$error)
                        .'</span>');
             print $logfile "Copy failed: $error\n\n";              print $logfile "Copy failed: $error\n\n";
         }          }
         $r->print('<font size=+2><a href="/priv/'.$uname.$fn.  
                   '">'.&mt('Back to').' '.$fn.'</a></font>');   
     } else {      } else {
        $r->print('<span class="LC_warning">'.&mt('Please pick a version to retrieve').'</span><p>');         $r->print('<p class="LC_info">'.&mt('Please pick a version to retrieve:').'</p>');
        &phaseone($r,$fn,$uname,$udom);         &phaseone($r,$fn,$uname,$udom);
     }      }
 }  }
Line 216  sub handler { Line 286  sub handler {
   
   if ($env{'form.filename'}) {    if ($env{'form.filename'}) {
       $fn=$env{'form.filename'};        $fn=$env{'form.filename'};
       $fn=~s/^http\:\/\/[^\/]+//;        $fn =~ s{^https?\://[^/]+}{};
   } else {    } else {
      $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.       $r->log_reason($env{'user.name'}.' at '.$env{'user.domain'}.
          ' unspecified filename for retrieval', $r->filename);            ' unspecified filename for retrieval', $r->filename); 
Line 232  sub handler { Line 302  sub handler {
 # ----------------------------------------------------------- Start page output  # ----------------------------------------------------------- Start page output
   my $uname;    my $uname;
   my $udom;    my $udom;
     my $crsauthor;
   
   ($uname,$udom)=    ($uname,$udom) = &Apache::lonnet::constructaccess($fn);
     &Apache::loncacc::constructaccess($fn,$r->dir_config('lonDefDomain'));    unless (($uname ne '') && ($udom ne '')) {
   unless (($uname) && ($udom)) {  
      $r->log_reason($uname.' at '.$udom.       $r->log_reason($uname.' at '.$udom.
          ' trying to publish file '.$env{'form.filename'}.           ' trying to publish file '.$env{'form.filename'}.
          ' ('.$fn.') - not authorized',            ' ('.$fn.') - not authorized', 
Line 243  sub handler { Line 313  sub handler {
      return HTTP_NOT_ACCEPTABLE;       return HTTP_NOT_ACCEPTABLE;
   }    }
   
   $fn=~s{/~($LONCAPA::username_re)}{};  
   
   &Apache::loncommon::content_type($r,'text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   $r->print(&Apache::loncommon::start_page('Retrieve Published Resources'));      # Breadcrumbs
       my $text = 'Authoring Space';
         my $href = &Apache::loncommon::authorspace($fn);
   $r->print('<h1>'.&mt('Retrieve previous versions of').' <tt>'.$fn.'</tt></h1>');      if ($env{'request.course.id'}) {
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
   if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $r->print('<h3><span class="LC_diff_coauthor">'.&mt('Co-Author').': '.$uname.          if ($href eq "/priv/$cdom/$cnum/") {
     &mt(' at ').$udom.              $text = 'Course Authoring Space';
                '</span></h3>');              $crsauthor = 1;
           }
       }
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => $text, 
           'href'  => $href,
       });
       &Apache::lonhtmlcommon::add_breadcrumb({
           'text'  => 'Retrieve previous version',
           'href'  => '',
       });
   
       my $londocroot = $r->dir_config('lonDocRoot');
       my $trailfile = $fn;
       $trailfile =~ s{^/(priv/)}{$londocroot/$1};
   
     $r->print(&Apache::loncommon::start_page('Retrieve Published Resources')
              .&Apache::lonhtmlcommon::breadcrumbs()
              .&Apache::loncommon::head_subbox(
                   &Apache::loncommon::CSTR_pageheader($trailfile))
       );
   
     $fn=~s{/priv/$LONCAPA::domain_re/$LONCAPA::username_re}{};
   
     $r->print('<p>'
              .&mt('Retrieve previous versions of [_1]'
                      ,'<span class="LC_filename">'.$fn.'</span>')
              .'</p>');
   
     unless ($crsauthor) {
         if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
             $r->print('<p><span class="LC_info">'
                      .&mt('Co-Author [_1]'
                          ,&Apache::loncommon::plainname($uname,$udom)
                          .' ('.$uname.':'.$udom.')')
                      .'</span></p>');
         }
   }    }
   
   
Line 273  sub handler { Line 378  sub handler {
 1;  1;
 __END__  __END__
   
 =head1 NAME  
   
 Apache::lonretrieve - retrieves an old version of a file  
   
 =head1 SYNOPSIS  
   
 Invoked by /etc/httpd/conf/srm.conf:  
   
  <Location /adm/retrieve>  
  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  
  </Location>  
   
 =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  

Removed from v.1.34  
changed lines
  Added in v.1.53


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