--- loncom/lonnet/perl/lonnet.pm	2001/04/16 11:46:22	1.121
+++ loncom/lonnet/perl/lonnet.pm	2001/05/28 16:38:14	1.125
@@ -28,9 +28,18 @@
 # revokecustomrole (udom,uname,url,rdom,rnam,rolename) : Revoke a custom role
 # appenv(hash)       : adds hash to session environment
 # delenv(varname)    : deletes all environment entries starting with varname
-# store(hash)        : stores hash permanently for this url
-# cstore(hash)       : critical store
-# restore            : returns hash for this url
+# store(hashref,symb,courseid,udom,uname)
+#                    : stores hash permanently for this url
+#                      hashref needs to be given, and should be a \%hashname
+#                      the remaining args aren't required and if they aren't
+#                      passed or are '' they will be derived from the ENV
+# cstore(hashref,symb,courseid,udom,uname)
+#                    : same as store but uses the critical interface to 
+#                      guarentee a store
+# restore(symb,courseid,udom,uname)
+#                    : returns hash for this symb, all args are optional
+#                      if they aren't given they will be derived from the 
+#                      current enviroment
 # eget(namesp,array) : returns hash with keys from array filled in from namesp
 # get(namesp,array)  : returns hash with keys from array filled in from namesp
 # del(namesp,array)  : deletes keys out of array from namesp
@@ -93,8 +102,9 @@
 # 3/2 Gerd Kortemeyer
 # 3/15,3/19 Scott Harrison
 # 3/19,3/20 Gerd Kortemeyer
-# 3/22,3/27 Scott Harrison
-
+# 3/22,3/27,4/2,4/16,4/17 Scott Harrison
+# 5/26,5/28 Gerd Kortemeyer
+#
 package Apache::lonnet;
 
 use strict;
@@ -677,57 +687,79 @@ sub devalidate {
 # ----------------------------------------------------------------------- Store
 
 sub store {
-    my %storehash=@_;
-    my $symb;
-    unless ($symb=&symbread()) { return ''; }
+    my ($storehash,$symb,$namespace,$domain,$stuname) = @_;
+    my $home='';
+
+    if ($stuname) {
+	$home=&homeserver($stuname,$domain);
+    }
+
+    if (!$symb) { unless ($symb=&symbread()) { return ''; } }
 
     &devalidate($symb);
 
     $symb=escape($symb);
-    my $namespace;
-    unless ($namespace=$ENV{'request.course.id'}) { return ''; }
+    if (!$namespace) { unless ($namespace=$ENV{'request.course.id'}) { return ''; } }
+    if (!$domain) { $domain=$ENV{'user.domain'}; }
+    if (!$stuname) { $stuname=$ENV{'user.name'}; }
+    if (!$home) { $home=$ENV{'user.home'}; }
     my $namevalue='';
     map {
-        $namevalue.=escape($_).'='.escape($storehash{$_}).'&';
-    } keys %storehash;
+        $namevalue.=escape($_).'='.escape($$storehash{$_}).'&';
+    } keys %$storehash;
     $namevalue=~s/\&$//;
-    return reply(
-     "store:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$symb:$namevalue",
-		 "$ENV{'user.home'}");
+    return reply("store:$domain:$stuname:$namespace:$symb:$namevalue","$home");
 }
 
 # -------------------------------------------------------------- Critical Store
 
 sub cstore {
-    my %storehash=@_;
-    my $symb;
-    unless ($symb=&symbread()) { return ''; }
+    my ($storehash,$symb,$namespace,$domain,$stuname) = @_;
+    my $home='';
+
+    if ($stuname) {
+	$home=&homeserver($stuname,$domain);
+    }
+
+    if (!$symb) { unless ($symb=&symbread()) { return ''; } }
 
     &devalidate($symb);
 
     $symb=escape($symb);
-    my $namespace;
-    unless ($namespace=$ENV{'request.course.id'}) { return ''; }
+    if (!$namespace) { unless ($namespace=$ENV{'request.course.id'}) { return ''; } }
+    if (!$domain) { $domain=$ENV{'user.domain'}; }
+    if (!$stuname) { $stuname=$ENV{'user.name'}; }
+    if (!$home) { $home=$ENV{'user.home'}; }
+
     my $namevalue='';
     map {
-        $namevalue.=escape($_).'='.escape($storehash{$_}).'&';
-    } keys %storehash;
+        $namevalue.=escape($_).'='.escape($$storehash{$_}).'&';
+    } keys %$storehash;
     $namevalue=~s/\&$//;
-    return critical(
-     "store:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$symb:$namevalue",
-		 "$ENV{'user.home'}");
+    return critical("store:$domain:$stuname:$namespace:$symb:$namevalue","$home");
 }
 
 # --------------------------------------------------------------------- Restore
 
 sub restore {
-    my $symb;
-    unless ($symb=escape(&symbread())) { return ''; }
-    my $namespace;
-    unless ($namespace=$ENV{'request.course.id'}) { return ''; }
-    my $answer=reply(
-              "restore:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$symb",
-              "$ENV{'user.home'}");
+    my ($symb,$namespace,$domain,$stuname) = @_;
+    my $home='';
+
+    if ($stuname) {
+	$home=&homeserver($stuname,$domain);
+    }
+
+    if (!$symb) {
+      unless ($symb=escape(&symbread())) { return ''; }
+    } else {
+      $symb=&escape($symb);
+    }
+    if (!$namespace) { unless ($namespace=$ENV{'request.course.id'}) { return ''; } }
+    if (!$domain) { $domain=$ENV{'user.domain'}; }
+    if (!$stuname) { $stuname=$ENV{'user.name'}; }
+    if (!$home) { $home=$ENV{'user.home'}; }
+    my $answer=&reply("restore:$domain:$stuname:$namespace:$symb","$home");
+
     my %returnhash=();
     map {
 	my ($name,$value)=split(/\=/,$_);
@@ -849,8 +881,10 @@ sub rolesinit {
             }
           } 
         } split(/&/,$rolesdump);
+        my $adv=0;
         map {
             %thesepriv=();
+            if ($_ ne 'st') { $adv=1; }
             map {
                 if ($_ ne '') {
 		    my ($privilege,$restrictions)=split(/&/,$_);
@@ -867,6 +901,7 @@ sub rolesinit {
             map { $thesestr.=':'.$_.'&'.$thesepriv{$_}; } keys %thesepriv;
             $userroles.='user.priv.'.$_.'='.$thesestr."\n";
         } keys %allroles;            
+        $userroles.='user.adv='.$adv."\n";
     }
     return $userroles;  
 }
@@ -1246,8 +1281,7 @@ sub metadata_query {
     my ($query,$custom,$customshow)=@_;
     # need to put in a library server loop here and return a hash
     my %rhash;
-#    for my $server (keys %libserv) {
-    for my $server ('msul3') {
+    for my $server (keys %libserv) {
 	unless ($custom or $customshow) {
 	    my $reply=&reply("querysend:".&escape($query),$server);
 	    $rhash{$server}=$reply;
@@ -1635,7 +1669,7 @@ sub EXT {
     if ($realm eq 'user') {
 # --------------------------------------------------------------- user.resource
 	if ($space eq 'resource') {
-	    my %restored=&restore;
+	    my %restored=&restore();
             return $restored{$qualifierrest};
 # ----------------------------------------------------------------- user.access
         } elsif ($space eq 'access') {