version 1.20, 2000/07/21 00:40:37
|
version 1.30, 2000/09/06 14:25:17
|
Line 4
|
Line 4
|
# Functions for use by content handlers: |
# Functions for use by content handlers: |
# |
# |
# plaintext(short) : plain text explanation of short term |
# plaintext(short) : plain text explanation of short term |
# allowed(short,url) : returns codes for allowed actions |
# fileembstyle(ext) : embed style in page for file extension |
# appendenv(hash) : adds hash to session environment |
# filedescription(ext) : descriptor text for file extension |
|
# allowed(short,url) : returns codes for allowed actions |
|
# F: full access |
|
# U,I,K: authentication modes (cxx only) |
|
# '': forbidden |
|
# 1: user needs to choose course |
|
# 2: browse allowed |
|
# definerole(rolename,sys,dom,cou) : define a custom role rolename |
|
# set priviledges in format of lonTabs/roles.tab for |
|
# system, domain and course level, |
|
# assignrole(udom,uname,url,role,end,start) : give a role to a user for the |
|
# level given by url. Optional start and end dates |
|
# (leave empty string or zero for "no date") |
|
# assigncustomrole (udom,uname,url,rdom,rnam,rolename,end,start) : give a |
|
# custom role to a user for the level given by url. |
|
# Specify name and domain of role author, and role name |
|
# revokerole (udom,uname,url,role) : Revoke a role for url |
|
# revokecustomrole (udom,uname,url,rdom,rnam,rolename) : Revoke a custom role |
|
# appenv(hash) : adds hash to session environment |
# store(hash) : stores hash permanently for this url |
# store(hash) : stores hash permanently for this url |
# restore : returns hash for this url |
# restore : returns hash for this url |
# eget(namesp,array) : returns hash with keys from array filled in from namesp |
# 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 |
# get(namesp,array) : returns hash with keys from array filled in from namesp |
|
# del(namesp,array) : deletes keys out of arry from namesp |
# put(namesp,hash) : stores hash in namesp |
# put(namesp,hash) : stores hash in namesp |
# dump(namesp) : dumps the complete namespace into a hash |
# dump(namesp) : dumps the complete namespace into a hash |
# ssi(url) : does a complete request cycle on url to localhost |
# ssi(url,hash) : does a complete request cycle on url to localhost, posts |
|
# hash |
# repcopy(filename) : replicate file |
# repcopy(filename) : replicate file |
# dirlist(url) : gets a directory listing |
# dirlist(url) : gets a directory listing |
|
# condval(index) : value of condition index based on state |
|
# varval(name) : value of a variable |
|
# refreshstate() : refresh the state information string |
# |
# |
# 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, |
Line 24
|
Line 47
|
# 04/05,05/29,05/31,06/01, |
# 04/05,05/29,05/31,06/01, |
# 06/05,06/26 Gerd Kortemeyer |
# 06/05,06/26 Gerd Kortemeyer |
# 06/26 Ben Tyszka |
# 06/26 Ben Tyszka |
# 06/30,07/15,07/17,07/18 Gerd Kortemeyer |
# 06/30,07/15,07/17,07/18,07/20,07/21,07/22,07/25 Gerd Kortemeyer |
|
# 08/14 Ben Tyszka |
|
# 08/22,08/28,08/31,09/01,09/02,09/04,09/05 Gerd Kortemeyer |
|
|
package Apache::lonnet; |
package Apache::lonnet; |
|
|
Line 33 use Apache::File;
|
Line 58 use Apache::File;
|
use LWP::UserAgent(); |
use LWP::UserAgent(); |
use HTTP::Headers; |
use HTTP::Headers; |
use vars |
use vars |
qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp $readit); |
qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp %fe %fd $readit); |
use IO::Socket; |
use IO::Socket; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
|
|
Line 180 sub appenv {
|
Line 205 sub appenv {
|
chomp($oldenv[$i]); |
chomp($oldenv[$i]); |
if ($oldenv[$i] ne '') { |
if ($oldenv[$i] ne '') { |
my ($name,$value)=split(/=/,$oldenv[$i]); |
my ($name,$value)=split(/=/,$oldenv[$i]); |
$newenv{$name}=$value; |
unless (defined($newenv{$name})) { |
|
$newenv{$name}=$value; |
|
} |
} |
} |
} |
} |
{ |
{ |
Line 292 sub subscribe {
|
Line 319 sub subscribe {
|
|
|
sub repcopy { |
sub repcopy { |
my $filename=shift; |
my $filename=shift; |
|
$filename=~s/\/+/\//g; |
my $transname="$filename.in.transfer"; |
my $transname="$filename.in.transfer"; |
if ((-e $filename) || (-e $transname)) { return OK; } |
if ((-e $filename) || (-e $transname)) { return OK; } |
my $remoteurl=subscribe($filename); |
my $remoteurl=subscribe($filename); |
Line 349 sub repcopy {
|
Line 377 sub repcopy {
|
|
|
sub ssi { |
sub ssi { |
|
|
my $fn=shift; |
my ($fn,%form)=@_; |
|
|
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
my $request=new HTTP::Request('GET',"http://".$ENV{'HTTP_HOST'}.$fn); |
|
|
my $request; |
|
|
|
if (%form) { |
|
$request=new HTTP::Request('POST',"http://".$ENV{'HTTP_HOST'}.$fn); |
|
$request->content(join '&', map { "$_=$form{$_}" } keys %form); |
|
} else { |
|
$request=new HTTP::Request('GET',"http://".$ENV{'HTTP_HOST'}.$fn); |
|
} |
|
|
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
my $response=$ua->request($request); |
my $response=$ua->request($request); |
|
|
Line 402 sub rolesinit {
|
Line 439 sub rolesinit {
|
if (($rolesdump eq 'con_lost') || ($rolesdump eq '')) { return ''; } |
if (($rolesdump eq 'con_lost') || ($rolesdump eq '')) { return ''; } |
my %allroles=(); |
my %allroles=(); |
my %thesepriv=(); |
my %thesepriv=(); |
my $userroles=''; |
|
my $now=time; |
my $now=time; |
|
my $userroles="user.login.time=$now\n"; |
my $thesestr; |
my $thesestr; |
|
|
if ($rolesdump ne '') { |
if ($rolesdump ne '') { |
map { |
map { |
if ($_!~/rolesdef\&/) { |
if ($_!~/^rolesdef\&/) { |
my ($area,$role)=split(/=/,$_); |
my ($area,$role)=split(/=/,$_); |
|
$area=~s/\_\w\w$//; |
my ($trole,$tend,$tstart)=split(/_/,$role); |
my ($trole,$tend,$tstart)=split(/_/,$role); |
|
$userroles.='user.role.'.$trole.'.'.$area.'='. |
|
$tstart.'.'.$tend."\n"; |
if ($tend!=0) { |
if ($tend!=0) { |
if ($tend<$now) { |
if ($tend<$now) { |
$trole=''; |
$trole=''; |
Line 422 sub rolesinit {
|
Line 462 sub rolesinit {
|
} |
} |
} |
} |
if (($area ne '') && ($trole ne '')) { |
if (($area ne '') && ($trole ne '')) { |
$userroles.='user.role.'.$trole.'.'.$area.'='. |
|
$tstart.'.'.$tend."\n"; |
|
my ($tdummy,$tdomain,$trest)=split(/\//,$area); |
my ($tdummy,$tdomain,$trest)=split(/\//,$area); |
if ($trole =~ /^cr\//) { |
if ($trole =~ /^cr\//) { |
my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$trole); |
my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$trole); |
my $homsvr=homeserver($rauthor,$rdomain); |
my $homsvr=homeserver($rauthor,$rdomain); |
if ($hostname{$homsvr} ne '') { |
if ($hostname{$homsvr} ne '') { |
my $roledef= |
my $roledef= |
reply("get:$rdomain:$rauthor:roles:rolesdef&$rrole", |
reply("get:$rdomain:$rauthor:roles:rolesdef_$rrole", |
$homsvr); |
$homsvr); |
if (($roledef ne 'con_lost') && ($roledef ne '')) { |
if (($roledef ne 'con_lost') && ($roledef ne '')) { |
my ($syspriv,$dompriv,$coursepriv)= |
my ($syspriv,$dompriv,$coursepriv)= |
split(/&&/,$roledef); |
split(/\_/,unescape($roledef)); |
$allroles{'/'}.=':'.$syspriv; |
$allroles{'/'}.=':'.$syspriv; |
if ($tdomain ne '') { |
if ($tdomain ne '') { |
$allroles{'/'.$tdomain.'/'}.=':'.$dompriv; |
$allroles{'/'.$tdomain.'/'}.=':'.$dompriv; |
Line 493 sub get {
|
Line 531 sub get {
|
my %returnhash=(); |
my %returnhash=(); |
map { |
map { |
my ($key,$value)=split(/=/,$_); |
my ($key,$value)=split(/=/,$_); |
$returnhash{unespace($key)}=unescape($value); |
$returnhash{unescape($key)}=unescape($value); |
} @pairs; |
} @pairs; |
return %returnhash; |
return %returnhash; |
} |
} |
|
|
|
# --------------------------------------------------------------- del interface |
|
|
|
sub del { |
|
my ($namespace,@storearr)=@_; |
|
my $items=''; |
|
map { |
|
$items.=escape($_).'&'; |
|
} @storearr; |
|
$items=~s/\&$//; |
|
return reply("del:$ENV{'user.domain'}:$ENV{'user.name'}:$namespace:$items", |
|
$ENV{'user.home'}); |
|
} |
|
|
# -------------------------------------------------------------- dump interface |
# -------------------------------------------------------------- dump interface |
|
|
sub dump { |
sub dump { |
Line 508 sub dump {
|
Line 559 sub dump {
|
my %returnhash=(); |
my %returnhash=(); |
map { |
map { |
my ($key,$value)=split(/=/,$_); |
my ($key,$value)=split(/=/,$_); |
$returnhash{unespace($key)}=unescape($value); |
$returnhash{unescape($key)}=unescape($value); |
} @pairs; |
} @pairs; |
return %returnhash; |
return %returnhash; |
} |
} |
Line 541 sub eget {
|
Line 592 sub eget {
|
my %returnhash=(); |
my %returnhash=(); |
map { |
map { |
my ($key,$value)=split(/=/,$_); |
my ($key,$value)=split(/=/,$_); |
$returnhash{unespace($key)}=unescape($value); |
$returnhash{unescape($key)}=unescape($value); |
} @pairs; |
} @pairs; |
return %returnhash; |
return %returnhash; |
} |
} |
Line 552 sub allowed {
|
Line 603 sub allowed {
|
my ($priv,$uri)=@_; |
my ($priv,$uri)=@_; |
$uri=~s/^\/res//; |
$uri=~s/^\/res//; |
$uri=~s/^\///; |
$uri=~s/^\///; |
if ($uri=~/^adm\//) { |
|
|
# Free bre access to adm resources |
|
|
|
if (($uri=~/^adm\//) && ($priv eq 'bre')) { |
return 'F'; |
return 'F'; |
} |
} |
|
|
|
# Gather priviledges over system and domain |
|
|
my $thisallowed=''; |
my $thisallowed=''; |
if ($ENV{'user.priv./'}=~/$priv\&([^\:]*)/) { |
if ($ENV{'user.priv./'}=~/$priv\&([^\:]*)/) { |
$thisallowed.=$1; |
$thisallowed.=$1; |
Line 562 sub allowed {
|
Line 619 sub allowed {
|
if ($ENV{'user.priv./'.(split(/\//,$uri))[0].'/'}=~/$priv\&([^\:]*)/) { |
if ($ENV{'user.priv./'.(split(/\//,$uri))[0].'/'}=~/$priv\&([^\:]*)/) { |
$thisallowed.=$1; |
$thisallowed.=$1; |
} |
} |
if ($ENV{'user.priv./'.$uri}=~/$priv\&([^\:]*)/) { |
|
$thisallowed.=$1; |
# Full access at system or domain level? Exit. |
|
|
|
if ($thisallowed=~/F/) { |
|
return 'F'; |
|
} |
|
|
|
# The user does not have full access at system or domain level |
|
# Course level access control |
|
|
|
# uri itself refering to a course? |
|
|
|
if ($uri=~/\.course$/) { |
|
if ($ENV{'user.priv./'.$uri}=~/$priv\&([^\:]*)/) { |
|
$thisallowed.=$1; |
|
} |
|
# Full access on course level? Exit. |
|
if ($thisallowed=~/F/) { |
|
return 'F'; |
|
} |
|
|
|
# uri is refering to an individual resource; user needs to be in a course |
|
|
|
} else { |
|
|
|
unless(defined($ENV{'request.course.uri'})) { |
|
return '1'; |
|
} |
|
|
|
# Get access priviledges for course |
|
|
|
if ($ENV{'user.priv./'.$ENV{'request.course.uri'}}=~/$priv\&([^\:]*)/) { |
|
$thisallowed.=$1; |
|
} |
|
|
|
# See if resource or referer is part of this course |
|
|
|
my @uriparts=split(/\//,$uri); |
|
my $urifile=$uriparts[$#uriparts]; |
|
$urifile=~/\.(\w+)$/; |
|
my $uritype=$1; |
|
$#uriparts--; |
|
my $uripath=join('/',@uriparts); |
|
my $uricond=-1; |
|
if ($ENV{'acc.res.'.$ENV{'request.course'}.'.'.$uripath}=~ |
|
/\&$urifile\:(\d+)\&/) { |
|
$uricond=$1; |
|
} elsif (($fe{$uritype} eq 'emb') || ($fe{$uritype} eq 'img')) { |
|
my $refuri=$ENV{'HTTP_REFERER'}; |
|
$refuri=~s/^\/res//; |
|
$refuri=~s/^\///; |
|
@uriparts=split(/\//,$refuri); |
|
$urifile=$uriparts[$#uriparts]; |
|
$#uriparts--; |
|
$uripath=join('/',@uriparts); |
|
if ($ENV{'acc.res.'.$ENV{'request.course'}.'.'.$uripath}=~ |
|
/\&$urifile\:(\d+)\&/) { |
|
$uricond=$1; |
|
} |
|
} |
|
|
|
if ($uricond>=0) { |
|
|
|
# The resource is part of the course |
|
# If user had full access on course level, go ahead |
|
|
|
if ($thisallowed=~/F/) { |
|
return 'F'; |
|
} |
|
|
|
# Restricted by state? |
|
|
|
if ($thisallowed=~/X/) { |
|
if (&condval($uricond)>1) { |
|
return '2'; |
|
} else { |
|
return ''; |
|
} |
|
} |
|
} |
} |
} |
return $thisallowed; |
return $thisallowed; |
} |
} |
|
|
|
# ---------------------------------------------------------- Refresh State Info |
|
|
|
sub refreshstate { |
|
} |
|
|
# ----------------------------------------------------------------- Define Role |
# ----------------------------------------------------------------- Define Role |
|
|
sub definerole { |
sub definerole { |
if (allowed('mcr','/')) { |
if (allowed('mcr','/')) { |
my ($rolename,$sysrole,$domrole,$courole)=@_; |
my ($rolename,$sysrole,$domrole,$courole)=@_; |
|
map { |
|
my ($crole,$cqual)=split(/\&/,$_); |
|
if ($pr{'cr:s'}!~/$crole/) { return "refused:s:$crole"; } |
|
if ($pr{'cr:s'}=~/$crole\&/) { |
|
if ($pr{'cr:s'}!~/$crole\&\w*$cqual/) { |
|
return "refused:s:$crole&$cqual"; |
|
} |
|
} |
|
} split('/',$sysrole); |
|
map { |
|
my ($crole,$cqual)=split(/\&/,$_); |
|
if ($pr{'cr:d'}!~/$crole/) { return "refused:d:$crole"; } |
|
if ($pr{'cr:d'}=~/$crole\&/) { |
|
if ($pr{'cr:d'}!~/$crole\&\w*$cqual/) { |
|
return "refused:d:$crole&$cqual"; |
|
} |
|
} |
|
} split('/',$domrole); |
|
map { |
|
my ($crole,$cqual)=split(/\&/,$_); |
|
if ($pr{'cr:c'}!~/$crole/) { return "refused:c:$crole"; } |
|
if ($pr{'cr:c'}=~/$crole\&/) { |
|
if ($pr{'cr:c'}!~/$crole\&\w*$cqual/) { |
|
return "refused:c:$crole&$cqual"; |
|
} |
|
} |
|
} split('/',$courole); |
my $command="encrypt:rolesput:$ENV{'user.domain'}:$ENV{'user.name'}:". |
my $command="encrypt:rolesput:$ENV{'user.domain'}:$ENV{'user.name'}:". |
"$ENV{'user.domain'}:$ENV{'user.name'}:". |
"$ENV{'user.domain'}:$ENV{'user.name'}:". |
"rolesdef&$rolename=$sysrole&&$domrole&&$courole"; |
"rolesdef_$rolename=". |
|
escape($sysrole.'_'.$domrole.'_'.$courole); |
return reply($command,$ENV{'user.home'}); |
return reply($command,$ENV{'user.home'}); |
} else { |
} else { |
return 'refused'; |
return 'refused'; |
Line 585 sub definerole {
|
Line 753 sub definerole {
|
# ------------------------------------------------------------------ Plain Text |
# ------------------------------------------------------------------ Plain Text |
|
|
sub plaintext { |
sub plaintext { |
return $prp{$_}; |
my $short=shift; |
|
return $prp{$short}; |
|
} |
|
|
|
# ------------------------------------------------------------------ Plain Text |
|
|
|
sub fileembstyle { |
|
my $ending=shift; |
|
return $fe{$ending}; |
|
} |
|
|
|
# ------------------------------------------------------------ Description Text |
|
|
|
sub filedecription { |
|
my $ending=shift; |
|
return $fd{$ending}; |
} |
} |
|
|
# ----------------------------------------------------------------- Assign Role |
# ----------------------------------------------------------------- Assign Role |
|
|
sub assignrole { |
sub assignrole { |
|
my ($udom,$uname,$url,$role,$end,$start)=@_; |
|
my $mrole; |
|
$url=~s/^\///; |
|
$url=~s/^res\///; |
|
if ($role =~ /^cr\//) { |
|
unless ($url=~/\.course$/) { return 'invalid'; } |
|
unless (allowed('ccr',$url)) { return 'refused'; } |
|
$mrole='cr'; |
|
} else { |
|
unless (($url=~/\.course$/) || ($url=~/\/$/)) { return 'invalid'; } |
|
unless (allowed('c'+$role)) { return 'refused'; } |
|
$mrole=$role; |
|
} |
|
my $command="encrypt:rolesput:$ENV{'user.domain'}:$ENV{'user.name'}:". |
|
"$udom:$uname:$url".'_'."$mrole=$role"; |
|
if ($end) { $command.='_$end'; } |
|
if ($start) { |
|
if ($end) { |
|
$command.='_$start'; |
|
} else { |
|
$command.='_0_$start'; |
|
} |
|
} |
|
return &reply($command,&homeserver($uname,$udom)); |
|
} |
|
|
|
# ---------------------------------------------------------- Assign Custom Role |
|
|
|
sub assigncustomrole { |
|
my ($udom,$uname,$url,$rdom,$rnam,$rolename,$end,$start)=@_; |
|
return &assignrole($udom,$uname,$url,'cr/'.$rdom.'/'.$rnam.'/'.$rolename, |
|
$end,$start); |
|
} |
|
|
|
# ----------------------------------------------------------------- Revoke Role |
|
|
|
sub revokerole { |
|
my ($udom,$uname,$url,$role)=@_; |
|
my $now=time; |
|
return &assignrole($udom,$uname,$url,$role,$now); |
|
} |
|
|
|
# ---------------------------------------------------------- Revoke Custom Role |
|
|
|
sub revokecustomrole { |
|
my ($udom,$uname,$url,$rdom,$rnam,$rolename)=@_; |
|
my $now=time; |
|
return &assigncustomrole($udom,$uname,$url,$rdom,$rnam,$rolename,$now); |
} |
} |
|
|
# ------------------------------------------------------------ Directory lister |
# ------------------------------------------------------------ Directory lister |
Line 643 sub dirlist {
|
Line 874 sub dirlist {
|
} |
} |
} |
} |
|
|
|
# -------------------------------------------------------- Value of a Condition |
|
|
|
sub condval { |
|
my $condidx=shift; |
|
my $result=0; |
|
if ($ENV{'request.course'}) { |
|
if (defined($ENV{'acc.cond.'.$ENV{'request.course'}.'.'.$condidx})) { |
|
my $operand='|'; |
|
my @stack; |
|
map { |
|
if ($_ eq '(') { |
|
push @stack,($operand,$result) |
|
} elsif ($_ eq ')') { |
|
my $before=pop @stack; |
|
if (pop @stack eq '&') { |
|
$result=$result>$before?$before:$result; |
|
} else { |
|
$result=$result>$before?$result:$before; |
|
} |
|
} elsif (($_ eq '&') || ($_ eq '|')) { |
|
$operand=$_; |
|
} else { |
|
my $new= |
|
substr($ENV{'user.state.'.$ENV{'request.course'}},$_,1); |
|
if ($operand eq '&') { |
|
$result=$result>$new?$new:$result; |
|
} else { |
|
$result=$result>$new?$result:$new; |
|
} |
|
} |
|
} ($ENV{'acc.cond.'.$ENV{'request.course'}.'.'.$condidx}=~ |
|
/(\d+|\(|\)|\&|\|)/g); |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
# --------------------------------------------------------- Value of a Variable |
|
|
|
sub varval { |
|
my ($realm,$space,@components)=split(/\./,shift); |
|
my $value=''; |
|
if ($realm eq 'user') { |
|
if ($space=~/^resource/) { |
|
$space=~s/^resource\[//; |
|
$space=~s/\]$//; |
|
|
|
} else { |
|
} |
|
} elsif ($realm eq 'course') { |
|
} elsif ($realm eq 'session') { |
|
} elsif ($realm eq 'system') { |
|
} |
|
return $value; |
|
} |
|
|
# -------------------------------------------------------- Escape Special Chars |
# -------------------------------------------------------- Escape Special Chars |
|
|
sub escape { |
sub escape { |
Line 721 if ($readit ne 'done') {
|
Line 1008 if ($readit ne 'done') {
|
} |
} |
} |
} |
|
|
|
# ------------------------------------------------------------- Read file types |
|
{ |
|
my $config=Apache::File->new("$perlvar{'lonTabDir'}/filetypes.tab"); |
|
|
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
my ($ending,$emb,@descr)=split(/\s+/,$configline); |
|
if ($descr[0] ne '') { |
|
$fe{$ending}=$emb; |
|
$fd{$ending}=join(' ',@descr); |
|
} |
|
} |
|
} |
|
|
|
|
$readit='done'; |
$readit='done'; |
&logthis('<font color=yellow>INFO: Read configuration</font>'); |
&logthis('<font color=yellow>INFO: Read configuration</font>'); |
} |
} |
} |
} |
1; |
1; |
|
|
|
|
|
|
|
|