'.$domservers{$lonhost}.' '.
' '.
&mt('Yes').' '.
''.
- ''.&mt('SSO').' '.
- ''.&mt('Non-SSO').' '.
+ ' '.
+ ''.
' ';
@@ -1705,6 +1759,7 @@ sub login_choices {
current => "Current",
samllanding => "Dual login?",
samloptions => "Options",
+ alttext => "Alt text",
);
return %choices;
}
@@ -1893,8 +1948,11 @@ sub commblocktype_text {
'printout' => 'Printouts',
'passwd' => 'Change Password',
'grades' => 'Gradebook',
+ 'search' => 'Course search',
+ 'wishlist' => 'Stored links',
+ 'annotate' => 'Annotations',
);
- my $typeorder = ['com','chat','boards','port','groups','blogs','about','printout','grades','passwd'];
+ my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','annotate','passwd'];
return ($typeorder,\%types);
}
@@ -2047,7 +2105,7 @@ sub display_color_options {
$css_class = $itemcount%2?' class="LC_odd_row"':'';
$datatable .= ''.
''.$choices->{$img};
- my ($imgfile,$img_import,$login_hdr_pick,$logincolors);
+ my ($imgfile,$img_import,$login_hdr_pick,$logincolors,$alttext);
if ($role eq 'login') {
if ($img eq 'login') {
$login_hdr_pick =
@@ -2055,8 +2113,13 @@ sub display_color_options {
$logincolors =
&login_text_colors($img,$role,$logintext,$phase,$choices,
$designs,$defaults);
- } elsif ($img ne 'domlogo') {
- $datatable.= &logo_display_options($img,$defaults,$designs);
+ } else {
+ if ($img ne 'domlogo') {
+ $datatable.= &logo_display_options($img,$defaults,$designs);
+ }
+ if (ref($designs->{'alttext'}) eq 'HASH') {
+ $alttext = $designs->{'alttext'}{$img};
+ }
}
}
$datatable .= ' ';
@@ -2148,6 +2211,11 @@ sub display_color_options {
$datatable .=' ';
}
}
+ if (($role eq 'login') && ($img ne 'login')) {
+ $datatable .= (' ' x2).' '.$choices->{'alttext'}.':'.
+ ' '.
+ ' ';
+ }
$datatable .= ' ';
}
$itemcount ++;
@@ -2319,7 +2387,7 @@ sub print_quotas {
@options = ('norequest','approval','automatic');
%titles = &authorrequest_titles();
} else {
- @usertools = ('aboutme','blog','webdav','portfolio');
+ @usertools = ('aboutme','blog','webdav','portfolio','timezone');
%titles = &tool_titles();
}
if (ref($types) eq 'ARRAY') {
@@ -2423,9 +2491,12 @@ sub print_quotas {
}
} else {
my $checked = 'checked="checked" ';
+ if ($item eq 'timezone') {
+ $checked = '';
+ }
if (ref($settings) eq 'HASH') {
if (ref($settings->{$item}) eq 'HASH') {
- if ($settings->{$item}->{$type} == 0) {
+ if (!$settings->{$item}->{$type}) {
$checked = '';
} elsif ($settings->{$item}->{$type} == 1) {
$checked = 'checked="checked" ';
@@ -3362,10 +3433,19 @@ ENDSCRIPT
sub lti_javascript {
- my ($settings) = @_;
- my $togglejs = <i_toggle_js();
+ my ($dom,$settings) = @_;
+ my $togglejs = <i_toggle_js($dom);
+ my $linkprot_js = &Apache::courseprefs::linkprot_javascript();
unless (ref($settings) eq 'HASH') {
- return $togglejs;
+ return $togglejs.'
+
+';
}
my (%ordered,$total,%jstext);
$total = scalar(keys(%{$settings}));
@@ -3427,6 +3507,9 @@ $jstext
}
return;
}
+
+$linkprot_js
+
// ]]>
@@ -3436,12 +3519,17 @@ ENDSCRIPT
}
sub lti_toggle_js {
+ my ($dom) = @_;
my %lcauthparmtext = &Apache::lonlocal::texthash (
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);
+ my %servers = &Apache::lonnet::get_servers($dom,'library');
+ my $primary = &Apache::lonnet::domain($dom,'primary');
+ my $course_servers = "'".join("','",keys(%servers))."'";
+
return <<"ENDSCRIPT";
@@ -3685,6 +3774,41 @@ function toggleLastActiveDays(form) {
ENDSCRIPT
}
+sub autoenroll_javascript {
+ return <<"ENDSCRIPT";
+
+
+ENDSCRIPT
+}
+
sub saml_javascript {
return <<"ENDSCRIPT";
+
+ENDSCRIPT
+ } else {
+return <<"ENDSCRIPT";
+
@@ -11066,17 +11233,27 @@ ENDSCRIPT
}
sub passwords_javascript {
- my %intalert = &Apache::lonlocal::texthash (
- authcheck => 'Warning: disallowing login for an authenticated user if the stored cost is less than the default will require a password reset by/for the user.',
- authcost => 'Warning: bcrypt encryption cost for internal authentication must be an integer.',
- passmin => 'Warning: minimum password length must be a positive integer greater than 6.',
- passmax => 'Warning: maximum password length must be a positive integer (or blank).',
- passexp => 'Warning: days before password expiration must be a positive integer (or blank).',
- passnum => 'Warning: number of previous passwords to save must be a positive integer (or blank).',
- );
+ my ($prefix) = @_;
+ my %intalert;
+ if ($prefix eq 'passwords') {
+ %intalert = &Apache::lonlocal::texthash (
+ authcheck => 'Warning: disallowing login for an authenticated user if the stored cost is less than the default will require a password reset by/for the user.',
+ authcost => 'Warning: bcrypt encryption cost for internal authentication must be an integer.',
+ passmin => 'Warning: minimum password length must be a positive integer greater than 6.',
+ passmax => 'Warning: maximum password length must be a positive integer (or blank).',
+ passexp => 'Warning: days before password expiration must be a positive integer (or blank).',
+ passnum => 'Warning: number of previous passwords to save must be a positive integer (or blank).',
+ );
+ } elsif (($prefix eq 'ltisecrets') || ($prefix eq 'toolsecrets')) {
+ %intalert = &Apache::lonlocal::texthash (
+ passmin => 'Warning: minimum secret length must be a positive integer greater than 6.',
+ passmax => 'Warning: maximum secret length must be a positive integer (or blank).',
+ );
+ }
&js_escape(\%intalert);
my $defmin = $Apache::lonnet::passwdmin;
- my $intauthjs = <<"ENDSCRIPT";
+ my $intauthjs;
+ if ($prefix eq 'passwords') { $intauthjs = <<"ENDSCRIPT";
function warnIntAuth(field) {
if (field.name == 'intauth_check') {
@@ -11096,11 +11273,17 @@ function warnIntAuth(field) {
return;
}
-function warnIntPass(field) {
+ENDSCRIPT
+
+ }
+
+ $intauthjs .= <<"ENDSCRIPT";
+
+function warnInt$prefix(field) {
field.value.replace(/^\s+/,'');
field.value.replace(/\s+\$/,'');
var regexdigit=/^\\d+\$/;
- if (field.name == 'passwords_min') {
+ if (field.name == '${prefix}_min') {
if (field.value == '') {
alert('$intalert{passmin}');
field.value = '$defmin';
@@ -11120,7 +11303,7 @@ function warnIntPass(field) {
field.value = '';
}
if (field.value != '') {
- if (field.name == 'passwords_expire') {
+ if (field.name == '${prefix}_expire') {
var regexpposnum=/^\\d+(|\\.\\d*)\$/;
if (!regexpposnum.test(field.value)) {
alert('$intalert{passexp}');
@@ -11134,10 +11317,10 @@ function warnIntPass(field) {
}
} else {
if (!regexdigit.test(field.value)) {
- if (field.name == 'passwords_max') {
+ if (field.name == '${prefix}_max') {
alert('$intalert{passmax}');
} else {
- if (field.name == 'passwords_numsaved') {
+ if (field.name == '${prefix}_numsaved') {
alert('$intalert{passnum}');
}
}
@@ -11768,7 +11951,7 @@ sub modify_login {
my ($r,$dom,$confname,$lastactref,%domconfig) = @_;
my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,
%curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon,
- %currsaml,%saml,%samltext,%samlimg,%samlalt,%samlurl,%samltitle,%samlnotsso);
+ %currsaml,%saml,%samltext,%samlimg,%samlalt,%samlurl,%samltitle,%samlwindow,%samlnotsso);
%title = ( coursecatalog => 'Display course catalog',
adminmail => 'Display administrator E-mail address',
helpdesk => 'Display "Contact Helpdesk" link',
@@ -11792,6 +11975,7 @@ sub modify_login {
$samlalt{$lonhost} = $domconfig{login}{'saml'}{$lonhost}{'alt'};
$samlimg{$lonhost} = $domconfig{login}{'saml'}{$lonhost}{'img'};
$samltitle{$lonhost} = $domconfig{login}{'saml'}{$lonhost}{'title'};
+ $samlwindow{$lonhost} = $domconfig{login}{'saml'}{$lonhost}{'window'};
$samlnotsso{$lonhost} = $domconfig{login}{'saml'}{$lonhost}{'notsso'};
}
}
@@ -11934,13 +12118,16 @@ sub modify_login {
if ($addedfile ne '') {
push(@allnew,$addedfile);
}
+ my $modified = [];
foreach my $lang (@allnew) {
my $formelem = 'loginhelpurl_'.$lang;
if ($lang eq $env{'form.loginhelpurl_add_lang'}) {
$formelem = 'loginhelpurl_add_file';
}
- (my $result,$newurl{$lang}) = &publishlogo($r,'upload',$formelem,$dom,$confname,
- "help/$lang",'','',$newfile{$lang});
+ (my $result,$newurl{$lang}) =
+ &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
+ "help/$lang",'','',$newfile{$lang},
+ $modified);
if ($result eq 'ok') {
$loginhash{'login'}{'helpurl'}{$lang} = $newurl{$lang};
$changes{'helpurl'}{$lang} = 1;
@@ -11953,6 +12140,7 @@ sub modify_login {
}
}
}
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of custom log-in help file(s) failed because an author role could not be assigned to a Domain Configuration user ([_1]) in domain: [_2]. Error was: [_3].",$confname,$dom,$author_ok);
}
@@ -12010,11 +12198,14 @@ sub modify_login {
if ($switchserver) {
$error = &mt("Upload of custom markup is not permitted to this server: [_1]",$switchserver);
} elsif ($author_ok eq 'ok') {
+ my $modified = [];
foreach my $lonhost (@newhosts) {
my $formelem = 'loginheadtag_'.$lonhost;
- (my $result,$newheadtagurls{$lonhost}) = &publishlogo($r,'upload',$formelem,$dom,$confname,
- "login/headtag/$lonhost",'','',
- $env{'form.loginheadtag_'.$lonhost.'.filename'});
+ (my $result,$newheadtagurls{$lonhost}) =
+ &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
+ "login/headtag/$lonhost",'','',
+ $env{'form.loginheadtag_'.$lonhost.'.filename'},
+ $modified);
if ($result eq 'ok') {
$loginhash{'login'}{'headtag'}{$lonhost}{'url'} = $newheadtagurls{$lonhost};
$changes{'headtag'}{$lonhost} = 1;
@@ -12031,6 +12222,7 @@ sub modify_login {
}
}
}
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of custom markup file(s) failed because an author role could not be assigned to a Domain Configuration user ([_1]) in domain: [_2]. Error was: [_3].",$confname,$dom,$author_ok);
}
@@ -12049,10 +12241,13 @@ sub modify_login {
if ($env{'form.saml_img_'.$lonhost.'.filename'}) {
push(@newsamlimgs,$lonhost);
}
- foreach my $item ('text','alt','url','title','notsso') {
+ foreach my $item ('text','alt','url','title','window','notsso') {
$env{'form.saml_'.$item.'_'.$lonhost} =~ s/^\s+|\s+$//g;
}
if ($saml{$lonhost}) {
+ if ($env{'form.saml_window_'.$lonhost} ne '1') {
+ $env{'form.saml_window_'.$lonhost} = '';
+ }
if (grep(/^\Q$lonhost\E$/,@delsamlimg)) {
#FIXME Need to obsolete published image
delete($currsaml{$lonhost}{'img'});
@@ -12070,13 +12265,16 @@ sub modify_login {
if ($env{'form.saml_title_'.$lonhost} ne $samltitle{$lonhost}) {
$changes{'saml'}{$lonhost} = 1;
}
+ if ($env{'form.saml_window_'.$lonhost} ne $samlwindow{$lonhost}) {
+ $changes{'saml'}{$lonhost} = 1;
+ }
if ($env{'form.saml_notsso_'.$lonhost} ne $samlnotsso{$lonhost}) {
$changes{'saml'}{$lonhost} = 1;
}
} else {
$changes{'saml'}{$lonhost} = 1;
}
- foreach my $item ('text','alt','url','title','notsso') {
+ foreach my $item ('text','alt','url','title','window','notsso') {
$currsaml{$lonhost}{$item} = $env{'form.saml_'.$item.'_'.$lonhost};
}
} else {
@@ -12099,11 +12297,14 @@ sub modify_login {
if ($switchserver) {
$error = &mt("Upload of SSO Button Image is not permitted to this server: [_1].",$switchserver);
} elsif ($author_ok eq 'ok') {
+ my $modified = [];
foreach my $lonhost (@newsamlimgs) {
my $formelem = 'saml_img_'.$lonhost;
- my ($result,$imgurl) = &publishlogo($r,'upload',$formelem,$dom,$confname,
- "login/saml/$lonhost",'','',
- $env{'form.saml_img_'.$lonhost.'.filename'});
+ my ($result,$imgurl) =
+ &Apache::lonconfigsettings::publishlogo($r,'upload',$formelem,$dom,$confname,
+ "login/saml/$lonhost",'','',
+ $env{'form.saml_img_'.$lonhost.'.filename'},
+ $modified);
if ($result eq 'ok') {
$currsaml{$lonhost}{'img'} = $imgurl;
$loginhash{'login'}{'saml'}{$lonhost}{'img'} = $imgurl;
@@ -12114,6 +12315,7 @@ sub modify_login {
$errors .= ''.$puberror.' ';
}
}
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of SSO button image file(s) failed because an author role could not be assigned to a Domain Configuration user ([_1]) in domain: [_2]. Error was: [_3].",$confname,$dom,$author_ok);
}
@@ -12277,19 +12479,22 @@ sub modify_login {
alt => 'Alt text for button image',
url => 'SSO URL',
title => 'Tooltip for SSO link',
+ window => 'Pop-up window if iframe',
notsso => 'Text for non-SSO log-in',
);
foreach my $lonhost (sort(keys(%{$changes{$item}}))) {
if (ref($currsaml{$lonhost}) eq 'HASH') {
$resulttext .= ''.&mt("$title{$item} in use for [_1]","$lonhost ").
'';
- foreach my $key ('text','img','alt','url','title','notsso') {
+ foreach my $key ('text','img','alt','url','title','window','notsso') {
if ($currsaml{$lonhost}{$key} eq '') {
$resulttext .= ''.&mt("$notlt{$key} not in use").' ';
} else {
my $value = "'$currsaml{$lonhost}{$key}'";
if ($key eq 'img') {
$value = ' ';
+ } elsif ($key eq 'window') {
+ $value = 'On';
}
$resulttext .= ''.&mt("$notlt{$key} set to: [_1]",
$value).' ';
@@ -12620,8 +12825,10 @@ sub modify_ipaccess {
} else {
$resulttext .= ''.&mt('No courses allowed').' ';
}
+ $resulttext .= ' ';
}
}
+ $resulttext .= '';
} else {
$errors .= ''.&mt('Failed to save changes').' ';
}
@@ -12785,13 +12992,18 @@ sub modify_colors {
$domconfig->{$role} = {};
}
foreach my $img (@images) {
- if (($role eq 'login') && (($img eq 'img') || ($img eq 'logo'))) {
- if (defined($env{'form.login_showlogo_'.$img})) {
- $confhash->{$role}{'showlogo'}{$img} = 1;
- } else {
- $confhash->{$role}{'showlogo'}{$img} = 0;
+ if ($role eq 'login') {
+ if (($img eq 'img') || ($img eq 'logo')) {
+ if (defined($env{'form.login_showlogo_'.$img})) {
+ $confhash->{$role}{'showlogo'}{$img} = 1;
+ } else {
+ $confhash->{$role}{'showlogo'}{$img} = 0;
+ }
}
- }
+ if ($env{'form.login_alt_'.$img} ne '') {
+ $confhash->{$role}{'alttext'}{$img} = $env{'form.login_alt_'.$img};
+ }
+ }
if ( ! $env{'form.'.$role.'_'.$img.'.filename'}
&& !defined($domconfig->{$role}{$img})
&& !$env{'form.'.$role.'_del_'.$img}
@@ -12808,12 +13020,15 @@ sub modify_colors {
$error = &mt("Upload of [_1] image for $role page(s) is not permitted to this server: [_2]",$choices{$img},$switchserver);
} else {
if ($author_ok eq 'ok') {
+ my $modified = [];
my ($result,$logourl) =
- &publishlogo($r,'upload',$role.'_'.$img,
- $dom,$confname,$img,$width,$height);
+ &Apache::lonconfigsettings::publishlogo($r,'upload',$role.'_'.$img,
+ $dom,$confname,$img,$width,$height,
+ '',$modified);
if ($result eq 'ok') {
$confhash->{$role}{$img} = $logourl;
$changes{$role}{'images'}{$img} = 1;
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of [_1] image for $role page(s) failed because an error occurred publishing the file in RES space. Error was: [_2].",$choices{img},$result);
}
@@ -12835,12 +13050,15 @@ sub modify_colors {
# is confname an author?
if ($switchserver eq '') {
if ($author_ok eq 'ok') {
+ my $modified = [];
my ($result,$logourl) =
- &publishlogo($r,'copy',$domconfig->{$role}{$img},
- $dom,$confname,$img,$width,$height);
+ &Apache::lonconfigsettings::publishlogo($r,'copy',$domconfig->{$role}{$img},
+ $dom,$confname,$img,$width,$height,
+ '',$modified);
if ($result eq 'ok') {
$confhash->{$role}{$img} = $logourl;
$changes{$role}{'images'}{$img} = 1;
+ &update_modify_urls($r,$modified);
}
}
}
@@ -12866,15 +13084,29 @@ sub modify_colors {
$changes{$role}{'images'}{$img} = 1;
}
}
- if (($role eq 'login') && (($img eq 'logo') || ($img eq 'img'))) {
- if (ref($domconfig->{'login'}{'showlogo'}) eq 'HASH') {
- if ($confhash->{$role}{'showlogo'}{$img} ne
- $domconfig->{$role}{'showlogo'}{$img}) {
- $changes{$role}{'showlogo'}{$img} = 1;
+ if ($role eq 'login') {
+ if (($img eq 'logo') || ($img eq 'img')) {
+ if (ref($domconfig->{'login'}{'showlogo'}) eq 'HASH') {
+ if ($confhash->{$role}{'showlogo'}{$img} ne
+ $domconfig->{$role}{'showlogo'}{$img}) {
+ $changes{$role}{'showlogo'}{$img} = 1;
+ }
+ } else {
+ if ($confhash->{$role}{'showlogo'}{$img} == 0) {
+ $changes{$role}{'showlogo'}{$img} = 1;
+ }
}
- } else {
- if ($confhash->{$role}{'showlogo'}{$img} == 0) {
- $changes{$role}{'showlogo'}{$img} = 1;
+ }
+ if ($img ne 'login') {
+ if (ref($domconfig->{$role}{'alttext'}) eq 'HASH') {
+ if ($confhash->{$role}{'alttext'}{$img} ne
+ $domconfig->{$role}{'alttext'}{$img}) {
+ $changes{$role}{'alttext'}{$img} = 1;
+ }
+ } else {
+ if ($confhash->{$role}{'alttext'}{$img} ne '') {
+ $changes{$role}{'alttext'}{$img} = 1;
+ }
}
}
}
@@ -12985,6 +13217,11 @@ sub default_change_checker {
if ($confhash->{$role}{'showlogo'}{$img} == 0) {
$changes->{$role}{'showlogo'}{$img} = 1;
}
+ if (ref($confhash->{$role}{'alttext'}) eq 'HASH') {
+ if ($confhash->{$role}{'alttext'}{$img} ne '') {
+ $changes->{$role}{'alttext'}{$img} = 1;
+ }
+ }
}
}
if ($confhash->{$role}{'font'}) {
@@ -13023,6 +13260,13 @@ sub display_colorchgs {
} else {
$resulttext .= ''.&mt("$choices{$item} set to not be displayed").' ';
}
+ } elsif (($role eq 'login') && ($key eq 'alttext')) {
+ if ($confhash->{$role}{$key}{$item} ne '') {
+ $resulttext .= ''.&mt("$choices{$key} for $choices{$item} set to [_1].",
+ $confhash->{$role}{$key}{$item}).' ';
+ } else {
+ $resulttext .= ''.&mt("$choices{$key} for $choices{$item} deleted.").' ';
+ }
} elsif ($confhash->{$role}{$item} eq '') {
$resulttext .= ''.&mt("$choices{$item} set to default").' ';
} else {
@@ -13108,229 +13352,16 @@ sub check_authorstatus {
return $author_ok;
}
-sub publishlogo {
- my ($r,$action,$formname,$dom,$confname,$subdir,$thumbwidth,$thumbheight,$savefileas) = @_;
- my ($output,$fname,$logourl,$madethumb);
- if ($action eq 'upload') {
- $fname=$env{'form.'.$formname.'.filename'};
- chop($env{'form.'.$formname});
- } else {
- ($fname) = ($formname =~ /([^\/]+)$/);
- }
- if ($savefileas ne '') {
- $fname = $savefileas;
- }
- $fname=&Apache::lonnet::clean_filename($fname);
-# See if there is anything left
- unless ($fname) { return ('error: no uploaded file'); }
- $fname="$subdir/$fname";
- my $docroot=$r->dir_config('lonDocRoot');
- my $filepath="$docroot/priv";
- my $relpath = "$dom/$confname";
- my ($fnamepath,$file,$fetchthumb);
- $file=$fname;
- if ($fname=~m|/|) {
- ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
- }
- my @parts=split(/\//,"$filepath/$relpath/$fnamepath");
- my $count;
- for ($count=5;$count<=$#parts;$count++) {
- $filepath.="/$parts[$count]";
- if ((-e $filepath)!=1) {
- mkdir($filepath,02770);
- }
- }
- # Check for bad extension and disallow upload
- if ($file=~/\.(\w+)$/ &&
- (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
- $output =
- &mt('Invalid file extension ([_1]) - reserved for internal use.',$1);
- } elsif ($file=~/\.(\w+)$/ &&
- !defined(&Apache::loncommon::fileembstyle($1))) {
- $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
- } elsif ($file=~/\.(\d+)\.(\w+)$/) {
- $output = &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
- } elsif (-d "$filepath/$file") {
- $output = &mt('Filename is a directory name - rename the file and re-upload');
- } else {
- my $source = $filepath.'/'.$file;
- my $logfile;
- if (!open($logfile,">>",$source.'.log')) {
- return (&mt('No write permission to Authoring Space'));
- }
- print $logfile
-"\n================= Publish ".localtime()." ================\n".
-$env{'user.name'}.':'.$env{'user.domain'}."\n";
-# Save the file
- if (!open(FH,">",$source)) {
- &Apache::lonnet::logthis('Failed to create '.$source);
- return (&mt('Failed to create file'));
- }
- if ($action eq 'upload') {
- if (!print FH ($env{'form.'.$formname})) {
- &Apache::lonnet::logthis('Failed to write to '.$source);
- return (&mt('Failed to write file'));
- }
- } else {
- my $original = &Apache::lonnet::filelocation('',$formname);
- if(!copy($original,$source)) {
- &Apache::lonnet::logthis('Failed to copy '.$original.' to '.$source);
- return (&mt('Failed to write file'));
- }
- }
- close(FH);
- chmod(0660, $source); # Permissions to rw-rw---.
-
- my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;
- my $copyfile=$targetdir.'/'.$file;
-
- my @parts=split(/\//,$targetdir);
- my $path="/$parts[1]/$parts[2]/$parts[3]/$parts[4]";
- for (my $count=5;$count<=$#parts;$count++) {
- $path.="/$parts[$count]";
- if (!-e $path) {
- print $logfile "\nCreating directory ".$path;
- mkdir($path,02770);
- }
- }
- my $versionresult;
- if (-e $copyfile) {
- $versionresult = &logo_versioning($targetdir,$file,$logfile);
- } else {
- $versionresult = 'ok';
- }
- if ($versionresult eq 'ok') {
- if (copy($source,$copyfile)) {
- print $logfile "\nCopied original source to ".$copyfile."\n";
- $output = 'ok';
- $logourl = '/res/'.$dom.'/'.$confname.'/'.$fname;
- push(@{$modified_urls},[$copyfile,$source]);
- my $metaoutput =
- &write_metadata($dom,$confname,$formname,$targetdir,$file,$logfile);
- unless ($registered_cleanup) {
- my $handlers = $r->get_handlers('PerlCleanupHandler');
- $r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]);
- $registered_cleanup=1;
- }
- } else {
- print $logfile "\nUnable to write ".$copyfile.':'.$!."\n";
- $output = &mt('Failed to copy file to RES space').", $!";
- }
- if (($thumbwidth =~ /^\d+$/) && ($thumbheight =~ /^\d+$/)) {
- my $inputfile = $filepath.'/'.$file;
- my $outfile = $filepath.'/'.'tn-'.$file;
- my ($fullwidth,$fullheight) = &check_dimensions($inputfile);
- if ($fullwidth ne '' && $fullheight ne '') {
- if ($fullwidth > $thumbwidth && $fullheight > $thumbheight) {
- my $thumbsize = $thumbwidth.'x'.$thumbheight;
- my @args = ('convert','-sample',$thumbsize,$inputfile,$outfile);
- system({$args[0]} @args);
- chmod(0660, $filepath.'/tn-'.$file);
- if (-e $outfile) {
- my $copyfile=$targetdir.'/tn-'.$file;
- if (copy($outfile,$copyfile)) {
- print $logfile "\nCopied source to ".$copyfile."\n";
- my $thumb_metaoutput =
- &write_metadata($dom,$confname,$formname,
- $targetdir,'tn-'.$file,$logfile);
- push(@{$modified_urls},[$copyfile,$outfile]);
- unless ($registered_cleanup) {
- my $handlers = $r->get_handlers('PerlCleanupHandler');
- $r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]);
- $registered_cleanup=1;
- }
- $madethumb = 1;
- } else {
- print $logfile "\nUnable to write ".$copyfile.
- ':'.$!."\n";
- }
- }
- }
- }
- }
- } else {
- $output = $versionresult;
- }
- }
- return ($output,$logourl,$madethumb);
-}
-
-sub logo_versioning {
- my ($targetdir,$file,$logfile) = @_;
- my $target = $targetdir.'/'.$file;
- my ($maxversion,$fn,$extn,$output);
- $maxversion = 0;
- if ($file =~ /^(.+)\.(\w+)$/) {
- $fn=$1;
- $extn=$2;
- }
- opendir(DIR,$targetdir);
- while (my $filename=readdir(DIR)) {
- if ($filename=~/\Q$fn\E\.(\d+)\.\Q$extn\E$/) {
- $maxversion=($1>$maxversion)?$1:$maxversion;
+sub update_modify_urls {
+ my ($r,$modified) = @_;
+ if ((ref($modified) eq 'ARRAY') && (@{$modified})) {
+ push(@{$modified_urls},$modified);
+ unless ($registered_cleanup) {
+ my $handlers = $r->get_handlers('PerlCleanupHandler');
+ $r->set_handlers('PerlCleanupHandler' => [\¬ifysubscribed,@{$handlers}]);
+ $registered_cleanup=1;
}
}
- $maxversion++;
- print $logfile "\nCreating old version ".$maxversion."\n";
- my $copyfile=$targetdir.'/'.$fn.'.'.$maxversion.'.'.$extn;
- if (copy($target,$copyfile)) {
- print $logfile "Copied old target to ".$copyfile."\n";
- $copyfile=$copyfile.'.meta';
- if (copy($target.'.meta',$copyfile)) {
- print $logfile "Copied old target metadata to ".$copyfile."\n";
- $output = 'ok';
- } else {
- print $logfile "Unable to write metadata ".$copyfile.':'.$!."\n";
- $output = &mt('Failed to copy old meta').", $!, ";
- }
- } else {
- print $logfile "Unable to write ".$copyfile.':'.$!."\n";
- $output = &mt('Failed to copy old target').", $!, ";
- }
- return $output;
-}
-
-sub write_metadata {
- my ($dom,$confname,$formname,$targetdir,$file,$logfile) = @_;
- my (%metadatafields,%metadatakeys,$output);
- $metadatafields{'title'}=$formname;
- $metadatafields{'creationdate'}=time;
- $metadatafields{'lastrevisiondate'}=time;
- $metadatafields{'copyright'}='public';
- $metadatafields{'modifyinguser'}=$env{'user.name'}.':'.
- $env{'user.domain'};
- $metadatafields{'authorspace'}=$confname.':'.$dom;
- $metadatafields{'domain'}=$dom;
- {
- print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
- my $mfh;
- if (open($mfh,">",$targetdir.'/'.$file.'.meta')) {
- foreach (sort(keys(%metadatafields))) {
- unless ($_=~/\./) {
- my $unikey=$_;
- $unikey=~/^([A-Za-z]+)/;
- my $tag=$1;
- $tag=~tr/A-Z/a-z/;
- print $mfh "\n\<$tag";
- foreach (split(/\,/,$metadatakeys{$unikey})) {
- my $value=$metadatafields{$unikey.'.'.$_};
- $value=~s/\"/\'\'/g;
- print $mfh ' '.$_.'="'.$value.'"';
- }
- print $mfh '>'.
- &HTML::Entities::encode($metadatafields{$unikey},'<>&"')
- .''.$tag.'>';
- }
- }
- $output = 'ok';
- print $logfile "\nWrote metadata";
- close($mfh);
- } else {
- print $logfile "\nFailed to open metadata file";
- $output = &mt('Could not write metadata');
- }
- }
- return $output;
}
sub notifysubscribed {
@@ -13421,7 +13452,7 @@ sub modify_quotas {
@usertools = ('author');
%titles = &authorrequest_titles();
} else {
- @usertools = ('aboutme','blog','webdav','portfolio');
+ @usertools = ('aboutme','blog','webdav','portfolio','timezone');
%titles = &tool_titles();
}
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
@@ -14112,11 +14143,14 @@ sub process_textbook_image {
$error = &mt('Upload of textbook image is not permitted to this server: [_1]',
$switchserver);
} elsif ($author_ok eq 'ok') {
+ my $modified = [];
my ($result,$imageurl) =
- &publishlogo($r,'upload',$caller,$dom,$confname,
- "$type/$cdom/$cnum/cover",$width,$height);
+ &Apache::lonconfigsettings::publishlogo($r,'upload',$caller,$dom,$confname,
+ "$type/$cdom/$cnum/cover",$width,$height,
+ '',$modified);
if ($result eq 'ok') {
$url = $imageurl;
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result);
}
@@ -14131,656 +14165,319 @@ sub process_textbook_image {
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 (%currtoolsec,%secchanges,%newtoolsec,%newkeyset);
+ &fetch_secrets($dom,'toolsec',\%domconfig,\%currtoolsec,\%secchanges,\%newtoolsec,\%newkeyset);
+
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','lifetime') {
- $env{'form.ltitools_add_'.$item} =~ s/(`)/'/g;
- if ($item eq 'lifetime') {
- $env{'form.ltitools_add_'.$item} =~ s/[^\d.]//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'};
- }
- if ($env{'form.ltitools_add_sigmethod'} eq 'HMAC-SHA256') {
- $confhash{$newid}{'sigmethod'} = $env{'form.ltitools_add_sigmethod'};
- } else {
- $confhash{$newid}{'sigmethod'} = 'HMAC-SHA1';
- }
- 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_'.$item.'_add'}) {
- $confhash{$newid}{$item} = 1;
- if ($env{'form.ltitools_'.$item.'valid_add'} ne '') {
- my $lifetime = $env{'form.ltitools_'.$item.'valid_add'};
- $lifetime =~ s/^\s+|\s+$//g;
- if ($lifetime =~ /^\d+\.?\d*$/) {
- $confhash{$newid}{$item.'valid'} = $lifetime;
- }
- }
- }
- }
- 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;
- }
- }
+
+ my ($resulttext,$ltitoolsoutput,$is_home,$errors,%ltitoolschg,%newtoolsenc,%newltitools);
+ my $toolserror =
+ &Apache::courseprefs::process_ltitools($r,$dom,$confname,$domconfig{'ltitools'},\%ltitoolschg,'domain',
+ $lastactref,$configuserok,$switchserver,$author_ok);
+
+ my $home = &Apache::lonnet::domain($dom,'primary');
+ unless (($home eq 'no_host') || ($home eq '')) {
+ my @ids=&Apache::lonnet::current_machine_ids();
+ foreach my $id (@ids) { if ($id eq $home) { $is_home=1; last; } }
+ }
+
+ if (keys(%ltitoolschg)) {
+ foreach my $id (keys(%ltitoolschg)) {
+ if (ref($ltitoolschg{$id}) eq 'HASH') {
+ foreach my $inner (keys(%{$ltitoolschg{$id}})) {
+ if (($inner eq 'secret') || ($inner eq 'key')) {
+ if ($is_home) {
+ $newtoolsenc{$id}{$inner} = $ltitoolschg{$id}{$inner};
}
- } else {
- $confhash{$newid}{'fields'}{$field} = 1;
}
}
}
- if (ref($confhash{$newid}{'fields'}) eq 'HASH') {
- if ($confhash{$newid}{'fields'}{'user'}) {
- if ($env{'form.ltitools_userincdom_add'}) {
- $confhash{$newid}{'incdom'} = 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;
+ $ltitoolsoutput = &Apache::courseprefs::store_ltitools($dom,'','domain',\%ltitoolschg,$domconfig{'ltitools'});
+ if (keys(%ltitoolschg)) {
+ %newltitools = %ltitoolschg;
}
- 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','lifetime') {
- $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};
- }
- if ($env{'form.ltitools_sigmethod_'.$i} eq 'HMAC-SHA256') {
- $confhash{$itemid}{'sigmethod'} = $env{'form.ltitools_sigmethod_'.$i};
- } else {
- $confhash{$itemid}{'sigmethod'} = 'HMAC-SHA1';
- }
- if ($domconfig{$action}{$itemid}{'sigmethod'} eq '') {
- if ($confhash{$itemid}{'sigmethod'} ne 'HMAC-SHA1') {
- $changes{$itemid} = 1;
- }
- } elsif ($domconfig{$action}{$itemid}{'sigmethod'} ne $confhash{$itemid}{'sigmethod'}) {
- $changes{$itemid} = 1;
- }
- 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 ($env{'form.ltitools_'.$extra.'valid_'.$i} ne '') {
- my $lifetime = $env{'form.ltitools_'.$extra.'valid_'.$i};
- $lifetime =~ s/^\s+|\s+$//g;
- if ($lifetime =~ /^\d+\.?\d*$/) {
- $confhash{$itemid}{$extra.'valid'} = $lifetime;
- }
- }
- }
- if ($domconfig{$action}{$itemid}{$extra} ne $confhash{$itemid}{$extra}) {
- $changes{$itemid} = 1;
- }
- if ($domconfig{$action}{$itemid}{$extra.'valid'} ne $confhash{$itemid}{$extra.'valid'}) {
- $changes{$itemid} = 1;
- }
- }
- my @courseconfig = &Apache::loncommon::get_env_multiple('form.ltitools_courseconfig_'.$i);
- foreach my $item ('label','title','target','linktext','explanation','append') {
- 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;
- }
- }
- }
- }
- if (ref($confhash{$itemid}{'fields'}) eq 'HASH') {
- if ($confhash{$itemid}{'fields'}{'user'}) {
- if ($env{'form.ltitools_userincdom_'.$i}) {
- $confhash{$itemid}{'incdom'} = 1;
- }
- if ($domconfig{$action}{$itemid}{'incdom'} ne $confhash{$itemid}{'incdom'}) {
- $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;
+ }
+ if (ref($domconfig{'ltitools'}) eq 'HASH') {
+ foreach my $id (%{$domconfig{'ltitools'}}) {
+ next if ($id !~ /^\d+$/);
+ unless (exists($ltitoolschg{$id})) {
+ if (ref($domconfig{'ltitools'}{$id}) eq 'HASH') {
+ foreach my $inner (keys(%{$domconfig{'ltitools'}{$id}})) {
+ if (($inner eq 'secret') || ($inner eq 'key')) {
+ if ($is_home) {
+ $newtoolsenc{$id}{$inner} = $domconfig{'ltitools'}{$id}{$inner};
}
+ } else {
+ $newltitools{$id}{$inner} = $domconfig{'ltitools'}{$id}{$inner};
}
- last if ($changes{$itemid});
}
+ } else {
+ $newltitools{$id} = $domconfig{'ltitools'}{$id};
}
}
}
}
- 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 ++;
- }
+ if ($toolserror) {
+ $errors = ''.$toolserror.' ';
+ }
+ if ((keys(%ltitoolschg) == 0) && (keys(%secchanges) == 0)) {
+ $resulttext = &mt('No changes made.');
+ if ($errors) {
+ $resulttext .= ' '.&mt('The following errors occurred: ').'';
}
+ return $resulttext;
}
my %ltitoolshash = (
- $action => { %confhash }
+ $action => { %newltitools }
);
- my $putresult = &Apache::lonnet::put_dom('configuration',\%ltitoolshash,
- $dom);
+ if (keys(%secchanges)) {
+ $ltitoolshash{'toolsec'} = \%newtoolsec;
+ }
+ my $putresult = &Apache::lonnet::put_dom('configuration',\%ltitoolshash,$dom);
if ($putresult eq 'ok') {
- my %ltienchash = (
- $action => { %encconfig }
- );
- &Apache::lonnet::put_dom('encconfig',\%ltienchash,$dom,undef,1);
- 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};
+ my %keystore;
+ if ($is_home) {
+ my %toolsenchash = (
+ $action => { %newtoolsenc }
+ );
+ &Apache::lonnet::put_dom('encconfig',\%toolsenchash,$dom,undef,1);
+ &store_security($dom,'ltitools',\%secchanges,\%newkeyset,\%keystore,$lastactref);
+ }
+ $resulttext = &mt('Changes made:').'';
} else {
$errors .= ''.&mt('Failed to save changes').' ';
}
@@ -15911,7 +15686,7 @@ sub modify_autoenroll {
my %title = ( run => 'Auto-enrollment active',
sender => 'Sender for notification messages',
coowners => 'Automatic assignment of co-ownership to instructors of record (institutional data)',
- failsafe => 'Failsafe for no drops if institutional data missing for a section');
+ autofailsafe => 'Failsafe for no drops if institutional data missing for a section');
my @offon = ('off','on');
my $sender_uname = $env{'form.sender_uname'};
my $sender_domain = $env{'form.sender_domain'};
@@ -15921,17 +15696,23 @@ sub modify_autoenroll {
$sender_domain = '';
}
my $coowners = $env{'form.autoassign_coowners'};
+ my $autofailsafe = $env{'form.autoenroll_autofailsafe'};
+ $autofailsafe =~ s{^\s+|\s+$}{}g;
+ if ($autofailsafe =~ /\D/) {
+ undef($autofailsafe);
+ }
my $failsafe = $env{'form.autoenroll_failsafe'};
- $failsafe =~ s{^\s+|\s+$}{}g;
- if ($failsafe =~ /\D/) {
- undef($failsafe);
+ unless (($failsafe eq 'zero') || ($failsafe eq 'any')) {
+ $failsafe = 'off';
+ undef($autofailsafe);
}
my %autoenrollhash = (
autoenroll => { 'run' => $env{'form.autoenroll_run'},
'sender_uname' => $sender_uname,
'sender_domain' => $sender_domain,
'co-owners' => $coowners,
- 'autofailsafe' => $failsafe,
+ 'autofailsafe' => $autofailsafe,
+ 'failsafe' => $failsafe,
}
);
my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash,
@@ -15959,9 +15740,12 @@ sub modify_autoenroll {
} elsif ($coowners) {
$changes{'coowners'} = 1;
}
- if ($currautoenroll{'autofailsafe'} ne $failsafe) {
+ if ($currautoenroll{'autofailsafe'} ne $autofailsafe) {
$changes{'autofailsafe'} = 1;
}
+ if ($currautoenroll{'failsafe'} ne $failsafe) {
+ $changes{'failsafe'} = 1;
+ }
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made:').'';
if ($changes{'run'}) {
@@ -15982,11 +15766,24 @@ sub modify_autoenroll {
}
}
if ($changes{'autofailsafe'}) {
- if ($failsafe ne '') {
- $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section set to: [_1]',$failsafe).' ';
+ if ($autofailsafe ne '') {
+ $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section set to: [_1]',$autofailsafe).' ';
} else {
- $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section: deleted');
+ $resulttext .= ' '.&mt('Failsafe for no drops if institutional data missing for a section not in use').' ';
}
+ }
+ if ($changes{'failsafe'}) {
+ if ($failsafe eq 'off') {
+ unless ($changes{'autofailsafe'}) {
+ $resulttext .= ''.&mt('Failsafe for no drops if institutional data missing for a section not in use').' ';
+ }
+ } elsif ($failsafe eq 'zero') {
+ $resulttext .= ''.&mt('Failsafe applies if retrieved section enrollment is zero').' ';
+ } else {
+ $resulttext .= ''.&mt('Failsafe applies if retrieved section enrollment is zero or greater').' ';
+ }
+ }
+ if (($changes{'autofailsafe'}) || ($changes{'failsafe'})) {
&Apache::lonnet::get_domain_defaults($dom,1);
if (ref($lastactref) eq 'HASH') {
$lastactref->{'domdefaults'} = 1;
@@ -17102,7 +16899,7 @@ sub modify_privacy {
domain => 'Assigned domain role(s)',
author => 'Assigned co-author role(s)',
course => 'Assigned course role(s)',
- community => 'Assigned community role',
+ community => 'Assigned community role(s)',
);
my %roles = &Apache::lonlocal::texthash (
domain => 'Domain role',
@@ -17121,6 +16918,7 @@ sub modify_privacy {
user => 'User authorizes',
domain => 'Domain Coordinator authorizes',
auto => 'Unrestricted',
+ notify => 'Notify when role needs authorization',
);
my %fieldnames = &Apache::lonlocal::texthash (
id => 'Student/Employee ID',
@@ -17146,7 +16944,7 @@ sub modify_privacy {
);
foreach my $item (@items) {
if (@instdoms > 1) {
- if ($env{'form.privacy_approval_instdom'.$item} =~ /^(none|user|domain|auto)$/) {
+ if ($env{'form.privacy_approval_instdom_'.$item} =~ /^(none|user|domain|auto)$/) {
$privacyhash{'approval'}{'instdom'}{$item} = $env{'form.privacy_approval_instdom_'.$item};
}
if (ref($current{'approval'}) eq 'HASH') {
@@ -17238,6 +17036,18 @@ sub modify_privacy {
}
}
}
+ my %domcoords = &Apache::lonnet::get_active_domroles($dom,['dc']);
+ my %notify;
+ foreach my $possdc (&Apache::loncommon::get_env_multiple('form.privacy_notify')) {
+ if (exists($domcoords{$possdc})) {
+ $notify{$possdc} = 1;
+ }
+ }
+ my $notify = join(',',sort(keys(%notify)));
+ if ($current{'notify'} ne $notify) {
+ $changes{'notify'} = 1;
+ }
+ $privacyhash{'notify'} = $notify;
}
my %confighash = (
privacy => \%privacyhash,
@@ -17246,7 +17056,7 @@ sub modify_privacy {
if ($putresult eq 'ok') {
if (keys(%changes) > 0) {
$resulttext = &mt('Changes made: ').'';
- foreach my $key ('approval','othdom','priv','unpriv') {
+ foreach my $key ('approval','notify','othdom','priv','unpriv') {
if ($changes{$key}) {
$resulttext .= ''.$titles{$key}.':';
if ($key eq 'approval') {
@@ -17264,6 +17074,15 @@ sub modify_privacy {
}
$resulttext .= ' ';
}
+ } elsif ($key eq 'notify') {
+ if ($privacyhash{$key}) {
+ foreach my $dc (split(/,/,$privacyhash{$key})) {
+ my ($dcname,$dcdom) = split(/:/,$dc);
+ $resulttext .= ''.&Apache::loncommon::plainname($dcname,$dcdom).' ';
+ }
+ } else {
+ $resulttext .= ''.&mt('No DCs to notify').' ';
+ }
} elsif ($key eq 'othdom') {
my @statuses;
if (ref($types) eq 'ARRAY') {
@@ -17304,6 +17123,7 @@ sub modify_privacy {
$resulttext .= ' ';
}
}
+ $resulttext .= ' ';
} else {
$resulttext = &mt('No changes made to user information settings');
}
@@ -17490,12 +17310,15 @@ sub modify_passwords {
$error = &mt("Upload of file containing domain-specific text is not permitted to this server: [_1]",$switchserver);
} else {
if ($author_ok eq 'ok') {
+ my $modified = [];
my ($result,$customurl) =
- &publishlogo($r,'upload','passwords_customfile',$dom,
- $confname,'customtext/resetpw','','',$customfn);
+ &Apache::lonconfigsettings::publishlogo($r,'upload','passwords_customfile',$dom,
+ $confname,'customtext/resetpw','','',$customfn,
+ $modified);
if ($result eq 'ok') {
$newvalues{'resetcustom'} = $customurl;
$changes{'reset'} = 1;
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customfn,$result);
}
@@ -17548,61 +17371,7 @@ sub modify_passwords {
$updatedefaults = 1;
}
}
- foreach my $rule ('min','max','expire','numsaved') {
- $env{'form.passwords_'.$rule} =~ s/^\s+|\s+$//g;
- my $ruleok;
- if ($rule eq 'expire') {
- if (($env{'form.passwords_'.$rule} =~ /^\d+(|\.\d*)$/) &&
- ($env{'form.passwords_'.$rule} ne '0')) {
- $ruleok = 1;
- }
- } elsif ($rule eq 'min') {
- if ($env{'form.passwords_'.$rule} =~ /^\d+$/) {
- if ($env{'form.passwords_'.$rule} >= $Apache::lonnet::passwdmin) {
- $ruleok = 1;
- }
- }
- } elsif (($env{'form.passwords_'.$rule} =~ /^\d+$/) &&
- ($env{'form.passwords_'.$rule} ne '0')) {
- $ruleok = 1;
- }
- if ($ruleok) {
- $newvalues{$rule} = $env{'form.passwords_'.$rule};
- if (exists($current{$rule})) {
- if ($newvalues{$rule} ne $current{$rule}) {
- $changes{'rules'} = 1;
- }
- } elsif ($rule eq 'min') {
- if ($staticdefaults{$rule} ne $newvalues{$rule}) {
- $changes{'rules'} = 1;
- }
- } else {
- $changes{'rules'} = 1;
- }
- } elsif (exists($current{$rule})) {
- $changes{'rules'} = 1;
- }
- }
- my @posschars = &Apache::loncommon::get_env_multiple('form.passwords_chars');
- my @chars;
- foreach my $item (sort(@posschars)) {
- if ($item =~ /^(uc|lc|num|spec)$/) {
- push(@chars,$item);
- }
- }
- $newvalues{'chars'} = \@chars;
- unless ($changes{'rules'}) {
- if (ref($current{'chars'}) eq 'ARRAY') {
- my @diffs = &Apache::loncommon::compare_arrays($current{'chars'},\@chars);
- if (@diffs > 0) {
- $changes{'rules'} = 1;
- }
- } else {
- if (@chars > 0) {
- $changes{'rules'} = 1;
- }
- }
- }
+ &password_rule_changes('passwords',\%newvalues,\%current,\%changes);
my %crsownerchg = (
by => [],
for => [],
@@ -17862,6 +17631,76 @@ sub modify_passwords {
return $resulttext;
}
+sub password_rule_changes {
+ my ($prefix,$newvalues,$current,$changes) = @_;
+ return unless ((ref($newvalues) eq 'HASH') &&
+ (ref($current) eq 'HASH') &&
+ (ref($changes) eq 'HASH'));
+ my (@rules,%staticdefaults);
+ if ($prefix eq 'passwords') {
+ @rules = ('min','max','expire','numsaved');
+ } elsif (($prefix eq 'ltisecrets') || ($prefix eq 'toolsecrets')) {
+ @rules = ('min','max');
+ }
+ $staticdefaults{'min'} = $Apache::lonnet::passwdmin;
+ foreach my $rule (@rules) {
+ $env{'form.'.$prefix.'_'.$rule} =~ s/^\s+|\s+$//g;
+ my $ruleok;
+ if ($rule eq 'expire') {
+ if (($env{'form.'.$prefix.'_'.$rule} =~ /^\d+(|\.\d*)$/) &&
+ ($env{'form.'.$prefix.'_'.$rule} ne '0')) {
+ $ruleok = 1;
+ }
+ } elsif ($rule eq 'min') {
+ if ($env{'form.'.$prefix.'_'.$rule} =~ /^\d+$/) {
+ if ($env{'form.'.$prefix.'_'.$rule} >= $staticdefaults{$rule}) {
+ $ruleok = 1;
+ }
+ }
+ } elsif (($env{'form.'.$prefix.'_'.$rule} =~ /^\d+$/) &&
+ ($env{'form.'.$prefix.'_'.$rule} ne '0')) {
+ $ruleok = 1;
+ }
+ if ($ruleok) {
+ $newvalues->{$rule} = $env{'form.'.$prefix.'_'.$rule};
+ if (exists($current->{$rule})) {
+ if ($newvalues->{$rule} ne $current->{$rule}) {
+ $changes->{'rules'} = 1;
+ }
+ } elsif ($rule eq 'min') {
+ if ($staticdefaults{$rule} ne $newvalues->{$rule}) {
+ $changes->{'rules'} = 1;
+ }
+ } else {
+ $changes->{'rules'} = 1;
+ }
+ } elsif (exists($current->{$rule})) {
+ $changes->{'rules'} = 1;
+ }
+ }
+ my @posschars = &Apache::loncommon::get_env_multiple('form.'.$prefix.'_chars');
+ my @chars;
+ foreach my $item (sort(@posschars)) {
+ if ($item =~ /^(uc|lc|num|spec)$/) {
+ push(@chars,$item);
+ }
+ }
+ $newvalues->{'chars'} = \@chars;
+ unless ($changes->{'rules'}) {
+ if (ref($current->{'chars'}) eq 'ARRAY') {
+ my @diffs = &Apache::loncommon::compare_arrays($current->{'chars'},\@chars);
+ if (@diffs > 0) {
+ $changes->{'rules'} = 1;
+ }
+ } else {
+ if (@chars > 0) {
+ $changes->{'rules'} = 1;
+ }
+ }
+ }
+ return;
+}
+
sub modify_usercreation {
my ($dom,%domconfig) = @_;
my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate,%save_usercreate);
@@ -18735,7 +18574,7 @@ sub modify_selfcreation {
$output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').' ';
} else {
$output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address needs to end: [_1]",
- $cancreate{'emaildomain'}{$type}{'inst'}).' ';
+ $cancreate{'emaildomain'}{$type}{'inst'}).'';
}
}
} elsif ($cancreate{'emailoptions'}{$type} eq 'noninst') {
@@ -18753,7 +18592,7 @@ sub modify_selfcreation {
$output = ''.$usertypes{$type}.' -- '.&mt('No restriction on e-mail domain').' ';
} else {
$output = ''.$usertypes{$type}.' -- '.&mt("User's e-mail address must not end: [_1]",
- $cancreate{'emaildomain'}{$type}{'noninst'}).' ';
+ $cancreate{'emaildomain'}{$type}{'noninst'}).'';
}
}
}
@@ -19175,16 +19014,58 @@ sub modify_defaults {
}
} elsif ($item eq 'portal_def') {
if ($newvalues{$item} ne '') {
- unless ($newvalues{$item} =~ /^https?\:\/\/(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])\/?$/) {
+ if ($newvalues{$item} =~ /^https?\:\/\/(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])\/?$/) {
+ foreach my $field ('email','web') {
+ if ($env{'form.'.$item.'_'.$field}) {
+ $newvalues{$item.'_'.$field} = $env{'form.'.$item.'_'.$field};
+ }
+ }
+ } else {
push(@errors,$item);
}
}
}
if (grep(/^\Q$item\E$/,@errors)) {
$newvalues{$item} = $domdefaults{$item};
+ if ($item eq 'portal_def') {
+ if ($domdefaults{$item}) {
+ foreach my $field ('email','web') {
+ if (exists($domdefaults{$item.'_'.$field})) {
+ $newvalues{$item.'_'.$field} = $domdefaults{$item.'_'.$field};
+ }
+ }
+ }
+ }
} elsif ($domdefaults{$item} ne $newvalues{$item}) {
$changes{$item} = 1;
}
+ if ($item eq 'portal_def') {
+ unless (grep(/^\Q$item\E$/,@errors)) {
+ if ($newvalues{$item} eq '') {
+ foreach my $field ('email','web') {
+ if (exists($domdefaults{$item.'_'.$field})) {
+ delete($domdefaults{$item.'_'.$field});
+ }
+ }
+ } else {
+ unless ($changes{$item}) {
+ foreach my $field ('email','web') {
+ if ($domdefaults{$item.'_'.$field} ne $newvalues{$item.'_'.$field}) {
+ $changes{$item} = 1;
+ last;
+ }
+ }
+ }
+ foreach my $field ('email','web') {
+ if ($newvalues{$item.'_'.$field}) {
+ $domdefaults{$item.'_'.$field} = $newvalues{$item.'_'.$field};
+ } elsif (exists($domdefaults{$item.'_'.$field})) {
+ delete($domdefaults{$item.'_'.$field});
+ }
+ }
+ }
+ }
+ }
$domdefaults{$item} = $newvalues{$item};
}
my %staticdefaults = (
@@ -19199,6 +19080,41 @@ sub modify_defaults {
$newvalues{$item} = $staticdefaults{$item};
}
}
+ my ($unamemaprules,$ruleorder);
+ my @possunamemaprules = &Apache::loncommon::get_env_multiple('form.unamemap_rule');
+ if (@possunamemaprules) {
+ ($unamemaprules,$ruleorder) =
+ &Apache::lonnet::inst_userrules($dom,'unamemap');
+ if ((ref($unamemaprules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) {
+ if (@{$ruleorder} > 0) {
+ my %possrules;
+ map { $possrules{$_} = 1; } @possunamemaprules;
+ foreach my $rule (@{$ruleorder}) {
+ if ($possrules{$rule}) {
+ push(@{$newvalues{'unamemap_rule'}},$rule);
+ }
+ }
+ }
+ }
+ }
+ if (ref($domdefaults{'unamemap_rule'}) eq 'ARRAY') {
+ if (ref($newvalues{'unamemap_rule'}) eq 'ARRAY') {
+ my @rulediffs = &Apache::loncommon::compare_arrays($domdefaults{'unamemap_rule'},
+ $newvalues{'unamemap_rule'});
+ if (@rulediffs) {
+ $changes{'unamemap_rule'} = 1;
+ $domdefaults{'unamemap_rule'} = $newvalues{'unamemap_rule'};
+ }
+ } elsif (@{$domdefaults{'unamemap_rule'}} > 0) {
+ $changes{'unamemap_rule'} = 1;
+ delete($domdefaults{'unamemap_rule'});
+ }
+ } elsif (ref($newvalues{'unamemap_rule'}) eq 'ARRAY') {
+ if (@{$newvalues{'unamemap_rule'}} > 0) {
+ $changes{'unamemap_rule'} = 1;
+ $domdefaults{'unamemap_rule'} = $newvalues{'unamemap_rule'};
+ }
+ }
my %defaults_hash = (
defaults => \%newvalues,
);
@@ -19313,6 +19229,26 @@ sub modify_defaults {
$resulttext .= ''.&mt('Institutional user status types deleted').' ';
}
}
+ } elsif ($item eq 'unamemap_rule') {
+ if (ref($newvalues{'unamemap_rule'}) eq 'ARRAY') {
+ my @rulenames;
+ if (ref($unamemaprules) eq 'HASH') {
+ foreach my $rule (@{$newvalues{'unamemap_rule'}}) {
+ if (ref($unamemaprules->{$rule}) eq 'HASH') {
+ push(@rulenames,$unamemaprules->{$rule}->{'name'});
+ }
+ }
+ }
+ if (@rulenames) {
+ $resulttext .= ''.&mt('Mapping for missing usernames includes: [_1]',
+ '').
+ ' ';
+ } else {
+ $resulttext .= ''.&mt('No mapping for missing usernames via standard log-in').' ';
+ }
+ } else {
+ $resulttext .= ''.&mt('Mapping for missing usernames via standard log-in deleted').' ';
+ }
} else {
my $value = $env{'form.'.$item};
if ($value eq '') {
@@ -19329,7 +19265,20 @@ sub modify_defaults {
$value = $authnames{$shortauth{$value}};
}
$resulttext .= ''.&mt('[_1] set to "[_2]"',$title->{$item},$value).' ';
- $mailmsgtext .= "$title->{$item} set to $value\n";
+ $mailmsgtext .= "$title->{$item} set to $value\n";
+ if ($item eq 'portal_def') {
+ if ($env{'form.'.$item} ne '') {
+ foreach my $field ('email','web') {
+ $value = $env{'form.'.$item.'_'.$field};
+ if ($value) {
+ $value = &mt('Yes');
+ } else {
+ $value = &mt('No');
+ }
+ $resulttext .= ''.&mt('[_1] set to "[_2]"',$title->{$field},$value).' ';
+ }
+ }
+ }
}
}
$resulttext .= '';
@@ -19384,12 +19333,15 @@ sub modify_scantron {
$error = &mt("Upload of bubblesheet format file is not permitted to this server: [_1]",$switchserver);
} else {
if ($author_ok eq 'ok') {
+ my $modified = [];
my ($result,$scantronurl) =
- &publishlogo($r,'upload','scantronformat',$dom,
- $confname,'scantron','','',$custom);
+ &Apache::lonconfigsettings::publishlogo($r,'upload','scantronformat',$dom,
+ $confname,'scantron','','',$custom,
+ $modified);
if ($result eq 'ok') {
$confhash{'scantron'}{'scantronformat'} = $scantronurl;
$changes{'scantronformat'} = 1;
+ &update_modify_urls($r,$modified);
} else {
$error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$custom,$result);
}
@@ -20302,9 +20254,11 @@ sub modify_coursedefaults {
my %defaultchecked = (
'canuse_pdfforms' => 'off',
'uselcmath' => 'on',
- 'usejsme' => 'on'
+ 'usejsme' => 'on',
+ 'inline_chem' => 'on',
+ 'ltiauth' => 'off',
);
- my @toggles = ('canuse_pdfforms','uselcmath','usejsme');
+ my @toggles = ('canuse_pdfforms','uselcmath','usejsme','inline_chem','ltiauth');
my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',
'uploadquota_community','uploadquota_textbook','uploadquota_placement',
'mysqltables_official','mysqltables_unofficial','mysqltables_community',
@@ -20315,6 +20269,7 @@ sub modify_coursedefaults {
uploadquota => 500,
postsubmit => 60,
mysqltables => 172800,
+ domexttool => 1,
);
my %texoptions = (
MathJax => 'MathJax',
@@ -20506,6 +20461,47 @@ sub modify_coursedefaults {
$changes{'postsubmit'} = 1;
}
}
+ my (%newdomexttool,%newexttool,%olddomexttool,%oldexttool);
+ map { $newdomexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.domexttool');
+ map { $newexttool{$_} = 1; } &Apache::loncommon::get_env_multiple('form.exttool');
+ if (ref($domconfig{'coursedefaults'}{'domexttool'}) eq 'HASH') {
+ %olddomexttool = %{$domconfig{'coursedefaults'}{'domexttool'}};
+ } else {
+ foreach my $type (@types) {
+ if ($staticdefaults{'domexttool'}) {
+ $olddomexttool{$type} = 1;
+ } else {
+ $olddomexttool{$type} = 0;
+ }
+ }
+ }
+ if (ref($domconfig{'coursedefaults'}{'exttool'}) eq 'HASH') {
+ %oldexttool = %{$domconfig{'coursedefaults'}{'exttool'}};
+ } else {
+ foreach my $type (@types) {
+ if ($staticdefaults{'exttool'}) {
+ $oldexttool{$type} = 1;
+ } else {
+ $oldexttool{$type} = 0;
+ }
+ }
+ }
+ foreach my $type (@types) {
+ unless ($newdomexttool{$type}) {
+ $newdomexttool{$type} = 0;
+ }
+ unless ($newexttool{$type}) {
+ $newexttool{$type} = 0;
+ }
+ if ($newdomexttool{$type} != $olddomexttool{$type}) {
+ $changes{'domexttool'} = 1;
+ }
+ if ($newexttool{$type} != $oldexttool{$type}) {
+ $changes{'exttool'} = 1;
+ }
+ }
+ $defaultshash{'coursedefaults'}{'domexttool'} = \%newdomexttool;
+ $defaultshash{'coursedefaults'}{'exttool'} = \%newexttool;
}
my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
$dom);
@@ -20514,8 +20510,11 @@ sub modify_coursedefaults {
my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);
if (($changes{'canuse_pdfforms'}) || ($changes{'uploadquota'}) || ($changes{'postsubmit'}) ||
($changes{'coursecredits'}) || ($changes{'uselcmath'}) || ($changes{'usejsme'}) ||
- ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'})) {
- foreach my $item ('canuse_pdfforms','uselcmath','usejsme','texengine') {
+ ($changes{'canclone'}) || ($changes{'mysqltables'}) || ($changes{'texengine'}) ||
+ ($changes{'inline_chem'}) || ($changes{'ltiauth'}) || ($changes{'domexttool'}) ||
+ ($changes{'exttool'}) ) {
+ foreach my $item ('canuse_pdfforms','uselcmath','usejsme','inline_chem','texengine',
+ 'ltiauth') {
if ($changes{$item}) {
$domdefaults{$item}=$defaultshash{'coursedefaults'}{$item};
}
@@ -20558,6 +20557,20 @@ sub modify_coursedefaults {
$domdefaults{'canclone'}=$defaultshash{'coursedefaults'}{'canclone'};
}
}
+ if ($changes{'domexttool'}) {
+ if (ref($defaultshash{'coursedefaults'}{'domexttool'}) eq 'HASH') {
+ foreach my $type (@types) {
+ $domdefaults{$type.'domexttool'}=$defaultshash{'coursedefaults'}{'domexttool'}{$type};
+ }
+ }
+ }
+ if ($changes{'exttool'}) {
+ if (ref($defaultshash{'coursedefaults'}{'exttool'}) eq 'HASH') {
+ foreach my $type (@types) {
+ $domdefaults{$type.'exttool'}=$defaultshash{'coursedefaults'}{'exttool'}{$type};
+ }
+ }
+ }
my $cachetime = 24*60*60;
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
if (ref($lastactref) eq 'HASH') {
@@ -20584,6 +20597,12 @@ sub modify_coursedefaults {
} else {
$resulttext .= ''.&mt('Molecule editor uses JME (Java), if supported by client OS.').' ';
}
+ } elsif ($item eq 'inline_chem') {
+ if ($env{'form.'.$item} eq '1') {
+ $resulttext .= ''.&mt('Chemical Reaction Response uses inline previewer').' ';
+ } else {
+ $resulttext .= ''.&mt('Chemical Reaction Response uses pop-up previewer').' ';
+ }
} elsif ($item eq 'texengine') {
if ($defaultshash{'coursedefaults'}{'texengine'} ne '') {
$resulttext .= ''.&mt('Default method to display mathematics set to: "[_1]"',
@@ -20683,6 +20702,40 @@ sub modify_coursedefaults {
} else {
$resulttext .= ' '.&mt('By default, only course owner and coordinators may clone a course.').' ';
}
+ } elsif ($item eq 'ltiauth') {
+ if ($env{'form.'.$item} eq '1') {
+ $resulttext .= ''.&mt('LTI launch of deep-linked URL need not require re-authentication').' ';
+ } else {
+ $resulttext .= ''.&mt('LTI launch of deep-linked URL will require re-authentication').' ';
+ }
+ } elsif ($item eq 'domexttool') {
+ my @noyes = (&mt('no'),&mt('yes'));
+ if (ref($defaultshash{'coursedefaults'}{'domexttool'}) eq 'HASH') {
+ $resulttext .= ''.&mt('External Tools defined in the domain may be used as follows:').''.
+ ''.&mt('Official courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'official'}].' ').' '.
+ ''.&mt('Unofficial courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'unofficial'}].' ').' '.
+ ''.&mt('Textbook courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'textbook'}].' ').' '.
+ ''.&mt('Placement tests: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'placement'}].' ').' '.
+ ''.&mt('Communities: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'domexttool'}{'community'}].' ').' '.
+ ' '.
+ ' ';
+ } else {
+ $resulttext .= ''.&mt('External Tools defined in the domain may be used in all course types, by default').' ';
+ }
+ } elsif ($item eq 'exttool') {
+ my @noyes = (&mt('no'),&mt('yes'));
+ if (ref($defaultshash{'coursedefaults'}{'exttool'}) eq 'HASH') {
+ $resulttext .= ''.&mt('External Tools can be defined and configured in course containers as follows:').''.
+ ''.&mt('Official courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'official'}].' ').' '.
+ ''.&mt('Unofficial courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'unofficial'}].' ').' '.
+ ''.&mt('Textbook courses: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'textbook'}].' ').' '.
+ ''.&mt('Placement tests: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'placement'}].' ').' '.
+ ''.&mt('Communities: [_1]',''.$noyes[$defaultshash{'coursedefaults'}{'exttool'}{'community'}].' ').' '.
+ ' '.
+ ' ';
+ } else {
+ $resulttext .= ''.&mt('External Tools can not be defined in any course types, by default').' ';
+ }
}
}
$resulttext .= '';
@@ -21154,7 +21207,7 @@ sub modify_wafproxy {
}
}
$output = &mt('Changes were made to Web Application Firewall/Reverse Proxy').'';
- foreach my $item ('alias','remoteip','ipheader','trusted','vpnint','vpnext','sslopt') {
+ foreach my $item ('alias','saml','remoteip','ipheader','trusted','vpnint','vpnext','sslopt') {
if ($changes{$item}) {
if ($item eq 'alias') {
my $numaliased = 0;
@@ -21184,10 +21237,10 @@ sub modify_wafproxy {
}
}
if ($shown) {
- $output .= ''.&mt('Alias used by Shibboleth for: [_1]',
+ $output .= ' '.&mt('Alias used by SSO Auth for: [_1]',
$shown).' ';
} else {
- $output .= ''.&mt('No alias used for Shibboleth').' ';
+ $output .= ''.&mt('No alias used for SSO Auth').' ';
}
} else {
if ($item eq 'remoteip') {
@@ -21241,6 +21294,7 @@ sub modify_wafproxy {
}
}
}
+ $output .= ' ';
} else {
$output = ''.
&mt('An error occurred: [_1]',$putresult).' ';
@@ -21923,8 +21977,10 @@ sub modify_trust {
}
my $cachetime = 24*60*60;
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
+ &Apache::lonnet::do_cache_new('trust',$dom,$defaultshash{'trust'},3600);
if (ref($lastactref) eq 'HASH') {
$lastactref->{'domdefaults'} = 1;
+ $lastactref->{'trust'} = 1;
}
if (keys(%changes) > 0) {
my %lt = &trust_titles();
@@ -22993,7 +23049,7 @@ sub devalidate_remote_domconfs {
map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();
my @posscached = ('domainconfig','domdefaults','ltitools','usersessions',
'directorysrch','passwdconf','cats','proxyalias','proxysaml',
- 'ipaccess');
+ 'ipaccess','trust');
my %cache_by_lonhost;
if (exists($cachekeys->{'samllanding'})) {
if (ref($cachekeys->{'samllanding'}) eq 'HASH') {