[LON-CAPA-cvs] cvs: loncom /interface lonpreferences.pm

raeburn raeburn at source.lon-capa.org
Wed Apr 24 17:15:48 EDT 2019


raeburn		Wed Apr 24 21:15:48 2019 EDT

  Modified files:              
    /loncom/interface	lonpreferences.pm 
  Log:
  - Rules for length and/or characters in a LON-CAPA password (internal auth)
    set in domain configuration enforced when user sets a new password.
  
  
Index: loncom/interface/lonpreferences.pm
diff -u loncom/interface/lonpreferences.pm:1.230 loncom/interface/lonpreferences.pm:1.231
--- loncom/interface/lonpreferences.pm:1.230	Wed Apr 24 21:12:44 2019
+++ loncom/interface/lonpreferences.pm	Wed Apr 24 21:15:48 2019
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.230 2019/04/24 21:12:44 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.231 2019/04/24 21:15:48 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1310,7 +1310,7 @@
                 );
                 return;
             }
-         } else {
+        } else {
             $r->print(
                 '<p class="LC_warning">'
                .&mt('Sorry, the URL generated when you requested reset of'
@@ -1619,7 +1619,7 @@
                          &mt('Please try again.').'</span>',$caller,$mailtoken);
             return 1;
         }
-    } 
+    }
     if ($newpass1 ne $newpass2) {
 	&passwordchanger($r,
 			 '<span class="LC_warning">'.
@@ -1627,12 +1627,84 @@
 			 &mt('Please try again.').'</span>',$caller,$mailtoken);
 	return 1;
     }
-    if (length($newpass1) < 7) {
-	&passwordchanger($r,
-			 '<span class="LC_warning">'.
-			 &mt('Passwords must be a minimum of 7 characters long.').'  '.
-			 &mt('Please try again.').'</span>',$caller,$mailtoken);
-	return 1;
+    if ($currentauth eq 'unix:') {
+        if (length($newpass1) < 7) {
+            &passwordchanger($r,
+                             '<span class="LC_warning">'.
+                             &mt('Passwords must be a minimum of 7 characters long.').'  '.
+                             &mt('Please try again.').'</span>',$caller,$mailtoken);
+            return 1;
+        }
+    } else {
+        my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
+        my ($min,$max, at chars, at brokerule);
+        if (ref($passwdconf{'chars'}) eq 'ARRAY') {
+            if ($passwdconf{'min'} =~ /^\d+$/) {
+                $min = $passwdconf{'min'};
+            }
+            if ($passwdconf{'max'} =~ /^\d+$/) {
+                $max = $passwdconf{'max'};
+            }
+            @chars = @{$passwdconf{'chars'}};
+        } else {
+            $min = 7;
+        }
+        if (($min) && (length($newpass1) < $min)) {
+            push(@brokerule,'min');
+        }
+        if (($max) && (length($newpass1) > $max)) {
+            push(@brokerule,'max');
+        }
+        if (@chars) {
+            my %rules;
+            map { $rules{$_} = 1; } @chars;
+            if ($rules{'uc'}) {
+                unless ($newpass1 =~ /[A-Z]/) {
+                    push(@brokerule,'uc');
+                }
+            }
+            if ($rules{'lc'}) {
+                unless ($newpass1 =~ /a-z/) {
+                    push(@brokerule,'lc');
+                }
+            }
+            if ($rules{'num'}) {
+                unless ($newpass1 =~ /\d/) {
+                    push(@brokerule,'num');
+                }
+            }
+            if ($rules{'spec'}) {
+                unless ($newpass1 =~ /[!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/) {
+                    push(@brokerule,'spec');
+                }
+            }
+        }
+        if (@brokerule) {
+            my %rulenames = &Apache::lonlocal::texthash(
+                uc   => 'At least one upper case letter',
+                lc   => 'At least one lower case letter',
+                num  => 'At least one number',
+                spec => 'At least one non-alphanumeric',
+            );
+            $rulenames{'uc'} .= ': ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+            $rulenames{'lc'} .= ': abcdefghijklmnopqrstuvwxyz';
+            $rulenames{'num'} .= ': 0123456789';
+            $rulenames{'spec'} .= ': !"\#$%&\'()*+,-./:;<=>?@[\]^_\`{|}~';
+            $rulenames{'min'} = &mt('Minimum password length: [_1]',$min);
+            $rulenames{'max'} = &mt('Maximum password length: [_1]',$max);
+            my $warning = &mt('Password did not satisfy the following:').'<ul>';
+            foreach my $rule ('min','max','uc','ls','num','spec') {
+                if (grep(/^$rule$/, at brokerule)) {
+                    $warning .= '<li>'.$rulenames{$rule}.'</li>';
+                }
+            }
+            $warning .= '</ul>';
+            &passwordchanger($r,'<span class="LC_warning">'.
+                            $warning.
+                            &mt('Please try again.').'</span>',
+                            $caller,$mailtoken);
+            return 1;
+        }
     }
     #
     # Check for bad characters




More information about the LON-CAPA-cvs mailing list