--- rat/lonpageflip.pm 2021/12/14 21:34:45 1.80.8.13 +++ rat/lonpageflip.pm 2013/05/10 12:49:39 1.81 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.80.8.13 2021/12/14 21:34:45 raeburn Exp $ +# $Id: lonpageflip.pm,v 1.81 2013/05/10 12:49:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,8 +36,6 @@ use LONCAPA; use Apache::Constants qw(:common :http REDIRECT); use Apache::lonnet; use Apache::loncommon(); -use Apache::lonuserstate; -use Apache::lonlocal; use HTML::TokeParser; use GDBM_File; @@ -83,18 +81,11 @@ sub hash_src { my ($mapid,$resid)=split(/\./,$id); my $symb=&Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, $resid,$hash{'src_'.$id}); - my $anchor; - if ($hash{'ext_'.$id} eq 'true:') { - if ($hash{'src_'.$id} =~ /(\#.+)$/) { - $anchor = $1; - } - } if ($hash{'encrypted_'.$id}) { return (&Apache::lonenc::encrypted($hash{'src_'.$id}), - &Apache::lonenc::encrypted($symb), - $hash{'encrypted_'.$id},$anchor); + &Apache::lonenc::encrypted($symb)); } - return ($hash{'src_'.$id},$symb,$hash{'encrypted_'.$id},$anchor); + return ($hash{'src_'.$id},$symb); } sub move { @@ -231,13 +222,9 @@ sub first_accessible_resource { if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { $furl=$hash{'first_url'}; - my (%args,$url,$argstr); - if ($furl =~ m{^/enc/}) { - ($url,$argstr) = split(/\?/,&Apache::lonenc::unencrypted($furl)); - } else { - ($url,$argstr) = split(/\?/,$furl); - } - foreach my $pair (split(/\&/,$argstr)) { + my %args; + my ($url,$args) = split(/\?/,$furl); + foreach my $pair (split(/\&/,$args)) { my ($name,$value) = split(/=/,$pair); $args{&unescape($name)} = &unescape($value); } @@ -245,17 +232,13 @@ sub first_accessible_resource { # Wow, we cannot see this ... move forward to the next one that we can see my ($newrid,$newmap)=&move($hash{'first_rid'},$hash{'first_mapurl'},'forward'); # Build the new URL - if ($newrid eq '') { - $furl = '/adm/navmaps'; - } else { - my ($newmapid,$newresid)=split(/\./,$newrid); - my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); - $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); - if ($hash{'encrypted_'.$newrid}) { - $furl=&Apache::lonenc::encrypted($furl); - } + my ($newmapid,$newresid)=split(/\./,$newrid); + my $symb=&Apache::lonnet::encode_symb($newmap,$newresid,$hash{'src_'.$newrid}); + $furl=&add_get_param($hash{'src_'.$newrid},{ 'symb' => $symb }); + if ($hash{'encrypted_'.$newrid}) { + $furl=&Apache::lonenc::encrypted($furl); } - } + } untie(%hash); return $furl; } else { @@ -263,56 +246,6 @@ sub first_accessible_resource { } } -sub check_http_req { - my ($srcref,$hostname) = @_; - return unless (ref($srcref) eq 'SCALAR'); - my $usehttp; - if ($env{'request.course.id'}) { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - if (($$srcref =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && - ($ENV{'SERVER_PORT'} == 443) && - ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { - unless ((&Apache::lonnet::uses_sts()) || - (&Apache::lonnet::waf_allssl($hostname))) { - $$srcref .= (($$srcref =~/\?/)? '&':'?') . 'usehttp=1'; - $usehttp = 1; - } - } elsif (($$srcref =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}) && - ($ENV{'SERVER_PORT'} == 443)) { - unless ((&Apache::lonnet::uses_sts()) || - (&Apache::lonnet::waf_allssl($hostname))) { - my ($url,$anchor) = ($$srcref =~ /^([^\#]+)(?:|(\#[^\#]+))$/); - $$srcref = $url . (($$srcref =~/\?/)? '&':'?') . 'usehttp=1' .$anchor; - $usehttp = 1; - } - } - } - return $usehttp; -} - -sub reinited_js { - my ($url,$cid,$timeout) = @_; - if (!$timeout) { - $timeout = 0; - } - return <<"END"; - -END -} - # ================================================================ Main Handler sub handler { @@ -329,173 +262,81 @@ sub handler { my %cachehash=(); my $multichoice=0; my %multichoicehash=(); - my %prog_state=(); - my ($redirecturl,$redirectsymb,$enc,$anchor); + my ($redirecturl,$redirectsymb); my $next=''; - my $hostname = $r->hostname(); my @possibilities=(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['postdata']); if (($env{'form.postdata'})&&($env{'request.course.fn'})) { - my ($direction,$currenturl) = ($env{'form.postdata'}=~/(\w+)\:(.*)/); + $env{'form.postdata'}=~/(\w+)\:(.*)/; + my $direction=$1; + my $currenturl=$2; if ($currenturl=~m|^/enc/|) { - $currenturl=&Apache::lonenc::unencrypted($currenturl); + $currenturl=&Apache::lonenc::unencrypted($currenturl); } $currenturl=~s/\.\d+\.(\w+)$/\.$1/; - $currenturl=~s/^https?\:\/\///; - $currenturl=~s/^[^\/]+//; - my ($preupdatepos,$last,$reinitcheck); - if ($direction eq 'return') { - if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', - &GDBM_READER(),0640)) { - $last=$hash{'last_known'}; - untie(%hash); - } - } - if ($env{'request.course.id'}) { - # Check if course needs to be re-initialized - my $loncaparev = $r->dir_config('lonVersion'); - ($reinitcheck,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev); - if ($reinitcheck eq 'switch') { - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - $r->print(&Apache::loncommon::check_release_result(@reinit)); - return OK; - } elsif ($reinitcheck eq 'update') { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - $preupdatepos = &Apache::lonnet::symbread($currenturl); - unless ($direction eq 'return') { - if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', - &GDBM_READER(),0640)) { - $last=$hash{'last_known'}; - untie(%hash); - } - } - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - $r->print(&Apache::loncommon::start_page('Content Changed')); - my $preamble = '
'. - '
'. - &mt('Your course session is being updated because of recent changes by course personnel.'). - ' '.&mt('Please be patient').'.
'. - '
'; - %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble); - &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course')); - my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum"); - &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!')); - if ($ferr) { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - my $requrl = $r->uri; - $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; - $env{'user.reinit'} = 1; - return HTTP_NOT_ACCEPTABLE; - } else { - if ($last) { - my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last); - unless (&Apache::lonnet::symbverify($last,$fn)) { - undef($last); - } - } - } - } - } if ($direction eq 'firstres') { my $furl=&first_accessible_resource(); - my $usehttp = &check_http_req(\$furl,$hostname); - if (($usehttp) && ($hostname ne '')) { - $furl='http://'.$hostname.$furl; - } else { - $furl=&Apache::lonnet::absolute_url().$furl; - } - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($furl,$env{'request.course.id'},100)); - $r->print(&Apache::loncommon::end_page()); - return OK; - } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $furl); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + &Apache::lonnet::absolute_url().$furl); + + return REDIRECT; } if ($direction eq 'return') { # -------------------------------------------------------- Return to last known - my ($newloc,$usehttp); + my $last; + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + my $newloc; if (($last) && (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640))) { my ($murl,$id,$fn)=&Apache::lonnet::decode_symb($last); $id=$hash{'map_pc_'.&Apache::lonnet::clutter($murl)}.'.'.$id; $newloc=$hash{'src_'.$id}; if ($newloc) { - $usehttp = &check_http_req(\$newloc,$hostname); - if ($hash{'encrypted_'.$id}) { - $newloc=&Apache::lonenc::encrypted($newloc); - } - if ($newloc =~ m{^(/adm/wrapper/ext/[^\#]+)(?:|(\#[^\#]+))$}) { - my ($url,$anchor) = ($1,$2); - if ($anchor) { - $newloc = $url.(($url=~/\?/)?'&':'?').'symb='.&escape($last).$anchor; - } - } + if ($hash{'encrypted_'.$id}) { $newloc=&Apache::lonenc::encrypted($newloc); } + } else { $newloc='/adm/navmaps'; } untie %hash; } else { $newloc='/adm/navmaps'; - } - if (($usehttp) && ($hostname ne '')) { - $newloc='http://'.$hostname.$newloc; - } else { - $newloc=&Apache::lonnet::absolute_url().$newloc - } - if ($reinitcheck eq 'update') { - $r->print(&reinited_js($newloc,$env{'request.course.id'},100)); - $r->print(&Apache::loncommon::end_page()); - return OK; - } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $newloc); - return REDIRECT; - } + } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + &Apache::lonnet::absolute_url().$newloc); + + return REDIRECT; } + $currenturl=~s/^https?\:\/\///; + $currenturl=~s/^[^\/]+//; # # Is the current URL on the map? If not, start with last known URL # - unless (&Apache::lonnet::is_on_map($currenturl)) { - if ($preupdatepos) { - undef($preupdatepos); - } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', - &GDBM_READER(),0640)) { - $last=$hash{'last_known'}; + my $last; + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; untie(%hash); } if ($last) { $currenturl=&Apache::lonnet::clutter((&Apache::lonnet::decode_symb($last))[2]); } else { - my $newloc = &Apache::lonnet::absolute_url(). - '/adm/navmaps'; - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($newloc,$env{'request.course.id'},100)); - $r->print(&Apache::loncommon::end_page()); - return OK; - } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $newloc); - return REDIRECT; - } + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => + &Apache::lonnet::absolute_url(). + '/adm/noidea.html'); + return REDIRECT; } } # ------------------------------------------- Do we have any idea where we are? my $position; - if ($preupdatepos) { - $position = $preupdatepos; - } else { - $position=Apache::lonnet::symbread($currenturl); - } - if ($position) { + if ($position=Apache::lonnet::symbread($currenturl)) { # ------------------------------------------------------------------------- Yes my ($startoutmap,$mapnum,$thisurl)=&Apache::lonnet::decode_symb($position); $cachehash{$startoutmap}{$thisurl}=[$thisurl,$mapnum]; @@ -518,7 +359,7 @@ sub handler { @possibilities=split(/\,/,$next); if ($#possibilities==0) { # ---------------------------------------------- Only one possibility, redirect - ($redirecturl,$redirectsymb,$enc,$anchor)=&hash_src($next); + ($redirecturl,$redirectsymb)=&hash_src($next); $cachehash{$endupmap}{$redirecturl}= [$redirecturl,(split(/\./,$next))[1]]; } else { @@ -548,7 +389,7 @@ sub handler { untie(%hash); # --------------------------------------------------------- Store position info $cachehash{$startoutmap}{'last_direction'}=[$direction,'notasymb']; - foreach my $thismap (keys(%cachehash)) { + foreach my $thismap (keys %cachehash) { my $mapnum=$cachehash{$thismap}->{'mapnum'}; delete($cachehash{$thismap}->{'mapnum'}); &Apache::lonnet::symblist($thismap, @@ -563,35 +404,26 @@ sub handler { if ($direction eq 'back') { &Apache::lonnet::linklog($redirecturl,$currenturl); } -# ------------------------------------- Check for and display critical messages - my ($redirect, $url) = &Apache::loncommon::critical_redirect(300); - unless ($redirect) { - my $usehttp = &check_http_req(\$redirecturl,$hostname); - if (($usehttp) && ($hostname ne '')) { - $url='http://'.$hostname.$redirecturl; - } else { - $url=&Apache::lonnet::absolute_url().$redirecturl; - } - my $addanchor; - if (($anchor ne '') && (!$enc || $env{'request.role.adv'})) { - $addanchor = 1; - $url =~ s/\#.+$//; - } - $url = &add_get_param($url, { 'symb' => $redirectsymb}); - if ($addanchor) { - $url .= $anchor; - } - } - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($url,$env{'request.course.id'},100)); - $r->print(&Apache::loncommon::end_page()); - return OK; - } else { - &Apache::loncommon::content_type($r,'text/html'); - $r->header_out(Location => $url); - return REDIRECT; - } +# ------------------------------------------------- Check for critical messages + if ((time-$env{'user.criticalcheck.time'})>300) { + my @what=&Apache::lonnet::dump + ('critical',$env{'user.domain'}, + $env{'user.name'}); + if ($what[0]) { + if (($what[0] ne 'con_lost') && + ($what[0]!~/^error\:/)) { + $redirecturl='/adm/email?critical=display'; + $redirectsymb=''; + } + } + &Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); + } + + &Apache::loncommon::content_type($r,'text/html'); + my $url=&Apache::lonnet::absolute_url().$redirecturl; + $url = &add_get_param($url, { 'symb' => $redirectsymb}); + $r->header_out(Location => $url); + return REDIRECT; } else { # --------------------------------------------------------- There was a problem &Apache::loncommon::content_type($r,'text/html'); @@ -600,19 +432,13 @@ sub handler { 'explain' => 'You have reached the end of the sequence of materials.', 'back' => 'Go Back', - 'nav' => 'Course Contents', + 'nav' => 'Navigate Course Content', 'wherenext' => 'There are several possibilities of where to go next', 'pick' => 'Please click on the the resource you intend to access', 'titleheader' => 'Title', - 'type' => 'Type', - 'update' => 'Content updated', - 'expupdate' => 'As a result of a recent update to the sequence of materials, it is not possible to complete the page flip.', - 'gonav' => 'Go to the Contents page to select a resource to display.'); - if (&Apache::loncommon::course_type() eq 'Community') { - $lt{'nav'} = &mt('Community Contents'); - } + 'type' => 'Type'); if ($#possibilities>0) { my $start_page= &Apache::loncommon::start_page('Multiple Resources'); @@ -626,14 +452,9 @@ $lt{'pick'}: $lt{'titleheader'}$lt{'type'} ENDSTART foreach my $id (@possibilities) { - my $src = $multichoicehash{'src_'.$id}; - my $usehttp = &check_http_req(\$src,$hostname); - if (($usehttp) && ($hostname ne '')) { - $src = 'http://'.$hostname.$src; - } $r->print( ''. @@ -643,59 +464,31 @@ ENDSTART } $r->print(''); } else { - if ($reinitcheck) { - if (&Apache::loncommon::course_type() eq 'Community') { - $r->print( - &Apache::loncommon::start_page('Community Contents Updated')); - } else { - $r->print( - &Apache::loncommon::start_page('Course Contents Updated')); - } - $r->print('

'.$lt{'update'}.'

' - .'

'.$lt{'expupdate'}.'
' - .$lt{'gonav'}.'

'); - } else { - $r->print( - &Apache::loncommon::start_page('No Resource') - .'

'.$lt{'title'}.'

' - .'

'.$lt{'explain'}.'

'); - } + my $start_page= + &Apache::loncommon::start_page('No Resource'); + $r->print(<$lt{'title'} +

$lt{'explain'}

+ENDNONE } - if ((!@possibilities) && ($reinitcheck)) { - $r->print( - &Apache::lonhtmlcommon::actionbox( - ['
'.$lt{'nav'}.'' - ])); - } else { - $r->print( - &Apache::lonhtmlcommon::actionbox( - [''.$lt{'back'}.'', - ''.$lt{'nav'}.'' - ])); - } + $r->print(< +
  • $lt{'back'}
  • +
  • $lt{'nav'}
  • + +ENDMENU $r->print(&Apache::loncommon::end_page()); - return OK; } } else { # ------------------------------------------------- Problem, could not tie hash - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&Apache::loncommon::end_page()); - } $env{'user.error.msg'}="/adm/flip:bre:0:1:Course Data Missing"; return HTTP_NOT_ACCEPTABLE; } } else { # ---------------------------------------- No, could not determine where we are - my $newloc = '/adm/ambiguous'; - if ($reinitcheck eq 'update') { - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $r->print(&reinited_js($newloc,$env{'request.course.id'},100)); - $r->print(&Apache::loncommon::end_page()); - } else { - $r->internal_redirect($newloc); - } + $r->internal_redirect('/adm/ambiguous'); return OK; } } else {