From raeburn at source.lon-capa.org Tue Apr 10 06:50:55 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Tue, 10 Apr 2018 10:50:55 -0000 Subject: [LON-CAPA-cvs] cvs: loncom / production_dns_domain.tab production_dns_hosts.tab Message-ID: raeburn Tue Apr 10 10:50:55 2018 EDT Modified files: /loncom production_dns_domain.tab production_dns_hosts.tab Log: - msuoutreach -> msuk12 Index: loncom/production_dns_domain.tab diff -u loncom/production_dns_domain.tab:1.192 loncom/production_dns_domain.tab:1.193 --- loncom/production_dns_domain.tab:1.192 Fri Apr 6 19:59:27 2018 +++ loncom/production_dns_domain.tab Tue Apr 10 10:50:55 2018 @@ -310,4 +310,4 @@ #Gateway msudemo:Demo Machine:krb4:MSU.EDU:en-US:East Lansing, MI:-84.483:42.737:msudemol1 -msuoutreach:Michigan State University Outreach:::en-US:East Lansing, MI:-84.483:42.737:msuoutreachl1 +msuk12:Michigan State University K12 Outreach:::en-US:East Lansing, MI:-84.483:42.737:msuk12l1 Index: loncom/production_dns_hosts.tab diff -u loncom/production_dns_hosts.tab:1.266 loncom/production_dns_hosts.tab:1.267 --- loncom/production_dns_hosts.tab:1.266 Fri Apr 6 19:59:27 2018 +++ loncom/production_dns_hosts.tab Tue Apr 10 10:50:55 2018 @@ -384,4 +384,4 @@ #Gateways msudemol1:msudemo:library:s12.lite.msu.edu:https:msu.edu -msuoutreachl1:msuoutreach:library:outreach.lite.msu.edu:https:msu.edu +msuk12l1:msuk12:library:outreach.lite.msu.edu:https:msu.edu From raeburn at source.lon-capa.org Fri Apr 13 20:10:49 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Apr 2018 00:10:49 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface londocs.pm Message-ID: raeburn Sat Apr 14 00:10:49 2018 EDT Modified files: /loncom/interface londocs.pm Log: - Typo in rev. 1.650. Index: loncom/interface/londocs.pm diff -u loncom/interface/londocs.pm:1.651 loncom/interface/londocs.pm:1.652 --- loncom/interface/londocs.pm:1.651 Fri Jan 12 13:33:37 2018 +++ loncom/interface/londocs.pm Sat Apr 14 00:10:48 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.651 2018/01/12 13:33:37 raeburn Exp $ +# $Id: londocs.pm,v 1.652 2018/04/14 00:10:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -4830,7 +4830,7 @@ &endContentScreen()); return ''; } else { - $r->print('

'.&mt('Tiny URLs for deep-linking into course').'

'."\n". + $r->print('

'.&mt('Tiny URLs for deep-linking into course').'

'."\n"); $r->rflush(); my $readonly; if ($canedit) { From raeburn at source.lon-capa.org Fri Apr 13 20:36:07 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Apr 2018 00:36:07 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface loncommon.pm Message-ID: raeburn Sat Apr 14 00:36:07 2018 EDT Modified files: /loncom/interface loncommon.pm Log: - Bug 6754 LON-CAPA as LTI Provider - Creation of new LON-CAPA course available from an LTI Consumer. Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.1310 loncom/interface/loncommon.pm:1.1311 --- loncom/interface/loncommon.pm:1.1310 Fri Mar 23 01:01:21 2018 +++ loncom/interface/loncommon.pm Sat Apr 14 00:36:06 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.1310 2018/03/23 01:01:21 raeburn Exp $ +# $Id: loncommon.pm,v 1.1311 2018/04/14 00:36:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -16488,7 +16488,7 @@ undef,\%userenv,\%domdef,\%is_adv); } - foreach my $crstype ('official','unofficial','community','textbook','placement') { + foreach my $crstype ('official','unofficial','community','textbook','placement','lti') { $userenv{'canrequest.'.$crstype} = &Apache::lonnet::usertools_access($username,$domain,$crstype, 'reload','requestcourses', From raeburn at source.lon-capa.org Fri Apr 13 21:50:43 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Apr 2018 01:50:43 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /auth migrateuser.pm Message-ID: raeburn Sat Apr 14 01:50:43 2018 EDT Modified files: /loncom/auth migrateuser.pm Log: - Bug 6754 LON-CAPA as LTI Provider If user is currently logged in, but not as an LTI log-in, log them out. -------------- next part -------------- Index: loncom/auth/migrateuser.pm diff -u loncom/auth/migrateuser.pm:1.27 loncom/auth/migrateuser.pm:1.28 --- loncom/auth/migrateuser.pm:1.27 Fri Mar 23 01:01:29 2018 +++ loncom/auth/migrateuser.pm Sat Apr 14 01:50:43 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Starts a user off based of an existing token. # -# $Id: migrateuser.pm,v 1.27 2018/03/23 01:01:29 raeburn Exp $ +# $Id: migrateuser.pm,v 1.28 2018/04/14 01:50:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,6 +36,7 @@ use Apache::lonlocal; use Apache::lonlogin(); use Apache::ltiauth; +use CGI::Cookie; sub goto_login { my ($r,$domain,$data) = @_; @@ -246,6 +247,69 @@ return OK; } +sub logout { + my ($r,$handle,$data,$lti_env) = @_; + unlink($handle); + if ($env{'user.linkedenv'} ne '') { + my $lonidsdir=$r->dir_config('lonIDsDir'); + if ((-l $env{'user.linkedenv'}) && + (readlink($env{'user.linkedenv'}) eq "$lonidsdir/$handle.id")) { + unlink($env{'user.linkedenv'}); + } + } + my %temp=('logout' => time); + &Apache::lonnet::put('email_status',\%temp); + &Apache::lonnet::log($env{'user.domain'}, + $env{'user.name'}, + $env{'user.home'}, + "Logout $ENV{'REMOTE_ADDR'}"); + + &Apache::loncommon::content_type($r,'text/html'); + + #expire the cookie + my $c = new CGI::Cookie(-name => 'lonID', + -value => '', + -expires => '-10y',); + $r->headers_out->add('Set-cookie' => $c); + if ($env{'user.linkedenv'}) { + my $linked = new CGI::Cookie(-name => 'lonLinkID', + -value => '', + -expires => '-10y',); + $r->headers_out->add('Set-cookie' => $linked); + } + my $lonhost = $r->dir_config('lonHostID'); + my (%info,%user_info,%lti_info); + if (ref($lti_env) eq 'HASH') { + %lti_info = %{$lti_env}; + } + my $lonhost = $r->dir_config('lonHostID'); + if (ref($data) eq 'HASH') { + %user_info=('ip' => $ENV{'REMOTE_ADDR'}, + 'domain' => $data->{'domain'}, + 'username' => $data->{'username'}, + 'role' => $data->{'role'}, + 'origurl' => $data->{'origurl'}, + 'symb' => $data->{'symb'}, + 'server' => $lonhost); + } + %info = (%user_info,%lti_info); + my $token = &Apache::lonnet::tmpput(\%info,$lonhost); + my $url = '/adm/migrateuser?token='.$token; + $r->send_http_header; + $r->print( + &Apache::loncommon::start_page('Updating Session ...',undef, + {'redirect' => [0.1,$url], + 'only_body' => 1,}). + &Apache::loncommon::end_page()); + $r->register_cleanup(\&flush_course_logs); + return; +} + +sub flush_course_logs { + &Apache::lonnet::flushcourselogs(); + return OK; +} + sub handler { my ($r) = @_; @@ -305,35 +369,77 @@ if ($handle) { &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), $handle); -#FIXME if user is not currently logged in as an LTI log-in log them out. if ($data{'lti.login'}) { - if (($data{'lti.reqcrs'}) && ($data{'lti.reqrole'} eq 'cc')) { + my $needslogout; + if ($env{'request.lti.login'}) { + if (($env{'user.name'} ne $data{'username'}) || + ($env{'user.domain'} ne $data{'domain'})) { + $needslogout = 1; + } + } else { + $needslogout = 1; + } +# If access is via LTI, and user already has a non-LTI session cookie +# (and session) or has an LTI session cookie for a different username, +# logout the existing session, and start a new one + if ($needslogout) { + &logout($r,$handle,\%data,$lti_env); + } elsif (($data{'lti.reqcrs'}) && ($data{'lti.reqrole'} eq 'cc')) { $form{'lti.reqcrs'} = $data{'lti.reqcrs'}; $form{'lti.reqrole'} = $data{'lti.reqrole'}; $form{'lti.sourcecrs'} = $data{'lti.sourcecrs'}; + if ($data{'lti.passbackid'}) { + $form{'lti.passbackid'} = $data{'lti.passbackid'}; + } + if ($data{'lti.passbackurl'}) { + $form{'lti.passbackurl'} = $data{'lti.passbackurl'}; + } + if ($data{'lti.rosterid'}) { + $form{'lti.rosterid'} = $data{'lti.rosterid'}; + } + if ($data{'lti.rosterurl'}) { + $form{'lti.rosterurl'} = $data{'lti.rosterurl'}; + } &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; &Apache::ltiauth::lti_reqcrs($r,$data{'domain'},\%form,$data{'username'},$data{'domain'}); - } elsif ($data{'lti.selfenrollrole'}) { - if (&Apache::ltiauth::lti_enroll($data{'username'},data{'domain'}, - $data{'lti.selfenrollrole'}) eq 'ok') { - my $url = '/adm/roles?selectrole=1&'. - &escape($data{'lti.selfenrollrole'}).'=1'; - if ($data{'origurl'} =~ m{/default_\d+\.sequence$}) { - $url .= '&orgurl='.$data{'origurl'}.'&navmap=1'; - } elsif ($data{'origurl'} ne '') { - $url .= '&orgurl='.$data{'origurl'}; + } else { + if (ref($lti_env) eq 'HASH') { + delete($lti_env->{'reqcrs'}); + delete($lti_env->{'reqrole'}); + delete($lti_env->{'selfenrollrole'}); + } + if ($data{'lti.selfenrollrole'}) { + if (&Apache::ltiauth::lti_enroll($data{'username'},data{'domain'}, + $data{'lti.selfenrollrole'}) eq 'ok') { + my $url = '/adm/roles?selectrole=1&'. + &escape($data{'lti.selfenrollrole'}).'=1'; + if ($data{'origurl'} =~ m{/default_\d+\.sequence$}) { + $url .= '&orgurl='.$data{'origurl'}.'&navmap=1'; + } elsif ($data{'origurl'} ne '') { + $url .= '&orgurl='.$data{'origurl'}; + } + if (ref($lti_env) eq 'HASH') { + &Apache::lonnet::appenv($lti_env); + } + $r->internal_redirect($url); + } else { + &Apache::ltiauth::invalid_request($r,23); + } + } elsif ($data{'origurl'} ne '') { + my $url = $data{'origurl'}; + if ($url =~ m{/default_\d+\.sequence$}) { + $url .= (($url =~/\?/)?'&':'?').'navmap=1'; + } + if (ref($lti_env) eq 'HASH') { + &Apache::lonnet::appenv($lti_env); } $r->internal_redirect($url); } else { - &Apache::ltiauth::invalid_request($r,23); - } - } elsif ($data{'origurl'} ne '') { - my $url = $data{'origurl'}; - if ($url =~ m{/default_\d+\.sequence$}) { - $url .= (($url =~/\?/)?'&':'?').'navmap=1'; + if (ref($lti_env) eq 'HASH') { + &Apache::lonnet::appenv($lti_env); + } } - $r->internal_redirect($url); } } elsif ($data{'origurl'} ne '') { $r->internal_redirect($data{'origurl'}); From raeburn at source.lon-capa.org Fri Apr 13 22:30:11 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Apr 2018 02:30:11 -0000 Subject: [LON-CAPA-cvs] cvs: loncom / lontrans.pm /auth lonauth.pm migrateuser.pm switchserver.pm /interface loncommon.pm londocs.pm lonevaluate.pm lonhtmlcommon.pm lonnavdisplay.pm lontiny.pm lonwishlist.pm /lonnet/perl lonnet.pm /lti ltiauth.pm ltiutils.pm rat lonsequence.pm Message-ID: raeburn Sat Apr 14 02:30:11 2018 EDT Modified files: /loncom/interface loncommon.pm londocs.pm lonevaluate.pm lonhtmlcommon.pm lonnavdisplay.pm lontiny.pm lonwishlist.pm /loncom lontrans.pm /rat lonsequence.pm /loncom/lonnet/perl lonnet.pm /loncom/lti ltiauth.pm ltiutils.pm /loncom/auth lonauth.pm switchserver.pm migrateuser.pm Log: - Bug 6754 LON-CAPA as LTI Provider - Original LTI launch of LON-CAPA is for a resource, a map, or an entire course, and display is for iframe, tab or window; retain this in %env. -------------- next part -------------- Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.1311 loncom/interface/loncommon.pm:1.1312 --- loncom/interface/loncommon.pm:1.1311 Sat Apr 14 00:36:06 2018 +++ loncom/interface/loncommon.pm Sat Apr 14 02:29:44 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.1311 2018/04/14 00:36:06 raeburn Exp $ +# $Id: loncommon.pm,v 1.1312 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -8722,9 +8722,16 @@ if (@advtools > 0) { &Apache::lonmenu::advtools_crumbs(@advtools); } + my $ltiscope; + if (($env{'request.course.id'}) && ($env{'request.lti.login'})) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + ($ltiscope) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + } my $menulink; # if arg: bread_crumbs_nomenu is true pass 0 as $menulink item. if ((exists($args->{'bread_crumbs_nomenu'})) || + ($ltiscope eq 'map') || ($ltiscope eq 'resource') || ((($args->{'crstype'} eq 'Placement') || (($env{'request.course.id'}) && ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement'))) && (!$env{'request.role.adv'}))) { Index: loncom/interface/londocs.pm diff -u loncom/interface/londocs.pm:1.652 loncom/interface/londocs.pm:1.653 --- loncom/interface/londocs.pm:1.652 Sat Apr 14 00:10:48 2018 +++ loncom/interface/londocs.pm Sat Apr 14 02:29:44 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.652 2018/04/14 00:10:48 raeburn Exp $ +# $Id: londocs.pm,v 1.653 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -5225,13 +5225,17 @@ if (!defined($message)) { $message='Changes will become active for your current session after [_1], or the next time you log in.'; } + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } $r->print("\n\n". ''."\n". -'
'. +''. '

'. &mt($message,' '."\n" .'// '."\n" .''."\n" ); Index: loncom/interface/lonevaluate.pm diff -u loncom/interface/lonevaluate.pm:1.30 loncom/interface/lonevaluate.pm:1.31 --- loncom/interface/lonevaluate.pm:1.30 Fri Jan 17 17:10:12 2014 +++ loncom/interface/lonevaluate.pm Sat Apr 14 02:29:44 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Evaluate # -# $Id: lonevaluate.pm,v 1.30 2014/01/17 17:10:12 bisitz Exp $ +# $Id: lonevaluate.pm,v 1.31 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -76,6 +76,11 @@ my $warning=''; + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } + if ($env{'form.submiteval'} eq 'true') { # ------------------------------------------------ User is submitting something my $complete=1; @@ -90,7 +95,7 @@ my $showurl=&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($feedurl)); my $js = &Apache::lonhtmlcommon::scripttag(<&"').'">'.$text.''; + my $target =' target="_top"'; + if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target =''; + } + return '&"').'">'.$text.''; } else { return ''; } @@ -1925,9 +1929,13 @@ } } } + my $target; + unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target='_top'; + } $menulink = { href =>'/adm/menu', title =>'Go to main menu', - target =>'_top', + target =>$target, text =>$description, no_mt =>$no_mt_descr, }; if($last) { Index: loncom/interface/lonnavdisplay.pm diff -u loncom/interface/lonnavdisplay.pm:1.35 loncom/interface/lonnavdisplay.pm:1.36 --- loncom/interface/lonnavdisplay.pm:1.35 Thu Nov 16 13:41:56 2017 +++ loncom/interface/lonnavdisplay.pm Sat Apr 14 02:29:44 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Display Handler # -# $Id: lonnavdisplay.pm,v 1.35 2017/11/16 13:41:56 raeburn Exp $ +# $Id: lonnavdisplay.pm,v 1.36 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,6 +39,7 @@ use Apache::lonlocal; use Apache::londocs(); use Apache::lonuserstate; +use LONCAPA::ltiutils; sub handler { my $r = shift; @@ -125,6 +126,20 @@ } } + if ($env{'request.lti.login'}) { + if ($env{'request.lti.uri'} ne '') { + my $cid = $env{'request.course.id'}; + my $cnum = $env{'course.'.$cid.'.num'}; + my $cdom = $env{'course.'.$cid.'.domain'}; + my ($scope,$url) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + if (($scope eq 'map') || ($scope eq 'resource')) { + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => $url); + return REDIRECT; + } + } + } + # Create the nav map my $navmap = Apache::lonnavmaps::navmap->new(); Index: loncom/interface/lontiny.pm diff -u loncom/interface/lontiny.pm:1.1 loncom/interface/lontiny.pm:1.2 --- loncom/interface/lontiny.pm:1.1 Fri Jan 12 13:33:38 2018 +++ loncom/interface/lontiny.pm Sat Apr 14 02:29:44 2018 @@ -2,7 +2,7 @@ # Extract domain, courseID, and symb from a shortened URL, # and switch role to a role in designated course. # -# $Id: lontiny.pm,v 1.1 2018/01/12 13:33:38 raeburn Exp $ +# $Id: lontiny.pm,v 1.2 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -132,13 +132,16 @@ sub do_redirect { my ($r,$destination) = @_; - my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";'); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } my $header = ''; my $args = {'bread_crumbs' => [{'href' => '','text' => 'Role initialization'},],}; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; $r->print(&Apache::loncommon::start_page('Valid link',$header,$args). - &Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";'). + &Apache::lonhtmlcommon::scripttag('self.name="'.$windowname.'";'). '

'.&mt('Welcome').'

'. '

'.&mt('Welcome to the Learning[_1]Online[_2] Network with CAPA. Please wait while your session is being set up.','','').'

'. ''.&mt('Continue').'

'. Index: loncom/interface/lonwishlist.pm diff -u loncom/interface/lonwishlist.pm:1.26 loncom/interface/lonwishlist.pm:1.27 --- loncom/interface/lonwishlist.pm:1.26 Mon May 22 19:18:41 2017 +++ loncom/interface/lonwishlist.pm Sat Apr 14 02:29:44 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility-routines for wishlist # -# $Id: lonwishlist.pm,v 1.26 2017/05/22 19:18:41 droeschl Exp $ +# $Id: lonwishlist.pm,v 1.27 2018/04/14 02:29:44 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1480,6 +1480,11 @@ $root = $rootgiven; @childrenRt = $root->children(); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } + # breadcrumbs and start_page &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb( @@ -1488,7 +1493,7 @@ my $startPage = &Apache::loncommon::start_page('Stored Links',undef, {'add_entries' => { 'onload' => 'javascript:onLoadAction('."'".$mode."'".');', - 'onunload' => 'javascript:window.name = '."'loncapaclient'"}}); + 'onunload' => 'javascript:window.name = '."'$windowname'"}}); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Stored Links','Wishlist'); Index: loncom/lontrans.pm diff -u loncom/lontrans.pm:1.19 loncom/lontrans.pm:1.20 --- loncom/lontrans.pm:1.19 Sat Jan 13 18:58:33 2018 +++ loncom/lontrans.pm Sat Apr 14 02:29:51 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # URL translation for User Files # -# $Id: lontrans.pm,v 1.19 2018/01/13 18:58:33 raeburn Exp $ +# $Id: lontrans.pm,v 1.20 2018/04/14 02:29:51 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,15 +44,27 @@ my $handle = &Apache::lonnet::check_for_valid_session($r,undef,\%user); if (($handle ne '') && ($user{'lti'})) { if ($realuri =~ m{^uploaded/$match_domain/$match_courseid/(default|supplemental)(|_\d+)\.(?:sequence|page)___\d+___.+$}) { + if ($user{'ltiuri'} ne $realuri) { + &Apache::lonnet::appenv({'request.lti.uri' => $realuri}); + } my ($map,$resid,$url) = split(/___/,$realuri); $realuri = &Apache::lonnet::clutter($url).'?symb='.$realuri; } elsif ($realuri =~ m{^tiny/$match_domain/\w+$}) { - $realuri = '/'.$realuri; + $realuri = '/'.$realuri; + if ($user{'ltiuri'} ne $realuri) { + &Apache::lonnet::appenv({'request.lti.uri' => $realuri}); + } } elsif ($realuri =~ m{($match_domain)/($match_courseid)$}) { $realuri = '/adm/navmaps'; + if ($user{'ltiuri'} ne '') { + &Apache::lonnet::delenv('request.lti.uri'); + } } else { $realuri = '/'.$realuri; if ($realuri =~ m{/default_\d+\.sequence$}) { + if ($user{'ltiuri'} ne $realuri) { + &Apache::lonnet::appenv({'request.lti.uri' => $realuri}); + } $realuri .= (($realuri =~/\?/)?'&':'?').'navmap=1'; } } Index: rat/lonsequence.pm diff -u rat/lonsequence.pm:1.48 rat/lonsequence.pm:1.49 --- rat/lonsequence.pm:1.48 Mon Sep 4 23:47:17 2017 +++ rat/lonsequence.pm Sat Apr 14 02:29:57 2018 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.48 2017/09/04 23:47:17 raeburn Exp $ +# $Id: lonsequence.pm,v 1.49 2018/04/14 02:29:57 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,6 +36,7 @@ use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; use LONCAPA::map(); +use LONCAPA::ltiutils; use LONCAPA; use Apache::lonpageflip(); use Apache::loncommon(); @@ -251,21 +252,30 @@ if (ref($navmap)) { # renderer call if (&Apache::lonnet::is_on_map($requrl)) { + my $ltiscope; + if (($env{'request.lti.login'}) && ($env{'request.lti.uri'})) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + ($ltiscope) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + } my $mapurl = &Apache::lonnet::declutter($requrl); - my @crumbs = ({text => $crstype.' Contents', - href => "javascript:gopost('/adm/navmaps','')"}); - my $res = $navmap->getResourceByUrl($mapurl); - if (ref($res)) { - my $symb = $res->symb(); - if ($symb) { - my ($parent) = &Apache::lonnet::decode_symb($res->symb()); - if ($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) { - my @mapcrumbs = $navmap->recursed_crumbs($parent); - if (@mapcrumbs) { - push(@crumbs, at mapcrumbs); + my @crumbs; + unless (($ltiscope eq 'resource') || ($ltiscope eq 'map')) { + @crumbs = ({text => $crstype.' Contents', + href => "javascript:gopost('/adm/navmaps','')"}); + my $res = $navmap->getResourceByUrl($mapurl); + if (ref($res)) { + my $symb = $res->symb(); + if ($symb) { + my ($parent) = &Apache::lonnet::decode_symb($res->symb()); + if ($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) { + my @mapcrumbs = $navmap->recursed_crumbs($parent); + if (@mapcrumbs) { + push(@crumbs, at mapcrumbs); + } } + $env{'request.symb'} = $symb; } - $env{'request.symb'} = $symb; } } my $maptitle = &Apache::lonnet::gettitle($mapurl); Index: loncom/lonnet/perl/lonnet.pm diff -u loncom/lonnet/perl/lonnet.pm:1.1374 loncom/lonnet/perl/lonnet.pm:1.1375 --- loncom/lonnet/perl/lonnet.pm:1.1374 Mon Apr 2 18:23:57 2018 +++ loncom/lonnet/perl/lonnet.pm Sat Apr 14 02:30:01 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1374 2018/04/02 18:23:57 raeburn Exp $ +# $Id: lonnet.pm,v 1.1375 2018/04/14 02:30:01 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -708,6 +708,10 @@ $userhashref->{'name'} = $disk_env{'user.name'}; $userhashref->{'domain'} = $disk_env{'user.domain'}; $userhashref->{'lti'} = $disk_env{'request.lti.login'}; + if ($userhashref->{'lti'}) { + $userhashref->{'ltitarget'} = $disk_env{'request.lti.target'}; + $userhashref->{'ltiuri'} = $disk_env{'request.lti.uri'}; + } } return $handle; Index: loncom/lti/ltiauth.pm diff -u loncom/lti/ltiauth.pm:1.7 loncom/lti/ltiauth.pm:1.8 --- loncom/lti/ltiauth.pm:1.7 Fri Mar 23 18:08:45 2018 +++ loncom/lti/ltiauth.pm Sat Apr 14 02:30:07 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Basic LTI Authentication Module # -# $Id: ltiauth.pm,v 1.7 2018/03/23 18:08:45 raeburn Exp $ +# $Id: ltiauth.pm,v 1.8 2018/04/14 02:30:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -815,11 +815,14 @@ &Apache::lonauth::success($r,$uname,$udom,$uhome,'noredirect'); if ($symb) { $env{'form.symb'} = $symb; + $env{'request.lti.uri'} = $symb; } else { if ($mapurl) { $env{'form.origurl'} = $mapurl; + $env{'request.lti.uri'} = $mapurl; } elsif ($tail =~ m{^\Q/tiny/$cdom/\E\w+$}) { $env{'form.origurl'} = $tail; + $env{'request.lti.uri'} = $tail; } else { unless ($tail eq '/adm/roles') { $env{'form.origurl'} = '/adm/navmaps'; @@ -855,6 +858,9 @@ } } $env{'request.lti.login'} = 1; + if ($params->{'launch_presentation_document_target'}) { + $env{'request.lti.target'} = $params->{'launch_presentation_document_target'}; + } foreach my $key (%{$params}) { delete($env{'form.'.$key}); } @@ -876,6 +882,7 @@ 'username' => $uname, 'server' => $lonhost, 'lti.login' => 1, + 'lti.uri' => $tail, ); if ($role) { $info{'role'} = $role; @@ -907,6 +914,10 @@ $info{'lti.rosterurl'} = $params->{'ext_ims_lis_memberships_url'}; } } + if ($params->{'launch_presentation_document_target'}) { + $info{'lti.target'} = $params->{'launch_presentation_document_target'}; + } + unless ($info{'symb'}) { if ($mapurl) { $info{'origurl'} = $mapurl; Index: loncom/lti/ltiutils.pm diff -u loncom/lti/ltiutils.pm:1.5 loncom/lti/ltiutils.pm:1.6 --- loncom/lti/ltiutils.pm:1.5 Thu Jan 4 12:19:25 2018 +++ loncom/lti/ltiutils.pm Sat Apr 14 02:30:07 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA LTI interactions # -# $Id: ltiutils.pm,v 1.5 2018/01/04 12:19:25 raeburn Exp $ +# $Id: ltiutils.pm,v 1.6 2018/04/14 02:30:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -458,4 +458,85 @@ } } +# +# LON-CAPA as LTI Provider +# +# Use the part of the launch URL after /adm/lti to determine +# the scope for the current session (i.e., restricted to a +# single resource, to a single folder/map, or to an entire +# course). +# +# Returns an array containing scope: resource, map, or course +# and the LON-CAPA URL that is displayed post-launch, including +# accommodation of URL encryption, and translation of a tiny URL +# to the actual URL +# + +sub lti_provider_scope { + my ($tail,$cdom,$cnum) = @_; + my ($scope,$realuri); + if ($tail =~ m{^/uploaded/$cdom/$cnum/(?:default|supplemental)(?:|_\d+)\.(?:sequence|page)(|___\d+___.+)$}) { + my $rest = $1; + if ($rest eq '') { + $scope = 'map'; + $realuri = $tail; + } else { + $scope = 'resource'; + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($tail); + $realuri = &Apache::lonnet::clutter($url); + if (($url =~ /\.sequence$/) && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { + $realuri .= '?navmap=1'; + } else { + $realuri .= '?symb='.$tail; + } + } + } elsif ($tail =~ m{^/tiny/$cdom/(\w+)$}) { + my $key = $1; + my $tinyurl; + my ($result,$cached)=&Apache::lonnet::is_cached_new('tiny',$cdom."\0".$key); + if (defined($cached)) { + $tinyurl = $result; + } else { + my $configuname = &Apache::lonnet::get_domainconfiguser($cdom); + my %currtiny = &Apache::lonnet::get('tiny',[$key],$cdom,$configuname); + if ($currtiny{$key} ne '') { + $tinyurl = $currtiny{$key}; + &Apache::lonnet::do_cache_new('tiny',$cdom."\0".$key,$currtiny{$key},600); + } + } + if ($tinyurl ne '') { + my ($cnum,$symb) = split(/\&/,$tinyurl,2); + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($symb); + if ($url =~ /\.(page|sequence)$/) { + $scope = 'map'; + } else { + $scope = 'resource'; + } + if ((&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) && + (!$env{'request.role.adv'})) { + $realuri = &Apache::lonenc::encrypted(&Apache::lonnet::clutter($url)); + if (($url =~ /\.sequence$/) && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { + $realuri .= '?navmap=1'; + } else { + $realuri .= '?symb='.&Apache::lonenc::encrypted($symb); + } + } else { + $realuri = &Apache::lonnet::clutter($url); + if (($url =~ /\.sequence$/) && + ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { + $realuri .= '?navmap=1'; + } else { + $realuri .= '?symb='.$symb; + } + } + } + } elsif ($tail =~ m{^/$cdom/$cnum$}) { + $scope = 'course'; + $realuri = '/adm/navmaps'; + } + return ($scope,$realuri); +} + 1; Index: loncom/auth/lonauth.pm diff -u loncom/auth/lonauth.pm:1.149 loncom/auth/lonauth.pm:1.150 --- loncom/auth/lonauth.pm:1.149 Fri Mar 23 01:01:29 2018 +++ loncom/auth/lonauth.pm Sat Apr 14 02:30:11 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # User Authentication Module # -# $Id: lonauth.pm,v 1.149 2018/03/23 01:01:29 raeburn Exp $ +# $Id: lonauth.pm,v 1.150 2018/04/14 02:30:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -160,7 +160,11 @@ $destination .= 'source=login'; } - my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="loncapaclient";'); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } + my $windowinfo = Apache::lonhtmlcommon::scripttag('self.name="'.$windowname.'";'); my $header = ''; my $brcrum = [{'href' => '', 'text' => 'Successful Login'},]; Index: loncom/auth/switchserver.pm diff -u loncom/auth/switchserver.pm:1.39 loncom/auth/switchserver.pm:1.40 --- loncom/auth/switchserver.pm:1.39 Fri Mar 23 01:01:29 2018 +++ loncom/auth/switchserver.pm Sat Apr 14 02:30:11 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Switch Servers Handler # -# $Id: switchserver.pm,v 1.39 2018/03/23 01:01:29 raeburn Exp $ +# $Id: switchserver.pm,v 1.40 2018/04/14 02:30:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -235,6 +235,9 @@ if ($env{'request.lti.login'}) { $info{'lti.login'} = $env{'request.lti.login'}; } + if ($env{'request.lti.uri'}) { + $info{'lti.uri'} = $env{'request.lti.uri'}; + } if ($env{'request.lti.reqcrs'}) { $info{'lti.reqcrs'} = $env{'request.lti.reqcrs'}; } @@ -259,6 +262,9 @@ if ($env{'request.lti.rosterurl'}) { $info{'lti.rosterurl'} = $env{'request.lti.rosterurl'}; } + if ($env{'request.lti.target'}) { + $info{'lti.target'} = $env{'request.lti.target'}; + } my $token = &Apache::lonnet::tmpput(\%info,$env{'form.otherserver'}); my $url =$protocol.'://'.$switch_to.'/adm/login?'. 'domain='.$env{'user.domain'}. Index: loncom/auth/migrateuser.pm diff -u loncom/auth/migrateuser.pm:1.28 loncom/auth/migrateuser.pm:1.29 --- loncom/auth/migrateuser.pm:1.28 Sat Apr 14 01:50:43 2018 +++ loncom/auth/migrateuser.pm Sat Apr 14 02:30:11 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Starts a user off based of an existing token. # -# $Id: migrateuser.pm,v 1.28 2018/04/14 01:50:43 raeburn Exp $ +# $Id: migrateuser.pm,v 1.29 2018/04/14 02:30:11 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -88,6 +88,12 @@ if ($data->{'lti.selfenrollrole'}) { $lti_env{'request.lti.selfenrollrole'} = $data->{'lti.selfenrollrole'}; } + if ($data->{'lti.uri'}) { + $lti_env{'request.lti.uri'} = $data->{'lti.uri'}; + } + if ($data->{'lti.target'}) { + $lti_env{'request.lti.target'} = $data->{'lti.target'}; + } } if ($data->{'lti.passbackid'}) { $lti_env{'request.lti.passbackid'} = $data->{'lti.passbackid'}; @@ -388,6 +394,7 @@ $form{'lti.reqcrs'} = $data{'lti.reqcrs'}; $form{'lti.reqrole'} = $data{'lti.reqrole'}; $form{'lti.sourcecrs'} = $data{'lti.sourcecrs'}; + $form{'lti.uri'} = $data{'lti.uri'}; if ($data{'lti.passbackid'}) { $form{'lti.passbackid'} = $data{'lti.passbackid'}; } @@ -400,6 +407,9 @@ if ($data{'lti.rosterurl'}) { $form{'lti.rosterurl'} = $data{'lti.rosterurl'}; } + if ($data{'lti.target'}) { + $form{'lti.target'} = $data{'lti.target'}; + } &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; &Apache::ltiauth::lti_reqcrs($r,$data{'domain'},\%form,$data{'username'},$data{'domain'}); From raeburn at source.lon-capa.org Sat Apr 14 13:52:53 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sat, 14 Apr 2018 17:52:53 -0000 Subject: [LON-CAPA-cvs] cvs: rat / lonsequence.pm loncom/interface lonfeedback.pm lonmenu.pm lonnavmaps.pm loncom/lti ltiutils.pm Message-ID: raeburn Sat Apr 14 17:52:53 2018 EDT Modified files: /loncom/interface lonmenu.pm lonnavmaps.pm lonfeedback.pm /loncom/lti ltiutils.pm /rat lonsequence.pm Log: - Bug 6754 LON-CAPA as LTI Provider - No page flip arrows in inline menu if LTI launch was or a resource - No forward arrow if LTI launch was for map and this is last resource. - No reverse arrow if LTI launch was for map and this is first resource. - No Contents in inline breadcrumbs if LTI launch was for resource or map. -------------- next part -------------- Index: loncom/interface/lonmenu.pm diff -u loncom/interface/lonmenu.pm:1.485 loncom/interface/lonmenu.pm:1.486 --- loncom/interface/lonmenu.pm:1.485 Fri Dec 22 02:00:46 2017 +++ loncom/interface/lonmenu.pm Sat Apr 14 17:52:43 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.485 2017/12/22 02:00:46 raeburn Exp $ +# $Id: lonmenu.pm,v 1.486 2018/04/14 17:52:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -99,7 +99,7 @@ =over -=item prep_menuitems(\@menuitem) +=item prep_menuitems(\@menuitem,$ltitarget) This routine wraps a menuitem in proper HTML. It is used by primary_menu() and secondary_menu(). @@ -210,6 +210,7 @@ use Apache::lonlocal; use Apache::lonmsg(); use LONCAPA qw(:DEFAULT :match); +use LONCAPA::ltiutils; use HTML::Entities(); use Apache::lonwishlist(); @@ -219,7 +220,7 @@ my @inlineremote; sub prep_menuitem { - my ($menuitem) = @_; + my ($menuitem,$ltitarget) = @_; return '' unless(ref($menuitem) eq 'ARRAY'); my $link; if ($$menuitem[1]) { # graphical Link @@ -229,10 +230,14 @@ } else { # textual Link $link = &mt($$menuitem[3]); } + my $target = ' target="_top"'; + if ($ltitarget eq 'iframe') { + $target =''; + } return '
  • $link
  • |; + . qq| href="$$menuitem[0]"$target>$link|; } # primary_menu() evaluates @primary_menu and returns a two item array, @@ -260,6 +265,10 @@ my %roles_in_env; $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update); } + my $ltitarget; + if ($env{'request.lti.login'}) { + $ltitarget = $env{'request.lti.target'}; + } foreach my $menuitem (@primary_menu) { # evaluate conditions next if ref($menuitem) ne 'ARRAY'; # @@ -293,7 +302,9 @@ my ($link,$target); if ($menuitem->[0] ne '') { $link = $menuitem->[0]; - $target = '_top'; + unless ($ltitarget eq 'iframe') { + $target = '_top'; + } } else { $link = '#'; } @@ -328,13 +339,13 @@ 'helpdeskmail', $defdom,$origmail); if ($to ne '') { - $menu{$position} .= &prep_menuitem($menuitem); + $menu{$position} .= &prep_menuitem($menuitem,$ltitarget); } } else { $menu{$position} .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; } } else { - $menu{$position} .= prep_menuitem($menuitem); + $menu{$position} .= prep_menuitem($menuitem,$ltitarget); } } my @output = ('',''); @@ -441,7 +452,10 @@ $canmodifycoauthor = 1; } } - my ($roleswitcher_js,$roleswitcher_form); + my ($roleswitcher_js,$roleswitcher_form,$ltitarget); + if ($env{'request.lti.login'}) { + $ltitarget = $env{'request.lti.target'}; + } foreach my $menuitem (@secondary_menu) { # evaluate conditions @@ -484,7 +498,9 @@ my ($link,$target); if ($menuitem->[0] ne '') { $link = $menuitem->[0]; - $target = '_top'; + unless ($ltitarget eq 'iframe') { + $target = '_top'; + } } else { $link = '#'; } @@ -517,7 +533,7 @@ &roles_selector( $env{'course.' . $env{'request.course.id'} . '.domain'}, $env{'course.' . $env{'request.course.id'} . '.num'}, - $httphost + $httphost,$ltitarget ); $menu .= $switcher; } else { @@ -543,7 +559,7 @@ } $$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"'); } - $menu .= &prep_menuitem(\@$menuitem); + $menu .= &prep_menuitem(\@$menuitem,$ltitarget); } } if ($menu =~ /\[url\].*\[symb\]/) { @@ -651,7 +667,9 @@ $href =~ s/\[user\]/$env{'user.name'}/g; } unless (($href eq '') || ($href =~ /^\#/)) { - $target = ' target="_top"'; + if ($target eq '_top') { + $target = ' target="_top"'; + } } $menu .= '
  • '; @@ -674,13 +692,18 @@ undef(@inlineremote); - my ($mapurl,$resurl,$crstype,$navmap); + my ($mapurl,$resurl,$crstype,$navmap,$ltiscope,$ltiuri); if ($env{'request.course.id'}) { # #course_type: Course, Community, or Placement # $crstype = &Apache::loncommon::course_type(); + if (($env{'request.lti.login'}) && ($env{'request.lti.uri'})) { + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + } if ($env{'request.symb'}) { my $ignorenull; unless ($env{'request.noversionuri'} eq '/adm/navmaps') { @@ -695,22 +718,29 @@ my (@crumbs, at mapcrumbs); if (($env{'request.noversionuri'} ne '/adm/navmaps') && ($mapurl ne '') && (!(($crstype eq 'Placement') && !$env{'request.role.adv'}))) { - $navmap = Apache::lonnavmaps::navmap->new(); - if (ref($navmap)) { - @mapcrumbs = $navmap->recursed_crumbs($mapurl,$restitle); + unless ($ltiscope eq 'resource') { + if (($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) && + !(($ltiscope eq 'map') && (&Apache::lonnet::clutter($resurl) eq $ltiuri))) { + $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + @mapcrumbs = $navmap->recursed_crumbs($mapurl,$restitle); + } + } } } unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps') && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) || - (($crstype eq 'Placement') && (!$env{'request.role.adv'}))) { + (($crstype eq 'Placement') && (!$env{'request.role.adv'})) || + ($ltiscope eq 'map') || ($ltiscope eq 'resource')) { @crumbs = ({text => $crstype.' Contents', href => "Javascript:gopost('/adm/navmaps','')"}); } if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { if (@mapcrumbs) { push(@crumbs, at mapcrumbs); - } elsif (!(($crstype eq 'Placement') && (!$env{'request.role.adv'}))) { + } elsif (!(($crstype eq 'Placement') && (!$env{'request.role.adv'})) && + ($ltiscope ne 'map') && ($ltiscope ne 'resource')) { push(@crumbs, {text => '...', no_mt => 1}); } @@ -718,8 +748,10 @@ unless ((($crstype eq 'Placement') && (!$env{'request.role.adv'})) || (@mapcrumbs) || (!$maptitle) || ($maptitle eq 'default.sequence') || - ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) { - push @crumbs, {text => $maptitle, no_mt => 1, href => $mapurl}; + ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) || + ($ltiscope eq 'resource')) { + push @crumbs, {text => $maptitle, no_mt => 1, + href => &Apache::lonnet::clutter($mapurl).'?navmap=1'}; } if ($restitle && !@mapcrumbs) { push(@crumbs,{text => $restitle, no_mt => 1}); @@ -912,7 +944,35 @@ # Should probably be in mydesk.tab # $menuitems = "c&3&1"; - if (($crstype ne 'Placement') || ($env{'request.role.adv'})) { + if ($ltiscope eq 'resource') { +# Suppress display of backward arrow for LTI Provider if scope is resource. +# Suppress display of forward arrow for LTI Provider if scope is resource. + } elsif ($ltiscope eq 'map') { +# Suppress display of backward arrow for LTI Provider if scope is map and this is first resource. +# Suppress display of forward arrow for LTI Provider if scope is map and this is the last resource. + my $showforw = 1; + my $showback = 1; + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my $mapres = $navmap->getResourceByUrl($ltiuri); + if (ref($mapres)) { + if ($navmap->isLastResource($mapres,$env{'request.symb'})) { + $showforw = 0; + } + if ($navmap->isFirstResource($mapres,$env{'request.symb'})) { + $showback = 0; + } + } + } + if ($showback) { + $menuitems.=" +s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1"; + } + if ($showforw) { + $menuitems.=" +s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3"; + } + } elsif (($crstype ne 'Placement') || ($env{'request.role.adv'})) { $menuitems.=" s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1 s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3"; @@ -2168,8 +2228,12 @@ } sub serverform { + my $target; + unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target = ' target="_top"'; + } return(< + @@ -2207,7 +2271,7 @@ } sub roles_selector { - my ($cdom,$cnum,$httphost) = @_; + my ($cdom,$cnum,$httphost,$ltitarget) = @_; my $crstype = &Apache::loncommon::course_type(); my $now = time; my (%courseroles,%seccount,%courseprivs,%roledesc); @@ -2369,7 +2433,7 @@ } } if (@submenu > 0) { - $switcher = &create_submenu('','',&mt('Switch role'),\@submenu); + $switcher = &create_submenu('','',&mt('Switch role'),\@submenu,'','',$ltitarget); } } return ($js,$form,$switcher); Index: loncom/interface/lonnavmaps.pm diff -u loncom/interface/lonnavmaps.pm:1.541 loncom/interface/lonnavmaps.pm:1.542 --- loncom/interface/lonnavmaps.pm:1.541 Wed Jan 31 14:05:12 2018 +++ loncom/interface/lonnavmaps.pm Sat Apr 14 17:52:43 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.541 2018/01/31 14:05:12 raeburn Exp $ +# $Id: lonnavmaps.pm,v 1.542 2018/04/14 17:52:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3481,6 +3481,71 @@ return $self->navhash("version_$linkurl"); } +sub isFirstResource { + my $self = shift; + my $map = shift; + my $symb = shift; + return unless (ref($map)); + my $isfirst; + my $firstResource = $map->map_start(); + if (ref($firstResource)) { + if ((!$firstResource->is_map()) && ($firstResource->src() ne '')) { + if ($firstResource->symb() eq $symb) { + $isfirst = 1; + } else { + $isfirst = 0; + } + } else { + my $it = $self->getIterator($firstResource,undef,undef,1); + while ( my $res=$it->next()) { + if ((ref($res)) && ($res->src() ne '') && (!$res->is_map())) { + if ($res->symb() eq $symb) { + $isfirst = 1; + } else { + $isfirst = 0; + } + last; + } + } + } + } + return $isfirst; +} + +sub isLastResource { + my $self = shift; + my $map = shift; + my $symb = shift; + return unless (ref($map)); + my $islast; + my $lastResource = $map->map_finish(); + if (ref($lastResource)) { + if ((!$lastResource->is_map()) && ($lastResource->src() ne '')) { + if ($lastResource->symb() eq $symb) { + $islast = 1; + } else { + $islast = 0; + } + } else { + my $currRes = $self->getBySymb($symb); + if (ref($currRes)) { + my $it = $self->getIterator($currRes,undef,undef,1); + while ( my $res=$it->next()) { + if ((ref($res)) && ($res->src() ne '') && (!$res->is_map())) { + if ($res->symb() eq $symb) { + $islast = 1; + } else { + $islast = 0; + } + last; + } + } + } + } + } + return $islast; +} + 1; package Apache::lonnavmaps::iterator; Index: loncom/interface/lonfeedback.pm diff -u loncom/interface/lonfeedback.pm:1.378 loncom/interface/lonfeedback.pm:1.379 --- loncom/interface/lonfeedback.pm:1.378 Mon Dec 18 23:20:48 2017 +++ loncom/interface/lonfeedback.pm Sat Apr 14 17:52:43 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Feedback # -# $Id: lonfeedback.pm,v 1.378 2017/12/18 23:20:48 raeburn Exp $ +# $Id: lonfeedback.pm,v 1.379 2018/04/14 17:52:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2840,6 +2840,10 @@ my $start_page= &Apache::loncommon::start_page('Feedback sent',undef,\%parms); my $end_page = &Apache::loncommon::end_page(); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } $r->print(< @@ -2848,7 +2852,7 @@ $blog $toolarge $status - + $prevtag $sorttag $statustag @@ -4047,11 +4051,15 @@ 'only_body' => 1, 'add_entries' => \%onload}); my $end_page = &Apache::loncommon::end_page(); + my $windowname = 'loncapaclient'; + if ($env{'request.lti.login'}) { + $windowname .= 'lti'; + } $r->print (< $textline - +
    $end_page Index: loncom/lti/ltiutils.pm diff -u loncom/lti/ltiutils.pm:1.6 loncom/lti/ltiutils.pm:1.7 --- loncom/lti/ltiutils.pm:1.6 Sat Apr 14 02:30:07 2018 +++ loncom/lti/ltiutils.pm Sat Apr 14 17:52:48 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA LTI interactions # -# $Id: ltiutils.pm,v 1.6 2018/04/14 02:30:07 raeburn Exp $ +# $Id: ltiutils.pm,v 1.7 2018/04/14 17:52:48 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -481,13 +481,12 @@ $scope = 'map'; $realuri = $tail; } else { - $scope = 'resource'; my ($map,$resid,$url) = &Apache::lonnet::decode_symb($tail); $realuri = &Apache::lonnet::clutter($url); - if (($url =~ /\.sequence$/) && - ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { - $realuri .= '?navmap=1'; + if ($url =~ /\.sequence$/) { + $scope = 'map'; } else { + $scope = 'resource'; $realuri .= '?symb='.$tail; } } @@ -516,18 +515,12 @@ if ((&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i) && (!$env{'request.role.adv'})) { $realuri = &Apache::lonenc::encrypted(&Apache::lonnet::clutter($url)); - if (($url =~ /\.sequence$/) && - ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { - $realuri .= '?navmap=1'; - } else { + if ($scope eq 'resource') { $realuri .= '?symb='.&Apache::lonenc::encrypted($symb); } } else { $realuri = &Apache::lonnet::clutter($url); - if (($url =~ /\.sequence$/) && - ($env{'course.'.$env{'request.course.id'}.'.type'} ne 'Placement')) { - $realuri .= '?navmap=1'; - } else { + if ($scope eq 'resource') { $realuri .= '?symb='.$symb; } } Index: rat/lonsequence.pm diff -u rat/lonsequence.pm:1.49 rat/lonsequence.pm:1.50 --- rat/lonsequence.pm:1.49 Sat Apr 14 02:29:57 2018 +++ rat/lonsequence.pm Sat Apr 14 17:52:53 2018 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.49 2018/04/14 02:29:57 raeburn Exp $ +# $Id: lonsequence.pm,v 1.50 2018/04/14 17:52:53 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -252,23 +252,26 @@ if (ref($navmap)) { # renderer call if (&Apache::lonnet::is_on_map($requrl)) { - my $ltiscope; + my ($ltiscope,$ltiuri); if (($env{'request.lti.login'}) && ($env{'request.lti.uri'})) { my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - ($ltiscope) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); + ($ltiscope,$ltiuri) = &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},$cdom,$cnum); } my $mapurl = &Apache::lonnet::declutter($requrl); my @crumbs; - unless (($ltiscope eq 'resource') || ($ltiscope eq 'map')) { - @crumbs = ({text => $crstype.' Contents', - href => "javascript:gopost('/adm/navmaps','')"}); + unless ($ltiscope eq 'resource') { + unless ($ltiscope eq 'map') { + @crumbs = ({text => $crstype.' Contents', + href => "javascript:gopost('/adm/navmaps','')"}); + } my $res = $navmap->getResourceByUrl($mapurl); if (ref($res)) { my $symb = $res->symb(); if ($symb) { my ($parent) = &Apache::lonnet::decode_symb($res->symb()); - if ($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) { + if (($parent ne $env{'course.'.$env{'request.course.id'}.'.url'}) && + !(($ltiscope eq 'map') && ($requrl eq $ltiuri))) { my @mapcrumbs = $navmap->recursed_crumbs($parent); if (@mapcrumbs) { push(@crumbs, at mapcrumbs); From raeburn at source.lon-capa.org Sat Apr 14 20:14:19 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sun, 15 Apr 2018 00:14:19 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /auth migrateuser.pm Message-ID: raeburn Sun Apr 15 00:14:19 2018 EDT Modified files: /loncom/auth migrateuser.pm Log: - Bug 6754 LON-CAPA as LTI Provider - Display folder contents listing if LTI launch is for a sequence file. Index: loncom/auth/migrateuser.pm diff -u loncom/auth/migrateuser.pm:1.29 loncom/auth/migrateuser.pm:1.30 --- loncom/auth/migrateuser.pm:1.29 Sat Apr 14 02:30:11 2018 +++ loncom/auth/migrateuser.pm Sun Apr 15 00:14:19 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network # Starts a user off based of an existing token. # -# $Id: migrateuser.pm,v 1.29 2018/04/14 02:30:11 raeburn Exp $ +# $Id: migrateuser.pm,v 1.30 2018/04/15 00:14:19 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -483,6 +483,11 @@ my $next_url='/adm/roles?selectrole=1&'.&escape($data{'role'}).'=1'; if ($data{'origurl'} ne '') { $next_url .= '&orgurl='.&escape($data{'origurl'}); + if ($data{'lti.login'}) { + if ($data{'origurl'} =~ m{/default_\d+\.sequence$}) { + $next_url .= '&navmap=1'; + } + } } &Apache::lonauth::success($r,$data{'username'},$data{'domain'},$home, $next_url,$extra_env,\%form); From raeburn at source.lon-capa.org Sat Apr 14 20:28:08 2018 From: raeburn at source.lon-capa.org (raeburn) Date: Sun, 15 Apr 2018 00:28:08 -0000 Subject: [LON-CAPA-cvs] cvs: loncom /interface loncommon.pm lonmenu.pm Message-ID: raeburn Sun Apr 15 00:28:08 2018 EDT Modified files: /loncom/interface lonmenu.pm loncommon.pm Log: - Bug 6754 LON-CAPA as LTI Provider - If original LTI launch of LON-CAPA specified display in an iframe, display Authoring Space directory in same iframe, when accessed via Edit in Functions menu. Index: loncom/interface/lonmenu.pm diff -u loncom/interface/lonmenu.pm:1.486 loncom/interface/lonmenu.pm:1.487 --- loncom/interface/lonmenu.pm:1.486 Sat Apr 14 17:52:43 2018 +++ loncom/interface/lonmenu.pm Sun Apr 15 00:28:07 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.486 2018/04/14 17:52:43 raeburn Exp $ +# $Id: lonmenu.pm,v 1.487 2018/04/15 00:28:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2053,6 +2053,11 @@ my $countdown = &countdown_toggle_js(); + my $ltitarget; + if ($env{'request.lti.login'}) { + $ltitarget = $env{'request.lti.target'}; + } + my $hostvar = ' function setLCHost() { var lcHostname=""; @@ -2149,7 +2154,12 @@ currentURL = null; currentSymb= null; var lcHostname = setLCHost(); - top.location.href=lcHostname+url; + var ltitarget = '$ltitarget'; + if (ltitarget == 'iframe') { + document.location.href=lcHostname+url; + } else { + top.location.href=lcHostname+url; + } } } @@ -2243,15 +2253,20 @@ } sub constspaceform { + my ($target,$printtarget); + unless (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target = ' target="_top"'; + $printtarget = ' target="_parent"'; + } return(< +
    -
    +
    -
    + Index: loncom/interface/loncommon.pm diff -u loncom/interface/loncommon.pm:1.1312 loncom/interface/loncommon.pm:1.1313 --- loncom/interface/loncommon.pm:1.1312 Sat Apr 14 02:29:44 2018 +++ loncom/interface/loncommon.pm Sun Apr 15 00:28:07 2018 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.1312 2018/04/14 02:29:44 raeburn Exp $ +# $Id: loncommon.pm,v 1.1313 2018/04/15 00:28:07 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -5837,12 +5837,16 @@ $title = &mt('Authoring Space'); } + my $target; + if (($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) { + $target = ' target="_top"'; #FIXME lonpubdir: target="_parent" + } + my $output = '
    ' .&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it? .''.$title.' ' - .'' #FIXME lonpubdir: target="_parent" + .'