Diff for /loncom/interface/lonuserutils.pm between versions 1.196 and 1.203

version 1.196, 2019/05/04 19:57:29 version 1.203, 2019/08/26 00:15:57
Line 656  sub passwd_validation_js { Line 656  sub passwd_validation_js {
     my %passwdconf = &Apache::lonnet::get_passwdconf($domain);      my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
     my ($min,$max,@chars,$numrules,$intargjs,%alert);      my ($min,$max,@chars,$numrules,$intargjs,%alert);
     $numrules = 0;      $numrules = 0;
       $min = $Apache::lonnet::passwdmin;
     if (ref($passwdconf{'chars'}) eq 'ARRAY') {      if (ref($passwdconf{'chars'}) eq 'ARRAY') {
         if ($passwdconf{'min'} =~ /^\d+$/) {          if ($passwdconf{'min'} =~ /^\d+$/) {
             $min = $passwdconf{'min'};              if ($passwdconf{'min'} > $min) {
             $numrules ++;                  $min = $passwdconf{'min'};
               }
         }          }
         if ($passwdconf{'max'} =~ /^\d+$/) {          if ($passwdconf{'max'} =~ /^\d+$/) {
             $max = $passwdconf{'max'};              $max = $passwdconf{'max'};
Line 669  sub passwd_validation_js { Line 671  sub passwd_validation_js {
         if (@chars) {          if (@chars) {
             $numrules ++;              $numrules ++;
         }          }
     } else {      }
         $min = 7;      if ($min > 0) {
         $numrules ++;          $numrules ++;
     }      }
     if (($min ne '') || ($max ne '') || (@chars > 0)) {      if (($min > 0) || ($max ne '') || (@chars > 0)) {
         my $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';          my $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
         if ($min) {          if ($min) {
             $alert{'min'} = &mt('minimum [quant,_1,character]',$min).'\n';              $alert{'min'} = &mt('minimum [quant,_1,character]',$min).'\n';
Line 750  sub passwd_validation_js { Line 752  sub passwd_validation_js {
                 }                  }
                 if ($rules{'spec'}) {                  if ($rules{'spec'}) {
                      $intargjs .= q|                       $intargjs .= q|
             var specRegExp = /[!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{\|}~]/;              var specRegExp = /[!"#$%&'()*+,\-.\/:;<=>?@[\\^\]_`{\|}~]/;
             if (!specRegExp.test(currpwval)) {              if (!specRegExp.test(currpwval)) {
                 brokerules.push('spec');                  brokerules.push('spec');
             }              }
Line 773  sub passwd_validation_js { Line 775  sub passwd_validation_js {
             if (rulesmsg != '') {              if (rulesmsg != '') {
                 rulesmsg = '$alertmsg'+rulesmsg;                  rulesmsg = '$alertmsg'+rulesmsg;
                 alert(rulesmsg);                  alert(rulesmsg);
                 return;                  return false;
             }              }
 |;  |;
     }      }
Line 2433  sub build_user_record { Line 2435  sub build_user_record {
   
 sub courses_selector {  sub courses_selector {
     my ($cdom,$formname) = @_;      my ($cdom,$formname) = @_;
     my %coursecodes = ();  
     my %codes = ();      my %codes = ();
     my @codetitles = ();      my @codetitles = ();
     my %cat_titles = ();      my %cat_titles = ();
Line 2446  sub courses_selector { Line 2447  sub courses_selector {
     my $jscript = '';      my $jscript = '';
   
     my $totcodes = 0;      my $totcodes = 0;
     $totcodes =      my $instcats = &Apache::lonnet::get_dom_instcats($cdom);
         &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,      if (ref($instcats) eq 'HASH') {
                                                       $cdom,$totcodes);          if ((ref($instcats->{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') &&
     if ($totcodes > 0) {              (ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) {
         $format_reply =              %codes = %{$instcats->{'codes'}};
              &Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes,              @codetitles = @{$instcats->{'codetitles'}};
                                 \%codes,\@codetitles,\%cat_titles,\%cat_order);              %cat_titles = %{$instcats->{'cat_titles'}};
         if ($format_reply eq 'ok') {              %cat_order = %{$instcats->{'cat_order'}};
               $totcodes = scalar(keys(%codes));
             my $numtypes = @codetitles;              my $numtypes = @codetitles;
             &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);              &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
             my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles);              my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles);
Line 4251  sub print_first_users_upload_form { Line 4253  sub print_first_users_upload_form {
            .&Apache::lonhtmlcommon::end_pick_box();             .&Apache::lonhtmlcommon::end_pick_box();
   
     $str .= '<p>'      $str .= '<p>'
            .'<input type="submit" name="fileupload" value="'.&mt('Next').'"'             .'<input type="button" name="fileupload" value="'.&mt('Next').'"'
            .' onclick="javascript:checkUpload(this.form);" />'             .' onclick="javascript:checkUpload(this.form);" />'
            .'</p>';             .'</p>';
   
Line 4377  sub upfile_drop_add { Line 4379  sub upfile_drop_add {
     }      }
     my $amode  = '';      my $amode  = '';
     my $genpwd = '';      my $genpwd = '';
       my @genpwdfail;
     if ($env{'form.login'} eq 'krb') {      if ($env{'form.login'} eq 'krb') {
         $amode='krb';          $amode='krb';
         $amode.=$env{'form.krbver'};          $amode.=$env{'form.krbver'};
Line 4385  sub upfile_drop_add { Line 4388  sub upfile_drop_add {
         $amode='internal';          $amode='internal';
         if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) {          if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) {
             $genpwd=$env{'form.intarg'};              $genpwd=$env{'form.intarg'};
               @genpwdfail =
                   &Apache::loncommon::check_passwd_rules($domain,$genpwd);
         }          }
     } elsif ($env{'form.login'} eq 'loc') {      } elsif ($env{'form.login'} eq 'loc') {
         $amode='localauth';          $amode='localauth';
Line 4465  sub upfile_drop_add { Line 4470  sub upfile_drop_add {
                                                   \@statuses,\@poss_roles);                                                    \@statuses,\@poss_roles);
                 &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,                  &gather_userinfo($context,'view',\%userlist,$indexhash,\%info,
                              \%cstr_roles,$permission);                               \%cstr_roles,$permission);
   
             }              }
         }          }
     }      }
Line 4543  sub upfile_drop_add { Line 4547  sub upfile_drop_add {
         my $newuserdom = $env{'request.role.domain'};          my $newuserdom = $env{'request.role.domain'};
         map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes);          map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes);
         # Get new users list          # Get new users list
         my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname);          my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname,
               %showpasswdrules,$haspasswdmap);
         my $counter = -1;          my $counter = -1;
         my (%willtrust,%trustchecked);          my (%willtrust,%trustchecked);
         foreach my $line (@userdata) {          foreach my $line (@userdata) {
Line 4694  sub upfile_drop_add { Line 4699  sub upfile_drop_add {
                         }                          }
                     }                      }
                     # determine user password                      # determine user password
                     my $password = $genpwd;                      my $password;
                       my $passwdfromfile;
                     if (defined($fields{'ipwd'})) {                      if (defined($fields{'ipwd'})) {
                         if ($entries{$fields{'ipwd'}}) {                          if ($entries{$fields{'ipwd'}}) {
                             $password=$entries{$fields{'ipwd'}};                              $password=$entries{$fields{'ipwd'}};
                               $passwdfromfile = 1;
                               if ($env{'form.login'} eq 'int') {
                                   my $uhome=&Apache::lonnet::homeserver($username,$userdomain);
                                   if (($uhome eq 'no_host') || ($changeauth)) {
                                       my @brokepwdrules =
                                           &Apache::loncommon::check_passwd_rules($domain,$password);
                                       if (@brokepwdrules) {
                                           $disallow{$counter} = &mt('[_1]: Password included in file for this user did not meet requirements.',
                                                                     '<b>'.$username.'</b>');
                                           map { $showpasswdrules{$_} = 1; } @brokepwdrules;
                                           next;
                                       }
                                   }
                               }
                           }
                       }
                       unless ($passwdfromfile) {
                           if ($env{'form.login'} eq 'int') {
                               if (@genpwdfail) {
                                   my $uhome=&Apache::lonnet::homeserver($username,$userdomain);
                                   if (($uhome eq 'no_host') || ($changeauth)) {
                                       $disallow{$counter} = &mt('[_1]: No specific password in file for this user; default password did not meet requirements',
                                                                 '<b>'.$username.'</b>');
                                       unless ($haspasswdmap) {
                                           map { $showpasswdrules{$_} = 1; } @genpwdfail;
                                           $haspasswdmap = 1;
                                       }
                                   }
                                   next;
                               }
                         }                          }
                           $password = $genpwd;
                     }                      }
                     # determine user role                      # determine user role
                     my $role = '';                      my $role = '';
Line 5061  sub upfile_drop_add { Line 5098  sub upfile_drop_add {
                           $counts{'auth'})."</p>\n");                            $counts{'auth'})."</p>\n");
         }          }
         $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules));          $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules));
           $r->print(&passwdrule_alerts($domain,\%showpasswdrules));
         #####################################          #####################################
         # Display list of students to drop  #          # Display list of students to drop  #
         #####################################          #####################################
Line 5130  sub print_namespacing_alerts { Line 5168  sub print_namespacing_alerts {
     }      }
 }  }
   
   sub passwdrule_alerts {
       my ($domain,$passwdrules) = @_;
       my $warning;
       if (ref($passwdrules) eq 'HASH') {
           my %showrules = %{$passwdrules};
           if (keys(%showrules)) {
               my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
               $warning = '<b>'.&mt('Password requirement(s) unmet for one or more users:').'</b><ul>';
               if ($showrules{'min'}) {
                   $warning .= '<li>'.&mt('minimum [quant,_1,character]',$passwdconf{'min'}).'</li>';
               }
               if ($showrules{'max'}) {
                   $warning .= '<li>'.&mt('maximum [quant,_1,character]',$passwdconf{'max'}).'</li>';
               }
               if ($showrules{'uc'}) {
                   $warning .= '<li>'.&mt('contain at least one upper case letter').'</li>';
               }
               if ($showrules{'lc'}) {
                   $warning .= '<li>'.&mt('contain at least one lower case letter').'</li>';
               }
               if ($showrules{'num'}) {
                   $warning .= '<li>'.&mt('contain at least one number').'</li>';
               }
               if ($showrules{'spec'}) {
                   $warning .= '<li>'.&mt('contain at least one non-alphanumeric').'</li>';
               }
               $warning .= '</ul>';
           }
       }
       return $warning;
   }
   
 sub user_change_result {  sub user_change_result {
     my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,      my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc,
         $username,$userdomain,$userchg) = @_;          $username,$userdomain,$userchg) = @_;
Line 6014  sub can_change_internalpass { Line 6084  sub can_change_internalpass {
         unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) {          unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) {
             my ($cnum,$cdom) = &get_course_identity();              my ($cnum,$cdom) = &get_course_identity();
             if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) {              if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) {
                 my $noupdate;                  my @userstatuses = ('default');
                   my %userenv = &Apache::lonnet::userenvironment($udom,$uname,'inststatus');
                   if ($userenv{'inststatus'} ne '') {
                       @userstatuses =  split(/:/,$userenv{'inststatus'});
                   }
                   my $noupdate = 1;
                   my %passwdconf = &Apache::lonnet::get_passwdconf($cdom);
                   if (ref($passwdconf{'crsownerchg'}) eq 'HASH') {
                       if (ref($passwdconf{'crsownerchg'}{'for'}) eq 'ARRAY') {
                           foreach my $status (@userstatuses) {
                               if (grep(/^\Q$status\E$/,@{$passwdconf{'crsownerchg'}{'for'}})) {
                                   undef($noupdate);
                                   last;
                               }
                           }
                       }
                   }
                   if ($noupdate) {
                       return;
                   }
                 my %owned = &Apache::lonnet::courseiddump($cdom,'.',1,'.',                  my %owned = &Apache::lonnet::courseiddump($cdom,'.',1,'.',
                                                           $env{'user.name'}.':'.$env{'user.domain'},                                                            $env{'user.name'}.':'.$env{'user.domain'},
                                                           undef,undef,undef,'.');                                                            undef,undef,undef,'.');

Removed from v.1.196  
changed lines
  Added in v.1.203


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