- '.&mt($item->{'header'}->[0]->{'col1'}).'
+ '.&mt($item->{'header'}->[0]->{'col1'}).'
'.&mt($item->{'header'}->[0]->{'col2'}).'
';
$rowtotal ++;
@@ -814,7 +794,7 @@ sub print_config_box {
- '.&mt($item->{'header'}->[2]->{'col1'}).'
+ '.&mt($item->{'header'}->[2]->{'col1'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
'."\n";
if ($action eq 'coursecategories') {
@@ -1002,8 +982,7 @@ sub print_config_box {
if ($action eq 'quotas') {
$output .= &print_quotas($dom,$settings,\$rowtotal,$action);
} elsif (($action eq 'autoenroll') || ($action eq 'autocreate') ||
- ($action eq 'serverstatuses') || ($action eq 'loadbalancing') ||
- ($action eq 'ltitools')) {
+ ($action eq 'serverstatuses') || ($action eq 'loadbalancing')) {
$output .= $item->{'print'}->($dom,$settings,\$rowtotal);
}
}
@@ -2519,74 +2498,6 @@ $jstext{'templates'};
ENDSCRIPT
}
-sub ltitools_javascript {
- my ($settings) = @_;
- return unless(ref($settings) eq 'HASH');
- my (%ordered,$total,%jstext);
- $total = 0;
- foreach my $item (keys(%{$settings})) {
- if (ref($settings->{$item}) eq 'HASH') {
- my $num = $settings->{$item}{'order'};
- $ordered{$num} = $item;
- }
- }
- $total = scalar(keys(%{$settings}));
- my @jsarray = ();
- foreach my $item (sort {$a <=> $b } (keys(%ordered))) {
- push(@jsarray,$ordered{$item});
- }
- my $jstext = ' var ltitools = Array('."'".join("','",@jsarray)."'".');'."\n";
- return <<"ENDSCRIPT";
-
-
-ENDSCRIPT
-}
-
sub print_autoenroll {
my ($dom,$settings,$rowtotal) = @_;
my $autorun = &Apache::lonnet::auto_run(undef,$dom),
@@ -3794,373 +3705,6 @@ sub radiobutton_prefs {
return ($datatable,$itemcount);
}
-sub print_ltitools {
- my ($dom,$settings,$rowtotal) = @_;
- my $rownum = 0;
- my $css_class;
- my $itemcount = 1;
- my $maxnum = 0;
- my %ordered;
- if (ref($settings) eq 'HASH') {
- foreach my $item (keys(%{$settings})) {
- if (ref($settings->{$item}) eq 'HASH') {
- my $num = $settings->{$item}{'order'};
- $ordered{$num} = $item;
- }
- }
- }
- my $confname = $dom.'-domainconfig';
- my $switchserver = &check_switchserver($dom,$confname);
- my $maxnum = scalar(keys(%ordered));
- my $datatable = <itools_javascript($settings);
- my %lt = <itools_names();
- my @courseroles = ('cc','in','ta','ep','st');
- my @ltiroles = qw(Instructor ContentDeveloper TeachingAssistant Learner);
- my @fields = ('fullname','firstname','lastname','email','user','roles');
- if (keys(%ordered)) {
- my @items = sort { $a <=> $b } keys(%ordered);
- for (my $i=0; $i<@items; $i++) {
- $css_class = $itemcount%2?' class="LC_odd_row"':'';
- my $item = $ordered{$items[$i]};
- my ($title,$key,$secret,$url,$imgsrc,$version);
- if (ref($settings->{$item}) eq 'HASH') {
- $title = $settings->{$item}->{'title'};
- $url = $settings->{$item}->{'url'};
- $key = $settings->{$item}->{'key'};
- $secret = $settings->{$item}->{'secret'};
- my $image = $settings->{$item}->{'image'};
- if ($image ne '') {
- $imgsrc = ' ';
- }
- }
- my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'ltitools_".$item."'".');"';
- $datatable .= ''
- .'';
- for (my $k=0; $k<=$maxnum; $k++) {
- my $vpos = $k+1;
- my $selstr;
- if ($k == $i) {
- $selstr = ' selected="selected" ';
- }
- $datatable .= ''.$vpos.' ';
- }
- $datatable .= ' '.(' 'x2).
- ' '.
- &mt('Delete?').' '.
- ''.
- ''.&mt('Required settings').' '.
- ''.$lt{'title'}.': '.
- (' 'x2).
- ''.$lt{'version'}.':'.
- '1.1 '.
- (' 'x2).
- ''.$lt{'msgtype'}.':'.
- 'Launch '.
- ' '.
- ''.$lt{'url'}.': '.
- (' 'x2).
- ''.$lt{'key'}.
- ' '.
- (' 'x2).
- ''.$lt{'secret'}.':'.
- ' '.
- ' '.&mt('Visible input').' '.
- ' '.
- ' '.
- ''.&mt('Optional settings').' '.
- ''.&mt('Display target:');
- my %currdisp;
- if (ref($settings->{$item}->{'display'}) eq 'HASH') {
- if ($settings->{$item}->{'display'}->{'target'} eq 'window') {
- $currdisp{'window'} = ' checked="checked"';
- } elsif ($settings->{$item}->{'display'}->{'target'} eq 'tab') {
- $currdisp{'tab'} = ' checked="checked"';
- } else {
- $currdisp{'iframe'} = ' checked="checked"';
- }
- if ($settings->{$item}->{'display'}->{'width'} =~ /^(\d+)$/) {
- $currdisp{'width'} = $1;
- }
- if ($settings->{$item}->{'display'}->{'height'} =~ /^(\d+)$/) {
- $currdisp{'height'} = $1;
- }
- $currdisp{'linktext'} = $settings->{$item}->{'display'}->{'linktext'};
- $currdisp{'explanation'} = $settings->{$item}->{'display'}->{'explanation'};
- } else {
- $currdisp{'iframe'} = ' checked="checked"';
- }
- foreach my $disp ('iframe','tab','window') {
- $datatable .= ' '.
- $lt{$disp}.' '.(' 'x2);
- }
- $datatable .= (' 'x4);
- foreach my $dimen ('width','height') {
- $datatable .= ''.$lt{$dimen}.' '.
- ' '.
- (' 'x2);
- }
- $datatable .= ' '.
- ''.$lt{'linktext'}.' '.
- '
'.
- ''.$lt{'explanation'}.' '.
- '
';
- $datatable .= ' ';
- foreach my $extra ('passback','roster') {
- my $checkedon = '';
- my $checkedoff = ' checked="checked"';
- if ($settings->{$item}->{$extra}) {
- $checkedon = $checkedoff;
- $checkedoff = '';
- }
- $datatable .= $lt{$extra}.' '.
- ' '.
- &mt('Yes').' '.(' 'x2).
- ' '.
- &mt('No').' '.(' 'x4);
- }
- $datatable .= ''.$lt{'icon'}.': ';
- if ($imgsrc) {
- $datatable .= $imgsrc.
- ' '.&mt('Delete?').' '.
- ' '.&mt('Replace:').' ';
- } else {
- $datatable .= '('.&mt('if larger than 21x21 pixels, image will be scaled').') ';
- }
- if ($switchserver) {
- $datatable .= &mt('Upload to library server: [_1]',$switchserver);
- } else {
- $datatable .= ' ';
- }
- $datatable .= ' ';
- my (%checkedfields,%rolemaps);
- if (ref($settings->{$item}) eq 'HASH') {
- if (ref($settings->{$item}->{'fields'}) eq 'HASH') {
- %checkedfields = %{$settings->{$item}->{'fields'}};
- }
- if (ref($settings->{$item}->{'roles'}) eq 'HASH') {
- %rolemaps = %{$settings->{$item}->{'roles'}};
- $checkedfields{'roles'} = 1;
- }
- }
- $datatable .= ''.&mt('User data sent on launch').' '.
- '';
- foreach my $field (@fields) {
- my $checked;
- if ($checkedfields{$field}) {
- $checked = ' checked="checked"';
- }
- $datatable .= ''.
- ' '.
- $lt{$field}.' '.(' ' x2);
- }
- $datatable .= ' '.
- ''.&mt('Role mapping').' ';
- foreach my $role (@courseroles) {
- my ($selected,$selectnone);
- if (!$rolemaps{$role}) {
- $selectnone = ' selected="selected"';
- }
- $datatable .= ''.
- &Apache::lonnet::plaintext($role,'Course').' '.
- ''.
- ''.&mt('Select').' ';
- foreach my $ltirole (@ltiroles) {
- unless ($selectnone) {
- if ($rolemaps{$role} eq $ltirole) {
- $selected = ' selected="selected"';
- } else {
- $selected = '';
- }
- }
- $datatable .= ''.$ltirole.' ';
- }
- $datatable .= ' ';
- }
- $datatable .= '
';
- my %courseconfig;
- if (ref($settings->{$item}) eq 'HASH') {
- if (ref($settings->{$item}->{'crsconf'}) eq 'HASH') {
- %courseconfig = %{$settings->{$item}->{'crsconf'}};
- }
- }
- $datatable .= ''.&mt('Configurable in course').' ';
- foreach my $item ('label','title','target','linktext','explanation') {
- my $checked;
- if ($courseconfig{$item}) {
- $checked = ' checked="checked"';
- }
- $datatable .= ''.
- ' '.
- $lt{'crs'.$item}.' '.(' ' x2)."\n";
- }
- $datatable .= ' '.
- ''.&mt('Custom items sent on launch').' '.
- ' '."\n";
- $itemcount ++;
- }
- }
- $css_class = $itemcount%2?' class="LC_odd_row"':'';
- my $chgstr = ' onchange="javascript:reorderLTI(this.form,'."'ltitools_add_pos'".');"';
- $datatable .= ''."\n".
- ' '."\n".
- '';
- for (my $k=0; $k<$maxnum+1; $k++) {
- my $vpos = $k+1;
- my $selstr;
- if ($k == $maxnum) {
- $selstr = ' selected="selected" ';
- }
- $datatable .= ''.$vpos.' ';
- }
- $datatable .= ' '."\n".
- ' '.&mt('Add').' '."\n".
- ''.
- ''.&mt('Required settings').' '.
- ''.$lt{'title'}.': '."\n".
- (' 'x2).
- ''.$lt{'version'}.':'.
- '1.1 '."\n".
- (' 'x2).
- ''.$lt{'msgtype'}.':'.
- 'Launch '.
- ' '.
- ''.$lt{'url'}.': '."\n".
- (' 'x2).
- ''.$lt{'key'}.': '."\n".
- (' 'x2).
- ''.$lt{'secret'}.': '.
- ' '.&mt('Visible input').' '."\n".
- ' '.
- ''.&mt('Optional settings').' '.
- ''.&mt('Display target:');
- my %defaultdisp;
- $defaultdisp{'iframe'} = ' checked="checked"';
- foreach my $disp ('iframe','tab','window') {
- $datatable .= ' '.
- $lt{$disp}.' '.(' 'x2);
- }
- $datatable .= (' 'x4);
- foreach my $dimen ('width','height') {
- $datatable .= ''.$lt{$dimen}.' '.
- ' '.
- (' 'x2);
- }
- $datatable .= ' '.
- ''.$lt{'linktext'}.' '.
- '
'.
- ''.$lt{'explanation'}.' '.
- ''.
- '
';
- foreach my $extra ('passback','roster') {
- $datatable .= $lt{$extra}.' '.
- ' '.
- &mt('Yes').' '.(' 'x2).
- ' '.
- &mt('No').' '.(' 'x4);
- }
- $datatable .= ''.$lt{'icon'}.': '.
- '('.&mt('if larger than 21x21 pixels, image will be scaled').') ';
- if ($switchserver) {
- $datatable .= &mt('Upload to library server: [_1]',$switchserver);
- } else {
- $datatable .= ' ';
- }
- $datatable .= ' '.
- ''.&mt('User data sent on launch').' '.
- '';
- foreach my $field (@fields) {
- $datatable .= ''.
- ' '.
- $lt{$field}.' '.(' ' x2);
- }
- $datatable .= ' '.
- ''.&mt('Role mapping').' ';
- foreach my $role (@courseroles) {
- my ($checked,$checkednone);
- $datatable .= ''.
- &Apache::lonnet::plaintext($role,'Course').' '.
- ''.
- ''.&mt('Select').' ';
- foreach my $ltirole (@ltiroles) {
- $datatable .= ''.$ltirole.' ';
- }
- $datatable .= ' ';
- }
- $datatable .= '
'.
- ''.&mt('Configurable in course').' ';
- foreach my $item ('label','title','target','linktext','explanation') {
- $datatable .= ''.
- ' '.
- $lt{'crs'.$item}.' '.(' ' x2)."\n";
- }
- $datatable .= ' '.
- ''.&mt('Custom items sent on launch').' '.
- ' '."\n".
- ''."\n".
- ''."\n";
- $itemcount ++;
- return $datatable;
-}
-
-sub ltitools_names {
- my %lt = &Apache::lonlocal::texthash(
- 'title' => 'Title',
- 'version' => 'Version',
- 'msgtype' => 'Message Type',
- 'url' => 'URL',
- 'key' => 'Key',
- 'secret' => 'Secret',
- 'icon' => 'Icon',
- 'user' => 'Username:domain',
- 'fullname' => 'Full Name',
- 'firstname' => 'First Name',
- 'lastname' => 'Last Name',
- 'email' => 'E-mail',
- 'roles' => 'Role',
- 'window' => 'Window',
- 'tab' => 'Tab',
- 'iframe' => 'iFrame',
- 'height' => 'Height',
- 'width' => 'Width',
- 'linktext' => 'Default Link Text',
- 'explanation' => 'Default Explanation',
- 'passback' => 'Tool can return grades:',
- 'roster' => 'Tool can retrieve roster:',
- 'crstarget' => 'Display target',
- 'crslabel' => 'Course label',
- 'crstitle' => 'Course title',
- 'crslinktext' => 'Link Text',
- 'crsexplanation' => 'Explanation',
- );
-
- return %lt;
-}
-
sub print_coursedefaults {
my ($position,$dom,$settings,$rowtotal) = @_;
my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles);
@@ -4759,7 +4303,7 @@ sub print_passwords {
$datatable .= ''.
' '.$usertypes->{$item}.' '.
- ' ';
+ ' ';
}
}
my $checkedcase;
@@ -4863,7 +4407,7 @@ sub print_passwords {
&mt('(If you use the same account ... reset a password from this page.)').' '.
&mt('Include custom text:');
if ($customurl) {
- my $link = &Apache::loncommon::modal_link($customurl,&mt('Custom text file'),600,500,
+ my $link = &Apache::loncommon::modal_link($customurl,&mt('custom text'),600,500,
undef,undef,undef,undef,'background-color:#ffffff');
$datatable .= ' '.$link.
' '.$usertypes->{$type}.' '.
- ' ';
+ ' ';
}
}
my $checked;
@@ -7830,8 +7374,8 @@ function warnIntPass(field) {
alert('$intalert{passnum}');
}
}
+ field.value = '';
}
- field.value = '';
}
}
}
@@ -7984,7 +7528,7 @@ sub initialize_categories {
.'1 '
.'2 '
.'3 '
- .&mt('Add category').' >'.&mt('Name:')
+ .&mt('Add category').''.&mt('Name:')
.' '
.' ';
return $datatable;
@@ -10339,590 +9883,6 @@ sub process_textbook_image {
return ($url,$error);
}
-sub modify_ltitools {
- my ($r,$dom,$action,$lastactref,%domconfig) = @_;
- my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
- my ($newid,@allpos,%changes,%confhash,%encconfig,$errors,$resulttext);
- my $confname = $dom.'-domainconfig';
- my $servadm = $r->dir_config('lonAdmEMail');
- my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);
- my (%posslti,%possfield);
- my @courseroles = ('cc','in','ta','ep','st');
- my @ltiroles = qw(Instructor ContentDeveloper TeachingAssistant Learner);
- map { $posslti{$_} = 1; } @ltiroles;
- my @allfields = ('fullname','firstname','lastname','email','user','roles');
- map { $possfield{$_} = 1; } @allfields;
- my %lt = <itools_names();
- if ($env{'form.ltitools_add'}) {
- my $title = $env{'form.ltitools_add_title'};
- $title =~ s/(`)/'/g;
- ($newid,my $error) = &get_ltitools_id($dom,$title);
- if ($newid) {
- my $position = $env{'form.ltitools_add_pos'};
- $position =~ s/\D+//g;
- if ($position ne '') {
- $allpos[$position] = $newid;
- }
- $changes{$newid} = 1;
- foreach my $item ('title','url','key','secret') {
- $env{'form.ltitools_add_'.$item} =~ s/(`)/'/g;
- if ($env{'form.ltitools_add_'.$item}) {
- if (($item eq 'key') || ($item eq 'secret')) {
- $encconfig{$newid}{$item} = $env{'form.ltitools_add_'.$item};
- } else {
- $confhash{$newid}{$item} = $env{'form.ltitools_add_'.$item};
- }
- }
- }
- if ($env{'form.ltitools_add_version'} eq 'LTI-1p0') {
- $confhash{$newid}{'version'} = $env{'form.ltitools_add_version'};
- }
- if ($env{'form.ltitools_add_msgtype'} eq 'basic-lti-launch-request') {
- $confhash{$newid}{'msgtype'} = $env{'form.ltitools_add_msgtype'};
- }
- foreach my $item ('width','height','linktext','explanation') {
- $env{'form.ltitools_add_'.$item} =~ s/^\s+//;
- $env{'form.ltitools_add_'.$item} =~ s/\s+$//;
- if (($item eq 'width') || ($item eq 'height')) {
- if ($env{'form.ltitools_add_'.$item} =~ /^\d+$/) {
- $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item};
- }
- } else {
- if ($env{'form.ltitools_add_'.$item} ne '') {
- $confhash{$newid}{'display'}{$item} = $env{'form.ltitools_add_'.$item};
- }
- }
- }
- if ($env{'form.ltitools_add_target'} eq 'window') {
- $confhash{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'};
- } elsif ($env{'form.ltitools_add_target'} eq 'tab') {
- $confhash{$newid}{'display'}{'target'} = $env{'form.ltitools_add_target'};
- } else {
- $confhash{$newid}{'display'}{'target'} = 'iframe';
- }
- foreach my $item ('passback','roster') {
- if ($env{'form.ltitools_add_'.$item}) {
- $confhash{$newid}{$item} = 1;
- }
- }
- if ($env{'form.ltitools_add_image.filename'} ne '') {
- my ($imageurl,$error) =
- &process_ltitools_image($r,$dom,$confname,'ltitools_add_image',$newid,
- $configuserok,$switchserver,$author_ok);
- if ($imageurl) {
- $confhash{$newid}{'image'} = $imageurl;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.' ';
- }
- }
- my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_add_fields');
- foreach my $field (@fields) {
- if ($possfield{$field}) {
- if ($field eq 'roles') {
- foreach my $role (@courseroles) {
- my $choice = $env{'form.ltitools_add_roles_'.$role};
- if (($choice ne '') && ($posslti{$choice})) {
- $confhash{$newid}{'roles'}{$role} = $choice;
- if ($role eq 'cc') {
- $confhash{$newid}{'roles'}{'co'} = $choice;
- }
- }
- }
- } else {
- $confhash{$newid}{'fields'}{$field} = 1;
- }
- }
- }
- my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig');
- foreach my $item (@courseconfig) {
- $confhash{$newid}{'crsconf'}{$item} = 1;
- }
- if ($env{'form.ltitools_add_custom'}) {
- my $name = $env{'form.ltitools_add_custom_name'};
- my $value = $env{'form.ltitools_add_custom_value'};
- $value =~ s/(`)/'/g;
- $name =~ s/(`)/'/g;
- $confhash{$newid}{'custom'}{$name} = $value;
- }
- } else {
- my $error = &mt('Failed to acquire unique ID for new external tool');
- $errors .= ''.$error.' ';
- }
- }
- if (ref($domconfig{$action}) eq 'HASH') {
- my %deletions;
- my @todelete = &Apache::loncommon::get_env_multiple('form.ltitools_del');
- if (@todelete) {
- map { $deletions{$_} = 1; } @todelete;
- }
- my %customadds;
- my @newcustom = &Apache::loncommon::get_env_multiple('form.ltitools_customadd');
- if (@newcustom) {
- map { $customadds{$_} = 1; } @newcustom;
- }
- my %imgdeletions;
- my @todeleteimages = &Apache::loncommon::get_env_multiple('form.ltitools_image_del');
- if (@todeleteimages) {
- map { $imgdeletions{$_} = 1; } @todeleteimages;
- }
- my $maxnum = $env{'form.ltitools_maxnum'};
- for (my $i=0; $i<=$maxnum; $i++) {
- my $itemid = $env{'form.ltitools_id_'.$i};
- $itemid =~ s/\D+//g;
- if (ref($domconfig{$action}{$itemid}) eq 'HASH') {
- if ($deletions{$itemid}) {
- if ($domconfig{$action}{$itemid}{'image'}) {
- #FIXME need to obsolete item in RES space
- }
- $changes{$itemid} = $domconfig{$action}{$itemid}{'title'};
- next;
- } else {
- my $newpos = $env{'form.ltitools_'.$itemid};
- $newpos =~ s/\D+//g;
- foreach my $item ('title','url') {
- $confhash{$itemid}{$item} = $env{'form.ltitools_'.$item.'_'.$i};
- if ($domconfig{$action}{$itemid}{$item} ne $confhash{$itemid}{$item}) {
- $changes{$itemid} = 1;
- }
- }
- foreach my $item ('key','secret') {
- $encconfig{$itemid}{$item} = $env{'form.ltitools_'.$item.'_'.$i};
- if ($domconfig{$action}{$itemid}{$item} ne $encconfig{$itemid}{$item}) {
- $changes{$itemid} = 1;
- }
- }
- if ($env{'form.ltitools_version_'.$i} eq 'LTI-1p0') {
- $confhash{$itemid}{'version'} = $env{'form.ltitools_version_'.$i};
- }
- if ($env{'form.ltitools_msgtype_'.$i} eq 'basic-lti-launch-request') {
- $confhash{$itemid}{'msgtype'} = $env{'form.ltitools_msgtype_'.$i};
- }
- foreach my $size ('width','height') {
- $env{'form.ltitools_'.$size.'_'.$i} =~ s/^\s+//;
- $env{'form.ltitools_'.$size.'_'.$i} =~ s/\s+$//;
- if ($env{'form.ltitools_'.$size.'_'.$i} =~ /^\d+$/) {
- $confhash{$itemid}{'display'}{$size} = $env{'form.ltitools_'.$size.'_'.$i};
- if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'display'}{$size} ne $confhash{$itemid}{'display'}{$size}) {
- $changes{$itemid} = 1;
- }
- } else {
- $changes{$itemid} = 1;
- }
- } elsif (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'display'}{$size} ne '') {
- $changes{$itemid} = 1;
- }
- }
- }
- foreach my $item ('linktext','explanation') {
- $env{'form.ltitools_'.$item.'_'.$i} =~ s/^\s+//;
- $env{'form.ltitools_'.$item.'_'.$i} =~ s/\s+$//;
- if ($env{'form.ltitools_'.$item.'_'.$i} ne '') {
- $confhash{$itemid}{'display'}{$item} = $env{'form.ltitools_'.$item.'_'.$i};
- if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'display'}{$item} ne $confhash{$itemid}{'display'}{$item}) {
- $changes{$itemid} = 1;
- }
- } else {
- $changes{$itemid} = 1;
- }
- } elsif (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'display'}{$item} ne '') {
- $changes{$itemid} = 1;
- }
- }
- }
- if ($env{'form.ltitools_target_'.$i} eq 'window') {
- $confhash{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i};
- } elsif ($env{'form.ltitools_target_'.$i} eq 'tab') {
- $confhash{$itemid}{'display'}{'target'} = $env{'form.ltitools_target_'.$i};
- } else {
- $confhash{$itemid}{'display'}{'target'} = 'iframe';
- }
- if (ref($domconfig{$action}{$itemid}{'display'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'display'}{'target'} ne $confhash{$itemid}{'display'}{'target'}) {
- $changes{$itemid} = 1;
- }
- } else {
- $changes{$itemid} = 1;
- }
- foreach my $extra ('passback','roster') {
- if ($env{'form.ltitools_'.$extra.'_'.$i}) {
- $confhash{$itemid}{$extra} = 1;
- }
- if ($domconfig{$action}{$itemid}{$extra} ne $confhash{$itemid}{$extra}) {
- $changes{$itemid} = 1;
- }
- }
- my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i);
- foreach my $item ('label','title','target','linktext','explanation') {
- if (grep(/^\Q$item\E$/,@courseconfig)) {
- $confhash{$itemid}{'crsconf'}{$item} = 1;
- if (ref($domconfig{$action}{$itemid}{'crsconf'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'crsconf'}{$item} ne $confhash{$itemid}{'crsconf'}{$item}) {
- $changes{$itemid} = 1;
- }
- } else {
- $changes{$itemid} = 1;
- }
- }
- }
- my @fields = &Apache::loncommon::get_env_multiple('form.ltitools_fields_'.$i);
- foreach my $field (@fields) {
- if ($possfield{$field}) {
- if ($field eq 'roles') {
- foreach my $role (@courseroles) {
- my $choice = $env{'form.ltitools_roles_'.$role.'_'.$i};
- if (($choice ne '') && ($posslti{$choice})) {
- $confhash{$itemid}{'roles'}{$role} = $choice;
- if ($role eq 'cc') {
- $confhash{$itemid}{'roles'}{'co'} = $choice;
- }
- }
- if (ref($domconfig{$action}{$itemid}{'roles'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'roles'}{$role} ne $confhash{$itemid}{'roles'}{$role}) {
- $changes{$itemid} = 1;
- }
- } elsif ($confhash{$itemid}{'roles'}{$role}) {
- $changes{$itemid} = 1;
- }
- }
- } else {
- $confhash{$itemid}{'fields'}{$field} = 1;
- if (ref($domconfig{$action}{$itemid}{'fields'}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'fields'}{$field} ne $confhash{$itemid}{'fields'}{$field}) {
- $changes{$itemid} = 1;
- }
- } else {
- $changes{$itemid} = 1;
- }
- }
- }
- }
- $allpos[$newpos] = $itemid;
- }
- if ($imgdeletions{$itemid}) {
- $changes{$itemid} = 1;
- #FIXME need to obsolete item in RES space
- } elsif ($env{'form.ltitools_image_'.$i.'.filename'}) {
- my ($imgurl,$error) = &process_ltitools_image($r,$dom,$confname,'ltitools_image_'.$i,
- $itemid,$configuserok,$switchserver,
- $author_ok);
- if ($imgurl) {
- $confhash{$itemid}{'image'} = $imgurl;
- $changes{$itemid} = 1;
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.' ';
- }
- } elsif ($domconfig{$action}{$itemid}{'image'}) {
- $confhash{$itemid}{'image'} =
- $domconfig{$action}{$itemid}{'image'};
- }
- if ($customadds{$i}) {
- my $name = $env{'form.ltitools_custom_name_'.$i};
- $name =~ s/(`)/'/g;
- $name =~ s/^\s+//;
- $name =~ s/\s+$//;
- my $value = $env{'form.ltitools_custom_value_'.$i};
- $value =~ s/(`)/'/g;
- $value =~ s/^\s+//;
- $value =~ s/\s+$//;
- if ($name ne '') {
- $confhash{$itemid}{'custom'}{$name} = $value;
- $changes{$itemid} = 1;
- }
- }
- my %customdels;
- my @customdeletions = &Apache::loncommon::get_env_multiple('form.ltitools_customdel_'.$i);
- if (@customdeletions) {
- $changes{$itemid} = 1;
- }
- map { $customdels{$_} = 1; } @customdeletions;
- if (ref($domconfig{$action}{$itemid}{'custom'}) eq 'HASH') {
- foreach my $key (keys(%{$domconfig{$action}{$itemid}{'custom'}})) {
- unless ($customdels{$key}) {
- if ($env{'form.ltitools_customval_'.$key.'_'.$i} ne '') {
- $confhash{$itemid}{'custom'}{$key} = $env{'form.ltitools_customval_'.$key.'_'.$i};
- }
- if ($domconfig{$action}{$itemid}{'custom'}{$key} ne $env{'form.ltitools_customval_'.$key.'_'.$i}) {
- $changes{$itemid} = 1;
- }
- }
- }
- }
- unless ($changes{$itemid}) {
- foreach my $key (keys(%{$domconfig{$action}{$itemid}})) {
- if (ref($domconfig{$action}{$itemid}{$key}) eq 'HASH') {
- if (ref($confhash{$itemid}{$key}) eq 'HASH') {
- foreach my $innerkey (keys(%{$domconfig{$action}{$itemid}{$key}})) {
- unless (exists($confhash{$itemid}{$key}{$innerkey})) {
- $changes{$itemid} = 1;
- last;
- }
- }
- } elsif (keys(%{$domconfig{$action}{$itemid}{$key}}) > 0) {
- $changes{$itemid} = 1;
- }
- }
- last if ($changes{$itemid});
- }
- }
- }
- }
- }
- if (@allpos > 0) {
- my $idx = 0;
- foreach my $itemid (@allpos) {
- if ($itemid ne '') {
- $confhash{$itemid}{'order'} = $idx;
- if (ref($domconfig{$action}) eq 'HASH') {
- if (ref($domconfig{$action}{$itemid}) eq 'HASH') {
- if ($domconfig{$action}{$itemid}{'order'} ne $idx) {
- $changes{$itemid} = 1;
- }
- }
- }
- $idx ++;
- }
- }
- }
- my %ltitoolshash = (
- $action => { %confhash }
- );
- my $putresult = &Apache::lonnet::put_dom('configuration',\%ltitoolshash,
- $dom);
- if ($putresult eq 'ok') {
- my %ltienchash = (
- $action => { %encconfig }
- );
- &Apache::lonnet::put_dom('encconfig',\%ltienchash,$dom);
- if (keys(%changes) > 0) {
- my $cachetime = 24*60*60;
- my %ltiall = %confhash;
- foreach my $id (keys(%ltiall)) {
- if (ref($encconfig{$id}) eq 'HASH') {
- foreach my $item ('key','secret') {
- $ltiall{$id}{$item} = $encconfig{$id}{$item};
- }
- }
- }
- &Apache::lonnet::do_cache_new('ltitools',$dom,\%ltiall,$cachetime);
- if (ref($lastactref) eq 'HASH') {
- $lastactref->{'ltitools'} = 1;
- }
- $resulttext = &mt('Changes made:').'';
- my %bynum;
- foreach my $itemid (sort(keys(%changes))) {
- my $position = $confhash{$itemid}{'order'};
- $bynum{$position} = $itemid;
- }
- foreach my $pos (sort { $a <=> $b } keys(%bynum)) {
- my $itemid = $bynum{$pos};
- if (ref($confhash{$itemid}) ne 'HASH') {
- $resulttext .= ''.&mt('Deleted: [_1]',$changes{$itemid}).' ';
- } else {
- $resulttext .= ''.$confhash{$itemid}{'title'}.' ';
- if ($confhash{$itemid}{'image'}) {
- $resulttext .= ' '.
- ' ';
- }
- $resulttext .= '';
- my $position = $pos + 1;
- $resulttext .= ''.&mt('Order: [_1]',$position).' ';
- foreach my $item ('version','msgtype','url') {
- if ($confhash{$itemid}{$item} ne '') {
- $resulttext .= ''.$lt{$item}.': '.$confhash{$itemid}{$item}.' ';
- }
- }
- if ($encconfig{$itemid}{'key'} ne '') {
- $resulttext .= ''.$lt{'key'}.': '.$encconfig{$itemid}{'key'}.' ';
- }
- if ($encconfig{$itemid}{'secret'} ne '') {
- $resulttext .= ''.$lt{'secret'}.': ';
- my $num = length($encconfig{$itemid}{'secret'});
- $resulttext .= ('*'x$num).' ';
- }
- $resulttext .= ''.&mt('Configurable in course:');
- my @possconfig = ('label','title','target','linktext','explanation');
- my $numconfig = 0;
- if (ref($confhash{$itemid}{'crsconf'}) eq 'HASH') {
- foreach my $item (@possconfig) {
- if ($confhash{$itemid}{'crsconf'}{$item}) {
- $numconfig ++;
- $resulttext .= ' "'.$lt{'crs'.$item}.'"';
- }
- }
- }
- if (!$numconfig) {
- $resulttext .= &mt('None');
- }
- $resulttext .= ' ';
- foreach my $item ('passback','roster') {
- $resulttext .= ''.$lt{$item}.' ';
- if ($confhash{$itemid}{$item}) {
- $resulttext .= &mt('Yes');
- } else {
- $resulttext .= &mt('No');
- }
- $resulttext .= ' ';
- }
- if (ref($confhash{$itemid}{'display'}) eq 'HASH') {
- my $displaylist;
- if ($confhash{$itemid}{'display'}{'target'}) {
- $displaylist = &mt('Display target').': '.
- $confhash{$itemid}{'display'}{'target'}.',';
- }
- foreach my $size ('width','height') {
- if ($confhash{$itemid}{'display'}{$size}) {
- $displaylist .= (' 'x2).$lt{$size}.': '.
- $confhash{$itemid}{'display'}{$size}.',';
- }
- }
- if ($displaylist) {
- $displaylist =~ s/,$//;
- $resulttext .= ''.$displaylist.' ';
- }
- foreach my $item ('linktext','explanation') {
- if ($confhash{$itemid}{'display'}{$item}) {
- $resulttext .= ''.$lt{$item}.': '.$confhash{$itemid}{'display'}{$item}.' ';
- }
- }
- }
- if (ref($confhash{$itemid}{'fields'}) eq 'HASH') {
- my $fieldlist;
- foreach my $field (@allfields) {
- if ($confhash{$itemid}{'fields'}{$field}) {
- $fieldlist .= (' 'x2).$lt{$field}.',';
- }
- }
- if ($fieldlist) {
- $fieldlist =~ s/,$//;
- $resulttext .= ''.&mt('Data sent').':'.$fieldlist.' ';
- }
- }
- if (ref($confhash{$itemid}{'roles'}) eq 'HASH') {
- my $rolemaps;
- foreach my $role (@courseroles) {
- if ($confhash{$itemid}{'roles'}{$role}) {
- $rolemaps .= (' 'x2).&Apache::lonnet::plaintext($role,'Course').'='.
- $confhash{$itemid}{'roles'}{$role}.',';
- }
- }
- if ($rolemaps) {
- $rolemaps =~ s/,$//;
- $resulttext .= ''.&mt('Role mapping:').$rolemaps.' ';
- }
- }
- if (ref($confhash{$itemid}{'custom'}) eq 'HASH') {
- my $customlist;
- if (keys(%{$confhash{$itemid}{'custom'}})) {
- foreach my $key (sort(keys(%{$confhash{$itemid}{'custom'}}))) {
- $customlist .= $key.':'.$confhash{$itemid}{'custom'}{$key}.(' 'x2);
- }
- }
- if ($customlist) {
- $resulttext .= ''.&mt('Custom items').':'.$customlist.' ';
- }
- }
- $resulttext .= ' ';
- }
- }
- $resulttext .= ' ';
- } else {
- $resulttext = &mt('No changes made.');
- }
- } else {
- $errors .= ''.&mt('Failed to save changes').' ';
- }
- if ($errors) {
- $resulttext .= &mt('The following errors occurred: ').'';
- }
- return $resulttext;
-}
-
-sub process_ltitools_image {
- my ($r,$dom,$confname,$caller,$itemid,$configuserok,$switchserver,$author_ok) = @_;
- my $filename = $env{'form.'.$caller.'.filename'};
- my ($error,$url);
- my ($width,$height) = (21,21);
- if ($configuserok eq 'ok') {
- if ($switchserver) {
- $error = &mt('Upload of Tool Provider (LTI) icon is not permitted to this server: [_1]',
- $switchserver);
- } elsif ($author_ok eq 'ok') {
- my ($result,$imageurl,$madethumb) =
- &publishlogo($r,'upload',$caller,$dom,$confname,
- "ltitools/$itemid/icon",$width,$height);
- if ($result eq 'ok') {
- if ($madethumb) {
- my ($path,$imagefile) = ($imageurl =~ m{^(.+)/([^/]+)$});
- my $imagethumb = "$path/tn-".$imagefile;
- $url = $imagethumb;
- } else {
- $url = $imageurl;
- }
- } else {
- $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result);
- }
- } else {
- $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$author_ok);
- }
- } else {
- $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$configuserok);
- }
- return ($url,$error);
-}
-
-sub get_ltitools_id {
- my ($cdom,$title) = @_;
- # get lock on ltitools db
- my $lockhash = {
- lock => $env{'user.name'}.
- ':'.$env{'user.domain'},
- };
- my $tries = 0;
- my $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
- my ($id,$error);
-
- while (($gotlock ne 'ok') && ($tries<10)) {
- $tries ++;
- sleep (0.1);
- $gotlock = &Apache::lonnet::newput_dom('ltitools',$lockhash,$cdom);
- }
- if ($gotlock eq 'ok') {
- my %currids = &Apache::lonnet::dump_dom('ltitools',$cdom);
- if ($currids{'lock'}) {
- delete($currids{'lock'});
- if (keys(%currids)) {
- my @curr = sort { $a <=> $b } keys(%currids);
- if ($curr[-1] =~ /^\d+$/) {
- $id = 1 + $curr[-1];
- }
- } else {
- $id = 1;
- }
- if ($id) {
- unless (&Apache::lonnet::newput_dom('ltitools',{ $id => $title },$cdom) eq 'ok') {
- $error = 'nostore';
- }
- } else {
- $error = 'nonumber';
- }
- }
- my $dellockoutcome = &Apache::lonnet::del_dom('ltitools',['lock'],$cdom);
- } else {
- $error = 'nolock';
- }
- return ($id,$error);
-}
-
sub modify_autoenroll {
my ($dom,$lastactref,%domconfig) = @_;
my ($resulttext,%changes);
@@ -12174,6 +11134,8 @@ sub modify_passwords {
if ($staticdefaults{$rule} ne $newvalues{$rule}) {
$changes{'rules'} = 1;
}
+ } else {
+ $changes{'rules'} = 1;
}
} elsif (exists($current{$rule})) {
$changes{'rules'} = 1;
@@ -12252,9 +11214,11 @@ sub modify_passwords {
$resulttext .= ''.&mt('CAPTCHA validation set to use: original CAPTCHA').' ';
} elsif ($confighash{'passwords'}{'captcha'} eq 'recaptcha') {
$resulttext .= ''.&mt('CAPTCHA validation set to use: reCAPTCHA').' '.
- &mt('version: [_1]',$confighash{'passwords'}{'recaptchaversion'}).' '.
- &mt('Public key: [_1]',$confighash{'passwords'}{'recaptchapub'}).''.
- &mt('Private key: [_1]',$confighash{'passwords'}{'recaptchapriv'}).' ';
+ &mt('version: [_1]',$confighash{'passwords'}{'recaptchaversion'}).' ';
+ if (ref($confighash{'passwords'}{'recaptchakeys'}) eq 'HASH') {
+ $resulttext .= &mt('Public key: [_1]',$confighash{'passwords'}{'recaptchakeys'}{'public'}).''.
+ &mt('Private key: [_1]',$confighash{'passwords'}{'recaptchakeys'}{'private'}).'';
+ }
} else {
$resulttext .= ''.&mt('No CAPTCHA validation').' ';
}
@@ -12333,8 +11297,9 @@ sub modify_passwords {
}
if ($confighash{'passwords'}{'resetcustom'}) {
my $customlink = &Apache::loncommon::modal_link($confighash{'passwords'}{'resetcustom'},
- $titles{custom},600,500);
- $resulttext .= ''.&mt('Preamble to "Forgot Password" form includes [_1]',$customlink).' ';
+ &mt('custom text'),600,500,undef,undef,
+ undef,undef,'background-color:#ffffff');
+ $resulttext .= ''.&mt('Preamble to "Forgot Password" form includes: [_1]',$customlink).' ';
} else {
$resulttext .= ''.&mt('No custom text included in preamble to "Forgot Password" form').' ';
}
@@ -12380,6 +11345,24 @@ sub modify_passwords {
$resulttext .= ''.&mt('[_1] set to [_2]',$titles{$rule},$confighash{'passwords'}{$rule}).' ';
}
}
+ if (ref($confighash{'passwords'}{'chars'}) eq 'ARRAY') {
+ if (@{$confighash{'passwords'}{'chars'}} > 0) {
+ my %rulenames = &Apache::lonlocal::texthash(
+ uc => 'At least one upper case letter',
+ lc => 'At least one lower case letter',
+ num => 'At least one number',
+ spec => 'At least one non-alphanumeric',
+ );
+ my $needed = ''.
+ join(' ',map {$rulenames{$_} } @{$confighash{'passwords'}{'chars'}}).
+ ' ';
+ $resulttext .= ''.&mt('[_1] set to: [_2]',$titles{'chars'},$needed).' ';
+ } else {
+ $resulttext .= ''.&mt('[_1] set to none',$titles{'chars'}).' ';
+ }
+ } else {
+ $resulttext .= ''.&mt('[_1] set to none',$titles{'chars'}).' ';
+ }
} elsif ($key eq 'crsownerchg') {
if (ref($confighash{'passwords'}{'crsownerchg'}) eq 'HASH') {
if ((@{$confighash{'passwords'}{'crsownerchg'}{'by'}} == 0) ||
@@ -13520,13 +12503,17 @@ sub modify_selfcreation {
}
sub process_captcha {
- my ($container,$changes,$newsettings,$current) = @_;
- return unless ((ref($changes) eq 'HASH') && (ref($newsettings) eq 'HASH') || (ref($current) eq 'HASH'));
+ my ($container,$changes,$newsettings,$currsettings) = @_;
+ return unless ((ref($changes) eq 'HASH') && (ref($newsettings) eq 'HASH'));
$newsettings->{'captcha'} = $env{'form.'.$container.'_captcha'};
unless ($newsettings->{'captcha'} eq 'recaptcha' || $newsettings->{'captcha'} eq 'notused') {
$newsettings->{'captcha'} = 'original';
}
- if ($current->{'captcha'} ne $newsettings->{'captcha'}) {
+ my %current;
+ if (ref($currsettings) eq 'HASH') {
+ %current = %{$currsettings};
+ }
+ if ($current{'captcha'} ne $newsettings->{'captcha'}) {
if ($container eq 'cancreate') {
if (ref($changes->{'cancreate'}) eq 'ARRAY') {
push(@{$changes->{'cancreate'}},'captcha');
@@ -13556,9 +12543,9 @@ sub process_captcha {
}
$newsettings->{'recaptchaversion'} = $newversion;
}
- if (ref($current->{'recaptchakeys'}) eq 'HASH') {
- $currpub = $current->{'recaptchakeys'}{'public'};
- $currpriv = $current->{'recaptchakeys'}{'private'};
+ if (ref($current{'recaptchakeys'}) eq 'HASH') {
+ $currpub = $current{'recaptchakeys'}{'public'};
+ $currpriv = $current{'recaptchakeys'}{'private'};
unless ($newsettings->{'captcha'} eq 'recaptcha') {
$newsettings->{'recaptchakeys'} = {
public => '',
@@ -13566,8 +12553,8 @@ sub process_captcha {
}
}
}
- if ($current->{'captcha'} eq 'recaptcha') {
- $currversion = $current->{'recaptchaversion'};
+ if ($current{'captcha'} eq 'recaptcha') {
+ $currversion = $current{'recaptchaversion'};
if ($currversion ne '2') {
$currversion = 1;
}
@@ -16809,7 +15796,7 @@ sub devalidate_remote_domconfs {
my %thismachine;
map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
my @posscached = ('domainconfig','domdefaults','usersessions',
- 'ltitools','directorysrch','passwdconf','cats');
+ 'directorysrch','passwdconf','cats');
if (keys(%servers)) {
foreach my $server (keys(%servers)) {
next if ($thismachine{$server});