--- loncom/interface/courseprefs.pm 2024/02/24 23:41:44 1.131 +++ loncom/interface/courseprefs.pm 2025/06/14 02:50:25 1.136 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.131 2024/02/24 23:41:44 raeburn Exp $ +# $Id: courseprefs.pm,v 1.136 2025/06/14 02:50:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1941,8 +1941,8 @@ sub get_credentials { my $privkey = $privhash{'key'}; $privnum = $privhash{'version'}; if (($privnum) && ($privkey ne '')) { - $cipher = Crypt::CBC->new({'key' => $privkey, - 'cipher' => 'DES'}); + $cipher = Crypt::CBC->new(-pass => $privkey, + -cipher => 'Crypt::DES'); } } } @@ -2026,10 +2026,24 @@ sub process_ltitools { } else { $ltitools{$newid}{'display'}{'target'} = 'iframe'; } - foreach my $item ('passback','roster') { + foreach my $item ('desturl','returnurl','passback','roster') { if ($env{'form.ltitools_'.$item.'_add'}) { $ltitools{$newid}{$item} = 1; - if ($env{'form.ltitools_'.$item.'valid_add'} ne '') { + if (($item eq 'returnurl') || ($item eq 'desturl')) { + if ($env{'form.ltitools_crs'.$item.'_add'}) { + $ltitools{$newid}{'crsconf'}{$item} = 1; + } + if ($item eq 'desturl') { + $env{'form.ltitools_defdest_add'} =~ s{^\s+|\s+$}{}g; + $env{'form.ltitools_defdelay_add'} =~ s{^\s+|\s+$}{}g; + if ($env{'form.ltitools_defdest_add'} ne '') { + $ltitools{$newid}{'defdest'} = $env{'form.ltitools_defdest_add'}; + if ($env{'form.ltitools_defdelay_add'} =~ /^(\d+\.?\d*)$/) { + $ltitools{$newid}{'defdelay'} = $1; + } + } + } + } elsif ($env{'form.ltitools_'.$item.'valid_add'} ne '') { my $lifetime = $env{'form.ltitools_'.$item.'valid_add'}; $lifetime =~ s/^\s+|\s+$//g; if ($lifetime =~ /^\d+\.?\d*$/) { @@ -2213,10 +2227,41 @@ sub process_ltitools { } else { $haschanges{$itemid} = 1; } - foreach my $extra ('passback','roster') { + foreach my $extra ('desturl','returnurl','passback','roster') { if ($env{'form.ltitools_'.$extra.'_'.$i}) { $ltitools{$itemid}{$extra} = 1; - if ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') { + if (($extra eq 'returnurl') || ($extra eq 'desturl')) { + if ($env{'form.ltitools_crs'.$extra.'_'.$i}) { + $ltitools{$itemid}{'crsconf'}{$extra} = 1; + if (ref($values->{$itemid}{'crsconf'}) eq 'HASH') { + if (!$values->{$itemid}{'crsconf'}{$extra}) { + $haschanges{$itemid} = 1; + } + } else { + $haschanges{$itemid} = 1; + } + } + if ($extra eq 'desturl') { + $env{'form.ltitools_defdest_'.$i} =~ s{^\s+|\s+$}{}g; + $env{'form.ltitools_defdelay_'.$i} =~ s{^\s+|\s+$}{}g; + if ($env{'form.ltitools_defdest_'.$i} =~ m{^(https?\://|/)}) { + $ltitools{$itemid}{'defdest'} = $env{'form.ltitools_defdest_'.$i}; + if ($values->{$itemid}{'defdest'} ne $ltitools{$itemid}{'defdest'}) { + $haschanges{$itemid} = 1; + } + } elsif ($values->{$itemid}{'defdest'} ne '') { + $haschanges{$itemid} = 1; + } + if ($env{'form.ltitools_defdelay_'.$i} =~ /^(\d+\.?\d*)$/) { + $ltitools{$itemid}{'defdelay'} = $1; + if ($values->{$itemid}{'defdelay'} ne $ltitools{$itemid}{'defdelay'}) { + $haschanges{$itemid} = 1; + } + } elsif ($values->{$itemid} =~ /^(\d+\.?\d*)$/) { + $haschanges{$itemid} = 1; + } + } + } elsif ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') { my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i}; $lifetime =~ s/^\s+|\s+$//g; if ($lifetime =~ /^\d+\.?\d*$/) { @@ -2735,14 +2780,14 @@ sub store_changes { $displayname = &mt('Recipients of '.$text.' questions'); } } elsif ($item eq 'discussion') { - if ($key =~ /^p(lc|ch)\.roles\.denied/) { + if ($key =~ /^p(lc|ch|ac)\.roles\.denied/) { $displayname = &mt("$text (role-based)"); if ($displayval ne '') { my @roles = split(',',$displayval); @roles = map { &Apache::lonnet::plaintext($_); } @roles; $displayval = join(', ',@roles); } - } elsif ($key =~ /^p(lc|ch)\.users\.denied/) { + } elsif ($key =~ /^p(lc|ch|ac)\.users\.denied/) { $displayname = &mt("$text (specific user(s))"); } else { if ($key eq 'allow_discussion_post_editing') { @@ -3341,11 +3386,39 @@ sub store_ltitools { $output .= ' '.&mt('None'); } $output .= ''; - foreach my $item ('passback','roster') { - $output .= '
  • '.$lt{$item}.' '; + foreach my $item ('desturl','returnurl','passback','roster') { + $output .= '
  • '.$lt{$item}; if ($changes->{$itemid}{$item}) { - $output .= &mt('Yes'); - if ($changes->{$itemid}{$item.'valid'}) { + if ($item eq 'desturl') { + $output .= ':'; + } + $output .= ' '.&mt('Yes'); + if (($item eq 'returnurl') || ($item eq 'desturl')) { + if (ref($changes->{$itemid}{'crsconf'}) eq 'HASH') { + $output .= ' ['.&mt('Configurable in course').': '; + if ($changes->{$itemid}{'crsconf'}{$item}) { + $output .= &mt('Yes'); + } else { + $output .= &mt('No'); + } + $output .= ' ]'; + } + if ($item eq 'desturl') { + $output .= '
  • '.&mt('Default destination').': '; + if ($changes->{$itemid}{'defdest'} ne '') { + $output .= $changes->{$itemid}{'defdest'}. + '
  • '.&mt('Default delay between login and redirect').': '; + if ($changes->{$itemid}{'defdelay'} ne '') { + $output .= $changes->{$itemid}{'defdelay'}.' s'; + } else { + $output .= &mt('None set'); + } + $output .= '
  • '; + } else { + $output .= &mt('None').''; + } + } + } elsif ($changes->{$itemid}{$item.'valid'}) { if ($item eq 'passback') { $output .= ' '.&mt('valid for at least [quant,_1,day] after launch', $changes->{$itemid}{$item.'valid'}); @@ -3354,10 +3427,12 @@ sub store_ltitools { $changes->{$itemid}{$item.'valid'}); } } + unless ($item eq 'desturl') { + $output .= ''; + } } else { - $output .= &mt('No'); + $output .= ' '.&mt('No').''; } - $output .= ''; } if (ref($changes->{$itemid}{'display'}) eq 'HASH') { my $displaylist; @@ -5298,8 +5373,7 @@ sub update_releasereq { } $modified_courses = []; } - undef($registered_cleanup); - return; + return OK; } sub show_autocoowners { @@ -6628,22 +6702,40 @@ sub print_ltitools { '
    '.$lt{'linktext'}.'
    '. '
    '. '
    '.$lt{'explanation'}.'
    '. - '

    '; my %units = ( 'passback' => 'days', 'roster' => 'seconds', ); - foreach my $extra ('passback','roster') { + my %courseconfig; + if (ref($settings->{$item}) eq 'HASH') { + if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') { + %courseconfig = %{$settings->{$item}->{'crsconf'}}; + } + } + foreach my $extra ('desturl','returnurl','passback','roster') { my $validsty = 'none'; my $currvalid; my $checkedon = ''; my $checkedoff = ' checked="checked"'; + my $crscheckedon = ''; + my $crscheckedoff = ' checked="checked"'; + my ($defdest,$defdelay); if ($settings->{$item}->{$extra}) { $checkedon = $checkedoff; $checkedoff = ''; $validsty = 'inline-block'; - if ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) { + if (($extra eq 'returnurl') || ($extra eq 'desturl')) { + if ($courseconfig{$extra}) { + $crscheckedon = ' checked="checked"'; + $crscheckedoff = ''; + } + if ($extra eq 'desturl') { + $defdest = $settings->{$item}->{'defdest'}; + $defdelay = $settings->{$item}->{'defdelay'}; + } + } elsif ($settings->{$item}->{$extra.'valid'} =~ /^\d+\.?\d*$/) { $currvalid = $settings->{$item}->{$extra.'valid'}; } } @@ -6652,12 +6744,30 @@ sub print_ltitools { ''.(' 'x2). ''. - '
    '. - ''. - &mt("until at least [_1] $units{$extra} after launch", - ''). - '
    '; + &mt('Yes').''; + if (($extra eq 'returnurl') || ($extra eq 'desturl')) { + $datatable .= '
    '. + ' -- '.&mt('configurable in course').': '. + ''.(' 'x2). + ''; + } else { + $datatable .= '
    '. + ''. + &mt("until at least [_1] $units{$extra} after launch", + ''); + } + $datatable .= '
    '; + if ($extra eq 'desturl') { + $datatable .= '
    '. + '

    '; + } } $datatable .= ''.$lt{'icon'}.': '; if ($imgsrc) { @@ -6743,14 +6853,8 @@ sub print_ltitools { } $datatable .= ''; } - $datatable .= ''; - my %courseconfig; - if (ref($settings->{$item}) eq 'HASH') { - if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') { - %courseconfig = %{$settings->{$item}->{'crsconf'}}; - } - } - $datatable .= '
    '; + $datatable .= '
    '."\n". + '
    '; if ($context eq 'domain') { $datatable .= &mt('Configurable in course'); } else { @@ -6777,14 +6881,14 @@ sub print_ltitools { ''.$key.''. ''; + ' value="'.$custom{$key}.'" size="35" />'; } } } $datatable .= ''. ''. - ''; + ''; $datatable .= '
    '."\n"; $itemcount ++; } @@ -6858,18 +6962,36 @@ sub print_ltitools { 'passback' => '7', 'roster' => '300', ); - foreach my $extra ('passback','roster') { + foreach my $extra ('desturl','returnurl','passback','roster') { my $onclick = ' onclick="toggleLTITools(this.form,'."'$extra','add'".');"'; $datatable .= '
    '.$lt{$extra}.' '. ''.(' 'x2).''. '
    '. - '
    '; + &mt('Yes').'
    '; + if (($extra eq 'returnurl') || ($extra eq 'desturl')) { + $datatable .= '