Diff for /loncom/interface/lonuserutils.pm between versions 1.184.4.10.2.8 and 1.184.4.11

version 1.184.4.10.2.8, 2024/08/24 23:49:48 version 1.184.4.11, 2024/07/04 00:39:16
Line 103  sub modifystudent { Line 103  sub modifystudent {
 sub modifyuserrole {  sub modifyuserrole {
     my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass,      my ($context,$setting,$changeauth,$cid,$udom,$uname,$uid,$umode,$upass,
         $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role,          $first,$middle,$last,$gene,$sec,$forceid,$desiredhome,$email,$role,
         $end,$start,$checkid,$inststatus,$emptyok) = @_;          $end,$start,$checkid,$inststatus) = @_;
     my ($scope,$userresult,$authresult,$roleresult,$idresult);      my ($scope,$userresult,$authresult,$roleresult,$idresult);
     if ($setting eq 'course' || $context eq 'course') {      if ($setting eq 'course' || $context eq 'course') {
         $scope = '/'.$cid;          $scope = '/'.$cid;
Line 114  sub modifyuserrole { Line 114  sub modifyuserrole {
     } elsif ($context eq 'domain') {      } elsif ($context eq 'domain') {
         $scope = '/'.$env{'request.role.domain'}.'/';          $scope = '/'.$env{'request.role.domain'}.'/';
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         if ($env{'request.role'} =~ m{^ca\.(/$match_domain/$match_username)$}) {          $scope =  '/'.$env{'user.domain'}.'/'.$env{'user.name'};
             $scope = $1;  
         } else {  
             $scope =  '/'.$env{'user.domain'}.'/'.$env{'user.name'};  
         }  
     }      }
     if ($context eq 'domain') {      if ($context eq 'domain') {
         my $uhome = &Apache::lonnet::homeserver($uname,$udom);          my $uhome = &Apache::lonnet::homeserver($uname,$udom);
Line 138  sub modifyuserrole { Line 134  sub modifyuserrole {
                                   generation => $gene,                                    generation => $gene,
                                   id         => $uid,                                    id         => $uid,
                                  );                                   );
   
                 # When "Update ID in user's course(s)" and "Force change of existing ID"  
                 # checkboxes both checked, prevent replacement of name information  
                 # in classlist.db file(s) for the user's course(s) with blank(s),  
                 # in the case where the uploaded csv file was without column(s) for  
                 # the particular field. Fields are: First Name, Middle Names/Initials,  
                 # Last Name (or the composite: Last Name, First Names), and Generation.  
   
                 my %emptyallowed;  
                 if ((ref($emptyok) eq 'HASH') && (keys(%{$emptyok}) > 0)) {  
                     %emptyallowed = %{$emptyok};  
                 }  
                 foreach my $field (keys(%userupdate)) {  
                     if ($userupdate{$field} eq '') {  
                         unless ($emptyallowed{$field}) {  
                             delete($userupdate{$field});  
                         }  
                     }  
                 }  
                 $idresult = &propagate_id_change($uname,$udom,\%userupdate);                  $idresult = &propagate_id_change($uname,$udom,\%userupdate);
             }              }
         }          }
Line 555  END Line 532  END
 END  END
     } else {      } else {
         my ($numrules,$intargjs) =          my ($numrules,$intargjs) =
             &Apache::loncommon::passwd_validation_js('vf.elements[current.argfield].value',$domain);              &passwd_validation_js('vf.elements[current.argfield].value',$domain);
         $auth_checks .= (<<END);          $auth_checks .= (<<END);
     foundatype=1;      foundatype=1;
     if (current.argfield == null || current.argfield == '') {      if (current.argfield == null || current.argfield == '') {
Line 675  END Line 652  END
     return $result;      return $result;
 }  }
   
   sub passwd_validation_js {
       my ($currpasswdval,$domain) = @_;
       my %passwdconf = &Apache::lonnet::get_passwdconf($domain);
       my ($min,$max,@chars,$numrules,$intargjs,%alert);
       $numrules = 0;
       $min = $Apache::lonnet::passwdmin;
       if (ref($passwdconf{'chars'}) eq 'ARRAY') {
           if ($passwdconf{'min'} =~ /^\d+$/) {
               if ($passwdconf{'min'} > $min) {
                   $min = $passwdconf{'min'};
               }
           }
           if ($passwdconf{'max'} =~ /^\d+$/) {
               $max = $passwdconf{'max'};
               $numrules ++;
           }
           @chars = @{$passwdconf{'chars'}};
           if (@chars) {
               $numrules ++;
           }
       }
       if ($min > 0) {
           $numrules ++;
       }
       if (($min > 0) || ($max ne '') || (@chars > 0)) {
           my $alertmsg = &mt('Initial password did not satisfy requirement(s):').'\n\n';
           if ($min) {
               $alert{'min'} = &mt('minimum [quant,_1,character]',$min).'\n';
           }
           if ($max) {
               $alert{'max'} = &mt('maximum [quant,_1,character]',$max).'\n';
           }
           my (@charalerts,@charrules);
           if (@chars) {
               if (grep(/^uc$/,@chars)) {
                   push(@charalerts,&mt('contain at least one upper case letter'));
                   push(@charrules,'uc');
               }
               if (grep(/^lc$/,@chars)) {
                   push(@charalerts,&mt('contain at least one lower case letter'));
                   push(@charrules,'lc');
               }
               if (grep(/^num$/,@chars)) {
                   push(@charalerts,&mt('contain at least one number'));
                   push(@charrules,'num');
               }
               if (grep(/^spec$/,@chars)) {
                   push(@charalerts,&mt('contain at least one non-alphanumeric'));
                   push(@charrules,'spec');
               }
           }
           $intargjs = qq|            var rulesmsg = '';\n|.
                       qq|            var currpwval = $currpasswdval;\n|;
               if ($min) {
                   $intargjs .= qq|
               if (currpwval.length < $min) {
                   rulesmsg += ' - $alert{min}';
               }
   |;
               }
               if ($max) {
                   $intargjs .= qq|
               if (currpwval.length > $max) {
                   rulesmsg += ' - $alert{max}';
               }
   |;
               }
               if (@chars > 0) {
                   my $charrulestr = '"'.join('","',@charrules).'"';
                   my $charalertstr = '"'.join('","',@charalerts).'"';
                   $intargjs .= qq|            var brokerules = new Array();\n|.
                                qq|            var charrules = new Array($charrulestr);\n|.
                                qq|            var charalerts = new Array($charalertstr);\n|;
                   my %rules;
                   map { $rules{$_} = 1; } @chars;
                   if ($rules{'uc'}) {
                       $intargjs .= qq|
               var ucRegExp = /[A-Z]/;
               if (!ucRegExp.test(currpwval)) {
                   brokerules.push('uc');
               }
   |;
                   }
                   if ($rules{'lc'}) {
                       $intargjs .= qq|
               var lcRegExp = /[a-z]/;
               if (!lcRegExp.test(currpwval)) {
                   brokerules.push('lc');
               }
   |;
                   }
                   if ($rules{'num'}) {
                        $intargjs .= qq|
               var numRegExp = /[0-9]/;
               if (!numRegExp.test(currpwval)) {
                   brokerules.push('num');
               }
   |;
                   }
                   if ($rules{'spec'}) {
                        $intargjs .= q|
               var specRegExp = /[!"#$%&'()*+,\-.\/:;<=>?@[\\^\]_`{\|}~]/;
               if (!specRegExp.test(currpwval)) {
                   brokerules.push('spec');
               }
   |;
                   }
                   $intargjs .= qq|
               if (brokerules.length > 0) {
                   for (var i=0; i<brokerules.length; i++) {
                       for (var j=0; j<charrules.length; j++) {
                           if (brokerules[i] == charrules[j]) {
                               rulesmsg += ' - '+charalerts[j]+'\\n';
                               break;
                           }
                       }
                   }
               }
   |;
               }
               $intargjs .= qq|
               if (rulesmsg != '') {
                   rulesmsg = '$alertmsg'+rulesmsg;
                   alert(rulesmsg);
                   return false;
               }
   |;
       }
       return ($numrules,$intargjs);
   }
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
Line 1508  sub construction_space_roles { Line 1616  sub construction_space_roles {
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
             if (&Apache::lonnet::allowed('c'.$role,$env{'user.domain'}.'/'.$env{'user.name'})) {               if (&Apache::lonnet::allowed('c'.$role,$env{'user.domain'}.'/'.$env{'user.name'})) { 
                 push(@roles,$role);                   push(@roles,$role); 
             } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) {  
                 my ($audom,$auname) = ($1,$2);  
                 if (($role eq 'ca') || ($role eq 'aa')) {  
                     if ((&Apache::lonnet::allowed('v'.$role,,$audom.'/'.$auname)) &&  
                         ($env{"environment.internal.manager./$audom/$auname"})) {  
                         push(@roles,$role);  
                     }  
                 }  
             }              }
         }          }
         return @roles;          return @roles;
Line 1619  sub print_userlist { Line 1719  sub print_userlist {
     if (! exists($env{'form.sortby'})) {      if (! exists($env{'form.sortby'})) {
         $env{'form.sortby'} = 'username';          $env{'form.sortby'} = 'username';
     }      }
     my ($showstart,$showend);  
     if (($env{'form.Status'} eq '') && ($env{'form.phase'} eq '') &&  
         ($env{'form.showrole'} eq '') && ($context eq 'course') &&  
         ($env{'request.course.id'} ne '') &&  
         ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'} ne '')) {  
         my $now = time;  
         my $startaccess = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'};  
         my $endaccess = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'};  
         if (($startaccess) && ($startaccess > $now)) {  
             $env{'form.Status'} = 'Future';  
             $showstart = 1;  
         }  
         if (($endaccess ne '') && ($endaccess != 0) && ($endaccess < $now)) {  
             $env{'form.Status'} = 'Expired';  
             undef($showstart);  
             $showend = 1;  
         }  
     }  
     if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {      if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
         $env{'form.Status'} = 'Active';          $env{'form.Status'} = 'Active';
     }      }
Line 1704  sub print_userlist { Line 1786  sub print_userlist {
         $r->print(&section_group_filter($cnum,$cdom));          $r->print(&section_group_filter($cnum,$cdom));
     }      }
     $r->print('</div><div class="LC_left_float">'.      $r->print('</div><div class="LC_left_float">'.
               &column_checkboxes($context,$mode,$formname,$showcredits,$showstart,$showend).                &column_checkboxes($context,$mode,$formname,$showcredits).
               '</div>');                '</div>');
     if ($env{'form.phase'} eq '') {      if ($env{'form.phase'} eq '') {
         $r->print('<br clear="all" />'.          $r->print('<br clear="all" />'.
Line 1790  sub print_userlist { Line 1872  sub print_userlist {
     } else {      } else {
         my (%cstr_roles,%dom_roles);          my (%cstr_roles,%dom_roles);
         if ($context eq 'author') {          if ($context eq 'author') {
             my @possroles = &roles_by_context($context);  
             my @allowedroles;  
             # List co-authors and assistant co-authors              # List co-authors and assistant co-authors
             my ($auname,$audom);              my @possroles = &roles_by_context($context);
             if ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) {              %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef,
                 ($audom,$auname) = ($1,$2);                                                \@statuses,\@possroles);
                 foreach my $role (@possroles) {              &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,
                     if ((&Apache::lonnet::allowed('v'.$role,"$audom/$auname")) ||                               \%cstr_roles,$permission);
                         (&Apache::lonnet::allowed('c'.$role,"$audom/$auname"))) {  
                         push(@allowedroles,$role);  
                     }  
                 }  
             } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/}) {  
                 if ($1 eq $env{'user.domain'}) {  
                     $auname = $env{'user.name'};  
                     $audom = $env{'user.domain'};  
                 }  
                 @allowedroles = @possroles;  
             }  
             if (($auname ne '') && ($audom ne '')) {  
                 %cstr_roles = &Apache::lonnet::get_my_roles($auname,$audom,undef,  
                                                             \@statuses,\@allowedroles);  
                 &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo,  
                                  \%cstr_roles,$permission);  
             }  
         } elsif ($context eq 'domain') {          } elsif ($context eq 'domain') {
             if ($env{'form.roletype'} eq 'domain') {              if ($env{'form.roletype'} eq 'domain') {
                 if (grep(/^authorusage$/,@cols)) {                  if (grep(/^authorusage$/,@cols)) {
Line 2105  sub get_cols_array { Line 2168  sub get_cols_array {
             push(@cols,'photo');              push(@cols,'photo');
         }          }
         if ($context eq 'domain') {          if ($context eq 'domain') {
             push(@cols,('authorusage','authorquota','extent'));              push (@cols,('authorusage','authorquota','extent'));
         }  
         if ($context eq 'author') {  
             push(@cols,'manager');  
         }          }
     }      }
     return @cols;      return @cols;
 }  }
   
 sub column_checkboxes {  sub column_checkboxes {
     my ($context,$mode,$formname,$showcredits,$showstart,$showend) = @_;      my ($context,$mode,$formname,$showcredits) = @_;
     my @cols = &get_cols_array($context,$mode,$showcredits);      my @cols = &get_cols_array($context,$mode,$showcredits);
     my @showncols = &Apache::loncommon::get_env_multiple('form.showcol');      my @showncols = &Apache::loncommon::get_env_multiple('form.showcol');
     my (%disabledchk,%unchecked);      my (%disabledchk,%unchecked);
Line 2128  sub column_checkboxes { Line 2188  sub column_checkboxes {
             if ($showcredits) {              if ($showcredits) {
                 $unchecked{'credits'} = 1;                  $unchecked{'credits'} = 1;
             }              }
             my %curr_groups = &Apache::longroup::coursegroups();          } elsif ($context eq 'domain') { 
             unless (keys(%curr_groups)) {  
                 $unchecked{'groups'} = 1;  
             }  
         } elsif ($context eq 'domain') {  
             $unchecked{'extent'} = 1;               $unchecked{'extent'} = 1; 
         }          }
         if ($showstart) {          $unchecked{'start'} = 1;
             $unchecked{'lastlogin'} = 1;          $unchecked{'end'} = 1;
         } else {  
             $unchecked{'start'} = 1;  
         }  
         unless ($showend) {  
             $unchecked{'end'} = 1;  
         }  
     } else {      } else {
         if ($env{'form.Status'} ne 'Any') {          if ($env{'form.Status'} ne 'Any') {
             $disabledchk{'status'} = 1;              $disabledchk{'status'} = 1;
Line 2159  sub column_checkboxes { Line 2209  sub column_checkboxes {
             } elsif ($env{'form.roletype'} eq 'domain') {              } elsif ($env{'form.roletype'} eq 'domain') {
                 $disabledchk{'extent'} = 1;                   $disabledchk{'extent'} = 1; 
             }              }
         } elsif ($context eq 'author') {  
             if (($env{'form.Status'} eq 'Expired') ||  
                 ($env{'form.showrole'} eq 'aa')) {  
                 $disabledchk{'manager'} = 1;  
             }  
         }          }
     }      }
     my $numposs = scalar(@cols);      my $numposs = scalar(@cols);
Line 2255  sub get_column_names { Line 2300  sub get_column_names {
         'ca'         => "check all",          'ca'         => "check all",
         'ua'         => "uncheck all",          'ua'         => "uncheck all",
         'clicker'    => "clicker-ID",          'clicker'    => "clicker-ID",
         'manager'    => "co-author manager",  
     );      );
     if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {      if ($context eq 'domain' && $env{'form.roletype'} eq 'course') {
         $lt{'extent'} = &mt('course(s): description, section(s), status');          $lt{'extent'} = &mt('course(s): description, section(s), status');
Line 2540  sub make_keylist_array { Line 2584  sub make_keylist_array {
     $index->{'instsec'} = &Apache::loncoursedata::CL_INSTSEC();      $index->{'instsec'} = &Apache::loncoursedata::CL_INSTSEC();
     $index->{'authorquota'} = &Apache::loncoursedata::CL_AUTHORQUOTA();      $index->{'authorquota'} = &Apache::loncoursedata::CL_AUTHORQUOTA();
     $index->{'authorusage'} = &Apache::loncoursedata::CL_AUTHORUSAGE();      $index->{'authorusage'} = &Apache::loncoursedata::CL_AUTHORUSAGE();
     $index->{'manager'} = &Apache::loncoursedata::CL_CAMANAGER();  
     foreach my $key (keys(%{$index})) {      foreach my $key (keys(%{$index})) {
         $keylist->[$index->{$key}] = $key;          $keylist->[$index->{$key}] = $key;
     }      }
Line 2615  sub show_users_list { Line 2658  sub show_users_list {
             (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'au'))) {              (($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'au'))) {
             push(@sortable,('authorusage','authorquota'));              push(@sortable,('authorusage','authorquota'));
         }          }
         if ($context eq 'author') {  
             push(@sortable,'manager');  
         }  
     }      }
     if ($mode eq 'pickauthor') {      if ($mode eq 'pickauthor') {
         @sortable = ('username','fullname','email','status');          @sortable = ('username','fullname','email','status');
Line 2935  END Line 2975  END
     foreach my $idx (@$keylist) {      foreach my $idx (@$keylist) {
         $index{$idx} = $i++;          $index{$idx} = $i++;
     }      }
     my $now = time;  
     my $usercount = 0;      my $usercount = 0;
     my ($secfilter,$grpfilter);      my ($secfilter,$grpfilter);
     if ($context eq 'course') {      if ($context eq 'course') {
Line 2953  END Line 2992  END
                                                 Future  => 'Future',                                                  Future  => 'Future',
                                                 Expired => 'Expired',                                                  Expired => 'Expired',
                                                );                                                 );
     my (%crslogins,%camanagers);      # If this is for a single course get last course "log-in".
       my %crslogins;
     if ($context eq 'course') {      if ($context eq 'course') {
         # If this is for a single course get last course "log-in".  
         %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum);          %crslogins=&Apache::lonnet::dump('nohist_crslastlogin',$cdom,$cnum);
     } elsif ($context eq 'author') {  
         map { $camanagers{$_.':ca'} = 1; } split(/,/,$env{'environment.authormanagers'});  
     }      }
     # Get groups, role, permanent e-mail so we can sort on them if      # Get groups, role, permanent e-mail so we can sort on them if
     # necessary.      # necessary.
Line 3058  END Line 3095  END
                 }                  }
             }              }
         }          }
         if ($context eq 'author') {  
             if (($camanagers{$user}) &&  
                 ((!defined($userlist->{$user}->[$index{'end'}])) ||  
                  ($userlist->{$user}->[$index{'end'}] == 0) ||  
                  ($userlist->{$user}->[$index{'end'}] > $now))) {  
                 $userlist->{$user}->[$index{'manager'}] = &mt('Yes');  
             } else {  
                 $userlist->{$user}->[$index{'manager'}] = &mt('No');  
             }  
         }  
         my %emails   = &Apache::loncommon::getemails($uname,$udom);          my %emails   = &Apache::loncommon::getemails($uname,$udom);
         if ($emails{'permanentemail'} =~ /\S/) {          if ($emails{'permanentemail'} =~ /\S/) {
             $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};              $userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'};
Line 4263  sub upfile_drop_add { Line 4290  sub upfile_drop_add {
         $fieldstype{$field.'_choice'} = 'scalar';          $fieldstype{$field.'_choice'} = 'scalar';
     }      }
     &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype);      &Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype);
     my ($cid,$crstype,$setting,$crsdom,$crsnum,$oldcrsuserdoms,%emptyok);      my ($cid,$crstype,$setting);
     if ($context eq 'domain') {      if ($context eq 'domain') {
         $setting = $env{'form.roleaction'};          $setting = $env{'form.roleaction'};
         if (exists($fields{'names'})) {  
             map { $emptyok{$_} = 1; } ('lastname','firstname','middlename');  
         } else {  
             if (exists($fields{'lname'})) {  
                 $emptyok{'lastname'} = 1;  
             }  
             if (exists($fields{'fname'})) {  
                 $emptyok{'firstname'} = 1;  
             }  
             if (exists($fields{'mname'})) {  
                 $emptyok{'middlename'} = 1;  
             }  
         }  
         if (exists($fields{'gen'})) {  
             $emptyok{'generation'} = 1;  
         }  
     }      }
     if ($env{'request.course.id'} ne '') {      if ($env{'request.course.id'} ne '') {
         $cid = $env{'request.course.id'};          $cid = $env{'request.course.id'};
         $crstype = &Apache::loncommon::course_type();          $crstype = &Apache::loncommon::course_type();
         $crsdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         $crsnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
     } elsif ($setting eq 'course') {      } elsif ($setting eq 'course') {
         if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {          if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) {
             $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};              $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'};
             $crstype = &Apache::loncommon::course_type($cid);              $crstype = &Apache::loncommon::course_type($cid);
             $crsdom = $env{'form.dcdomain'};  
             $crsnum = $env{'form.dccourse'};  
             if (exists($env{'course.'.$cid.'.internal.userdomains'})) {  
                 $oldcrsuserdoms = 1;  
             }  
             my %coursedesc = &Apache::lonnet::coursedescription($cid,{ one_time => 1 });  
             $env{'course.'.$cid.'.internal.userdomains'} = $coursedesc{'internal.userdomains'};  
         }          }
     }      }
     my ($startdate,$enddate) = &get_dates_from_form();      my ($startdate,$enddate) = &get_dates_from_form();
Line 4995  sub upfile_drop_add { Line 4997  sub upfile_drop_add {
                                                 $mname,$lname,$gen,$singlesec,                                                  $mname,$lname,$gen,$singlesec,
                                                 $env{'form.forceid'},$desiredhost,                                                  $env{'form.forceid'},$desiredhost,
                                                 $email,$role,$enddate,$startdate,                                                  $email,$role,$enddate,$startdate,
                                                 $checkid,$inststatus,\%emptyok);                                                  $checkid,$inststatus);
                         }                          }
                     }                      }
                     if ($multiple) {                      if ($multiple) {
Line 5017  sub upfile_drop_add { Line 5019  sub upfile_drop_add {
             } # end of loop              } # end of loop
             $r->print('</ul>');              $r->print('</ul>');
             &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);              &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
             if (($context eq 'domain') && ($setting eq 'course')) {  
                 unless ($oldcrsuserdoms) {  
                     if (exists($env{'course.'.$cid.'.internal.userdomains'})) {  
                         delete($env{'course.'.$cid.'.internal.userdomains'});  
                     }  
                 }  
             }  
         }          }
         # Flush the course logs so reverse user roles immediately updated          # Flush the course logs so reverse user roles immediately updated
         $r->register_cleanup(\&Apache::lonnet::flushcourselogs);          $r->register_cleanup(\&Apache::lonnet::flushcourselogs);
Line 6224  sub get_permission { Line 6219  sub get_permission {
             }              }
         }          }
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         my $audom = $env{'request.role.domain'};          $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
         my $auname = $env{'user.name'};          $permission{'view'} = $permission{'cusr'};
         if ((&Apache::lonnet::allowed('cca',"$audom/$auname")) ||  
             (&Apache::lonnet::allowed('caa',"$audom/$auname"))) {  
             $permission{'author'} = 1;  
             $permission{'cusr'} = 1;  
             $permission{'view'} = 1;  
         }  
     } elsif ($context eq 'coauthor') {  
         my ($audom,$auname) = ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$});  
         if ((&Apache::lonnet::allowed('vca',"$audom/$auname")) ||  
             (&Apache::lonnet::allowed('vaa',"$audom/$auname"))) {  
             if ($env{"environment.internal.manager./$audom/$auname"}) {  
                 $permission{'cusr'} = 1;  
                 $permission{'view'} = 1;  
             }  
         }  
     } else {      } else {
         my @allroles = &roles_by_context($context);          my @allroles = &roles_by_context($context);
         foreach my $role (@allroles) {          foreach my $role (@allroles) {
Line 6268  sub get_permission { Line 6248  sub get_permission {
         }          }
     }      }
     my $allowed = 0;      my $allowed = 0;
     foreach my $key (keys(%permission)) {      foreach my $perm (values(%permission)) {
         next if (($key eq 'owner') || ($key eq 'co-owner') || ($key eq 'author'));          if ($perm) { $allowed=1; last; }
         if ($permission{$key}) { $allowed=1; last; }  
     }      }
     return (\%permission,$allowed);      return (\%permission,$allowed);
 }  }
Line 6283  sub authorpriv { Line 6262  sub authorpriv {
          || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }    return 1;           || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }    return 1;
 }  }
   
 sub coauthorpriv {  
     my ($auname,$audom)=@_;  
     my $uname = $env{'user.name'};  
     my $udom = $env{'user.domain'};  
     if (((&Apache::lonnet::allowed('vca',"$udom/$uname")) ||  
          (&Apache::lonnet::allowed('vaa',"$udom/$uname"))) &&  
          ($env{"environment.internal.manager./$audom/$auname"})) {  
         return 1;  
     }  
     return '';  
 }  
   
 sub roles_on_upload {  sub roles_on_upload {
     my ($context,$setting,$crstype,%customroles) = @_;      my ($context,$setting,$crstype,%customroles) = @_;
     my (@possible_roles,@permitted_roles);      my (@possible_roles,@permitted_roles);
Line 6491  sub verify_authen { Line 6458  sub verify_authen {
         $finish = "document.$formname.submit();";          $finish = "document.$formname.submit();";
     }      }
     my ($numrules,$intargjs) =      my ($numrules,$intargjs) =
         &Apache::loncommon::passwd_validation_js('argpicked',$domain);          &passwd_validation_js('argpicked',$domain);
     my $outcome = <<"ENDSCRIPT";      my $outcome = <<"ENDSCRIPT";
   
 function auth_check() {  function auth_check() {

Removed from v.1.184.4.10.2.8  
changed lines
  Added in v.1.184.4.11


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