Diff for /loncom/interface/lonuserutils.pm between versions 1.184.4.10.2.9 and 1.191

version 1.184.4.10.2.9, 2024/09/01 02:33:40 version 1.191, 2017/11/04 16:13:31
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 461  sub javascript_validations { Line 438  sub javascript_validations {
             } elsif ($context eq 'domain') {              } elsif ($context eq 'domain') {
                 $setsection_call = 'setCourse()';                  $setsection_call = 'setCourse()';
                 $setsections_js = &dc_setcourse_js($param{'formname'},$mode,                  $setsections_js = &dc_setcourse_js($param{'formname'},$mode,
                                                    $context,$showcredits,$domain);                                                     $context,$showcredits);
             }              }
             $finish = "  var checkSec = $setsection_call\n".              $finish = "  var checkSec = $setsection_call\n".
                       "  if (checkSec == 'ok') {\n".                        "  if (checkSec == 'ok') {\n".
Line 533  END Line 510  END
 ";  ";
     } elsif ($mode eq 'modifycourse') {      } elsif ($mode eq 'modifycourse') {
         $auth_checks .= "          $auth_checks .= "
     if ((current.argfield !== null) && (current.argfield !== undefined) && (current.argfield !== '') && (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '')) {      if (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') {
 ";  ";
     }      }
     if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {      if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
Line 554  END Line 531  END
 /* regexp here to check for non \d \. in credits */  /* regexp here to check for non \d \. in credits */
 END  END
     } else {      } else {
         my ($numrules,$intargjs) =  
             &Apache::loncommon::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 == '') {
         // The login radiobutton checked does not have an associated textbox  
     } else if (vf.elements[current.argfield].value == '') {  
         var alertmsg = '';          var alertmsg = '';
         switch (current.radiovalue) {          switch (current.radiovalue) {
             case 'krb':              case 'krb':
                 alertmsg = '$alert{'krb'}';                  alertmsg = '$alert{'krb'}';
                 break;                  break;
             case 'int':              case 'loc':
                 alertmsg = '$alert{'ipass'}';  
                 break;  
             case 'fsys':              case 'fsys':
                 alertmsg = '$alert{'ipass'}';                  alertmsg = '$alert{'ipass'}';
                 break;                  break;
             case 'loc':              case 'fsys':
                 alertmsg = '';                  alertmsg = '';
                 break;                  break;
             default:              default:
Line 582  END Line 553  END
             alert(alertmsg);              alert(alertmsg);
             return;              return;
         }          }
     } else if (current.radiovalue == 'int') {  
         if ($numrules > 0) {  
 $intargjs  
         }  
     }      }
 END  END
     }      }
Line 674  END Line 641  END
                  $section_checks.$authheader;                   $section_checks.$authheader;
     return $result;      return $result;
 }  }
   
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
 sub upload_manager_javascript_forward_associate {  sub upload_manager_javascript_forward_associate {
Line 977  sub print_upload_manager_footer { Line 943  sub print_upload_manager_footer {
                 &Apache::lonhtmlcommon::row_closure();                  &Apache::lonhtmlcommon::row_closure();
     }      }
   
       my ($trusted,$untrusted);
       if ($context eq 'course') {
           ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$defdom);
       } elsif ($context eq 'author') {
           ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('othcoau',$defdom);
       }
     $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))      $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain'))
            .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1)             .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1,undef,$trusted,$untrusted)
            .&Apache::lonhtmlcommon::row_closure();             .&Apache::lonhtmlcommon::row_closure();
   
     $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))      $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates'))
Line 1160  sub print_upload_manager_form { Line 1132  sub print_upload_manager_form {
             &Apache::loncommon::load_tmp_file($r,$datatoken);              &Apache::loncommon::load_tmp_file($r,$datatoken);
         }          }
     }      }
     if ($datatoken eq '') {  
         $r->print('<p class="LC_error">'.&mt('Error').': '.  
                   &mt('Invalid datatoken').'</p>');  
         return 'missingdata';  
     }  
     my @records=&Apache::loncommon::upfile_record_sep();      my @records=&Apache::loncommon::upfile_record_sep();
     if($env{'form.noFirstLine'}){      if($env{'form.noFirstLine'}){
         $firstLine=shift(@records);          $firstLine=shift(@records);
Line 1247  sub print_upload_manager_form { Line 1214  sub print_upload_manager_form {
     }      }
     &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,      &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear,
                                  $context,$permission,$crstype,$showcredits);                                   $context,$permission,$crstype,$showcredits);
     return 'ok';  
 }  }
   
 sub setup_date_selectors {  sub setup_date_selectors {
Line 1508  sub construction_space_roles { Line 1474  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 1577  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 1644  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 1730  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 2026  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 2046  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 2067  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 2158  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 2280  sub gather_userinfo { Line 2182  sub gather_userinfo {
             ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =              ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) =
                 split(/:/,$item);                  split(/:/,$item);
             ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});              ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item});
             next if (($userdata{'username'} eq '') && ($userdata{'domain'} eq ''));  
             &build_user_record($context,\%userdata,$userinfo,$indexhash,              &build_user_record($context,\%userdata,$userinfo,$indexhash,
                                $item,$userlist);                                 $item,$userlist);
         } elsif ($context eq 'course') {          } elsif ($context eq 'course') {
Line 2386  sub build_user_record { Line 2287  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 2398  sub courses_selector { Line 2300  sub courses_selector {
     my $jscript = '';      my $jscript = '';
   
     my $totcodes = 0;      my $totcodes = 0;
     my $instcats = &Apache::lonnet::get_dom_instcats($cdom);      $totcodes =
     if (ref($instcats) eq 'HASH') {          &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,
         if ((ref($instcats->{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') &&                                                        $cdom,$totcodes);
             (ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) {      if ($totcodes > 0) {
             %codes = %{$instcats->{'codes'}};          $format_reply =
             @codetitles = @{$instcats->{'codetitles'}};               &Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes,
             %cat_titles = %{$instcats->{'cat_titles'}};                                  \%codes,\@codetitles,\%cat_titles,\%cat_order);
             %cat_order = %{$instcats->{'cat_order'}};          if ($format_reply eq 'ok') {
             $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 2541  sub make_keylist_array { Line 2442  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 2616  sub show_users_list { Line 2516  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 2936  END Line 2833  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 2954  END Line 2850  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') {  
         my $authormanagers;  
         if ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)$}) {  
             my %envhash = &Apache::lonnet::userenvironment($1,$2,'authormanagers');  
             $authormanagers = $envhash{'authormanagers'};  
         } else {  
             $authormanagers = $env{'environment.authormanagers'};  
         }  
         if ($authormanagers ne '') {  
             map { $camanagers{$_.':ca'} = 1; } split(/,/,$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 3068  END Line 2953  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 3646  END Line 3521  END
         setSections(formname,'$crstype');          setSections(formname,'$crstype');
         if (seccheck == 'ok') {          if (seccheck == 'ok') {
             opener.document.$callingform.newsecs.value = formname.sections.value;              opener.document.$callingform.newsecs.value = formname.sections.value;
         } else {  
             return;  
         }          }
 END  END
     } else {      } else {
Line 3896  sub results_header_row { Line 3769  sub results_header_row {
             $description .= ' ('.$constraint.')';              $description .= ' ('.$constraint.')';
         }           } 
     } elsif ($context eq 'author') {      } elsif ($context eq 'author') {
         my ($auname,$audom);  
         if ($env{'request.role'} =~ m{^(?:ca|aa)\./($match_domain)/($match_username)$}) {  
             ($audom,$auname) = ($1,$2);  
         } else {  
             ($audom,$auname) = ($env{'user.domain'},$env{'user.name'});  
         }  
         $description =           $description = 
             &mt('Author space for [_1]'              &mt('Author space for [_1]'
                 ,'<span class="LC_cusr_emph">'                  ,'<span class="LC_cusr_emph">'
                 .&Apache::loncommon::plainname($auname,$audom)                  .&Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})
                 .'</span>')                  .'</span>')
             .':&nbsp;&nbsp;';              .':&nbsp;&nbsp;';
         if ($statusmode eq 'Expired') {          if ($statusmode eq 'Expired') {
Line 4238  sub print_first_users_upload_form { Line 4105  sub print_first_users_upload_form {
            .&Apache::lonhtmlcommon::end_pick_box();             .&Apache::lonhtmlcommon::end_pick_box();
   
     $str .= '<p>'      $str .= '<p>'
            .'<input type="button" name="fileupload" value="'.&mt('Next').'"'             .'<input type="submit" name="fileupload" value="'.&mt('Next').'"'
            .' onclick="javascript:checkUpload(this.form);" />'             .' onclick="javascript:checkUpload(this.form);" />'
            .'</p>';             .'</p>';
   
Line 4266  sub upfile_drop_add { Line 4133  sub upfile_drop_add {
             $fields{$env{'form.f'.$i}}=$keyfields[$i];              $fields{$env{'form.f'.$i}}=$keyfields[$i];
         }          }
     }      }
       if ($env{'form.fullup'} ne 'yes') {
           $r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n".
                     '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />');
       }
     #      #
     # Store the field choices away      # Store the field choices away
     my @storefields = qw/username names fname mname lname gen id       my @storefields = qw/username names fname mname lname gen id 
Line 4279  sub upfile_drop_add { Line 4150  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,$crsdom);
     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'};          $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'};              $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 4325  sub upfile_drop_add { Line 4173  sub upfile_drop_add {
     my $defdom=$env{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my $domain;      my $domain;
     if ($env{'form.defaultdomain'} ne '') {      if ($env{'form.defaultdomain'} ne '') {
         $domain = $env{'form.defaultdomain'};          if (($context eq 'course') || ($setting eq 'course')) {
               if ($env{'form.defaultdomain'} eq $crsdom) {
                   $domain = $env{'form.defaultdomain'};
               } else {
                   if (&Apache::lonnet::will_trust('enroll',$crsdom,$env{'form.defaultdomain'})) {
                       $domain = $env{'form.defaultdomain'};
                   } else {
                       $r->print('<span class="LC_error">'.&mt('Error').
                                 &mt('Enrollment of users not permitted for specified default domain: [_1].',
                                     &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>');
                       if ($env{'form.fullup'} ne 'yes') {
                           $r->print('</form>');
                       }
                       return;
                   }
               }
           } elsif ($context eq 'author') {
               if ($env{'form.defaultdomain'} eq $defdom) {
                   $domain = $env{'form.defaultdomain'}; 
               } else {
                   if ((&Apache::lonnet::will_trust('othcoau',$defdom,$env{'form.defaultdomain'})) &&
                       (&Apache::lonnet::will_trust('coaurem',$env{'form.defaultdomain'},$defdom))) {
                       $domain = $env{'form.defaultdomain'};
                   } else {
                       $r->print('<span class="LC_error">'.&mt('Error').
                                 &mt('Addition of users not permitted for specified default domain: [_1].',
                                     &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>');
                       if ($env{'form.fullup'} ne 'yes') {
                           $r->print('</form>');
                       }
                       return;
                   }
               }
           } elsif (($context eq 'domain') && ($setting eq 'domain')) {
               if ($env{'form.defaultdomain'} eq $defdom) {
                   $domain = $env{'form.defaultdomain'};
               } else {
                   if (&Apache::lonnet::will_trust('domroles',$defdom,$env{'form.defaultdomain'})) {
                       $domain = $env{'form.defaultdomain'};
                   } else {
                       $r->print('<span class="LC_error">'.&mt('Error').
                                 &mt('Addition of users not permitted for specified default domain: [_1].',
                                     &Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>');
                       if ($env{'form.fullup'} ne 'yes') {
                           $r->print('</form>');
                       }
                       return;
                   }
               }
           }
     } else {      } else {
         $domain = $defdom;          $domain = $defdom;
     }      }
Line 4335  sub upfile_drop_add { Line 4232  sub upfile_drop_add {
     } else {      } else {
         my %home_servers = &Apache::lonnet::get_servers($defdom,'library');          my %home_servers = &Apache::lonnet::get_servers($defdom,'library');
         if (! exists($home_servers{$desiredhost})) {          if (! exists($home_servers{$desiredhost})) {
             $r->print('<p class="LC_error">'.&mt('Error').': '.              $r->print('<span class="LC_error">'.&mt('Error').
                       &mt('Invalid home server specified').'</p>');                        &mt('Invalid home server specified').'</span>');
             $r->print(&Apache::loncommon::end_page());              if ($env{'form.fullup'} ne 'yes') {
             return 'invalidhome';                  $r->print('</form>');
               }
               return;
         }          }
     }      }
     # Determine authentication mechanism      # Determine authentication mechanism
Line 4348  sub upfile_drop_add { Line 4247  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 4357  sub upfile_drop_add { Line 4255  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 4437  sub upfile_drop_add { Line 4333  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);
   
             }              }
         }          }
     }      }
     if ($datatoken eq '') {  
         $r->print('<p class="LC_error">'.&mt('Error').': '.  
                   &mt('Invalid datatoken').'</p>');  
         return 'missingdata';  
     }  
     if ( $domain eq &LONCAPA::clean_domain($domain)      if ( $domain eq &LONCAPA::clean_domain($domain)
         && ($amode ne '')) {          && ($amode ne '')) {
         #######################################          #######################################
Line 4514  sub upfile_drop_add { Line 4406  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);
         foreach my $line (@userdata) {          foreach my $line (@userdata) {
             $counter ++;              $counter ++;
             my @secs;              my @secs;
Line 4564  sub upfile_drop_add { Line 4456  sub upfile_drop_add {
                                 '"<b>'.$entries{$fields{'domain'}}.'</b>"',                                  '"<b>'.$entries{$fields{'domain'}}.'</b>"',
                                 $fname,$mname,$lname,$gen);                                  $fname,$mname,$lname,$gen);
                         next;                          next;
                       } elsif ($entries{$fields{'domain'}} ne $domain) {
                           my $possdom = $entries{$fields{'domain'}};
                           if ($context eq 'course' || $setting eq 'course') {
                               unless ($trustchecked{$possdom}) {
                                   $willtrust{$possdom} = &Apache::lonnet::will_trust('enroll',$domain,$possdom);
                                   $trustchecked{$possdom} = 1;
                               }
                           } elsif ($context eq 'author') {
                               unless ($trustchecked{$possdom}) {
                                   $willtrust{$possdom} = &Apache::lonnet::will_trust('othcoau',$domain,$possdom);
                               }
                               if ($willtrust{$possdom}) {
                                   $willtrust{$possdom} = &Apache::lonnet::will_trust('coaurem',$possdom,$domain); 
                               }
                           }
                           unless ($willtrust{$possdom}) {
                               $disallow{$counter} =
                                   &mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]',
                                       '"<b>'.$possdom.'</b>"',
                                       $fname,$mname,$lname,$gen);
                               next;
                           }
                     }                      }
                     my $username = $entries{$fields{'username'}};                      my $username = $entries{$fields{'username'}};
                     my $userdomain = $entries{$fields{'domain'}};                      my $userdomain = $entries{$fields{'domain'}};
Line 4643  sub upfile_drop_add { Line 4557  sub upfile_drop_add {
                         }                          }
                     }                      }
                     # determine user password                      # determine user password
                     my $password;                      my $password = $genpwd;
                     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 4951  sub upfile_drop_add { Line 4833  sub upfile_drop_add {
                     my (%userres,%authres,%roleres,%idres);                      my (%userres,%authres,%roleres,%idres);
                     my $singlesec = '';                      my $singlesec = '';
                     if ($role eq 'st') {                      if ($role eq 'st') {
                         if (($context eq 'domain') && ($changeauth eq 'Yes') && (!$newuser)) {  
                             if ((&Apache::lonnet::allowed('mau',$userdomain)) &&  
                                 (&Apache::lonnet::homeserver($username,$userdomain) ne 'no_host')) {  
                                 if ((($amode =~ /^krb4|krb5|internal$/) && $password ne '') ||  
                                      ($amode eq 'localauth')) {  
                                     $authresult =  
                                         &Apache::lonnet::modifyuserauth($userdomain,$username,$amode,$password);  
                                 }  
                             }  
                         }  
                         my $sec;                          my $sec;
                         if (ref($userinfo{$i}{'sections'}) eq 'ARRAY') {                          if (ref($userinfo{$i}{'sections'}) eq 'ARRAY') {
                             if (@secs > 0) {                              if (@secs > 0) {
Line 5002  sub upfile_drop_add { Line 4874  sub upfile_drop_add {
                                     }                                      }
                                 }                                  }
                             }                              }
                         }                              if (!$multiple) {
                         if (!$multiple) {                                  ($userresult,$authresult,$roleresult,$idresult) = 
                             ($userresult,$authresult,$roleresult,$idresult) =                                       &modifyuserrole($context,$setting,
                                 &modifyuserrole($context,$setting,                                                      $changeauth,$cid,$userdomain,$username, 
                                                 $changeauth,$cid,$userdomain,$username,                                                       $id,$amode,$password,$fname,
                                                 $id,$amode,$password,$fname,                                                      $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);
                                                 $checkid,$inststatus,\%emptyok);                              }
                         }                          }
                     }                      }
                     if ($multiple) {                      if ($multiple) {
Line 5033  sub upfile_drop_add { Line 4905  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 5047  sub upfile_drop_add { Line 4912  sub upfile_drop_add {
                   "</p>\n");                    "</p>\n");
         if ($counts{'role'} > 0) {          if ($counts{'role'} > 0) {
             $r->print("<p>\n".              $r->print("<p>\n".
                       &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.                        &mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."</p>\n");
                       &mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.').  
                       "</p>\n");  
         } else {          } else {
             $r->print('<p>'.&mt('No roles added').'</p>');              $r->print('<p>'.&mt('No roles added').'</p>');
         }          }
Line 5059  sub upfile_drop_add { Line 4922  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 5068  sub upfile_drop_add { Line 4930  sub upfile_drop_add {
             #  Get current classlist              #  Get current classlist
             my $classlist = &Apache::loncoursedata::get_classlist();              my $classlist = &Apache::loncoursedata::get_classlist();
             if (! defined($classlist)) {              if (! defined($classlist)) {
                 $r->print('<p class="LC_info">'.                  $r->print('<form name="studentform" method="post" action="/adm/createuser">'.
                           &mt('There are no students with current/future access to the course.').                            '<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'.
                           '</p>'."\n");                            '<p class="LC_info">'.&mt('There are no students with current/future access to the course.').'</p>'.
                             '</form>'."\n");
             } elsif (ref($classlist) eq 'HASH') {              } elsif (ref($classlist) eq 'HASH') {
                 # Remove the students we just added from the list of students.                  # Remove the students we just added from the list of students.
                 foreach my $line (@userdata) {                  foreach my $line (@userdata) {
Line 5086  sub upfile_drop_add { Line 4949  sub upfile_drop_add {
             }              }
         }          }
     } # end of unless      } # end of unless
     return 'ok';      if ($env{'form.fullup'} ne 'yes') {
           $r->print('</form>');
       }
 }  }
   
 sub print_namespacing_alerts {  sub print_namespacing_alerts {
Line 5129  sub print_namespacing_alerts { Line 4994  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'}) {  
                 my $min = $passwdconf{'min'};  
                 if ($min eq '') {  
                     $min = $Apache::lonnet::passwdmin;  
                 }  
                 $warning .= '<li>'.&mt('minimum [quant,_1,character]',$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 5980  sub can_modify_userinfo { Line 5809  sub can_modify_userinfo {
     my %domconfig =      my %domconfig =
        &Apache::lonnet::get_dom('configuration',['usermodification'],         &Apache::lonnet::get_dom('configuration',['usermodification'],
                                 $dom);                                  $dom);
     if (($context eq 'author') &&  
         ($env{'request.role'} =~ m{^(ca|aa)\./$match_domain/$match_username$})) {  
         $context = 'coauthor';  
     }  
     my %canmodify;      my %canmodify;
     if (ref($fields) eq 'ARRAY') {      if (ref($fields) eq 'ARRAY') {
         foreach my $field (@{$fields}) {          foreach my $field (@{$fields}) {
Line 6038  sub can_modify_userinfo { Line 5863  sub can_modify_userinfo {
     return %canmodify;      return %canmodify;
 }  }
   
 sub can_change_internalpass {  
     my ($uname,$udom,$crstype,$permission) = @_;  
     my $canchange;  
     if (&Apache::lonnet::allowed('mau',$udom)) {  
         $canchange = 1;  
     } elsif ((ref($permission) eq 'HASH') && ($permission->{'mip'}) &&  
              ($udom eq $env{'request.role.domain'})) {  
         unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) {  
             my ($cnum,$cdom) = &get_course_identity();  
             if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) {  
                 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,'.',  
                                                           $env{'user.name'}.':'.$env{'user.domain'},  
                                                           undef,undef,undef,'.');  
                 my %roleshash = &Apache::lonnet::get_my_roles($uname,$udom,'userroles',  
                                                               ['active','future']);  
                 foreach my $key (keys(%roleshash)) {  
                     my ($name,$domain,$role) = split(/:/,$key);  
                     if ($role eq 'st') {  
                         next if (($name eq $cnum) && ($domain eq $cdom));  
                         if ($owned{$domain.'_'.$name}) {  
                             if (ref($owned{$domain.'_'.$name}) eq 'HASH') {  
                                 if ($owned{$domain.'_'.$name}{'nopasswdchg'}) {  
                                     $noupdate = 1;  
                                     last;  
                                 }  
                             }  
                         } else {  
                             $noupdate = 1;  
                             last;  
                         }  
                     } else {  
                         $noupdate = 1;  
                         last;  
                     }  
                 }  
                 unless ($noupdate) {  
                     $canchange = 1;  
                 }  
             }  
         }  
     }  
     return $canchange;  
 }  
   
 sub check_usertype {  sub check_usertype {
     my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_;      my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_;
     my $usertype;      my $usertype;
Line 6222  sub get_permission { Line 5983  sub get_permission {
                     $permission{'selfenrolladmin'} = 1;                      $permission{'selfenrolladmin'} = 1;
                 }                  }
             }              }
             unless ($permission{'selfenrolladmin'}) {  
                 $permission{'selfenrollview'} = 1;  
             }  
         }          }
         if ($env{'request.course.id'}) {          if ($env{'request.course.id'}) {
             my $user;              my $user = $env{'user.name'}.':'.$env{'user.domain'};
             if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) {  
                 $user = $env{'user.name'}.':'.$env{'user.domain'};  
             }  
             if (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'} eq              if (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'} eq
                                   $user)) {                                    $user)) {
                 $permission{'owner'} = 1;                  $permission{'owner'} = 1;
                 if (&Apache::lonnet::allowed('mip',$env{'request.course.id'})) {  
                     $permission{'mip'} = 1;  
                 }  
             } elsif (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.co-owners'} ne '')) {              } elsif (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.co-owners'} ne '')) {
                 if (grep(/^\Q$user\E$/,split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.co-owners'}))) {                  if (grep(/^\Q$user\E$/,split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.co-owners'}))) {
                     $permission{'co-owner'} = 1;                      $permission{'co-owner'} = 1;
Line 6244  sub get_permission { Line 5996  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 6288  sub get_permission { Line 6025  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 6303  sub authorpriv { Line 6039  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 6351  sub get_course_identity { Line 6075  sub get_course_identity {
 }  }
   
 sub dc_setcourse_js {  sub dc_setcourse_js {
     my ($formname,$mode,$context,$showcredits,$domain) = @_;      my ($formname,$mode,$context,$showcredits) = @_;
     my ($dc_setcourse_code,$authen_check);      my ($dc_setcourse_code,$authen_check);
     my $cctext = &Apache::lonnet::plaintext('cc');      my $cctext = &Apache::lonnet::plaintext('cc');
     my $cotext = &Apache::lonnet::plaintext('co');      my $cotext = &Apache::lonnet::plaintext('co');
Line 6360  sub dc_setcourse_js { Line 6084  sub dc_setcourse_js {
     if ($mode eq 'upload') {      if ($mode eq 'upload') {
         $role = 'courserole';          $role = 'courserole';
     } else {      } else {
         $authen_check = &verify_authen($formname,$context,$domain);          $authen_check = &verify_authen($formname,$context);
     }      }
     $dc_setcourse_code = (<<"SCRIPTTOP");      $dc_setcourse_code = (<<"SCRIPTTOP");
 $authen_check  $authen_check
Line 6504  ENDSCRIPT Line 6228  ENDSCRIPT
 }  }
   
 sub verify_authen {  sub verify_authen {
     my ($formname,$context,$domain) = @_;      my ($formname,$context) = @_;
     my %alerts = &authcheck_alerts();      my %alerts = &authcheck_alerts();
     my $finish = "return 'ok';";      my $finish = "return 'ok';";
     if ($context eq 'author') {      if ($context eq 'author') {
         $finish = "document.$formname.submit();";          $finish = "document.$formname.submit();";
     }      }
     my ($numrules,$intargjs) =  
         &Apache::loncommon::passwd_validation_js('argpicked',$domain);  
     my $outcome = <<"ENDSCRIPT";      my $outcome = <<"ENDSCRIPT";
   
 function auth_check() {  function auth_check() {
Line 6545  function auth_check() { Line 6267  function auth_check() {
                 break;                  break;
             case 'int':              case 'int':
                 alertmsg = '$alerts{'ipass'}';                  alertmsg = '$alerts{'ipass'}';
                 break;  
             case 'fsys':              case 'fsys':
                 alertmsg = '$alerts{'ipass'}';                  alertmsg = '$alerts{'ipass'}';
                 break;                  break;
Line 6559  function auth_check() { Line 6280  function auth_check() {
             alert(alertmsg);              alert(alertmsg);
             return;              return;
         }          }
     } else if (logintype == 'int') {  
         var numrules = $numrules;  
         if (numrules > 0) {  
 $intargjs  
         }  
     }      }
     $finish      $finish
 }  }
Line 6715  sub selfenrollment_administration { Line 6431  sub selfenrollment_administration {
         }          }
     }      }
     if ($settings{'internal.selfenrollmgrdc'} ne '') {      if ($settings{'internal.selfenrollmgrdc'} ne '') {
         @in_domain = split(/,/,$settings{'internal.selfenrollmgrdc'});          my @in_domain = split(/,/,$settings{'internal.selfenrollmgrdc'});
         my @diffs = &Apache::loncommon::compare_arrays(\@in_domain,$possconfigs);          my @diffs = &Apache::loncommon::compare_arrays(\@in_domain,$possconfigs);
         unless (@diffs) {          unless (@diffs) {
             return (\@in_course,\@in_domain);              return (\@in_course,\@in_domain);

Removed from v.1.184.4.10.2.9  
changed lines
  Added in v.1.191


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