'.$title.'
'."\n".
- ''."\n";
+ my $space;
+ if ($islast && $num == 1) {
+ $space = '
';
+ }
+ my $output =
+ '
'.$space.
+ ''.$title.'
'."\n".
+ ''.$space.
+ ''."\n";
for (my $i=0; $i<@rulenames; $i++) {
my $rule = $rulenames[$i];
my ($checked,$extra);
@@ -2907,17 +3159,20 @@ sub loadbalance_rule_row {
unless ($checked) {
$default = ' selected="selected"';
}
- $extra = ':
'."\n".
- ' '."\n";
- foreach my $lonhost (sort(keys(%{$servers}))) {
- next if ($lonhost eq $currbalancer);
+ $extra =
+ ': '."\n".
+ ' '."\n";
+ foreach my $server (sort(keys(%{$servers}))) {
+ if (ref($currbalancer) eq 'HASH') {
+ next if (exists($currbalancer->{$server}));
+ }
my $selected;
- if ($lonhost eq $current) {
+ if ($server eq $current) {
$selected = ' selected="selected"';
}
- $extra .= ''.$lonhost.' ';
+ $extra .= ''.$server.' ';
}
$extra .= ' ';
}
@@ -2925,9 +3180,9 @@ sub loadbalance_rule_row {
$checked = ' checked="checked"';
}
$output .= ''.
- ' '.$ruletitles{$rulenames[$i]}.
' '.$extra.' '."\n";
}
@@ -2998,6 +3253,15 @@ sub courserequest_titles {
return %titles;
}
+sub authorrequest_titles {
+ my %titles = &Apache::lonlocal::texthash (
+ norequest => 'Not allowed',
+ approval => 'Approval by Dom. Coord.',
+ automatic => 'Automatic approval',
+ );
+ return %titles;
+}
+
sub courserequest_conditions {
my %conditions = &Apache::lonlocal::texthash (
approval => '(Processing of request subject to approval by Domain Coordinator).',
@@ -3127,18 +3391,20 @@ sub print_usercreation {
}
my ($othertitle,$usertypes,$types) =
&Apache::loncommon::sorted_inst_types($dom);
+ my $createsettings;
+ if (ref($settings) eq 'HASH') {
+ $createsettings = $settings->{cancreate};
+ }
if (ref($usertypes) eq 'HASH') {
if (keys(%{$usertypes}) > 0) {
- my $createsettings;
- if (ref($settings) eq 'HASH') {
- $createsettings = $settings->{cancreate};
- }
$datatable .= &insttypes_row($createsettings,$types,$usertypes,
$dom,$numinrow,$othertitle,
'statustocreate');
$$rowtotal ++;
+ $rownum ++;
}
}
+ $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);
} else {
my @contexts = ('author','course','domain');
my @authtypes = ('int','krb4','krb5','loc');
@@ -3190,6 +3456,64 @@ sub print_usercreation {
return $datatable;
}
+sub captcha_choice {
+ my ($context,$settings,$itemcount) = @_;
+ my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);
+ my %lt = &captcha_phrases();
+ $keyentry = 'hidden';
+ if ($context eq 'cancreate') {
+ $rowname = &mt('CAPTCHA validation (e-mail as username)');
+ } elsif ($context eq 'login') {
+ $rowname = &mt('"Contact helpdesk" CAPTCHA validation');
+ }
+ if (ref($settings) eq 'HASH') {
+ if ($settings->{'captcha'}) {
+ $checked{$settings->{'captcha'}} = ' checked="checked"';
+ } else {
+ $checked{'original'} = ' checked="checked"';
+ }
+ if ($settings->{'captcha'} eq 'recaptcha') {
+ $pubtext = $lt{'pub'};
+ $privtext = $lt{'priv'};
+ $keyentry = 'text';
+ }
+ if (ref($settings->{'recaptchakeys'}) eq 'HASH') {
+ $currpub = $settings->{'recaptchakeys'}{'public'};
+ $currpriv = $settings->{'recaptchakeys'}{'private'};
+ }
+ } else {
+ $checked{'original'} = ' checked="checked"';
+ }
+ my $css_class = $itemcount%2?' class="LC_odd_row"':'';
+ my $output = ''.
+ ''.$rowname.' '."\n".
+ ''."\n".
+ ' ';
+ return $output;
+}
+
sub user_formats_row {
my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
my $output;
@@ -3364,6 +3688,12 @@ sub print_defaults {
} elsif ($item eq 'datelocale_def') {
my $includeempty = 1;
$datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
+ } elsif ($item eq 'lang_def') {
+ my %langchoices = &get_languages_hash();
+ $langchoices{''} = 'No language preference';
+ %langchoices = &Apache::lonlocal::texthash(%langchoices);
+ $datatable .= &Apache::loncommon::select_form($domdefaults{$item},$item,
+ \%langchoices);
} else {
my $size;
if ($item eq 'portal_def') {
@@ -3379,6 +3709,17 @@ sub print_defaults {
return $datatable;
}
+sub get_languages_hash {
+ my %langchoices;
+ foreach my $id (&Apache::loncommon::languageids()) {
+ my $code = &Apache::loncommon::supportedlanguagecode($id);
+ if ($code ne '') {
+ $langchoices{$code} = &Apache::loncommon::plainlanguagedescription($id);
+ }
+ }
+ return %langchoices;
+}
+
sub defaults_titles {
my ($dom) = @_;
my %titles = &Apache::lonlocal::texthash (
@@ -4154,9 +4495,13 @@ sub insttypes_row {
if ($context eq 'cansearch') {
$showdom = ' ('.$dom.')';
}
+ my $class = 'LC_left_item';
+ if ($context eq 'statustocreate') {
+ $class = 'LC_right_item';
+ }
my $output = ''.
''.$lt{$context}.$showdom.
- ' ';
+ '';
my $rem;
if (ref($types) eq 'ARRAY') {
for (my $i=0; $i<@{$types}; $i++) {
@@ -4286,13 +4631,13 @@ sub usertype_update_row {
sub modify_login {
my ($r,$dom,$confname,%domconfig) = @_;
- my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
- my %title = ( coursecatalog => 'Display course catalog',
- adminmail => 'Display administrator E-mail address',
- newuser => 'Link for visitors to create a user account',
- loginheader => 'Log-in box header');
- my @offon = ('off','on');
- my %curr_loginvia;
+ my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,
+ %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);
+ %title = ( coursecatalog => 'Display course catalog',
+ adminmail => 'Display administrator E-mail address',
+ newuser => 'Link for visitors to create a user account',
+ loginheader => 'Log-in box header');
+ @offon = ('off','on');
if (ref($domconfig{login}) eq 'HASH') {
if (ref($domconfig{login}{loginvia}) eq 'HASH') {
foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {
@@ -4300,7 +4645,6 @@ sub modify_login {
}
}
}
- my %loginhash;
($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
\%domconfig,\%loginhash);
my @toggles = ('coursecatalog','adminmail','newuser');
@@ -4373,7 +4717,6 @@ sub modify_login {
$new = '';
}
}
-
$loginhash{login}{loginvia}{$lonhost}{$item} = $new;
}
}
@@ -4399,6 +4742,96 @@ sub modify_login {
}
}
+ my $servadm = $r->dir_config('lonAdmEMail');
+ my %langchoices = &Apache::lonlocal::texthash(&get_languages_hash());
+ if (ref($domconfig{'login'}) eq 'HASH') {
+ if (ref($domconfig{'login'}{'helpurl'}) eq 'HASH') {
+ foreach my $lang (sort(keys(%{$domconfig{'login'}{'helpurl'}}))) {
+ if ($lang eq 'nolang') {
+ push(@currlangs,$lang);
+ } elsif (defined($langchoices{$lang})) {
+ push(@currlangs,$lang);
+ } else {
+ next;
+ }
+ }
+ }
+ }
+ my @delurls = &Apache::loncommon::get_env_multiple('form.loginhelpurl_del');
+ if (@currlangs > 0) {
+ foreach my $lang (@currlangs) {
+ if (grep(/^\Q$lang\E$/,@delurls)) {
+ $changes{'helpurl'}{$lang} = 1;
+ } elsif ($env{'form.loginhelpurl_'.$lang.'.filename'}) {
+ $changes{'helpurl'}{$lang} = 1;
+ $newfile{$lang} = $env{'form.loginhelpurl_'.$lang.'.filename'};
+ push(@newlangs,$lang);
+ } else {
+ $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};
+ }
+ }
+ }
+ unless (grep(/^nolang$/,@currlangs)) {
+ if ($env{'form.loginhelpurl_nolang.filename'}) {
+ $changes{'helpurl'}{'nolang'} = 1;
+ $newfile{'nolang'} = $env{'form.loginhelpurl_nolang.filename'};
+ push(@newlangs,'nolang');
+ }
+ }
+ if ($env{'form.loginhelpurl_add_lang'}) {
+ if ((defined($langchoices{$env{'form.loginhelpurl_add_lang'}})) &&
+ ($env{'form.loginhelpurl_add_file.filename'})) {
+ $newfile{$env{'form.loginhelpurl_add_lang'}} = $env{'form.loginhelpurl_add_file.filename'};
+ $addedfile = $env{'form.loginhelpurl_add_lang'};
+ }
+ }
+ if ((@newlangs > 0) || ($addedfile)) {
+ my $error;
+ my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);
+ if ($configuserok eq 'ok') {
+ if ($switchserver) {
+ $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);
+ } elsif ($author_ok eq 'ok') {
+ my @allnew = @newlangs;
+ if ($addedfile ne '') {
+ push(@allnew,$addedfile);
+ }
+ 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});
+ if ($result eq 'ok') {
+ $loginhash{'login'}{'helpurl'}{$lang} = $newurl{$lang};
+ $changes{'helpurl'}{$lang} = 1;
+ } else {
+ my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);
+ $errors .= ''.$puberror.' ';
+ if ((grep(/^\Q$lang\E$/,@currlangs)) &&
+ (!grep(/^\Q$lang\E$/,@delurls))) {
+
+ $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};
+ }
+ }
+ }
+ } 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);
+ }
+ } else {
+ $error = &mt("Upload of custom log-in help file(s) failed because a Domain Configuration user ([_1]) could not be created in domain: [_2]. Error was: [_3].",$confname,$dom,$configuserok);
+ }
+ if ($error) {
+ &Apache::lonnet::logthis($error);
+ $errors .= ''.$error.' ';
+ }
+ }
+ &process_captcha('login',\%changes,$loginhash{'login'},$domconfig{'login'});
+
+ my $defaulthelpfile = '/adm/loginproblems.html';
+ my $defaulttext = &mt('Default in use');
+
my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
$dom);
if ($putresult eq 'ok') {
@@ -4464,6 +4897,68 @@ sub modify_login {
}
$resulttext .= '';
}
+ } elsif ($item eq 'helpurl') {
+ if (ref($changes{$item}) eq 'HASH') {
+ foreach my $lang (sort(keys(%{$changes{$item}}))) {
+ if (grep(/^\Q$lang\E$/,@delurls)) {
+ my ($chg,$link);
+ $link = &Apache::loncommon::modal_link($defaulthelpfile,$defaulttext,600,500);
+ if ($lang eq 'nolang') {
+ $chg = &mt('custom log-in help file removed for no preferred language; [_1]',$link);
+ } else {
+ $chg = &mt('custom log-in help file removed for specific language: [_1]; [_2]',$langchoices{$lang},$link);
+ }
+ $resulttext .= ''.$chg.' ';
+ } else {
+ my $chg;
+ if ($lang eq 'nolang') {
+ $chg = &mt('custom log-in help file for no preferred language');
+ } else {
+ $chg = &mt('custom log-in help file for specific language: [_1]',$langchoices{$lang});
+ }
+ $resulttext .= ''.&Apache::loncommon::modal_link(
+ $loginhash{'login'}{'helpurl'}{$lang}.
+ '?inhibitmenu=yes',$chg,600,500).
+ ' ';
+ }
+ }
+ }
+ } elsif ($item eq 'captcha') {
+ if (ref($loginhash{'login'}) eq 'HASH') {
+ my $chgtxt;
+ if ($loginhash{'login'}{$item} eq 'notused') {
+ $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');
+ } else {
+ my %captchas = &captcha_phrases();
+ if ($captchas{$loginhash{'login'}{$item}}) {
+ $chgtxt .= &mt("Validation for helpdesk form set to $captchas{$loginhash{'login'}{$item}}.");
+ } else {
+ $chgtxt .= &mt('Validation for helpdesk form set to unknown type.');
+ }
+ }
+ $resulttext .= ''.$chgtxt.' ';
+ }
+ } elsif ($item eq 'recaptchakeys') {
+ if (ref($loginhash{'login'}) eq 'HASH') {
+ my ($privkey,$pubkey);
+ if (ref($loginhash{'login'}{$item}) eq 'HASH') {
+ $pubkey = $loginhash{'login'}{$item}{'public'};
+ $privkey = $loginhash{'login'}{$item}{'private'};
+ }
+ my $chgtxt .= &mt('ReCAPTCHA keys changes').'';
+ if (!$pubkey) {
+ $chgtxt .= ''.&mt('Public key deleted').' ';
+ } else {
+ $chgtxt .= ''.&mt('Public key set to [_1]',$pubkey).' ';
+ }
+ if (!$privkey) {
+ $chgtxt .= ''.&mt('Private key deleted').' ';
+ } else {
+ $chgtxt .= ''.&mt('Private key set to [_1]',$pubkey).' ';
+ }
+ $chgtxt .= ' ';
+ $resulttext .= ''.$chgtxt.' ';
+ }
} else {
$resulttext .= ''.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").' ';
}
@@ -4908,15 +5403,17 @@ sub publishlogo {
# See if there is anything left
unless ($fname) { return ('error: no uploaded file'); }
$fname="$subdir/$fname";
- my $filepath=$r->dir_config('lonDocRoot')."/priv/$dom/$confname";
+ 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.'/'.$fnamepath);
+ my @parts=split(/\//,"$filepath/$relpath/$fnamepath");
my $count;
- for ($count=4;$count<=$#parts;$count++) {
+ for ($count=5;$count<=$#parts;$count++) {
$filepath.="/$parts[$count]";
if ((-e $filepath)!=1) {
mkdir($filepath,02770);
@@ -4963,7 +5460,6 @@ $env{'user.name'}.':'.$env{'user.domain'
close(FH);
chmod(0660, $source); # Permissions to rw-rw---.
- my $docroot=$r->dir_config('lonDocRoot');
my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;
my $copyfile=$targetdir.'/'.$file;
@@ -5086,7 +5582,7 @@ sub write_metadata {
print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
my $mfh;
if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
- foreach (sort keys %metadatafields) {
+ foreach (sort(keys(%metadatafields))) {
unless ($_=~/\./) {
my $unikey=$_;
$unikey=~/^([A-Za-z]+)/;
@@ -5170,7 +5666,7 @@ sub check_switchserver {
my @ids=&Apache::lonnet::current_machine_ids();
foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
if (!$allowed) {
- $switchserver=''.&mt('Switch Server').' ';
+ $switchserver=''.&mt('Switch Server').' ';
}
return $switchserver;
}
@@ -5191,6 +5687,9 @@ sub modify_quotas {
%titles = &courserequest_titles();
$toolregexp = join('|',@usertools);
%conditions = &courserequest_conditions();
+ } elsif ($context eq 'requestauthor') {
+ @usertools = ('author');
+ %titles = &authorrequest_titles();
} else {
@usertools = ('aboutme','blog','webdav','portfolio');
%titles = &tool_titles();
@@ -5208,6 +5707,10 @@ sub modify_quotas {
$confhash{$item}{$type} = $env{$key};
}
}
+ } elsif ($context eq 'requestauthor') {
+ if ($key =~ /^\Qform.authorreq_\E(.+)$/) {
+ $confhash{$1} = $env{$key};
+ }
} else {
if ($key =~ /^form\.quota_(.+)$/) {
$confhash{'defaultquota'}{$1} = $env{$key};
@@ -5217,7 +5720,7 @@ sub modify_quotas {
}
}
}
- if ($context eq 'requestcourses') {
+ if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
@approvalnotify = sort(@approvalnotify);
$confhash{'notify'}{'approval'} = join(',',@approvalnotify);
@@ -5253,6 +5756,11 @@ sub modify_quotas {
$confhash{$item}{$type} .= $limithash{$item}{$type};
}
}
+ } elsif ($context eq 'requestauthor') {
+ $unset = '0';
+ if ($type eq '_LC_adv') {
+ $unset = '';
+ }
} else {
if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
$confhash{$item}{$type} = 1;
@@ -5261,7 +5769,11 @@ sub modify_quotas {
}
}
if (ref($domconfig{$action}) eq 'HASH') {
- if (ref($domconfig{$action}{$item}) eq 'HASH') {
+ if ($action eq 'requestauthor') {
+ if ($domconfig{$action}{$type} ne $confhash{$type}) {
+ $changes{$type} = 1;
+ }
+ } elsif (ref($domconfig{$action}{$item}) eq 'HASH') {
if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {
$changes{$item}{$type} = 1;
}
@@ -5281,6 +5793,10 @@ sub modify_quotas {
if ($confhash{$item}{$type} ne $unset) {
$changes{$item}{$type} = 1;
}
+ } elsif ($context eq 'requestauthor') {
+ if ($confhash{$type} ne $unset) {
+ $changes{$type} = 1;
+ }
} else {
if (!$confhash{$item}{$type}) {
$changes{$item}{$type} = 1;
@@ -5289,7 +5805,7 @@ sub modify_quotas {
}
}
}
- unless ($context eq 'requestcourses') {
+ unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {
if (ref($domconfig{'quotas'}) eq 'HASH') {
if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {
@@ -5332,10 +5848,14 @@ sub modify_quotas {
}
}
- foreach my $key (keys(%confhash)) {
- $domdefaults{$key} = $confhash{$key};
+ if ($context eq 'requestauthor') {
+ $domdefaults{'requestauthor'} = \%confhash;
+ } else {
+ foreach my $key (keys(%confhash)) {
+ $domdefaults{$key} = $confhash{$key};
+ }
}
-
+
my %quotahash = (
$action => { %confhash }
);
@@ -5347,7 +5867,8 @@ sub modify_quotas {
&Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
$resulttext = &mt('Changes made:').'';
- unless ($context eq 'requestcourses') {
+ unless (($context eq 'requestcourses') ||
+ ($context eq 'requestauthor')) {
if (ref($changes{'defaultquota'}) eq 'HASH') {
$resulttext .= ''.&mt('Portfolio default quotas').'';
foreach my $type (@{$types},'default') {
@@ -5364,12 +5885,25 @@ sub modify_quotas {
}
my %newenv;
foreach my $item (@usertools) {
- if (ref($changes{$item}) eq 'HASH') {
+ my (%haschgs,%inconf);
+ if ($context eq 'requestauthor') {
+ %haschgs = %changes;
+ %inconf = %confhash;
+ } else {
+ if (ref($changes{$item}) eq 'HASH') {
+ %haschgs = %{$changes{$item}};
+ }
+ if (ref($confhash{$item}) eq 'HASH') {
+ %inconf = %{$confhash{$item}};
+ }
+ }
+ if (keys(%haschgs) > 0) {
my $newacc =
&Apache::lonnet::usertools_access($env{'user.name'},
$env{'user.domain'},
$item,'reload',$context);
- if ($context eq 'requestcourses') {
+ if (($context eq 'requestcourses') ||
+ ($context eq 'requestauthor')) {
if ($env{'environment.canrequest.'.$item} ne $newacc) {
$newenv{'environment.canrequest.'.$item} = $newacc;
}
@@ -5378,34 +5912,40 @@ sub modify_quotas {
$newenv{'environment.availabletools.'.$item} = $newacc;
}
}
- $resulttext .= ''.$titles{$item}.'';
+ unless ($context eq 'requestauthor') {
+ $resulttext .= ''.$titles{$item}.'';
+ }
foreach my $type (@{$types},'default','_LC_adv') {
- if ($changes{$item}{$type}) {
+ if ($haschgs{$type}) {
my $typetitle = $usertypes->{$type};
if ($type eq 'default') {
$typetitle = $othertitle;
} elsif ($type eq '_LC_adv') {
$typetitle = 'LON-CAPA Advanced Users';
}
- if ($confhash{$item}{$type}) {
+ if ($inconf{$type}) {
if ($context eq 'requestcourses') {
my $cond;
- if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) {
+ if ($inconf{$type} =~ /^autolimit=(\d*)$/) {
if ($1 eq '') {
$cond = &mt('(Automatic processing of any request).');
} else {
$cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);
}
} else {
- $cond = $conditions{$confhash{$item}{$type}};
+ $cond = $conditions{$inconf{$type}};
}
$resulttext .= ''.&mt('Set to be available to [_1].',$typetitle).' '.$cond.' ';
+ } elsif ($context eq 'requestauthor') {
+ $resulttext .= ''.&mt('Set to "[_1]" for "[_2]".',
+ $titles{$inconf{$type}},$typetitle);
+
} else {
$resulttext .= ' '.&mt('Set to be available to [_1]',$typetitle).' ';
}
} else {
if ($type eq '_LC_adv') {
- if ($confhash{$item}{$type} eq '0') {
+ if ($inconf{$type} eq '0') {
$resulttext .= ''.&mt('Set to be unavailable to [_1]',$typetitle).' ';
} else {
$resulttext .= ''.&mt('No override set for [_1]',$typetitle).' ';
@@ -5416,17 +5956,19 @@ sub modify_quotas {
}
}
}
- $resulttext .= ' ';
+ unless ($context eq 'requestauthor') {
+ $resulttext .= ' ';
+ }
}
}
- if ($action eq 'requestcourses') {
+ if (($action eq 'requestcourses') || ($action eq 'requestauthor')) {
if (ref($changes{'notify'}) eq 'HASH') {
if ($changes{'notify'}{'approval'}) {
if (ref($confhash{'notify'}) eq 'HASH') {
if ($confhash{'notify'}{'approval'}) {
$resulttext .= ''.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.' ';
} else {
- $resulttext .= ''.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').' ';
+ $resulttext .= ''.&mt('No Domain Coordinators will receive notification of requests requiring approval.').' ';
}
}
}
@@ -5439,6 +5981,8 @@ sub modify_quotas {
} else {
if ($context eq 'requestcourses') {
$resulttext = &mt('No changes made to rights to request creation of courses.');
+ } elsif ($context eq 'requestauthor') {
+ $resulttext = &mt('No changes made to rights to request author space.');
} else {
$resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');
}
@@ -5769,13 +6313,16 @@ sub modify_autocreate {
foreach my $item (@types) {
if ($changes{$item}) {
my $newtxt = $offon[$newvals{$item}];
- $resulttext .= ''.&mt("$title{$item} set to [_1]$newtxt [_2]",'',' ').' ';
+ $resulttext .= ''.
+ &mt("$title{$item} set to [_1]$newtxt [_2]",
+ '',' ').
+ ' ';
}
}
if ($changes{'xmldc'}) {
my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});
my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);
- $resulttext .= ''.&mt("$title{'xmldc'} set to [_1]$newtxt [_2]",'',' ').' ';
+ $resulttext .= ''.&mt("$title{'xmldc'} set to [_1]",''.$newtxt.' ').' ';
}
$resulttext .= ' ';
} else {
@@ -5921,7 +6468,11 @@ sub modify_directorysrch {
} else {
$chgtext =~ s/\; $//;
}
- $resulttext .= ' '.&mt("Users from domain '[_1] ' permitted to search the institutional directory set to: [_2]",$dom,$chgtext).' ';
+ $resulttext .=
+ ''.
+ &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",
+ ''.$dom.' ',$chgtext).
+ ' ';
}
}
}
@@ -5949,7 +6500,7 @@ sub modify_directorysrch {
}
}
$chgtext =~ s/\; $//;
- $resulttext .= ''.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).' ';
+ $resulttext .= ''.&mt($title{'searchtypes'}.' set to: "[_1]"',$chgtext).' ';
}
$resulttext .= ' ';
} else {
@@ -6133,6 +6684,7 @@ sub modify_usercreation {
}
push(@contexts,'statustocreate');
}
+ &process_captcha('cancreate',\%changes,\%cancreate,\%curr_usercreation);
if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
foreach my $item (@contexts) {
if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {
@@ -6315,7 +6867,7 @@ sub modify_usercreation {
my %lt = &usercreation_types();
foreach my $type (@{$changes{'cancreate'}}) {
my $chgtext;
- unless ($type eq 'statustocreate') {
+ unless (($type eq 'statustocreate') || ($type eq 'captcha') || ($type eq 'recaptchakeys')) {
$chgtext = $lt{$type}.', ';
}
if ($type eq 'selfcreate') {
@@ -6374,6 +6926,35 @@ sub modify_usercreation {
}
}
}
+ } elsif ($type eq 'captcha') {
+ if ($cancreate{$type} eq 'notused') {
+ $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.');
+ } else {
+ my %captchas = &captcha_phrases();
+ if ($captchas{$cancreate{$type}}) {
+ $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");
+ } else {
+ $chgtext .= &mt('Validation for self-creation screen set to unknown type.');
+ }
+ }
+ } elsif ($type eq 'recaptchakeys') {
+ my ($privkey,$pubkey);
+ if (ref($cancreate{$type}) eq 'HASH') {
+ $pubkey = $cancreate{$type}{'public'};
+ $privkey = $cancreate{$type}{'private'};
+ }
+ $chgtext .= &mt('ReCAPTCHA keys changes').'';
+ if (!$pubkey) {
+ $chgtext .= ''.&mt('Public key deleted').' ';
+ } else {
+ $chgtext .= ''.&mt('Public key set to [_1]',$pubkey).' ';
+ }
+ if (!$privkey) {
+ $chgtext .= ''.&mt('Private key deleted').' ';
+ } else {
+ $chgtext .= ''.&mt('Private key set to [_1]',$pubkey).' ';
+ }
+ $chgtext .= ' ';
} else {
if ($cancreate{$type} eq 'none') {
$chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
@@ -6473,6 +7054,59 @@ sub modify_usercreation {
return $resulttext;
}
+sub process_captcha {
+ my ($container,$changes,$newsettings,$current) = @_;
+ return unless ((ref($changes) eq 'HASH') && (ref($newsettings) eq 'HASH') || (ref($current) 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'}) {
+ if ($container eq 'cancreate') {
+ if (ref($changes->{'cancreate'}) eq 'ARRAY') {
+ push(@{$changes->{'cancreate'}},'captcha');
+ } elsif (!defined($changes->{'cancreate'})) {
+ $changes->{'cancreate'} = ['captcha'];
+ }
+ } else {
+ $changes->{'captcha'} = 1;
+ }
+ }
+ my ($newpub,$newpriv,$currpub,$currpriv);
+ if ($newsettings->{'captcha'} eq 'recaptcha') {
+ $newpub = $env{'form.'.$container.'_recaptchapub'};
+ $newpriv = $env{'form.'.$container.'_recaptchapriv'};
+ $newpub =~ s/\W//g;
+ $newpriv =~ s/\W//g;
+ $newsettings->{'recaptchakeys'} = {
+ public => $newpub,
+ private => $newpriv,
+ };
+ }
+ if (ref($current->{'recaptchakeys'}) eq 'HASH') {
+ $currpub = $current->{'recaptchakeys'}{'public'};
+ $currpriv = $current->{'recaptchakeys'}{'private'};
+ unless ($newsettings->{'captcha'} eq 'recaptcha') {
+ $newsettings->{'recaptchakeys'} = {
+ public => '',
+ private => '',
+ }
+ }
+ }
+ if (($newpub ne $currpub) || ($newpriv ne $currpriv)) {
+ if ($container eq 'cancreate') {
+ if (ref($changes->{'cancreate'}) eq 'ARRAY') {
+ push(@{$changes->{'cancreate'}},'recaptchakeys');
+ } elsif (!defined($changes->{'cancreate'})) {
+ $changes->{'cancreate'} = ['recaptchakeys'];
+ }
+ } else {
+ $changes->{'recaptchakeys'} = 1;
+ }
+ }
+ return;
+}
+
sub modify_usermodification {
my ($dom,%domconfig) = @_;
my ($resulttext,%curr_usermodification,%changes);
@@ -7129,122 +7763,56 @@ sub modify_serverstatuses {
sub modify_helpsettings {
my ($r,$dom,$confname,%domconfig) = @_;
- my ($resulttext,$errors,%changes,%helphash);
-
- my $customhelpfile = $env{'form.loginhelpurl.filename'};
- my $defaulthelpfile = 'defaulthelp.html';
- my $servadm = $r->dir_config('lonAdmEMail');
- my ($configuserok,$author_ok,$switchserver) =
- &config_check($dom,$confname,$servadm);
-
- my %defaultchecked = ('submitbugs' => 'on');
- my @offon = ('off','on');
- my %title = ( submitbugs => 'Display link for users to submit a bug',
- loginhelpurl => 'Unauthenticated login help page set to custom file');
-
+ my ($resulttext,$errors,%changes,%helphash);
+ my %defaultchecked = ('submitbugs' => 'on');
+ my @offon = ('off','on');
my @toggles = ('submitbugs');
-
- $helphash{'helpsettings'} = {};
-
- if (ref($domconfig{'helpsettings'}) ne 'HASH') {
- if ($domconfig{'helpsettings'} eq '') {
- $domconfig{'helpsettings'} = {};
- }
- }
-
if (ref($domconfig{'helpsettings'}) eq 'HASH') {
-
foreach my $item (@toggles) {
-
- if ($defaultchecked{$item} eq 'on') {
- if (($domconfig{'helpsettings'}{$item} eq '') &&
- ($env{'form.'.$item} eq '0')) {
- $changes{$item} = 1;
- } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
- $changes{$item} = 1;
- }
- } elsif ($defaultchecked{$item} eq 'off') {
- if (($domconfig{'helpsettings'}{$item} eq '') &&
- ($env{'form.'.$item} eq '1')) {
- $changes{$item} = 1;
- } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
- $changes{$item} = 1;
- }
- }
- $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
- }
-
- if ($customhelpfile ne '') {
- my $error;
- if ($configuserok eq 'ok') {
- if ($switchserver) {
- $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);
- } else {
- if ($author_ok eq 'ok') {
- my ($result,$loginhelpurl) =
- &publishlogo($r,'upload','loginhelpurl',$dom,
- $confname,'help','','',$customhelpfile);
- if ($result eq 'ok') {
- $helphash{'helpsettings'}{'loginhelpurl'} = $loginhelpurl;
- $changes{'loginhelpurl'} = 1;
- } else {
- $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customhelpfile,$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].",$customhelpfile,$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].",$customhelpfile,$confname,$dom,$configuserok);
- }
- if ($error) {
- &Apache::lonnet::logthis($error);
- $errors .= ''.$error.' ';
- }
- }
-
- if ($domconfig{'helpsettings'}{'loginhelpurl'} ne '') {
- if ($env{'form.loginhelpurl_del'}) {
- $helphash{'helpsettings'}{'loginhelpurl'} = '';
- $changes{'loginhelpurl'} = 1;
+ if ($defaultchecked{$item} eq 'on') {
+ if ($domconfig{'helpsettings'}{$item} eq '') {
+ if ($env{'form.'.$item} eq '0') {
+ $changes{$item} = 1;
+ }
+ } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
+ $changes{$item} = 1;
+ }
+ } elsif ($defaultchecked{$item} eq 'off') {
+ if ($domconfig{'helpsettings'}{$item} eq '') {
+ if ($env{'form.'.$item} eq '1') {
+ $changes{$item} = 1;
+ }
+ } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
+ $changes{$item} = 1;
+ }
+ }
+ if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {
+ $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
}
}
}
-
-
my $putresult;
-
if (keys(%changes) > 0) {
- $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
- } else {
- $putresult = 'ok';
- }
-
- if ($putresult eq 'ok') {
- if (keys(%changes) > 0) {
- $resulttext = &mt('Changes made:').'';
- foreach my $item (sort(keys(%changes))) {
- if ($item eq 'submitbugs') {
- $resulttext .= ''.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").' ';
- }
- if ($item eq 'loginhelpurl') {
- if ($helphash{'helpsettings'}{'loginhelpurl'} eq '') {
- $resulttext .= ''.&mt('[_1] help file removed; [_2] file will be used for the unathorized help page in this domain.',$customhelpfile,$defaulthelpfile).' ';
- } else {
- $resulttext .= ''.&mt("$title{$item} [_1]",$customhelpfile).' ';
- }
- }
- }
- $resulttext .= ' ';
- } else {
- $resulttext = &mt('No changes made to help settings');
- }
- } else {
- $resulttext = ''.
- &mt('An error occurred: [_1]',$putresult).' ';
+ $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
+ if ($putresult eq 'ok') {
+ $resulttext = &mt('Changes made:').'';
+ foreach my $item (sort(keys(%changes))) {
+ if ($item eq 'submitbugs') {
+ $resulttext .= ''.&mt('Display link to: [_1] set to "'.$offon[$env{'form.'.$item}].'".',
+ &Apache::loncommon::modal_link('http://bugs.loncapa.org',
+ &mt('LON-CAPA bug tracker'),600,500)).' ';
+ }
+ }
+ $resulttext .= ' ';
+ } else {
+ $resulttext = &mt('No changes made to help settings');
+ $errors .= ''.
+ &mt('An error occurred storing the settings: [_1]',
+ $putresult).' ';
+ }
}
if ($errors) {
- $resulttext .= &mt('The following errors occurred: ').''.
+ $resulttext .= ' '.&mt('The following errors occurred: ').'';
}
return $resulttext;
@@ -7609,186 +8177,192 @@ sub modify_loadbalancing {
my @sparestypes = ('primary','default');
my %typetitles = &sparestype_titles();
my $resulttext;
- if (keys(%servers) > 1) {
- my ($currbalancer,$currtargets,$currrules);
- if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
- $currbalancer = $domconfig{'loadbalancing'}{'lonhost'};
- $currtargets = $domconfig{'loadbalancing'}{'targets'};
- $currrules = $domconfig{'loadbalancing'}{'rules'};
- } else {
- ($currbalancer,$currtargets) =
- &Apache::lonnet::get_lonbalancer_config(\%servers);
- }
- my ($saveloadbalancing,%defaultshash,%changes);
- my ($alltypes,$othertypes,$titles) =
- &loadbalancing_titles($dom,$intdom,$usertypes,$types);
- my %ruletitles = &offloadtype_text();
- my $balancer = $env{'form.loadbalancing_lonhost'};
- if (!$servers{$balancer}) {
- undef($balancer);
- }
- if ($currbalancer ne $balancer) {
- $changes{'lonhost'} = 1;
- }
- $defaultshash{'loadbalancing'}{'lonhost'} = $balancer;
- if ($balancer ne '') {
- unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {
- $saveloadbalancing = 1;
+ my (%currbalancer,%currtargets,%currrules,%existing);
+ if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
+ %existing = %{$domconfig{'loadbalancing'}};
+ }
+ &get_loadbalancers_config(\%servers,\%existing,\%currbalancer,
+ \%currtargets,\%currrules);
+ my ($saveloadbalancing,%defaultshash,%changes);
+ my ($alltypes,$othertypes,$titles) =
+ &loadbalancing_titles($dom,$intdom,$usertypes,$types);
+ my %ruletitles = &offloadtype_text();
+ my @deletions = &Apache::loncommon::get_env_multiple('form.loadbalancing_delete');
+ for (my $i=0; $i<$env{'form.loadbalancing_total'}; $i++) {
+ my $balancer = $env{'form.loadbalancing_lonhost_'.$i};
+ if ($balancer eq '') {
+ next;
+ }
+ if (!exists($servers{$balancer})) {
+ if (exists($currbalancer{$balancer})) {
+ push(@{$changes{'delete'}},$balancer);
}
- foreach my $sparetype (@sparestypes) {
- my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$sparetype);
- my @offloadto;
- foreach my $target (@targets) {
- if (($servers{$target}) && ($target ne $balancer)) {
- if ($sparetype eq 'default') {
- if (ref($defaultshash{'loadbalancing'}{'targets'}{'primary'}) eq 'ARRAY') {
- next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{'targets'}{'primary'}}));
- }
- }
- unless(grep(/^\Q$target\E$/,@offloadto)) {
- push(@offloadto,$target);
+ next;
+ }
+ if ((@deletions > 0) && (grep(/^\Q$i\E$/,@deletions))) {
+ push(@{$changes{'delete'}},$balancer);
+ next;
+ }
+ if (!exists($currbalancer{$balancer})) {
+ push(@{$changes{'add'}},$balancer);
+ }
+ $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'} = [];
+ $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'default'} = [];
+ $defaultshash{'loadbalancing'}{$balancer}{'rules'} = {};
+ unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {
+ $saveloadbalancing = 1;
+ }
+ foreach my $sparetype (@sparestypes) {
+ my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$i.'_'.$sparetype);
+ my @offloadto;
+ foreach my $target (@targets) {
+ if (($servers{$target}) && ($target ne $balancer)) {
+ if ($sparetype eq 'default') {
+ if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}) eq 'ARRAY') {
+ next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}}));
}
}
- $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = \@offloadto;
+ unless(grep(/^\Q$target\E$/,@offloadto)) {
+ push(@offloadto,$target);
+ }
}
- }
- } else {
- foreach my $sparetype (@sparestypes) {
- $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = [];
+ $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;
}
}
- if (ref($currtargets) eq 'HASH') {
+ if (ref($currtargets{$balancer}) eq 'HASH') {
foreach my $sparetype (@sparestypes) {
- if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
- my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets->{$sparetype},$defaultshash{'loadbalancing'}{'targets'}{$sparetype});
+ if (ref($currtargets{$balancer}{$sparetype}) eq 'ARRAY') {
+ my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets{$balancer}{$sparetype},$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype});
if (@targetdiffs > 0) {
- $changes{'targets'} = 1;
+ $changes{'curr'}{$balancer}{'targets'} = 1;
}
- } elsif (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
- if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
- $changes{'targets'} = 1;
+ } elsif (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {
+ $changes{'curr'}{$balancer}{'targets'} = 1;
}
}
}
} else {
- foreach my $sparetype (@sparestypes) {
- if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
- if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
- $changes{'targets'} = 1;
+ if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {
+ foreach my $sparetype (@sparestypes) {
+ if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {
+ $changes{'curr'}{$balancer}{'targets'} = 1;
+ }
}
}
- }
+ }
}
my $ishomedom;
- if ($balancer ne '') {
- if (&Apache::lonnet::host_domain($balancer) eq $dom) {
- $ishomedom = 1;
- }
+ if (&Apache::lonnet::host_domain($balancer) eq $dom) {
+ $ishomedom = 1;
}
if (ref($alltypes) eq 'ARRAY') {
foreach my $type (@{$alltypes}) {
my $rule;
- if ($balancer ne '') {
- unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&
+ unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&
(!$ishomedom)) {
- $rule = $env{'form.loadbalancing_rules_'.$type};
- }
- if ($rule eq 'specific') {
- $rule = $env{'form.loadbalancing_singleserver_'.$type};
- }
+ $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};
+ }
+ if ($rule eq 'specific') {
+ $rule = $env{'form.loadbalancing_singleserver_'.$i.'_'.$type};
}
- $defaultshash{'loadbalancing'}{'rules'}{$type} = $rule;
- if (ref($currrules) eq 'HASH') {
- if ($rule ne $currrules->{$type}) {
- $changes{'rules'}{$type} = 1;
+ $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type} = $rule;
+ if (ref($currrules{$balancer}) eq 'HASH') {
+ if ($rule ne $currrules{$balancer}{$type}) {
+ $changes{'curr'}{$balancer}{'rules'}{$type} = 1;
}
} elsif ($rule ne '') {
- $changes{'rules'}{$type} = 1;
+ $changes{'curr'}{$balancer}{'rules'}{$type} = 1;
}
}
}
- my $nochgmsg = &mt('No changes made to Load Balancer settings.');
- if ((keys(%changes) > 0) || ($saveloadbalancing)) {
- my $putresult = &Apache::lonnet::put_dom('configuration',
- \%defaultshash,$dom);
- if ($putresult eq 'ok') {
- if (keys(%changes) > 0) {
- if ($changes{'lonhost'}) {
- if ($currbalancer ne '') {
- &Apache::lonnet::remote_devalidate_cache($currbalancer,'loadbalancing',$dom);
- }
- if ($balancer eq '') {
- $resulttext .= ''.&mt('Load Balancing with dedicated server discontinued').' ';
- } else {
- &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
- $resulttext .= ''.&mt('Dedicated Load Balancer server set to [_1]',$balancer);
- }
- } else {
+ }
+ my $nochgmsg = &mt('No changes made to Load Balancer settings.');
+ if ((keys(%changes) > 0) || ($saveloadbalancing)) {
+ unless (ref($defaultshash{'loadbalancing'}) eq 'HASH') {
+ $defaultshash{'loadbalancing'} = {};
+ }
+ my $putresult = &Apache::lonnet::put_dom('configuration',
+ \%defaultshash,$dom);
+
+ if ($putresult eq 'ok') {
+ if (keys(%changes) > 0) {
+ if (ref($changes{'delete'}) eq 'ARRAY') {
+ foreach my $balancer (sort(@{$changes{'delete'}})) {
+ $resulttext .= ' '.&mt('Load Balancing discontinued for: [_1]',$balancer).' ';
&Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
}
- if (($changes{'targets'}) && ($balancer ne '')) {
- my %offloadstr;
- foreach my $sparetype (@sparestypes) {
- if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
- if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
- $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}});
+ }
+ if (ref($changes{'add'}) eq 'ARRAY') {
+ foreach my $balancer (sort(@{$changes{'add'}})) {
+ $resulttext .= ''.&mt('Load Balancing enabled for: [_1]',$balancer);
+ }
+ }
+ if (ref($changes{'curr'}) eq 'HASH') {
+ foreach my $balancer (sort(keys(%{$changes{'curr'}}))) {
+ if (ref($changes{'curr'}{$balancer}) eq 'HASH') {
+ if ($changes{'curr'}{$balancer}{'targets'}) {
+ my %offloadstr;
+ foreach my $sparetype (@sparestypes) {
+ if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {
+ if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {
+ $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}});
+ }
+ }
}
- }
- }
- if (keys(%offloadstr) == 0) {
- $resulttext .= ' '.&mt("Servers to which Load Balance server offloads set to 'None', by default").' ';
- } else {
- my $showoffload;
- foreach my $sparetype (@sparestypes) {
- $showoffload .= ''.$typetitles{$sparetype}.' : ';
- if (defined($offloadstr{$sparetype})) {
- $showoffload .= $offloadstr{$sparetype};
+ if (keys(%offloadstr) == 0) {
+ $resulttext .= ''.&mt("Servers to which Load Balance server offloads set to 'None', by default").' ';
} else {
- $showoffload .= &mt('None');
+ my $showoffload;
+ foreach my $sparetype (@sparestypes) {
+ $showoffload .= ''.$typetitles{$sparetype}.' : ';
+ if (defined($offloadstr{$sparetype})) {
+ $showoffload .= $offloadstr{$sparetype};
+ } else {
+ $showoffload .= &mt('None');
+ }
+ $showoffload .= (' 'x3);
+ }
+ $resulttext .= ''.&mt('By default, Load Balancer: [_1] set to offload to - [_2]',$balancer,$showoffload).' ';
}
- $showoffload .= (' 'x3);
}
- $resulttext .= ''.&mt('By default, Load Balancer server set to offload to: [_1]',$showoffload).' ';
}
- }
- if ((ref($changes{'rules'}) eq 'HASH') && ($balancer ne '')) {
- if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
- foreach my $type (@{$alltypes}) {
- if ($changes{'rules'}{$type}) {
- my $rule = $defaultshash{'loadbalancing'}{'rules'}{$type};
- my $balancetext;
- if ($rule eq '') {
- $balancetext = $ruletitles{'default'};
- } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
- $balancetext = $ruletitles{$rule};
- } else {
- $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{'rules'}{$type});
+ if (ref($changes{'curr'}{$balancer}{'rules'}) eq 'HASH') {
+ if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
+ foreach my $type (@{$alltypes}) {
+ if ($changes{'curr'}{$balancer}{'rules'}{$type}) {
+ my $rule = $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type};
+ my $balancetext;
+ if ($rule eq '') {
+ $balancetext = $ruletitles{'default'};
+ } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
+ $balancetext = $ruletitles{$rule};
+ } else {
+ $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});
+ }
+ $resulttext .= ''.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).' ';
}
- $resulttext .= ''.&mt('Load Balancing for [_1] set to: [_2]',$titles->{$type},$balancetext).' ';
}
}
}
+ &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
}
- if ($resulttext ne '') {
- $resulttext = &mt('Changes made:').'';
- } else {
- $resulttext = $nochgmsg;
- }
+ }
+ if ($resulttext ne '') {
+ $resulttext = &mt('Changes made:').'';
} else {
$resulttext = $nochgmsg;
- if ($balancer ne '') {
- &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
- }
}
} else {
- $resulttext = ''.
- &mt('An error occurred: [_1]',$putresult).' ';
+ $resulttext = $nochgmsg;
}
} else {
- $resulttext = $nochgmsg;
+ $resulttext = ''.
+ &mt('An error occurred: [_1]',$putresult).' ';
}
} else {
- $resulttext = &mt('Load Balancing unavailable as this domain only has one server.');
+ $resulttext = $nochgmsg;
}
return $resulttext;
}
@@ -7893,6 +8467,7 @@ sub active_dc_picker {
' '.
&Apache::loncommon::plainname($dcname,$dcdom).
+ ' ('.$dcname.':'.$dcdom.')'.
'';
}
$datatable .= '
';
@@ -7944,7 +8519,7 @@ sub count_servers {
}
sub lonbalance_targets_js {
- my ($dom,$types,$servers) = @_;
+ my ($dom,$types,$servers,$settings) = @_;
my $select = &mt('Select');
my ($alltargets,$allishome,$allinsttypes,@alltypes);
if (ref($servers) eq 'HASH') {
@@ -7966,39 +8541,71 @@ sub lonbalance_targets_js {
}
push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');
$allinsttypes = join("','",@alltypes);
+ my (%currbalancer,%currtargets,%currrules,%existing);
+ if (ref($settings) eq 'HASH') {
+ %existing = %{$settings};
+ }
+ &get_loadbalancers_config($servers,\%existing,\%currbalancer,
+ \%currtargets,\%currrules);
+ my $balancers = join("','",sort(keys(%currbalancer)));
return <<"END";
+
+END
+
+}
+
+sub captcha_phrases {
+ return &Apache::lonlocal::texthash (
+ priv => 'Private key',
+ pub => 'Public key',
+ original => 'original (CAPTCHA)',
+ recaptcha => 'successor (ReCAPTCHA)',
+ notused => 'unused',
+ );
+}
+
1;