version 1.1198, 2012/11/11 17:33:26
|
version 1.1210, 2013/02/02 00:22:47
|
Line 2671 sub can_edit_resource {
|
Line 2671 sub can_edit_resource {
|
# |
# |
# For aboutme pages user can only edit his/her own. |
# For aboutme pages user can only edit his/her own. |
# |
# |
if ($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) { |
if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) { |
my ($sdom,$sname) = ($1,$2); |
my ($sdom,$sname) = ($1,$2); |
if (($sdom eq $env{'user.domain'}) && ($sname eq $env{'user.name'})) { |
if (($sdom eq $env{'user.domain'}) && ($sname eq $env{'user.name'})) { |
$home = $env{'user.home'}; |
$home = $env{'user.home'}; |
Line 2716 sub can_edit_resource {
|
Line 2716 sub can_edit_resource {
|
return; |
return; |
} |
} |
} else { |
} else { |
|
if ($resurl =~ m{^/?adm/viewclasslist$}) { |
|
unless (&Apache::lonnet::allowed('opa',$env{'request.course.id'})) { |
|
return; |
|
} |
|
} elsif (!$crsedit) { |
# |
# |
# No edit allowed where CC has switched to student role. |
# No edit allowed where CC has switched to student role. |
# |
# |
unless ($crsedit) { |
|
return; |
return; |
} |
} |
} |
} |
Line 2732 sub can_edit_resource {
|
Line 2736 sub can_edit_resource {
|
$incourse = 1; |
$incourse = 1; |
if ($file =~/\.(htm|html|css|js|txt)$/) { |
if ($file =~/\.(htm|html|css|js|txt)$/) { |
$cfile = &hreflocation('',$file); |
$cfile = &hreflocation('',$file); |
$forceedit = 1; |
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
} |
} |
} elsif ($resurl =~ m{^/public/$cdom/$cnum/syllabus}) { |
} elsif ($resurl =~ m{^/public/$cdom/$cnum/syllabus}) { |
$incourse = 1; |
$incourse = 1; |
Line 2751 sub can_edit_resource {
|
Line 2759 sub can_edit_resource {
|
$forceedit = 1; |
$forceedit = 1; |
} |
} |
$cfile = $resurl; |
$cfile = $resurl; |
} elsif (($resurl eq '/res/lib/templates/simpleproblem.problem')) { |
} elsif ($resurl eq '/res/lib/templates/simpleproblem.problem') { |
$incourse = 1; |
$incourse = 1; |
$cfile = $resurl.'/smpedit'; |
$cfile = $resurl.'/smpedit'; |
} elsif ($resurl =~ /ext/) { |
} elsif ($resurl =~ m{^/adm/wrapper/ext/}) { |
$incourse = 1; |
$incourse = 1; |
# is external |
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
|
$cfile = $resurl; |
|
} elsif ($resurl =~ m{^/?adm/viewclasslist$}) { |
|
$incourse = 1; |
|
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
|
$cfile = ($resurl =~ m{^/} ? $resurl : "/$resurl"); |
} |
} |
} elsif ($resurl eq '/res/lib/templates/simpleproblem.problem/smpedit') { |
} elsif ($resurl eq '/res/lib/templates/simpleproblem.problem/smpedit') { |
my $template = '/res/lib/templates/simpleproblem.problem'; |
my $template = '/res/lib/templates/simpleproblem.problem'; |
Line 2765 sub can_edit_resource {
|
Line 2786 sub can_edit_resource {
|
$forceview = 1; |
$forceview = 1; |
$cfile = $template; |
$cfile = $template; |
} |
} |
|
} elsif (($resurl =~ m{^/adm/wrapper/ext/}) && ($env{'form.folderpath'} =~ /^supplemental/)) { |
|
$incourse = 1; |
|
if ($env{'form.forceedit'}) { |
|
$forceview = 1; |
|
} else { |
|
$forceedit = 1; |
|
} |
|
$cfile = $resurl; |
|
} elsif (($resurl eq '/adm/extresedit') && ($symb || $env{'form.folderpath'})) { |
|
$incourse = 1; |
|
$forceview = 1; |
|
if ($symb) { |
|
my ($map,$id,$res)=&decode_symb($symb); |
|
$env{'request.symb'} = $symb; |
|
$cfile = &clutter($res); |
|
} else { |
|
$cfile = $env{'form.suppurl'}; |
|
$cfile =~ s{^http://}{}; |
|
$cfile = '/adm/wrapper/ext/'.$cfile; |
|
} |
} |
} |
} |
} |
if ($uploaded || $incourse) { |
if ($uploaded || $incourse) { |
$home=&homeserver($cnum,$cdom); |
$home=&homeserver($cnum,$cdom); |
} else { |
} elsif ($file !~ m{/$}) { |
$file=~s{^(priv/$match_domain/$match_username)}{/$1}; |
$file=~s{^(priv/$match_domain/$match_username)}{/$1}; |
$file=~s{^($match_domain/$match_username)}{/priv/$1}; |
$file=~s{^($match_domain/$match_username)}{/priv/$1}; |
# Check that the user has permission to edit this resource |
# Check that the user has permission to edit this resource |
Line 2795 sub is_course_upload {
|
Line 2836 sub is_course_upload {
|
my ($file,$cnum,$cdom) = @_; |
my ($file,$cnum,$cdom) = @_; |
my $uploadpath = &LONCAPA::propath($cdom,$cnum); |
my $uploadpath = &LONCAPA::propath($cdom,$cnum); |
$uploadpath =~ s{^\/}{}; |
$uploadpath =~ s{^\/}{}; |
if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) || |
if (($file =~ m{^\Q$uploadpath\E/userfiles/(docs|supplemental)/}) || |
($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) { |
($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/(docs|supplemental)/})) { |
return 1; |
return 1; |
} |
} |
return; |
return; |
Line 6852 sub constructaccess {
|
Line 6893 sub constructaccess {
|
if (($allowed eq 'F') || ($allowed eq 'U')) { |
if (($allowed eq 'F') || ($allowed eq 'U')) { |
# Grant temporary access |
# Grant temporary access |
my $then=$env{'user.login.time'}; |
my $then=$env{'user.login.time'}; |
my $update==$env{'user.update.time'}; |
my $update=$env{'user.update.time'}; |
if (!$update) { $update = $then; } |
if (!$update) { $update = $then; } |
my $refresh=$env{'user.refresh.time'}; |
my $refresh=$env{'user.refresh.time'}; |
if (!$refresh) { $refresh = $update; } |
if (!$refresh) { $refresh = $update; } |
Line 8014 sub assignrole {
|
Line 8055 sub assignrole {
|
# log new user role if status is ok |
# log new user role if status is ok |
if ($answer eq 'ok') { |
if ($answer eq 'ok') { |
&userrolelog($role,$uname,$udom,$url,$start,$end); |
&userrolelog($role,$uname,$udom,$url,$start,$end); |
# for course roles, perform group memberships changes triggered by role change. |
|
unless ($role =~ /^gr/) { |
|
&Apache::longroup::group_changes($udom,$uname,$url,$role,$origend, |
|
$origstart,$selfenroll,$context); |
|
} |
|
if (($role eq 'cc') || ($role eq 'in') || |
if (($role eq 'cc') || ($role eq 'in') || |
($role eq 'ep') || ($role eq 'ad') || |
($role eq 'ep') || ($role eq 'ad') || |
($role eq 'ta') || ($role eq 'st') || |
($role eq 'ta') || ($role eq 'st') || |
($role=~/^cr/) || ($role eq 'gr') || |
($role=~/^cr/) || ($role eq 'gr') || |
($role eq 'co')) { |
($role eq 'co')) { |
|
# for course roles, perform group memberships changes triggered by role change. |
|
unless ($role =~ /^gr/) { |
|
&Apache::longroup::group_changes($udom,$uname,$url,$role,$origend, |
|
$origstart,$selfenroll,$context); |
|
} |
&courserolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
&courserolelog($role,$uname,$udom,$url,$origstart,$origend,$delflag, |
$selfenroll,$context); |
$selfenroll,$context); |
} elsif (($role eq 'li') || ($role eq 'dg') || ($role eq 'sc') || |
} elsif (($role eq 'li') || ($role eq 'dg') || ($role eq 'sc') || |
Line 10262 sub gettitle {
|
Line 10303 sub gettitle {
|
return $title; |
return $title; |
} |
} |
|
|
|
sub getdocspath { |
|
my ($symb) = @_; |
|
my $path; |
|
if ($symb) { |
|
my ($mapurl,$id,$resurl) = &decode_symb($symb); |
|
if ($resurl=~/\.(sequence|page)$/) { |
|
$mapurl=$resurl; |
|
} elsif ($resurl eq 'adm/navmaps') { |
|
$mapurl=$env{'course.'.$env{'request.course.id'}.'.url'}; |
|
} |
|
my $mapresobj; |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
$mapresobj = $navmap->getResourceByUrl($mapurl); |
|
} |
|
$mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1}; |
|
my $type=$2; |
|
if (ref($mapresobj)) { |
|
my $pcslist = $mapresobj->map_hierarchy(); |
|
if ($pcslist ne '') { |
|
foreach my $pc (split(/,/,$pcslist)) { |
|
next if ($pc <= 1); |
|
my $res = $navmap->getByMapPc($pc); |
|
if (ref($res)) { |
|
my $thisurl = $res->src(); |
|
$thisurl=~s{^.*/([^/]+)\.\w+$}{$1}; |
|
my $thistitle = $res->title(); |
|
$path .= '&'. |
|
&Apache::lonhtmlcommon::entity_encode($thisurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($thistitle). |
|
':'.$res->randompick(). |
|
':'.$res->randomout(). |
|
':'.$res->encrypted(). |
|
':'.$res->randomorder(). |
|
':'.$res->is_page(); |
|
} |
|
} |
|
} |
|
$path =~ s/^\&//; |
|
my $maptitle = $mapresobj->title(); |
|
if ($mapurl eq 'default') { |
|
$maptitle = 'Main Course Documents'; |
|
} |
|
$path .= ($path ne '')? '&' : ''. |
|
&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($maptitle). |
|
':'.$mapresobj->randompick(). |
|
':'.$mapresobj->randomout(). |
|
':'.$mapresobj->encrypted(). |
|
':'.$mapresobj->randomorder(). |
|
':'.$mapresobj->is_page(); |
|
} else { |
|
my $maptitle = &gettitle($mapurl); |
|
my $ispage; |
|
if ($mapurl =~ /\.page$/) { |
|
$ispage = 1; |
|
} |
|
if ($mapurl eq 'default') { |
|
$maptitle = 'Main Course Documents'; |
|
} |
|
$path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
|
&Apache::lonhtmlcommon::entity_encode($maptitle).':::::'.$ispage; |
|
} |
|
unless ($mapurl eq 'default') { |
|
$path = 'default&'. |
|
&Apache::lonhtmlcommon::entity_encode('Main Course Documents'). |
|
':::::&'.$path; |
|
} |
|
} |
|
return $path; |
|
} |
|
|
sub get_slot { |
sub get_slot { |
my ($which,$cnum,$cdom)=@_; |
my ($which,$cnum,$cdom)=@_; |
if (!$cnum || !$cdom) { |
if (!$cnum || !$cdom) { |
Line 10409 sub symbverify {
|
Line 10522 sub symbverify {
|
|
|
if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', |
if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', |
&GDBM_READER(),0640)) { |
&GDBM_READER(),0640)) { |
|
my $noclutter; |
if (($thisurl =~ m{^/adm/wrapper/ext/}) || ($thisurl =~ m{^ext/})) { |
if (($thisurl =~ m{^/adm/wrapper/ext/}) || ($thisurl =~ m{^ext/})) { |
$thisurl =~ s/\?.+$//; |
$thisurl =~ s/\?.+$//; |
|
if ($map =~ m{^uploaded/.+\.page$}) { |
|
$thisurl =~ s{^(/adm/wrapper|)/ext/}{http://}; |
|
$thisurl =~ s{^\Qhttp://https://\E}{https://}; |
|
$noclutter = 1; |
|
} |
|
} |
|
my $ids; |
|
if ($noclutter) { |
|
$ids=$bighash{'ids_'.$thisurl}; |
|
} else { |
|
$ids=$bighash{'ids_'.&clutter($thisurl)}; |
} |
} |
my $ids=$bighash{'ids_'.&clutter($thisurl)}; |
|
unless ($ids) { |
unless ($ids) { |
my $idkey = 'ids_'.($thisurl =~ m{^/}? '' : '/').$thisurl; |
my $idkey = 'ids_'.($thisurl =~ m{^/}? '' : '/').$thisurl; |
$ids=$bighash{$idkey}; |
$ids=$bighash{$idkey}; |
} |
} |
if ($ids) { |
if ($ids) { |
# ------------------------------------------------------------------- Has ID(s) |
# ------------------------------------------------------------------- Has ID(s) |
|
if ($thisfn =~ m{^/adm/wrapper/ext/}) { |
|
$symb =~ s/\?.+$//; |
|
} |
foreach my $id (split(/\,/,$ids)) { |
foreach my $id (split(/\,/,$ids)) { |
my ($mapid,$resid)=split(/\./,$id); |
my ($mapid,$resid)=split(/\./,$id); |
if ($thisfn =~ m{^/adm/wrapper/ext/}) { |
|
$symb =~ s/\?.+$//; |
|
} |
|
if ( |
if ( |
&symbclean(&declutter($bighash{'map_id_'.$mapid}).'___'.$resid.'___'.$thisfn) |
&symbclean(&declutter($bighash{'map_id_'.$mapid}).'___'.$resid.'___'.$thisfn) |
eq $symb) { |
eq $symb) { |
Line 10434 sub symbverify {
|
Line 10558 sub symbverify {
|
($bighash{'encrypted_'.$id} eq $env{'request.enc'}) || |
($bighash{'encrypted_'.$id} eq $env{'request.enc'}) || |
($thisurl eq '/adm/navmaps')) { |
($thisurl eq '/adm/navmaps')) { |
$okay=1; |
$okay=1; |
|
last; |
} |
} |
} |
} |
} |
} |
Line 10509 sub deversion {
|
Line 10634 sub deversion {
|
|
|
sub symbread { |
sub symbread { |
my ($thisfn,$donotrecurse)=@_; |
my ($thisfn,$donotrecurse)=@_; |
my $cache_str='request.symbread.cached.'.$thisfn; |
my $cache_str; |
if (defined($env{$cache_str})) { |
if ($thisfn ne '') { |
if (($thisfn) || ($env{$cache_str} ne '')) { |
$cache_str='request.symbread.cached.'.$thisfn; |
|
if ($env{$cache_str} ne '') { |
return $env{$cache_str}; |
return $env{$cache_str}; |
} |
} |
} |
} else { |
# no filename provided? try from environment |
# no filename provided? try from environment |
unless ($thisfn) { |
|
if ($env{'request.symb'}) { |
if ($env{'request.symb'}) { |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
return $env{$cache_str}=&symbclean($env{'request.symb'}); |
} |
} |
Line 11431 sub goodbye {
|
Line 11556 sub goodbye {
|
} |
} |
|
|
sub get_dns { |
sub get_dns { |
my ($url,$func,$ignore_cache) = @_; |
my ($url,$func,$ignore_cache,$nocache,$hashref) = @_; |
if (!$ignore_cache) { |
if (!$ignore_cache) { |
my ($content,$cached)= |
my ($content,$cached)= |
&Apache::lonnet::is_cached_new('dns',$url); |
&Apache::lonnet::is_cached_new('dns',$url); |
if ($cached) { |
if ($cached) { |
&$func($content); |
&$func($content,$hashref); |
return; |
return; |
} |
} |
} |
} |
Line 11461 sub get_dns {
|
Line 11586 sub get_dns {
|
delete($alldns{$dns}); |
delete($alldns{$dns}); |
next if ($response->is_error()); |
next if ($response->is_error()); |
my @content = split("\n",$response->content); |
my @content = split("\n",$response->content); |
&Apache::lonnet::do_cache_new('dns',$url,\@content,30*24*60*60); |
unless ($nocache) { |
&$func(\@content); |
&Apache::lonnet::do_cache_new('dns',$url,\@content,30*24*60*60); |
|
} |
|
&$func(\@content,$hashref); |
return; |
return; |
} |
} |
close($config); |
close($config); |
Line 11470 sub get_dns {
|
Line 11597 sub get_dns {
|
&logthis("unable to contact DNS defaulting to on disk file dns_$which.tab\n"); |
&logthis("unable to contact DNS defaulting to on disk file dns_$which.tab\n"); |
open($config,"<$perlvar{'lonTabDir'}/dns_$which.tab"); |
open($config,"<$perlvar{'lonTabDir'}/dns_$which.tab"); |
my @content = <$config>; |
my @content = <$config>; |
&$func(\@content); |
&$func(\@content,$hashref); |
return; |
return; |
} |
} |
|
|
|
# ------------------------------------------------------Get DNS checksums file |
|
sub write_dns_checksums_tab { |
|
my ($lines,$hashref) = @_; |
|
my $machine_dom = &Apache::lonnet::host_domain($perlvar{'lonHostID'}); |
|
my $loncaparev = &get_server_loncaparev($machine_dom); |
|
my ($release,$timestamp) = split(/\-/,$loncaparev); |
|
my (%chksum,%revnum); |
|
if (ref($lines) eq 'ARRAY') { |
|
chomp(@{$lines}); |
|
my $versions = shift(@{$lines}); |
|
my %supported; |
|
if ($versions =~ /^VERSIONS\:([\w\.\,]+)$/) { |
|
my $releaseslist = $1; |
|
if ($releaseslist =~ /,/) { |
|
map { $supported{$_} = 1; } split(/,/,$releaseslist); |
|
} elsif ($releaseslist) { |
|
$supported{$releaseslist} = 1; |
|
} |
|
} |
|
if ($supported{$release}) { |
|
my $matchthis = 0; |
|
foreach my $line (@{$lines}) { |
|
if ($line =~ /^(\d[\w\.]+)$/) { |
|
if ($matchthis) { |
|
last; |
|
} elsif ($1 eq $release) { |
|
$matchthis = 1; |
|
} |
|
} elsif ($matchthis) { |
|
my ($file,$version,$shasum) = split(/,/,$line); |
|
$chksum{$file} = $shasum; |
|
$revnum{$file} = $version; |
|
} |
|
} |
|
if (ref($hashref) eq 'HASH') { |
|
%{$hashref} = ( |
|
sums => \%chksum, |
|
versions => \%revnum, |
|
); |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub fetch_dns_checksums { |
|
my %checksums; |
|
&get_dns('/adm/dns/checksums',\&write_dns_checksums_tab,1,1, |
|
\%checksums); |
|
return \%checksums; |
|
} |
|
|
# ------------------------------------------------------------ Read domain file |
# ------------------------------------------------------------ Read domain file |
{ |
{ |
my $loaded; |
my $loaded; |