version 1.912, 2007/09/12 20:29:16
|
version 1.941, 2008/02/03 05:08:05
|
Line 320 sub convert_and_load_session_env {
|
Line 320 sub convert_and_load_session_env {
|
my ($lonidsdir,$handle)=@_; |
my ($lonidsdir,$handle)=@_; |
my @profile; |
my @profile; |
{ |
{ |
open(my $idf,"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
if (!$opened) { |
|
return 0; |
|
} |
flock($idf,LOCK_SH); |
flock($idf,LOCK_SH); |
@profile=<$idf>; |
@profile=<$idf>; |
close($idf); |
close($idf); |
Line 359 sub transfer_profile_to_env {
|
Line 362 sub transfer_profile_to_env {
|
|
|
my $convert; |
my $convert; |
{ |
{ |
open(my $idf,"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
if (!$opened) { |
|
return; |
|
} |
flock($idf,LOCK_SH); |
flock($idf,LOCK_SH); |
if (tie(my %disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
if (tie(my %disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
Line 391 sub transfer_profile_to_env {
|
Line 397 sub transfer_profile_to_env {
|
} |
} |
} |
} |
|
|
|
# ---------------------------------------------------- Check for valid session |
|
sub check_for_valid_session { |
|
my ($r) = @_; |
|
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
|
my $lonid=$cookies{'lonID'}; |
|
return undef if (!$lonid); |
|
|
|
my $handle=&LONCAPA::clean_handle($lonid->value); |
|
my $lonidsdir=$r->dir_config('lonIDsDir'); |
|
return undef if (!-e "$lonidsdir/$handle.id"); |
|
|
|
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
|
return undef if (!$opened); |
|
|
|
flock($idf,LOCK_SH); |
|
my %disk_env; |
|
if (!tie(%disk_env,'GDBM_File',"$lonidsdir/$handle.id", |
|
&GDBM_READER(),0640)) { |
|
return undef; |
|
} |
|
|
|
if (!defined($disk_env{'user.name'}) |
|
|| !defined($disk_env{'user.domain'})) { |
|
return undef; |
|
} |
|
return $handle; |
|
} |
|
|
sub timed_flock { |
sub timed_flock { |
my ($file,$lock_type) = @_; |
my ($file,$lock_type) = @_; |
my $failed=0; |
my $failed=0; |
Line 425 sub appenv {
|
Line 459 sub appenv {
|
$env{$key}=$newenv{$key}; |
$env{$key}=$newenv{$key}; |
} |
} |
} |
} |
open(my $env_file,$env{'user.environment'}); |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
if (&timed_flock($env_file,LOCK_EX) |
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
&& |
&& |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
Line 446 sub delenv {
|
Line 481 sub delenv {
|
"Attempt to delete from environment ".$delthis); |
"Attempt to delete from environment ".$delthis); |
return 'error'; |
return 'error'; |
} |
} |
open(my $env_file,$env{'user.environment'}); |
my $opened = open(my $env_file,'+<',$env{'user.environment'}); |
if (&timed_flock($env_file,LOCK_EX) |
if ($opened |
|
&& &timed_flock($env_file,LOCK_EX) |
&& |
&& |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
tie(my %disk_env,'GDBM_File',$env{'user.environment'}, |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
(&GDBM_WRITER()|&GDBM_NOLOCK()),0640)) { |
foreach my $key (keys(%disk_env)) { |
foreach my $key (keys(%disk_env)) { |
if ($key=~/^$delthis/) { |
if ($key=~/^$delthis/) { |
delete($env{$key}); |
delete($env{$key}); |
delete($disk_env{$key}); |
delete($disk_env{$key}); |
} |
} |
} |
} |
untie(%disk_env); |
untie(%disk_env); |
} |
} |
Line 477 sub get_env_multiple {
|
Line 513 sub get_env_multiple {
|
} |
} |
|
|
# ------------------------------------------ Find out current server userload |
# ------------------------------------------ Find out current server userload |
# there is a copy in lond |
|
sub userload { |
sub userload { |
my $numusers=0; |
my $numusers=0; |
{ |
{ |
Line 485 sub userload {
|
Line 520 sub userload {
|
my $filename; |
my $filename; |
my $curtime=time; |
my $curtime=time; |
while ($filename=readdir(LONIDS)) { |
while ($filename=readdir(LONIDS)) { |
if ($filename eq '.' || $filename eq '..') {next;} |
next if ($filename eq '.' || $filename eq '..'); |
|
next if ($filename =~ /publicuser_\d+\.id/); |
my ($mtime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[9]; |
my ($mtime)=(stat($perlvar{'lonIDsDir'}.'/'.$filename))[9]; |
if ($curtime-$mtime < 1800) { $numusers++; } |
if ($curtime-$mtime < 1800) { $numusers++; } |
} |
} |
Line 582 sub compare_server_load {
|
Line 618 sub compare_server_load {
|
} |
} |
return ($spare_server,$lowest_load); |
return ($spare_server,$lowest_load); |
} |
} |
|
|
|
# --------------------------- ask offload servers if user already has a session |
|
sub find_existing_session { |
|
my ($udom,$uname) = @_; |
|
foreach my $try_server (@{ $spareid{'primary'} }, |
|
@{ $spareid{'default'} }) { |
|
return $try_server if (&has_user_session($try_server, $udom, $uname)); |
|
} |
|
return; |
|
} |
|
|
|
# -------------------------------- ask if server already has a session for user |
|
sub has_user_session { |
|
my ($lonid,$udom,$uname) = @_; |
|
my $result = &reply(join(':','userhassession', |
|
map {&escape($_)} ($udom,$uname)),$lonid); |
|
return 1 if ($result eq 'ok'); |
|
|
|
return 0; |
|
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
|
|
sub changepass { |
sub changepass { |
Line 990 sub get_instuser {
|
Line 1047 sub get_instuser {
|
} |
} |
|
|
sub inst_rulecheck { |
sub inst_rulecheck { |
my ($udom,$uname,$rules) = @_; |
my ($udom,$uname,$id,$item,$rules) = @_; |
my %returnhash; |
my %returnhash; |
if ($udom ne '') { |
if ($udom ne '') { |
if (ref($rules) eq 'ARRAY') { |
if (ref($rules) eq 'ARRAY') { |
Line 998 sub inst_rulecheck {
|
Line 1055 sub inst_rulecheck {
|
my $rulestr = join(':',@{$rules}); |
my $rulestr = join(':',@{$rules}); |
my $homeserver=&domain($udom,'primary'); |
my $homeserver=&domain($udom,'primary'); |
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
my $response=&unescape(&reply('instrulecheck:'.&escape($udom).':'. |
my $response; |
&escape($uname).':'.$rulestr, |
if ($item eq 'username') { |
|
$response=&unescape(&reply('instrulecheck:'.&escape($udom). |
|
':'.&escape($uname).':'.$rulestr, |
$homeserver)); |
$homeserver)); |
|
} elsif ($item eq 'id') { |
|
$response=&unescape(&reply('instidrulecheck:'.&escape($udom). |
|
':'.&escape($id).':'.$rulestr, |
|
$homeserver)); |
|
} |
if ($response ne 'refused') { |
if ($response ne 'refused') { |
my @pairs=split(/\&/,$response); |
my @pairs=split(/\&/,$response); |
foreach my $item (@pairs) { |
foreach my $item (@pairs) { |
Line 1017 sub inst_rulecheck {
|
Line 1081 sub inst_rulecheck {
|
} |
} |
|
|
sub inst_userrules { |
sub inst_userrules { |
my ($udom) = @_; |
my ($udom,$check) = @_; |
my (%ruleshash,@ruleorder); |
my (%ruleshash,@ruleorder); |
if ($udom ne '') { |
if ($udom ne '') { |
my $homeserver=&domain($udom,'primary'); |
my $homeserver=&domain($udom,'primary'); |
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
if (($homeserver ne '') && ($homeserver ne 'no_host')) { |
my $response=&reply('instuserrules:'.&escape($udom), |
my $response; |
|
if ($check eq 'id') { |
|
$response=&reply('instidrules:'.&escape($udom), |
$homeserver); |
$homeserver); |
|
} else { |
|
$response=&reply('instuserrules:'.&escape($udom), |
|
$homeserver); |
|
} |
if (($response ne 'refused') && ($response ne 'error') && |
if (($response ne 'refused') && ($response ne 'error') && |
|
($response ne 'unknown_cmd') && |
($response ne 'no_such_host')) { |
($response ne 'no_such_host')) { |
my ($hashitems,$orderitems) = split(/:/,$response); |
my ($hashitems,$orderitems) = split(/:/,$response); |
my @pairs=split(/\&/,$hashitems); |
my @pairs=split(/\&/,$hashitems); |
Line 1326 sub do_cache_new {
|
Line 1397 sub do_cache_new {
|
$memcache->disconnect_all(); |
$memcache->disconnect_all(); |
} |
} |
# need to make a copy of $value |
# need to make a copy of $value |
#&make_room($id,$value,$debug); |
&make_room($id,$value,$debug); |
return $value; |
return $value; |
} |
} |
|
|
sub make_room { |
sub make_room { |
my ($id,$value,$debug)=@_; |
my ($id,$value,$debug)=@_; |
$remembered{$id}=$value; |
|
|
$remembered{$id}= (ref($value)) ? &Storable::dclone($value) |
|
: $value; |
if ($to_remember<0) { return; } |
if ($to_remember<0) { return; } |
$accessed{$id}=[&gettimeofday()]; |
$accessed{$id}=[&gettimeofday()]; |
if (scalar(keys(%remembered)) <= $to_remember) { return; } |
if (scalar(keys(%remembered)) <= $to_remember) { return; } |
Line 1562 sub ssi_body {
|
Line 1635 sub ssi_body {
|
&ssi($filelink,%form)); |
&ssi($filelink,%form)); |
$output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs; |
$output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs; |
$output=~s/^.*?\<body[^\>]*\>//si; |
$output=~s/^.*?\<body[^\>]*\>//si; |
$output=~s/(.*)\<\/body\s*\>.*?$/$1/si; |
$output=~s/\<\/body\s*\>.*?$//si; |
return $output; |
return $output; |
} |
} |
|
|
Line 2113 sub flushcourselogs {
|
Line 2186 sub flushcourselogs {
|
# times and course titles for all courseids |
# times and course titles for all courseids |
# |
# |
my %courseidbuffer=(); |
my %courseidbuffer=(); |
foreach my $crsid (keys %courselogs) { |
foreach my $crsid (keys(%courselogs)) { |
if (&reply('log:'.$coursedombuf{$crsid}.':'.$coursenumbuf{$crsid}.':'. |
if (&reply('log:'.$coursedombuf{$crsid}.':'.$coursenumbuf{$crsid}.':'. |
&escape($courselogs{$crsid}), |
&escape($courselogs{$crsid}), |
$coursehombuf{$crsid}) eq 'ok') { |
$coursehombuf{$crsid}) eq 'ok') { |
Line 2126 sub flushcourselogs {
|
Line 2199 sub flushcourselogs {
|
delete $courselogs{$crsid}; |
delete $courselogs{$crsid}; |
} |
} |
} |
} |
if ($courseidbuffer{$coursehombuf{$crsid}}) { |
$courseidbuffer{$coursehombuf{$crsid}}{$crsid} = { |
$courseidbuffer{$coursehombuf{$crsid}}.='&'. |
'description' => $coursedescrbuf{$crsid}, |
&escape($crsid).'='.&escape($coursedescrbuf{$crsid}). |
'inst_code' => $courseinstcodebuf{$crsid}, |
':'.&escape($courseinstcodebuf{$crsid}).':'.&escape($courseownerbuf{$crsid}).':'.&escape($coursetypebuf{$crsid}); |
'type' => $coursetypebuf{$crsid}, |
} else { |
'owner' => $courseownerbuf{$crsid}, |
$courseidbuffer{$coursehombuf{$crsid}}= |
}; |
&escape($crsid).'='.&escape($coursedescrbuf{$crsid}). |
|
':'.&escape($courseinstcodebuf{$crsid}).':'.&escape($courseownerbuf{$crsid}).':'.&escape($coursetypebuf{$crsid}); |
|
} |
|
} |
} |
# |
# |
# Write course id database (reverse lookup) to homeserver of courses |
# Write course id database (reverse lookup) to homeserver of courses |
# Is used in pickcourse |
# Is used in pickcourse |
# |
# |
foreach my $crs_home (keys(%courseidbuffer)) { |
foreach my $crs_home (keys(%courseidbuffer)) { |
&courseidput(&host_domain($crs_home),$courseidbuffer{$crs_home}, |
my $response = &courseidput(&host_domain($crs_home), |
$crs_home); |
$courseidbuffer{$crs_home}, |
|
$crs_home,'timeonly'); |
} |
} |
# |
# |
# File accesses |
# File accesses |
Line 2328 sub get_course_adv_roles {
|
Line 2399 sub get_course_adv_roles {
|
my %coursehash=&coursedescription($cid); |
my %coursehash=&coursedescription($cid); |
my %nothide=(); |
my %nothide=(); |
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
$nothide{join(':',split(/[\@\:]/,$user))}=1; |
if ($user !~ /:/) { |
|
$nothide{join(':',split(/[\@]/,$user))}=1; |
|
} else { |
|
$nothide{$user}=1; |
|
} |
} |
} |
my %returnhash=(); |
my %returnhash=(); |
my %dumphash= |
my %dumphash= |
Line 2356 sub get_course_adv_roles {
|
Line 2431 sub get_course_adv_roles {
|
} |
} |
|
|
sub get_my_roles { |
sub get_my_roles { |
my ($uname,$udom,$context,$types,$roles,$roledoms)=@_; |
my ($uname,$udom,$context,$types,$roles,$roledoms,$withsec,$hidepriv)=@_; |
unless (defined($uname)) { $uname=$env{'user.name'}; } |
unless (defined($uname)) { $uname=$env{'user.name'}; } |
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
my %dumphash; |
my (%dumphash,%nothide); |
if ($context eq 'userroles') { |
if ($context eq 'userroles') { |
%dumphash = &dump('roles',$udom,$uname); |
%dumphash = &dump('roles',$udom,$uname); |
} else { |
} else { |
%dumphash= |
%dumphash= |
&dump('nohist_userroles',$udom,$uname); |
&dump('nohist_userroles',$udom,$uname); |
|
if ($hidepriv) { |
|
my %coursehash=&coursedescription($udom.'_'.$uname); |
|
foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) { |
|
if ($user !~ /:/) { |
|
$nothide{join(':',split(/[\@]/,$user))} = 1; |
|
} else { |
|
$nothide{$user} = 1; |
|
} |
|
} |
|
} |
} |
} |
my %returnhash=(); |
my %returnhash=(); |
my $now=time; |
my $now=time; |
Line 2377 sub get_my_roles {
|
Line 2462 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 2406 sub get_my_roles {
|
Line 2491 sub get_my_roles {
|
} |
} |
if (ref($roles) eq 'ARRAY') { |
if (ref($roles) eq 'ARRAY') { |
if (!grep(/^\Q$role\E$/,@{$roles})) { |
if (!grep(/^\Q$role\E$/,@{$roles})) { |
|
if ($role =~ /^cr\//) { |
|
if (!grep(/^cr$/,@{$roles})) { |
|
next; |
|
} |
|
} else { |
|
next; |
|
} |
|
} |
|
} |
|
if ($hidepriv) { |
|
if ((&privileged($username,$domain)) && |
|
(!$nothide{$username.':'.$domain})) { |
next; |
next; |
} |
} |
} |
} |
$returnhash{$username.':'.$domain.':'.$role}=$tstart.':'.$tend; |
if ($withsec) { |
|
$returnhash{$username.':'.$domain.':'.$role.':'.$section} = |
|
$tstart.':'.$tend; |
|
} else { |
|
$returnhash{$username.':'.$domain.':'.$role}=$tstart.':'.$tend; |
|
} |
} |
} |
return %returnhash; |
return %returnhash; |
} |
} |
Line 2448 sub getannounce {
|
Line 2550 sub getannounce {
|
# |
# |
|
|
sub courseidput { |
sub courseidput { |
my ($domain,$what,$coursehome)=@_; |
my ($domain,$storehash,$coursehome,$caller) = @_; |
return &reply('courseidput:'.$domain.':'.$what,$coursehome); |
my $outcome; |
|
if ($caller eq 'timeonly') { |
|
my $cids = ''; |
|
foreach my $item (keys(%$storehash)) { |
|
$cids.=&escape($item).'&'; |
|
} |
|
$cids=~s/\&$//; |
|
$outcome = &reply('courseidputhash:'.$domain.':'.$caller.':'.$cids, |
|
$coursehome); |
|
} else { |
|
my $items = ''; |
|
foreach my $item (keys(%$storehash)) { |
|
$items.= &escape($item).'='. |
|
&freeze_escape($$storehash{$item}).'&'; |
|
} |
|
$items=~s/\&$//; |
|
$outcome = &reply('courseidputhash:'.$domain.':'.$caller.':'.$items, |
|
$coursehome); |
|
} |
|
if ($outcome eq 'unknown_cmd') { |
|
my $what; |
|
foreach my $cid (keys(%$storehash)) { |
|
$what .= &escape($cid).'='; |
|
foreach my $item ('description','inst_code','owner','type') { |
|
$what .= &escape($storehash->{$cid}{$item}).':'; |
|
} |
|
$what =~ s/\:$/&/; |
|
} |
|
$what =~ s/\&$//; |
|
return &reply('courseidput:'.$domain.':'.$what,$coursehome); |
|
} else { |
|
return $outcome; |
|
} |
} |
} |
|
|
sub courseiddump { |
sub courseiddump { |
my ($domfilter,$descfilter,$sincefilter,$instcodefilter,$ownerfilter,$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok)=@_; |
my ($domfilter,$descfilter,$sincefilter,$instcodefilter,$ownerfilter, |
my %returnhash=(); |
$coursefilter,$hostidflag,$hostidref,$typefilter,$regexp_ok)=@_; |
unless ($domfilter) { $domfilter=''; } |
my $as_hash = 1; |
|
my %returnhash; |
|
if (!$domfilter) { $domfilter=''; } |
my %libserv = &all_library(); |
my %libserv = &all_library(); |
foreach my $tryserver (keys(%libserv)) { |
foreach my $tryserver (keys(%libserv)) { |
if ( ( $hostidflag == 1 |
if ( ( $hostidflag == 1 |
&& grep(/^\Q$tryserver\E$/,@{$hostidref}) ) |
&& grep(/^\Q$tryserver\E$/,@{$hostidref}) ) |
|| (!defined($hostidflag)) ) { |
|| (!defined($hostidflag)) ) { |
|
|
if ($domfilter eq '' |
if (($domfilter eq '') || |
|| (&host_domain($tryserver) eq $domfilter)) { |
(&host_domain($tryserver) eq $domfilter)) { |
foreach my $line ( |
my $rep = |
split(/\&/,&reply('courseiddump:'.&host_domain($tryserver).':'. |
&reply('courseiddump:'.&host_domain($tryserver).':'. |
$sincefilter.':'.&escape($descfilter).':'. |
$sincefilter.':'.&escape($descfilter).':'. |
&escape($instcodefilter).':'.&escape($ownerfilter).':'.&escape($coursefilter).':'.&escape($typefilter).':'.&escape($regexp_ok), |
&escape($instcodefilter).':'.&escape($ownerfilter). |
$tryserver))) { |
':'.&escape($coursefilter).':'.&escape($typefilter). |
my ($key,$value)=split(/\=/,$line,2); |
':'.&escape($regexp_ok).':'.$as_hash,$tryserver); |
if (($key) && ($value)) { |
my @pairs=split(/\&/,$rep); |
$returnhash{&unescape($key)}=$value; |
foreach my $item (@pairs) { |
} |
my ($key,$value)=split(/\=/,$item,2); |
|
$key = &unescape($key); |
|
next if ($key =~ /^error: 2 /); |
|
my $result = &thaw_unescape($value); |
|
if (ref($result) eq 'HASH') { |
|
$returnhash{$key}=$result; |
|
} else { |
|
my @responses = split(/:/,$value); |
|
my @items = ('description','inst_code','owner','type'); |
|
for (my $i=0; $i<@responses; $i++) { |
|
$returnhash{$key}{$items[$i]} = &unescape($responses[$i]); |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
Line 2518 sub get_domain_roles {
|
Line 2666 sub get_domain_roles {
|
if (undef($enddate) || $enddate eq '') { |
if (undef($enddate) || $enddate eq '') { |
$enddate = '.'; |
$enddate = '.'; |
} |
} |
my $rolelist = join(':',@{$roles}); |
my $rolelist; |
|
if (ref($roles) eq 'ARRAY') { |
|
$rolelist = join(':',@{$roles}); |
|
} |
my %personnel = (); |
my %personnel = (); |
|
|
my %servers = &get_servers($dom,'library'); |
my %servers = &get_servers($dom,'library'); |
Line 2544 sub get_first_access {
|
Line 2695 sub get_first_access {
|
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
if ($argsymb) { $symb=$argsymb; } |
if ($argsymb) { $symb=$argsymb; } |
my ($map,$id,$res)=&decode_symb($symb); |
my ($map,$id,$res)=&decode_symb($symb); |
if ($type eq 'map') { |
if ($type eq 'course') { |
|
$res='course'; |
|
} elsif ($type eq 'map') { |
$res=&symbread($map); |
$res=&symbread($map); |
} else { |
} else { |
$res=$symb; |
$res=$symb; |
Line 2557 sub set_first_access {
|
Line 2710 sub set_first_access {
|
my ($type)=@_; |
my ($type)=@_; |
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
my ($symb,$courseid,$udom,$uname)=&whichuser(); |
my ($map,$id,$res)=&decode_symb($symb); |
my ($map,$id,$res)=&decode_symb($symb); |
if ($type eq 'map') { |
if ($type eq 'course') { |
|
$res='course'; |
|
} elsif ($type eq 'map') { |
$res=&symbread($map); |
$res=&symbread($map); |
} else { |
} else { |
$res=$symb; |
$res=$symb; |
Line 3372 sub set_userprivs {
|
Line 3527 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 4713 sub auto_run {
|
Line 4868 sub auto_run {
|
$response = 1; |
$response = 1; |
} |
} |
} else { |
} else { |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver; |
$response = &reply('autorun:'.$cdom,$homeserver); |
if (&is_course($cdom,$cnum)) { |
|
$homeserver = &homeserver($cnum,$cdom); |
|
} else { |
|
$homeserver = &domain($cdom,'primary'); |
|
} |
|
if ($homeserver ne 'no_host') { |
|
$response = &reply('autorun:'.$cdom,$homeserver); |
|
} |
} |
} |
return $response; |
return $response; |
} |
} |
Line 4918 sub auto_instcode_defaults {
|
Line 5080 sub auto_instcode_defaults {
|
} |
} |
|
|
sub auto_validate_class_sec { |
sub auto_validate_class_sec { |
my ($cdom,$cnum,$owner,$inst_class) = @_; |
my ($cdom,$cnum,$owners,$inst_class) = @_; |
my $homeserver = &homeserver($cnum,$cdom); |
my $homeserver = &homeserver($cnum,$cdom); |
|
my $ownerlist; |
|
if (ref($owners) eq 'ARRAY') { |
|
$ownerlist = join(',',@{$owners}); |
|
} else { |
|
$ownerlist = $owners; |
|
} |
my $response=&reply('autovalidateclass_sec:'.$inst_class.':'. |
my $response=&reply('autovalidateclass_sec:'.$inst_class.':'. |
&escape($owner).':'.$cdom,$homeserver); |
&escape($ownerlist).':'.$cdom,$homeserver); |
return $response; |
return $response; |
} |
} |
|
|
Line 5114 sub assignrole {
|
Line 5282 sub assignrole {
|
} else { |
} else { |
my $cwosec=$url; |
my $cwosec=$url; |
$cwosec=~s/^\/($match_domain)\/($match_courseid)\/.*/$1\/$2/; |
$cwosec=~s/^\/($match_domain)\/($match_courseid)\/.*/$1\/$2/; |
unless ((&allowed('c'.$role,$cwosec)) || &allowed('c'.$role,$udom)) { |
if (!(&allowed('c'.$role,$cwosec)) && !(&allowed('c'.$role,$udom))) { |
&logthis('Refused assignrole: '. |
my $refused; |
$udom.' '.$uname.' '.$url.' '.$role.' '.$end.' '.$start.' by '. |
if (($env{'request.course.sec'} ne '') && ($role eq 'st')) { |
$env{'user.name'}.' at '.$env{'user.domain'}); |
if (!(&allowed('c'.$role,$url))) { |
return 'refused'; |
$refused = 1; |
|
} |
|
} else { |
|
$refused = 1; |
|
} |
|
if ($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 5450 sub createcourse {
|
Line 5628 sub createcourse {
|
} |
} |
# ----------------------------------------------------------------- Course made |
# ----------------------------------------------------------------- Course made |
# log existence |
# log existence |
&courseidput($udom,&escape($udom.'_'.$uname).'='.&escape($description). |
my $newcourse = { |
':'.&escape($inst_code).':'.&escape($course_owner).':'. |
$udom.'_'.$uname => { |
&escape($crstype),$uhome); |
description => $description, |
&flushcourselogs(); |
inst_code => $inst_code, |
|
owner => $course_owner, |
|
type => $crstype, |
|
}, |
|
}; |
|
&courseidput($udom,$newcourse,$uhome,'notime'); |
# set toplevel url |
# set toplevel url |
my $topurl=$url; |
my $topurl=$url; |
unless ($nonstandard) { |
unless ($nonstandard) { |
Line 5483 ENDINITMAP
|
Line 5666 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,'.',undef,1); |
if (exists($courses{$cdom.'_'.$cnum})) { |
if (exists($courses{$cdom.'_'.$cnum})) { |
return 1; |
return 1; |
} |
} |
Line 6255 sub resdata {
|
Line 6438 sub resdata {
|
} |
} |
if (!ref($result)) { return $result; } |
if (!ref($result)) { return $result; } |
foreach my $item (@which) { |
foreach my $item (@which) { |
if (defined($result->{$item})) { |
if (defined($result->{$item->[0]})) { |
return $result->{$item}; |
return [$result->{$item->[0]},$item->[1]]; |
} |
} |
} |
} |
return undef; |
return undef; |
Line 6468 sub EXT {
|
Line 6651 sub EXT {
|
# ----------------------------------------------------------- first, check user |
# ----------------------------------------------------------- first, check user |
|
|
my $userreply=&resdata($uname,$udom,'user', |
my $userreply=&resdata($uname,$udom,'user', |
($courselevelr,$courselevelm, |
([$courselevelr,'resource'], |
$courselevel)); |
[$courselevelm,'map' ], |
if (defined($userreply)) { return $userreply; } |
[$courselevel, 'course' ])); |
|
if (defined($userreply)) { return &get_reply($userreply); } |
|
|
# ------------------------------------------------ second, check some of course |
# ------------------------------------------------ second, check some of course |
my $coursereply; |
my $coursereply; |
if (@groups > 0) { |
if (@groups > 0) { |
$coursereply = &check_group_parms($courseid,\@groups,$symbparm, |
$coursereply = &check_group_parms($courseid,\@groups,$symbparm, |
$mapparm,$spacequalifierrest); |
$mapparm,$spacequalifierrest); |
if (defined($coursereply)) { return $coursereply; } |
if (defined($coursereply)) { return &get_reply($coursereply); } |
} |
} |
|
|
$coursereply=&resdata($env{'course.'.$courseid.'.num'}, |
$coursereply=&resdata($env{'course.'.$courseid.'.num'}, |
$env{'course.'.$courseid.'.domain'}, |
$env{'course.'.$courseid.'.domain'}, |
'course', |
'course', |
($seclevelr,$seclevelm,$seclevel, |
([$seclevelr, 'resource'], |
$courselevelr)); |
[$seclevelm, 'map' ], |
if (defined($coursereply)) { return $coursereply; } |
[$seclevel, 'course' ], |
|
[$courselevelr,'resource'])); |
|
if (defined($coursereply)) { return &get_reply($coursereply); } |
|
|
# ------------------------------------------------------ third, check map parms |
# ------------------------------------------------------ third, check map parms |
my %parmhash=(); |
my %parmhash=(); |
Line 6496 sub EXT {
|
Line 6682 sub EXT {
|
$thisparm=$parmhash{$symbparm}; |
$thisparm=$parmhash{$symbparm}; |
untie(%parmhash); |
untie(%parmhash); |
} |
} |
if ($thisparm) { return $thisparm; } |
if ($thisparm) { return &get_reply([$thisparm,'resource']); } |
} |
} |
# ------------------------------------------ fourth, look in resource metadata |
# ------------------------------------------ fourth, look in resource metadata |
|
|
Line 6509 sub EXT {
|
Line 6695 sub EXT {
|
$filename=$env{'request.filename'}; |
$filename=$env{'request.filename'}; |
} |
} |
my $metadata=&metadata($filename,$spacequalifierrest); |
my $metadata=&metadata($filename,$spacequalifierrest); |
if (defined($metadata)) { return $metadata; } |
if (defined($metadata)) { return &get_reply([$metadata,'resource']); } |
$metadata=&metadata($filename,'parameter_'.$spacequalifierrest); |
$metadata=&metadata($filename,'parameter_'.$spacequalifierrest); |
if (defined($metadata)) { return $metadata; } |
if (defined($metadata)) { return &get_reply([$metadata,'resource']); } |
|
|
# ---------------------------------------------- fourth, look in rest pf course |
# ---------------------------------------------- fourth, look in rest of course |
if ($symbparm && defined($courseid) && |
if ($symbparm && defined($courseid) && |
$courseid eq $env{'request.course.id'}) { |
$courseid eq $env{'request.course.id'}) { |
my $coursereply=&resdata($env{'course.'.$courseid.'.num'}, |
my $coursereply=&resdata($env{'course.'.$courseid.'.num'}, |
$env{'course.'.$courseid.'.domain'}, |
$env{'course.'.$courseid.'.domain'}, |
'course', |
'course', |
($courselevelm,$courselevel)); |
([$courselevelm,'map' ], |
if (defined($coursereply)) { return $coursereply; } |
[$courselevel, 'course'])); |
|
if (defined($coursereply)) { return &get_reply($coursereply); } |
} |
} |
# ------------------------------------------------------------------ Cascade up |
# ------------------------------------------------------------------ Cascade up |
unless ($space eq '0') { |
unless ($space eq '0') { |
Line 6528 sub EXT {
|
Line 6715 sub EXT {
|
my $id=pop(@parts); |
my $id=pop(@parts); |
my $part=join('_',@parts); |
my $part=join('_',@parts); |
if ($part eq '') { $part='0'; } |
if ($part eq '') { $part='0'; } |
my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest, |
my @partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest, |
$symbparm,$udom,$uname,$section,1); |
$symbparm,$udom,$uname,$section,1); |
if (defined($partgeneral)) { return $partgeneral; } |
if (defined($partgeneral[0])) { return &get_reply(\@partgeneral); } |
} |
} |
if ($recurse) { return undef; } |
if ($recurse) { return undef; } |
my $pack_def=&packages_tab_default($filename,$varname); |
my $pack_def=&packages_tab_default($filename,$varname); |
if (defined($pack_def)) { return $pack_def; } |
if (defined($pack_def)) { return &get_reply([$pack_def,'resource']); } |
|
|
# ---------------------------------------------------- Any other user namespace |
# ---------------------------------------------------- Any other user namespace |
} elsif ($realm eq 'environment') { |
} elsif ($realm eq 'environment') { |
# ----------------------------------------------------------------- environment |
# ----------------------------------------------------------------- environment |
Line 6563 sub EXT {
|
Line 6749 sub EXT {
|
return ''; |
return ''; |
} |
} |
|
|
|
sub get_reply { |
|
my ($reply_value) = @_; |
|
if (ref($reply_value) eq 'ARRAY') { |
|
if (wantarray) { |
|
return @$reply_value; |
|
} |
|
return $reply_value->[0]; |
|
} else { |
|
return $reply_value; |
|
} |
|
} |
|
|
sub check_group_parms { |
sub check_group_parms { |
my ($courseid,$groups,$symbparm,$mapparm,$what) = @_; |
my ($courseid,$groups,$symbparm,$mapparm,$what) = @_; |
my @groupitems = (); |
my @groupitems = (); |
my $resultitem; |
my $resultitem; |
my @levels = ($symbparm,$mapparm,$what); |
my @levels = ([$symbparm,'resource'],[$mapparm,'map'],[$what,'course']); |
foreach my $group (@{$groups}) { |
foreach my $group (@{$groups}) { |
foreach my $level (@levels) { |
foreach my $level (@levels) { |
my $item = $courseid.'.['.$group.'].'.$level; |
my $item = $courseid.'.['.$group.'].'.$level->[0]; |
push(@groupitems,$item); |
push(@groupitems,[$item,$level->[1]]); |
} |
} |
} |
} |
my $coursereply = &resdata($env{'course.'.$courseid.'.num'}, |
my $coursereply = &resdata($env{'course.'.$courseid.'.num'}, |
Line 6664 sub metadata {
|
Line 6862 sub metadata {
|
if (($uri eq '') || |
if (($uri eq '') || |
(($uri =~ m|^/*adm/|) && |
(($uri =~ m|^/*adm/|) && |
($uri !~ m|^adm/includes|) && ($uri !~ m|/bulletinboard$|)) || |
($uri !~ m|^adm/includes|) && ($uri !~ m|/bulletinboard$|)) || |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ /^~/) || |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) ) { |
($uri =~ m|home/$match_username/public_html/|)) { |
return undef; |
|
} |
|
if (($uri =~ /^~/ || $uri =~ m{home/$match_username/public_html/}) |
|
&& &Apache::lonxml::get_state('target') =~ /^(|meta)$/) { |
return undef; |
return undef; |
} |
} |
my $filename=$uri; |
my $filename=$uri; |
Line 6686 sub metadata {
|
Line 6887 sub metadata {
|
# if (! exists($metacache{$uri})) { |
# if (! exists($metacache{$uri})) { |
# $metacache{$uri}={}; |
# $metacache{$uri}={}; |
# } |
# } |
|
my $cachetime = 60*60; |
if ($liburi) { |
if ($liburi) { |
$liburi=&declutter($liburi); |
$liburi=&declutter($liburi); |
$filename=$liburi; |
$filename=$liburi; |
Line 6696 sub metadata {
|
Line 6898 sub metadata {
|
my %metathesekeys=(); |
my %metathesekeys=(); |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
my $metastring; |
my $metastring; |
if ($uri !~ m -^(editupload)/-) { |
if ($uri =~ /^~/ || $uri =~ m{home/$match_username/public_html/}) { |
|
my $which = &hreflocation('','/'.($liburi || $uri)); |
|
$metastring = |
|
&Apache::lonnet::ssi_body($which, |
|
('grade_target' => 'meta')); |
|
$cachetime = 1; # only want this cached in the child not long term |
|
} elsif ($uri !~ m -^(editupload)/-) { |
my $file=&filelocation('',&clutter($filename)); |
my $file=&filelocation('',&clutter($filename)); |
#push(@{$metaentry{$uri.'.file'}},$file); |
#push(@{$metaentry{$uri.'.file'}},$file); |
$metastring=&getfile($file); |
$metastring=&getfile($file); |
Line 6863 sub metadata {
|
Line 7071 sub metadata {
|
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
$metaentry{':keys'} = join(',',keys(%metathesekeys)); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
&metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); |
$metaentry{':allpossiblekeys'}=join(',',keys %metathesekeys); |
$metaentry{':allpossiblekeys'}=join(',',keys %metathesekeys); |
&do_cache_new('meta',$uri,\%metaentry,60*60); |
&do_cache_new('meta',$uri,\%metaentry,$cachetime); |
# this is the end of "was not already recently cached |
# this is the end of "was not already recently cached |
} |
} |
return $metaentry{':'.$what}; |
return $metaentry{':'.$what}; |
Line 7811 sub filelocation {
|
Line 8019 sub filelocation {
|
} |
} |
} |
} |
$location=~s://+:/:g; # remove duplicate / |
$location=~s://+:/:g; # remove duplicate / |
while ($location=~m:/\.\./:) {$location=~ s:/[^/]+/\.\./:/:g;} #remove dir/.. |
while ($location=~m{/\.\./}) { |
|
if ($location =~ m{/[^/]+/\.\./}) { |
|
$location=~ s{/[^/]+/\.\./}{/}g; |
|
} else { |
|
$location=~ s{/\.\./}{/}g; |
|
} |
|
} #remove dir/.. |
while ($location=~m:/\./:) {$location=~ s:/\./:/:g;} #remove /./ |
while ($location=~m:/\./:) {$location=~ s:/\./:/:g;} #remove /./ |
return $location; |
return $location; |
} |
} |
Line 7832 sub hreflocation {
|
Line 8046 sub hreflocation {
|
$file=~s-^/home/httpd/lonUsers/($match_domain)/./././($match_name)/userfiles/ |
$file=~s-^/home/httpd/lonUsers/($match_domain)/./././($match_name)/userfiles/ |
-/uploaded/$1/$2/-x; |
-/uploaded/$1/$2/-x; |
} |
} |
|
if ($file=~ m{^/userfiles/}) { |
|
$file =~ s{^/userfiles/}{/uploaded/}; |
|
} |
return $file; |
return $file; |
} |
} |
|
|
Line 8674 explanation of a user role term
|
Line 8891 explanation of a user role term
|
|
|
=item * |
=item * |
|
|
get_my_roles($uname,$udom,$context,$types,$roles,$roledoms) : |
get_my_roles($uname,$udom,$context,$types,$roles,$roledoms,$withsec) : |
All arguments are optional. Returns a hash of a roles, either for |
All arguments are optional. Returns a hash of a roles, either for |
co-author/assistant author roles for a user's Construction Space |
co-author/assistant author roles for a user's Construction Space |
(default), or if $context is 'userroles', roles for the user himself, |
(default), or if $context is 'userroles', roles for the user himself, |
In the hash, keys are set to colon-sparated $uname,$udom,and $role, |
In the hash, keys are set to colon-separated $uname,$udom,$role, and |
and value is set to colon-separated start and end times for the role. |
(optionally) if $withsec is true, a fourth colon-separated item - $section. |
If no username and domain are specified, will default to current |
For each key, value is set to colon-separated start and end times for |
user/domain. Types, roles, and roledoms are references to arrays, |
the role. If no username and domain are specified, will default to |
|
current user/domain. Types, roles, and roledoms are references to arrays |
of role statuses (active, future or previous), roles |
of role statuses (active, future or previous), roles |
(e.g., cc,in, st etc.) and domains of the roles which can be used |
(e.g., cc,in, st etc.) and domains of the roles which can be used |
to restrict the list of roles reported. If no array ref is |
to restrict the list of roles reported. If no array ref is |