--- rat/lonuserstate.pm 2025/05/28 04:15:41 1.149.2.5.2.4 +++ rat/lonuserstate.pm 2022/10/04 20:39:57 1.169 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.149.2.5.2.4 2025/05/28 04:15:41 raeburn Exp $ +# $Id: lonuserstate.pm,v 1.169 2022/10/04 20:39:57 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,7 +42,7 @@ use Safe::Hole; use Opcode; use Apache::lonenc; use Fcntl qw(:flock); -use LONCAPA qw(:DEFAULT :match); +use LONCAPA qw(:DEFAULT :match); use File::Basename; @@ -63,7 +63,6 @@ my %randomizationcode; # code used to gr my %encurl; # URLs in this folder are supposed to be encrypted my %hiddenurl; # this URL (or complete folder) is supposed to be hidden my %deeplinkout; # this URL (or complete folder) unavailable in deep-link session -my %deeplinkonlyprot; # Link protection items used for deep-link only resources. my %rescount; # count of unhidden items in each map my %mapcount; # count of unhidden maps in each map @@ -261,9 +260,9 @@ sub loadmap { push(@map_ids, $resource_id); if ($hash{'src_'.$lpc.'.'.$resource_id}) { $rescount{$lpc} ++; - if (($hash{'src_'.$lpc.'.'.$resource_id}=~/\.sequence$/) || + if (($hash{'src_'.$lpc.'.'.$resource_id}=~/\.sequence$/) || ($hash{'src_'.$lpc.'.'.$resource_id}=~/\.page$/)) { - $mapcount{$lpc} ++; + $mapcount{$lpc} ++; } } unless ($codechecked) { @@ -406,6 +405,12 @@ sub error_detail { if (($parent_pc eq '0') && ($hash{'map_id_1'} =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$})) { ($audomfile,$aunamefile) = ($1,$2); ($editfile,$filerole,$fileswitch) = &canedit_published($audomfile,$aunamefile); + if ($fileswitch) { + unless ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$audomfile)) && + (&Apache::lonnet::will_trust('coaurem',$audomfile,$env{'user.domain'}))) { + undef($editfile); + } + } $errinfo = &mt('Top level published sequence file is missing.'); } else { if ($parent_pc eq '1') { @@ -479,6 +484,12 @@ sub error_detail { if ($uri =~ m{^/res/($match_domain)/($match_username)/.+\.(sequence|page)$}) { ($audomfile,$aunamefile) = ($1,$2); ($editfile,$filerole,$fileswitch) = &canedit_published($audomfile,$aunamefile); + if ($fileswitch) { + unless ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$audomfile)) && + (&Apache::lonnet::will_trust('coaurem',$audomfile,$env{'user.domain'}))) { + undef($editfile); + } + } } } if ($errinfo) { @@ -493,8 +504,6 @@ sub error_detail { } else { $errinfo .= &mt('To rectify this problem, create and publish the missing file'); } - my $fileurl = $uri; - $fileurl =~s{^/res/}{/priv/}; if ($fileswitch) { my $rolename = &Apache::lonnet::plaintext($filerole); my $rolecode; @@ -504,10 +513,10 @@ sub error_detail { $rolecode = $filerole.'./'.$audomfile.'/'.$aunamefile; } $errinfo .= '.
'.&mt('You will need to [_1]switch server[_2].', - '',''); + '',''); } else { - &js_escape(\$fileurl); + my $fileurl = $uri; + $fileurl =~s{^/res/}{/priv/}; $errinfo .= ': '.&mt('Create the missing file').''; } } @@ -528,15 +537,18 @@ sub error_detail { } else { $errinfo .= &mt('To rectify this problem edit the parent map to remove the reference to the missing file'); } - my $mapurl = $hash{'map_id_'.$parent_pc}; - $mapurl =~s{^/res/}{/priv/}; if ($switchserver) { - $errinfo .= '.
'. - &mt('You will need to [_1]switch server[_2].', - '',''); + $errinfo .= '.
'; + if ((&Apache::lonnet::will_trust('othcoau',$env{'user.domain'},$audom)) && + (&Apache::lonnet::will_trust('coaurem',$audom,$env{'user.domain'}))) { + $errinfo .= &mt('You will need to [_1]switch server[_2].', + '',''); + } else { + $errinfo .= &mt('Session switch required but prohibited.'); + } } else { - &js_escape(\$mapurl); + my $mapurl = $hash{'map_id_'.$parent_pc}; + $mapurl =~s{^/res/}{/priv/}; $errinfo .= ': '.&mt('Edit the map').''; } } elsif ($uploaded && $courseid) { @@ -1170,14 +1182,8 @@ sub traceroute { } unless (@deeplink < 2) { $hash{'deeplinkonly_'.$rid}=join(':',map { &escape($_); } @deeplink); - my ($state,$others,$listed,$scope,$protect) = split(/,/,$deeplink[0]); - if (($state eq 'only') && ($protect ne 'none') && ($protect ne '')) { - my ($acctype,$item) = split(/:/,$protect); - if ($acctype =~ /lti(c|d)$/) { - $deeplinkonlyprot{$1}{$item} = 1; - } - } } + if (defined($hash{'conditions_'.$rid})) { $hash{'conditions_'.$rid}=simplify( '('.$hash{'conditions_'.$rid}.')|('.$sofar.')'); @@ -1511,7 +1517,6 @@ sub readmap { undef %hiddenurl; undef %encurl; undef %deeplinkout; - undef %deeplinkonlyprot; undef %rescount; undef %mapcount; $retfrid=''; @@ -1661,7 +1666,6 @@ sub readmap { undef %hiddenurl; undef %encurl; undef %deeplinkout; - undef %deeplinkonlyprot; undef %rescount; undef %mapcount; $errtext=''; @@ -1722,7 +1726,7 @@ sub readmap { if ($redirect) { $retfurl = $url; } - } + } return ($retfurl,$errtext); } @@ -1786,42 +1790,6 @@ sub build_tmp_hashes { &accinit($uri,$short,$fn); &hiddenurls(); } - my ($cdom,$cnum) = split(/_/,$short); - if (keys(%deeplinkonlyprot)) { - my %launchers; - if (ref($deeplinkonlyprot{'c'}) eq 'HASH') { - if (($cdom ne '') && ($cnum ne '')) { - my %crs_linkprot = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider'); - foreach my $num (keys(%{$deeplinkonlyprot{'c'}})) { - if ((ref($crs_linkprot{$num}) eq 'HASH') && - ($crs_linkprot{$num}{'name'} ne '')) { - push(@{$launchers{$crs_linkprot{$num}{'name'}}},'c'.$num); - } - } - } - } - if (ref($deeplinkonlyprot{'d'}) eq 'HASH') { - if ($cdom ne '') { - my %dom_linkprot = &Apache::lonnet::get_domain_lti($cdom,'linkprot'); - foreach my $num (keys(%{$deeplinkonlyprot{'d'}})) { - if ((ref($dom_linkprot{$num}) eq 'HASH') && - ($dom_linkprot{$num}{'name'} ne '')) { - push(@{$launchers{$dom_linkprot{$num}{'name'}}},'d'.$num); - } - } - } - } - if (keys(%launchers)) { - my $value = ''; - foreach my $key (sort(keys(%launchers))) { - if (ref($launchers{$key}) eq 'ARRAY') { - $value .= &escape($key).':'.join(',',@{$launchers{$key}}).'&'; - } - } - $value =~ s/&$//; - &Apache::lonnet::appenv({'request.course.deeponlyprot' => $value}); - } - } $errtext .= &get_mapalias_errors(); # ------------------------------------------------------- Put versions into src foreach my $key (keys(%hash)) { @@ -1862,6 +1830,7 @@ sub build_tmp_hashes { } # Was initial access via a deep-link? + my ($cdom,$cnum) = split(/_/,$short); if (($cdom ne '') && ($env{'request.deeplink.login'} ne '')) { my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom); if ($deeplink_symb) { @@ -2074,6 +2043,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what; + if (defined($$useropt{$recursechk})) { + return $$useropt{$recursechk}; + } } } @@ -2095,6 +2068,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.['.$cgroup.'].'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } @@ -2116,6 +2093,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.['.$csec.'].'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } @@ -2159,6 +2140,10 @@ sub get_mapparam { last; } } + my $recursechk=$usercourseprefix.'.'.$item.'___(rec).'.$what; + if (defined($$courseopt{$recursechk})) { + return $$courseopt{$recursechk}; + } } } }