--- loncom/lonnet/perl/lonnet.pm	2003/02/13 21:35:50	1.327
+++ loncom/lonnet/perl/lonnet.pm	2003/03/14 15:08:20	1.339
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.327 2003/02/13 21:35:50 albertel Exp $
+# $Id: lonnet.pm,v 1.339 2003/03/14 15:08:20 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -76,7 +76,7 @@ qw(%perlvar %hostname %homecache %badSer
    %libserv %pr %prp %metacache %packagetab %titlecache 
    %courselogs %accesshash $processmarker $dumpcount 
    %coursedombuf %coursehombuf %courseresdatacache 
-   %domaindescription %domain_auth_def %domain_auth_arg_def);
+   %domaindescription %domain_auth_def %domain_auth_arg_def $tmpdir);
 use IO::Socket;
 use GDBM_File;
 use Apache::Constants qw(:common :http);
@@ -729,8 +729,8 @@ sub subscribe {
     $author=~s/\/home\/httpd\/html\/res\/([^\/]*)\/([^\/]*).*/$1\/$2/;
     my ($udom,$uname)=split(/\//,$author);
     my $home=homeserver($uname,$udom);
-    if ($home eq 'no_host') { 
-        return 'not_found'; 
+    if ($home eq 'no_host') {
+        return 'not_found';
     }
     my $answer=reply("sub:$fname",$home);
     if (($answer eq 'con_lost') || ($answer eq 'rejected')) {
@@ -804,6 +804,18 @@ sub repcopy {
     }
 }
 
+# ------------------------------------------------ Get server side include body
+sub ssi_body {
+    my $filelink=shift;
+    my $output=($filelink=~/^http\:/?&externalssi($filelink):
+                                     &ssi($filelink));
+    $output=~s/^.*\<body[^\>]*\>//si;
+    $output=~s/\<\/body\s*\>.*$//si;
+    $output=~
+            s/\/\/ BEGIN LON\-CAPA Internal.+\/\/ END LON\-CAPA Internal\s//gs;
+    return $output;
+}
+
 # --------------------------------------------------------- Server Side Include
 
 sub ssi {
@@ -1755,7 +1767,7 @@ sub dump {
 
 # --------------------------------------------------------------- currentdump
 sub currentdump {
-   my ($sname,$sdom,$courseid)=@_;
+   my ($courseid,$sdom,$sname)=@_;
    $courseid = $ENV{'request.course.id'} if (! defined($courseid));
    $sdom     = $ENV{'user.domain'}       if (! defined($sdom));
    $sname    = $ENV{'user.name'}         if (! defined($sname));
@@ -2157,6 +2169,7 @@ sub is_on_map {
     my $filename=$uriparts[$#uriparts];
     my $pathname=$uri;
     $pathname=~s|/\Q$filename\E$||;
+    $pathname=~s/^adm\/wrapper\///;    
     #Trying to find the conditional for the file
     my $match=($ENV{'acc.res.'.$ENV{'request.course.id'}.'.'.$pathname}=~
 	       /\&\Q$filename\E\:([\d\|]+)\&/);
@@ -2818,7 +2831,6 @@ sub EXT {
     my ($varname,$symbparm,$udom,$uname,)=@_;
 
     unless ($varname) { return ''; }
-
     #get real user name/domain, courseid and symb
     my $courseid;
     if (!($uname && $udom)) {
@@ -2842,8 +2854,12 @@ sub EXT {
     if ($realm eq 'user') {
 # --------------------------------------------------------------- user.resource
 	if ($space eq 'resource') {
-	    my %restored=&restore(undef,undef,$udom,$uname);
-            return $restored{$qualifierrest};
+	    if (defined($Apache::lonhomework::parsing_a_problem)) {
+		return $Apache::lonhomework::history{$qualifierrest};
+	    } else {
+		my %restored=&restore($symbparm,$courseid,$udom,$uname);
+		return $restored{$qualifierrest};
+	    }
 # ----------------------------------------------------------------- user.access
         } elsif ($space eq 'access') {
 	    # FIXME - not supporting calls for a specific user
@@ -2878,9 +2894,8 @@ sub EXT {
             return $uname;
 # ---------------------------------------------------- Any other user namespace
         } else {
-            my $item=($rest)?$qualifier.'.'.$rest:$qualifier;
-            my %reply=&get($space,[$item]);
-            return $reply{$item};
+            my %reply=&get($space,[$qualifierrest],$udom,$uname);
+            return $reply{$qualifierrest};
         }
     } elsif ($realm eq 'query') {
 # ---------------------------------------------- pull stuff out of query string
@@ -2997,16 +3012,13 @@ sub EXT {
 
 # ------------------------------------------------------------------ Cascade up
 	unless ($space eq '0') {
-	    my ($part,$id)=split(/\_/,$space);
-	    if ($id) {
-		my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest,
-				     $symbparm,$udom,$uname);
-		if (defined($partgeneral)) { return $partgeneral; }
-	    } else {
-		my $resourcegeneral=&EXT('resource.0.'.$qualifierrest,
-					 $symbparm,$udom,$uname);
-		if (defined($resourcegeneral)) { return $resourcegeneral; }
-	    }
+	    my @parts=split(/_/,$space);
+	    my $id=pop(@parts);
+	    my $part=join('_',@parts);
+	    if ($part eq '') { $part='0'; }
+	    my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest,
+				 $symbparm,$udom,$uname);
+	    if (defined($partgeneral)) { return $partgeneral; }
 	}
 
 # ---------------------------------------------------- Any other user namespace
@@ -3028,6 +3040,22 @@ sub EXT {
     return '';
 }
 
+sub add_prefix_and_part {
+    my ($prefix,$part)=@_;
+    my $keyroot;
+    if (defined($prefix) && $prefix !~ /^__/) {
+	# prefix that has a part already
+	$keyroot=$prefix;
+    } elsif (defined($prefix)) {
+	# prefix that is missing a part
+	if (defined($part)) { $keyroot='_'.$part.substr($prefix,1); }
+    } else {
+	# no prefix at all
+	if (defined($part)) { $keyroot='_'.$part; }
+    }
+    return $keyroot;
+}
+
 # ---------------------------------------------------------------- Get metadata
 
 sub metadata {
@@ -3056,122 +3084,128 @@ sub metadata {
         }
         my %metathesekeys=();
         unless ($filename=~/\.meta$/) { $filename.='.meta'; }
-	my $metastring=&getfile($perlvar{'lonDocRoot'}.'/res/'.$filename);
+	my $metastring=&getfile(&filelocation('',&clutter($filename)));
         my $parser=HTML::LCParser->new(\$metastring);
         my $token;
         undef %metathesekeys;
         while ($token=$parser->get_token) {
-           if ($token->[0] eq 'S') {
-	     if (defined($token->[2]->{'package'})) {
+	    if ($token->[0] eq 'S') {
+		if (defined($token->[2]->{'package'})) {
 #
 # This is a package - get package info
 #
-	      my $package=$token->[2]->{'package'};
-	      my $keyroot='';
-              if ($prefix) {
-		  $keyroot.=$prefix;
-              } else {
-                if (defined($token->[2]->{'part'})) { 
-                   $keyroot.='_'.$token->[2]->{'part'}; 
-	        }
-	      }
-              if (defined($token->[2]->{'id'})) { 
-                 $keyroot.='_'.$token->[2]->{'id'}; 
-	      }
-              if ($metacache{$uri.':packages'}) {
-                 $metacache{$uri.':packages'}.=','.$package.$keyroot;
-              } else {
-                 $metacache{$uri.':packages'}=$package.$keyroot;
-	      }
-              foreach (keys %packagetab) {
-		  if ($_=~/^$package\&/) {
-		      my ($pack,$name,$subp)=split(/\&/,$_);
-                      my $value=$packagetab{$_};
-		      my $part=$keyroot;
-                      $part=~s/^\_//;
-                      if ($subp eq 'display') {
-			  $value.=' [Part: '.$part.']';
-                      }
-                      my $unikey='parameter'.$keyroot.'_'.$name;
-                      $metathesekeys{$unikey}=1;
-                      $metacache{$uri.':'.$unikey.'.part'}=$part;
-                      unless (defined($metacache{$uri.':'.$unikey.'.'.$subp})) {
-			  $metacache{$uri.':'.$unikey.'.'.$subp}=$value;
-		      }
-		      if (defined($metacache{$uri.':'.$unikey.'.default'})) {
-			  $metacache{$uri.':'.$unikey}=
-			     $metacache{$uri.':'.$unikey.'.default'}
-		      }
-                  }
-              }
-             } else {
+		    my $package=$token->[2]->{'package'};
+		    my $keyroot=&add_prefix_and_part($prefix,$token->[2]->{'part'});
+		    if (defined($token->[2]->{'id'})) { 
+			$keyroot.='_'.$token->[2]->{'id'}; 
+		    }
+		    if ($metacache{$uri.':packages'}) {
+			$metacache{$uri.':packages'}.=','.$package.$keyroot;
+		    } else {
+			$metacache{$uri.':packages'}=$package.$keyroot;
+		    }
+		    foreach (keys %packagetab) {
+			if ($_=~/^$package\&/) {
+			    my ($pack,$name,$subp)=split(/\&/,$_);
+			    my $value=$packagetab{$_};
+			    my $part=$keyroot;
+			    $part=~s/^\_//;
+			    if ($subp eq 'display') {
+				$value.=' [Part: '.$part.']';
+			    }
+			    my $unikey='parameter'.$keyroot.'_'.$name;
+			    $metathesekeys{$unikey}=1;
+			    $metacache{$uri.':'.$unikey.'.part'}=$part;
+			    unless (defined($metacache{$uri.':'.$unikey.'.'.$subp})) {
+				$metacache{$uri.':'.$unikey.'.'.$subp}=$value;
+			    }
+			    if (defined($metacache{$uri.':'.$unikey.'.default'})) {
+				$metacache{$uri.':'.$unikey}=
+				    $metacache{$uri.':'.$unikey.'.default'}
+				}
+			}
+		    }
+		} else {
 #
 # This is not a package - some other kind of start tag
-# 
-              my $entry=$token->[1];
-              my $unikey;
-              if ($entry eq 'import') {
-                 $unikey='';
-              } else {
-                 $unikey=$entry;
-	      }
-              if ($prefix) {
-		  $unikey.=$prefix;
-              } else {
-                if (defined($token->[2]->{'part'})) { 
-                   $unikey.='_'.$token->[2]->{'part'}; 
-	        }
-	      }
-              if (defined($token->[2]->{'id'})) { 
-                 $unikey.='_'.$token->[2]->{'id'}; 
-	      }
+#
+		    my $entry=$token->[1];
+		    my $unikey;
+		    if ($entry eq 'import') {
+			$unikey='';
+		    } else {
+			$unikey=$entry;
+		    }
+		    $unikey.=&add_prefix_and_part($prefix,$token->[2]->{'part'});
 
-             if ($entry eq 'import') {
+		    if (defined($token->[2]->{'id'})) { 
+			$unikey.='_'.$token->[2]->{'id'}; 
+		    }
+
+		    if ($entry eq 'import') {
 #
 # Importing a library here
-#                
-                 if ($depthcount<20) {
-		     my $location=$parser->get_text('/import');
-		     my $dir=$filename;
-		     $dir=~s|[^/]*$||;
-		     $location=&filelocation($dir,$location);
-		     foreach (sort(split(/\,/,&metadata($uri,'keys',
-							$location,$unikey,
-							$depthcount+1)))) {
-                         $metathesekeys{$_}=1;
-		     }
-		 }
-             } else { 
-
-              if (defined($token->[2]->{'name'})) { 
-                 $unikey.='_'.$token->[2]->{'name'}; 
-	      }
-              $metathesekeys{$unikey}=1;
-              foreach (@{$token->[3]}) {
-		  $metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_};
-              }
-	      my $internaltext=&HTML::Entities::decode($parser->get_text('/'.$entry));
-	      my $default=$metacache{$uri.':'.$unikey.'.default'};
-	      if ( $internaltext =~ /^\s*$/ && $default !~ /^\s*$/) {
-		  # only ws inside the tag, and not in default, so use default
-                  # as value
-		  $metacache{$uri.':'.$unikey}=$default;
-	      } else {
+#
+			if ($depthcount<20) {
+			    my $location=$parser->get_text('/import');
+			    my $dir=$filename;
+			    $dir=~s|[^/]*$||;
+			    $location=&filelocation($dir,$location);
+			    foreach (sort(split(/\,/,&metadata($uri,'keys',
+							       $location,$unikey,
+							       $depthcount+1)))) {
+				$metathesekeys{$_}=1;
+			    }
+			}
+		    } else { 
+			
+			if (defined($token->[2]->{'name'})) { 
+			    $unikey.='_'.$token->[2]->{'name'}; 
+			}
+			$metathesekeys{$unikey}=1;
+			foreach (@{$token->[3]}) {
+			    $metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_};
+			}
+			my $internaltext=&HTML::Entities::decode($parser->get_text('/'.$entry));
+			my $default=$metacache{$uri.':'.$unikey.'.default'};
+			if ( $internaltext =~ /^\s*$/ && $default !~ /^\s*$/) {
+		 # only ws inside the tag, and not in default, so use default
+		 # as value
+			    $metacache{$uri.':'.$unikey}=$default;
+			} else {
 		  # either something interesting inside the tag or default
                   # uninteresting
-		  $metacache{$uri.':'.$unikey}=$internaltext;
-	      }
+			    $metacache{$uri.':'.$unikey}=$internaltext;
+			}
 # end of not-a-package not-a-library import
-	   }
+		    }
 # end of not-a-package start tag
-	  }
+		}
 # the next is the end of "start tag"
-	 }
-       }
-       $metacache{$uri.':keys'}=join(',',keys %metathesekeys);
+	    }
+	}
+# are there custom rights to evaluate
+	if ($metacache{$uri.':copyright'} eq 'custom') {
+
+    #
+    # Importing a rights file here
+    #
+	    unless ($depthcount) {
+		my $location=$metacache{$uri.':customdistributionfile'};
+		my $dir=$filename;
+		$dir=~s|[^/]*$||;
+		$location=&filelocation($dir,$location);
+		foreach (sort(split(/\,/,&metadata($uri,'keys',
+						   $location,'_rights',
+						   $depthcount+1)))) {
+		    $metathesekeys{$_}=1;
+		}
+	    }
+	}
+	$metacache{$uri.':keys'}=join(',',keys %metathesekeys);
 	&metadata_generate_part0(\%metathesekeys,\%metacache,$uri);
-       $metacache{$uri.':allpossiblekeys'}=join(',',keys %metathesekeys);
-       $metacache{$uri.':cachedtimestamp'}=time;
+	$metacache{$uri.':allpossiblekeys'}=join(',',keys %metathesekeys);
+	$metacache{$uri.':cachedtimestamp'}=time;
 # this is the end of "was not already recently cached
     }
     return $metacache{$uri.':'.$what};
@@ -3670,6 +3704,12 @@ BEGIN {
     }
 }
 
+# ------------- set up temporary directory
+{
+    $tmpdir = $perlvar{'lonDaemons'}.'/tmp/';
+
+}
+
 %metacache=();
 
 $processmarker='_'.time.'_'.$perlvar{'lonHostID'};