--- loncom/lonenc.pm	2005/04/07 06:56:20	1.11
+++ loncom/lonenc.pm	2006/12/08 22:04:57	1.18
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # URL translation for encrypted filenames
 #
-# $Id: lonenc.pm,v 1.11 2005/04/07 06:56:20 albertel Exp $
+# $Id: lonenc.pm,v 1.18 2006/12/08 22:04:57 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -29,36 +29,11 @@
 package Apache::lonenc;
 
 use strict;
-use Apache::Constants qw(:common :remotehost);
 use Apache::lonnet;
-use Apache::File();
-use Apache::loncommon;
 use Crypt::IDEA;
 use Time::HiRes qw(gettimeofday);
-
-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 LONCAPA;
+ 
 sub encryptseed {
     my $seed=$env{'course.'.$env{'request.course.id'}.'.internal.encseed'};
     $seed=~s/[^0-9a-f]/0/g;
@@ -71,11 +46,13 @@ sub unencrypted {
     my $uri=shift;
     $uri=~s/^\/enc\/(\d+)\///;
     my $cmdlength=$1;
+    # strip any added extension
+    $uri=~s/\.[^.]*//;
     my $seed=&encryptseed();
     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) {
@@ -110,8 +87,8 @@ sub remove_noise {
 }
 
 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;
@@ -127,12 +104,17 @@ sub encrypted {
 	$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 (ref($str)) {
+        if ($env{'request.enc'}) { $$str = &Apache::lonenc::encrypted($$str); }
+        return;
+    } else {
+        if ($env{'request.enc'}) { return &Apache::lonenc::encrypted($str); }
+    }
     return $str;
 }
 
@@ -147,15 +129,21 @@ sub check_decrypt {
 }
 
 sub encrypt_ref {
-    my ($token,$elements)=@_;
+    my ($token,$elements,$force_enc)=@_;
     my $html;
-    if ($env{'request.enc'}) {
+    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); }
+	    if ($href !~ /^http:/) {
+		# IE really wants an extension
+		my ($extension) = ($href =~ m/(\.[^.]*)$/);
+		$href = &Apache::lonenc::encrypted($href,$force_enc);
+		$href .= $extension;
+	    }
 	    $token->[2]->{$name}=$href;
 	}
+	delete($token->[2]->{'encrypturl'});
 	$html = &Apache::edit::rebuild_tag($token);
     } else {
 	$html = $token->[4];