version 1.9, 2000/01/14 21:12:40
|
version 1.12, 2000/05/01 20:19:38
|
Line 1
|
Line 1
|
# The LearningOnline Network |
# The LearningOnline Network |
# TCP networking package |
# 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, |
# 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, |
# 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, |
# 11/8,11/16,11/18,11/22,11/23,12/22, |
# 01/06,01/13 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; |
package Apache::lonnet; |
|
|
use strict; |
use strict; |
use Apache::File; |
use Apache::File; |
use LWP::UserAgent(); |
use LWP::UserAgent(); |
use vars qw(%perlvar %hostname %homecache %spareid %hostdom %libserv $readit); |
use vars |
|
qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp $readit); |
use IO::Socket; |
use IO::Socket; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
|
|
Line 55 sub reply {
|
Line 70 sub reply {
|
my ($cmd,$server)=@_; |
my ($cmd,$server)=@_; |
my $answer=subreply($cmd,$server); |
my $answer=subreply($cmd,$server); |
if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); } |
if ($answer eq 'con_lost') { $answer=subreply($cmd,$server); } |
|
if (($answer=~/^error:/) || ($answer=~/^refused/) || |
|
($answer=~/^rejected/)) { |
|
&logthis("<font color=blue>WARNING:". |
|
" $cmd to $server returned $answer</font>"); |
|
} |
return $answer; |
return $answer; |
} |
} |
|
|
Line 75 sub reconlonc {
|
Line 95 sub reconlonc {
|
&logthis("$peerfile still not there, give it another try"); |
&logthis("$peerfile still not there, give it another try"); |
sleep 5; |
sleep 5; |
if (-e "$peerfile") { return; } |
if (-e "$peerfile") { return; } |
&logthis("$peerfile still not there, giving up"); |
&logthis( |
|
"<font color=blue>WARNING: $peerfile still not there, giving up</font>"); |
} else { |
} else { |
&logthis("lonc at pid $loncpid not responding, giving up"); |
&logthis( |
|
"<font color=blue>WARNING:". |
|
" lonc at pid $loncpid not responding, giving up</font>"); |
} |
} |
} else { |
} else { |
&logthis('lonc not running, giving up'); |
&logthis('<font color=blue>WARNING: lonc not running, giving up</font>'); |
} |
} |
} |
} |
|
|
# ------------------------------------------------------ Critical communication |
# ------------------------------------------------------ Critical communication |
|
|
sub critical { |
sub critical { |
my ($cmd,$server)=@_; |
my ($cmd,$server)=@_; |
my $answer=reply($cmd,$server); |
my $answer=reply($cmd,$server); |
Line 117 sub critical {
|
Line 141 sub critical {
|
} |
} |
chomp($wcmd); |
chomp($wcmd); |
if ($wcmd eq $cmd) { |
if ($wcmd eq $cmd) { |
&logthis("Connection buffer $dfilename: $cmd"); |
&logthis("<font color=blue>WARNING: ". |
|
"Connection buffer $dfilename: $cmd</font>"); |
&logperm("D:$server:$cmd"); |
&logperm("D:$server:$cmd"); |
return 'con_delayed'; |
return 'con_delayed'; |
} else { |
} else { |
&logthis("CRITICAL CONNECTION FAILED: $server $cmd"); |
&logthis("<font color=red>CRITICAL:" |
|
." Critical connection failed: $server $cmd</font>"); |
&logperm("F:$server:$cmd"); |
&logperm("F:$server:$cmd"); |
return 'con_failed'; |
return 'con_failed'; |
} |
} |
Line 163 sub appenv {
|
Line 189 sub appenv {
|
} |
} |
|
|
# ------------------------------ Find server with least workload from spare.tab |
# ------------------------------ Find server with least workload from spare.tab |
|
|
sub spareserver { |
sub spareserver { |
my $tryserver; |
my $tryserver; |
my $spareserver=''; |
my $spareserver=''; |
Line 178 sub spareserver {
|
Line 205 sub spareserver {
|
} |
} |
|
|
# --------- Try to authenticate user from domain's lib servers (first this one) |
# --------- Try to authenticate user from domain's lib servers (first this one) |
|
|
sub authenticate { |
sub authenticate { |
my ($uname,$upass,$udom)=@_; |
my ($uname,$upass,$udom)=@_; |
|
$upass=escape($upass); |
if (($perlvar{'lonRole'} eq 'library') && |
if (($perlvar{'lonRole'} eq 'library') && |
($udom eq $perlvar{'lonDefDomain'})) { |
($udom eq $perlvar{'lonDefDomain'})) { |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'}); |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$perlvar{'lonHostID'}); |
Line 199 sub authenticate {
|
Line 227 sub authenticate {
|
my $tryserver; |
my $tryserver; |
foreach $tryserver (keys %libserv) { |
foreach $tryserver (keys %libserv) { |
if ($hostdom{$tryserver} eq $udom) { |
if ($hostdom{$tryserver} eq $udom) { |
my $answer=reply("enc:auth:$udom:$uname:$upass",$tryserver); |
my $answer=reply("encrypt:auth:$udom:$uname:$upass",$tryserver); |
if ($answer =~ /authorized/) { |
if ($answer =~ /authorized/) { |
if ($answer eq 'authorized') { |
if ($answer eq 'authorized') { |
&logthis("User $uname at $udom authorized by $tryserver"); |
&logthis("User $uname at $udom authorized by $tryserver"); |
Line 217 sub authenticate {
|
Line 245 sub authenticate {
|
} |
} |
|
|
# ---------------------- Find the homebase for a user from domain's lib servers |
# ---------------------- Find the homebase for a user from domain's lib servers |
|
|
sub homeserver { |
sub homeserver { |
my ($uname,$udom)=@_; |
my ($uname,$udom)=@_; |
|
|
Line 237 sub homeserver {
|
Line 266 sub homeserver {
|
} |
} |
|
|
# ----------------------------- Subscribe to a resource, return URL if possible |
# ----------------------------- Subscribe to a resource, return URL if possible |
|
|
sub subscribe { |
sub subscribe { |
my $fname=shift; |
my $fname=shift; |
my $author=$fname; |
my $author=$fname; |
Line 285 sub repcopy {
|
Line 315 sub repcopy {
|
if ($response->is_error()) { |
if ($response->is_error()) { |
unlink($transname); |
unlink($transname); |
my $message=$response->status_line; |
my $message=$response->status_line; |
&logthis("LWP GET: $message: $filename"); |
&logthis("<font color=blue>WARNING:" |
|
." LWP get: $message: $filename</font>"); |
return HTTP_SERVICE_UNAVAILABLE; |
return HTTP_SERVICE_UNAVAILABLE; |
} else { |
} else { |
rename($transname,$filename); |
rename($transname,$filename); |
Line 298 sub repcopy {
|
Line 329 sub repcopy {
|
|
|
sub store { |
sub store { |
my %storehash=shift; |
my %storehash=shift; |
my $command="store:$ENV{'user.domain'}:$ENV{'user.name'}:" |
my $command=; |
."$ENV{'user.class'}:$ENV{'request.filename'}:"; |
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 |
# --------------------------------------------------------------------- Restore |
|
|
sub restore { |
sub restore { |
my $command="restore:$ENV{'user.domain'}:$ENV{'user.name'}:" |
my $answer=reply("restore:$ENV{'user.domain'}:$ENV{'user.name'}:" |
."$ENV{'user.class'}:$ENV{'request.filename'}:"; |
."$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 |
|
|
|
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; |
|
|
|
if ($rolesdump ne '') { |
|
map { |
|
if ($_!~/rolesdef\&/) { |
|
my ($area,$role)=split(/=/,$_); |
|
my ($trole,$tend,$tstart)=split(/_/,$role); |
|
if ($tend!=0) { |
|
if ($tend<$now) { |
|
$trole=''; |
|
} |
|
} |
|
if ($tstart!=0) { |
|
if ($tstart>$now) { |
|
$trole=''; |
|
} |
|
} |
|
if (($area ne '') && ($trole ne '')) { |
|
$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=(); |
|
map { |
|
if ($_ ne '') { |
|
my ($priviledge,$restrictions)=split(/&/,$_); |
|
if ($restrictions eq '') { |
|
$thesepriv{$priviledge}='F'; |
|
} else { |
|
if ($thesepriv{$priviledge} ne 'F') { |
|
$thesepriv{$priviledge}.=$restrictions; |
|
} |
|
} |
|
} |
|
} split(/:/,$allroles{$_}); |
|
$thesestr=''; |
|
map { $thesestr.=':'.$_.'&'.$thesepriv{$_}; } keys %thesepriv; |
|
$userroles.='user.priv.'.$_.'='.$thesestr."\n"; |
|
} keys %allroles; |
|
} |
|
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 |
# ================================================================ Main Program |
Line 349 if ($readit ne 'done') {
|
Line 591 if ($readit ne 'done') {
|
} |
} |
} |
} |
} |
} |
|
# ------------------------------------------------------------ Read permissions |
|
{ |
|
my $config=Apache::File->new("$perlvar{'lonTabDir'}/roles.tab"); |
|
|
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($role,$perm)=split(/ /,$configline); |
|
if ($perm ne '') { $pr{$role}=$perm; } |
|
} |
|
} |
|
|
|
# -------------------------------------------- Read plain texts for permissions |
|
{ |
|
my $config=Apache::File->new("$perlvar{'lonTabDir'}/rolesplain.tab"); |
|
|
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($short,$plain)=split(/:/,$configline); |
|
if ($plain ne '') { $prp{$short}=$plain; } |
|
} |
|
} |
|
|
$readit='done'; |
$readit='done'; |
&logthis('Read configuration'); |
&logthis('<font color=yellow>INFO: Read configuration</font>'); |
} |
} |
} |
} |
1; |
1; |
|
|
|
|
|
|
|
|