Diff for /loncom/lonencurl.pm between versions 1.4 and 1.5

version 1.4, 2007/10/02 01:10:16 version 1.5, 2011/10/01 03:18:57
Line 33  use strict; Line 33  use strict;
 use Apache::Constants qw(:common :remotehost);  use Apache::Constants qw(:common :remotehost);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonenc;  use Apache::lonenc;
   use GDBM_File;
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 44  sub handler { Line 45  sub handler {
 # Initialize Environment  # Initialize Environment
  my $lonidsdir=$r->dir_config('lonIDsDir');   my $lonidsdir=$r->dir_config('lonIDsDir');
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
 # Decrypt URL and redirect  # Decrypt URL, if appropriate, and redirect
  my $redirect=&Apache::lonenc::unencrypted($r->uri);          my $redirect;
           my ($decrypted,$encnum,$remainder) = &checkdecryption($r->uri);
           if (($encnum ne '') && ($remainder ne '')) {
               my $referrer = $r->headers_in->{'Referer'} || '';
               my $host = $r->headers_in->{'Host'};
               my $decryptreferrer;
               if ($referrer =~ m{^https?://\Q$host\E(/enc/\Q$encnum\E/[^?]+)}) {
                   ($decryptreferrer) = &checkdecryption($1);
               }
               if ($decryptreferrer eq '') {
                   if ($env{'request.course.fn'} ne '') {
                       my %symbhash;
                       if (tie(%symbhash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
                           &GDBM_READER(),0640)) {
                           my $lastsymb=$symbhash{'last_known'};
                           untie(%symbhash);
                           (undef,undef,$decryptreferrer)=&Apache::lonnet::decode_symb($lastsymb);
                           $decryptreferrer = &Apache::lonnet::clutter($decryptreferrer);
                       }
                   }
               }
               if ($decryptreferrer ne '') {
                   my ($referrerpath) = ($decryptreferrer =~ m{^(.+/)[^/]+$});
                   if (($env{'httpref.'.$referrerpath.$remainder} eq $decryptreferrer) ||
                       ($env{'httpref.'.$referrerpath.'*'} eq $decryptreferrer) ||
                       ($env{'httpref.'.$referrerpath} eq $decryptreferrer)) {
                      $redirect=$referrerpath.$remainder;
                   }
               }
           }
           if ($redirect eq '') {
               $redirect=&Apache::lonenc::unencrypted($r->uri);
           }
  if ($r->args) { $redirect.='?'.$r->args; }   if ($r->args) { $redirect.='?'.$r->args; }
  $r->internal_redirect($redirect);   $r->internal_redirect($redirect);
  return OK;   return OK;
Line 53  sub handler { Line 86  sub handler {
     return FORBIDDEN;      return FORBIDDEN;
 }  }
   
   sub checkdecryption {
       my ($uri) = @_;
       my ($encnum,$encname,$rest) = ($uri =~ m{^/enc/(\d+)/([^.]+)(.*)$});
       my $enclength = length($encname);
       my $rem = $enclength%16;
       if (($encname =~ /[^a-f0-9]/) || ($rem != 0) || ($enclength < 16)) {
           return ('',$encnum,$encname.$rest);
       } else {
           return (&Apache::lonenc::unencrypted($uri));
       }
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.4  
changed lines
  Added in v.1.5


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