Diff for /loncom/interface/lonpreferences.pm between versions 1.196.4.26 and 1.231

version 1.196.4.26, 2020/02/09 05:36:27 version 1.231, 2019/04/24 21:15:48
Line 165  sub texenginechanger { Line 165  sub texenginechanger {
     my %mathchoices=('' => 'Default',      my %mathchoices=('' => 'Default',
      'tth' => 'tth (TeX to HTML)',       'tth' => 'tth (TeX to HTML)',
      #'ttm' => 'TeX to MathML',       #'ttm' => 'TeX to MathML',
                      'MathJax' => 'MathJax',       'MathJax' => 'MathJax',
      'mimetex' => 'mimetex (Convert to Images)',       'mimetex' => 'mimetex (Convert to Images)',
                      'raw' => 'Raw (Screen Reader)'                       'raw' => 'Raw (Screen Reader)'
                      );                       );
Line 182  sub texenginechanger { Line 182  sub texenginechanger {
       'change'   => 'Save',        'change'   => 'Save',
       'exmpl'    => 'Examples',        'exmpl'    => 'Examples',
       'mathjax'  => 'MathJax:',        'mathjax'  => 'MathJax:',
       'mathjaxinfo' =>  'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',        'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',
       'tth'      => 'tth (TeX to HTML):',        'tth'      => 'tth (TeX to HTML):',
       'mimetex'  => 'mimetex (Convert to Images):',        'mimetex'  => 'mimetex (Convert to Images):',
     );      );
Line 280  sub rolesprefchanger { Line 280  sub rolesprefchanger {
     my $hotlist_n=$userenv{'recentrolesn'};      my $hotlist_n=$userenv{'recentrolesn'};
     my ($checkedon,$checkedoff);      my ($checkedon,$checkedoff);
     if ($hotlist_flag) {      if ($hotlist_flag) {
         $checkedon = 'checked="checked"';    $checkedon = 'checked="checked"';
     } else {      } else {
         $checkedoff = 'checked="checked"';          $checkedoff = 'checked="checked"';
     }      }
Line 363  $options.' Line 363  $options.'
 &Apache::lonhtmlcommon::row_closure(1).  &Apache::lonhtmlcommon::row_closure(1).
 &Apache::lonhtmlcommon::end_pick_box().'  &Apache::lonhtmlcommon::end_pick_box().'
 </div>');  </div>');
     if ($roles_check_list) {      if ($roles_check_list) { 
         $r->print('<div class="LC_left_float">          $r->print('<div class="LC_left_float">
 <h4>'.&mt('Freeze Roles').'</h4>  <h4>'.&mt('Freeze Roles').'</h4>
 <p>'.&mt('The table below can be used to [_1]freeze[_2] '.$lc_role.'s in the Hotlist.','<q>','</q>').'<br />'.  <p>'.&mt('The table below can be used to [_1]freeze[_2] '.$lc_role.'s in the Hotlist.','<q>','</q>').'<br />'.
Line 683  sub verify_and_change_clicker { Line 683  sub verify_and_change_clicker {
     my $r = shift;      my $r = shift;
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
       my $uhome      = $env{'user.home'};
     my $newclickers  = $env{'form.clickers'};      my $newclickers  = $env{'form.clickers'};
       my $message;
     $newclickers=~s/[^\w\:\-]+/\,/gs;      $newclickers=~s/[^\w\:\-]+/\,/gs;
     $newclickers=~tr/a-z/A-Z/;      $newclickers=~tr/a-z/A-Z/;
     $newclickers=~s/[\:\-]+/\-/g;      $newclickers=~s/[\:\-]+/\-/g;
     $newclickers=~s/\,+/\,/g;      $newclickers=~s/\,+/\,/g;
     $newclickers=~s/^\,//;      $newclickers=~s/^\,//;
     $newclickers=~s/\,$//;      $newclickers=~s/\,$//;
     &Apache::lonnet::put('environment',{'clickers' => $newclickers});      my @oldclickers = split(/,/,$env{'environment.clickers'});
     &Apache::lonnet::appenv({'environment.clickers' => $newclickers});      my @newclickers = split(/,/,$newclickers);
     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));      my %newuniq;
       map { $newuniq{$_} = 1; }  @newclickers;
       @newclickers = sort(keys(%newuniq));
       my @differences = &Apache::loncommon::compare_arrays(\@oldclickers,\@newclickers);
       if (@differences) {
           my $putres = &Apache::lonnet::put('environment',{'clickers' => $newclickers});
           if ($putres eq 'ok') {
               my @adds = ();
               my @dels = ();
               foreach my $item (@differences) {
                   if (grep(/^\Q$item\E$/,@newclickers)) {
                       push(@adds,$item);
                   } else {
                       push(@dels,$item);
                   }
               }
               if (@dels) {
                    my %delclicker;
                    map { $delclicker{$_} = $user; } @dels;
                    my $putresult = &Apache::lonnet::iddel($domain,\%delclicker,$uhome,'clickers');
               }
               if (@adds) {
                    my %addclicker;
                    map { $addclicker{$_} = $user; } @adds;
                    my $putresult = &Apache::lonnet::updateclickers($domain,'add',\%addclicker,$uhome,1);
               }
               &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
               $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
           } else {
               $message=&Apache::lonhtmlcommon::confirm_success(&mt('Error saving clicker ID').1);
           }
       } else {
           $message='<span class="LC_info">'.&mt('Clicker information unchanged').'</span>';
       }
     $message=&Apache::loncommon::confirmwrapper($message);      $message=&Apache::loncommon::confirmwrapper($message);
     &print_main_menu($r, $message);      &print_main_menu($r, $message);
 }  }
Line 1142  sub colorschanger { Line 1177  sub colorschanger {
     foreach my $item (sort(keys(%colortypes))) {      foreach my $item (sort(keys(%colortypes))) {
        my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);         my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
        $chtable.=&Apache::loncommon::start_data_table_row().         $chtable.=&Apache::loncommon::start_data_table_row().
                  '<td>'.$colortypes{$item}.'<td><input name="'.$item.     '<td>'.$colortypes{$item}.'<td><input name="'.$item.
                  '" class="colorchooser"  size="10" value="'.$curcol.          '" class="colorchooser"  size="10" value="'.$curcol.
                  '" /></td>'.  '" /></td>'.
          &Apache::loncommon::end_data_table_row()."\n";      &Apache::loncommon::end_data_table_row()."\n";
     }      }
     my $end_data_table = &Apache::loncommon::end_data_table();      my $end_data_table = &Apache::loncommon::end_data_table();
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
Line 1197  sub verify_and_change_colors { Line 1232  sub verify_and_change_colors {
     my $message='';      my $message='';
     foreach my $item (keys(%colortypes)) {      foreach my $item (keys(%colortypes)) {
         my $color=$env{'form.'.$item};          my $color=$env{'form.'.$item};
         if (!($color =~ /^#/)) {   if (!($color =~ /^#/)) {
             $color = '#' . $color;      $color = '#' . $color;
         }   }
         my $entry='color.'.$function.'.'.$item;          my $entry='color.'.$function.'.'.$item;
  if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {   if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
     &Apache::lonnet::put('environment',{$entry => $color});      &Apache::lonnet::put('environment',{$entry => $color});
Line 1238  sub passwordchanger { Line 1273  sub passwordchanger {
         $r->print(Apache::loncommon::start_page('Personal Data'));          $r->print(Apache::loncommon::start_page('Personal Data'));
         $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));          $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));
     }      }
       my ($blocked,$blocktext) =
           &Apache::loncommon::blocking_status('passwd');
       if ($blocked) {
           $r->print('<p class="LC_warning">'.$blocktext.'</p>');
           return;
       }
     if ((!defined($caller)) || ($caller eq 'preferences')) {      if ((!defined($caller)) || ($caller eq 'preferences')) {
         $user = $env{'user.name'};          $user = $env{'user.name'};
         $domain = $env{'user.domain'};          $domain = $env{'user.domain'};
         if (!defined($caller)) {          if (!defined($caller)) {
             $caller = 'preferences';              $caller = 'preferences';
         }          }
         my ($blocked,$blocktext) =  
             &Apache::loncommon::blocking_status('passwd');  
         if ($blocked) {  
             $r->print('<p class="LC_warning">'.$blocktext.'</p>');  
             return;  
         }  
     } elsif ($caller eq 'reset_by_email') {      } elsif ($caller eq 'reset_by_email') {
         my %data = &Apache::lonnet::tmpget($mailtoken);          my %data = &Apache::lonnet::tmpget($mailtoken);
         if (keys(%data) == 0) {          if (keys(%data) == 0) {
Line 1266  sub passwordchanger { Line 1301  sub passwordchanger {
                 $user = $data{'username'};                  $user = $data{'username'};
                 $domain = $data{'domain'};                  $domain = $data{'domain'};
                 $currentpass = $data{'temppasswd'};                  $currentpass = $data{'temppasswd'};
                 my ($blocked,$blocktext) =  
                     &Apache::loncommon::blocking_status('passwd',$user,$domain);  
                 if ($blocked) {  
                     $r->print('<p class="LC_warning">'.$blocktext.'</p>');  
                     return;  
                 }  
             } else {              } else {
                 $r->print(                  $r->print(
                     '<p class="LC_warning">'                      '<p class="LC_warning">'
Line 1284  sub passwordchanger { Line 1313  sub passwordchanger {
         } else {          } else {
             $r->print(              $r->print(
                 '<p class="LC_warning">'                  '<p class="LC_warning">'
                 .&mt('Sorry, the URL generated when you requested reset of'                 .&mt('Sorry, the URL generated when you requested reset of'
                     .' your password contained incomplete information.')                     .' your password contained incomplete information.')
                 .'</p>'                 .'</p>'
             );              );
             return;              return;
         }          }
Line 1331  sub passwordchanger { Line 1360  sub passwordchanger {
  my $jsh=Apache::File->new($include."/londes.js");   my $jsh=Apache::File->new($include."/londes.js");
  $r->print(<$jsh>);   $r->print(<$jsh>);
     }      }
     $r->print(&jscript_send($caller,$domain,$currentauth,$extrafields));      $r->print(&jscript_send($caller,$extrafields));
     $r->print(<<ENDFORM);      $r->print(<<ENDFORM);
 $errormessage  $errormessage
   
Line 1348  ENDFORM Line 1377  ENDFORM
 }  }
   
 sub jscript_send {  sub jscript_send {
     my ($caller,$domain,$currentauth,$extrafields) = @_;      my ($caller,$extrafields) = @_;
     my ($min,$max,$rulestr,$numrules);  
     $min = $Apache::lonnet::passwdmin;  
     my %js_lt = &Apache::lonlocal::texthash(  
               uc => 'New password needs at least one upper case letter',  
               lc => 'New password needs at least one lower case letter',  
               num => 'New password needs at least one number',  
               spec => 'New password needs at least one non-alphanumeric',  
               blank1 => 'Empty Password field',  
               blank2 => 'Empty Confirm Password field',  
               mismatch => 'Contents of Password and Confirm Password fields must match',  
               fail => 'Please fix the following:',  
     );  
     &js_escape(\%js_lt);  
     if ($currentauth eq 'internal:') {  
         if ($domain ne '') {  
             my %passwdconf = &Apache::lonnet::get_passwdconf($domain);  
             if (keys(%passwdconf)) {  
                 if ($passwdconf{min}) {  
                     $min = $passwdconf{min};  
                 }  
                 if ($passwdconf{max}) {  
                     $max = $passwdconf{max};  
                     $js_lt{'long'} = &js_escape(&mt('Maximum password length: [_1]',$max));  
                 }  
                 if (ref($passwdconf{chars}) eq 'ARRAY') {  
                     if (@{$passwdconf{chars}}) {  
                         $rulestr =  join('","',@{$passwdconf{chars}});  
                         $numrules = scalar(@{$passwdconf{chars}});  
                     }  
                 }  
             }  
         }  
     }  
     $js_lt{'short'} = &js_escape(&mt('Minimum password length: [_1]',$min));  
   
     my $passwdcheck = <<"ENDJS";  
         var errors = new Array();  
         var min = parseInt("$min") || 0;  
         var currauth = "$currentauth";  
         if (this.document.client.elements.newpass_1.value == '') {  
             errors.push("$js_lt{'blank1'}");  
         }  
         if (this.document.client.elements.newpass_2.value == '') {  
             errors.push("$js_lt{'blank2'}");  
         }  
         if (errors.length == 0) {  
             if (this.document.client.elements.newpass_1.value !=  this.document.client.elements.newpass_2.value) {  
                 errors.push("$js_lt{'mismatch'}");  
             }  
             var posspass = this.document.client.elements.newpass_1.value;  
             if (min > 0) {  
                 if (posspass.length < min) {  
                     errors.push("$js_lt{'short'}");   
                 }  
             }  
             if (currauth == 'internal:') {  
                 var max = parseInt("$max") || 0;  
                 if (max > 0) {  
                     if (posspass.length > max) {  
                         errors.push("$js_lt{'long'}");  
                     }  
                 }  
                 var numrules = parseInt("$numrules") || 0;  
                 if (numrules > 0) {  
                     var rules = new Array("$rulestr");  
                     for (var i=0; i<rules.length; i++) {  
                         if (rules[i] == 'uc') {  
                             if (!posspass.match(/[A-Z]/)) {  
                                 errors.push("$js_lt{'uc'}");  
                             }  
                         } else if (rules[i] == 'lc') {  
                             if (!posspass.match(/[a-z]/)) {  
                                 errors.push("$js_lt{'lc'}");  
                             }  
                         } else if (rules[i] == 'num') {  
                             if (!posspass.match(/\\d/)) {  
                                 errors.push("$js_lt{'num'}");  
                             }  
                         } else if (rules[i] == 'spec') {  
                             var pattern = /^[!@#$%^&*()_+\\-=\\[\\]{};':"\\\|,.<a>\\/?]/;  
                             if (!posspass.match(pattern)) {  
                                 errors.push("$js_lt{'spec'}");   
                             }  
                         }  
                     }  
                 }  
             }  
         }  
         if (errors.length > 0) {  
             alert("$js_lt{'fail'}"+"\\n\\n"+errors.join("\\n"));  
             return;  
         }  
 ENDJS  
     my $output = qq|      my $output = qq|
 <script type="text/javascript" language="JavaScript">  <script type="text/javascript" language="JavaScript">
   
     function send() {      function send() {
 $passwdcheck  
         uextkey=this.document.client.elements.ukey_cpass.value;          uextkey=this.document.client.elements.ukey_cpass.value;
         lextkey=this.document.client.elements.lkey_cpass.value;          lextkey=this.document.client.elements.lkey_cpass.value;
         initkeys();          initkeys();
Line 1473  $passwdcheck Line 1408  $passwdcheck
 |;  |;
         }          }
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'email'})) {          if ((ref($extrafields) eq 'HASH') && ($extrafields->{'email'})) {
             $output .= qq|              $output .= qq| 
         this.document.pserver.elements.email.value =          this.document.pserver.elements.email.value =
                    this.document.client.elements.email.value;                     this.document.client.elements.email.value;
 |;  |;
Line 1509  sub client_form { Line 1444  sub client_form {
                       .&Apache::lonhtmlcommon::row_closure();                        .&Apache::lonhtmlcommon::row_closure();
         }          }
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'username'})) {          if ((ref($extrafields) eq 'HASH') && ($extrafields->{'username'})) {
             $output .= &Apache::lonhtmlcommon::row_title(              $output .= &Apache::lonhtmlcommon::row_title(  
                        '<label for="uname">'.$lt{'username'}.'</label>')                         '<label for="uname">'.$lt{'username'}.'</label>')
                       .'<input type="text" name="uname" size="20" autocapitalize="off" autocorrect="off" />'                        .'<input type="text" name="uname" size="20" autocapitalize="off" autocorrect="off" />'
                       .&Apache::lonhtmlcommon::row_closure()                        .&Apache::lonhtmlcommon::row_closure()
Line 1587  sub server_form { Line 1522  sub server_form {
 }  }
   
 sub verify_and_change_password {  sub verify_and_change_password {
     my ($r,$caller,$mailtoken,$timelimit,$extrafields,$ended) = @_;      my ($r,$caller,$mailtoken,$ended) = @_;
     my ($user,$domain,$homeserver);      my ($user,$domain,$homeserver);
       my ($blocked,$blocktext) =
           &Apache::loncommon::blocking_status('passwd');
       if ($blocked) {
           $r->print('<p class="LC_warning">'.$blocktext.'</p>');
           return;
       }
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $user       = $env{'form.uname'};          $user       = $env{'form.uname'};
         $domain     = $env{'form.udom'};          $domain     = $env{'form.udom'};
Line 1597  sub verify_and_change_password { Line 1538  sub verify_and_change_password {
             if ($homeserver eq 'no_host') {              if ($homeserver eq 'no_host') {
         &passwordchanger($r,"<p>\n<span class='LC_error'>".          &passwordchanger($r,"<p>\n<span class='LC_error'>".
                          &mt("Invalid username and/or domain")."</span>\n</p>",                           &mt("Invalid username and/or domain")."</span>\n</p>",
                          $caller,$mailtoken,$timelimit,$extrafields);                           $caller,$mailtoken);
                 return 'no_host';                  return 1;
             }              }
         } else {          } else {
             &passwordchanger($r,"<p>\n<span class='LC_error'>".              &passwordchanger($r,"<p>\n<span class='LC_error'>".
                              &mt("Username and domain were blank")."</span>\n</p>",                               &mt("Username and domain were blank")."</span>\n</p>",
                              $caller,$mailtoken,$timelimit,$extrafields);                               $caller,$mailtoken);
             return 'missingdata';              return 1;
         }          }
     } else {      } else {
         $user       = $env{'user.name'};          $user       = $env{'user.name'};
         $domain     = $env{'user.domain'};          $domain     = $env{'user.domain'};
         $homeserver = $env{'user.home'};          $homeserver = $env{'user.home'};
     }      }
     my ($blocked,$blocktext) =  
         &Apache::loncommon::blocking_status('passwd',$user,$domain);  
     if ($blocked) {  
         $r->print('<p class="LC_warning">'.$blocktext.'</p>');  
         if ($caller eq 'reset_by_email') {  
             return 'blocked';  
         } else {  
             return;  
         }  
     }  
     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);      my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
     # Check for authentication types that allow changing of the password.      # Check for authentication types that allow changing of the password.
     if ($currentauth !~ /^(unix|internal):/) {      if ($currentauth !~ /^(unix|internal):/) {
Line 1628  sub verify_and_change_password { Line 1559  sub verify_and_change_password {
             &passwordchanger($r,"<p>\n<span class='LC_error'>".              &passwordchanger($r,"<p>\n<span class='LC_error'>".
                              &mt("Authentication type for this user can not be changed by this mechanism").                               &mt("Authentication type for this user can not be changed by this mechanism").
                              "</span>\n</p>",                               "</span>\n</p>",
                               $caller,$mailtoken,$timelimit,$extrafields);                                $caller,$mailtoken);
             return 'otherauth';              return 1;
         } else {          } else {
             return;              return;
         }          }
Line 1645  sub verify_and_change_password { Line 1576  sub verify_and_change_password {
     defined($newpass2)    ){      defined($newpass2)    ){
  &passwordchanger($r,"<p>\n<span class='LC_error'>".   &passwordchanger($r,"<p>\n<span class='LC_error'>".
  &mt("One or more password fields were blank").   &mt("One or more password fields were blank").
                          "</span>\n</p>",$caller,$mailtoken,$timelimit,$extrafields);                           "</span>\n</p>",$caller,$mailtoken);
         if ($caller eq 'reset_by_email') {   return;
             return 'missingdata';  
         } else {  
             return;  
         }  
     }      }
     # Get the keys      # Get the keys
     my $lonhost = $r->dir_config('lonHostID');      my $lonhost = $r->dir_config('lonHostID');
Line 1668  sub verify_and_change_password { Line 1595  sub verify_and_change_password {
 </p>  </p>
 ENDERROR  ENDERROR
         # Probably should log an error here          # Probably should log an error here
         if ($caller eq 'reset_by_email') {          return 1;
             return 'internalerror';  
         } else {  
             return;  
         }  
     }      }
     my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);      my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
     #      #
Line 1686  ENDERROR Line 1609  ENDERROR
             &passwordchanger($r,              &passwordchanger($r,
                          '<span class="LC_error">'.                           '<span class="LC_error">'.
                          &mt('Could not verify current authentication.').'  '.                           &mt('Could not verify current authentication.').'  '.
                          &mt('Please try again.').'</span>',$caller,$mailtoken,$timelimit,$extrafields);                           &mt('Please try again.').'</span>',$caller,$mailtoken);
             return 'emptydata';              return 1;
         }          }
         if ($currentpass ne $data{'temppasswd'}) {          if ($currentpass ne $data{'temppasswd'}) {
             &passwordchanger($r,              &passwordchanger($r,
                          '<span class="LC_error">'.                           '<span class="LC_error">'.
                          &mt('Could not verify current authentication.').'  '.                           &mt('Could not verify current authentication.').'  '.
                          &mt('Please try again.').'</span>',$caller,$mailtoken,$timelimit,$extrafields);                           &mt('Please try again.').'</span>',$caller,$mailtoken);
             return 'missingtemp';              return 1;
         }          }
     }      }
     if ($newpass1 ne $newpass2) {      if ($newpass1 ne $newpass2) {
  &passwordchanger($r,   &passwordchanger($r,
  '<span class="LC_warning">'.   '<span class="LC_warning">'.
  &mt('The new passwords you entered do not match.').'  '.   &mt('The new passwords you entered do not match.').'  '.
  &mt('Please try again.').'</span>',$caller,$mailtoken,$timelimit,$extrafields);   &mt('Please try again.').'</span>',$caller,$mailtoken);
         if ($caller eq 'reset_by_email') {   return 1;
             return 'mismatch';  
         } else {  
             return;  
         }  
     }      }
     if ($currentauth eq 'unix:') {      if ($currentauth eq 'unix:') {
         if (length($newpass1) < 7) {          if (length($newpass1) < 7) {
             &passwordchanger($r,              &passwordchanger($r,
                              '<span class="LC_warning">'.                               '<span class="LC_warning">'.
                              &mt('Passwords must be a minimum of 7 characters long.').'  '.                               &mt('Passwords must be a minimum of 7 characters long.').'  '.
                              &mt('Please try again.').'</span>',$caller,$mailtoken,$timelimit,$extrafields);                               &mt('Please try again.').'</span>',$caller,$mailtoken);
             if ($caller eq 'reset_by_email') {              return 1;
                 return 'length';  
             } else {  
                 return;  
             }  
         }          }
     } else {      } else {
         my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1);          my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
         if ($warning) {          my ($min,$max,@chars,@brokerule);
     &passwordchanger($r,'<span class="LC_warning">'.          if (ref($passwdconf{'chars'}) eq 'ARRAY') {
                              $warning.              if ($passwdconf{'min'} =~ /^\d+$/) {
      &mt('Please try again.').'</span>',                  $min = $passwdconf{'min'};
                              $caller,$mailtoken,$timelimit,$extrafields);  
             if ($caller eq 'reset_by_email') {  
                 return 'rules';  
             } else {  
                 return;  
             }              }
               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'} .= ': !&quot;\#$%&amp;\'()*+,-./:;&lt;=&gt;?@[\]^_\`{|}~';
               $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$/,@brokerule)) {
                       $warning .= '<li>'.$rulenames{$rule}.'</li>';
                   }
               }
               $warning .= '</ul>';
               &passwordchanger($r,'<span class="LC_warning">'.
                               $warning.
                               &mt('Please try again.').'</span>',
                               $caller,$mailtoken);
               return 1;
         }          }
     }      }
     #      #
Line 1751  ENDERROR Line 1723  ENDERROR
 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~  ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
 </pre></span>  </pre></span>
 ENDERROR  ENDERROR
         &passwordchanger($r,$errormessage,$caller,$mailtoken,$timelimit,$extrafields);          &passwordchanger($r,$errormessage,$caller,$mailtoken);
         if ($caller eq 'reset_by_email') {          return 1;
             return 'badchars';  
         } else {  
             return;  
         }  
     }      }
     #       # 
     # Change the password (finally)      # Change the password (finally)
Line 1779  ENDERROR Line 1747  ENDERROR
  # error error: run in circles, scream and shout   # error error: run in circles, scream and shout
         if ($caller eq 'reset_by_email') {          if ($caller eq 'reset_by_email') {
             if (!$result) {              if (!$result) {
                 return 'error';                  return 1;
             } else {              } else {
                 return $result;                  return $result;
             }              }
         } else {          } else {
             my $feedback;  
             if ($result eq 'prioruse') {  
                 $feedback = &mt('Please enter a password that you have not used recently.');  
             } else {  
                 $feedback = &mt('Please make sure your old password was entered correctly.');  
             }  
             $message = &Apache::lonhtmlcommon::confirm_success(              $message = &Apache::lonhtmlcommon::confirm_success(
                 &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.$feedback,1);                  &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.&mt('Please make sure your old password was entered correctly.'),1);
             $message=&Apache::loncommon::confirmwrapper($message);              $message=&Apache::loncommon::confirmwrapper($message);
             &print_main_menu($r, $message);              &print_main_menu($r, $message);
             if (ref($ended)) {              if (ref($ended)) {
Line 2294  push(@{ $menu[0]->{items} }, { Line 2256  push(@{ $menu[0]->{items} }, {
  linktitle => 'Change your password.',   linktitle => 'Change your password.',
  });   });
     }      }
     if ($env{'environment.remote'} eq 'off') {  
 push(@{ $menu[1]->{items} }, {  
         linktext => 'Launch Remote Control',  
         url => '/adm/remote?url=/adm/preferences&amp;action=launch',  
         permission => 'F',  
         #help => '',  
         icon => 'remotecontrol.png',  
         linktitle => 'Launch the remote control for LON-CAPA.',  
         });  
     }else{  
 push(@{ $menu[1]->{items} }, {  
         linktext => 'Collapse Remote Control',  
         url => '/adm/remote?url=/adm/preferences&amp;action=collapse',  
         permission => 'F',  
         #help => '',  
         icon => 'remotecontrol.png',  
         linktitle => 'Collapse the remote control for LON-CAPA.',  
         });  
     }  
   
     if (&can_toggle_namelocking()) {      if (&can_toggle_namelocking()) {
         push(@{ $menu[0]->{items} }, {          push(@{ $menu[0]->{items} }, {
Line 2418  sub handler { Line 2361  sub handler {
     } else {      } else {
         $brlink ='/adm/preferences';          $brlink ='/adm/preferences';
         $brtxt = 'Set User Preferences';          $brtxt = 'Set User Preferences';
         $brhelp = 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display';          $brhelp = 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display';   
     }      }
     Apache::lonhtmlcommon::add_breadcrumb      Apache::lonhtmlcommon::add_breadcrumb
         ({href => $brlink,          ({href => $brlink,
           text => $brtxt,            text => $brtxt,
           help => $brhelp,});            help => $brhelp,});
     if(!exists $env{'form.action'}) {      if(!exists $env{'form.action'}) {
     &print_main_menu($r);   &print_main_menu($r);
             $ended = 1;          $ended = 1;
     }elsif($env{'form.action'} eq 'changepass'){      }elsif($env{'form.action'} eq 'changepass'){
         &passwordchanger($r);          &passwordchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_pass'){      }elsif($env{'form.action'} eq 'verify_and_change_pass'){
         &verify_and_change_password($r,'preferences','','','',\$ended);          &verify_and_change_password($r,'preferences','',\$ended);
     }elsif($env{'form.action'} eq 'changescreenname'){      }elsif($env{'form.action'} eq 'changescreenname'){
         &screennamechanger($r);          &screennamechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_screenname'){      }elsif($env{'form.action'} eq 'verify_and_change_screenname'){

Removed from v.1.196.4.26  
changed lines
  Added in v.1.231


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>