[LON-CAPA-cvs] cvs: loncom /interface domainprefs.pm /lti ltiauth.pm

raeburn raeburn at source.lon-capa.org
Mon Nov 22 18:41:00 EST 2021


raeburn		Mon Nov 22 23:41:00 2021 EDT

  Modified files:              
    /loncom/interface	domainprefs.pm 
    /loncom/lti	ltiauth.pm 
  Log:
  - Bug 6754
    Basic LTI authentication option for launch from Consumer for which user
    information but no course information are provided on launch.
  
  
-------------- next part --------------
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.390 loncom/interface/domainprefs.pm:1.391
--- loncom/interface/domainprefs.pm:1.390	Mon Nov 22 22:19:58 2021
+++ loncom/interface/domainprefs.pm	Mon Nov 22 23:40:59 2021
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.390 2021/11/22 22:19:58 raeburn Exp $
+# $Id: domainprefs.pm,v 1.391 2021/11/22 23:40:59 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -3249,32 +3249,65 @@
                             localauth => 'Local auth argument',
                             krb       => 'Kerberos domain',
                          );
+    my $crsincalert = &mt('"User\'s identity sent" needs to be set to "Yes" first,[_1] before setting "Course\'s identity sent" to "Yes"',"\n");
+    &js_escape(\$crsincalert);
     return <<"ENDSCRIPT";
 <script type="text/javascript">
 // <![CDATA[
 
 function toggleLTI(form,setting,item) {
-    if (setting == 'requser') {
-        var fieldsets = document.getElementsByClassName('ltioption_'+item);
-        if (fieldsets.length) {
-            var radioname = 'lti_'+setting+'_'+item;
+    if ((setting == 'requser') || (setting == 'crsinc')) {
+        var usrfieldsets = document.getElementsByClassName('ltioption_usr_'+item);
+        var setvis = '';
+        var radioname = 'lti_requser_'+item;
+        var num = form.elements[radioname].length;
+        if (num) {
+            for (var i=0; i<num; i++) {
+                if (form.elements[radioname][i].checked) {
+                    if (form.elements[radioname][i].value == '1') {
+                        setvis = 1;
+                        break;
+                    }
+                }
+            }
+        }
+        if (usrfieldsets.length) {
+            for (var j=0; j<usrfieldsets.length; j++) {
+                if (setvis) {
+                    usrfieldsets[j].style.display = 'block';
+                } else {
+                    usrfieldsets[j].style.display = 'none';
+                }
+            }
+        }
+        var crsfieldsets = document.getElementsByClassName('ltioption_crs_'+item);
+        if (crsfieldsets.length) {
+            radioname = 'lti_crsinc_'+item;
             var num = form.elements[radioname].length;
             if (num) {
-                var setvis = '';
+                var crsvis = '';
                 for (var i=0; i<num; i++) {
                     if (form.elements[radioname][i].checked) {
                         if (form.elements[radioname][i].value == '1') {
-                           setvis = 1;
-                           break;
+                            if (setvis == '') {
+                                if (setting == 'crsinc'){
+                                    alert("$crsincalert");
+                                    form.elements[radioname][0].checked = true;
+                                }
+                            } else {
+                                crsvis = 1;
+                            }
+                            break;
                         }
                     }
                 }
-                for (var j=0; j<fieldsets.length; j++) {
-                    if (setvis) {
-                        fieldsets[j].style.display = 'block';
-                    } else {
-                        fieldsets[j].style.display = 'none';
-                    }
+                setvis = crsvis;
+            }
+            for (var j=0; j<crsfieldsets.length; j++) {
+                if (setvis) {
+                    crsfieldsets[j].style.display = 'block';
+                } else {
+                    crsfieldsets[j].style.display = 'none';
                 }
             }
         }
@@ -5954,13 +5987,14 @@
         for (my $i=0; $i<@items; $i++) {
             $css_class = $itemcount%2?' class="LC_odd_row"':'';
             my $item = $ordered{$items[$i]};
-            my ($key,$secret,$lifetime,$consumer,$requser,$current);
+            my ($key,$secret,$lifetime,$consumer,$requser,$crsinc,$current);
             if (ref($settings->{$item}) eq 'HASH') {
                 $key = $settings->{$item}->{'key'};
                 $secret = $settings->{$item}->{'secret'};
                 $lifetime = $settings->{$item}->{'lifetime'};
                 $consumer = $settings->{$item}->{'consumer'};
                 $requser = $settings->{$item}->{'requser'};
+                $crsinc = $settings->{$item}->{'crsinc'};
                 $current = $settings->{$item};
             }
             my $onclickrequser = ' onclick="toggleLTI(this.form,'."'requser','$i'".');"';
@@ -5972,6 +6006,15 @@
                 $checkedrequser{'no'} = $checkedrequser{'yes'};
                 $checkedrequser{'yes'} = '';
             }
+            my $onclickcrsinc = ' onclick="toggleLTI(this.form,'."'crsinc','$i'".');"';
+            my %checkedcrsinc = (
+                                      yes => ' checked="checked"',
+                                      no  => '',
+                                   );
+            if (!$crsinc) {
+                $checkedcrsinc{'no'} = $checkedcrsinc{'yes'};
+                $checkedcrsinc{'yes'} = '';
+            }
             my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'lti_pos_".$item."'".');"';
             $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                          .'<select name="lti_pos_'.$item.'"'.$chgstr.'>';
@@ -6001,6 +6044,10 @@
                  '<label><input type="radio" name="lti_requser_'.$i.'" value="1"'.$onclickrequser.$checkedrequser{yes}.' />'.&mt('Yes').'</label> '."\n".
                  '<label><input type="radio" name="lti_requser_'.$i.'" value="0"'.$onclickrequser.$checkedrequser{no}.' />'.&mt('No').'</label></span>'."\n".
                 '<br /><br />'.
+                '<span class="LC_nobreak">'.$lt{'crsinc'}.':'.
+                '<label><input type="radio" name="lti_crsinc_'.$i.'" value="1"'.$onclickcrsinc.$checkedcrsinc{yes}.' />'.&mt('Yes').'</label> '."\n".
+                '<label><input type="radio" name="lti_crsinc_'.$i.'" value="0"'.$onclickcrsinc.$checkedcrsinc{no}.' />'.&mt('No').'</label></span>'."\n".
+                (' 'x4).
                 '<span class="LC_nobreak">'.$lt{'key'}.
                 ':<input type="text" size="25" name="lti_key_'.$i.'" value="'.$key.'" /></span> '.
                 (' 'x2).
@@ -6041,6 +6088,10 @@
                   '<label><input type="radio" name="lti_requser_add" value="1" onclick="toggleLTI(this.form,'."'requser','add'".');" checked="checked" />'.&mt('Yes').'</label> '."\n".
                   '<label><input type="radio" name="lti_requser_add" value="0" onclick="toggleLTI(this.form,'."'requser','add'".');" />'.&mt('No').'</label></span>'."\n".
                   '<br /><br />'.
+                  '<span class="LC_nobreak">'.$lt{'crsinc'}.':'.
+                  '<label><input type="radio" name="lti_crsinc_add" value="1" onclick="toggleLTI(this.form,'."'crsinc','add'".');" checked="checked" />'.&mt('Yes').'</label> '."\n".
+                  '<label><input type="radio" name="lti_crsinc_add" value="0" onclick="toggleLTI(this.form,'."'crsinc','add'".');" />'.&mt('No').'</label></span>'."\n".
+                  (' 'x4).
                   '<span class="LC_nobreak">'.$lt{'key'}.':<input type="text" size="25" name="lti_key_add" value="" /></span> '."\n".
                   (' 'x2).
                   '<span class="LC_nobreak">'.$lt{'secret'}.':<input type="password" size="20" name="lti_secret_add" value="" />'.
@@ -6061,6 +6112,7 @@
                                           'consumer'  => 'Consumer',
                                           'secret'    => 'Secret',
                                           'requser'   => "User's identity sent",
+                                          'crsinc'    => "Course's identity sent",
                                           'email'     => 'Email address',
                                           'sourcedid' => 'User ID',
                                           'other'     => 'Other',
@@ -6095,6 +6147,7 @@
     my $callbacksty = 'none';
     my $passbacksty = 'none';
     my $optionsty = 'block';
+    my $crssty = 'block';
     my $lcauthparm;
     my $lcauthparmstyle = 'display:none';
     my $lcauthparmtext;
@@ -6105,6 +6158,9 @@
     if (ref($current) eq 'HASH') {
         if (!$current->{'requser'}) {
             $optionsty = 'none';
+            $crssty = 'none';
+        } elsif (!$current->{'crsinc'}) {
+            $crssty = 'none';
         }
         if (($current->{'mapuser'} ne '') && ($current->{'mapuser'} ne 'lis_person_sourcedid')) {
             $checked{'mapuser'}{'sourcedid'} = '';
@@ -6237,7 +6293,17 @@
     my $onclicksecsrc = ' onclick="toggleLTI(this.form,'."'secsrc','$num'".')"';
     my $onclicklcauth = ' onclick="toggleLTI(this.form,'."'lcauth','$num'".')"';
     my $onclickmenu = ' onclick="toggleLTI(this.form,'."'lcmenu','$num'".');"';
-    my $output = '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Mapping users').'</legend>'.
+    my $output = '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Logout options').'</legend>'.
+                 '<div class="LC_floatleft"><span class="LC_nobreak">'.&mt('Callback on logout').': '.
+                 '<label><input type="radio" name="lti_callback_'.$num.'" value="0"'.
+                 $checked{'callback'}{'N'}.$onclickcallback.' />'.&mt('No').'</label>'.(' 'x2).
+                 '<label><input type="radio" name="lti_callback_'.$num.'" value="1"'.
+                 $checked{'callback'}{'Y'}.$onclickcallback.' />'.&mt('Yes').'</label></span></div>'.
+                 '<div class="LC_floatleft" style="display:'.$callbacksty.';" id="lti_callbackfield_'.$num.'">'.
+                 '<span class="LC_nobreak">'.&mt('Parameter').': '.
+                 '<input type="text" name="lti_callbackparam_'.$num.'" value="'.$callback.'" /></span>'.
+                 '</div><div style="padding:0;clear:both;margin:0;border:0"></div></fieldset>'.
+                 '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Mapping users').'</legend>'.
                  '<div class="LC_floatleft"><span class="LC_nobreak">'.&mt('LON-CAPA username').': ';
     foreach my $option ('sourcedid','email','other') {
         $output .= '<label><input type="radio" name="lti_mapuser_'.$num.'" value="'.$option.'"'.
@@ -6248,37 +6314,13 @@
                '<div class="LC_floatleft" style="display:'.$userfieldsty.';" id="lti_userfield_'.$num.'">'.
                '<input type="text" name="lti_customuser_'.$num.'" '.
                'value="'.$userfield.'" /></div></fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Mapping course roles').'</legend><table><tr>';
-    foreach my $ltirole (@lticourseroles) {
-        my ($selected,$selectnone);
-        if ($rolemaps{$ltirole} eq '') {
-            $selectnone = ' selected="selected"';
-        }
-        $output .= '<td style="text-align: center">'.$ltirole.'<br />'.
-                   '<select name="lti_maprole_'.$ltirole.'_'.$num.'">'.
-                   '<option value=""'.$selectnone.'>'.&mt('Select').'</option>';
-        foreach my $role (@courseroles) {
-            unless ($selectnone) {
-                if ($rolemaps{$ltirole} eq $role) {
-                    $selected = ' selected="selected"';
-                } else {
-                    $selected = '';
-                }
-            }
-            $output .= '<option value="'.$role.'"'.$selected.'>'.
-                       &Apache::lonnet::plaintext($role,'Course').
-                       '</option>';
-        }
-        $output .= '</select></td>';
-    }
-    $output .= '</tr></table></fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Roles which may create user accounts').'</legend>';
+               '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Roles which may create user accounts').'</legend>';
     foreach my $ltirole (@ltiroles) {
         $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="lti_makeuser_'.$num.'" value="'.$ltirole.'"'.
                    $checked{'makeuser'}{$ltirole}.' />'.$ltirole.'</label> </span> ';     
     }
     $output .= '</fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('New user accounts created for LTI users').'</legend>'.
+               '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('New user accounts created for LTI users').'</legend>'.
                '<table>'.
                &modifiable_userdata_row('lti','instdata_'.$num,$current,$numinrow,$itemcount).
                '</table>'.
@@ -6301,7 +6343,29 @@
                '<span id="lti_lcauth_parmtext_'.$num.'">'.$lcauthparmtext.'</span>'.
                '<input type="text" name="lti_lcauthparm_'.$num.'" value="" /></span></td></tr>'.
                '</table></fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Mapping courses').'</legend>'.
+               '<fieldset class="ltioption_usr_'.$num.'" style="display:'.$optionsty.'"><legend>'.
+               &mt('LON-CAPA menu items (Course Coordinator can override)').'</legend>'.
+               '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{'topmenu'}.': '.
+               '<label><input type="radio" name="lti_topmenu_'.$num.'" value="0"'.
+               $checked{'topmenu'}{'N'}.$onclickmenu.' />'.&mt('No').'</label>'.(' 'x2).
+               '<label><input type="radio" name="lti_topmenu_'.$num.'" value="1"'.
+               $checked{'topmenu'}{'Y'}.$onclickmenu.' />'.&mt('Yes').'</label></span></div>'.
+               '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
+               '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{'inlinemenu'}.': '.
+               '<label><input type="radio" name="lti_inlinemenu_'.$num.'" value="0"'.
+               $checked{'inlinemenu'}{'N'}.$onclickmenu.' />'.&mt('No').'</label>'.(' 'x2).
+               '<label><input type="radio" name="lti_inlinemenu_'.$num.'" value="1"'.
+               $checked{'inlinemenu'}{'Y'}.$onclickmenu.' />'.&mt('Yes').'</label></span></div>';
+     $output .='<div style="padding:0;clear:both;margin:0;border:0"></div>'.
+               '<div class="LC_floatleft" style="display:'.$menusty.';" id="lti_menufield_'.$num.'">'.
+               '<span class="LC_nobreak">'.&mt('Menu items').': ';
+    foreach my $type ('fullname','coursetitle','role','logout','grades') {
+        $output .= '<label><input type="checkbox" name="lti_menuitem_'.$num.'" value="'.$type.'"'.
+                   $checked{'menuitem'}{$type}.' />'.$menutitles{$type}.'</label>'.
+                   (' 'x2);
+    }
+    $output .= '</span></div></fieldset>'.
+               '<fieldset class="ltioption_crs_'.$num.'" style="display:'.$crssty.'"><legend>'.&mt('Mapping courses').'</legend>'.
                '<div class="LC_floatleft"><span class="LC_nobreak">'.
                &mt('Unique course identifier').': ';
     foreach my $option ('course_offering_sourcedid','context_id','other') {
@@ -6319,20 +6383,44 @@
                    (' 'x2);
     }
     $output .= '</span></fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Creating courses').'</legend>'.
+               '<fieldset class="ltioption_crs_'.$num.'" style="display:'.$crssty.'"><legend>'.&mt('Mapping course roles').'</legend><table><tr>';
+    foreach my $ltirole (@lticourseroles) {
+        my ($selected,$selectnone);
+        if ($rolemaps{$ltirole} eq '') {
+            $selectnone = ' selected="selected"';
+        }
+        $output .= '<td style="text-align: center">'.$ltirole.'<br />'.
+                   '<select name="lti_maprole_'.$ltirole.'_'.$num.'">'.
+                   '<option value=""'.$selectnone.'>'.&mt('Select').'</option>';
+        foreach my $role (@courseroles) {
+            unless ($selectnone) {
+                if ($rolemaps{$ltirole} eq $role) {
+                    $selected = ' selected="selected"';
+                } else {
+                    $selected = '';
+                }
+            }
+            $output .= '<option value="'.$role.'"'.$selected.'>'.
+                       &Apache::lonnet::plaintext($role,'Course').
+                       '</option>';
+        }
+        $output .= '</select></td>';
+    }
+    $output .= '</tr></table></fieldset>'.
+               '<fieldset class="ltioption_crs_'.$num.'" style="display:'.$crssty.'"><legend>'.&mt('Creating courses').'</legend>'.
                '<span class="LC_nobreak">'.&mt('Course created (if absent) on Instructor access').': '.
                '<label><input type="radio" name="lti_makecrs_'.$num.'" value="0"'.
                $checked{'makecrs'}{'N'}.' />'.&mt('No').'</label>'.(' 'x2).
                '<label><input type="radio" name="lti_makecrs_'.$num.'" value="1"'.
                $checked{'makecrs'}{'Y'}.' />'.&mt('Yes').'</label></span>'.
                '</fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Roles which may self-enroll').'</legend>';
+               '<fieldset class="ltioption_crs_'.$num.'" style="display:'.$crssty.'"><legend>'.&mt('Roles which may self-enroll').'</legend>';
     foreach my $lticrsrole (@lticourseroles) {
         $output .= '<span class="LC_nobreak"><label><input type="checkbox" name="lti_selfenroll_'.$num.'" value="'.$lticrsrole.'"'.
                    $checked{'selfenroll'}{$lticrsrole}.' />'.$lticrsrole.'</label> </span> ';
     }
     $output .= '</fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Course options').'</legend>'.
+               '<fieldset class="ltioption_crs_'.$num.'" style="display:'.$crssty.'"><legend>'.&mt('Course options').'</legend>'.
                '<div class="LC_floatleft"><span class="LC_nobreak">'.&mt('Assign users to sections').': '.
                '<label><input type="radio" name="lti_crssec_'.$num.'" value="0"'.
                $checked{'crssec'}{'N'}.$onclicksec.' />'.&mt('No').'</label>'.(' 'x2).
@@ -6384,36 +6472,7 @@
                &mt('Outcomes Service (1.1)').'</label>'.(' 'x2).
                '<label><input type="radio" name="lti_passbackformat_'.$num.'" value="1.0"'.$pb1p0chk.'/>'.
                &mt('Outcomes Extension (1.0)').'</label></span></div>'.
-               '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
-               '<div class="LC_floatleft"><span class="LC_nobreak">'.&mt('Callback on logout').': '.
-               '<label><input type="radio" name="lti_callback_'.$num.'" value="0"'.
-               $checked{'callback'}{'N'}.$onclickcallback.' />'.&mt('No').'</label>'.(' 'x2).
-               '<label><input type="radio" name="lti_callback_'.$num.'" value="1"'.
-               $checked{'callback'}{'Y'}.$onclickcallback.' />'.&mt('Yes').'</label></span></div>'.
-               '<div class="LC_floatleft" style="display:'.$callbacksty.';" id="lti_callbackfield_'.$num.'">'.
-               '<span class="LC_nobreak">'.&mt('Parameter').': '.
-               '<input type="text" name="lti_callbackparam_'.$num.'" value="'.$callback.'" /></span>'.
-               '</div><div style="padding:0;clear:both;margin:0;border:0"></div></fieldset>'.
-               '<fieldset class="ltioption_'.$num.'" style="display:'.$optionsty.'"><legend>'.&mt('Course defaults (Course Coordinator can override)').'</legend>'.
-               '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{'topmenu'}.': '.
-               '<label><input type="radio" name="lti_topmenu_'.$num.'" value="0"'.
-               $checked{'topmenu'}{'N'}.$onclickmenu.' />'.&mt('No').'</label>'.(' 'x2).
-               '<label><input type="radio" name="lti_topmenu_'.$num.'" value="1"'.
-               $checked{'topmenu'}{'Y'}.$onclickmenu.' />'.&mt('Yes').'</label></span></div>'.
-               '<div style="padding:0;clear:both;margin:0;border:0"></div>'.
-               '<div class="LC_floatleft"><span class="LC_nobreak">'.$lt{'inlinemenu'}.': '.
-               '<label><input type="radio" name="lti_inlinemenu_'.$num.'" value="0"'.
-               $checked{'inlinemenu'}{'N'}.$onclickmenu.' />'.&mt('No').'</label>'.(' 'x2).
-               '<label><input type="radio" name="lti_inlinemenu_'.$num.'" value="1"'.
-               $checked{'inlinemenu'}{'Y'}.$onclickmenu.' />'.&mt('Yes').'</label></span></div>';
-     $output .='<div style="padding:0;clear:both;margin:0;border:0"></div>'. 
-               '<div class="LC_floatleft" style="display:'.$menusty.';" id="lti_menufield_'.$num.'">'.
-               '<span class="LC_nobreak">'.&mt('Menu items').': ';
-    foreach my $type ('fullname','coursetitle','role','logout','grades') {
-        $output .= '<label><input type="checkbox" name="lti_menuitem_'.$num.'" value="'.$type.'"'.
-                   $checked{'menuitem'}{$type}.' />'.$menutitles{$type}.'</label>'.
-                   (' 'x2);
-    }
+               '<div style="padding:0;clear:both;margin:0;border:0"></div></fieldset>';
     $output .= '</span></div></fieldset>';
 #        '<fieldset><legend>'.&mt('Assigning author roles').'</legend>';
 #
@@ -14773,7 +14832,7 @@
         if ($position ne '') {
             $allpos[$position] = $itemid;
         }
-        foreach my $item ('consumer','key','secret','lifetime','requser') {
+        foreach my $item ('consumer','key','secret','lifetime','requser','crsinc') {
             my $formitem = 'form.lti_'.$item.'_'.$idx;
             $env{$formitem} =~ s/(`)/'/g;
             if ($item eq 'lifetime') {
@@ -14806,12 +14865,6 @@
                 $mapuser =~ s/^\s+|\s+$//g; 
                 $confhash{$itemid}{'mapuser'} = $mapuser; 
             }
-            foreach my $ltirole (@lticourseroles) {
-                my $possrole = $env{'form.lti_maprole_'.$ltirole.'_'.$idx};
-                if (grep(/^\Q$possrole\E$/, at courseroles)) {
-                    $confhash{$itemid}{'maproles'}{$ltirole} = $possrole;
-                }
-            }
             my @possmakeuser = &Apache::loncommon::get_env_multiple('form.lti_makeuser_'.$idx);
             my @makeuser;
             foreach my $ltirole (sort(@possmakeuser)) {
@@ -14844,46 +14897,6 @@
                     }
                 }
             }
-            if (($env{'form.lti_mapcrs_'.$idx} eq 'course_offering_sourcedid') ||
-                ($env{'form.lti_mapcrs_'.$idx} eq 'context_id'))  {
-                $confhash{$itemid}{'mapcrs'} = $env{'form.lti_mapcrs_'.$idx};
-            } elsif ($env{'form.lti_mapcrs_'.$idx} eq 'other') {
-                my $mapcrs = $env{'form.lti_mapcrsfield_'.$idx}; 
-                $mapcrs =~ s/(`)/'/g;
-                $mapcrs =~ s/^\s+|\s+$//g;
-                $confhash{$itemid}{'mapcrs'} = $mapcrs;
-            }
-            my @posstypes = &Apache::loncommon::get_env_multiple('form.lti_mapcrstype_'.$idx);
-            my @crstypes;
-            foreach my $type (sort(@posstypes)) {
-                if ($posscrstype{$type}) {
-                    push(@crstypes,$type);
-                }
-            }
-            $confhash{$itemid}{'mapcrstype'} = \@crstypes;
-            if ($env{'form.lti_makecrs_'.$idx}) {
-                $confhash{$itemid}{'makecrs'} = 1;
-            }
-            my @possenroll = &Apache::loncommon::get_env_multiple('form.lti_selfenroll_'.$idx);
-            my @selfenroll;
-            foreach my $type (sort(@possenroll)) {
-                if ($posslticrs{$type}) {
-                    push(@selfenroll,$type);
-                }
-            }
-            $confhash{$itemid}{'selfenroll'} = \@selfenroll;
-            if ($env{'form.lti_crssec_'.$idx}) {
-                if ($env{'form.lti_crssecsrc_'.$idx} eq 'course_section_sourcedid') {
-                    $confhash{$itemid}{'section'} = $env{'form.lti_crssecsrc_'.$idx};
-                } elsif ($env{'form.lti_crssecsrc_'.$idx} eq 'other') {
-                    my $section = $env{'form.lti_customsection_'.$idx};
-                    $section =~ s/(`)/'/g;
-                    $section =~ s/^\s+|\s+$//g;
-                    if ($section ne '') {
-                        $confhash{$itemid}{'section'} = $section;
-                    }
-                }
-            }
             if ($env{'form.lti_callback_'.$idx}) {
                 if ($env{'form.lti_callbackparam_'.$idx}) {
                     my $callback = $env{'form.lti_callbackparam_'.$idx};
@@ -14891,18 +14904,11 @@
                     $confhash{$itemid}{'callback'} = $callback;
                 }
             }
-            foreach my $field ('passback','roster','topmenu','inlinemenu') {
+            foreach my $field ('topmenu','inlinemenu') {
                 if ($env{'form.lti_'.$field.'_'.$idx}) {
                     $confhash{$itemid}{$field} = 1;
                 }
             }
-            if ($env{'form.lti_passback_'.$idx}) {
-                if ($env{'form.lti_passbackformat_'.$idx} eq '1.0') {
-                    $confhash{$itemid}{'passbackformat'} = '1.0';
-                } else {
-                    $confhash{$itemid}{'passbackformat'} = '1.1';
-                }
-            }
             if ($env{'form.lti_topmenu_'.$idx} || $env{'form.lti_inlinemenu_'.$idx}) {
                 $confhash{$itemid}{lcmenu} = [];
                 my @possmenu = &Apache::loncommon::get_env_multiple('form.lti_menuitem_'.$idx);
@@ -14915,64 +14921,152 @@
                     }
                 }
             }
-            unless (($idx eq 'add') || ($changes{$itemid})) {
-                foreach my $field ('mapuser','mapcrs','makecrs','section','passback','roster','lcauth','lcauthparm','topmenu','inlinemenu','callback') {
-                    if ($domconfig{$action}{$itemid}{$field} ne $confhash{$itemid}{$field}) {
-                        $changes{$itemid} = 1;
+            if ($confhash{$itemid}{'crsinc'}) {
+                if (($env{'form.lti_mapcrs_'.$idx} eq 'course_offering_sourcedid') ||
+                    ($env{'form.lti_mapcrs_'.$idx} eq 'context_id'))  {
+                    $confhash{$itemid}{'mapcrs'} = $env{'form.lti_mapcrs_'.$idx};
+                } elsif ($env{'form.lti_mapcrs_'.$idx} eq 'other') {
+                    my $mapcrs = $env{'form.lti_mapcrsfield_'.$idx}; 
+                    $mapcrs =~ s/(`)/'/g;
+                    $mapcrs =~ s/^\s+|\s+$//g;
+                    $confhash{$itemid}{'mapcrs'} = $mapcrs;
+                }
+                my @posstypes = &Apache::loncommon::get_env_multiple('form.lti_mapcrstype_'.$idx);
+                my @crstypes;
+                foreach my $type (sort(@posstypes)) {
+                    if ($posscrstype{$type}) {
+                        push(@crstypes,$type);
+                    }
+                }
+                $confhash{$itemid}{'mapcrstype'} = \@crstypes;
+                if ($env{'form.lti_makecrs_'.$idx}) {
+                    $confhash{$itemid}{'makecrs'} = 1;
+                }
+                foreach my $ltirole (@lticourseroles) {
+                    my $possrole = $env{'form.lti_maprole_'.$ltirole.'_'.$idx};
+                    if (grep(/^\Q$possrole\E$/, at courseroles)) {
+                        $confhash{$itemid}{'maproles'}{$ltirole} = $possrole;
+                    }
+                }
+                my @possenroll = &Apache::loncommon::get_env_multiple('form.lti_selfenroll_'.$idx);
+                my @selfenroll;
+                foreach my $type (sort(@possenroll)) {
+                    if ($posslticrs{$type}) {
+                        push(@selfenroll,$type);
+                    }
+                }
+                $confhash{$itemid}{'selfenroll'} = \@selfenroll;
+                if ($env{'form.lti_crssec_'.$idx}) {
+                    if ($env{'form.lti_crssecsrc_'.$idx} eq 'course_section_sourcedid') {
+                        $confhash{$itemid}{'section'} = $env{'form.lti_crssecsrc_'.$idx};
+                    } elsif ($env{'form.lti_crssecsrc_'.$idx} eq 'other') {
+                        my $section = $env{'form.lti_customsection_'.$idx};
+                        $section =~ s/(`)/'/g;
+                        $section =~ s/^\s+|\s+$//g;
+                        if ($section ne '') {
+                            $confhash{$itemid}{'section'} = $section;
+                        }
                     }
                 }
-                unless ($changes{$itemid}) {
-                    if ($domconfig{$action}{$itemid}{'passback'} eq $confhash{$itemid}{'passback'}) {
-                        if ($domconfig{$action}{$itemid}{'passbackformat'} ne $confhash{$itemid}{'passbackformat'}) {
+                foreach my $field ('passback','roster') {
+                    if ($env{'form.lti_'.$field.'_'.$idx}) {
+                        $confhash{$itemid}{$field} = 1;
+                    }
+                }
+                if ($env{'form.lti_passback_'.$idx}) {
+                    if ($env{'form.lti_passbackformat_'.$idx} eq '1.0') {
+                        $confhash{$itemid}{'passbackformat'} = '1.0';
+                    } else {
+                        $confhash{$itemid}{'passbackformat'} = '1.1';
+                    }
+                }
+            }
+            unless (($idx eq 'add') || ($changes{$itemid})) {
+                if ($confhash{$itemid}{'crsinc'}) {
+                    foreach my $field ('mapcrs','makecrs','section','passback','roster') {
+                        if ($domconfig{$action}{$itemid}{$field} ne $confhash{$itemid}{$field}) {
                             $changes{$itemid} = 1;
                         }
                     }
-                }
-                foreach my $field ('makeuser','mapcrstype','selfenroll','instdata','lcmenu') {
                     unless ($changes{$itemid}) {
-                        if (ref($domconfig{$action}{$itemid}{$field}) eq 'ARRAY') {
-                            if (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
-                                my @diffs = &Apache::loncommon::compare_arrays($domconfig{$action}{$itemid}{$field},
-                                                                               $confhash{$itemid}{$field});
-                                if (@diffs) {
-                                    $changes{$itemid} = 1;
-                                }
-                            } elsif (@{$domconfig{$action}{$itemid}{$field}} > 0) {
-                                $changes{$itemid} = 1;
-                            }
-                        } elsif (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
-                            if (@{$confhash{$itemid}{$field}} > 0) {
+                        if ($domconfig{$action}{$itemid}{'passback'} eq $confhash{$itemid}{'passback'}) {
+                            if ($domconfig{$action}{$itemid}{'passbackformat'} ne $confhash{$itemid}{'passbackformat'}) {
                                 $changes{$itemid} = 1;
                             }
                         }
                     }
-                }
-                unless ($changes{$itemid}) {
-                    if (ref($domconfig{$action}{$itemid}{'maproles'}) eq 'HASH') {
-                        if (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
-                            foreach my $ltirole (keys(%{$domconfig{$action}{$itemid}{'maproles'}})) {
-                                if ($domconfig{$action}{$itemid}{'maproles'}{$ltirole} ne 
-                                    $confhash{$itemid}{'maproles'}{$ltirole}) {
+                    foreach my $field ('mapcrstype','selfenroll') {
+                        unless ($changes{$itemid}) {
+                            if (ref($domconfig{$action}{$itemid}{$field}) eq 'ARRAY') {
+                                if (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
+                                    my @diffs = &Apache::loncommon::compare_arrays($domconfig{$action}{$itemid}{$field},
+                                                                                   $confhash{$itemid}{$field});
+                                    if (@diffs) {
+                                        $changes{$itemid} = 1;
+                                    }
+                                } elsif (@{$domconfig{$action}{$itemid}{$field}} > 0) {
+                                    $changes{$itemid} = 1;
+                                }
+                            } elsif (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
+                                if (@{$confhash{$itemid}{$field}} > 0) {
                                     $changes{$itemid} = 1;
-                                    last;
                                 }
                             }
-                            unless ($changes{$itemid}) {
-                                foreach my $ltirole (keys(%{$confhash{$itemid}{'maproles'}})) {
-                                    if ($confhash{$itemid}{'maproles'}{$ltirole} ne 
-                                        $domconfig{$action}{$itemid}{'maproles'}{$ltirole}) {
+                        }
+                    }
+                    unless ($changes{$itemid}) {
+                        if (ref($domconfig{$action}{$itemid}{'maproles'}) eq 'HASH') {
+                            if (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
+                                foreach my $ltirole (keys(%{$domconfig{$action}{$itemid}{'maproles'}})) {
+                                    if ($domconfig{$action}{$itemid}{'maproles'}{$ltirole} ne 
+                                        $confhash{$itemid}{'maproles'}{$ltirole}) {
                                         $changes{$itemid} = 1;
                                         last;
                                     }
                                 }
+                                unless ($changes{$itemid}) {
+                                    foreach my $ltirole (keys(%{$confhash{$itemid}{'maproles'}})) {
+                                        if ($confhash{$itemid}{'maproles'}{$ltirole} ne 
+                                            $domconfig{$action}{$itemid}{'maproles'}{$ltirole}) {
+                                            $changes{$itemid} = 1;
+                                            last;
+                                        }
+                                    }
+                                }
+                            } elsif (keys(%{$domconfig{$action}{$itemid}{'maproles'}}) > 0) {
+                                $changes{$itemid} = 1;
                             }
-                        } elsif (keys(%{$domconfig{$action}{$itemid}{'maproles'}}) > 0) {
+                        } elsif (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
+                            unless ($changes{$itemid}) {
+                                if (keys(%{$confhash{$itemid}{'maproles'}}) > 0) {
+                                    $changes{$itemid} = 1;
+                                }
+                            }
+                        }
+                    }
+                }
+                unless ($changes{$itemid}) {
+                    foreach my $field ('mapuser','lcauth','lcauthparm','topmenu','inlinemenu','callback') {
+                        if ($domconfig{$action}{$itemid}{$field} ne $confhash{$itemid}{$field}) {
                             $changes{$itemid} = 1;
                         }
-                    } elsif (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
-                        unless ($changes{$itemid}) {
-                            if (keys(%{$confhash{$itemid}{'maproles'}}) > 0) {
-                                $changes{$itemid} = 1;
+                    }
+                    unless ($changes{$itemid}) {
+                        foreach my $field ('makeuser','lcmenu') {
+                            if (ref($domconfig{$action}{$itemid}{$field}) eq 'ARRAY') {
+                                if (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
+                                    my @diffs = &Apache::loncommon::compare_arrays($domconfig{$action}{$itemid}{$field},
+                                                                                   $confhash{$itemid}{$field});
+                                    if (@diffs) {
+                                        $changes{$itemid} = 1;
+                                    }
+                                } elsif (@{$domconfig{$action}{$itemid}{$field}} > 0) {
+                                    $changes{$itemid} = 1;
+                                }
+                            } elsif (ref($confhash{$itemid}{$field}) eq 'ARRAY') {
+                                if (@{$confhash{$itemid}{$field}} > 0) {
+                                    $changes{$itemid} = 1;
+                                }
                             }
                         }
                     }
@@ -15048,6 +15142,11 @@
                         $resulttext .= ('*'x$num).'</li>';
                     }
                     if ($confhash{$itemid}{'requser'}) {
+                        if ($confhash{$itemid}{'callback'}) {
+                            $resulttext .= '<li>'.&mt('Callback setting').': '.$confhash{$itemid}{'callback'}.'</li>';
+                        } else {
+                            $resulttext .= '<li>'.&mt('No callback to logout LON-CAPA session when user logs out of Comsumer').'</li>';
+                        }
                         if ($confhash{$itemid}{'mapuser'}) {
                             my $shownmapuser;
                             if ($confhash{$itemid}{'mapuser'} eq 'lis_person_sourcedid') {
@@ -15059,20 +15158,6 @@
                             }
                             $resulttext .= '<li>'.&mt('LON-CAPA username').': '.$shownmapuser.'</li>';
                         }
-                        if (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
-                            my $rolemaps;
-                            foreach my $role (@ltiroles) {
-                                if ($confhash{$itemid}{'maproles'}{$role}) {
-                                    $rolemaps .= (' 'x2).$role.'='.
-                                                 &Apache::lonnet::plaintext($confhash{$itemid}{'maproles'}{$role},
-                                                                            'Course').',';
-                                }
-                            }
-                            if ($rolemaps) {
-                                $rolemaps =~ s/,$//;
-                                $resulttext .= '<li>'.&mt('Role mapping:').$rolemaps.'</li>';
-                            }
-                        }
                         if (ref($confhash{$itemid}{'makeuser'}) eq 'ARRAY') {
                             if (@{$confhash{$itemid}{'makeuser'}} > 0) { 
                                 $resulttext .= '<li>'.&mt('Following roles may create user accounts: [_1]',
@@ -15105,59 +15190,10 @@
                                 $resulttext .= '<li>'.&mt('No institutional data used when creating a new user.').'</li>';
                             }
                         }
-                        if ($confhash{$itemid}{'mapcrs'}) {
-                            $resulttext .= '<li>'.&mt('Unique course identifier').': '.$confhash{$itemid}{'mapcrs'}.'</li>';
-                        }
-                        if (ref($confhash{$itemid}{'mapcrstype'}) eq 'ARRAY') {
-                            if (@{$confhash{$itemid}{'mapcrstype'}} > 0) {
-                                $resulttext .= '<li>'.&mt('Mapping for the following LON-CAPA course types: [_1]',
-                                               join(', ',map { $coursetypetitles{$_}; } @coursetypes)).
-                                               '</li>';
-                            } else {
-                                $resulttext .= '<li>'.&mt('No mapping to LON-CAPA courses').'</li>';
-                            }
-                        }
-                        if ($confhash{$itemid}{'makecrs'}) {
-                            $resulttext .= '<li>'.&mt('Instructor may create course (if absent).').'</li>';
-                        } else {
-                            $resulttext .= '<li>'.&mt('Instructor may not create course (if absent).').'</li>';
-                        }
-                        if (ref($confhash{$itemid}{'selfenroll'}) eq 'ARRAY') {
-                            if (@{$confhash{$itemid}{'selfenroll'}} > 0) {
-                                $resulttext .= '<li>'.&mt('Self-enrollment for following roles: [_1]',
-                                                          join(', ',@{$confhash{$itemid}{'selfenroll'}})).
-                                               '</li>';
-                            } else {
-                                $resulttext .= '<li>'.&mt('Self-enrollment not permitted').'</li>';
-                            }
-                        }
-                        if ($confhash{$itemid}{'section'}) {
-                            if ($confhash{$itemid}{'section'} eq 'course_section_sourcedid') {
-                                $resulttext .= '<li>'.&mt('User section from standard field:').
-                                                     ' (course_section_sourcedid)'.'</li>';  
-                            } else {
-                                $resulttext .= '<li>'.&mt('User section from:').' '.
-                                                      $confhash{$itemid}{'section'}.'</li>';
-                            }
-                        } else {
-                            $resulttext .= '<li>'.&mt('No section assignment').'</li>';
-                        }
-                        if ($confhash{$itemid}{'callback'}) {
-                            $resulttext .= '<li>'.&mt('Callback setting').': '.$confhash{$itemid}{'callback'}.'</li>';
-                        } else {
-                            $resulttext .= '<li>'.&mt('No callback to logout LON-CAPA session when user logs out of Comsumer');
-                        }
-                        foreach my $item ('passback','roster','topmenu','inlinemenu') {
+                        foreach my $item ('topmenu','inlinemenu') {
                             $resulttext .= '<li>'.$lt{$item}.': ';
                             if ($confhash{$itemid}{$item}) {
                                 $resulttext .= &mt('Yes');
-                                if ($item eq 'passback') {
-                                    if ($confhash{$itemid}{'passbackformat'} eq '1.0') {
-                                        $resulttext .= ' ('.&mt('Outcomes Extension (1.0)').')';
-                                    } elsif ($confhash{$itemid}{'passbackformat'} eq '1.1') {
-                                        $resulttext .= ' ('.&mt('Outcomes Service (1.1)').')';
-                                    }
-                                }
                             } else {
                                 $resulttext .= &mt('No');
                             }
@@ -15166,9 +15202,86 @@
                         if (ref($confhash{$itemid}{'lcmenu'}) eq 'ARRAY') {
                             if (@{$confhash{$itemid}{'lcmenu'}} > 0) {
                                 $resulttext .= '<li>'.&mt('Menu items:').' '.
-                                               join(', ', map { $menutitles{$_}; } (@{$confhash{$itemid}{'lcmenu'}})).'</li>'; 
+                                               join(', ', map { $menutitles{$_}; } (@{$confhash{$itemid}{'lcmenu'}})).'</li>';
+                            } else {
+                                $resulttext .= '<li>'.&mt('No menu items displayed in header or online menu').'</li>';
+                            }
+                        }
+                        if ($confhash{$itemid}{'crsinc'}) {
+                            if (ref($confhash{$itemid}{'maproles'}) eq 'HASH') {
+                                my $rolemaps;
+                                foreach my $role (@ltiroles) {
+                                    if ($confhash{$itemid}{'maproles'}{$role}) {
+                                        $rolemaps .= (' 'x2).$role.'='.
+                                                     &Apache::lonnet::plaintext($confhash{$itemid}{'maproles'}{$role},
+                                                                                'Course').',';
+                                    }
+                                }
+                                if ($rolemaps) {
+                                    $rolemaps =~ s/,$//;
+                                    $resulttext .= '<li>'.&mt('Role mapping:').$rolemaps.'</li>';
+                                }
+                            }
+                            if ($confhash{$itemid}{'mapcrs'}) {
+                                $resulttext .= '<li>'.&mt('Unique course identifier').': '.$confhash{$itemid}{'mapcrs'}.'</li>';
+                            }
+                            if (ref($confhash{$itemid}{'mapcrstype'}) eq 'ARRAY') {
+                                if (@{$confhash{$itemid}{'mapcrstype'}} > 0) {
+                                    $resulttext .= '<li>'.&mt('Mapping for the following LON-CAPA course types: [_1]',
+                                                   join(', ',map { $coursetypetitles{$_}; } @coursetypes)).
+                                                   '</li>';
+                                } else {
+                                    $resulttext .= '<li>'.&mt('No mapping to LON-CAPA courses').'</li>';
+                                }
+                            }
+                            if ($confhash{$itemid}{'makecrs'}) {
+                                $resulttext .= '<li>'.&mt('Instructor may create course (if absent).').'</li>';
+                            } else {
+                                $resulttext .= '<li>'.&mt('Instructor may not create course (if absent).').'</li>';
+                            }
+                            if (ref($confhash{$itemid}{'selfenroll'}) eq 'ARRAY') {
+                                if (@{$confhash{$itemid}{'selfenroll'}} > 0) {
+                                    $resulttext .= '<li>'.&mt('Self-enrollment for following roles: [_1]',
+                                                              join(', ',@{$confhash{$itemid}{'selfenroll'}})).
+                                                   '</li>';
+                                } else {
+                                    $resulttext .= '<li>'.&mt('Self-enrollment not permitted').'</li>';
+                                }
+                            }
+                            if ($confhash{$itemid}{'section'}) {
+                                if ($confhash{$itemid}{'section'} eq 'course_section_sourcedid') {
+                                    $resulttext .= '<li>'.&mt('User section from standard field:').
+                                                         ' (course_section_sourcedid)'.'</li>';  
+                                } else {
+                                    $resulttext .= '<li>'.&mt('User section from:').' '.
+                                                          $confhash{$itemid}{'section'}.'</li>';
+                                }
                             } else {
-                                $resulttext .= '<li>'.&mt('No menu items displayed in header or online menu').'</li>'; 
+                                $resulttext .= '<li>'.&mt('No section assignment').'</li>';
+                            }
+                            foreach my $item ('passback','roster','topmenu','inlinemenu') {
+                                $resulttext .= '<li>'.$lt{$item}.': ';
+                                if ($confhash{$itemid}{$item}) {
+                                    $resulttext .= &mt('Yes');
+                                    if ($item eq 'passback') {
+                                        if ($confhash{$itemid}{'passbackformat'} eq '1.0') {
+                                            $resulttext .= ' ('.&mt('Outcomes Extension (1.0)').')';
+                                        } elsif ($confhash{$itemid}{'passbackformat'} eq '1.1') {
+                                            $resulttext .= ' ('.&mt('Outcomes Service (1.1)').')';
+                                        }
+                                    }
+                                } else {
+                                    $resulttext .= &mt('No');
+                                }
+                                $resulttext .= '</li>';
+                            }
+                            if (ref($confhash{$itemid}{'lcmenu'}) eq 'ARRAY') {
+                                if (@{$confhash{$itemid}{'lcmenu'}} > 0) {
+                                    $resulttext .= '<li>'.&mt('Menu items:').' '.
+                                                   join(', ', map { $menutitles{$_}; } (@{$confhash{$itemid}{'lcmenu'}})).'</li>'; 
+                                } else {
+                                    $resulttext .= '<li>'.&mt('No menu items displayed in header or online menu').'</li>'; 
+                                }
                             }
                         }
                     }
Index: loncom/lti/ltiauth.pm
diff -u loncom/lti/ltiauth.pm:1.25 loncom/lti/ltiauth.pm:1.26
--- loncom/lti/ltiauth.pm:1.25	Mon Nov 22 03:19:05 2021
+++ loncom/lti/ltiauth.pm	Mon Nov 22 23:41:00 2021
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Basic LTI Authentication Module
 #
-# $Id: ltiauth.pm,v 1.25 2021/11/22 03:19:05 raeburn Exp $
+# $Id: ltiauth.pm,v 1.26 2021/11/22 23:41:00 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -613,20 +613,26 @@
 
     my $reqcrs;
     if ($cnum eq '') {
-        if ((@ltiroles) && ($lti{$itemid}{'mapcrs'}) &&
-            ($ltiroles[0] eq 'Instructor') && ($lcroles[0] eq 'cc') && ($lti{$itemid}{'makecrs'})) {
-            my (%can_request,%request_domains);
-            &Apache::lonnet::check_can_request($cdom,\%can_request,\%request_domains,$uname,$udom);
-            if ($can_request{'lti'}) {
-                $reqcrs = 1;
-                &lti_session($r,$itemid,$uname,$udom,$uhome,$lonhost,undef,$mapurl,$tail,
-                             $symb,$cdom,$cnum,$params,\@ltiroles,$lti{$itemid},\@lcroles,
-                             $reqcrs,$sourcecrs);
+        if ($lti{$itemid}{'crsinc'}) {
+            if ((@ltiroles) && ($lti{$itemid}{'mapcrs'}) &&
+                ($ltiroles[0] eq 'Instructor') && ($lcroles[0] eq 'cc') && ($lti{$itemid}{'makecrs'})) {
+                my (%can_request,%request_domains);
+                &Apache::lonnet::check_can_request($cdom,\%can_request,\%request_domains,$uname,$udom);
+                if ($can_request{'lti'}) {
+                    $reqcrs = 1;
+                    &lti_session($r,$itemid,$uname,$udom,$uhome,$lonhost,undef,$mapurl,$tail,
+                                 $symb,$cdom,$cnum,$params,\@ltiroles,$lti{$itemid},\@lcroles,
+                                 $reqcrs,$sourcecrs);
+                } else {
+                    &invalid_request($r,27);
+                }
             } else {
-                &invalid_request($r,27);
+                &invalid_request($r,28);
             }
         } else {
-            &invalid_request($r,28);
+            &lti_session($r,$itemid,$uname,$udom,$uhome,$lonhost,undef,$mapurl,$tail,
+                         $symb,$cdom,$cnum,$params,\@ltiroles,$lti{$itemid},\@lcroles,
+                         $reqcrs,$sourcecrs);
         }
         return OK;
     }
@@ -894,7 +900,9 @@
                 $env{'request.lti.uri'} = $tail;
             } else {
                 unless ($tail eq '/adm/roles') {
-                    $env{'form.origurl'} = '/adm/navmaps';
+                    if ($cnum) {
+                        $env{'form.origurl'} = '/adm/navmaps';
+                    }
                 }
             }
         }
@@ -1002,7 +1010,9 @@
                 $info{'origurl'} = $tail;
             } else {
                 unless ($tail eq '/adm/roles') {
-                    $info{'origurl'} = '/adm/navmaps';
+                    if ($cnum) {
+                        $info{'origurl'} = '/adm/navmaps';
+                    }
                 }
             }
         }


More information about the LON-CAPA-cvs mailing list