version 1.1136, 2011/10/17 12:41:39
|
version 1.1168, 2012/05/18 15:31:40
|
Line 76 use HTTP::Date;
|
Line 76 use HTTP::Date;
|
use Image::Magick; |
use Image::Magick; |
|
|
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
use vars qw(%perlvar %spareid %pr %prp $memcache %packagetab $tmpdir |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease); |
$_64bit %env %protocol %loncaparevs %serverhomeIDs %needsrelease |
|
%managerstab); |
|
|
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
my (%badServerCache, $memcache, %courselogs, %accesshash, %domainrolehash, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
%userrolehash, $processmarker, $dumpcount, %coursedombuf, |
Line 95 use Math::Random;
|
Line 96 use Math::Random;
|
use File::MMagic; |
use File::MMagic; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA::Configuration; |
use LONCAPA::Configuration; |
|
use LONCAPA::lonmetadata; |
|
use LONCAPA::Lond; |
|
|
use File::Copy; |
use File::Copy; |
|
|
Line 594 sub transfer_profile_to_env {
|
Line 597 sub transfer_profile_to_env {
|
|
|
# ---------------------------------------------------- Check for valid session |
# ---------------------------------------------------- Check for valid session |
sub check_for_valid_session { |
sub check_for_valid_session { |
my ($r) = @_; |
my ($r,$name) = @_; |
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
my %cookies=CGI::Cookie->parse($r->header_in('Cookie')); |
my $lonid=$cookies{'lonID'}; |
if ($name eq '') { |
|
$name = 'lonID'; |
|
} |
|
my $lonid=$cookies{$name}; |
return undef if (!$lonid); |
return undef if (!$lonid); |
|
|
my $handle=&LONCAPA::clean_handle($lonid->value); |
my $handle=&LONCAPA::clean_handle($lonid->value); |
my $lonidsdir=$r->dir_config('lonIDsDir'); |
my $lonidsdir; |
|
if ($name eq 'lonDAV') { |
|
$lonidsdir=$r->dir_config('lonDAVsessDir'); |
|
} else { |
|
$lonidsdir=$r->dir_config('lonIDsDir'); |
|
} |
return undef if (!-e "$lonidsdir/$handle.id"); |
return undef if (!-e "$lonidsdir/$handle.id"); |
|
|
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
my $opened = open(my $idf,'+<',"$lonidsdir/$handle.id"); |
Line 929 sub choose_server {
|
Line 940 sub choose_server {
|
my %domconfhash = &Apache::loncommon::get_domainconf($udom); |
my %domconfhash = &Apache::loncommon::get_domainconf($udom); |
my %servers = &get_servers($udom); |
my %servers = &get_servers($udom); |
my $lowest_load = 30000; |
my $lowest_load = 30000; |
my ($login_host,$hostname,$portal_path); |
my ($login_host,$hostname,$portal_path,$isredirect); |
foreach my $lonhost (keys(%servers)) { |
foreach my $lonhost (keys(%servers)) { |
my $loginvia; |
my $loginvia; |
if ($checkloginvia) { |
if ($checkloginvia) { |
Line 940 sub choose_server {
|
Line 951 sub choose_server {
|
&compare_server_load($server, $login_host, $lowest_load); |
&compare_server_load($server, $login_host, $lowest_load); |
if ($login_host eq $server) { |
if ($login_host eq $server) { |
$portal_path = $path; |
$portal_path = $path; |
|
$isredirect = 1; |
} |
} |
} else { |
} else { |
($login_host, $lowest_load) = |
($login_host, $lowest_load) = |
&compare_server_load($lonhost, $login_host, $lowest_load); |
&compare_server_load($lonhost, $login_host, $lowest_load); |
if ($login_host eq $lonhost) { |
if ($login_host eq $lonhost) { |
$portal_path = ''; |
$portal_path = ''; |
|
$isredirect = ''; |
} |
} |
} |
} |
} else { |
} else { |
Line 956 sub choose_server {
|
Line 969 sub choose_server {
|
if ($login_host ne '') { |
if ($login_host ne '') { |
$hostname = &hostname($login_host); |
$hostname = &hostname($login_host); |
} |
} |
return ($login_host,$hostname,$portal_path); |
return ($login_host,$hostname,$portal_path,$isredirect); |
} |
} |
|
|
# --------------------------------------------- Try to change a user's password |
# --------------------------------------------- Try to change a user's password |
Line 1523 sub idput {
|
Line 1536 sub idput {
|
|
|
# ------------------------------dump from db file owned by domainconfig user |
# ------------------------------dump from db file owned by domainconfig user |
sub dump_dom { |
sub dump_dom { |
my ($namespace,$udom,$regexp,$range)=@_; |
my ($namespace, $udom, $regexp) = @_; |
if (!$udom) { |
|
$udom=$env{'user.domain'}; |
$udom ||= $env{'user.domain'}; |
} |
|
my %returnhash; |
return () unless $udom; |
if ($udom) { |
|
my $uname = &get_domainconfiguser($udom); |
return &dump($namespace, $udom, &get_domainconfiguser($udom), $regexp); |
%returnhash = &dump($namespace,$udom,$uname,$regexp,$range); |
|
} |
|
return %returnhash; |
|
} |
} |
|
|
# ------------------------------------------ get items from domain db files |
# ------------------------------------------ get items from domain db files |
Line 1919 sub get_domain_defaults {
|
Line 1929 sub get_domain_defaults {
|
$domdefaults{'auth_arg_def'} = $domconfig{'defaults'}{'auth_arg_def'}; |
$domdefaults{'auth_arg_def'} = $domconfig{'defaults'}{'auth_arg_def'}; |
$domdefaults{'timezone_def'} = $domconfig{'defaults'}{'timezone_def'}; |
$domdefaults{'timezone_def'} = $domconfig{'defaults'}{'timezone_def'}; |
$domdefaults{'datelocale_def'} = $domconfig{'defaults'}{'datelocale_def'}; |
$domdefaults{'datelocale_def'} = $domconfig{'defaults'}{'datelocale_def'}; |
|
$domdefaults{'portal_def'} = $domconfig{'defaults'}{'portal_def'}; |
} else { |
} else { |
$domdefaults{'lang_def'} = &domain($domain,'lang_def'); |
$domdefaults{'lang_def'} = &domain($domain,'lang_def'); |
$domdefaults{'auth_def'} = &domain($domain,'auth_def'); |
$domdefaults{'auth_def'} = &domain($domain,'auth_def'); |
Line 2145 sub getsection {
|
Line 2156 sub getsection {
|
# If there is a role which has expired, return it. |
# If there is a role which has expired, return it. |
# |
# |
$courseid = &courseid_to_courseurl($courseid); |
$courseid = &courseid_to_courseurl($courseid); |
my $extra = &freeze_escape({'skipcheck' => 1}); |
my %roleshash = &dump('roles',$udom,$unam,$courseid); |
my %roleshash = &dump('roles',$udom,$unam,$courseid,undef,$extra); |
|
foreach my $key (keys(%roleshash)) { |
foreach my $key (keys(%roleshash)) { |
next if ($key !~/^\Q$courseid\E(?:\/)*(\w+)*\_st$/); |
next if ($key !~/^\Q$courseid\E(?:\/)*(\w+)*\_st$/); |
my $section=$1; |
my $section=$1; |
Line 2428 sub subscribe {
|
Line 2438 sub subscribe {
|
sub repcopy { |
sub repcopy { |
my $filename=shift; |
my $filename=shift; |
$filename=~s/\/+/\//g; |
$filename=~s/\/+/\//g; |
if ($filename=~m|^/home/httpd/html/adm/|) { return 'ok'; } |
my $londocroot = $perlvar{'lonDocRoot'}; |
if ($filename=~m|^/home/httpd/html/lonUsers/|) { return 'ok'; } |
if ($filename=~m{^\Q$londocroot/adm/\E}) { return 'ok'; } |
if ($filename=~m|^/home/httpd/html/userfiles/| or |
if ($filename=~m{^\Q/home/httpd/lonUsers/\E}) { return 'ok'; } |
$filename=~m -^/*(uploaded|editupload)/-) { |
if ($filename=~m{^\Q$londocroot/userfiles/\E} or |
|
$filename=~m{^/*(uploaded|editupload)/}) { |
return &repcopy_userfile($filename); |
return &repcopy_userfile($filename); |
} |
} |
$filename=~s/[\n\r]//g; |
$filename=~s/[\n\r]//g; |
Line 2458 sub repcopy {
|
Line 2469 sub repcopy {
|
unless ($home eq $perlvar{'lonHostID'}) { |
unless ($home eq $perlvar{'lonHostID'}) { |
my @parts=split(/\//,$filename); |
my @parts=split(/\//,$filename); |
my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]"; |
my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]"; |
if ($path ne "$perlvar{'lonDocRoot'}/res") { |
if ($path ne "$londocroot/res") { |
&logthis("Malconfiguration for replication: $filename"); |
&logthis("Malconfiguration for replication: $filename"); |
return 'bad_request'; |
return 'bad_request'; |
} |
} |
Line 2796 sub resizeImage {
|
Line 2807 sub resizeImage {
|
# $resizewidth - width (pixels) to which to resize uploaded image |
# $resizewidth - width (pixels) to which to resize uploaded image |
# $resizeheight - height (pixels) to which to resize uploaded image |
# $resizeheight - height (pixels) to which to resize uploaded image |
# $mimetype - reference to scalar to accommodate mime type determined |
# $mimetype - reference to scalar to accommodate mime type determined |
# from File::MMagic if $parser = parse. |
# from File::MMagic. |
# |
# |
# output: url of file in userspace, or error: <message> |
# output: url of file in userspace, or error: <message> |
# or /adm/notfound.html if failure to upload occurse |
# or /adm/notfound.html if failure to upload occurse |
Line 2965 sub finishuserfileupload {
|
Line 2976 sub finishuserfileupload {
|
} |
} |
} |
} |
} |
} |
|
if (($context eq 'coursedoc') || ($parser eq 'parse')) { |
|
if (ref($mimetype)) { |
|
if ($$mimetype eq '') { |
|
my $mm = new File::MMagic; |
|
my $type = $mm->checktype_filename($filepath.'/'.$file); |
|
$$mimetype = $type; |
|
} |
|
} |
|
} |
if ($parser eq 'parse') { |
if ($parser eq 'parse') { |
my $mm = new File::MMagic; |
if ((ref($mimetype)) && ($$mimetype eq 'text/html')) { |
my $type = $mm->checktype_filename($filepath.'/'.$file); |
|
if ($type eq 'text/html') { |
|
my $parse_result = &extract_embedded_items($filepath.'/'.$file, |
my $parse_result = &extract_embedded_items($filepath.'/'.$file, |
$allfiles,$codebase); |
$allfiles,$codebase); |
unless ($parse_result eq 'ok') { |
unless ($parse_result eq 'ok') { |
Line 2976 sub finishuserfileupload {
|
Line 2994 sub finishuserfileupload {
|
' for embedded media: '.$parse_result); |
' for embedded media: '.$parse_result); |
} |
} |
} |
} |
if (ref($mimetype)) { |
|
$$mimetype = $type; |
|
} |
|
} |
} |
if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { |
if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) { |
my $input = $filepath.'/'.$file; |
my $input = $filepath.'/'.$file; |
Line 3015 sub finishuserfileupload {
|
Line 3030 sub finishuserfileupload {
|
sub extract_embedded_items { |
sub extract_embedded_items { |
my ($fullpath,$allfiles,$codebase,$content) = @_; |
my ($fullpath,$allfiles,$codebase,$content) = @_; |
my @state = (); |
my @state = (); |
|
my (%lastids,%related,%shockwave,%flashvars); |
my %javafiles = ( |
my %javafiles = ( |
codebase => '', |
codebase => '', |
code => '', |
code => '', |
Line 3044 sub extract_embedded_items {
|
Line 3060 sub extract_embedded_items {
|
&add_filetype($allfiles,$attr->{'href'},'href'); |
&add_filetype($allfiles,$attr->{'href'},'href'); |
} |
} |
if (lc($tagname) eq 'script') { |
if (lc($tagname) eq 'script') { |
|
my $src; |
if ($attr->{'archive'} =~ /\.jar$/i) { |
if ($attr->{'archive'} =~ /\.jar$/i) { |
&add_filetype($allfiles,$attr->{'archive'},'archive'); |
&add_filetype($allfiles,$attr->{'archive'},'archive'); |
} else { |
} else { |
&add_filetype($allfiles,$attr->{'src'},'src'); |
if ($attr->{'src'} ne '') { |
|
$src = $attr->{'src'}; |
|
&add_filetype($allfiles,$src,'src'); |
|
} |
|
} |
|
my $text = $p->get_trimmed_text(); |
|
if ($text =~ /\Qswfobject.registerObject(\E([^\)]+)\)/) { |
|
my @swfargs = split(/,/,$1); |
|
foreach my $item (@swfargs) { |
|
$item =~ s/["']//g; |
|
$item =~ s/^\s+//; |
|
$item =~ s/\s+$//; |
|
} |
|
if (($swfargs[0] ne'') && ($swfargs[2] ne '')) { |
|
if (ref($related{$swfargs[0]}) eq 'ARRAY') { |
|
push(@{$related{$swfargs[0]}},$swfargs[2]); |
|
} else { |
|
$related{$swfargs[0]} = [$swfargs[2]]; |
|
} |
|
} |
} |
} |
} |
} |
if (lc($tagname) eq 'link') { |
if (lc($tagname) eq 'link') { |
Line 3060 sub extract_embedded_items {
|
Line 3096 sub extract_embedded_items {
|
foreach my $item (keys(%javafiles)) { |
foreach my $item (keys(%javafiles)) { |
$javafiles{$item} = ''; |
$javafiles{$item} = ''; |
} |
} |
|
if ((lc($tagname) eq 'object') && (lc($state[-2]) ne 'object')) { |
|
$lastids{lc($tagname)} = $attr->{'id'}; |
|
} |
} |
} |
if (lc($state[-2]) eq 'object' && lc($tagname) eq 'param') { |
if (lc($state[-2]) eq 'object' && lc($tagname) eq 'param') { |
my $name = lc($attr->{'name'}); |
my $name = lc($attr->{'name'}); |
Line 3069 sub extract_embedded_items {
|
Line 3108 sub extract_embedded_items {
|
last; |
last; |
} |
} |
} |
} |
|
my $pathfrom; |
foreach my $item (keys(%mediafiles)) { |
foreach my $item (keys(%mediafiles)) { |
if ($name eq $item) { |
if ($name eq $item) { |
&add_filetype($allfiles, $attr->{'value'}, 'value'); |
$pathfrom = $attr->{'value'}; |
|
$shockwave{$lastids{lc($state[-2])}} = $pathfrom; |
|
&add_filetype($allfiles,$pathfrom,$name); |
last; |
last; |
} |
} |
} |
} |
|
if ($name eq 'flashvars') { |
|
$flashvars{$lastids{lc($state[-2])}} = $attr->{'value'}; |
|
} |
|
if ($pathfrom ne '') { |
|
&embedded_dependency($allfiles,\%related,$lastids{lc($state[-2])}, |
|
$pathfrom); |
|
} |
} |
} |
if (lc($tagname) eq 'embed' || lc($tagname) eq 'applet') { |
if (lc($tagname) eq 'embed' || lc($tagname) eq 'applet') { |
foreach my $item (keys(%javafiles)) { |
foreach my $item (keys(%javafiles)) { |
Line 3089 sub extract_embedded_items {
|
Line 3138 sub extract_embedded_items {
|
last; |
last; |
} |
} |
} |
} |
|
if (lc($tagname) eq 'embed') { |
|
if (($attr->{'name'} ne '') && ($attr->{'src'} ne '')) { |
|
&embedded_dependency($allfiles,\%related,$attr->{'name'}, |
|
$attr->{'src'}); |
|
} |
|
} |
} |
} |
|
if ($t->[4] =~ m{/>$}) { |
|
pop(@state); |
|
} |
} elsif ($t->[0] eq 'E') { |
} elsif ($t->[0] eq 'E') { |
my ($tagname) = ($t->[1]); |
my ($tagname) = ($t->[1]); |
if ($javafiles{'codebase'} ne '') { |
if ($javafiles{'codebase'} ne '') { |
Line 3109 sub extract_embedded_items {
|
Line 3167 sub extract_embedded_items {
|
pop @state; |
pop @state; |
} |
} |
} |
} |
|
foreach my $id (sort(keys(%flashvars))) { |
|
if ($shockwave{$id} ne '') { |
|
my @pairs = split(/\&/,$flashvars{$id}); |
|
foreach my $pair (@pairs) { |
|
my ($key,$value) = split(/\=/,$pair); |
|
if ($key eq 'thumb') { |
|
&add_filetype($allfiles,$value,$key); |
|
} elsif ($key eq 'content') { |
|
my ($path) = ($shockwave{$id} =~ m{^(.+/)[^/]+$}); |
|
my ($ext) = ($value =~ /\.([^.]+)$/); |
|
if ($ext ne '') { |
|
&add_filetype($allfiles,$path.$value,$ext); |
|
} |
|
} |
|
} |
|
} |
|
} |
return 'ok'; |
return 'ok'; |
} |
} |
|
|
Line 3123 sub add_filetype {
|
Line 3198 sub add_filetype {
|
} |
} |
} |
} |
|
|
|
sub embedded_dependency { |
|
my ($allfiles,$related,$identifier,$pathfrom) = @_; |
|
if ((ref($allfiles) eq 'HASH') && (ref($related) eq 'HASH')) { |
|
if (($identifier ne '') && |
|
(ref($related->{$identifier}) eq 'ARRAY') && |
|
($pathfrom ne '')) { |
|
my ($path) = ($pathfrom =~ m{^(.+/)[^/]+$}); |
|
foreach my $dep (@{$related->{$identifier}}) { |
|
&add_filetype($allfiles,$path.$dep,'object'); |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
sub removeuploadedurl { |
sub removeuploadedurl { |
my ($url)=@_; |
my ($url)=@_; |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
Line 3249 sub flushcourselogs {
|
Line 3339 sub flushcourselogs {
|
my $result = &inc('nohist_accesscount',\%temphash,$dom,$name); |
my $result = &inc('nohist_accesscount',\%temphash,$dom,$name); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
delete $accesshash{$entry}; |
delete $accesshash{$entry}; |
} elsif ($result eq 'unknown_cmd') { |
|
# Target server has old code running on it. |
|
my %temphash=($entry => $value); |
|
if (&put('nohist_resevaldata',\%temphash,$dom,$name) eq 'ok') { |
|
delete $accesshash{$entry}; |
|
} |
|
} |
} |
} else { |
} else { |
my ($dom,$name) = ($entry=~m{___($match_domain)/($match_name)/(.*)___(\w+)$}); |
my ($dom,$name) = ($entry=~m{___($match_domain)/($match_name)/(.*)___(\w+)$}); |
|
if (($dom eq 'uploaded') || ($dom eq 'adm')) { next; } |
my %temphash=($entry => $accesshash{$entry}); |
my %temphash=($entry => $accesshash{$entry}); |
if (&put('nohist_resevaldata',\%temphash,$dom,$name) eq 'ok') { |
if (&put('nohist_resevaldata',\%temphash,$dom,$name) eq 'ok') { |
delete $accesshash{$entry}; |
delete $accesshash{$entry}; |
Line 3336 sub courseacclog {
|
Line 3421 sub courseacclog {
|
my $fnsymb=shift; |
my $fnsymb=shift; |
unless ($env{'request.course.id'}) { return ''; } |
unless ($env{'request.course.id'}) { return ''; } |
my $what=$fnsymb.':'.$env{'user.name'}.':'.$env{'user.domain'}; |
my $what=$fnsymb.':'.$env{'user.name'}.':'.$env{'user.domain'}; |
if ($fnsymb=~/(problem|exam|quiz|assess|survey|form|task|page)$/) { |
if ($fnsymb=~/$LONCAPA::assess_re/) { |
$what.=':POST'; |
$what.=':POST'; |
# FIXME: Probably ought to escape things.... |
# FIXME: Probably ought to escape things.... |
foreach my $key (keys(%env)) { |
foreach my $key (keys(%env)) { |
Line 3368 sub countacc {
|
Line 3453 sub countacc {
|
my $url=&declutter(shift); |
my $url=&declutter(shift); |
return if (! defined($url) || $url eq ''); |
return if (! defined($url) || $url eq ''); |
unless ($env{'request.course.id'}) { return ''; } |
unless ($env{'request.course.id'}) { return ''; } |
|
# |
|
# Mark that this url was used in this course |
|
# |
$accesshash{$env{'request.course.id'}.'___'.$url.'___course'}=1; |
$accesshash{$env{'request.course.id'}.'___'.$url.'___course'}=1; |
|
# |
|
# Increase the access count for this resource in this child process |
|
# |
my $key=$$.$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
my $key=$$.$processmarker.'_'.$dumpcount.'___'.$url.'___count'; |
$accesshash{$key}++; |
$accesshash{$key}++; |
} |
} |
Line 3380 sub linklog {
|
Line 3471 sub linklog {
|
$accesshash{$from.'___'.$to.'___comefrom'}=1; |
$accesshash{$from.'___'.$to.'___comefrom'}=1; |
$accesshash{$to.'___'.$from.'___goto'}=1; |
$accesshash{$to.'___'.$from.'___goto'}=1; |
} |
} |
|
|
|
sub statslog { |
|
my ($symb,$part,$users,$av_attempts,$degdiff)=@_; |
|
if ($users<2) { return; } |
|
my %dynstore=&LONCAPA::lonmetadata::dynamic_metadata_storage({ |
|
'course' => $env{'request.course.id'}, |
|
'sections' => '"all"', |
|
'num_students' => $users, |
|
'part' => $part, |
|
'symb' => $symb, |
|
'mean_tries' => $av_attempts, |
|
'deg_of_diff' => $degdiff}); |
|
foreach my $key (keys(%dynstore)) { |
|
$accesshash{$key}=$dynstore{$key}; |
|
} |
|
} |
|
|
sub userrolelog { |
sub userrolelog { |
my ($trole,$username,$domain,$area,$tstart,$tend)=@_; |
my ($trole,$username,$domain,$area,$tstart,$tend)=@_; |
Line 3513 sub get_my_roles {
|
Line 3620 sub get_my_roles {
|
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
unless (defined($udom)) { $udom=$env{'user.domain'}; } |
my (%dumphash,%nothide); |
my (%dumphash,%nothide); |
if ($context eq 'userroles') { |
if ($context eq 'userroles') { |
my $extra = &freeze_escape({'skipcheck' => 1}); |
%dumphash = &dump('roles',$udom,$uname); |
%dumphash = &dump('roles',$udom,$uname,'.',undef,$extra); |
|
} else { |
} else { |
%dumphash= |
%dumphash= |
&dump('nohist_userroles',$udom,$uname); |
&dump('nohist_userroles',$udom,$uname); |
Line 3535 sub get_my_roles {
|
Line 3641 sub get_my_roles {
|
foreach my $entry (keys(%dumphash)) { |
foreach my $entry (keys(%dumphash)) { |
my ($role,$tend,$tstart); |
my ($role,$tend,$tstart); |
if ($context eq 'userroles') { |
if ($context eq 'userroles') { |
|
next if ($entry =~ /^rolesdef/); |
($role,$tend,$tstart)=split(/_/,$dumphash{$entry}); |
($role,$tend,$tstart)=split(/_/,$dumphash{$entry}); |
} else { |
} else { |
($tend,$tstart)=split(/\:/,$dumphash{$entry}); |
($tend,$tstart)=split(/\:/,$dumphash{$entry}); |
Line 3848 sub get_domain_roles {
|
Line 3955 sub get_domain_roles {
|
|
|
# ----------------------------------------------------------- Interval timing |
# ----------------------------------------------------------- Interval timing |
|
|
|
{ |
|
# Caches needed for speedup of navmaps |
|
# We don't want to cache this for very long at all (5 seconds at most) |
|
# |
|
# The user for whom we cache |
|
my $cachedkey=''; |
|
# The cached times for this user |
|
my %cachedtimes=(); |
|
# When this was last done |
|
my $cachedtime=(); |
|
|
|
sub load_all_first_access { |
|
my ($uname,$udom)=@_; |
|
if (($cachedkey eq $uname.':'.$udom) && |
|
(abs($cachedtime-time)<5)) { |
|
return; |
|
} |
|
$cachedtime=time; |
|
$cachedkey=$uname.':'.$udom; |
|
%cachedtimes=&dump('firstaccesstimes',$udom,$uname); |
|
} |
|
|
sub get_first_access { |
sub get_first_access { |
my ($type,$argsymb)=@_; |
my ($type,$argsymb,$argmap)=@_; |
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 ($argmap) { $map = $argmap; } |
if ($type eq 'course') { |
if ($type eq 'course') { |
$res='course'; |
$res='course'; |
} elsif ($type eq 'map') { |
} elsif ($type eq 'map') { |
Line 3860 sub get_first_access {
|
Line 3990 sub get_first_access {
|
} else { |
} else { |
$res=$symb; |
$res=$symb; |
} |
} |
my %times=&get('firstaccesstimes',["$courseid\0$res"],$udom,$uname); |
&load_all_first_access($uname,$udom); |
return $times{"$courseid\0$res"}; |
return $cachedtimes{"$courseid\0$res"}; |
} |
} |
|
|
sub set_first_access { |
sub set_first_access { |
my ($type)=@_; |
my ($type,$interval)=@_; |
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 'course') { |
if ($type eq 'course') { |
Line 3875 sub set_first_access {
|
Line 4005 sub set_first_access {
|
} else { |
} else { |
$res=$symb; |
$res=$symb; |
} |
} |
my $firstaccess=&get_first_access($type,$symb); |
$cachedkey=''; |
|
my $firstaccess=&get_first_access($type,$symb,$map); |
if (!$firstaccess) { |
if (!$firstaccess) { |
return &put('firstaccesstimes',{"$courseid\0$res"=>time},$udom,$uname); |
my $start = time; |
|
my $putres = &put('firstaccesstimes',{"$courseid\0$res"=>$start}, |
|
$udom,$uname); |
|
if ($putres eq 'ok') { |
|
&put('timerinterval',{"$courseid\0$res"=>$interval}, |
|
$udom,$uname); |
|
&appenv( |
|
{ |
|
'course.'.$courseid.'.firstaccess.'.$res => $start, |
|
'course.'.$courseid.'.timerinterval.'.$res => $interval, |
|
} |
|
); |
|
} |
|
return $putres; |
} |
} |
return 'already_set'; |
return 'already_set'; |
} |
} |
|
} |
# --------------------------------------------- Set Expire Date for Spreadsheet |
# --------------------------------------------- Set Expire Date for Spreadsheet |
|
|
sub expirespread { |
sub expirespread { |
Line 4504 sub rolesinit {
|
Line 4648 sub rolesinit {
|
my ($domain,$username,$authhost)=@_; |
my ($domain,$username,$authhost)=@_; |
my $now=time; |
my $now=time; |
my %userroles = ('user.login.time' => $now); |
my %userroles = ('user.login.time' => $now); |
my $extra = &freeze_escape({'skipcheck' => 1}); |
my $rolesdump=reply("dump:$domain:$username:roles",$authhost); |
my $rolesdump=reply("dump:$domain:$username:roles:.::$extra",$authhost); |
|
if (($rolesdump eq 'con_lost') || ($rolesdump eq '') || |
if (($rolesdump eq 'con_lost') || ($rolesdump eq '') || |
($rolesdump =~ /^error:/)) { |
($rolesdump =~ /^error:/)) { |
return \%userroles; |
return \%userroles; |
} |
} |
|
my %firstaccess = &dump('firstaccesstimes',$domain,$username); |
|
my %timerinterval = &dump('timerinterval',$domain,$username); |
|
my (%coursetimerstarts,%firstaccchk,%firstaccenv, |
|
%coursetimerintervals,%timerintchk,%timerintenv); |
|
foreach my $key (keys(%firstaccess)) { |
|
my ($cid,$rest) = split(/\0/,$key); |
|
$coursetimerstarts{$cid}{$rest} = $firstaccess{$key}; |
|
} |
|
foreach my $key (keys(%timerinterval)) { |
|
my ($cid,$rest) = split(/\0/,$key); |
|
$coursetimerintervals{$cid}{$rest} = $timerinterval{$key}; |
|
} |
my %allroles=(); |
my %allroles=(); |
my %allgroups=(); |
my %allgroups=(); |
|
|
if ($rolesdump ne '') { |
if ($rolesdump ne '') { |
foreach my $entry (split(/&/,$rolesdump)) { |
foreach my $entry (split(/&/,$rolesdump)) { |
Line 4519 sub rolesinit {
|
Line 4674 sub rolesinit {
|
my ($area,$role)=split(/=/,$entry); |
my ($area,$role)=split(/=/,$entry); |
$area=~s/\_\w\w$//; |
$area=~s/\_\w\w$//; |
my ($trole,$tend,$tstart,$group_privs); |
my ($trole,$tend,$tstart,$group_privs); |
if ($role=~/^cr/) { |
if ($role=~/^cr/) { |
|
# Custom role, defined by a user |
|
# e.g., user.role.cr/msu/smith/mynewrole |
if ($role=~m|^(cr/$match_domain/$match_username/[a-zA-Z0-9]+)_(.*)$|) { |
if ($role=~m|^(cr/$match_domain/$match_username/[a-zA-Z0-9]+)_(.*)$|) { |
($trole,my $trest)=($role=~m|^(cr/$match_domain/$match_username/[a-zA-Z0-9]+)_(.*)$|); |
($trole,my $trest)=($role=~m|^(cr/$match_domain/$match_username/[a-zA-Z0-9]+)_(.*)$|); |
($tend,$tstart)=split('_',$trest); |
($tend,$tstart)=split('_',$trest); |
Line 4527 sub rolesinit {
|
Line 4684 sub rolesinit {
|
$trole=$role; |
$trole=$role; |
} |
} |
} elsif ($role =~ m|^gr/|) { |
} elsif ($role =~ m|^gr/|) { |
|
# Role of member in a group, defined within a course/community |
|
# e.g., user.role.gr/msu/04935610a19ee4a5fmsul1/leopards |
($trole,$tend,$tstart) = split(/_/,$role); |
($trole,$tend,$tstart) = split(/_/,$role); |
next if ($tstart eq '-1'); |
next if ($tstart eq '-1'); |
($trole,$group_privs) = split(/\//,$trole); |
($trole,$group_privs) = split(/\//,$trole); |
$group_privs = &unescape($group_privs); |
$group_privs = &unescape($group_privs); |
} else { |
} else { |
|
# Just a normal role, defined in roles.tab |
($trole,$tend,$tstart)=split(/_/,$role); |
($trole,$tend,$tstart)=split(/_/,$role); |
} |
} |
my %new_role = &set_arearole($trole,$area,$tstart,$tend,$domain, |
my %new_role = &set_arearole($trole,$area,$tstart,$tend,$domain, |
Line 4543 sub rolesinit {
|
Line 4703 sub rolesinit {
|
my $spec=$trole.'.'.$area; |
my $spec=$trole.'.'.$area; |
my ($tdummy,$tdomain,$trest)=split(/\//,$area); |
my ($tdummy,$tdomain,$trest)=split(/\//,$area); |
if ($trole =~ /^cr\//) { |
if ($trole =~ /^cr\//) { |
|
# Custom role, defined by a user |
&custom_roleprivs(\%allroles,$trole,$tdomain,$trest,$spec,$area); |
&custom_roleprivs(\%allroles,$trole,$tdomain,$trest,$spec,$area); |
} elsif ($trole eq 'gr') { |
} elsif ($trole eq 'gr') { |
|
# Role of a member in a group, defined within a course/community |
&group_roleprivs(\%allgroups,$area,$group_privs,$tend,$tstart); |
&group_roleprivs(\%allgroups,$area,$group_privs,$tend,$tstart); |
} else { |
} else { |
|
# Normal role, defined in roles.tab |
&standard_roleprivs(\%allroles,$trole,$tdomain,$spec,$trest,$area); |
&standard_roleprivs(\%allroles,$trole,$tdomain,$spec,$trest,$area); |
} |
} |
|
if ($trole ne 'gr') { |
|
my $cid = $tdomain.'_'.$trest; |
|
unless ($firstaccchk{$cid}) { |
|
if (ref($coursetimerstarts{$cid}) eq 'HASH') { |
|
foreach my $item (keys(%{$coursetimerstarts{$cid}})) { |
|
$firstaccenv{'course.'.$cid.'.firstaccess.'.$item} = |
|
$coursetimerstarts{$cid}{$item}; |
|
} |
|
} |
|
$firstaccchk{$cid} = 1; |
|
} |
|
unless ($timerintchk{$cid}) { |
|
if (ref($coursetimerintervals{$cid}) eq 'HASH') { |
|
foreach my $item (keys(%{$coursetimerintervals{$cid}})) { |
|
$timerintenv{'course.'.$cid.'.timerinterval.'.$item} = |
|
$coursetimerintervals{$cid}{$item}; |
|
} |
|
} |
|
$timerintchk{$cid} = 1; |
|
} |
|
} |
} |
} |
} |
} |
} |
} |
Line 4557 sub rolesinit {
|
Line 4741 sub rolesinit {
|
$userroles{'user.author'} = $author; |
$userroles{'user.author'} = $author; |
$env{'user.adv'}=$adv; |
$env{'user.adv'}=$adv; |
} |
} |
return \%userroles; |
return (\%userroles,\%firstaccenv,\%timerintenv); |
} |
} |
|
|
sub set_arearole { |
sub set_arearole { |
Line 4892 sub del {
|
Line 5076 sub del {
|
# -------------------------------------------------------------- dump interface |
# -------------------------------------------------------------- dump interface |
|
|
sub dump { |
sub dump { |
my ($namespace,$udomain,$uname,$regexp,$range,$extra)=@_; |
my ($namespace,$udomain,$uname,$regexp,$range)=@_; |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$udomain) { $udomain=$env{'user.domain'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
if (!$uname) { $uname=$env{'user.name'}; } |
my $uhome=&homeserver($uname,$udomain); |
my $uhome=&homeserver($uname,$udomain); |
|
|
if ($regexp) { |
if ($regexp) { |
$regexp=&escape($regexp); |
$regexp=&escape($regexp); |
} else { |
} else { |
$regexp='.'; |
$regexp='.'; |
} |
} |
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range:$extra",$uhome); |
my $rep=&reply("dump:$udomain:$uname:$namespace:$regexp:$range",$uhome); |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
my %returnhash=(); |
my %returnhash=(); |
if (!($rep =~ /^error/ )) { |
if (!($rep =~ /^error/ )) { |
Line 5909 sub allowed {
|
Line 6094 sub allowed {
|
} |
} |
} |
} |
|
|
|
# User who is not author or co-author might still be able to edit |
|
# resource of an author in the domain (e.g., if Domain Coordinator). |
|
if (($priv eq 'eco') && ($thisallowed eq '') && ($env{'request.course.id'}) && |
|
(&allowed('mdc',$env{'request.course.id'}))) { |
|
if ($env{"user.priv.cm./$uri/"}=~/\Q$priv\E\&([^\:]*)/) { |
|
$thisallowed.=$1; |
|
} |
|
} |
|
|
# Course: uri itself is a course |
# Course: uri itself is a course |
my $courseuri=$uri; |
my $courseuri=$uri; |
$courseuri=~s/\_(\d)/\/$1/; |
$courseuri=~s/\_(\d)/\/$1/; |
Line 5929 sub allowed {
|
Line 6123 sub allowed {
|
if ($match) { |
if ($match) { |
if ($env{'user.priv.'.$env{'request.role'}.'./'} |
if ($env{'user.priv.'.$env{'request.role'}.'./'} |
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
$thisallowed.=$1; |
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$1; |
|
} |
} |
} |
} else { |
} else { |
my $refuri = $env{'httpref.'.$orguri} || $env{'httpref.'.$ver_orguri}; |
my $refuri = $env{'httpref.'.$orguri} || $env{'httpref.'.$ver_orguri}; |
Line 5940 sub allowed {
|
Line 6139 sub allowed {
|
$refuri=&declutter($refuri); |
$refuri=&declutter($refuri); |
my ($match) = &is_on_map($refuri); |
my ($match) = &is_on_map($refuri); |
if ($match) { |
if ($match) { |
$thisallowed='F'; |
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed='F'; |
|
} |
} |
} |
} |
} |
} |
} |
Line 5992 sub allowed {
|
Line 6196 sub allowed {
|
$statecond=$cond; |
$statecond=$cond; |
if ($env{'user.priv.'.$env{'request.role'}.'./'.$courseprivid} |
if ($env{'user.priv.'.$env{'request.role'}.'./'.$courseprivid} |
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
$thisallowed.=$1; |
my $value = $1; |
|
if ($priv eq 'bre') { |
|
my @blockers = &has_comm_blocking($priv,$symb,$uri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
|
} else { |
|
$thisallowed.=$value; |
|
} |
$checkreferer=0; |
$checkreferer=0; |
} |
} |
} |
} |
Line 6020 sub allowed {
|
Line 6234 sub allowed {
|
my $refstatecond=$cond; |
my $refstatecond=$cond; |
if ($env{'user.priv.'.$env{'request.role'}.'./'.$courseprivid} |
if ($env{'user.priv.'.$env{'request.role'}.'./'.$courseprivid} |
=~/\Q$priv\E\&([^\:]*)/) { |
=~/\Q$priv\E\&([^\:]*)/) { |
$thisallowed.=$1; |
my $value = $1; |
|
if ($priv eq 'bre') { |
|
my @blockers = &has_comm_blocking($priv,$symb,$refuri); |
|
if (@blockers > 0) { |
|
$thisallowed = 'B'; |
|
} else { |
|
$thisallowed.=$value; |
|
} |
|
} else { |
|
$thisallowed.=$value; |
|
} |
$uri=$refuri; |
$uri=$refuri; |
$statecond=$refstatecond; |
$statecond=$refstatecond; |
} |
} |
Line 6179 sub allowed {
|
Line 6403 sub allowed {
|
} |
} |
return 'F'; |
return 'F'; |
} |
} |
|
|
|
sub get_comm_blocks { |
|
my ($cdom,$cnum) = @_; |
|
if ($cdom eq '' || $cnum eq '') { |
|
return unless ($env{'request.course.id'}); |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
} |
|
my %commblocks; |
|
my $hashid=$cdom.'_'.$cnum; |
|
my ($blocksref,$cached)=&is_cached_new('comm_block',$hashid); |
|
if ((defined($cached)) && (ref($blocksref) eq 'HASH')) { |
|
%commblocks = %{$blocksref}; |
|
} else { |
|
%commblocks = &Apache::lonnet::dump('comm_block',$cdom,$cnum); |
|
my $cachetime = 600; |
|
&do_cache_new('comm_block',$hashid,\%commblocks,$cachetime); |
|
} |
|
return %commblocks; |
|
} |
|
|
|
sub has_comm_blocking { |
|
my ($priv,$symb,$uri,$blocks) = @_; |
|
return unless ($env{'request.course.id'}); |
|
return unless ($priv eq 'bre'); |
|
return if ($env{'user.priv.'.$env{'request.role'}} =~/evb\&([^\:]*)/); |
|
my %commblocks; |
|
if (ref($blocks) eq 'HASH') { |
|
%commblocks = %{$blocks}; |
|
} else { |
|
%commblocks = &get_comm_blocks(); |
|
} |
|
return unless (keys(%commblocks) > 0); |
|
if (!$symb) { $symb=&symbread($uri,1); } |
|
my ($map,$resid,undef)=&decode_symb($symb); |
|
my %tocheck = ( |
|
maps => $map, |
|
resources => $symb, |
|
); |
|
my @blockers; |
|
my $now = time; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
foreach my $block (keys(%commblocks)) { |
|
if ($block =~ /^(\d+)____(\d+)$/) { |
|
my ($start,$end) = ($1,$2); |
|
if ($start <= $now && $end >= $now) { |
|
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}{'maps'}) eq 'HASH') { |
|
if ($commblocks{$block}{'blocks'}{'docs'}{'maps'}{$map}) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
|
} |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}{'resources'}) eq 'HASH') { |
|
if ($commblocks{$block}{'blocks'}{'docs'}{'resources'}{$symb}) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} elsif ($block =~ /^firstaccess____(.+)$/) { |
|
my $item = $1; |
|
my @to_test; |
|
if (ref($commblocks{$block}{'blocks'}) eq 'HASH') { |
|
if (ref($commblocks{$block}{'blocks'}{'docs'}) eq 'HASH') { |
|
my $check_interval; |
|
if (&check_docs_block($commblocks{$block}{'blocks'}{'docs'},\%tocheck)) { |
|
my @interval; |
|
my $type = 'map'; |
|
if ($item eq 'course') { |
|
$type = 'course'; |
|
@interval=&EXT("resource.0.interval"); |
|
} else { |
|
if ($item =~ /___\d+___/) { |
|
$type = 'resource'; |
|
@interval=&EXT("resource.0.interval",$item); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($item); |
|
push(@to_test,$res); |
|
} |
|
} else { |
|
my $mapsymb = &symbread($item,1); |
|
if ($mapsymb) { |
|
if (ref($navmap)) { |
|
my $mapres = $navmap->getBySymb($mapsymb); |
|
@to_test = $mapres->retrieveResources($mapres,undef,0,1); |
|
foreach my $res (@to_test) { |
|
my $symb = $res->symb(); |
|
next if ($symb eq $mapsymb); |
|
if ($symb ne '') { |
|
@interval=&EXT("resource.0.interval",$symb); |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($interval[0] =~ /\d+/) { |
|
my $first_access; |
|
if ($type eq 'resource') { |
|
$first_access=&get_first_access($interval[1],$item); |
|
} elsif ($type eq 'map') { |
|
$first_access=&get_first_access($interval[1],undef,$item); |
|
} else { |
|
$first_access=&get_first_access($interval[1]); |
|
} |
|
if ($first_access) { |
|
my $timesup = $first_access+$interval[0]; |
|
if ($timesup > $now) { |
|
foreach my $res (@to_test) { |
|
if ($res->is_problem()) { |
|
if ($res->completable()) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return @blockers; |
|
} |
|
|
|
sub check_docs_block { |
|
my ($docsblock,$tocheck) =@_; |
|
if ((ref($docsblock) ne 'HASH') || (ref($tocheck) ne 'HASH')) { |
|
return; |
|
} |
|
if (ref($docsblock->{'maps'}) eq 'HASH') { |
|
if ($tocheck->{'maps'}) { |
|
if ($docsblock->{'maps'}{$tocheck->{'maps'}}) { |
|
return 1; |
|
} |
|
} |
|
} |
|
if (ref($docsblock->{'resources'}) eq 'HASH') { |
|
if ($tocheck->{'resources'}) { |
|
if ($docsblock->{'resources'}{$tocheck->{'resources'}}) { |
|
return 1; |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
# |
# |
# Removes the versino from a URI and |
# Removes the versino from a URI and |
# splits it in to its filename and path to the filename. |
# splits it in to its filename and path to the filename. |
Line 6914 sub get_users_groups {
|
Line 7296 sub get_users_groups {
|
} else { |
} else { |
$grouplist = ''; |
$grouplist = ''; |
my $courseurl = &courseid_to_courseurl($courseid); |
my $courseurl = &courseid_to_courseurl($courseid); |
my $extra = &freeze_escape({'skipcheck' => 1}); |
my %roleshash = &dump('roles',$udom,$uname,$courseurl); |
my %roleshash = &dump('roles',$udom,$uname,$courseurl,undef,$extra); |
|
my $access_end = $env{'course.'.$courseid. |
my $access_end = $env{'course.'.$courseid. |
'.default_enrollment_end_date'}; |
'.default_enrollment_end_date'}; |
my $now = time; |
my $now = time; |
Line 7503 sub modify_student_enrollment {
|
Line 7884 sub modify_student_enrollment {
|
$uid = $tmp{'id'} if (!defined($uid) || $uid eq ''); |
$uid = $tmp{'id'} if (!defined($uid) || $uid eq ''); |
} |
} |
my $fullname = &format_name($first,$middle,$last,$gene,'lastname'); |
my $fullname = &format_name($first,$middle,$last,$gene,'lastname'); |
|
my $user = "$uname:$udom"; |
|
my %old_entry = &Apache::lonnet::get('classlist',[$user],$cdom,$cnum); |
my $reply=cput('classlist', |
my $reply=cput('classlist', |
{"$uname:$udom" => |
{$user => |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype) }, |
join(':',$end,$start,$uid,$usec,$fullname,$type,$locktype) }, |
$cdom,$cnum); |
$cdom,$cnum); |
unless (($reply eq 'ok') || ($reply eq 'delayed')) { |
if (($reply eq 'ok') || ($reply eq 'delayed')) { |
|
&devalidate_getsection_cache($udom,$uname,$cid); |
|
} else { |
return 'error: '.$reply; |
return 'error: '.$reply; |
} else { |
|
&devalidate_getsection_cache($udom,$uname,$cid); |
|
} |
} |
# Add student role to user |
# Add student role to user |
my $uurl='/'.$cid; |
my $uurl='/'.$cid; |
Line 7518 sub modify_student_enrollment {
|
Line 7901 sub modify_student_enrollment {
|
if ($usec) { |
if ($usec) { |
$uurl.='/'.$usec; |
$uurl.='/'.$usec; |
} |
} |
return &assignrole($udom,$uname,$uurl,'st',$end,$start,undef,$selfenroll,$context); |
my $result = &assignrole($udom,$uname,$uurl,'st',$end,$start,undef, |
|
$selfenroll,$context); |
|
if ($result ne 'ok') { |
|
if ($old_entry{$user} ne '') { |
|
$reply = &cput('classlist',\%old_entry,$cdom,$cnum); |
|
} else { |
|
$reply = &del('classlist',[$user],$cdom,$cnum); |
|
} |
|
} |
|
return $result; |
} |
} |
|
|
sub format_name { |
sub format_name { |
Line 7717 sub generate_coursenum {
|
Line 8109 sub generate_coursenum {
|
} |
} |
|
|
sub is_course { |
sub is_course { |
my ($cdom,$cnum) = @_; |
my ($cdom, $cnum) = scalar(@_) == 1 ? |
my %courses = &courseiddump($cdom,'.',1,'.','.',$cnum,undef, |
($_[0] =~ /^($match_domain)_($match_courseid)$/) : @_; |
undef,'.'); |
|
if (exists($courses{$cdom.'_'.$cnum})) { |
return unless $cdom and $cnum; |
return 1; |
|
} |
my %courses = &courseiddump($cdom, '.', 1, '.', '.', $cnum, undef, undef, |
return 0; |
'.'); |
|
|
|
return unless exists($courses{$cdom.'_'.$cnum}); |
|
return wantarray ? ($cdom, $cnum) : $cdom.'_'.$cnum; |
} |
} |
|
|
sub store_userdata { |
sub store_userdata { |
Line 8698 sub EXT {
|
Line 9093 sub EXT {
|
} elsif ($realm eq 'request') { |
} elsif ($realm eq 'request') { |
# ------------------------------------------------------------- request.browser |
# ------------------------------------------------------------- request.browser |
if ($space eq 'browser') { |
if ($space eq 'browser') { |
if ($qualifier eq 'textremote') { |
return $env{'browser.'.$qualifier}; |
if (&Apache::lonlocal::mt('textual_remote_display') eq 'on') { |
|
return 1; |
|
} else { |
|
return 0; |
|
} |
|
} else { |
|
return $env{'browser.'.$qualifier}; |
|
} |
|
# ------------------------------------------------------------ request.filename |
# ------------------------------------------------------------ request.filename |
} else { |
} else { |
return $env{'request.'.$spacequalifierrest}; |
return $env{'request.'.$spacequalifierrest}; |
Line 8990 sub metadata {
|
Line 9377 sub metadata {
|
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
($uri =~ m|/$|) || ($uri =~ m|/.meta$|) || ($uri =~ m{^/*uploaded/.+\.sequence$})) { |
return undef; |
return undef; |
} |
} |
if (($uri =~ /^~/ || $uri =~ m{home/$match_username/public_html/}) |
if (($uri =~ /^priv/ || $uri=~/home\/httpd\/html\/priv/) |
&& &Apache::lonxml::get_state('target') =~ /^(|meta)$/) { |
&& &Apache::lonxml::get_state('target') =~ /^(|meta)$/) { |
return undef; |
return undef; |
} |
} |
Line 9027 sub metadata {
|
Line 9414 sub metadata {
|
my %metathesekeys=(); |
my %metathesekeys=(); |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
unless ($filename=~/\.meta$/) { $filename.='.meta'; } |
my $metastring; |
my $metastring; |
if ($uri =~ /^~/ || $uri =~ m{home/$match_username/public_html/}) { |
if ($uri =~ /^priv/ || $uri=~/home\/httpd\/html\/priv/) { |
my $which = &hreflocation('','/'.($liburi || $uri)); |
my $which = &hreflocation('','/'.($liburi || $uri)); |
$metastring = |
$metastring = |
&Apache::lonnet::ssi_body($which, |
&Apache::lonnet::ssi_body($which, |
Line 9351 sub gettitle {
|
Line 9738 sub gettitle {
|
} |
} |
$title=~s/\&colon\;/\:/gs; |
$title=~s/\&colon\;/\:/gs; |
if ($title) { |
if ($title) { |
|
# Remember both $symb and $title for dynamic metadata |
|
$accesshash{$symb.'___crstitle'}=$title; |
|
$accesshash{&declutter($map).'___'.&declutter($url).'___usage'}=time; |
|
# Cache this title and then return it |
return &do_cache_new('title',$key,$title,600); |
return &do_cache_new('title',$key,$title,600); |
} |
} |
$urlsymb=$url; |
$urlsymb=$url; |
Line 9383 sub get_slot {
|
Line 9774 sub get_slot {
|
} |
} |
return $slotinfo{$which}; |
return $slotinfo{$which}; |
} |
} |
|
|
|
sub get_reservable_slots { |
|
my ($cnum,$cdom,$uname,$udom) = @_; |
|
my $now = time; |
|
my $reservable_info; |
|
my $key=join("\0",'reservableslots',$cdom,$cnum,$uname,$udom); |
|
if (exists($remembered{$key})) { |
|
$reservable_info = $remembered{$key}; |
|
} else { |
|
my %resv; |
|
($resv{'now_order'},$resv{'now'},$resv{'future_order'},$resv{'future'}) = |
|
&Apache::loncommon::get_future_slots($cnum,$cdom,$now); |
|
$reservable_info = \%resv; |
|
$remembered{$key} = $reservable_info; |
|
} |
|
return $reservable_info; |
|
} |
|
|
|
sub get_course_slots { |
|
my ($cnum,$cdom) = @_; |
|
my $hashid=$cnum.':'.$cdom; |
|
my ($result,$cached) = &Apache::lonnet::is_cached_new('allslots',$hashid); |
|
if (defined($cached)) { |
|
if (ref($result) eq 'HASH') { |
|
return %{$result}; |
|
} |
|
} else { |
|
my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum); |
|
my ($tmp) = keys(%slots); |
|
if ($tmp !~ /^(con_lost|error|no_such_host)/i) { |
|
&Apache::lonnet::do_cache_new('allslots',$hashid,\%slots,600); |
|
return %slots; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub devalidate_slots_cache { |
|
my ($cnum,$cdom)=@_; |
|
my $hashid=$cnum.':'.$cdom; |
|
&devalidate_cache_new('allslots',$hashid); |
|
} |
|
|
# ------------------------------------------------- Update symbolic store links |
# ------------------------------------------------- Update symbolic store links |
|
|
sub symblist { |
sub symblist { |
Line 9748 sub rndseed {
|
Line 10182 sub rndseed {
|
if (!defined($symb)) { |
if (!defined($symb)) { |
unless ($symb=$wsymb) { return time; } |
unless ($symb=$wsymb) { return time; } |
} |
} |
if (!$courseid) { $courseid=$wcourseid; } |
if (!defined $courseid) { |
if (!$domain) { $domain=$wdomain; } |
$courseid=$wcourseid; |
if (!$username) { $username=$wusername } |
} |
|
if (!defined $domain) { $domain=$wdomain; } |
|
if (!defined $username) { $username=$wusername } |
|
|
my $which; |
my $which; |
if (defined($cenv->{'rndseed'})) { |
if (defined($cenv->{'rndseed'})) { |
Line 9758 sub rndseed {
|
Line 10194 sub rndseed {
|
} else { |
} else { |
$which =&get_rand_alg($courseid); |
$which =&get_rand_alg($courseid); |
} |
} |
|
|
if (defined(&getCODE())) { |
if (defined(&getCODE())) { |
|
|
if ($which eq '64bit5') { |
if ($which eq '64bit5') { |
Line 10084 sub getfile {
|
Line 10519 sub getfile {
|
|
|
sub repcopy_userfile { |
sub repcopy_userfile { |
my ($file)=@_; |
my ($file)=@_; |
if ($file =~ m -^/*(uploaded|editupload)/-) { $file=&filelocation("",$file); } |
my $londocroot = $perlvar{'lonDocRoot'}; |
if ($file =~ m|^/home/httpd/html/lonUsers/|) { return 'ok'; } |
if ($file =~ m{^/*(uploaded|editupload)/}) { $file=&filelocation("",$file); } |
|
if ($file =~ m{^\Q/home/httpd/lonUsers/\E}) { return 'ok'; } |
my ($cdom,$cnum,$filename) = |
my ($cdom,$cnum,$filename) = |
($file=~m|^\Q$perlvar{'lonDocRoot'}\E/+userfiles/+($match_domain)/+($match_name)/+(.*)|); |
($file=~m|^\Q$perlvar{'lonDocRoot'}\E/+userfiles/+($match_domain)/+($match_name)/+(.*)|); |
my $uri="/uploaded/$cdom/$cnum/$filename"; |
my $uri="/uploaded/$cdom/$cnum/$filename"; |
Line 10214 sub filelocation {
|
Line 10650 sub filelocation {
|
$file=~s-^/adm/coursedocs/showdoc/-/-; |
$file=~s-^/adm/coursedocs/showdoc/-/-; |
} |
} |
|
|
if ($file=~m:^/~:) { # is a contruction space reference |
if ($file =~ m-^\Q$Apache::lonnet::perlvar{'lonTabDir'}\E/-) { |
$location = $file; |
|
$location =~ s:/~(.*?)/(.*):/home/$1/public_html/$2:; |
|
} elsif ($file=~m{^/home/$match_username/public_html/}) { |
|
# is a correct contruction space reference |
|
$location = $file; |
|
} elsif ($file =~ m-^\Q$Apache::lonnet::perlvar{'lonTabDir'}\E/-) { |
|
$location = $file; |
$location = $file; |
} elsif ($file=~/^\/*(uploaded|editupload)/) { # is an uploaded file |
} elsif ($file=~/^\/*(uploaded|editupload)/) { # is an uploaded file |
my ($udom,$uname,$filename)= |
my ($udom,$uname,$filename)= |
Line 10239 sub filelocation {
|
Line 10669 sub filelocation {
|
$location = $perlvar{'lonDocRoot'}.'/'.$file; |
$location = $perlvar{'lonDocRoot'}.'/'.$file; |
} else { |
} else { |
$file=~s/^\Q$perlvar{'lonDocRoot'}\E//; |
$file=~s/^\Q$perlvar{'lonDocRoot'}\E//; |
$file=~s:^/res/:/:; |
$file=~s:^/(res|priv)/:/:; |
|
my $space=$1; |
if ( !( $file =~ m:^/:) ) { |
if ( !( $file =~ m:^/:) ) { |
$location = $dir. '/'.$file; |
$location = $dir. '/'.$file; |
} else { |
} else { |
$location = '/home/httpd/html/res'.$file; |
$location = $perlvar{'lonDocRoot'}.'/'.$space.$file; |
} |
} |
} |
} |
$location=~s://+:/:g; # remove duplicate / |
$location=~s://+:/:g; # remove duplicate / |
Line 10268 sub hreflocation {
|
Line 10699 sub hreflocation {
|
} |
} |
if ($file=~m-^\Q$perlvar{'lonDocRoot'}\E-) { |
if ($file=~m-^\Q$perlvar{'lonDocRoot'}\E-) { |
$file=~s-^\Q$perlvar{'lonDocRoot'}\E--; |
$file=~s-^\Q$perlvar{'lonDocRoot'}\E--; |
} elsif ($file=~m-/home/($match_username)/public_html/-) { |
|
$file=~s-^/home/($match_username)/public_html/-/~$1/-; |
|
} elsif ($file=~m-^\Q$perlvar{'lonUsersDir'}\E-) { |
} elsif ($file=~m-^\Q$perlvar{'lonUsersDir'}\E-) { |
$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/}) { |
if ($file=~ m{^/userfiles/}) { |
$file =~ s{^/userfiles/}{/uploaded/}; |
$file =~ s{^/userfiles/}{/uploaded/}; |
Line 10280 sub hreflocation {
|
Line 10709 sub hreflocation {
|
return $file; |
return $file; |
} |
} |
|
|
|
|
|
|
|
|
|
|
sub current_machine_domains { |
sub current_machine_domains { |
return &machine_domains(&hostname($perlvar{'lonHostID'})); |
return &machine_domains(&hostname($perlvar{'lonHostID'})); |
} |
} |
Line 10984 BEGIN {
|
Line 11417 BEGIN {
|
} |
} |
} |
} |
|
|
|
# ---------------------------------------------------------- Read managers table |
|
{ |
|
if (-e "$perlvar{'lonTabDir'}/managers.tab") { |
|
if (open(my $config,"<$perlvar{'lonTabDir'}/managers.tab")) { |
|
while (my $configline=<$config>) { |
|
chomp($configline); |
|
next if ($configline =~ /^\#/); |
|
if (($configline =~ /^[\w\-]+$/) || ($configline =~ /^[\w\-]+\:[\w\-]+$/)) { |
|
$managerstab{$configline} = 1; |
|
} |
|
} |
|
close($config); |
|
} |
|
} |
|
} |
|
|
# ------------- set up temporary directory |
# ------------- set up temporary directory |
{ |
{ |
$tmpdir = LONCAPA::tempdir(); |
$tmpdir = LONCAPA::tempdir(); |
Line 11540 createcourse($udom,$description,$url,$co
|
Line 11989 createcourse($udom,$description,$url,$co
|
|
|
generate_coursenum($udom,$crstype) : get a unique (unused) course number in domain $udom for course type $crstype (Course or Community). |
generate_coursenum($udom,$crstype) : get a unique (unused) course number in domain $udom for course type $crstype (Course or Community). |
|
|
|
=item * |
|
|
|
is_course($courseid), is_course($cdom, $cnum) |
|
|
|
Accepts either a combined $courseid (in the form of domain_courseid) or the |
|
two component version $cdom, $cnum. It checks if the specified course exists. |
|
|
|
Returns: |
|
undef if the course doesn't exist, otherwise |
|
in scalar context the combined courseid. |
|
in list context the two components of the course identifier, domain and |
|
courseid. |
|
|
=back |
=back |
|
|
=head2 Resource Subroutines |
=head2 Resource Subroutines |
Line 11836 or lonTabs/domain.tab.
|
Line 12298 or lonTabs/domain.tab.
|
|
|
=item * |
=item * |
|
|
dirlist($uri) : return directory list based on URI |
dirlist() : return directory list based on URI (first arg). |
|
|
|
Inputs: 1 required, 5 optional. |
|
|
|
=over |
|
|
|
=item |
|
$uri - path to file in filesystem (starts: /res or /userfiles/). Required. |
|
|
|
=item |
|
$userdomain - domain of user/course to be listed. Extracted from $uri if absent. |
|
|
|
=item |
|
$username - username of user/course to be listed. Extracted from $uri if absent. |
|
|
|
=item |
|
$getpropath - boolean: 1 if prepend path using &propath(). |
|
|
|
=item |
|
$getuserdir - boolean: 1 if prepend path for "userfiles". |
|
|
|
=item |
|
$alternateRoot - path to prepend in place of path from $uri. |
|
|
|
=back |
|
|
|
Returns: Array of up to two items. |
|
|
|
=over |
|
|
|
a reference to an array of files/subdirectories |
|
|
|
=over |
|
|
|
Each element in the array of files/subdirectories is a & separated list of |
|
item name and the result of running stat on the item. If dirlist was requested |
|
for a file instead of a directory, the item name will be ''. For a directory |
|
listing, if the item is a metadata file, the element will end &N&M |
|
(where N amd M are either 0 or 1, corresponding to obsolete set (1), or |
|
default copyright set (1). |
|
|
|
=back |
|
|
|
a scalar containing error condition (if encountered). |
|
|
|
=over |
|
|
|
=item |
|
no_host (no homeserver identified for $username:$domain). |
|
|
|
=item |
|
no_such_host (server contacted for listing not identified as valid host). |
|
|
|
=item |
|
con_lost (connection to remote server failed). |
|
|
|
=item |
|
refused (invalid $username:$domain received on lond side). |
|
|
|
=item |
|
no_such_dir (directory at specified path on lond side does not exist). |
|
|
|
=item |
|
empty (directory at specified path on lond side is empty). |
|
|
|
=over |
|
|
|
This is currently not encountered because the &ls3, &ls2, |
|
&ls (_handler) routines on the lond side do not filter out |
|
. and .. from a directory listing. |
|
|
|
=back |
|
|
|
=back |
|
|
|
=back |
|
|
=item * |
=item * |
|
|