Diff for /loncom/interface/lonpreferences.pm between versions 1.196.4.29 and 1.228

version 1.196.4.29, 2024/07/04 23:13:07 version 1.228, 2019/04/24 01:44:30
Line 27 Line 27
 #  #
 # This package uses the "londes.js" javascript code.   # This package uses the "londes.js" javascript code. 
 #  #
   # TODOs that have to be completed:
   #    interface with lonnet to change the password
     
 package Apache::lonpreferences;  package Apache::lonpreferences;
   
Line 165  sub texenginechanger { Line 167  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 184  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 282  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 365  $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 627  sub icon_options { Line 629  sub icon_options {
 }  }
   
 sub icon_previews {  sub icon_previews {
      my %icon_text = &Apache::lonlocal::texthash (       my %icon_text = (
                       annotate => 'Notes',                        annotate => 'Notes',
                       wishlist => 'Stored Links',                        wishlist => 'Stored Links',
                       catalog  => 'Info',                        catalog  => 'Info',
Line 636  sub icon_previews { Line 638  sub icon_previews {
                       printout => 'Print',                        printout => 'Print',
                      );                       );
     my %inlinetools = (      my %inlinetools = (
         printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&".&mt('Prepare a printable document'),          printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document",
         wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&".&mt('Save a link for this resource in your personal Stored Links repository'),          wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository",
         evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&".&mt('Provide my evaluation of this resource'),          evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource",
         feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&".&mt('Provide feedback messages or contribute to the course discussion about this resource'),          feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource",
         annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&".&mt('Make notes and annotations about this resource'),          annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&Make notes and annotations about this resource",
         catalog  => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&".&mt('Show Metadata'),          catalog  => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&Show Metadata",
     );      );
     my @toolsorder = qw(annotate wishlist evaluate feedback printout catalog);      my @toolsorder = qw(annotate wishlist evaluate feedback printout catalog);
     return (\%inlinetools,\@toolsorder);      return (\%inlinetools,\@toolsorder);
Line 683  sub verify_and_change_clicker { Line 685  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 1179  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 1234  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 1230  sub passwordchanger { Line 1267  sub passwordchanger {
     # This function is a bit of a mess....      # This function is a bit of a mess....
     # Passwords are encrypted using londes.js (DES encryption)      # Passwords are encrypted using londes.js (DES encryption)
     $errormessage = ($errormessage || '');      $errormessage = ($errormessage || '');
     my ($user,$domain,$currentpass,$clientip);      my ($user,$domain,$currentpass);
     $clientip = &Apache::lonnet::get_requestor_ip($r);  
     &Apache::lonhtmlcommon::add_breadcrumb(      &Apache::lonhtmlcommon::add_breadcrumb(
  { href => '/adm/preferences?action=changepass',   { href => '/adm/preferences?action=changepass',
                   text => 'Change Password'});                    text => 'Change Password'});
Line 1239  sub passwordchanger { Line 1275  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',$clientip);  
         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) {
             $r->print(                  $r->print(
                 '<p class="LC_warning">'                      '<p class="LC_warning">'
                .&mt('Sorry, the URL you provided to complete the reset of your password was invalid. Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a [_1]new request[_2] for a password reset, and follow the link to the new URL included in the e-mail that will be sent to you, to allow you to enter a new password.'                     .&mt('Sorry, the URL you provided to complete the reset of your password was invalid. Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a [_1]new request[_2] for a password reset, and follow the link to the new URL included in the e-mail that will be sent to you, to allow you to enter a new password.'
                    ,'<a href="/adm/resetpw">','</a>')                         ,'<a href="/adm/resetpw">','</a>')
                .'</p>'                     .'</p>'
             );                  );
             return;                  return;
         }              }
         if (defined($data{time})) {              if (defined($data{time})) {
             if (time - $data{'time'} < $timelimit) {                  if (time - $data{'time'} < $timelimit) {
                 $user = $data{'username'};                      $user = $data{'username'};
                 $domain = $data{'domain'};                      $domain = $data{'domain'};
                 $currentpass = $data{'temppasswd'};                      $currentpass = $data{'temppasswd'};
                 my ($blocked,$blocktext) =                  } else {
                     &Apache::loncommon::blocking_status('passwd',$clientip,$user,$domain);                      $r->print(
                 if ($blocked) {                          '<p class="LC_warning">'
                     $r->print('<p class="LC_warning">'.$blocktext.'</p>');                         .&mt('Sorry, the token generated when you requested'
                              .' a password reset has expired.')
                          .'</p>'
                       );
                     return;                      return;
                 }                  }
             } else {              } else {
                 $r->print(                  $r->print(
                     '<p class="LC_warning">'                      '<p class="LC_warning">'
                    .&mt('Sorry, the token generated when you requested'                     .&mt('Sorry, the URL generated when you requested reset of'
                        .' a password reset has expired.')                         .' your password contained incomplete information.')
                    .'</p>'                     .'</p>'
                 );                  );
                 return;                  return;
             }              }
         } else {              if (&Apache::lonnet::domain($domain) eq '') {
             $r->print(                  $domain = $r->dir_config('lonDefDomain');
                 '<p class="LC_warning">'              }
                 .&mt('Sorry, the URL generated when you requested reset of'  
                     .' your password contained incomplete information.')  
                 .'</p>'  
             );  
             return;  
         }  
         if (&Apache::lonnet::domain($domain) eq '') {  
             $domain = $r->dir_config('lonDefDomain');  
         }  
     } else {      } else {
         $r->print(          $r->print(
             '<p class="LC_error">'              '<p class="LC_error">'
Line 1332  sub passwordchanger { Line 1362  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 1349  ENDFORM Line 1379  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 1474  $passwdcheck Line 1410  $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 1510  sub client_form { Line 1446  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 1588  sub server_form { Line 1524  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,$clientip);      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 1598  sub verify_and_change_password { Line 1540  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'};
     }      }
     $clientip = &Apache::lonnet::get_requestor_ip($r);  
     my ($blocked,$blocktext) =  
         &Apache::loncommon::blocking_status('passwd',$clientip,$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 1630  sub verify_and_change_password { Line 1561  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 1647  sub verify_and_change_password { Line 1578  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 1670  sub verify_and_change_password { Line 1597  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 1688  ENDERROR Line 1611  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 (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);
                              &mt('Please try again.').'</span>',$caller,$mailtoken,$timelimit,$extrafields);   return 1;
             if ($caller eq 'reset_by_email') {  
                 return 'length';  
             } else {  
                 return;  
             }  
         }  
     } else {  
         my $warning = &Apache::loncommon::check_passwd_rules($domain,$newpass1);  
         if ($warning) {  
     &passwordchanger($r,'<span class="LC_warning">'.  
                              $warning.  
      &mt('Please try again.').'</span>',  
                              $caller,$mailtoken,$timelimit,$extrafields);  
             if ($caller eq 'reset_by_email') {  
                 return 'rules';  
             } else {  
                 return;  
             }  
         }  
     }      }
     #      #
     # Check for bad characters      # Check for bad characters
Line 1753  ENDERROR Line 1653  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 1781  ENDERROR Line 1677  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 2094  sub change_authoring_settings { Line 1984  sub change_authoring_settings {
   
 sub lockednameschanger {  sub lockednameschanger {
     my $r = shift;      my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
               {   href => '/adm/preferences?action=changelockednames',
                   text => 'Automatic name changes'});
       $r->print(Apache::loncommon::start_page('Automatic name changes'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));
     my %userenv = &Apache::lonnet::get('environment',['lockedname']);      my %userenv = &Apache::lonnet::get('environment',['lockedname']);
     my $lockedname='';      my $lockedname='';
     my $ended;  
     if (&can_toggle_namelocking()) {      if (&can_toggle_namelocking()) {
         if ($userenv{'lockedname'}) {          if ($userenv{'lockedname'}) {
             $lockedname = ' checked="checked"';              $lockedname = ' checked="checked"';
Line 2114  sub lockednameschanger { Line 2008  sub lockednameschanger {
             }              }
         }          }
         if (keys(%updateable)) {          if (keys(%updateable)) {
             &Apache::lonhtmlcommon::add_breadcrumb(  
                 {   href => '/adm/preferences?action=changelockednames',  
                     text => 'Automatic name changes'});  
             $r->print(Apache::loncommon::start_page('Automatic name changes'));  
             $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));  
             my %longnames = &Apache::lonlocal::texthash (              my %longnames = &Apache::lonlocal::texthash (
                                 firstname  => 'First Name',                                  firstname  => 'First Name',
                                 middlename => 'Middle Name',                                  middlename => 'Middle Name',
Line 2145  ENDSCREEN Line 2034  ENDSCREEN
         } else {          } else {
             my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');              my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');
             &print_main_menu($r,$message);              &print_main_menu($r,$message);
             $ended = 1;  
         }          }
     } else {      } else {
         my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');          my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');
         &print_main_menu($r,$message);          &print_main_menu($r,$message);
         $ended = 1;  
     }      }
     return $ended;  
 }  }
   
 sub verify_and_change_lockednames {  sub verify_and_change_lockednames {
Line 2300  push(@{ $menu[0]->{items} }, { Line 2186  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 2424  sub handler { Line 2291  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'){
Line 2512  sub handler { Line 2379  sub handler {
  &print_main_menu($r);   &print_main_menu($r);
         $ended = 1;          $ended = 1;
     } elsif ($env{'form.action'} eq 'changelockednames') {      } elsif ($env{'form.action'} eq 'changelockednames') {
         $ended = &lockednameschanger($r);          &lockednameschanger($r);
     } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {      } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {
         &verify_and_change_lockednames($r);          &verify_and_change_lockednames($r);
         $ended = 1;          $ended = 1;

Removed from v.1.196.4.29  
changed lines
  Added in v.1.228


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