--- rat/lonpageflip.pm 2006/03/06 23:41:07 1.66 +++ rat/lonpageflip.pm 2008/03/12 02:45:50 1.75 @@ -2,7 +2,7 @@ # # Page flip handler # -# $Id: lonpageflip.pm,v 1.66 2006/03/06 23:41:07 albertel Exp $ +# $Id: lonpageflip.pm,v 1.75 2008/03/12 02:45:50 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,8 +30,10 @@ package Apache::lonpageflip; use strict; +use LONCAPA; use Apache::Constants qw(:common :http REDIRECT); use Apache::lonnet; +use Apache::loncommon(); use HTML::TokeParser; use GDBM_File; @@ -84,29 +86,40 @@ sub hash_src { return ($hash{'src_'.$id},$symb); } -# Inputs are a url, adn a hash ref of -# form name => value pairs -# takes care of properly adding the form name elements and values to the -# the url doing proper escaping of the values and joining with ? or & as -# needed - -sub add_get_param { - my ($url,$form_data) = @_; - my $needs_question_mark = ($url !~ /\?/); - - while (my ($name,$value) = each(%$form_data)) { - if ($needs_question_mark) { - $url.='?'; - $needs_question_mark = 0; - } else { - $url.='&'; +sub move { + my ($next,$endupmap,$direction) = @_; + my $safecount=0; + my $allowed=0; + do { + ($next,$endupmap)=&get_next_possible_move($next,$endupmap,$direction); + + my $url = $hash{'src_'.$next}; + my ($mapid,$resid)=split(/\./,$next); + my $symb = &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid}, + $resid,$url); + if ($url eq '' || $symb eq '') { + $allowed = 0; + } else { + my $priv = &Apache::lonnet::allowed('bre',$url,$symb); + $allowed = (($priv eq 'F') || ($priv eq '2')); } - $url.=$name.'='.&Apache::lonnet::escape($form_data->{$name}); - } - return $url; + $safecount++; + } while ( ($next) + && ($next!~/\,/) + && ( + (!$hash{'src_'.$next}) + || ( + (!$env{'request.role.adv'}) + && $hash{'randomout_'.$next} + ) + || (!$allowed) + ) + && ($safecount<10000)); + + return ($next,$endupmap); } -sub move { +sub get_next_possible_move { my ($rid,$mapurl,$direction)=@_; my $startoutrid=$rid; @@ -207,10 +220,7 @@ sub navlaunch { &Apache::loncommon::content_type($r,'text/html'); &Apache::loncommon::no_cache($r); $r->send_http_header; - my $html=&Apache::lonxml::xmlbegin(); - $r->print("$html\n"); - $r->print(''. - &Apache::loncommon::bodytag('Launched')); + $r->print(&Apache::loncommon::start_page('Launched')); $r->print(<Goto first resource

Collapse external navigation window

ENDNAV - $r->print(&Apache::loncommon::endbodytag().''); + $r->print(&Apache::loncommon::end_page()); } + +sub first_accessible_resource { + my $furl; + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'.db', + &GDBM_READER(),0640)) { + $furl=$hash{'first_url'}; + my %args; + my ($url,$args) = split(/\?/,$furl); + foreach my $pair (split(/\&/,$args)) { + my ($name,$value) = split(/=/,$pair); + $args{&unescape($name)} = &unescape($value); + } + if (!&Apache::lonnet::allowed('bre',$url,$args{'symb'})) { +# 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 + 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 { + return '/adm/navmaps'; + } +} + # ================================================================ Main Handler sub handler { @@ -253,15 +293,10 @@ sub handler { } $currenturl=~s/\.\d+\.(\w+)$/\.$1/; if ($direction eq 'firstres') { - my $furl; - if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db', - &GDBM_READER(),0640)) { - $furl=$bighash{'first_url'}; - untie(%bighash); - } + my $furl=&first_accessible_resource(); &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$furl); + &Apache::lonnet::absolute_url().$furl); return REDIRECT; } @@ -295,7 +330,7 @@ sub handler { } else { &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$newloc); + &Apache::lonnet::absolute_url().$newloc); return REDIRECT; } @@ -318,7 +353,8 @@ sub handler { if ($direction eq 'return') { &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/adm/noidea.html'); + &Apache::lonnet::absolute_url(). + '/adm/noidea.html'); return REDIRECT; } else { &navlaunch($r); @@ -345,14 +381,6 @@ sub handler { my $endupmap; ($next,$endupmap)=&move($rid,$startoutmap,$direction); # -------------------------------------- Do we have one and only one empty URL? - my $safecount=0; - while (($next) && ($next!~/\,/) && - ((!$hash{'src_'.$next}) || - ((!$env{'request.role.adv'}) && $hash{'randomout_'.$next})) - && ($safecount<10000)) { - ($next,$endupmap)=&move($next,$endupmap,$direction); - $safecount++; - } # We are now at at least one non-empty URL # ----------------------------------------------------- Check out possibilities if ($next) { @@ -416,11 +444,11 @@ sub handler { $redirectsymb=''; } } - &Apache::lonnet::appenv('user.criticalcheck.time'=>time); + &Apache::lonnet::appenv({'user.criticalcheck.time'=>time}); } &Apache::loncommon::content_type($r,'text/html'); - my $url='http://'.$ENV{'HTTP_HOST'}.$redirecturl; + my $url=&Apache::lonnet::absolute_url().$redirecturl; $url = &add_get_param($url, { 'symb' => $redirectsymb}); $r->header_out(Location => $url); return REDIRECT; @@ -440,11 +468,10 @@ sub handler { 'titleheader' => 'Title', 'type' => 'Type'); if ($#possibilities>0) { - my $bodytag= - &Apache::loncommon::bodytag('Multiple Resources'); + my $start_page= + &Apache::loncommon::start_page('Multiple Resources'); $r->print(<Choose Next Location -$bodytag +$start_page

$lt{'wherenext'}

$lt{'pick'}: @@ -465,10 +492,10 @@ ENDSTART } $r->print(''); } else { - my $bodytag=&Apache::loncommon::bodytag('No Resource'); + my $start_page= + &Apache::loncommon::start_page('No Resource'); $r->print(<No Resource -$bodytag +$start_page

$lt{'title'}

$lt{'explain'}

ENDNONE @@ -477,8 +504,9 @@ ENDNONE + ENDMENU + $r->print(&Apache::loncommon::end_page()); return OK; } } else {