Diff for /loncom/lonenc.pm between versions 1.3 and 1.9

version 1.3, 2004/11/09 21:16:31 version 1.9, 2004/12/20 19:26:53
Line 34  use Apache::lonnet(); Line 34  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use Apache::loncommon;  use Apache::loncommon;
 use Crypt::IDEA;  use Crypt::IDEA;
   use Time::HiRes qw(gettimeofday);
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 44  sub handler { Line 45  sub handler {
  my $handle=$lonid->value;   my $handle=$lonid->value;
         $handle=~s/\W//g;          $handle=~s/\W//g;
         my $lonidsdir=$r->dir_config('lonIDsDir');          my $lonidsdir=$r->dir_config('lonIDsDir');
    $ENV{'request.enc'}=1;
         if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {          if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {
 # Initialize Environment  # Initialize Environment
             &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);              &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
 # Decrypt URL and redirect  # Decrypt URL and redirect
     $r->internal_redirect(&unencrypted($r->uri));      my $redirect=&unencrypted($r->uri);
       if ($r->args) { $redirect.='?'.$r->args; }
       $r->internal_redirect($redirect);
     return OK;      return OK;
  }    } 
     }      }
Line 79  sub unencrypted { Line 83  sub unencrypted {
   pack("H16",substr($uri,$encidx,16))    pack("H16",substr($uri,$encidx,16))
   );    );
     }      }
       $ENV{'request.enc'}=1;
       $decuri=&remove_noise($decuri);
     return substr($decuri,0,$cmdlength);      return substr($decuri,0,$cmdlength);
 }  }
   
   # add a randomish character after every 4th caharacter
   sub add_noise {
       my ($uri)=@_;
       my @noise=split(/(.)/,(&gettimeofday())[1]);
       my $noisy;
       my $i;
       foreach my $chunk (split(/(....)/,$uri)) {
    $noisy.=$chunk;
    $noisy.=$noise[($i++)%(scalar@noise)];
       }
       return $noisy;
   }
   
   # remove every fifth character
   sub remove_noise {
       my ($uri)=@_;
       my $clean;
       foreach my $chunk (split(/(....)./,$uri)) { $clean.=$chunk; }
       return $clean;
   }
   
 sub encrypted {  sub encrypted {
     my $uri=shift;      my $uri=shift;
     if ($ENV{'request.role.adv'}) { return($uri); }      if ($ENV{'request.role.adv'}) { return($uri); }
Line 90  sub encrypted { Line 117  sub encrypted {
  return $uri;   return $uri;
     }      }
     my $cmdlength=length($uri);      my $cmdlength=length($uri);
     $uri.='00000000';      # add noise before enc so that that same url's look different
       $uri=&add_noise($uri);
       my $noiselength=length($uri);
       $uri.=time;
     my $encuri='';      my $encuri='';
     my $cipher=new IDEA $seed;      my $cipher=new IDEA $seed;
     for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) {      for (my $encidx=0;$encidx<=$noiselength;$encidx+=8) {
  $encuri.=unpack("H16",   $encuri.=unpack("H16",
  $cipher->encrypt(substr($uri,$encidx,8)));   $cipher->encrypt(substr($uri,$encidx,8)));
     }      }
     return '/enc/'.$cmdlength.'/'.&Apache::lonnet::escape($encuri);      return '/enc/'.$cmdlength.'/'.&Apache::lonnet::escape($encuri);
 }  }
   
   sub check_encrypt {
       my $str=shift;
       if ($ENV{'request.enc'}) { return &Apache::lonenc::encrypted($str); }
       return $str;
   }
   
   sub check_decrypt {
       my ($str)=@_;
       if (ref($str)) {
    if ($$str=~m|^/enc/|) { $$str=&Apache::lonenc::unencrypted($$str); }
    return;
       }
       if ($str=~m|^/enc/|) { return &Apache::lonenc::unencrypted($str); }
       return $str;
   }
   
 1;  1;
 __END__  __END__
   

Removed from v.1.3  
changed lines
  Added in v.1.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.