--- loncom/lonnet/perl/lonnet.pm 2000/02/29 16:24:00 1.11
+++ loncom/lonnet/perl/lonnet.pm 2000/05/01 20:19:38 1.12
@@ -1,9 +1,23 @@
# The LearningOnline Network
# TCP networking package
+#
+# Functions for use by content handlers:
+#
+# plaintext(short) : plain text explanation of short term
+# allowed(short,url) : returns codes for allowed actions
+# appendenv(hash) : adds hash to session environment
+# store(hash) : stores hash permanently for this url
+# restore : returns hash for this url
+# 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
+# put(namesp,hash) : stores hash in namesp
+#
# 6/1/99,6/2,6/10,6/11,6/12,6/14,6/26,6/28,6/29,6/30,
# 7/1,7/2,7/9,7/10,7/12,7/14,7/15,7/19,
# 11/8,11/16,11/18,11/22,11/23,12/22,
-# 01/06,01/13,02/24,02/28,02/29 Gerd Kortemeyer
+# 01/06,01/13,02/24,02/28,02/29,
+# 03/01,03/02,03/06,03/07,03/13,
+# 04/05 Gerd Kortemeyer
package Apache::lonnet;
@@ -56,6 +70,11 @@ sub reply {
my ($cmd,$server)=@_;
my $answer=subreply($cmd,$server);
if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); }
+ if (($answer=~/^error:/) || ($answer=~/^refused/) ||
+ ($answer=~/^rejected/)) {
+ &logthis("WARNING:".
+ " $cmd to $server returned $answer");
+ }
return $answer;
}
@@ -76,16 +95,20 @@ sub reconlonc {
&logthis("$peerfile still not there, give it another try");
sleep 5;
if (-e "$peerfile") { return; }
- &logthis("$peerfile still not there, giving up");
+ &logthis(
+ "WARNING: $peerfile still not there, giving up");
} else {
- &logthis("lonc at pid $loncpid not responding, giving up");
+ &logthis(
+ "WARNING:".
+ " lonc at pid $loncpid not responding, giving up");
}
} else {
- &logthis('lonc not running, giving up');
+ &logthis('WARNING: lonc not running, giving up');
}
}
# ------------------------------------------------------ Critical communication
+
sub critical {
my ($cmd,$server)=@_;
my $answer=reply($cmd,$server);
@@ -118,11 +141,13 @@ sub critical {
}
chomp($wcmd);
if ($wcmd eq $cmd) {
- &logthis("Connection buffer $dfilename: $cmd");
+ &logthis("WARNING: ".
+ "Connection buffer $dfilename: $cmd");
&logperm("D:$server:$cmd");
return 'con_delayed';
} else {
- &logthis("CRITICAL CONNECTION FAILED: $server $cmd");
+ &logthis("CRITICAL:"
+ ." Critical connection failed: $server $cmd");
&logperm("F:$server:$cmd");
return 'con_failed';
}
@@ -183,7 +208,7 @@ sub spareserver {
sub authenticate {
my ($uname,$upass,$udom)=@_;
-
+ $upass=escape($upass);
if (($perlvar{'lonRole'} eq 'library') &&
($udom eq $perlvar{'lonDefDomain'})) {
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'});
@@ -290,7 +315,8 @@ sub repcopy {
if ($response->is_error()) {
unlink($transname);
my $message=$response->status_line;
- &logthis("LWP GET: $message: $filename");
+ &logthis("WARNING:"
+ ." LWP get: $message: $filename");
return HTTP_SERVICE_UNAVAILABLE;
} else {
rename($transname,$filename);
@@ -303,15 +329,29 @@ sub repcopy {
sub store {
my %storehash=shift;
- my $command="store:$ENV{'user.domain'}:$ENV{'user.name'}:"
- ."$ENV{'user.class'}:$ENV{'request.filename'}:";
+ my $command=;
+ my $namevalue='';
+ map {
+ $namevalue.=escape($_).'='.escape($storehash{$_}).'&';
+ } keys %storehash;
+ $namevalue=~s/\&$//;
+ return reply("store:$ENV{'user.domain'}:$ENV{'user.name'}:"
+ ."$ENV{'user.class'}:$ENV{'request.filename'}:$namevalue",
+ "$ENV{'user.home'}");
}
# --------------------------------------------------------------------- Restore
sub restore {
- my $command="restore:$ENV{'user.domain'}:$ENV{'user.name'}:"
- ."$ENV{'user.class'}:$ENV{'request.filename'}:";
+ my $answer=reply("restore:$ENV{'user.domain'}:$ENV{'user.name'}:"
+ ."$ENV{'user.class'}:$ENV{'request.filename'}",
+ "$ENV{'user.home'}");
+ my %returnhash=();
+ map {
+ my ($name,$value)=split(/\=/,$_);
+ $returnhash{&unescape($name)}=&unescape($value);
+ } split(/\&/,$answer);
+ return $returnhash;
}
# -------------------------------------------------------- Get user priviledges
@@ -319,16 +359,16 @@ sub restore {
sub rolesinit {
my ($domain,$username,$authhost)=@_;
my $rolesdump=reply("dump:$domain:$username:roles",$authhost);
+ if (($rolesdump eq 'con_lost') || ($rolesdump eq '')) { return ''; }
my %allroles=();
my %thesepriv=();
my $userroles='';
my $now=time;
my $thesestr;
- &logthis("$domain, $username, $authhost, $rolesdump");
-
if ($rolesdump ne '') {
map {
+ if ($_!~/rolesdef\&/) {
my ($area,$role)=split(/=/,$_);
my ($trole,$tend,$tstart)=split(/_/,$role);
if ($tend!=0) {
@@ -342,16 +382,39 @@ sub rolesinit {
}
}
if (($area ne '') && ($trole ne '')) {
- $userroles.='user.role.'.$trole.'='.$area."\n";
- my ($tdummy,$tdomain,$trest)=split(/\//,$area);
- $allroles{'/'}.=':'.$pr{$trole.':s'};
- if ($tdomain ne '') {
- $allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'};
- if ($trest ne '') {
- $allroles{$area}.=':'.$pr{$trole.':c'};
+ $userroles.='user.role.'.$trole.'.'.$area.'='.
+ $tstart.'.'.$tend."\n";
+ my ($tdummy,$tdomain,$trest)=split(/\//,$area);
+ if ($trole =~ /^cr\//) {
+ my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$trole);
+ my $homsvr=homeserver($rauthor,$rdomain);
+ if ($hostname{$homsvr} ne '') {
+ my $roledef=
+ reply("get:$rdomain:$rauthor:roles:rolesdef&$rrole",
+ $homsvr);
+ if (($roledef ne 'con_lost') && ($roledef ne '')) {
+ my ($syspriv,$dompriv,$coursepriv)=
+ split(/&&/,$roledef);
+ $allroles{'/'}.=':'.$syspriv;
+ if ($tdomain ne '') {
+ $allroles{'/'.$tdomain.'/'}.=':'.$dompriv;
+ if ($trest ne '') {
+ $allroles{$area}.=':'.$coursepriv;
+ }
+ }
+ }
}
+ } else {
+ $allroles{'/'}.=':'.$pr{$trole.':s'};
+ if ($tdomain ne '') {
+ $allroles{'/'.$tdomain.'/'}.=':'.$pr{$trole.':d'};
+ if ($trest ne '') {
+ $allroles{$area}.=':'.$pr{$trole.':c'};
+ }
+ }
}
- }
+ }
+ }
} split(/&/,$rolesdump);
map {
%thesepriv=();
@@ -375,6 +438,118 @@ sub rolesinit {
return $userroles;
}
+# --------------------------------------------------------------- get interface
+
+sub get {
+ my ($namespace,@storearr)=@_;
+ my $items='';
+ map {
+ $items.=escape($_).'&';
+ } @storearr;
+ $items=~s/\&$//;
+ my $rep=reply("get:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
+ $ENV{'user.home'});
+ my @pairs=split(/\&/,$rep);
+ my %returnhash=();
+ map {
+ my ($key,$value)=split(/=/,$_);
+ $returnhash{unespace($key)}=unescape($value);
+ } @pairs;
+ return %returnhash;
+}
+
+# --------------------------------------------------------------- put interface
+
+sub put {
+ my ($namespace,%storehash)=@_;
+ my $items='';
+ map {
+ $items.=escape($_).'='.escape($storehash{$_}).'&';
+ } keys %storehash;
+ $items=~s/\&$//;
+ return reply("put:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
+ $ENV{'user.home'});
+}
+
+# -------------------------------------------------------------- eget interface
+
+sub eget {
+ my ($namespace,@storearr)=@_;
+ my $items='';
+ map {
+ $items.=escape($_).'&';
+ } @storearr;
+ $items=~s/\&$//;
+ my $rep=reply("eget:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items",
+ $ENV{'user.home'});
+ my @pairs=split(/\&/,$rep);
+ my %returnhash=();
+ map {
+ my ($key,$value)=split(/=/,$_);
+ $returnhash{unespace($key)}=unescape($value);
+ } @pairs;
+ return %returnhash;
+}
+
+# ------------------------------------------------- Check for a user priviledge
+
+sub allowed {
+ my ($priv,$uri)=@_;
+ $uri=~s/^\/res//;
+ $uri=~s/^\///;
+ my $thisallowed='';
+ if ($ENV{'user.priv./'}=~/$priv\&([^\:]*)/) {
+ $thisallowed.=$1;
+ }
+ if ($ENV{'user.priv./'.(split(/\//,$uri))[0].'/'}=~/$priv\&([^\:]*)/) {
+ $thisallowed.=$1;
+ }
+ if ($ENV{'user.priv./'.$uri}=~/$priv\&([^\:]*)/) {
+ $thisallowed.=$1;
+ }
+ return $thisallowed;
+}
+
+# ----------------------------------------------------------------- Define Role
+
+sub definerole {
+ if (allowed('mcr','/')) {
+ my ($rolename,$sysrole,$domrole,$courole)=@_;
+ my $command="encrypt:rolesput:$ENV{'user.domain'}:$ENV{'user.name'}:".
+ "$ENV{'user.domain'}:$ENV{'user.name'}:".
+ "rolesdef&$rolename=$sysrole&&$domrole&&$courole";
+ return reply($command,$ENV{'user.home'});
+ } else {
+ return 'refused';
+ }
+}
+
+# ------------------------------------------------------------------ Plain Text
+
+sub plaintext {
+ return $prp{$_};
+}
+
+# ----------------------------------------------------------------- Assign Role
+
+sub assignrole {
+}
+
+# -------------------------------------------------------- Escape Special Chars
+
+sub escape {
+ my $str=shift;
+ $str =~ s/(\W)/"%".unpack('H2',$1)/eg;
+ return $str;
+}
+
+# ----------------------------------------------------- Un-Escape Special Chars
+
+sub unescape {
+ my $str=shift;
+ $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+ return $str;
+}
# ================================================================ Main Program
@@ -439,7 +614,7 @@ if ($readit ne 'done') {
}
$readit='done';
-&logthis('Read configuration');
+&logthis('INFO: Read configuration');
}
}
1;