--- loncom/interface/lonexttool.pm 2025/06/06 21:21:53 1.22.2.6 +++ loncom/interface/lonexttool.pm 2025/06/14 02:50:25 1.29 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Launch External Tool Provider (LTI) # -# $Id: lonexttool.pm,v 1.22.2.6 2025/06/06 21:21:53 raeburn Exp $ +# $Id: lonexttool.pm,v 1.29 2025/06/14 02:50:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -96,7 +96,7 @@ sub handler { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $chome = $env{'course.'.$env{'request.course.id'}.'.home'}; - my ($idx,$crstool,$is_tool,%toolhash,%toolsettings); + my ($idx,$crstool,$is_tool,%toolhash,%toolsettings,$desturl,$delay); if ($r->uri eq "/adm/$cdom/$cnum/$marker/$exttool") { %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); @@ -131,11 +131,30 @@ sub handler { } } unless ($gotreturnurl) { - $toolhash{'returnurl'} = 'default'; + $toolhash{'returnurl'} = 'default'; } } else { $toolhash{'returnurl'} = 'none'; } + if ($toolhash{'desturl'}) { + if ((ref($toolhash{'crsconf'}) eq 'HASH')) { + if ($toolhash{'crsconf'}{'desturl'}) { + if ((exists($toolsettings{'desturl'})) && + ($toolsettings{'desturl'} =~ m{^(https?\://|/)})) { + $desturl = $toolsettings{'desturl'}; + if ((exists($toolsettings{'delay'})) && + ($toolsettings{'delay'} =~ /^\d+\.?\d*$/)) { + $delay = $toolsettings{'delay'}; + } + } + } elsif ($toolhash{'defdest'} =~ m{^(https?\://|/)}) { + $desturl = $toolhash{'defdest'}; + if ($toolhash{'defdelay'} =~ /^\d+\.?\d*$/) { + $delay = $toolhash{'defdelay'}; + } + } + } + } $is_tool = 1; } } @@ -233,11 +252,31 @@ sub handler { if ($toolhash{'crsappend'} ne '') { $url .= $toolhash{'crsappend'}; } + if ($desturl ne '') { + my ($scheme,$provider,$path); + if ($url =~ m{^https?\://}) { + ($scheme,$provider,$path) = ($url =~ m{^(https?\://)([^/]+)(|/.+)$}); + if ($desturl =~ m{^/}) { + if ($path eq $desturl) { + undef($desturl); + } else { + $desturl = $scheme.$provider.$desturl; + } + } elsif ($desturl =~ m{^https?\://}) { + if ($url eq $desturl) { + undef($desturl); + } + } + } elsif ($url eq $desturl) { + undef($desturl); + } + } my %info = ( method => $toolhash{'sigmethod'}, ); $r->print(&launch_html($cdom,$cnum,$crstool,$url,$idx, - $toolhash{'cipher'},$submittext,\%lti,\%info)); + $toolhash{'cipher'},$submittext, + \%lti,\%info,$desturl,$delay)); } else { $r->print('
'.&mt('External Tool Unavailable').'
'); } @@ -491,14 +530,14 @@ sub lti_params { my $mapurl = &Apache::lonnet::clutter($map); my $mapsymb = &Apache::lonnet::symbread($map); if ((&Apache::lonnet::EXT('resource.0.encrypturl',$mapsymb) =~ /^yes$/i) && - (!$env{'request.role.adv'})) { + (!$env{'request.role.adv'})) { $return_url = &Apache::lonenc::encrypted($mapurl); } else { $return_url = $mapurl; } $return_url .= '?navmap=1'; } elsif ($env{'httpref.'.$uri} eq '/adm/coursedoc') { - $return_url = '/adm/supplemental'; + $return_url = '/adm/supplemental'; } else { $return_url = '/adm/navmaps'; } @@ -519,33 +558,93 @@ sub lti_params { } sub launch_html { - my ($cdom,$cnum,$crstool,$url,$idx,$keynum,$submittext,$paramsref,$inforef) = @_; + my ($cdom,$cnum,$crstool,$url,$idx,$keynum,$submittext,$paramsref, + $inforef,$desturl,$delay) = @_; my ($status,$hashref) = &Apache::lonnet::sign_lti($cdom,$cnum,$crstool,'tools','launch',$url,$idx,$keynum, $paramsref,$inforef); unless ($status eq 'ok') { return '
'.&mt('External Tool Unavailable').'
'; } - my $action = &HTML::Entities::encode($url,'<>&"'); - my $form = <<"END"; + my ($action,$js_html,$header,$title,$bodytag,$form,$divsty,$delay_in_ms); + if ($delay ne '') { + $delay_in_ms = int(1000 * $delay); + } + $action = &HTML::Entities::encode($url,'<>&"'); + $title = &mt('Launcher'); + $header = <<"END"; +END + if ($desturl) { + $divsty = 'none'; + if ($delay_in_ms eq '') { + $delay_in_ms = 1000; + } + $bodytag = <<"END"; + +END + } else { + $divsty = 'block'; + $bodytag = <<"END"; -
+END + } + $form = <<"END"; +
END if (ref($hashref) eq 'HASH') { foreach my $item (keys(%{$hashref})) { my $type = 'hidden'; if ($item eq 'basiclti_submit') { - $type = 'submit'; + unless ($desturl) { + $type = 'submit'; + } } $form .= ''."\n"; } } $form .= "
\n"; - $form .= <<"ENDJS"; + my $footer = <<"END"; + + +END + if ($desturl) { + $js_html = $header.$bodytag.$form.$footer; + &js_escape(\$js_html); + &js_escape(\$desturl); + return <<"END"; +$header + +$title + + + + + +$footer +END + } else { + return <<"END"; +$header +$bodytag +$form + -ENDJS - $form .= "\n"; - return $form; +// ]]> + +$footer +END + } } sub gradabletool_access_check {