--- rat/lonwrapper.pm 2022/08/28 02:41:30 1.78 +++ rat/lonwrapper.pm 2023/12/31 21:45:03 1.86 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Wrapper for external and binary files as standalone resources # -# $Id: lonwrapper.pm,v 1.78 2022/08/28 02:41:30 raeburn Exp $ +# $Id: lonwrapper.pm,v 1.86 2023/12/31 21:45:03 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,7 +47,7 @@ use Digest::MD5(); # ================================================================ Main Handler sub wrapper { my ($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation, - $title,$width,$height,$reuse) = @_; + $title,$width,$height,$reuse,$is_supp) = @_; my $forcereg; unless ($env{'form.folderpath'}) { @@ -82,7 +82,7 @@ sub wrapper { } } - my $noiframe = &Apache::loncommon::modal_link($url.$anchor,$lt{'show'},500,400); + my $noiframe = &Apache::loncommon::modal_link(&HTML::Entities::encode($url.$anchor,'&<>"\''),$lt{'show'},500,400); my $args = {'bgcolor' => '#FFFFFF'}; if ($forcereg) { $args->{'force_register'} = $forcereg; @@ -95,6 +95,8 @@ sub wrapper { } if ($env{'form.only_body'}) { $args->{'only_body'} = $env{'form.only_body'}; + } elsif (($is_supp) && ($env{'form.folderpath'} ne '')) { + $args->{'bread_crumbs_nomenu'} = 1; } my ($countdown,$donemsg,$headjs); @@ -151,13 +153,7 @@ sub wrapper { # unless ($clientmobile || ($exttool eq 'window') || ($exttool eq 'tab') || $uselink) { - $headjs = ' -'."\n"; + $headjs = &Apache::loncommon::iframe_wrapper_headjs(); } my $startpage = &Apache::loncommon::start_page('Menu',$headjs,$args).$countdown.$donemsg; @@ -166,7 +162,7 @@ var LCresizedef = 0; if (($uselink) && ($title eq '')) { if ($env{'form.symb'}) { $title=&Apache::lonnet::gettitle($env{'form.symb'}); - } else { + } elsif (!$is_supp) { my $symb=&Apache::lonnet::symbread($r->uri); if ($symb) { $title=&Apache::lonnet::gettitle($symb); @@ -225,7 +221,7 @@ var LCresizedef = 0; unless ($reuse) { my $resid; if ($env{'request.course.id'}) { - unless ($env{'form.folderpath'} =~ /^supplemental/) { + unless (($is_supp) || ($env{'form.folderpath'} =~ /^supplemental/)) { my $symb=&Apache::lonnet::symbread($r->uri); if ($symb) { my $navmap = Apache::lonnavmaps::navmap->new(); @@ -300,49 +296,8 @@ ENDLINK $linktext = &mt('Link to resource'); return $startpage.&create_link($url,$anchor,$title,$linktext).$endpage; } else { - my $offset = 5; - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['inhibitmenu']); - if ($env{'form.inhibitmenu'} eq 'yes') { - $offset = 0; - } - my $script = &Apache::lonhtmlcommon::scripttag(<"'); return <uri; my ($is_ext,$brcrum,$absolute,$is_pdf,$exttool,$cdom,$cnum,$hostname, - $linktext,$explanation,$width,$height,$reuse); + $linktext,$explanation,$width,$height,$reuse,$is_supp); for ($url){ s|^/adm/wrapper||; @@ -409,7 +364,7 @@ sub handler { } unless ($height =~ /^\d+$/) { $height = ''; - } + } } else { $width = ''; $height = ''; @@ -425,9 +380,16 @@ sub handler { my %toolhash = &Apache::lonnet::get('exttool_'.$marker,['target','linktext','explanation','id','width','height'], $cdom,$cnum); if ($toolhash{'id'}) { - my %ltitools = &Apache::lonnet::get_domain_lti($cdom,'consumer'); - if (ref($ltitools{$toolhash{'id'}}) eq 'HASH') { - $exttoolremote = $ltitools{$toolhash{'id'}}{'url'}; + my ($idx,%ltitools); + if ($toolhash{'id'} =~ /^c(\d+)$/) { + $idx = $1; + %ltitools = &Apache::lonnet::get_course_lti($cnum,$cdom,'consumer'); + } else { + $idx = $toolhash{'id'}; + %ltitools = &Apache::lonnet::get_domain_lti($cdom,'consumer'); + } + if (ref($ltitools{$idx}) eq 'HASH') { + $exttoolremote = $ltitools{$idx}{'url'}; } } if ($toolhash{'target'} eq 'window') { @@ -446,7 +408,7 @@ sub handler { } if (($is_ext) || ($exttool)) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['forceedit','register','folderpath','symb','idx','title','anchor']); + ['forceedit','register','folderpath','symb','idx','title','anchor','only_body']); if (($env{'form.forceedit'}) && (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) && (($env{'form.folderpath'} =~ /^supplemental/) || @@ -460,6 +422,7 @@ sub handler { if ($env{'form.anchor'} ne '') { $url .= '#'.$env{'form.anchor'}; } + $is_supp = 1; } my $type = 'ext'; if ($exttool) { @@ -483,8 +446,37 @@ sub handler { $title = &mt('External Tool'); } } - $brcrum = - &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + $title = &HTML::Entities::encode($title,'\'"<>&'); + $is_supp = 1; + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom); + } + unless ($env{'form.only_body'}) { + $brcrum = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } + } + } elsif ($env{'request.course.id'}) { + my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'}); + $courseurl =~ s{^/}{}; + if ($url =~ m{^\Q/uploaded/$courseurl/supplemental/\E}) { + $is_supp = 1; + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','title','only_body']); + if ($env{'form.folderpath'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom); + } + my $title = $env{'form.title'}; + $title = &HTML::Entities::encode($title,'\'"<>&'); + my $crstype = &Apache::loncommon::course_type(); + unless ($env{'form.only_body'}) { + $brcrum = + &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1); + } } } @@ -517,7 +509,8 @@ sub handler { } $r->print( wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool, - $linktext,$explanation,undef,$width,$height,$reuse) ); + $linktext,$explanation,undef,$width,$height,$reuse, + $is_supp) ); } # not just the menu @@ -544,7 +537,9 @@ described at http://www.lon-capa.org. =over -=item wrapper($r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation,$title,$width,$height,$reuse) +=item wrapper() + +Args: $r,$url,$brcrum,$absolute,$is_ext,$is_pdf,$exttool,$linktext,$explanation,$title,$width,$height,$reuse,$is_supp =over @@ -588,10 +583,10 @@ in Firefox 23 and later, when serving fr =item $is_ext true if URL is for an external resource. Default true value -is 1 (display in iframe, unless $uselink is true). +is 1 (display in iframe, unless $uselink is true). If external resource is to be displayed in a tab, value of $is_ext will be tab, if to be displayed in a pop-up window, -value of $is_ext will be window. +value of $is_ext will be window. =item $is_pdf @@ -603,13 +598,13 @@ If URL is for an External Tool, will con =item $linktext -optional. If URL is for an External Tool, and target type is window or tab, +optional. If URL is for an External Tool, and target type is window or tab, then the link text may be an option set in the course for each tool instance, or may be a default defined in the domain for all instances of the tool. =item $explanation -optional. If URL is for an External Tool, and target type is window or tab, +optional. If URL is for an External Tool, and target type is window or tab, then the explanation is an option set in the course for each tool instance, or may be a default defined in the domain for all instances of the tool. @@ -624,18 +619,18 @@ hidden URL set for the resource). =item $width optional. If URL is for an External Tool, and target type is window, -then a default width may have been defined in the domain for all instances of +then a default width may have been defined in the domain for all instances of the tool. If so, that width will be used for the window opened (via a link) -to launch the external tool. If the URL is for an External Resource, and +to launch the external tool. If the URL is for an External Resource, and $is_ext is window, then a default width (px) may have been defined in the current course for all external resource instances. =item $height optional. If URL is for an External Tool, and target type is window, -then a default height may have been defined in the domain for all instances of +then a default height may have been defined in the domain for all instances of the tool. If so, that height will be used for the window opened (via a link) -to launch the external tool. If the URL is for an External Resource, and +to launch the external tool. If the URL is for an External Resource, and $is_ext is window, then a default height (px) may have been defined in the current course for all external resource instances. @@ -649,26 +644,56 @@ of all external resource instances in a Returns markup for the entire page. +=item create_link() + +Args: $url,$anchor,$title,$linktext + +=over + +=item $url + +URL to link to + +=item $anchor + +optional. Will be the anchor to append to the URL, if there is one. + +=item $title + +optional. If provided will be the title displayed above the link. If +one is not provided, then $env{'form.title'} will be used, unless empty. + +=item $linktext + +The text to inlcude between the and tags. + +=back + +Returns HTML needed to show a link which can be followed to display the +part of the original URL following the initial /adm/wrapper part +in the original request, in the case where an iframe is not going to be +used to embed the content available at the URL in the existing page. + =item handler() Content handler for requests for: /adm/wrapper/... used for content to be displayed in an iframe, or launched in a separate tab or window via a link. The target URL is extracted from the requested URL, by -removing the /adm/wrapper prefix. +removing the /adm/wrapper prefix. -The target URL will typically be a PDF served from the current server, an +The target URL will typically be a PDF served from the current server, an external resource URL served from a different server, or an external tool (from an LTI Provider) launched from LON-CAPA (as LTI Consumer) and launched via a link. If the request included forceedit in the query string, and the requester has -rights to modify course content, then the editor will be didplayed to allow +rights to modify course content, then the editor will be displayed to allow changes to be made to the resource (e.g., change the URL of the external resource, -or change the setting for the external tool instance. +or change the setting for the external tool instance). If not in edit mode, then the wrapper() subroutine will be called to generate the standard LON-CAPA inline menu, and then either a link to launch a separate tab or -window, or an iframe to display the content inline. +window, or an iframe to display the content inline. =back