version 1.1161, 2012/03/20 13:36:22
|
version 1.1162, 2012/03/31 23:10:55
|
Line 3907 sub load_all_first_access {
|
Line 3907 sub load_all_first_access {
|
} |
} |
|
|
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 3923 sub get_first_access {
|
Line 3924 sub get_first_access {
|
} |
} |
|
|
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 3934 sub set_first_access {
|
Line 3935 sub set_first_access {
|
$res=$symb; |
$res=$symb; |
} |
} |
$cachedkey=''; |
$cachedkey=''; |
my $firstaccess=&get_first_access($type,$symb); |
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'; |
} |
} |
Line 4569 sub rolesinit {
|
Line 4583 sub rolesinit {
|
($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 4608 sub rolesinit {
|
Line 4634 sub rolesinit {
|
} else { |
} else { |
&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 4616 sub rolesinit {
|
Line 4663 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 5997 sub allowed {
|
Line 6044 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 6008 sub allowed {
|
Line 6060 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 6060 sub allowed {
|
Line 6117 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 6088 sub allowed {
|
Line 6155 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 6247 sub allowed {
|
Line 6324 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; |
|
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; |
|
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); |
|
} else { |
|
my $mapsymb = &symbread($item,1); |
|
if ($mapsymb) { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $mapres = $navmap->getBySymb($mapsymb); |
|
my @resources = $mapres->retrieveResources($mapres,undef,0,1); |
|
foreach my $res (@resources) { |
|
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) { |
|
unless (grep(/^\Q$block\E$/,@blockers)) { |
|
push(@blockers,$block); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
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. |