--- loncom/interface/domainprefs.pm 2019/08/21 20:31:37 1.160.6.98 +++ loncom/interface/domainprefs.pm 2019/08/25 14:35:21 1.160.6.99 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.98 2019/08/21 20:31:37 raeburn Exp $ +# $Id: domainprefs.pm,v 1.160.6.99 2019/08/25 14:35:21 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -4341,6 +4341,7 @@ sub print_passwords { } } elsif ($position eq 'lower') { my ($min,$max,%chars,$numsaved); + $min = $Apache::lonnet::passwdmin; if (ref($settings) eq 'HASH') { if ($settings->{min}) { $min = $settings->{min}; @@ -4354,8 +4355,6 @@ sub print_passwords { if ($settings->{numsaved}) { $numsaved = $settings->{numsaved}; } - } else { - $min = '7'; } my %rulenames = &Apache::lonlocal::texthash( uc => 'At least one upper case letter', @@ -4366,14 +4365,16 @@ sub print_passwords { $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''.$titles{'min'}.''. ''. - ''. - ' '.&mt('(Leave blank for no minimum)').''. + ''. + ' '.&mt('(Enter an integer: 7 or larger)').''. ''; $itemcount ++; $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''.$titles{'max'}.''. ''. - ''. + ''. ' '.&mt('(Leave blank for no maximum)').''. ''; $itemcount ++; @@ -4413,7 +4414,8 @@ sub print_passwords { $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''.$titles{'numsaved'}.''. ''. - ''. + ''. ' '.&mt('(Leave blank to not save previous passwords)').''. ''; } else { @@ -7135,16 +7137,22 @@ ENDSCRIPT } sub passwords_javascript { - my $intauthcheck = &mt('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.'); - my $intauthcost = &mt('Warning: bcrypt encryption cost for internal authentication must be an integer.'); - &js_escape(\$intauthcheck); - &js_escape(\$intauthcost); + 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).', + ); + &js_escape(\%intalert); + my $defmin = $Apache::lonnet::passwdmin; my $intauthjs = <<"ENDSCRIPT"; function warnIntAuth(field) { if (field.name == 'intauth_check') { if (field.value == '2') { - alert('$intauthcheck'); + alert('$intalert{authcheck}'); } } if (field.name == 'intauth_cost') { @@ -7152,7 +7160,60 @@ function warnIntAuth(field) { if (field.value != '') { var regexdigit=/^\\d+\$/; if (!regexdigit.test(field.value)) { - alert('$intauthcost'); + alert('$intalert{authcost}'); + } + } + } + return; +} + +function warnIntPass(field) { + field.value.replace(/^\s+/,''); + field.value.replace(/\s+\$/,''); + var regexdigit=/^\\d+\$/; + if (field.name == 'passwords_min') { + if (field.value == '') { + alert('$intalert{passmin}'); + field.value = '$defmin'; + } else { + if (!regexdigit.test(field.value)) { + alert('$intalert{passmin}'); + field.value = '$defmin'; + } + var minval = parseInt(field.value,10); + if (minval < $defmin) { + alert('$intalert{passmin}'); + field.value = '$defmin'; + } + } + } else { + if (field.value == '0') { + field.value = ''; + } + if (field.value != '') { + if (field.name == 'passwords_expire') { + var regexpposnum=/^\\d+(|\\.\\d*)\$/; + if (!regexpposnum.test(field.value)) { + alert('$intalert{passexp}'); + field.value = ''; + } else { + var expval = parseFloat(field.value); + if (expval == 0) { + alert('$intalert{passexp}'); + field.value = ''; + } + } + } else { + if (!regexdigit.test(field.value)) { + if (field.name == 'passwords_max') { + alert('$intalert{passmax}'); + } else { + if (field.name == 'passwords_numsaved') { + alert('$intalert{passnum}'); + } + } + } + field.value = ''; } } } @@ -10575,8 +10636,8 @@ sub modify_passwords { 'intauth_cost' => 10, 'intauth_check' => 0, 'intauth_switch' => 0, - 'min' => 7, ); + $staticdefaults{'min'} = $Apache::lonnet::passwdmin; foreach my $type (@oktypes) { $staticdefaults{'resetpostlink'}{$type} = ['email','username']; } @@ -10756,7 +10817,18 @@ sub modify_passwords { } foreach my $rule ('min','max','numsaved') { $env{'form.passwords_'.$rule} =~ s/^\s+|\s+$//g; - if ($env{'form.passwords_'.$rule} =~ /^\d+$/) { + my $ruleok; + if ($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}) { @@ -10963,7 +11035,8 @@ sub modify_passwords { if ($confighash{'passwords'}{$rule} eq '') { if ($rule eq 'min') { $resulttext .= '
  • '.&mt('[_1] not set.',$titles{$rule}); - ' '.&mt('Default of 7 will be used').'
  • '; + ' '.&mt('Default of [_1] will be used', + $Apache::lonnet::passwdmin).''; } else { $resulttext .= '
  • '.&mt('[_1] set to none',$titles{$rule}).'
  • '; }