--- loncom/lonenc.pm	2004/12/17 21:44:19	1.8
+++ loncom/lonenc.pm	2006/05/30 19:47:28	1.16
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # URL translation for encrypted filenames
 #
-# $Id: lonenc.pm,v 1.8 2004/12/17 21:44:19 albertel Exp $
+# $Id: lonenc.pm,v 1.16 2006/05/30 19:47:28 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -29,37 +29,13 @@
 package Apache::lonenc;
 
 use strict;
-use Apache::Constants qw(:common :remotehost);
-use Apache::lonnet();
-use Apache::File();
-use Apache::loncommon;
+use Apache::lonnet;
 use Crypt::IDEA;
-
-sub handler {
-    my $r = shift;
-    my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));
-    my $lonid=$cookies{'lonID'};
-    my $cookie;
-    if ($lonid) {
-	my $handle=$lonid->value;
-        $handle=~s/\W//g;
-        my $lonidsdir=$r->dir_config('lonIDsDir');
-	$ENV{'request.enc'}=1;
-        if ((-e "$lonidsdir/$handle.id") && ($handle ne '')) {
-# Initialize Environment
-            &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
-# Decrypt URL and redirect
-	    my $redirect=&unencrypted($r->uri);
-	    if ($r->args) { $redirect.='?'.$r->args; }
-	    $r->internal_redirect($redirect);
-	    return OK;
-	} 
-    }
-    return FORBIDDEN;
-}
-
+use Time::HiRes qw(gettimeofday);
+use LONCAPA;
+ 
 sub encryptseed {
-    my $seed=$ENV{'course.'.$ENV{'request.course.id'}.'.internal.encseed'};
+    my $seed=$env{'course.'.$env{'request.course.id'}.'.internal.encseed'};
     $seed=~s/[^0-9a-f]/0/g;
     $seed.='0123456789abcdef';
     $seed=substr($seed.$seed,0,32);
@@ -74,7 +50,7 @@ sub unencrypted {
     unless ($seed) {
 	return '/'.$uri;
     }
-    $uri=&Apache::lonnet::unescape($uri);
+    $uri=&unescape($uri);
     my $cipher=new IDEA $seed;
     my $decuri='';
     for (my $encidx=0;$encidx<length($uri);$encidx+=16) {
@@ -82,31 +58,56 @@ sub unencrypted {
 				  pack("H16",substr($uri,$encidx,16))
 				  );
     }
-    $ENV{'request.enc'}=1;
+    $env{'request.enc'}=1;
+    $decuri=&remove_noise($decuri);
     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 {
-    my $uri=shift;
-    if ($ENV{'request.role.adv'}) { return($uri); }
+    my ($uri,$force_enc) = @_;
+    if (!$force_enc && $env{'request.role.adv'}) { return($uri); }
     my $seed=&encryptseed();
     unless ($seed) {
 	return $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 $cipher=new IDEA $seed;
-    for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) {
+    for (my $encidx=0;$encidx<=$noiselength;$encidx+=8) {
 	$encuri.=unpack("H16",
 			$cipher->encrypt(substr($uri,$encidx,8)));
     }
-    return '/enc/'.$cmdlength.'/'.&Apache::lonnet::escape($encuri);
+    return '/enc/'.$cmdlength.'/'.&escape($encuri);
 }
 
 sub check_encrypt {
     my $str=shift;
-    if ($ENV{'request.enc'}) { return &Apache::lonenc::encrypted($str); }
+    if ($env{'request.enc'}) { return &Apache::lonenc::encrypted($str); }
     return $str;
 }
 
@@ -120,6 +121,25 @@ sub check_decrypt {
     return $str;
 }
 
+sub encrypt_ref {
+    my ($token,$elements,$force_enc)=@_;
+    my $html;
+    if ($force_enc || $env{'request.enc'}) {
+	while (my ($name,$value)= each(%{ $elements })) {
+	    if (!$value) { next; }
+	    my $href=&Apache::lonnet::hreflocation($Apache::lonxml::pwd[-1],$value);
+	    if ($href !~ /^http:/) {
+		$href = &Apache::lonenc::encrypted($href,$force_enc);
+	    }
+	    $token->[2]->{$name}=$href;
+	}
+	delete($token->[2]->{'encrypturl'});
+	$html = &Apache::edit::rebuild_tag($token);
+    } else {
+	$html = $token->[4];
+    }
+    return $html;
+}
 1;
 __END__