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

version 1.196.4.26, 2020/02/09 05:36:27 version 1.226, 2018/04/27 21:39:42
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 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 1226  sub verify_and_change_colors { Line 1263  sub verify_and_change_colors {
 #            password handler subroutines            #  #            password handler subroutines            #
 ######################################################  ######################################################
 sub passwordchanger {  sub passwordchanger {
     my ($r,$errormessage,$caller,$mailtoken,$timelimit,$extrafields) = @_;      my ($r,$errormessage,$caller,$mailtoken) = @_;
     # 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 || '');
Line 1238  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');  
         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'} < 7200) {
                 $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',$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 1331  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));
     $r->print(<<ENDFORM);      $r->print(<<ENDFORM);
 $errormessage  $errormessage
   
Line 1340  $errormessage Line 1371  $errormessage
      ensure that unencrypted passwords will not be sent out by a       ensure that unencrypted passwords will not be sent out by a
      crappy browser -->       crappy browser -->
 ENDFORM  ENDFORM
     $r->print(&server_form($logtoken,$caller,$mailtoken,$extrafields));      $r->print(&server_form($logtoken,$caller,$mailtoken));
     $r->print(&client_form($caller,\%hexkey,$currentpass,$domain,$extrafields));      $r->print(&client_form($caller,\%hexkey,$currentpass,$domain));
   
     #      #
     return;      return;
 }  }
   
 sub jscript_send {  sub jscript_send {
     my ($caller,$domain,$currentauth,$extrafields) = @_;      my ($caller) = @_;
     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 1464  $passwdcheck Line 1401  $passwdcheck
             =getCrypted(this.document.client.elements.newpass_2.value);              =getCrypted(this.document.client.elements.newpass_2.value);
 |;  |;
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'username'})) {          $output .= qq|
             $output .= qq|  
         this.document.pserver.elements.uname.value =          this.document.pserver.elements.uname.value =
                    this.document.client.elements.uname.value;                     this.document.client.elements.uname.value;
         this.document.pserver.elements.udom.value =          this.document.pserver.elements.udom.value =
                    this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;                     this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;
 |;  
         }  
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'email'})) {  
             $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;
 |;  |;
         }  
     }      }
     $ output .= qq|      $ output .= qq|
         this.document.pserver.submit();          this.document.pserver.submit();
Line 1488  $passwdcheck Line 1419  $passwdcheck
 }  }
   
 sub client_form {  sub client_form {
     my ($caller,$hexkey,$currentpass,$defdom,$extrafields) = @_;      my ($caller,$hexkey,$currentpass,$defdom) = @_;
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                 'email' => 'E-mail Address',                  'email' => 'E-mail Address',
                 'username' => 'Username',                  'username' => 'Username',
Line 1502  sub client_form { Line 1433  sub client_form {
     my $output = '<form name="client" action="">'      my $output = '<form name="client" action="">'
                 .&Apache::lonhtmlcommon::start_pick_box();                  .&Apache::lonhtmlcommon::start_pick_box();
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'email'})) {          my $mobileargs;
             $output .= &Apache::lonhtmlcommon::row_title(          (undef,undef,undef,undef,undef,undef,my $clientmobile) =
                        '<label for="email">'.$lt{'email'}.'</label>')              &Apache::loncommon::decode_user_agent();
                       .'<input type="text" name="email" size="30" autocapitalize="off" autocorrect="off" />'          if ($clientmobile) {
                       .&Apache::lonhtmlcommon::row_closure();              $mobileargs = 'autocapitalize="off" autocorrect="off" ';
         }          }
         if ((ref($extrafields) eq 'HASH') && ($extrafields->{'username'})) {          $output .= &Apache::lonhtmlcommon::row_title(
             $output .= &Apache::lonhtmlcommon::row_title(                         '<label for="email">'.$lt{'email'}.'</label>')
                     .'<input type="text" name="email" size="30" '.$mobileargs.'/>'
                     .&Apache::lonhtmlcommon::row_closure()
                     .&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" '.$mobileargs.'/>'
                       .&Apache::lonhtmlcommon::row_closure()                    .'<input type="hidden" name="currentpass" value="'.$currentpass.'" />'
                       .&Apache::lonhtmlcommon::row_title(                    .&Apache::lonhtmlcommon::row_closure()
                     .&Apache::lonhtmlcommon::row_title(
                        '<label for="udom">'.$lt{'domain'}.'</label>')                         '<label for="udom">'.$lt{'domain'}.'</label>')
                       .&Apache::loncommon::select_dom_form($defdom,'udom')                    .&Apache::loncommon::select_dom_form($defdom,'udom')
                       .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
         }  
     } else {      } else {
         $output .= &Apache::lonhtmlcommon::row_title(          $output .= &Apache::lonhtmlcommon::row_title(
                        '<label for="currentpass">'.$lt{'currentpass'}.'</label>')                         '<label for="currentpass">'.$lt{'currentpass'}.'</label>')
Line 1533  sub client_form { Line 1467  sub client_form {
               .'<input type="password" name="newpass_2" size="20" />'                .'<input type="password" name="newpass_2" size="20" />'
               .&Apache::lonhtmlcommon::row_closure(1)                .&Apache::lonhtmlcommon::row_closure(1)
               .&Apache::lonhtmlcommon::end_pick_box();                .&Apache::lonhtmlcommon::end_pick_box();
     if ($caller eq 'reset_by_email') {  
         $output .= '<input type="hidden" name="currentpass" value="'.$currentpass.'" />';  
     }  
     $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onclick="send();" /></p>'      $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onclick="send();" /></p>'
               .qq|                .qq|
 <input type="hidden" name="ukey_cpass"  value="$hexkey->{'ukey_cpass'}" />  <input type="hidden" name="ukey_cpass"  value="$hexkey->{'ukey_cpass'}" />
Line 1551  sub client_form { Line 1482  sub client_form {
 }  }
   
 sub server_form {  sub server_form {
     my ($logtoken,$caller,$mailtoken,$extrafields) = @_;      my ($logtoken,$caller,$mailtoken) = @_;
     my $action = '/adm/preferences';      my $action = '/adm/preferences';
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $action = '/adm/resetpw';          $action = '/adm/resetpw';
Line 1562  sub server_form { Line 1493  sub server_form {
 <input type="hidden" name="currentpass" value="" />  <input type="hidden" name="currentpass" value="" />
 <input type="hidden" name="newpass_1"   value="" />  <input type="hidden" name="newpass_1"   value="" />
 <input type="hidden" name="newpass_2"   value="" />  <input type="hidden" name="newpass_2"   value="" />
 |;      |;
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $output .=  qq|          $output .=  qq|
 <input type="hidden" name="token"   value="$mailtoken" />  <input type="hidden" name="token"   value="$mailtoken" />
 |;  
        if ((ref($extrafields) eq 'HASH') && ($extrafields->{'username'})) {  
            $output .=  qq|  
 <input type="hidden" name="uname"   value="" />  <input type="hidden" name="uname"   value="" />
 <input type="hidden" name="udom"   value="" />  <input type="hidden" name="udom"   value="" />
 |;  
        }  
        if ((ref($extrafields) eq 'HASH') && ($extrafields->{'email'})) {  
            $output .=  qq|  
 <input type="hidden" name="email"   value="" />  <input type="hidden" name="email"   value="" />
   
 |;  |;
        }  
     }      }
     $output .= qq|      $output .= qq|
 <input type="hidden" name="action" value="verify_and_change_pass" />  <input type="hidden" name="action" value="verify_and_change_pass" />
Line 1587  sub server_form { Line 1511  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 1527  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 1548  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 1565  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 1584  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 1598  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 1751  ENDERROR Line 1640  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 1664  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 2173  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 2278  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 2454  sub handler { Line 2314  sub handler {
         &wysiwygchanger($r);          &wysiwygchanger($r);
     }elsif($env{'form.action'} eq 'set_wysiwyg'){      }elsif($env{'form.action'} eq 'set_wysiwyg'){
         &verify_and_change_wysiwyg($r);          &verify_and_change_wysiwyg($r);
         $ended = 1;  
     }elsif($env{'form.action'} eq 'changediscussions'){      }elsif($env{'form.action'} eq 'changediscussions'){
         &discussionchanger($r);          &discussionchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_discussion'){      }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
Line 2469  sub handler { Line 2328  sub handler {
         &texenginechanger($r);          &texenginechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_texengine'){      }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
         &verify_and_change_texengine($r);          &verify_and_change_texengine($r);
         $ended = 1;  
     }elsif($env{'form.action'} eq 'changeicons'){      }elsif($env{'form.action'} eq 'changeicons'){
         &iconchanger($r);          &iconchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_icons'){      }elsif($env{'form.action'} eq 'verify_and_change_icons'){
Line 2479  sub handler { Line 2337  sub handler {
         &clickerchanger($r);          &clickerchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_clicker'){      }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
         &verify_and_change_clicker($r);          &verify_and_change_clicker($r);
         $ended = 1;  
     }elsif($env{'form.action'} eq 'changedomcoord'){      }elsif($env{'form.action'} eq 'changedomcoord'){
         &domcoordchanger($r);          &domcoordchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){      }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
Line 2498  sub handler { Line 2355  sub handler {
         &author_space_settings($r);          &author_space_settings($r);
     }elsif($env{'form.action'} eq 'change_authoring_settings'){      }elsif($env{'form.action'} eq 'change_authoring_settings'){
         &change_authoring_settings($r);          &change_authoring_settings($r);
         $ended = 1;  
     }elsif($env{'form.action'} eq 'debugtoggle'){      }elsif($env{'form.action'} eq 'debugtoggle'){
         if (&can_toggle_debug()) {          if (&can_toggle_debug()) {
             &toggle_debug();              &toggle_debug();

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


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