--- loncom/interface/courseprefs.pm 2023/01/23 21:34:29 1.49.2.28.2.14 +++ loncom/interface/courseprefs.pm 2022/02/01 18:23:24 1.98 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.49.2.28.2.14 2023/01/23 21:34:29 raeburn Exp $ +# $Id: courseprefs.pm,v 1.98 2022/02/01 18:23:24 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,16 +52,12 @@ This module is used for configuration of =item process_changes() -=item process_linkprot() - =item get_sec_str() =item check_clone() =item store_changes() -=item store_linkprot() - =item update_env() =item display_disallowed() @@ -116,7 +112,7 @@ This module is used for configuration of =item item_table_row_end() -=item yesno_radio() +=item yes_no_radio() =item select_from_options() @@ -224,7 +220,6 @@ use Apache::lonparmset; use Apache::courseclassifier; use Apache::lonlocal; use LONCAPA qw(:DEFAULT :match); -use Crypt::CBC; my $registered_cleanup; my $modified_courses; @@ -293,7 +288,7 @@ sub handler { excc => 'Exclude from community catalog', clon => 'Users allowed to clone community', rept => 'Replacement titles for standard community roles', - time => 'Time Zone where the community is located', + time => 'Timezone where the community is located', date => 'Locale used for community calendar', coco => 'Community Content', copo => 'Community Policy', @@ -315,14 +310,14 @@ sub handler { idnu => 'Course ID or number', unco => 'Unique code', desc => 'Course Description', - cred => 'Student credits', + cred => 'Student credits', ownr => 'Course Owner', cown => 'Course Co-owners', catg => 'Categorize course', excc => 'Exclude from course catalog', clon => 'Users allowed to clone course', rept => 'Replacement titles for standard course roles', - time => 'Time Zone in which the course takes place', + time => 'Timezone in which the course takes place', date => 'Locale used for course calendar', coco => 'Course Content', copo => 'Course Policy', @@ -370,29 +365,15 @@ sub handler { } my %values=&Apache::lonnet::dump('environment',$cdom,$cnum); - my %linkprot=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); - my %ltienc = &Apache::lonnet::dump('nohist_ltienc',$cdom,$cnum,undef,undef,undef,1); - foreach my $id (keys(%linkprot)) { - if (ref($linkprot{$id}) eq 'HASH') { - if (ref($ltienc{$id}) eq 'HASH') { - $values{'linkprot'}{$id} = { %{$linkprot{$id}}, %{$ltienc{$id}} }; - } else { - $values{'linkprot'}{$id} = $linkprot{$id}; - } - } - unless ($phase eq 'process') { - if (ref($values{'linkprot'}{$id}) eq 'HASH') { - delete($values{'linkprot'}{$id}{'secret'}); - } - } - } - if ($linkprot{'lock'}) { - delete($linkprot{'lock'}); + my %courselti=&Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); + if ($courselti{'lock'}) { + delete($courselti{'lock'}); } + $values{'linkprotection'} = \%courselti; my @prefs_order = ('courseinfo','localization','feedback','discussion', 'classlists','appearance','grading','printouts', - 'menuitems','linkprot','spreadsheet','bridgetasks', - 'other'); + 'menuitems','linkprotection','spreadsheet','bridgetasks', + 'lti','other'); my %prefs = ( 'courseinfo' => @@ -407,7 +388,7 @@ sub handler { 'co-owners' => $lt{'cown'}, 'description' => $lt{'desc'}, 'courseid' => $lt{'idnu'}, - 'uniquecode' => $lt{'unco'}, + 'uniquecode' => $lt{'unco'}, 'categories' => $lt{'catg'}, 'hidefromcat' => $lt{'excc'}, 'cloners' => $lt{'clon'}, @@ -444,6 +425,7 @@ sub handler { { text => 'Discussion and Chat', help => 'Course_Prefs_Discussions', ordered => ['pch.roles.denied','pch.users.denied', + 'pac.roles.denied','pac.users.denied', 'plc.roles.denied','plc.users.denied', 'allow_limited_html_in_feedback', 'allow_discussion_post_editing', @@ -453,9 +435,11 @@ sub handler { 'pch.users.denied' => 'No Resource Discussion', 'plc.roles.denied' => 'No Chat room use', 'plc.users.denied' => 'No Chat room use', + 'pac.roles.denied' => 'No Anonymous Resource Discussion', + 'pac.users.denied' => 'No Anonymous Resource Discussion', allow_limited_html_in_feedback => 'Allow limited HTML in discussion', allow_discussion_post_editing => 'Users can edit/delete own discussion posts', - discussion_post_fonts => 'Discussion post fonts based on likes/unlikes', + discussion_post_fonts => 'Discussion post fonts based on likes/unlikes', }, }, 'classlists' => @@ -489,8 +473,7 @@ sub handler { help => 'Course_Prefs_Display', ordered => ['default_xml_style','pageseparators', 'disable_receipt_display','texengine', - 'tthoptions','uselcmath','usejsme', - 'inline_chem','extresource'], + 'tthoptions','uselcmath','usejsme','inline_chem'], itemtext => { default_xml_style => 'Default XML style file', pageseparators => 'Visibly Separate Items on Pages', @@ -500,7 +483,6 @@ sub handler { uselcmath => 'Student formula entry uses inline preview, not DragMath pop-up', usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', inline_chem => 'Chemical reaction response uses inline preview, not pop-up', - extresource => 'Display of external resources', }, }, 'grading' => @@ -521,7 +503,7 @@ sub handler { help => 'Course_Prefs_Printouts', ordered => ['problem_stream_switch','suppress_tries', 'default_paper_size','print_header_format', - 'disableexampointprint'], + 'disableexampointprint','canuse_pdfforms'], itemtext => { problem_stream_switch => 'Allow problems to be split over pages', suppress_tries => 'Suppress number of tries in printing', @@ -555,6 +537,18 @@ sub handler { suppress_embed_prompt => 'Hide upload references prompt if uploading file to portfolio', }, }, + 'lti' => + { + text => 'LTI provider settings', + help => 'Course_Prefs_LTIProvider', + ordered => ['lti.override','lti.topmenu','lti.inlinemenu','lti.lcmenu'], + itemtext => { + 'lti.override' => 'Override domain defaults', + 'lti.topmenu' => 'Display LON-CAPA page header', + 'lti.inlinemenu' => 'Display LON-CAPA inline menu', + 'lti.lcmenu' => 'Menu items', + }, + }, 'menuitems' => { text => 'Menu display', @@ -570,7 +564,7 @@ sub handler { menucollections => 'Menu collections', }, }, - 'linkprot' => + 'linkprotection' => { text => 'Link protection', help => 'Course_Prefs_Linkprotection', @@ -588,14 +582,10 @@ sub handler { ); if (($phase eq 'process') && ($parm_permission->{'process'})) { my @allitems = &get_allitems(%prefs); - my $result = &Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context, - \@prefs_order,\%prefs,\%values, - $cnum,undef,\@allitems, - 'coursepref',$parm_permission); - if ((ref($result) eq 'HASH') && (keys(%{$result}))) { - $r->rflush(); - &devalidate_remote_courseprefs($cdom,$cnum,$result); - } + &Apache::lonconfigsettings::make_changes($r,$cdom,$phase,$context, + \@prefs_order,\%prefs,\%values, + $cnum,undef,\@allitems, + 'coursepref',$parm_permission); } elsif (($phase eq 'display') && ($parm_permission->{'display'})) { my $noedit; if (ref($parm_permission) eq 'HASH') { @@ -606,7 +596,7 @@ sub handler { my $jscript = &get_jscript($cid,$cdom,$phase,$crstype,\%values,$noedit); my @allitems = &get_allitems(%prefs); &Apache::lonconfigsettings::display_settings($r,$cdom,$phase,$context, - \@prefs_order,\%prefs,\%values,$cnum,$jscript,\@allitems,$crstype, + \@prefs_order,\%prefs,\%values,undef,$jscript,\@allitems,$crstype, 'coursepref',$parm_permission); } else { &Apache::lonconfigsettings::display_choices($r,$phase,$context, @@ -659,7 +649,7 @@ sub get_allitems { } sub print_config_box { - my ($r,$cdom,$cnum,$phase,$action,$item,$settings,$allitems,$crstype,$parm_permission) = @_; + my ($r,$cdom,$phase,$action,$item,$settings,$allitems,$crstype,$parm_permission) = @_; my $ordered = $item->{'ordered'}; my $itemtext = $item->{'itemtext'}; my $noedit; @@ -785,10 +775,12 @@ sub print_config_box { $output .= &print_spreadsheet($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); } elsif ($action eq 'bridgetasks') { $output .= &print_bridgetasks($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); + } elsif ($action eq 'lti') { + $output .= &print_lti($cdom,$settings,$ordered,$itemtext,\$rowtotal,$crstype,$noedit); } elsif ($action eq 'menuitems') { $output .= &print_menuitems('bottom',$cdom,$settings,$itemtext,\$rowtotal,$crstype,$noedit); - } elsif ($action eq 'linkprot') { - $output .= &print_linkprotection($cdom,$cnum,$settings,\$rowtotal,$crstype,$noedit,'course'); + } elsif ($action eq 'linkprotection') { + $output .= &print_linkprotection($cdom,$settings,\$rowtotal,$crstype,$noedit); } elsif ($action eq 'other') { $output .= &print_other($cdom,$settings,$allitems,\$rowtotal,$crstype,$noedit); } @@ -801,8 +793,8 @@ sub print_config_box { } sub process_changes { - my ($cdom,$cnum,$action,$values,$item,$changes,$allitems,$disallowed,$crstype,$lastactref) = @_; - my (%newvalues,$errors); + my ($cdom,$cnum,$action,$values,$item,$changes,$allitems,$disallowed,$crstype) = @_; + my (%newvalues,%courselti,$errors); if (ref($item) eq 'HASH') { if (ref($changes) eq 'HASH') { my @ordered; @@ -819,11 +811,14 @@ sub process_changes { } } } - } elsif ($action eq 'linkprot') { - if (ref($values->{$action}) eq 'HASH') { - foreach my $id (keys(%{$values->{$action}})) { + } elsif ($action eq 'linkprotection') { + if (ref($values->{'linkprotection'}) eq 'HASH') { + foreach my $id (keys(%{$values->{'linkprotection'}})) { if ($id =~ /^\d+$/) { push(@ordered,$id); + unless (ref($values->{'linkprotection'}->{$id}) eq 'HASH') { + $courselti{$id} = ''; + } } } } @@ -968,9 +963,77 @@ sub process_changes { } elsif ($values->{'menucollections'}) { $changes->{'menucollections'} = ''; } - } elsif ($action eq 'linkprot') { - if (ref($values) eq 'HASH') { - $errors = &process_linkprot($cdom,$cnum,$values->{$action},$changes,'course',$lastactref); + } elsif ($action eq 'linkprotection') { + my %menutitles = <imenu_titles(); + my (@items,%deletions,%itemids,%haschanges); + if ($env{'form.linkprot_add'}) { + my $name = $env{'form.linkprot_name_add'}; + $name =~ s/(`)/'/g; + my ($newid,$error) = &get_courselti_id($cdom,$cnum,$name); + if ($newid) { + $itemids{'add'} = $newid; + push(@items,'add'); + $haschanges{$newid} = 1; + } else { + $errors .= ''. + &mt('Failed to acquire unique ID for link protection'). + ''; + } + } + if (ref($values->{'linkprotection'}) eq 'HASH') { + my @todelete = &Apache::loncommon::get_env_multiple('form.linkprot_del'); + my $maxnum = $env{'form.linkprot_maxnum'}; + for (my $i=0; $i<=$maxnum; $i++) { + my $itemid = $env{'form.linkprot_id_'.$i}; + $itemid =~ s/\D+//g; + if ($itemid) { + if (ref($values->{'linkprotection'}->{$itemid}) eq 'HASH') { + push(@items,$i); + $itemids{$i} = $itemid; + if ((@todelete > 0) && (grep(/^$i$/,@todelete))) { + $deletions{$itemid} = $values->{'linkprotection'}->{$itemid}->{'name'}; + } + } + } + } + } + + foreach my $idx (@items) { + my $itemid = $itemids{$idx}; + next unless ($itemid); + if (exists($deletions{$itemid})) { + $courselti{$itemid} = $deletions{$itemid}; + $haschanges{$itemid} = 1; + next; + } + my %current; + if (ref($values->{'linkprotection'}) eq 'HASH') { + if (ref($values->{'linkprotection'}->{$itemid}) eq 'HASH') { + foreach my $key (keys(%{$values->{'linkprotection'}->{$itemid}})) { + $current{$key} = $values->{'linkprotection'}->{$itemid}->{$key}; + } + } + } + foreach my $inner ('name','key','secret','lifetime','version') { + my $formitem = 'form.linkprot_'.$inner.'_'.$idx; + $env{$formitem} =~ s/(`)/'/g; + if ($inner eq 'lifetime') { + $env{$formitem} =~ s/[^\d.]//g; + } + unless ($idx eq 'add') { + if ($current{$inner} ne $env{$formitem}) { + $haschanges{$itemid} = 1; + } + } + if ($env{$formitem} ne '') { + $courselti{$itemid}{$inner} = $env{$formitem}; + } + } + } + if (keys(%haschanges)) { + foreach my $entry (keys(%haschanges)) { + $changes->{$entry} = $courselti{$entry}; + } } } else { foreach my $entry (@ordered) { @@ -1219,7 +1282,8 @@ sub process_changes { } } } - } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied')) { + } elsif (($entry eq 'plc.roles.denied') || ($entry eq 'pch.roles.denied') || + ($entry eq 'pac.roles.denied')) { my @denied = &Apache::loncommon::get_env_multiple('form.'.$entry); @denied = sort(@denied); my $deniedstr = ''; @@ -1227,7 +1291,8 @@ sub process_changes { $deniedstr = join(',',@denied); } $newvalues{$entry} = $deniedstr; - } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied')) { + } elsif (($entry eq 'plc.users.denied') || ($entry eq 'pch.users.denied') || + ($entry eq 'pac.users.denied')) { my $total = $env{'form.'.$entry.'_total'}; my $userstr = ''; my @denied; @@ -1279,14 +1344,14 @@ sub process_changes { my ($classorder,$classtitles) = &discussion_vote_classes(); my $fontchange = 0; foreach my $class (@{$classorder}) { - my $ext_entry = $entry.'_'.$class; + my $ext_entry = $entry.'_'.$class; my $size = $env{'form.'.$ext_entry.'_size'}; my $unit = $env{'form.'.$ext_entry.'_unit'}; my $weight = $env{'form.'.$ext_entry.'_weight'}; my $style = $env{'form.'.$ext_entry.'_style'}; my $other = $env{'form.'.$ext_entry.'_other'}; $size =~ s/,//g; - $unit =~ s/,//g; + $unit =~ s/,//g; $weight =~ s/,//g; $style =~ s/,//g; $other =~ s/[^\w;:\s\-\%.]//g; @@ -1294,7 +1359,7 @@ sub process_changes { $newvalues{$ext_entry} = join(',',($size.$unit,$weight,$style,$other)); my $current = $values->{$ext_entry}; if ($values->{$ext_entry} eq '') { - $current = ',,,'; + $current = ',,,'; } if ($newvalues{$ext_entry} ne $current) { $changes->{$ext_entry} = $newvalues{$ext_entry}; @@ -1303,7 +1368,7 @@ sub process_changes { } if ($fontchange) { $changes->{$entry} = 1; - } + } } elsif ($entry eq 'nothideprivileged') { my @curr_nothide; my @new_nothide; @@ -1378,7 +1443,7 @@ sub process_changes { my $newtext = $maxnum-1; $newhdr[$env{'form.printfmthdr_pos_'.$newtext}] = $env{'form.printfmthdr_text_'.$newtext}; $newvalues{$entry} = join('',@newhdr); - } elsif (($entry eq 'languages') || + } elsif (($entry eq 'languages') || ($entry eq 'checkforpriv')) { my $settings; my $total = $env{'form.'.$entry.'_total'}; @@ -1394,7 +1459,7 @@ sub process_changes { } if ($env{'form.'.$entry.'_'.$total} ne '') { my $new = $env{'form.'.$entry.'_'.$total}; - if ($entry eq 'languages') { + if ($entry eq 'languages') { my %langchoices = &get_lang_choices(); if ($langchoices{$new}) { $settings .= $new; @@ -1415,54 +1480,42 @@ sub process_changes { $settings =~ s/,$//; } $newvalues{$entry} = $settings; - } elsif ($entry eq 'extresource') { - if ($env{'form.'.$entry} =~ /^iframe|tab|window$/) { + } elsif ($action eq 'lti') { + if ($entry eq 'lti.override') { $newvalues{$entry} = $env{'form.'.$entry}; - if ($env{'form.'.$entry} ne 'iframe') { - if ($env{'form.extwintabreuse'}) { - $newvalues{$entry} .= ':1'; - } else { - $newvalues{$entry} .= ':0'; - } - if ($env{'form.'.$entry} eq 'window') { - foreach my $dim ('width','height') { - $env{'form.extreswin'.$dim} =~ s/^\s+|\s+$//g; - if ($env{'form.extreswin'.$dim} =~ /^\d+$/) { - $newvalues{$entry} .= ':'.$env{'form.extreswin'.$dim}; - } else { - $newvalues{$entry} .= ':'; + } elsif (($entry eq 'lti.topmenu') || ($entry eq 'lti.inlinemenu')) { + if ($env{'form.lti.override'}) { + $newvalues{$entry} = $env{'form.'.$entry}; + } else { + $newvalues{$entry} = ''; + } + } elsif ($entry eq 'lti.lcmenu') { + if (($env{'form.lti.override'}) && + (($env{'form.lti.topmenu'}) || ($env{'form.lti.inlinemenu'}))) { + my @lcmenu = &Apache::loncommon::get_env_multiple('form.lti.lcmenu'); + my @newlcmenu; + if (@lcmenu) { + my @menuitems = ('fullname','coursetitle','role','logout','grades'); + foreach my $item (@menuitems) { + next if (($item eq 'grades') && (!$newvalues{'lti.inlinemenu'})); + if (grep(/^\Q$item\E$/,@lcmenu)) { + push(@newlcmenu,$item); } } } - } - } - unless (($newvalues{$entry} eq 'iframe') && ($values->{$entry} eq '')) { - if ($newvalues{$entry} ne $values->{$entry}) { - $changes->{$entry} = $newvalues{$entry}; - } - } - } elsif ($entry eq 'timezone') { - if ($env{'form.'.$entry}) { - $newvalues{$entry} = $env{'form.'.$entry}; - if ($newvalues{$entry} ne $values->{$entry}) { - $changes->{$entry} = $newvalues{$entry}; - } - if ($env{'form.tzover'}) { - $newvalues{'tzover'} = $env{'form.tzover'}; - if ($newvalues{'tzover'} ne $values->{'tzover'}) { - $changes->{'tzover'} = $newvalues{'tzover'}; + if (@newlcmenu) { + $newvalues{$entry} = join(',',@newlcmenu); + } else { + $newvalues{$entry} = 'none'; } - } elsif ($values->{'tzover'}) { - $changes->{'tzover'} = ''; + } else { + $newvalues{$entry} = ''; } - } elsif ($values->{$entry}) { - $changes->{$entry} = ''; } } else { $newvalues{$entry} = $env{'form.'.$entry}; } - unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts') || - ($entry eq 'extresource') || ($entry eq 'timezone')) { + unless (($entry eq 'co-owners') || ($entry eq 'discussion_post_fonts')) { if ($newvalues{$entry} ne $values->{$entry}) { $changes->{$entry} = $newvalues{$entry}; } @@ -1475,257 +1528,23 @@ sub process_changes { return $errors; } -sub process_linkprot { - my ($cdom,$cnum,$values,$changes,$context,$lastactref) = @_; - my ($home,$dest,$ltiauth,$privkey,$privnum,$cipher,$errors,%linkprot); - if (ref($values) eq 'HASH') { - foreach my $id (keys(%{$values})) { - if ($id =~ /^\d+$/) { - unless (ref($values->{$id}) eq 'HASH') { - $linkprot{$id} = ''; - } - } - } - } - my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); - my @ids=&Apache::lonnet::current_machine_ids(); - if ($context eq 'domain') { - $home = &Apache::lonnet::domain($cdom,'primary'); - } else { - $home = &Apache::lonnet::homeserver($cnum,$cdom); - } - if ((($context eq 'domain') && ($domdefs{'linkprotenc_dom'})) || - (($context eq 'course') && ($domdefs{'linkprotenc_crs'}))) { - unless (($home eq 'no_host') || ($home eq '')) { - if (grep(/^\Q$home\E$/,@ids)) { - if (ref($domdefs{'privhosts'}) eq 'ARRAY') { - if (grep(/^\Q$home\E$/,@{$domdefs{'privhosts'}})) { - my %privhash = &Apache::lonnet::restore_dom('lti','private',$cdom,$home,1); - $privkey = $privhash{'key'}; - $privnum = $privhash{'version'}; - if (($privnum) && ($privkey ne '')) { - $cipher = Crypt::CBC->new({'key' => $privkey, - 'cipher' => 'DES'}); - } - } - } - } - } - } - if ($context eq 'domain') { - $dest = '/adm/domainprefs'; - $ltiauth = 1; - } else { - $dest = '/adm/courseprefs'; - if (exists($env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'})) { - $ltiauth = $env{'course.'.$env{'request.course.id'}.'.internal.ltiauth'}; - } else { - my %domdefs = &Apache::lonnet::get_domain_defaults($cdom); - $ltiauth = $domdefs{'crsltiauth'}; - } - } - my $switchserver = &check_switchserver($cdom,$cnum,$context,$dest); - my (@items,%deletions,%itemids,%haschanges); - if ($env{'form.linkprot_add'}) { - my $name = $env{'form.linkprot_name_add'}; - $name =~ s/(`)/'/g; - my ($newid,$error) = &get_linkprot_id($cdom,$cnum,$name,$context); - if ($newid) { - $itemids{'add'} = $newid; - push(@items,'add'); - $haschanges{$newid} = 1; - } else { - $errors .= ''. - &mt('Failed to acquire unique ID for link protection'). - ''; - } - } - if (ref($values) eq 'HASH') { - my @todelete = &Apache::loncommon::get_env_multiple('form.linkprot_del'); - my $maxnum = $env{'form.linkprot_maxnum'}; - for (my $i=0; $i<$maxnum; $i++) { - my $itemid = $env{'form.linkprot_id_'.$i}; - $itemid =~ s/\D+//g; - if ($itemid) { - if (ref($values->{$itemid}) eq 'HASH') { - push(@items,$i); - $itemids{$i} = $itemid; - if ((@todelete > 0) && (grep(/^$i$/,@todelete))) { - $deletions{$itemid} = $values->{$itemid}->{'name'}; - } - } - } - } - } - foreach my $idx (@items) { - my $itemid = $itemids{$idx}; - next unless ($itemid); - if (exists($deletions{$itemid})) { - $linkprot{$itemid} = $deletions{$itemid}; - $haschanges{$itemid} = 1; - next; - } - my %current; - if (ref($values) eq 'HASH') { - if (ref($values->{$itemid}) eq 'HASH') { - foreach my $key (keys(%{$values->{$itemid}})) { - $current{$key} = $values->{$itemid}->{$key}; - } - } - } - foreach my $inner ('name','lifetime','version') { - my $formitem = 'form.linkprot_'.$inner.'_'.$idx; - $env{$formitem} =~ s/(`)/'/g; - if ($inner eq 'lifetime') { - $env{$formitem} =~ s/[^\d.]//g; - } - unless ($idx eq 'add') { - if ($current{$inner} ne $env{$formitem}) { - $haschanges{$itemid} = 1; - } - } - if ($env{$formitem} ne '') { - $linkprot{$itemid}{$inner} = $env{$formitem}; - } - } - my $urlitem = 'form.linkprot_returnurl_'.$idx; - my $urlparamname = 'form.linkprot_urlparam_'.$idx; - if ($env{$urlitem} == 1) { - $env{$urlparamname} =~ s/(`)/'/g; - } elsif (exists($env{$urlparamname})) { - $env{$urlparamname} = ''; - } - unless ($idx eq 'add') { - if ((!$current{'returnurl'} && ($env{$urlparamname} ne '')) || - ($current{'returnurl'} && ($env{$urlparamname} eq ''))) { - $haschanges{$itemid} = 1; - } - } - if ($env{$urlparamname} ne '') { - $linkprot{$itemid}{'returnurl'} = $env{$urlparamname}; - } - if ($ltiauth) { - my $reqitem = 'form.linkprot_requser_'.$idx; - $env{$reqitem} =~ s/(`)/'/g; - unless ($idx eq 'add') { - if ((!$current{'requser'} && $env{$reqitem}) || - ($current{'requser'} && !$env{$reqitem})) { - $haschanges{$itemid} = 1; - } - } - if ($env{$reqitem} == 1) { - $linkprot{$itemid}{'requser'} = $env{$reqitem}; - foreach my $inner ('mapuser','notstudent') { - my $formitem = 'form.linkprot_'.$inner.'_'.$idx; - $env{$formitem} =~ s/(`)/'/g; - if ($inner eq 'mapuser') { - if ($env{$formitem} eq 'other') { - my $mapuser = $env{'form.linkprot_customuser_'.$idx}; - $mapuser =~ s/(`)/'/g; - $mapuser =~ s/^\s+|\s+$//g; - if ($mapuser ne '') { - $linkprot{$itemid}{$inner} = $mapuser; - } else { - delete($linkprot{$itemid}{'requser'}); - last; - } - } elsif ($env{$formitem} eq 'sourcedid') { - $linkprot{$itemid}{$inner} = 'lis_person_sourcedid'; - } elsif ($env{$formitem} eq 'email') { - $linkprot{$itemid}{$inner} = 'lis_person_contact_email_primary'; - } - } else { - $linkprot{$itemid}{$inner} = $env{$formitem}; - } - unless ($idx eq 'add') { - if ($current{$inner} ne $linkprot{$itemid}{$inner}) { - $haschanges{$itemid} = 1; - } - } - } - } - } - unless ($switchserver) { - my $keyitem = 'form.linkprot_key_'.$idx; - $env{$keyitem} =~ s/(`)/'/g; - unless ($idx eq 'add') { - if ($current{'key'} ne $env{$keyitem}) { - $haschanges{$itemid} = 1; - } - } - if ($env{$keyitem} ne '') { - $linkprot{$itemid}{'key'} = $env{$keyitem}; - } - my $secretitem = 'form.linkprot_secret_'.$idx; - $env{$secretitem} =~ s/(`)/'/g; - if ($current{'usable'}) { - if ($env{'form.linkprot_changesecret_'.$idx}) { - if ($env{$secretitem} ne '') { - if ($privnum && $cipher) { - $linkprot{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); - $linkprot{$itemid}{'cipher'} = $privnum; - } else { - $linkprot{$itemid}{'secret'} = $env{$secretitem}; - } - $haschanges{$itemid} = 1; - } - } else { - $linkprot{$itemid}{'secret'} = $current{'secret'}; - $linkprot{$itemid}{'cipher'} = $current{'cipher'}; - } - } elsif ($env{$secretitem} ne '') { - if ($privnum && $cipher) { - $linkprot{$itemid}{'secret'} = $cipher->encrypt_hex($env{$secretitem}); - $linkprot{$itemid}{'cipher'} = $privnum; - } else { - $linkprot{$itemid}{'secret'} = $env{$secretitem}; - } - $haschanges{$itemid} = 1; - } - } - } - if (keys(%haschanges)) { - foreach my $entry (keys(%haschanges)) { - $changes->{$entry} = $linkprot{$entry}; - } - if (ref($lastactref) eq 'HASH') { - $lastactref->{'courselti'} = 1; - } - } - return $errors; -} - -sub get_linkprot_id { - my ($cdom,$cnum,$name,$context) = @_; - # get lock on lti db in course or linkprot db in domain +sub get_courselti_id { + my ($cdom,$cnum,$name) = @_; + # get lock on lti db in course my $lockhash = { lock => $env{'user.name'}. ':'.$env{'user.domain'}, }; my $tries = 0; - my $gotlock; - if ($context eq 'domain') { - $gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom); - } else { - $gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); - } + my $gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); my ($id,$error); while (($gotlock ne 'ok') && ($tries<10)) { $tries ++; sleep (0.1); - if ($context eq 'domain') { - $gotlock = &Apache::lonnet::newput_dom('linkprot',$lockhash,$cdom); - } else { - $gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); - } + $gotlock = &Apache::lonnet::newput('lti',$lockhash,$cdom,$cnum); } if ($gotlock eq 'ok') { - my %currids; - if ($context eq 'domain') { - %currids = &Apache::lonnet::dump_dom('linkprot',$cdom); - } else { - %currids = &Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); - } + my %currids = &Apache::lonnet::dump('lti',$cdom,$cnum,undef,undef,undef,1); if ($currids{'lock'}) { delete($currids{'lock'}); if (keys(%currids)) { @@ -1739,25 +1558,14 @@ sub get_linkprot_id { $id = 1; } if ($id) { - if ($context eq 'domain') { - unless (&Apache::lonnet::newput_dom('linkprot',{ $id => $name },$cdom) eq 'ok') { - $error = 'nostore'; - } - } else { - unless (&Apache::lonnet::newput('lti',{ $id => $name },$cdom,$cnum) eq 'ok') { - $error = 'nostore'; - } + unless (&Apache::lonnet::newput('lti',{ $id => $name },$cdom,$cnum) eq 'ok') { + $error = 'nostore'; } } else { $error = 'nonumber'; } } - my $dellockoutcome; - if ($context eq 'domain') { - $dellockoutcome = &Apache::lonnet::del_dom('linkprot',['lock'],$cdom); - } else { - $dellockoutcome = &Apache::lonnet::del('lti',['lock'],$cdom,$cnum); - } + my $dellockoutcome = &Apache::lonnet::del('lti',['lock'],$cdom,$cnum); } else { $error = 'nolock'; } @@ -1808,10 +1616,10 @@ sub store_changes { my ($chome,$output); my (%storehash,@delkeys,@need_env_update,@oldcloner,%oldlinkprot); if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) { - if (ref($values->{'linkprot'}) eq 'HASH') { - %oldlinkprot = %{$values->{'linkprot'}}; + if (ref($values->{'linkprotection'}) eq 'HASH') { + %oldlinkprot = %{$values->{'linkprotection'}}; } - delete($values->{'linkprot'}); + delete($values->{'linkprotection'}); %storehash = %{$values}; } else { if ($crstype eq 'Community') { @@ -1824,7 +1632,7 @@ sub store_changes { my ($numchanges,$skipstore); if (ref($changes) eq 'HASH') { $numchanges = scalar(keys(%{$changes})); - if (($numchanges == 1) && (exists($changes->{'linkprot'}))) { + if (($numchanges == 1) && (exists($changes->{'linkprotection'}))) { $skipstore = 1; } elsif (!$numchanges) { if ($crstype eq 'Community') { @@ -1847,7 +1655,7 @@ sub store_changes { if (grep(/^\Q$item\E$/,@{$actions})) { $output .= '

'.&mt($prefs->{$item}{'text'}).'

'; if (ref($changes->{$item}) eq 'HASH') { - if (keys(%{$changes->{$item}}) > 0) { + if ((keys(%{$changes->{$item}}) > 0) || ($item eq 'linkprotection')) { $output .= &mt('Changes made:').'