--- rat/lonambiguous.pm 2003/04/12 15:43:58 1.9 +++ rat/lonambiguous.pm 2005/04/07 06:56:27 1.16 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to resolve ambiguous file locations # -# $Id: lonambiguous.pm,v 1.9 2003/04/12 15:43:58 www Exp $ +# $Id: lonambiguous.pm,v 1.16 2005/04/07 06:56:27 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,11 +25,6 @@ # # http://www.lon-capa.org/ # -# (TeX Content Handler -# -# 05/29/00,05/30,10/11 Gerd Kortemeyer) -# -# 10/11,10/12,10/16 Gerd Kortemeyer package Apache::lonambiguous; @@ -38,6 +33,7 @@ use Apache::lonnet; use Apache::Constants qw(:common REDIRECT); use GDBM_File; use Apache::loncommon; +use Apache::lonlocal; my %bighash; @@ -54,7 +50,8 @@ sub cleanup { sub getlost { my ($r,$errmsg)=@_; - $r->content_type('text/html'); + $errmsg=&mt($errmsg); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print( 'Unknown Error'. @@ -65,29 +62,38 @@ sub getlost { # ================================================================ Main Handler +sub make_symb { + my ($id)=@_; + my ($mapid,$resid)=split(/\./,$id); + my $map=$bighash{'map_id_'.$mapid}; + my $res=$bighash{'src_'.$id}; + my $symb=&Apache::lonnet::encode_symb($map,$resid,$res); + return $symb; +} + sub handler { my $r=shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } # ---------------------------------------------------------- Is this selecting? - if ($ENV{'form.selecturl'}) { + if ($env{'form.selecturl'}) { my $envkey; - if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { - foreach $envkey (keys %ENV) { + foreach $envkey (keys %env) { if ($envkey=~/^form\.(\d+)\.(\d+)$/) { # ---------------------------------------------------- Update symb and redirect my $mapid=$1; my $resid=$2; my $resurl=$bighash{'src_'.$mapid.'.'.$resid}; &Apache::lonnet::symblist($bighash{'map_id_'.$mapid}, - $resurl => $resid); + $resurl => [$resurl,$resid]); untie(%bighash); $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$resurl); @@ -104,7 +110,7 @@ sub handler { # ---------------------------------------------------------- Do we have a case? my $thisfn; - unless (($thisfn=$ENV{'request.ambiguous'})&&($ENV{'request.course.fn'})) { + unless (($thisfn=$env{'request.ambiguous'})&&($env{'request.course.fn'})) { &getlost($r,'Could not find information on resource.'); return OK; } @@ -115,7 +121,7 @@ sub handler { my %hash; my $syval=''; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', &GDBM_READER(),0640)) { $syval=$hash{$thisfn}; untie(%hash); @@ -124,13 +130,13 @@ sub handler { # ---------------------------------------------------------- There was an entry if ($syval) { - - if ($syval=~/\_$/) { + my ($page,undef,$res)=&Apache::lonnet::decode_symb($syval); + if ($res eq 'page') { # ----------------------------------- Okay, this should have appeared on a page - $syval=~s/\_\_\_$//; - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/res/'.$syval); + 'http://'.$ENV{'HTTP_HOST'}. + &Apache::lonnet::clutter($page)); return REDIRECT; } else { # There is not really a problem (???), but cannot go back without endless loop @@ -138,10 +144,15 @@ sub handler { return OK; } } - +# ------------------------------------Encrypted requests go straight to navmaps + if ($env{'request.enc'}) { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.'/adm/navmaps'); + return REDIRECT; + } # ------------------------------------------------ Would be standalone resource - if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', &GDBM_READER(),0640)) { # ---------------------------------------------- Get ID(s) for current resource my $ids=$bighash{'ids_'.&Apache::lonnet::clutter($thisfn)}; @@ -149,20 +160,33 @@ sub handler { # ------------------------------------------------------------------- Has ID(s) my @possibilities=split(/\,/,$ids); my $couldbe=''; - map { - if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_})) { + foreach (@possibilities) { + if ($bighash{'encrypted_'.$_}) { next; } + my $symb=&make_symb($_); + if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_},$symb)) { if ($couldbe) { $couldbe.=','.$_; } else { $couldbe=$_; } } - } @possibilities; + } if ($couldbe) { @possibilities=split(/\,/,$couldbe); + if ($#possibilities==0) { + my $id=$possibilities[0]; + my $resurl=$bighash{'src_'.$id}; + my $mapurl=$bighash{'map_id_'.(split(/\./,$id))[0]}; + my $symb=&make_symb($id); + &Apache::loncommon::content_type($r,'text/html'); + &Apache::lonnet::logthis('http://'.$ENV{'HTTP_HOST'}.$resurl.'?symb='.$symb); + $r->header_out(Location => + 'http://'.$ENV{'HTTP_HOST'}.$resurl.'?symb='.$symb); + return REDIRECT; + } if ($#possibilities>0) { # ----------------------------------------------- Okay, really multiple choices - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; my $bodytag= &Apache::loncommon::bodytag('Pick Instance of Resource'); @@ -174,24 +198,21 @@ and LON-CAPA has insufficient session in of the resource you meant.

Please click on the instance of the resource you intended to access: -

-

- - - - +

+
 TitleTypePart of ...
+ ENDSTART map { + my $resurl=$bighash{'src_'.$_}; my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]}; - $r->print(''); + my $symb=&make_symb($_); + $r->print(''); } @possibilities; - $r->print('
TitlePart of ...
'.$bighash{'title_'.$_}. - ''.$bighash{'type_'.$_}. - ''. - ($mapurl=~/^\/uploaded\//?'':''). - &Apache::lonnet::gettitle($mapurl).' '. - ($mapurl=~/^\/uploaded\//?'':'').'
'. + &Apache::lonnet::gettitle($symb). + ''. + &Apache::lonnet::gettitle($mapurl).' '. + '
'); + $r->print(''); untie(%bighash); return OK; } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.