version 1.938, 2008/01/18 02:18:07
|
version 1.950, 2008/03/22 15:47:41
|
Line 448 sub timed_flock {
|
Line 448 sub timed_flock {
|
# ---------------------------------------------------------- Append Environment |
# ---------------------------------------------------------- Append Environment |
|
|
sub appenv { |
sub appenv { |
my %newenv=@_; |
my ($newenv,$roles) = @_; |
foreach my $key (keys(%newenv)) { |
if (ref($newenv) eq 'HASH') { |
if (($newenv{$key}=~/^user\.role/) || ($newenv{$key}=~/^user\.priv/)) { |
foreach my $key (keys(%{$newenv})) { |
&logthis("<font color=\"blue\">WARNING: ". |
my $refused = 0; |
"Attempt to modify environment ".$key." to ".$newenv{$key} |
if (($key =~ /^user\.role/) || ($key =~ /^user\.priv/)) { |
.'</font>'); |
$refused = 1; |
delete($newenv{$key}); |
if (ref($roles) eq 'ARRAY') { |
} else { |
my ($type,$role) = ($key =~ /^user\.(role|priv)\.([^.]+)\./); |
$env{$key}=$newenv{$key}; |
if (grep(/^\Q$role\E$/,@{$roles})) { |
|
$refused = 0; |
|
} |
|
} |
|
} |
|
if ($refused) { |
|
&logthis("<font color=\"blue\">WARNING: ". |
|
"Attempt to modify environment ".$key." to ".$newenv->{$key} |
|
.'</font>'); |
|
delete($newenv->{$key}); |
|
} else { |
|
$env{$key}=$newenv->{$key}; |
|
} |
|
} |
|
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
|
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
|
&& |
|
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
|
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
|
while (my ($key,$value) = each(%{$newenv})) { |
|
$disk_env{$key} = $value; |
|
} |
|
untie(%disk_env); |
} |
} |
} |
|
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
|
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
|
&& |
|
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
|
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
|
while (my ($key,$value) = each(%newenv)) { |
|
$disk_env{$key} = $value; |
|
} |
|
untie(%disk_env); |
|
} |
} |
return 'ok'; |
return 'ok'; |
} |
} |
Line 1064 sub inst_rulecheck {
|
Line 1076 sub inst_rulecheck {
|
$response=&unescape(&reply('instidrulecheck:'.&escape($udom). |
$response=&unescape(&reply('instidrulecheck:'.&escape($udom). |
':'.&escape($id).':'.$rulestr, |
':'.&escape($id).':'.$rulestr, |
$homeserver)); |
$homeserver)); |
|
} elsif ($item eq 'selfcreate') { |
|
$response=&unescape(&reply('instselfcreatecheck:'. |
|
&escape($udom).':'.&escape($uname). |
|
':'.$rulestr,$homeserver)); |
} |
} |
if ($response ne 'refused') { |
if ($response ne 'refused') { |
my @pairs=split(/\&/,$response); |
my @pairs=split(/\&/,$response); |
Line 1090 sub inst_userrules {
|
Line 1106 sub inst_userrules {
|
if ($check eq 'id') { |
if ($check eq 'id') { |
$response=&reply('instidrules:'.&escape($udom), |
$response=&reply('instidrules:'.&escape($udom), |
$homeserver); |
$homeserver); |
|
} elsif ($check eq 'email') { |
|
$response=&reply('instemailrules:'.&escape($udom), |
|
$homeserver); |
} else { |
} else { |
$response=&reply('instuserrules:'.&escape($udom), |
$response=&reply('instuserrules:'.&escape($udom), |
$homeserver); |
$homeserver); |
Line 1115 sub inst_userrules {
|
Line 1134 sub inst_userrules {
|
return (\%ruleshash,\@ruleorder); |
return (\%ruleshash,\@ruleorder); |
} |
} |
|
|
|
# ------------------------- Get Authentication and Language Defaults for Domain |
|
|
|
sub get_domain_defaults { |
|
my ($domain) = @_; |
|
my $cachetime = 60*60*24; |
|
my ($defauthtype,$defautharg,$deflang); |
|
my ($result,$cached)=&is_cached_new('domdefaults',$domain); |
|
if (defined($cached)) { |
|
if (ref($result) eq 'HASH') { |
|
return %{$result}; |
|
} |
|
} |
|
my %domdefaults; |
|
my %domconfig = |
|
&Apache::lonnet::get_dom('configuration',['defaults'],$domain); |
|
if (ref($domconfig{'defaults'}) eq 'HASH') { |
|
$domdefaults{'lang_def'} = $domconfig{'defaults'}{'lang_def'}; |
|
$domdefaults{'auth_def'} = $domconfig{'defaults'}{'auth_def'}; |
|
$domdefaults{'auth_arg_def'} = $domconfig{'defaults'}{'auth_arg_def'}; |
|
} else { |
|
$domdefaults{'lang_def'} = &domain($domain,'lang_def'); |
|
$domdefaults{'auth_def'} = &domain($domain,'auth_def'); |
|
$domdefaults{'auth_arg_def'} = &domain($domain,'auth_arg_def'); |
|
} |
|
&Apache::lonnet::do_cache_new('domdefaults',$domain,\%domdefaults, |
|
$cachetime); |
|
return %domdefaults; |
|
} |
|
|
# --------------------------------------------------- Assign a key to a student |
# --------------------------------------------------- Assign a key to a student |
|
|
sub assign_access_key { |
sub assign_access_key { |
Line 1147 sub assign_access_key {
|
Line 1195 sub assign_access_key {
|
# key now belongs to user |
# key now belongs to user |
my $envkey='key.'.$cdom.'_'.$cnum; |
my $envkey='key.'.$cdom.'_'.$cnum; |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
&appenv('environment.'.$envkey => $ckey); |
&appenv({'environment.'.$envkey => $ckey}); |
return 'ok'; |
return 'ok'; |
} else { |
} else { |
return |
return |
Line 1650 sub absolute_url {
|
Line 1698 sub absolute_url {
|
return $protocol.$host_name; |
return $protocol.$host_name; |
} |
} |
|
|
|
# |
|
# Server side include. |
|
# Parameters: |
|
# fn Possibly encrypted resource name/id. |
|
# form Hash that describes how the rendering should be done |
|
# and other things. |
|
# Returns: |
|
# Scalar context: The content of the response. |
|
# Array context: 2 element list of the content and the full response object. |
|
# |
sub ssi { |
sub ssi { |
|
|
my ($fn,%form)=@_; |
my ($fn,%form)=@_; |
|
|
my $ua=new LWP::UserAgent; |
my $ua=new LWP::UserAgent; |
|
|
my $request; |
my $request; |
|
|
$form{'no_update_last_known'}=1; |
$form{'no_update_last_known'}=1; |
Line 1670 sub ssi {
|
Line 1726 sub ssi {
|
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
$request->header(Cookie => $ENV{'HTTP_COOKIE'}); |
my $response=$ua->request($request); |
my $response=$ua->request($request); |
|
|
return $response->content; |
if (wantarray) { |
|
return ($response->content, $response); |
|
} else { |
|
return $response->content; |
|
} |
} |
} |
|
|
sub externalssi { |
sub externalssi { |
Line 1691 sub allowuploaded {
|
Line 1751 sub allowuploaded {
|
my %httpref=(); |
my %httpref=(); |
my $httpurl=&hreflocation('',$url); |
my $httpurl=&hreflocation('',$url); |
$httpref{'httpref.'.$httpurl}=$srcurl; |
$httpref{'httpref.'.$httpurl}=$srcurl; |
&Apache::lonnet::appenv(%httpref); |
&Apache::lonnet::appenv(\%httpref); |
} |
} |
|
|
# --------- File operations in /home/httpd/html/userfiles/$domain/1/2/3/$course |
# --------- File operations in /home/httpd/html/userfiles/$domain/1/2/3/$course |
Line 2394 sub userrolelog {
|
Line 2454 sub userrolelog {
|
} |
} |
|
|
sub get_course_adv_roles { |
sub get_course_adv_roles { |
my $cid=shift; |
my ($cid,$codes) = @_; |
$cid=$env{'request.course.id'} unless (defined($cid)); |
$cid=$env{'request.course.id'} unless (defined($cid)); |
my %coursehash=&coursedescription($cid); |
my %coursehash=&coursedescription($cid); |
my %nothide=(); |
my %nothide=(); |
Line 2419 sub get_course_adv_roles {
|
Line 2479 sub get_course_adv_roles {
|
if ((&privileged($username,$domain)) && |
if ((&privileged($username,$domain)) && |
(!$nothide{$username.':'.$domain})) { next; } |
(!$nothide{$username.':'.$domain})) { next; } |
if ($role eq 'cr') { next; } |
if ($role eq 'cr') { next; } |
my $key=&plaintext($role); |
if ($codes) { |
if ($section) { $key.=' (Sec/Grp '.$section.')'; } |
if ($section) { $role .= ':'.$section; } |
if ($returnhash{$key}) { |
if ($returnhash{$role}) { |
$returnhash{$key}.=','.$username.':'.$domain; |
$returnhash{$role}.=','.$username.':'.$domain; |
|
} else { |
|
$returnhash{$role}=$username.':'.$domain; |
|
} |
} else { |
} else { |
$returnhash{$key}=$username.':'.$domain; |
my $key=&plaintext($role); |
|
if ($section) { $key.=' (Section '.$section.')'; } |
|
if ($returnhash{$key}) { |
|
$returnhash{$key}.=','.$username.':'.$domain; |
|
} else { |
|
$returnhash{$key}=$username.':'.$domain; |
|
} |
} |
} |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
|
|
Line 2462 sub get_my_roles {
|
Line 2531 sub get_my_roles {
|
} |
} |
if (($tstart) && ($tstart<0)) { next; } |
if (($tstart) && ($tstart<0)) { next; } |
my $status = 'active'; |
my $status = 'active'; |
if (($tend) && ($tend<$now)) { |
if (($tend) && ($tend<=$now)) { |
$status = 'previous'; |
$status = 'previous'; |
} |
} |
if (($tstart) && ($now<$tstart)) { |
if (($tstart) && ($now<$tstart)) { |
Line 2588 sub courseidput {
|
Line 2657 sub courseidput {
|
|
|
sub courseiddump { |
sub courseiddump { |
my ($domfilter,$descfilter,$sincefilter,$instcodefilter,$ownerfilter, |
my ($domfilter,$descfilter,$sincefilter,$instcodefilter,$ownerfilter, |
$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok)=@_; |
$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok, |
|
$selfenrollonly)=@_; |
my $as_hash = 1; |
my $as_hash = 1; |
my %returnhash; |
my %returnhash; |
if (!$domfilter) { $domfilter=''; } |
if (!$domfilter) { $domfilter=''; } |
Line 2605 sub courseiddump {
|
Line 2675 sub courseiddump {
|
$sincefilter.':'.&escape($descfilter).':'. |
$sincefilter.':'.&escape($descfilter).':'. |
&escape($instcodefilter).':'.&escape($ownerfilter). |
&escape($instcodefilter).':'.&escape($ownerfilter). |
':'.&escape($coursefilter).':'.&escape($typefilter). |
':'.&escape($coursefilter).':'.&escape($typefilter). |
':'.&escape($regexp_ok).':'.$as_hash,$tryserver); |
':'.&escape($regexp_ok).':'.$as_hash.':'. |
|
&escape($selfenrollonly),$tryserver); |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
foreach my $item (@pairs) { |
foreach my $item (@pairs) { |
my ($key,$value)=split(/\=/,$item,2); |
my ($key,$value)=split(/\=/,$item,2); |
Line 3342 sub coursedescription {
|
Line 3413 sub coursedescription {
|
} |
} |
} |
} |
if (!$args->{'one_time'}) { |
if (!$args->{'one_time'}) { |
&appenv(%envhash); |
&appenv(\%envhash); |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
Line 3527 sub set_userprivs {
|
Line 3598 sub set_userprivs {
|
} |
} |
foreach my $role (keys(%{$allroles})) { |
foreach my $role (keys(%{$allroles})) { |
my %thesepriv; |
my %thesepriv; |
if (($role=~/^au/) || ($role=~/^ca/)) { $author=1; } |
if (($role=~/^au/) || ($role=~/^ca/) || ($role=~/^aa/)) { $author=1; } |
foreach my $item (split(/:/,$$allroles{$role})) { |
foreach my $item (split(/:/,$$allroles{$role})) { |
if ($item ne '') { |
if ($item ne '') { |
my ($privilege,$restrictions)=split(/&/,$item); |
my ($privilege,$restrictions)=split(/&/,$item); |
Line 5257 sub plaintext {
|
Line 5328 sub plaintext {
|
# ----------------------------------------------------------------- Assign Role |
# ----------------------------------------------------------------- Assign Role |
|
|
sub assignrole { |
sub assignrole { |
my ($udom,$uname,$url,$role,$end,$start,$deleteflag)=@_; |
my ($udom,$uname,$url,$role,$end,$start,$deleteflag,$selfenroll)=@_; |
my $mrole; |
my $mrole; |
if ($role =~ /^cr\//) { |
if ($role =~ /^cr\//) { |
my $cwosec=$url; |
my $cwosec=$url; |
Line 5291 sub assignrole {
|
Line 5362 sub assignrole {
|
} else { |
} else { |
$refused = 1; |
$refused = 1; |
} |
} |
if ($refused) { |
if ($refused) { |
&logthis('Refused assignrole: '.$udom.' '.$uname.' '.$url. |
if (($selfenroll == 1) && ($role eq 'st') && ($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { |
' '.$role.' '.$end.' '.$start.' by '. |
$refused = ''; |
$env{'user.name'}.' at '.$env{'user.domain'}); |
} else { |
return 'refused'; |
&logthis('Refused assignrole: '.$udom.' '.$uname.' '.$url. |
|
' '.$role.' '.$end.' '.$start.' by '. |
|
$env{'user.name'}.' at '.$env{'user.domain'}); |
|
return 'refused'; |
|
} |
} |
} |
} |
} |
$mrole=$role; |
$mrole=$role; |
Line 5489 sub modifystudent {
|
Line 5564 sub modifystudent {
|
} |
} |
|
|
sub modify_student_enrollment { |
sub modify_student_enrollment { |
my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type,$locktype,$cid) = @_; |
my ($udom,$uname,$uid,$first,$middle,$last,$gene,$usec,$end,$start,$type,$locktype,$cid,$selfenroll) = @_; |
my ($cdom,$cnum,$chome); |
my ($cdom,$cnum,$chome); |
if (!$cid) { |
if (!$cid) { |
unless ($cid=$env{'request.course.id'}) { |
unless ($cid=$env{'request.course.id'}) { |
Line 5547 sub modify_student_enrollment {
|
Line 5622 sub modify_student_enrollment {
|
if ($usec) { |
if ($usec) { |
$uurl.='/'.$usec; |
$uurl.='/'.$usec; |
} |
} |
return &assignrole($udom,$uname,$uurl,'st',$end,$start); |
return &assignrole($udom,$uname,$uurl,'st',$end,$start,undef,$selfenroll); |
} |
} |
|
|
sub format_name { |
sub format_name { |
Line 5666 ENDINITMAP
|
Line 5741 ENDINITMAP
|
sub is_course { |
sub is_course { |
my ($cdom,$cnum) = @_; |
my ($cdom,$cnum) = @_; |
my %courses = &courseiddump($cdom,'.',1,'.','.',$cnum,undef, |
my %courses = &courseiddump($cdom,'.',1,'.','.',$cnum,undef, |
undef,'.',undef,1); |
undef,'.'); |
if (exists($courses{$cdom.'_'.$cnum})) { |
if (exists($courses{$cdom.'_'.$cnum})) { |
return 1; |
return 1; |
} |
} |
Line 6281 sub directcondval {
|
Line 6356 sub directcondval {
|
untie(%bighash); |
untie(%bighash); |
} |
} |
my $value = &docondval($sub_condition); |
my $value = &docondval($sub_condition); |
&appenv('user.state.'.$env{'request.course.id'}.".$number" => $value); |
&appenv({'user.state.'.$env{'request.course.id'}.".$number" => $value}); |
return $value; |
return $value; |
} |
} |
if ($env{'user.state.'.$env{'request.course.id'}}) { |
if ($env{'user.state.'.$env{'request.course.id'}}) { |
Line 6467 sub EXT_cache_status {
|
Line 6542 sub EXT_cache_status {
|
sub EXT_cache_set { |
sub EXT_cache_set { |
my ($target_domain,$target_user) = @_; |
my ($target_domain,$target_user) = @_; |
my $cachename = 'cache.EXT.'.$target_user.'.'.$target_domain; |
my $cachename = 'cache.EXT.'.$target_user.'.'.$target_domain; |
#&appenv($cachename => time); |
#&appenv({$cachename => time}); |
} |
} |
|
|
# --------------------------------------------------------- Value of a Variable |
# --------------------------------------------------------- Value of a Variable |
Line 6751 sub EXT {
|
Line 6826 sub EXT {
|
|
|
sub get_reply { |
sub get_reply { |
my ($reply_value) = @_; |
my ($reply_value) = @_; |
if (wantarray) { |
if (ref($reply_value) eq 'ARRAY') { |
return @$reply_value; |
if (wantarray) { |
|
return @$reply_value; |
|
} |
|
return $reply_value->[0]; |
|
} else { |
|
return $reply_value; |
} |
} |
return $reply_value->[0]; |
|
} |
} |
|
|
sub check_group_parms { |
sub check_group_parms { |
Line 7365 sub symbread {
|
Line 7444 sub symbread {
|
if ($syval) { |
if ($syval) { |
#unless ($syval=~/\_\d+$/) { |
#unless ($syval=~/\_\d+$/) { |
#unless ($env{'form.request.prefix'}=~/\.(\d+)\_$/) { |
#unless ($env{'form.request.prefix'}=~/\.(\d+)\_$/) { |
#&appenv('request.ambiguous' => $thisfn); |
#&appenv({'request.ambiguous' => $thisfn}); |
#return $env{$cache_str}=''; |
#return $env{$cache_str}=''; |
#} |
#} |
#$syval.=$1; |
#$syval.=$1; |
Line 7417 sub symbread {
|
Line 7496 sub symbread {
|
return $env{$cache_str}=$syval; |
return $env{$cache_str}=$syval; |
} |
} |
} |
} |
&appenv('request.ambiguous' => $thisfn); |
&appenv({'request.ambiguous' => $thisfn}); |
return $env{$cache_str}=''; |
return $env{$cache_str}=''; |
} |
} |
|
|
Line 7931 sub tokenwrapper {
|
Line 8010 sub tokenwrapper {
|
my (undef,$udom,$uname,$file)=split('/',$uri,4); |
my (undef,$udom,$uname,$file)=split('/',$uri,4); |
if ($udom && $uname && $file) { |
if ($udom && $uname && $file) { |
$file=~s|(\?\.*)*$||; |
$file=~s|(\?\.*)*$||; |
&appenv("userfile.$udom/$uname/$file" => $env{'request.course.id'}); |
&appenv({"userfile.$udom/$uname/$file" => $env{'request.course.id'}}); |
return 'http://'.&hostname(&homeserver($uname,$udom)).'/'.$uri. |
return 'http://'.&hostname(&homeserver($uname,$udom)).'/'.$uri. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
(($uri=~/\?/)?'&':'?').'token='.$token. |
'&tokenissued='.$perlvar{'lonHostID'}; |
'&tokenissued='.$perlvar{'lonHostID'}; |
Line 8776 that was requested
|
Line 8855 that was requested
|
|
|
=item * |
=item * |
X<appenv()> |
X<appenv()> |
B<appenv(%hash)>: the value of %hash is written to |
B<appenv($hashref,$rolesarrayref)>: the value of %{$hashref} is written to |
the user envirnoment file, and will be restored for each access this |
the user envirnoment file, and will be restored for each access this |
user makes during this session, also modifies the %env for the current |
user makes during this session, also modifies the %env for the current |
process |
process. Optional rolesarrayref - if defined contains a reference to an array |
|
of roles which are exempt from the restriction on modifying user.role entries |
|
in the user's environment.db and in %env. |
|
|
=item * |
=item * |
X<delenv()> |
X<delenv()> |
Line 9342 put_dom($namespace,$storehash,$udom,$uho
|
Line 9423 put_dom($namespace,$storehash,$udom,$uho
|
domain level either on specified domain server ($uhome) or primary domain |
domain level either on specified domain server ($uhome) or primary domain |
server ($udom and $uhome are optional) |
server ($udom and $uhome are optional) |
|
|
|
=item * |
|
|
|
get_domain_defaults($target_domain) : returns hash with defaults for |
|
authentication and language in the domain. Keys are: auth_def, auth_arg_def, |
|
lang_def; corresponsing values are authentication type (internal, krb4, krb5, |
|
or localauth), initial password or a kerberos realm, language (e.g., en-us). |
|
Values are retrieved from cache (if current), or from domain's configuration.db |
|
(if available), or lastly from values in lonTabs/dns_domain,tab, |
|
or lonTabs/domain.tab. |
|
|
|
%domdefaults = &get_auth_defaults($target_domain); |
|
|
=back |
=back |
|
|
=head2 Network Status Functions |
=head2 Network Status Functions |