--- loncom/lonnet/perl/lonnet.pm	2002/05/08 17:40:03	1.216
+++ loncom/lonnet/perl/lonnet.pm	2002/05/16 20:25:12	1.221
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # TCP networking package
 #
-# $Id: lonnet.pm,v 1.216 2002/05/08 17:40:03 www Exp $
+# $Id: lonnet.pm,v 1.221 2002/05/16 20:25:12 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -77,7 +77,7 @@ use Apache::File;
 use LWP::UserAgent();
 use HTTP::Headers;
 use vars 
-qw(%perlvar %hostname %homecache %hostip %spareid %hostdom 
+qw(%perlvar %hostname %homecache %badhomecache %hostip %spareid %hostdom 
    %libserv %pr %prp %metacache %packagetab 
    %courselogs %accesshash $processmarker $dumpcount 
    %coursedombuf %coursehombuf %courseresdatacache);
@@ -482,18 +482,24 @@ sub authenticate {
 
 sub homeserver {
     my ($uname,$udom)=@_;
-
     my $index="$uname:$udom";
-    if ($homecache{$index}) { return "$homecache{$index}"; }
-
+    if ($homecache{$index}) { 
+        return "$homecache{$index}"; 
+    }
     my $tryserver;
     foreach $tryserver (keys %libserv) {
+        next if (exists($badhomecache{$index}->{$tryserver}));
 	if ($hostdom{$tryserver} eq $udom) {
            my $answer=reply("home:$udom:$uname",$tryserver);
+           my @tmp =keys(%{$badhomecache{$index}}); 
            if ($answer eq 'found') { 
-	      $homecache{$index}=$tryserver;
+              $homecache{$index}=$tryserver;
               return $tryserver; 
-	   }
+           } else {
+               $badhomecache{$index}->{$tryserver}=1;
+           }
+       } else {
+           $badhomecache{$index}->{$tryserver}=1;
        }
     }    
     return 'no_host';
@@ -2196,8 +2202,19 @@ sub courseresdata {
 # --------------------------------------------------------- Value of a Variable
 
 sub EXT {
-    my ($varname,$symbparm)=@_;
+    my ($varname,$symbparm,$udom,$uname)=@_;
+
     unless ($varname) { return ''; }
+
+    #get real user name/domain, courseid and symb
+    my $courseid;
+    if (!($uname && $udom)) {
+      (my $cursymb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser();
+      if (!$symbparm) {	$symbparm=$cursymb; }
+    } else {
+	$courseid=$ENV{'request.course.id'};
+    }
+
     my ($realm,$space,$qualifier,@therest)=split(/\./,$varname);
     my $rest;
     if ($therest[0]) {
@@ -2212,19 +2229,28 @@ sub EXT {
     if ($realm eq 'user') {
 # --------------------------------------------------------------- user.resource
 	if ($space eq 'resource') {
-	    my %restored=&restore();
+	    my %restored=&restore(undef,undef,$udom,$uname);
             return $restored{$qualifierrest};
 # ----------------------------------------------------------------- user.access
         } elsif ($space eq 'access') {
+	    # FIXME - not supporting calls for a specific user
             return &allowed($qualifier,$rest);
 # ------------------------------------------ user.preferences, user.environment
         } elsif (($space eq 'preferences') || ($space eq 'environment')) {
-            return $ENV{join('.',('environment',$qualifierrest))};
+	    if (($uname eq $ENV{'user.name'}) &&
+		($udom eq $ENV{'user.domain'})) {
+		return $ENV{join('.',('environment',$qualifierrest))};
+	    } else {
+		my %returnhash=&userenvironment($udom,$uname,$qualifierrest);
+		return $returnhash{$qualifierrest};
+	    }
 # ----------------------------------------------------------------- user.course
         } elsif ($space eq 'course') {
+	    # FIXME - not supporting calls for a specific user
             return $ENV{join('.',('request.course',$qualifier))};
 # ------------------------------------------------------------------- user.role
         } elsif ($space eq 'role') {
+	    # FIXME - not supporting calls for a specific user
             my ($role,$where)=split(/\./,$ENV{'request.role'});
             if ($qualifier eq 'value') {
 		return $role;
@@ -2233,10 +2259,10 @@ sub EXT {
             }
 # ----------------------------------------------------------------- user.domain
         } elsif ($space eq 'domain') {
-            return $ENV{'user.domain'};
+            return $udom;
 # ------------------------------------------------------------------- user.name
         } elsif ($space eq 'name') {
-            return $ENV{'user.name'};
+            return $uname;
 # ---------------------------------------------------- Any other user namespace
         } else {
             my $item=($rest)?$qualifier.'.'.$rest:$qualifier;
@@ -2253,112 +2279,112 @@ sub EXT {
         }
     } elsif ($realm eq 'course') {
 # ---------------------------------------------------------- course.description
-        return $ENV{'course.'.$ENV{'request.course.id'}.'.'.
-                              $spacequalifierrest};
+        return $ENV{'course.'.$courseid.'.'.$spacequalifierrest};
     } elsif ($realm eq 'resource') {
-       if ($ENV{'request.course.id'}) {
 
-#	   print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest;
+	if ($courseid eq $ENV{'request.course.id'}) {
 
+	    #print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest;
 
 # ----------------------------------------------------- Cascading lookup scheme
-         my $symbp;
-         if ($symbparm) {
-            $symbp=$symbparm;
-	 } else {
-            $symbp=&symbread();
-         }            
-         my $mapp=(split(/\_\_\_/,$symbp))[0];
-
-         my $symbparm=$symbp.'.'.$spacequalifierrest;
-         my $mapparm=$mapp.'___(all).'.$spacequalifierrest;
-
-         my $seclevel=
-            $ENV{'request.course.id'}.'.['.
-		$ENV{'request.course.sec'}.'].'.$spacequalifierrest;
-         my $seclevelr=
-            $ENV{'request.course.id'}.'.['.
-		$ENV{'request.course.sec'}.'].'.$symbparm;
-         my $seclevelm=
-            $ENV{'request.course.id'}.'.['.
-		$ENV{'request.course.sec'}.'].'.$mapparm;
-
-         my $courselevel=
-            $ENV{'request.course.id'}.'.'.$spacequalifierrest;
-         my $courselevelr=
-            $ENV{'request.course.id'}.'.'.$symbparm;
-         my $courselevelm=
-            $ENV{'request.course.id'}.'.'.$mapparm;
+	    if (!$symbparm) { $symbparm=&symbread(); }
+	    my $symbp=$symbparm;
+	    my $mapp=(split(/\_\_\_/,$symbp))[0];
+
+	    my $symbparm=$symbp.'.'.$spacequalifierrest;
+	    my $mapparm=$mapp.'___(all).'.$spacequalifierrest;
+
+	    my $section;
+	    if (($ENV{'user.name'} eq $uname) &&
+		($ENV{'user.domain'} eq $udom)) {
+		$section={'request.course.sec'};
+	    } else {
+		$section=&usection($udom,$uname,$courseid);
+	    }
 
-# ----------------------------------------------------------- first, check user
-         my %resourcedata=get('resourcedata',
-                           [$courselevelr,$courselevelm,$courselevel]);
-         if (($resourcedata{$courselevelr}!~/^error\:/) &&
-             ($resourcedata{$courselevelr}!~/^con_lost/)) {
-
-         if ($resourcedata{$courselevelr}) { 
-            return $resourcedata{$courselevelr}; }
-         if ($resourcedata{$courselevelm}) { 
-            return $resourcedata{$courselevelm}; }
-         if ($resourcedata{$courselevel}) { return $resourcedata{$courselevel}; }
+	    my $seclevel=$courseid.'.['.$section.'].'.$spacequalifierrest;
+	    my $seclevelr=$courseid.'.['.$section.'].'.$symbparm;
+	    my $seclevelm=$courseid.'.['.$section.'].'.$mapparm;
+
+	    my $courselevel=$courseid.'.'.$spacequalifierrest;
+	    my $courselevelr=$courseid.'.'.$symbparm;
+	    my $courselevelm=$courseid.'.'.$mapparm;
 
-      } else {
-	  if ($resourcedata{$courselevelr}!~/No such file/) {
-	    &logthis("<font color=blue>WARNING:".
-		   " Trying to get resource data for ".$ENV{'user.name'}." at "
-                   .$ENV{'user.domain'}.": ".$resourcedata{$courselevelr}.
-                 "</font>");
-	  }
-      }
+# ----------------------------------------------------------- first, check user
+	    my %resourcedata=&get('resourcedata',
+				  [$courselevelr,$courselevelm,$courselevel],
+				 $udom,$uname);
+	    if (($resourcedata{$courselevelr}!~/^error\:/) &&
+		($resourcedata{$courselevelr}!~/^con_lost/)) {
+
+		if ($resourcedata{$courselevelr}) {
+		    return $resourcedata{$courselevelr}; }
+		if ($resourcedata{$courselevelm}) {
+		    return $resourcedata{$courselevelm}; }
+		if ($resourcedata{$courselevel}) {
+		    return $resourcedata{$courselevel}; }
+	    } else {
+		if ($resourcedata{$courselevelr}!~/No such file/) {
+		    &logthis("<font color=blue>WARNING:".
+			     " Trying to get resource data for ".
+			     $uname." at ".$udom.": ".
+			     $resourcedata{$courselevelr}."</font>");
+		}
+	    }
 
 # -------------------------------------------------------- second, check course
 
-        my $coursereply=&courseresdata(
-                        $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
-                        $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
-                        ($seclevelr,$seclevelm,$seclevel,
-                         $courselevelr,$courselevelm,$courselevel));
-        if ($coursereply) { return $coursereply; }
+	    my $coursereply=&courseresdata($ENV{'course.'.$courseid.'.num'},
+					  $ENV{'course.'.$courseid.'.domain'},
+					  ($seclevelr,$seclevelm,$seclevel,
+					   $courselevelr,$courselevelm,
+					   $courselevel));
+	    if ($coursereply) { return $coursereply; }
 
 # ------------------------------------------------------ third, check map parms
-       my %parmhash=();
-       my $thisparm='';       
-       if (tie(%parmhash,'GDBM_File',
-          $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) {
-           $thisparm=$parmhash{$symbparm};
-	   untie(%parmhash);
-       }
-       if ($thisparm) { return $thisparm; }
-     }
-     
+	    my %parmhash=();
+	    my $thisparm='';
+	    if (tie(%parmhash,'GDBM_File',
+		    $ENV{'request.course.fn'}.'_parms.db',
+		    &GDBM_READER,0640)) {
+		$thisparm=$parmhash{$symbparm};
+		untie(%parmhash);
+	    }
+	    if ($thisparm) { return $thisparm; }
+	}
 # --------------------------------------------- last, look in resource metadata
 
-      $spacequalifierrest=~s/\./\_/;
-      my $metadata=&metadata($ENV{'request.filename'},$spacequalifierrest);
-      if ($metadata) { return $metadata; }
-      $metadata=&metadata($ENV{'request.filename'},
-                                         'parameter_'.$spacequalifierrest);
-      if ($metadata) { return $metadata; }
+	$spacequalifierrest=~s/\./\_/;
+	my $metadata=&metadata($ENV{'request.filename'},$spacequalifierrest);
+	if ($metadata) { return $metadata; }
+	$metadata=&metadata($ENV{'request.filename'},
+			    'parameter_'.$spacequalifierrest);
+	if ($metadata) { return $metadata; }
 
 # ------------------------------------------------------------------ Cascade up
-
-      unless ($space eq '0') {
-          my ($part,$id)=split(/\_/,$space);
-          if ($id) {
-	      my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest,
-                                   $symbparm);
-              if ($partgeneral) { return $partgeneral; }
-          } else {
-              my $resourcegeneral=&EXT('resource.0.'.$qualifierrest,
-                                       $symbparm);
-              if ($resourcegeneral) { return $resourcegeneral; }
-          }
-      }
+	unless ($space eq '0') {
+	    my ($part,$id)=split(/\_/,$space);
+	    if ($id) {
+		my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest,
+				     $symbparm,$udom,$uname);
+		if ($partgeneral) { return $partgeneral; }
+	    } else {
+		my $resourcegeneral=&EXT('resource.0.'.$qualifierrest,
+					 $symbparm,$udom,$uname);
+		if ($resourcegeneral) { return $resourcegeneral; }
+	    }
+	}
 
 # ---------------------------------------------------- Any other user namespace
     } elsif ($realm eq 'environment') {
 # ----------------------------------------------------------------- environment
-        return $ENV{'environment.'.$spacequalifierrest};
+	if (($uname eq $ENV{'user.name'})&&($udom eq $ENV{'user.domain'})) {
+	    return $ENV{'environment.'.$spacequalifierrest};
+	} else {
+	    my %returnhash=&userenvironment($udom,$uname,
+					    $spacequalifierrest);
+	    return $returnhash{$spacequalifierrest};
+	}
     } elsif ($realm eq 'system') {
 # ----------------------------------------------------------------- system.time
 	if ($space eq 'time') {
@@ -2779,13 +2805,37 @@ sub goodbye {
 }
 
 BEGIN {
-# ------------------------------------------------------------ Read access.conf
+# ------------------------------------------- Read access.conf and loncapa.conf
+# (eventually access.conf will become deprecated)
     unless ($readit) {
+
 {
     my $config=Apache::File->new("/etc/httpd/conf/access.conf");
 
     while (my $configline=<$config>) {
-        if ($configline =~ /PerlSetVar/) {
+        if ($configline =~ /^[^\#]*PerlSetVar/) {
+	   my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
+           chomp($varvalue);
+           $perlvar{$varname}=$varvalue;
+        }
+    }
+}
+{
+    my $config=Apache::File->new("/etc/httpd/conf/loncapa.conf");
+
+    while (my $configline=<$config>) {
+        if ($configline =~ /^[^\#]*PerlSetVar/) {
+	   my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
+           chomp($varvalue);
+           $perlvar{$varname}=$varvalue;
+        }
+    }
+}
+{
+    my $config=Apache::File->new("/etc/httpd/conf/loncapa_apache.conf");
+
+    while (my $configline=<$config>) {
+        if ($configline =~ /^[^\#]*PerlSetVar/) {
 	   my ($dummy,$varname,$varvalue)=split(/\s+/,$configline);
            chomp($varvalue);
            $perlvar{$varname}=$varvalue;