';
-
- }
-
- return $datatable;
-
+ ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
+ \%choices,$itemcount);
+ return $datatable;
}
-
sub radiobutton_prefs {
my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;
return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&
(ref($choices) eq 'HASH'));
- my (%checkedon,%checkedoff,$datatable,$css_class);
+ my (%checkedon,%checkedoff,$datatable,$css_class,$cell_colspan);
foreach my $item (@{$toggles}) {
if ($defaultchecked->{$item} eq 'on') {
@@ -3266,18 +3291,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');
@@ -3329,6 +3356,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";
+ foreach my $option ('original','recaptcha','notused') {
+ $output .= '';
+ unless ($option eq 'notused') {
+ $output .= (' 'x2)."\n";
+ }
+ }
+#
+# Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:
+# https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple
+# servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)
+# specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.
+#
+ $output .= '
';
+ return $output;
+}
+
sub user_formats_row {
my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
my $output;
@@ -3503,6 +3588,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') {
@@ -3518,6 +3609,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 (
@@ -4293,9 +4395,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++) {
@@ -4425,13 +4531,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}})) {
@@ -4439,7 +4545,6 @@ sub modify_login {
}
}
}
- my %loginhash;
($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
\%domconfig,\%loginhash);
my @toggles = ('coursecatalog','adminmail','newuser');
@@ -4512,7 +4617,6 @@ sub modify_login {
$new = '';
}
}
-
$loginhash{login}{loginvia}{$lonhost}{$item} = $new;
}
}
@@ -4538,6 +4642,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') {
@@ -4603,6 +4797,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 .= '
';
+ 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 .= '