version 1.1529, 2024/09/25 17:29:15
|
version 1.1538, 2025/04/02 23:44:03
|
Line 228 sub get_server_distarch {
|
Line 228 sub get_server_distarch {
|
} |
} |
} |
} |
my $rep = &reply('serverdistarch',$lonhost); |
my $rep = &reply('serverdistarch',$lonhost); |
unless ($rep eq 'unknown_command' || $rep eq 'no_such_host' || |
unless ($rep eq 'unknown_cmd' || $rep eq 'no_such_host' || |
$rep eq 'con_lost' || $rep eq 'rejected' || $rep eq 'refused' || |
$rep eq 'con_lost' || $rep eq 'rejected' || $rep eq 'refused' || |
$rep eq '') { |
$rep eq '') { |
return &do_cache_new('serverdistarch',$lonhost,$rep,$cachetime); |
return &do_cache_new('serverdistarch',$lonhost,$rep,$cachetime); |
Line 3019 sub get_domain_defaults {
|
Line 3019 sub get_domain_defaults {
|
last if ($domdefaults{'userapprovals'}); |
last if ($domdefaults{'userapprovals'}); |
} |
} |
} |
} |
|
if (ref($domconfig{'privacy'}{'othdom'}) eq 'HASH') { |
|
$domdefaults{'privacyothdom'} = $domconfig{'privacy'}{'othdom'}; |
|
} |
} |
} |
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
&do_cache_new('domdefaults',$domain,\%domdefaults,$cachetime); |
return %domdefaults; |
return %domdefaults; |
Line 3731 sub ssi_body {
|
Line 3734 sub ssi_body {
|
$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*\>.*?$//si; |
$output=~s/\<\/body\s*\>.*?$//si; |
|
$output=~s{\Q<div class="LC_landmark" role="main">\E}{<div>}gs; |
if (wantarray) { |
if (wantarray) { |
return ($output, $response); |
return ($output, $response); |
} else { |
} else { |
Line 6167 sub courselastaccess {
|
Line 6171 sub courselastaccess {
|
sub extract_lastaccess { |
sub extract_lastaccess { |
my ($returnhash,$rep) = @_; |
my ($returnhash,$rep) = @_; |
if (ref($returnhash) eq 'HASH') { |
if (ref($returnhash) eq 'HASH') { |
unless ($rep eq 'unknown_command' || $rep eq 'no_such_host' || |
unless ($rep eq 'unknown_cmd' || $rep eq 'no_such_host' || |
$rep eq 'con_lost' || $rep eq 'rejected' || $rep eq 'refused' || |
$rep eq 'con_lost' || $rep eq 'rejected' || $rep eq 'refused' || |
$rep eq '') { |
$rep eq '') { |
my @pairs=split(/\&/,$rep); |
my @pairs=split(/\&/,$rep); |
Line 6754 sub cstore {
|
Line 6758 sub cstore {
|
|
|
if ($stuname) { $home=&homeserver($stuname,$domain); } |
if ($stuname) { $home=&homeserver($stuname,$domain); } |
|
|
$symb=&symbclean($symb); |
unless (($symb eq '_feedback') || ($symb eq '_discussion')) { |
|
$symb=&symbclean($symb); |
|
} |
if (!$symb) { unless ($symb=&symbread()) { return ''; } } |
if (!$symb) { unless ($symb=&symbread()) { return ''; } } |
|
|
if (!$domain) { $domain=$env{'user.domain'}; } |
if (!$domain) { $domain=$env{'user.domain'}; } |
if (!$stuname) { $stuname=$env{'user.name'}; } |
if (!$stuname) { $stuname=$env{'user.name'}; } |
|
|
&devalidate($symb,$stuname,$domain); |
unless (($symb eq '_feedback') || ($symb eq '_discussion')) { |
|
&devalidate($symb,$stuname,$domain); |
|
} |
|
|
$symb=escape($symb); |
$symb=escape($symb); |
if (!$namespace) { |
if (!$namespace) { |
Line 6770 sub cstore {
|
Line 6778 sub cstore {
|
} |
} |
if (!$home) { $home=$env{'user.home'}; } |
if (!$home) { $home=$env{'user.home'}; } |
|
|
$$storehash{'ip'}=&get_requestor_ip(); |
$$storehash{'ip'} = &get_requestor_ip(); |
$$storehash{'host'}=$perlvar{'lonHostID'}; |
$$storehash{'host'}=$perlvar{'lonHostID'}; |
|
|
my $namevalue=''; |
my $namevalue=''; |
Line 7520 sub set_adhoc_privileges {
|
Line 7528 sub set_adhoc_privileges {
|
if (&allowed('adv') eq 'F') { $tadv=1; } |
if (&allowed('adv') eq 'F') { $tadv=1; } |
&appenv({'request.role.adv' => $tadv}); |
&appenv({'request.role.adv' => $tadv}); |
} |
} |
|
if ($role eq 'ca') { |
|
my @ca_settings = ('authoreditors','coauthorlist'); |
|
my %info = &userenvironment($dcdom,$pickedcourse,@ca_settings); |
|
foreach my $item (@ca_settings) { |
|
if (exists($info{$item})) { |
|
my $name = $item; |
|
if ($item eq 'authoreditors') { |
|
$name = 'editors'; |
|
unless ($info{'authoreditors'}) { |
|
my %domdefs = &get_domain_defaults($dcdom); |
|
if ($domdefs{$name} ne '') { |
|
$info{'authoreditors'} = $domdefs{$name}; |
|
} else { |
|
$info{'authoreditors'} = 'edit,xml'; |
|
} |
|
} |
|
} |
|
&appenv({"environment.internal.$name./$dcdom/$pickedcourse" => $info{$item}}); |
|
} |
|
} |
|
} |
} |
} |
|
|
# --------------------------------------------------------------- get interface |
# --------------------------------------------------------------- get interface |
Line 10405 sub auto_instsec_reformat {
|
Line 10434 sub auto_instsec_reformat {
|
my $info = &freeze_escape($instsecref); |
my $info = &freeze_escape($instsecref); |
my $response=&reply('autoinstsecreformat:'.$cdom.':'. |
my $response=&reply('autoinstsecreformat:'.$cdom.':'. |
$action.':'.$info,$server); |
$action.':'.$info,$server); |
next if ($response =~ /(con_lost|error|no_such_host|refused|unknown_command)/); |
next if ($response =~ /(con_lost|error|no_such_host|refused|unknown_cmd)/); |
my @items = split(/&/,$response); |
my @items = split(/&/,$response); |
foreach my $item (@items) { |
foreach my $item (@items) { |
my ($key,$value) = split(/=/,$item); |
my ($key,$value) = split(/=/,$item); |
Line 10487 sub auto_export_grades {
|
Line 10516 sub auto_export_grades {
|
my $grades = &freeze_escape($gradesref); |
my $grades = &freeze_escape($gradesref); |
my $response=&reply('encrypt:autoexportgrades:'.$cdom.':'.$cnum.':'. |
my $response=&reply('encrypt:autoexportgrades:'.$cdom.':'.$cnum.':'. |
$info.':'.$grades,$homeserver); |
$info.':'.$grades,$homeserver); |
unless ($response =~ /(con_lost|error|no_such_host|refused|unknown_command)/) { |
unless ($response =~ /(con_lost|error|no_such_host|refused|unknown_cmd)/) { |
my @items = split(/&/,$response); |
my @items = split(/&/,$response); |
foreach my $item (@items) { |
foreach my $item (@items) { |
my ($key,$value) = split('=',$item); |
my ($key,$value) = split('=',$item); |
Line 11680 sub is_course {
|
Line 11709 sub is_course {
|
} |
} |
|
|
sub store_userdata { |
sub store_userdata { |
my ($storehash,$datakey,$namespace,$udom,$uname) = @_; |
my ($storehash,$datakey,$namespace,$udom,$uname,$ip) = @_; |
my $result; |
my $result; |
if ($datakey ne '') { |
if ($datakey ne '') { |
if (ref($storehash) eq 'HASH') { |
if (ref($storehash) eq 'HASH') { |
Line 11692 sub store_userdata {
|
Line 11721 sub store_userdata {
|
if (($uhome eq '') || ($uhome eq 'no_host')) { |
if (($uhome eq '') || ($uhome eq 'no_host')) { |
$result = 'error: no_host'; |
$result = 'error: no_host'; |
} else { |
} else { |
$storehash->{'ip'} = &get_requestor_ip(); |
if ($ip ne '') { |
|
$storehash->{'ip'} = $ip; |
|
} else { |
|
$storehash->{'ip'} = &get_requestor_ip(); |
|
} |
$storehash->{'host'} = $perlvar{'lonHostID'}; |
$storehash->{'host'} = $perlvar{'lonHostID'}; |
|
|
my $namevalue=''; |
my $namevalue=''; |
Line 12547 sub stat_file {
|
Line 12580 sub stat_file {
|
# $relpath - Current path (relative to top level). |
# $relpath - Current path (relative to top level). |
# $dirhashref - reference to hash to populate with URLs of directories (Required) |
# $dirhashref - reference to hash to populate with URLs of directories (Required) |
# $filehashref - reference to hash to populate with URLs of files (Optional) |
# $filehashref - reference to hash to populate with URLs of files (Optional) |
|
# $getlastmod - if true, will set value for each key in innerhash in $filehashref |
|
# to last modification time of file; value set to 1 otherwise. |
# |
# |
# Returns: nothing |
# Returns: nothing |
# |
# |
Line 12559 sub stat_file {
|
Line 12594 sub stat_file {
|
# |
# |
|
|
sub recursedirs { |
sub recursedirs { |
my ($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir,$toppath,$relpath,$dirhashref,$filehashref) = @_; |
my ($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir,$toppath, |
|
$relpath,$dirhashref,$filehashref,$getlastmod) = @_; |
return unless (ref($dirhashref) eq 'HASH'); |
return unless (ref($dirhashref) eq 'HASH'); |
my $docroot = $perlvar{'lonDocRoot'}; |
my $docroot = $perlvar{'lonDocRoot'}; |
my $currpath = $docroot.$toppath; |
my $currpath = $docroot.$toppath; |
Line 12567 sub recursedirs {
|
Line 12603 sub recursedirs {
|
$currpath .= "/$relpath"; |
$currpath .= "/$relpath"; |
} |
} |
my ($savefile,$checkinc,$checkexc); |
my ($savefile,$checkinc,$checkexc); |
if (ref($filehashref)) { |
if (ref($filehashref) eq 'HASH') { |
$savefile = 1; |
$savefile = 1; |
} |
} |
if (ref($include) eq 'HASH') { |
if (ref($include) eq 'HASH') { |
Line 12590 sub recursedirs {
|
Line 12626 sub recursedirs {
|
} |
} |
$dirhashref->{&Apache::lonlocal::js_escape($newpath)} = 1; |
$dirhashref->{&Apache::lonlocal::js_escape($newpath)} = 1; |
if ($recurse) { |
if ($recurse) { |
&recursedirs($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir,$toppath,$newpath,$dirhashref,$filehashref); |
&recursedirs($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir, |
|
$toppath,$newpath,$dirhashref,$filehashref,$getlastmod); |
} |
} |
} elsif (($savefile) || ($relpath eq '')) { |
} elsif (($savefile) || ($relpath eq '')) { |
next if ($nonemptydir && $filecount); |
next if ($nonemptydir && $filecount); |
Line 12607 sub recursedirs {
|
Line 12644 sub recursedirs {
|
$dirhashref->{'/'} = 1; |
$dirhashref->{'/'} = 1; |
} |
} |
if ($savefile) { |
if ($savefile) { |
|
my $value; |
|
if ($getlastmod) { |
|
($value) = (stat("$currpath/$item"))[9]; |
|
} else { |
|
$value = 1; |
|
} |
if ($relpath eq '') { |
if ($relpath eq '') { |
$filehashref->{'/'}{$item} = 1; |
$filehashref->{'/'}{$item} = $value |
} else { |
} else { |
$filehashref->{&Apache::lonlocal::js_escape($relpath)}{$item} = 1; |
$filehashref->{&Apache::lonlocal::js_escape($relpath)}{$item} = $value; |
} |
} |
} |
} |
$filecount ++; |
$filecount ++; |
Line 12619 sub recursedirs {
|
Line 12662 sub recursedirs {
|
closedir($dirh); |
closedir($dirh); |
} |
} |
} else { |
} else { |
my ($dirlistref,$listerror) = |
my $url = $toppath; |
&dirlist($toppath.$relpath); |
if ($relpath ne '') { |
|
$url = $toppath.'/'.$relpath; |
|
} |
|
my ($dirlistref,$listerror) = &dirlist($url); |
my @dir_lines; |
my @dir_lines; |
my $dirptr=16384; |
my $dirptr=16384; |
if (ref($dirlistref) eq 'ARRAY') { |
if (ref($dirlistref) eq 'ARRAY') { |
Line 12644 sub recursedirs {
|
Line 12690 sub recursedirs {
|
} |
} |
$dirhashref->{&Apache::lonlocal::js_escape($newpath)} = 1; |
$dirhashref->{&Apache::lonlocal::js_escape($newpath)} = 1; |
if ($recurse) { |
if ($recurse) { |
&recursedirs($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir,$toppath,$newpath,$dirhashref,$filehashref); |
&recursedirs($is_home,$recurse,$include,$exclude,$nonemptydir,$addtopdir, |
|
$toppath,$newpath,$dirhashref,$filehashref,$getlastmod); |
} |
} |
} elsif (($savefile) || ($relpath eq '')) { |
} elsif (($savefile) || ($relpath eq '')) { |
next if ($nonemptydir && $filecount); |
next if ($nonemptydir && $filecount); |
if ($checkinc || $checkexc) { |
if ($checkinc || $checkexc) { |
my $extension; |
my ($extension) = ($item =~ /\.(\w+)$/); |
if ($checkinc) { |
if ($checkinc) { |
next unless ($extension && $include->{$extension}); |
next unless ($extension && $include->{$extension}); |
} |
} |
Line 12661 sub recursedirs {
|
Line 12708 sub recursedirs {
|
$dirhashref->{'/'} = 1; |
$dirhashref->{'/'} = 1; |
} |
} |
if ($savefile) { |
if ($savefile) { |
|
my $value; |
|
if ($getlastmod) { |
|
$value = $mtime; |
|
} else { |
|
$value = 1; |
|
} |
if ($relpath eq '') { |
if ($relpath eq '') { |
$filehashref->{'/'}{$item} = 1; |
$filehashref->{'/'}{$item} = $value; |
} else { |
} else { |
$filehashref->{&Apache::lonlocal::js_escape($relpath)}{$item} = 1; |
$filehashref->{&Apache::lonlocal::js_escape($relpath)}{$item} = $value; |
} |
} |
} |
} |
$filecount ++; |
$filecount ++; |
Line 12691 sub priv_exclude {
|
Line 12744 sub priv_exclude {
|
}; |
}; |
} |
} |
|
|
|
sub res_exclude { |
|
return { |
|
meta => 1, |
|
subscription => 1, |
|
rights => 1, |
|
}; |
|
} |
|
|
# -------------------------------------------------------- Value of a Condition |
# -------------------------------------------------------- Value of a Condition |
|
|
# gets the value of a specific preevaluated condition |
# gets the value of a specific preevaluated condition |
Line 13155 my %cachedmaps=();
|
Line 13216 my %cachedmaps=();
|
# When this was last done |
# When this was last done |
my $cachedmaptime=''; |
my $cachedmaptime=''; |
|
|
|
# Cache (5 seconds) of mapsymb hierarchy for speedup of reservations display |
|
# |
|
# The course for which we cache |
|
my $cachedmapsymbkey=''; |
|
# The cached recursive map symbs for this course |
|
my %cachedmapsymbs=(); |
|
# When this was last done |
|
my $cachedmapsymbtime=''; |
|
|
sub clear_EXT_cache_status { |
sub clear_EXT_cache_status { |
&delenv('cache.EXT.'); |
&delenv('cache.EXT.'); |
} |
} |
Line 13346 sub EXT {
|
Line 13416 sub EXT {
|
|
|
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
#print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest; |
|
|
|
# --------------------------------------------- Special handling for encrypturl |
|
|
|
if ($spacequalifierrest eq '0.encrypturl') { |
|
unless ($recursed) { |
|
my ($map_from_symb,@mapsymbs); |
|
if ($symbparm =~ /\.(page|sequence)$/) { |
|
push(@mapsymbs,$symbparm); |
|
$map_from_symb = &deversion((&decode_symb($symbparm))[2]); |
|
} else { |
|
$map_from_symb = &deversion((&decode_symb($symbparm))[0]); |
|
} |
|
if (($map_from_symb ne '') && ($map_from_symb !~ /default\.sequence$/)) { |
|
my @parents = &get_mapsymb_hierarchy($map_from_symb,$courseid); |
|
if (@parents) { |
|
push(@mapsymbs,@parents); |
|
} |
|
} |
|
if (@mapsymbs) { |
|
my $earlyout; |
|
my %parmhash=(); |
|
if (tie(%parmhash,'GDBM_File', |
|
$env{'request.course.fn'}.'_parms.db', |
|
&GDBM_READER(),0640)) { |
|
foreach my $mapsymb (@mapsymbs) { |
|
if ((exists($parmhash{$mapsymb.'.'.$spacequalifierrest})) && |
|
(lc($parmhash{$mapsymb.'.'.$spacequalifierrest}) eq 'yes')) { |
|
$earlyout = $parmhash{$mapsymb.'.'.$spacequalifierrest}; |
|
last; |
|
} |
|
} |
|
untie(%parmhash); |
|
} |
|
if ($earlyout) { return &get_reply([$earlyout,'map']); } |
|
} |
|
} |
|
} |
|
|
# ----------------------------------------------------- Cascading lookup scheme |
# ----------------------------------------------------- Cascading lookup scheme |
my $symbp=$symbparm; |
my $symbp=$symbparm; |
$mapp=&deversion((&decode_symb($symbp))[0]); |
$mapp=&deversion((&decode_symb($symbp))[0]); |
Line 13549 sub get_map_hierarchy {
|
Line 13656 sub get_map_hierarchy {
|
return @recurseup; |
return @recurseup; |
} |
} |
|
|
|
sub get_mapsymb_hierarchy { |
|
my ($mapname,$courseid) = @_; |
|
my @recurseup; |
|
if ($mapname) { |
|
if (($cachedmapsymbkey eq $courseid) && |
|
(abs($cachedmapsymbtime-time)<5)) { |
|
if (ref($cachedmapsymbs{$mapname}) eq 'ARRAY') { |
|
return @{$cachedmapsymbs{$mapname}}; |
|
} |
|
} |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $getsymb = 1; |
|
my $inclusive = 1; |
|
@recurseup = $navmap->recurseup_maps($mapname,$getsymb,$inclusive); |
|
undef($navmap); |
|
$cachedmapsymbs{$mapname} = \@recurseup; |
|
$cachedmapsymbtime=time; |
|
$cachedmapsymbkey=$courseid; |
|
} |
|
} |
|
return @recurseup; |
|
} |
|
|
} |
} |
|
|
sub sort_course_groups { # Sort groups based on defined rankings. Default is sort(). |
sub sort_course_groups { # Sort groups based on defined rankings. Default is sort(). |
Line 15056 sub whichuser {
|
Line 15187 sub whichuser {
|
$courseid=$tmp_courseid; |
$courseid=$tmp_courseid; |
($domain)=&get_env_multiple('form.grade_domain'); |
($domain)=&get_env_multiple('form.grade_domain'); |
($name)=&get_env_multiple('form.grade_username'); |
($name)=&get_env_multiple('form.grade_username'); |
|
if ($name eq 'public' && $domain eq 'public') { |
|
$publicuser = 1; |
|
} |
return ($symb,$courseid,$domain,$name,$publicuser); |
return ($symb,$courseid,$domain,$name,$publicuser); |
} |
} |
} |
} |
Line 15072 sub whichuser {
|
Line 15206 sub whichuser {
|
$env{'form.username'}.=time.rand(10000000); |
$env{'form.username'}.=time.rand(10000000); |
} |
} |
$name.=$env{'form.username'}; |
$name.=$env{'form.username'}; |
|
$publicuser = 1; |
} |
} |
return ($symb,$courseid,$domain,$name,$publicuser); |
return ($symb,$courseid,$domain,$name,$publicuser); |
|
|
Line 15160 sub repcopy_userfile {
|
Line 15295 sub repcopy_userfile {
|
return 'ok'; |
return 'ok'; |
} |
} |
|
|
|
sub repcopy_crsprivfile { |
|
my ($src,$dest) = @_; |
|
my $result; |
|
if ($src =~ m{^/priv/($match_domain)/($match_courseid)/(.+)$}) { |
|
my ($cdom,$cnum,$filepath) = ($1,$2,$3); |
|
$filepath =~ s/\.{2,}//g; |
|
my $chome = &homeserver($cnum,$cdom); |
|
unless ($chome eq 'no_host') { |
|
my @ids=¤t_machine_ids(); |
|
unless (grep(/^\Q$chome\E$/,@ids)) { |
|
if (&is_course($cdom,$cnum)) { |
|
my $londocroot = $perlvar{'lonDocRoot'}; |
|
if ($dest =~ m{^\Q$londocroot/priv/\E$match_domain/$match_username/.*\Q$filepath\E$}) { |
|
my $cmd = 'crsfilefrompriv:'.&escape($filepath).':'.&escape($cnum).':'.&escape($cdom); |
|
$result = &reply($cmd,$chome); |
|
unless (($result eq 'unknown_cmd') || ($result =~ /^error:/)) { |
|
my $url = &unescape($result); |
|
if ($url =~ m{^https?://[^/]+\Q/userfiles/$cdom/$cnum/priv/$filepath\E$}) { |
|
my $request=new HTTP::Request('GET',$url); |
|
my $response=&LONCAPA::LWPReq::makerequest($chome,$request,'',\%perlvar,1200,1); |
|
if ($response->is_error()) { |
|
$result = 'error: '.$response->status_line; |
|
} else { |
|
if (open(my $fh,'>',$dest)) { |
|
print $fh $response->content; |
|
close($fh); |
|
$result = 'ok'; |
|
} else { |
|
$result = 'error: nowrite'; |
|
} |
|
} |
|
} else { |
|
$result = 'error: invalidurl'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
sub tokenwrapper { |
sub tokenwrapper { |
my $uri=shift; |
my $uri=shift; |
$uri=~s|^https?\://([^/]+)||; |
$uri=~s|^https?\://([^/]+)||; |