--- loncom/interface/lonexttool.pm 2025/06/14 18:51:58 1.22.2.7 +++ loncom/interface/lonexttool.pm 2025/03/15 01:03:33 1.26 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Launch External Tool Provider (LTI) # -# $Id: lonexttool.pm,v 1.22.2.7 2025/06/14 18:51:58 raeburn Exp $ +# $Id: lonexttool.pm,v 1.26 2025/03/15 01:03:33 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,$desturl,$delay); + my ($idx,$crstool,$is_tool,%toolhash,%toolsettings); if ($r->uri eq "/adm/$cdom/$cnum/$marker/$exttool") { %toolsettings=&Apache::lonnet::dump('exttool_'.$marker,$cdom,$cnum); @@ -131,30 +131,11 @@ 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; } } @@ -247,36 +228,16 @@ sub handler { } my $submittext = &mt('Launch [_1]',$toolhash{'title'}); if (($toolhash{'url'} ne '') && ($launchok)) { - my %lti = <i_params($r,$cnum,$cdom,$marker,$exttool,$idx,$submittext,\%toolhash); + my %lti = <i_params($r,$cnum,$cdom,$idx,$submittext,\%toolhash); my $url = $toolhash{'url'}; 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,$desturl,$delay)); + $toolhash{'cipher'},$submittext,\%lti,\%info)); } else { $r->print('
'.&mt('External Tool Unavailable').'
'); } @@ -285,7 +246,7 @@ sub handler { } sub lti_params { - my ($r,$cnum,$cdom,$marker,$exttool,$idx,$submittext,$toolsref) = @_; + my ($r,$cnum,$cdom,$idx,$submittext,$toolsref) = @_; my ($version,$context_type,$msgtype,$toolname,$passback,$roster,$locale, $crslabel,$crstitle,$gradesecret,$rostersecret,%fields,%rolesmap, %display,%custom,@userlangs,$incdom,$returnurl,$backtourl); @@ -361,10 +322,8 @@ sub lti_params { if (scalar(@userlangs) == 1) { $locale = $userlangs[0]; } - my ($title,$digest_symb,$resource_link_id); - my $ignorecachednull = 1; - my ($symb) = &Apache::lonnet::whichuser('',$ignorecachednull); - my $uri = "/adm/$cdom/$cnum/$marker/$exttool"; + my ($title,$digest_symb,$digest_suppurl,$resource_link_id); + my ($symb) = &Apache::lonnet::whichuser(); if ($symb) { $digest_symb = &Encode::decode('UTF-8',$symb); $digest_symb = &Digest::SHA::sha1_hex($digest_symb); @@ -377,16 +336,10 @@ sub lti_params { $title = $res->compTitle(); } } - } elsif ($env{'httpref.'.$uri} eq '/adm/coursedoc') { - my $digest_suppurl = &Encode::decode('UTF-8',$uri); + } elsif ($env{'httpref.'.$env{'request.noversionuri'}} eq '/adm/coursedoc') { + $digest_suppurl = &Encode::decode('UTF-8',$env{'request.noversionuri'}); $digest_suppurl = &Digest::SHA::sha1_hex($digest_suppurl); $resource_link_id = $digest_suppurl; - $title = &mt('Supplemental Content').': '.$marker.'_'.$exttool; - } else { - my $digest_url = &Encode::decode('UTF-8',$uri); - $digest_url = &Digest::SHA::sha1_hex($digest_url); - $resource_link_id = $digest_url; - $title = &mt('External Tool').': '.$marker.'_'.$exttool; } my $domdesc = &Apache::lonnet::domain($cdom); my $primary_id = &Apache::lonnet::domain($cdom,'primary'); @@ -530,20 +483,20 @@ 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'; + } elsif ($env{'httpref.'.$env{'request.noversionuri'}} eq '/adm/coursedoc') { + $return_url = '/adm/supplemental'; } else { $return_url = '/adm/navmaps'; } $ltiparams{'launch_presentation_return_url'} = $location.$return_url; } else { - $uri = '/adm/wrapper'.$uri; + my $uri = $env{'request.noversionuri'}; if ($env{'request.enc'}) { $uri = &Apache::lonenc::encrypted($uri); } @@ -558,93 +511,33 @@ sub lti_params { } sub launch_html { - my ($cdom,$cnum,$crstool,$url,$idx,$keynum,$submittext,$paramsref, - $inforef,$desturl,$delay) = @_; + my ($cdom,$cnum,$crstool,$url,$idx,$keynum,$submittext,$paramsref,$inforef) = @_; 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,$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"; + my $action = &HTML::Entities::encode($url,'<>&"'); + my $form = <<"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') { - unless ($desturl) { - $type = 'submit'; - } + $type = 'submit'; } $form .= ''."\n"; } } $form .= "
\n"; - my $footer = <<"END"; - - -END - if ($desturl) { - $js_html = $header.$bodytag.$form.$footer; - &js_escape(\$js_html); - &js_escape(\$desturl); - return <<"END"; -$header - -$title - - - - - + $form .= <<"ENDJS"; -$footer -END - } else { - return <<"END"; -$header -$bodytag -$form - -$footer -END - } + +ENDJS + $form .= "\n"; + return $form; } sub gradabletool_access_check {