Diff for /loncom/interface/loncreateuser.pm between versions 1.100 and 1.114

version 1.100, 2005/02/17 08:29:42 version 1.114, 2006/05/09 14:38:10
Line 108  sub my_custom_roles { Line 108  sub my_custom_roles {
   
 sub authorpriv {  sub authorpriv {
     my ($auname,$audom)=@_;      my ($auname,$audom)=@_;
     if (($auname ne $ENV{'user.name'}) ||      unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))
         (($audom ne $ENV{'user.domain'}) &&           || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; }
          ($audom ne $ENV{'request.role.domain'}))) { return ''; }  
     unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; }  
     return 1;      return 1;
 }  }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub print_username_entry_form {  sub print_username_entry_form {
     my $r=shift;      my ($r) = @_;
     my $defdom=$ENV{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
     my @domains = &Apache::loncommon::get_domains();      my @domains = &Apache::loncommon::get_domains();
     my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');      my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
     my $html=&Apache::lonxml::xmlbegin();  
     my $bodytag =&Apache::loncommon::bodytag('Create Users, Change User Privileges').&Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface');  
     my $selscript=&Apache::loncommon::studentbrowser_javascript();      my $selscript=&Apache::loncommon::studentbrowser_javascript();
       my $start_page =
    &Apache::loncommon::start_page('Create Users, Change User Privileges',
          $selscript);
   
     my $sellink=&Apache::loncommon::selectstudent_link      my $sellink=&Apache::loncommon::selectstudent_link
                                         ('crtuser','ccuname','ccdomain');                                          ('crtuser','ccuname','ccdomain');
     my %existingroles=&my_custom_roles();      my %existingroles=&my_custom_roles();
Line 139  sub print_username_entry_form { Line 139  sub print_username_entry_form {
                     'nr'   => "Name of Role",                      'nr'   => "Name of Role",
                     'cre'  => "Custom Role Editor"                      'cre'  => "Custom Role Editor"
        );         );
       my $help = &Apache::loncommon::help_open_menu('',undef,undef,'',282,'Instructor Interface');
     my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');      my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges');
     my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');      my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles');
     $r->print(<<"ENDDOCUMENT");      $r->print(<<"ENDDOCUMENT");
 $html  $start_page
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 $selscript  
 </head>  
 $bodytag  
 <form action="/adm/createuser" method="post" name="crtuser">  <form action="/adm/createuser" method="post" name="crtuser">
 <input type="hidden" name="phase" value="get_user_info">  <input type="hidden" name="phase" value="get_user_info">
 <h2>$lt{siur}$helpsiur</h2>  <h2>$lt{siur}$helpsiur</h2>
Line 158  $lt{'dom'}:</td><td>$domform</td></tr> Line 154  $lt{'dom'}:</td><td>$domform</td></tr>
 </table>  </table>
 <input name="userrole" type="submit" value="$lt{usrr}" />  <input name="userrole" type="submit" value="$lt{usrr}" />
 </form>  </form>
   ENDDOCUMENT
      if (&Apache::lonnet::allowed('mcr','/')) {
          $r->print(<<ENDCUSTOM);
 <form action="/adm/createuser" method="post" name="docustom">  <form action="/adm/createuser" method="post" name="docustom">
 <input type="hidden" name="phase" value="selected_custom_edit">  <input type="hidden" name="phase" value="selected_custom_edit">
 <h2>$lt{'ecrp'}$helpecpr</h2>  <h2>$lt{'ecrp'}$helpecpr</h2>
 $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />  $lt{'nr'}: $choice <input type="text" size="15" name="newrolename" /><br />
 <input name="customeditor" type="submit" value="$lt{'cre'}" />  <input name="customeditor" type="submit" value="$lt{'cre'}" />
 </body>  </form>
 </html>  ENDCUSTOM
 ENDDOCUMENT      }
       $r->print(&Apache::loncommon::end_page());
   }
   
   
   sub user_modification_js {
       my ($pjump_def,$dc_setcourse_code,$nondc_setsection_code,$groupslist)=@_;
       
       return <<END;
   <script type="text/javascript" language="Javascript">
   
       function pclose() {
           parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                    "height=350,width=350,scrollbars=no,menubar=no");
           parmwin.close();
       }
   
       $pjump_def
       $dc_setcourse_code
   
       function dateset() {
           eval("document.cu."+document.cu.pres_marker.value+
               ".value=document.cu.pres_value.value");
           pclose();
       }
   
       $nondc_setsection_code
   
       function setSections() {
           var re1 = /^currsec_/;
           var groups = new Array($groupslist);
           for (var i=0;i<document.cu.elements.length;i++) {
               var str = document.cu.elements[i].name;
               var checkcurr = str.match(re1);
               if (checkcurr != null) {
                   var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;
                   if (document.cu.elements[i-1].checked == true) {
                       var re2 = /^currsec_[a-zA-Z0-9]+_[a-zA-Z0-9]+_(\\w+)\$/;
                       match = re2.exec(str);
                       var role = match[1];
                       if (role == 'cc') {
                           alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                       }
                       else {
                           var sections = '';
                           var numsec = 0;
                           var sections;
                           for (var j=0; j<document.cu.elements[i].length; j++) {
                               if (document.cu.elements[i].options[j].selected == true ) {
                                   if (document.cu.elements[i].options[j].value != "") {
                                       if (numsec == 0) {
                                           if (document.cu.elements[i].options[j].value != "") {
                                               sections = document.cu.elements[i].options[j].value;
                                               numsec ++;
                                           }
                                       }
                                       else {
                                           sections = sections + "," +  document.cu.elements[i].options[j].value
                                           numsec ++;
                                       }
                                   }
                               }
                           }
                           if (numsec > 0) {
                               if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {
                                   sections = sections + "," +  document.cu.elements[i+1].value;
                               }
                           }
                           else {
                               sections = document.cu.elements[i+1].value;    
                           }
                           var newsecs = document.cu.elements[i+1].value;
                           if (newsecs != null && newsecs != "") {
                               var numsplit = newsecs.split(/,/g);
                               numsec = numsec + numsplit.length;
                           }
                           if ((role == 'st') && (numsec > 1)) {
                               alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")  
                               return;
                           }
                           else {
                               for (var j=0; j<numsplit.length; j++) {
                                   if ((numsplit[j] == 'all') || 
                                       (numsplit[j] == 'none')) {
                                       alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
                                       return;
                                   }
                                   for (var k=0; k<groups.length; k++) {
                                       if (numsplit[j] == groups[k]) {
                                           alert("'"+numsplit[j]+"' may not be used as a section name, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
                                           return;
                                       }
                                   }
                               }
                               document.cu.elements[i+2].value = sections;
                           }
                       }
                   }
               }
           }
           document.cu.submit();
       }
   </script>
   END
 }  }
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub print_user_modification_page {  sub print_user_modification_page {
     my $r=shift;      my $r=shift;
     my $ccuname=$ENV{'form.ccuname'};      my $ccuname=$env{'form.ccuname'};
     my $ccdomain=$ENV{'form.ccdomain'};      my $ccdomain=$env{'form.ccdomain'};
   
     $ccuname=~s/\W//g;      $ccuname=~s/\W//g;
     $ccdomain=~s/\W//g;      $ccdomain=~s/\W//g;
Line 182  sub print_user_modification_page { Line 284  sub print_user_modification_page {
         return;          return;
     }      }
   
     my $defdom=$ENV{'request.role.domain'};      my $defdom=$env{'request.role.domain'};
   
     my ($krbdef,$krbdefdom) =      my ($krbdef,$krbdefdom) =
        &Apache::loncommon::get_kerberos_defaults($defdom);         &Apache::loncommon::get_kerberos_defaults($defdom);
Line 198  sub print_user_modification_page { Line 300  sub print_user_modification_page {
     $ccdomain=~s/\W//g;      $ccdomain=~s/\W//g;
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dc_setcourse_code = '';      my $dc_setcourse_code = '';
     my $loaditem;      my $nondc_setsection_code = '';
     if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) {      my %loaditem;
   
       my $groupslist;
       my %curr_groups = &Apache::loncommon::coursegroups();
       if (%curr_groups) {
           $groupslist = join('","',sort(keys(%curr_groups)));
           $groupslist = '"'.$groupslist.'"';   
       }
   
       if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {
         my $dcdom = $1;          my $dcdom = $1;
         $loaditem = qq|OnLoad="document.cu.coursedesc.value=''"|;          $loaditem{'onload'} = "document.cu.coursedesc.value=''";
         $dc_setcourse_code = <<"ENDSCRIPT";          $dc_setcourse_code = <<"ENDSCRIPT";
     function setCourse() {      function setCourse() {
         var course = document.cu.dccourse.value;          var course = document.cu.dccourse.value;
Line 241  sub print_user_modification_page { Line 352  sub print_user_modification_page {
                 alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.")                  alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.")
                 return;                  return;
             }              }
               for (var j=0; j<numsplit.length; j++) {
                   if ((numsplit[j] == 'all') || (numsplit[j] == 'none')) {
                       alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
                       return;
                   }
                   if (document.cu.groups.value != '') {
                       var groups = document.cu.groups.value.split(/,/g);
                       for (var k=0; k<groups.length; k++) {
                           if (numsplit[j] == groups[k]) {
                               alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
                               return; 
                           }
                       }
                   }
               }
             if ((userrole == 'cc') && (numsections > 0)) {              if ((userrole == 'cc') && (numsections > 0)) {
                 alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");                  alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections.");
                 section = "";                  section = "";
Line 271  sub print_user_modification_page { Line 397  sub print_user_modification_page {
         return -1;          return -1;
     }      }
 ENDSCRIPT  ENDSCRIPT
     }      } else {
     my $html=&Apache::lonxml::xmlbegin();          $nondc_setsection_code = <<"ENDSECCODE";
     my $dochead =<<"ENDDOCHEAD";  
 $html  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 <script type="text/javascript" language="Javascript">  
   
     function pclose() {  
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",  
                  "height=350,width=350,scrollbars=no,menubar=no");  
         parmwin.close();  
     }  
   
     $pjump_def  
     $dc_setcourse_code  
   
     function dateset() {  
         eval("document.cu."+document.cu.pres_marker.value+  
             ".value=document.cu.pres_value.value");  
         pclose();  
     }  
   
     function setSections() {      function setSections() {
         var re1 = /^currsec_/;          var re1 = /^currsec_/;
           var groups = new Array($groupslist);
         for (var i=0;i<document.cu.elements.length;i++) {          for (var i=0;i<document.cu.elements.length;i++) {
             var str = document.cu.elements[i].name;              var str = document.cu.elements[i].name;
             var checkcurr = str.match(re1);              var checkcurr = str.match(re1);
Line 331  $html Line 437  $html
                         if (numsec > 0) {                          if (numsec > 0) {
                             if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {                              if (document.cu.elements[i+1].value != "" && document.cu.elements[i+1].value != null) {
                                 sections = sections + "," +  document.cu.elements[i+1].value;                                  sections = sections + "," +  document.cu.elements[i+1].value;
                             }                               }
                         }                          }
                         else {                          else {
                             sections = document.cu.elements[i+1].value;                                  sections = document.cu.elements[i+1].value;
                         }                          }
                         var newsecs = document.cu.elements[i+1].value;                          var newsecs = document.cu.elements[i+1].value;
                         if (newsecs != null && newsecs != "") {                          if (newsecs != null && newsecs != "") {
Line 342  $html Line 448  $html
                             numsec = numsec + numsplit.length;                              numsec = numsec + numsplit.length;
                         }                          }
                         if ((role == 'st') && (numsec > 1)) {                          if ((role == 'st') && (numsec > 1)) {
                             alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")                                alert("In each course, each user may only have one student role at a time. You had selected "+numsec+" sections.\\nPlease modify your selections so they include no more than one section.")
                             return;                              return;
                         }                          }
                         else {                           else {
                               for (var j=0; j<numsplit.length; j++) {
                                   if ((numsplit[j] == 'all') ||
                                       (numsplit[j] == 'none')) {
                                       alert("'"+numsplit[j]+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
                                       return;
                                   }
                                   for (var k=0; k<groups.length; k++) {
                                       if (numsplit[j] == groups[k]) {
                                           alert("'"+numsplit[j]+"' may not be used as a section name, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
                                           return;
                                       }
                                   }
                               }
                             document.cu.elements[i+2].value = sections;                              document.cu.elements[i+2].value = sections;
                         }                          }
                     }                      }
Line 354  $html Line 473  $html
         }          }
         document.cu.submit();          document.cu.submit();
     }      }
 </script>  ENDSECCODE
 </head>      }
 ENDDOCHEAD      my $js = &user_modification_js($pjump_def,$dc_setcourse_code,
     $r->print(&Apache::loncommon::bodytag(                                     $nondc_setsection_code,$groupslist);
                                      'Create Users, Change User Privileges',undef,$loaditem));      my $start_page = 
    &Apache::loncommon::start_page('Create Users, Change User Privileges',
          $js,{'add_entries' => \%loaditem,});
   
     my $forminfo =<<"ENDFORMINFO";      my $forminfo =<<"ENDFORMINFO";
 <form action="/adm/createuser" method="post" name="cu">  <form action="/adm/createuser" method="post" name="cu">
 <input type="hidden" name="phase"       value="update_user_data">  <input type="hidden" name="phase"       value="update_user_data">
Line 374  ENDFORMINFO Line 496  ENDFORMINFO
     foreach (values(%Apache::lonnet::hostdom)) {      foreach (values(%Apache::lonnet::hostdom)) {
        $incdomains{$_}=1;         $incdomains{$_}=1;
     }      }
     foreach (keys(%ENV)) {      foreach (keys(%env)) {
  if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) {   if ($_=~/^user\.priv\.cm\.\/(\w+)\/(\w+)/) {
     $inccourses{$1.'_'.$2}=1;      $inccourses{$1.'_'.$2}=1;
         }          }
Line 400  ENDFORMINFO Line 522  ENDFORMINFO
  my $genhelp=&Apache::loncommon::help_open_topic('Generation');   my $genhelp=&Apache::loncommon::help_open_topic('Generation');
         &initialize_authen_forms();          &initialize_authen_forms();
  $r->print(<<ENDNEWUSER);   $r->print(<<ENDNEWUSER);
 $dochead  $start_page
 <h1>$lt{'cnu'}</h1>  <h1>$lt{'cnu'}</h1>
 $forminfo  $forminfo
 <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>  <h2>$lt{'nu'} "$ccuname" $lt{'id'} $ccdomain</h2>
Line 441  ENDNEWUSER Line 563  ENDNEWUSER
                     'gen'  => "generation"                      'gen'  => "generation"
        );         );
  $r->print(<<ENDCHANGEUSER);   $r->print(<<ENDCHANGEUSER);
 $dochead  $start_page
 <h1>$lt{'cup'}</h1>  <h1>$lt{'cup'}</h1>
 $forminfo  $forminfo
 <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>  <h2>$lt{'usr'} "$ccuname" $lt{'id'} "$ccdomain"</h2>
Line 544  END Line 666  END
                    $bgcol=~s/[^7-9a-e]//g;                     $bgcol=~s/[^7-9a-e]//g;
                    $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);                     $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
                    if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {                     if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
                        $carea.='<br>Section/Group: '.$3;                         $carea.='<br />Section: '.$3;
        $sortkey.="\0$3";         $sortkey.="\0$3";
                    }                     }
                    $area=$carea;                     $area=$carea;
Line 574  END Line 696  END
        $class='Domain';         $class='Domain';
    }     }
                }                 }
                if ($role_code eq 'ca') {                 if (($role_code eq 'ca') || ($role_code eq 'aa')) {
                    $area=~/\/(\w+)\/(\w+)/;                     $area=~/\/(\w+)\/(\w+)/;
    if (&authorpriv($2,$1)) {     if (&authorpriv($2,$1)) {
        $allowed=1;         $allowed=1;
Line 663  END Line 785  END
  my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);   my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
  if ($currentauth=~/^krb(4|5):/) {   if ($currentauth=~/^krb(4|5):/) {
     $currentauth=~/^krb(4|5):(.*)/;      $currentauth=~/^krb(4|5):(.*)/;
     my $krbdefdom=$1;      my $krbdefdom=$2;
             my %param = ( formname => 'document.cu',              my %param = ( formname => 'document.cu',
                           kerb_def_dom => $krbdefdom                             kerb_def_dom => $krbdefdom 
                           );                            );
Line 675  END Line 797  END
  $currentauth=~/^internal:/ or   $currentauth=~/^internal:/ or
  $currentauth=~/^localauth:/   $currentauth=~/^localauth:/
  ) { # bad authentication scheme   ) { # bad authentication scheme
     if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {      if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
                 &initialize_authen_forms();                  &initialize_authen_forms();
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                                'err'   => "ERROR",                                 'err'   => "ERROR",
Line 740  ENDBADAUTH Line 862  ENDBADAUTH
                     "<p>$authformint</p><p>$authformfsys</p>";                      "<p>$authformint</p><p>$authformfsys</p>";
     }      }
             $authformcurrent.=' <i>(will override current values)</i><br />';              $authformcurrent.=' <i>(will override current values)</i><br />';
             if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {              if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
  # Current user has login modification privileges   # Current user has login modification privileges
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                                'ccld'  => "Change Current Login Data",                                 'ccld'  => "Change Current Login Data",
Line 765  ENDOTHERAUTHS Line 887  ENDOTHERAUTHS
 #  #
 # Co-Author  # Co-Author
 #   # 
     if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) &&      if (&authorpriv($env{'user.name'},$env{'request.role.domain'}) &&
         ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) {          ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) {
         # No sense in assigning co-author role to yourself          # No sense in assigning co-author role to yourself
  my $cuname=$ENV{'user.name'};   my $cuname=$env{'user.name'};
         my $cudom=$ENV{'request.role.domain'};          my $cudom=$env{'request.role.domain'};
    my %lt=&Apache::lonlocal::texthash(     my %lt=&Apache::lonlocal::texthash(
     'cs'   => "Construction Space",      'cs'   => "Construction Space",
                     'act'  => "Activate",                                          'act'  => "Activate",                    
Line 778  ENDOTHERAUTHS Line 900  ENDOTHERAUTHS
                     'sta'  => "Start",                      'sta'  => "Start",
                     'end'  => "End",                      'end'  => "End",
                     'cau'  => "Co-Author",                      'cau'  => "Co-Author",
                       'caa'  => "Assistant Co-Author",
                     'ssd'  => "Set Start Date",                      'ssd'  => "Set Start Date",
                     'sed'  => "Set End Date"                      'sed'  => "Set End Date"
        );         );
Line 796  ENDOTHERAUTHS Line 919  ENDOTHERAUTHS
 <a href=  <a href=
 "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>  "javascript:pjump('date_end','End Date Co-Author',document.cu.end_$cudom\_$cuname\_ca.value,'end_$cudom\_$cuname\_ca','cu.pres','dateset')">$lt{'sed'}</a></td>
 </tr>  </tr>
   <tr>
   <td><input type=checkbox name="act_$cudom\_$cuname\_aa" /></td>
   <td>$lt{'caa'}</td>
   <td>$cudom\_$cuname</td>
   <td><input type=hidden name="start_$cudom\_$cuname\_aa" value='' />
   <a href=
   "javascript:pjump('date_start','Start Date Assistant Co-Author',document.cu.start_$cudom\_$cuname\_aa.value,'start_$cudom\_$cuname\_aa','cu.pres','dateset')">$lt{'ssd'}</a></td>
   <td><input type=hidden name="end_$cudom\_$cuname\_aa" value='' />
   <a href=
   "javascript:pjump('date_end','End Date Assistant Co-Author',document.cu.end_$cudom\_$cuname\_aa.value,'end_$cudom\_$cuname\_aa','cu.pres','dateset')">$lt{'sed'}</a></td>
   </tr>
 </table>  </table>
 ENDCOAUTH  ENDCOAUTH
     }      }
Line 842  ENDDROW Line 976  ENDDROW
 #  #
     my $num_sections;      my $num_sections;
   
     if ($ENV{'request.role'} =~ m-^dc\./(\w+)/$-) {      if ($env{'request.role'} =~ m-^dc\./(\w+)/$-) {
         $r->print(&course_level_dc($1));          $r->print(&course_level_dc($1));
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");          $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setCourse()">'."\n");
     } else {      } else {
         $r->print(&course_level_table(%inccourses));          $r->print(&course_level_table(%inccourses));
         $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n");          $r->print('<hr /><input type="button" value="'.&mt('Modify User').'" onClick="setSections()">'."\n");
     }      }
     $r->print("</form></body></html>");      $r->print("</form>".&Apache::loncommon::end_page());
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub update_user_data {  sub update_user_data {
     my $r=shift;      my $r=shift;
     my $uhome=&Apache::lonnet::homeserver($ENV{'form.ccuname'},      my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'},
                                           $ENV{'form.ccdomain'});                                            $env{'form.ccdomain'});
     # Error messages      # Error messages
     my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';      my $error     = '<font color="#ff0000">'.&mt('Error').':</font>';
     my $end       = '</body></html>';      my $end       = &Apache::loncommon::end_page();
     # Print header  
     my $html=&Apache::lonxml::xmlbegin();  
     $r->print(<<ENDTHREEHEAD);  
 $html  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 </head>  
 ENDTHREEHEAD  
     my $title;      my $title;
     if (exists($ENV{'form.makeuser'})) {      if (exists($env{'form.makeuser'})) {
  $title='Set Privileges for New User';   $title='Set Privileges for New User';
     } else {      } else {
         $title='Modify User Privileges';          $title='Modify User Privileges';
     }      }
     $r->print(&Apache::loncommon::bodytag($title));      $r->print(&Apache::loncommon::start_page($title));
       my %disallowed;
     # Check Inputs      # Check Inputs
     if (! $ENV{'form.ccuname'} ) {      if (! $env{'form.ccuname'} ) {
  $r->print($error.&mt('No login name specified').'.'.$end);   $r->print($error.&mt('No login name specified').'.'.$end);
  return;   return;
     }      }
     if (  $ENV{'form.ccuname'}  =~/\W/) {      if (  $env{'form.ccuname'}  =~/\W/) {
  $r->print($error.&mt('Invalid login name').'.  '.   $r->print($error.&mt('Invalid login name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, and underscores are valid').'.'.
   $end);    $end);
  return;   return;
     }      }
     if (! $ENV{'form.ccdomain'}       ) {      if (! $env{'form.ccdomain'}       ) {
  $r->print($error.&mt('No domain specified').'.'.$end);   $r->print($error.&mt('No domain specified').'.'.$end);
  return;   return;
     }      }
     if (  $ENV{'form.ccdomain'} =~/\W/) {      if (  $env{'form.ccdomain'} =~/\W/) {
  $r->print($error.&mt ('Invalid domain name').'.  '.   $r->print($error.&mt ('Invalid domain name').'.  '.
   &mt('Only letters, numbers, and underscores are valid').'.'.    &mt('Only letters, numbers, and underscores are valid').'.'.
   $end);    $end);
  return;   return;
     }      }
     if (! exists($ENV{'form.makeuser'})) {      if (! exists($env{'form.makeuser'})) {
         # Modifying an existing user, so check the validity of the name          # Modifying an existing user, so check the validity of the name
         if ($uhome eq 'no_host') {          if ($uhome eq 'no_host') {
             $r->print($error.&mt('Unable to determine home server for ').              $r->print($error.&mt('Unable to determine home server for ').
                       $ENV{'form.ccuname'}.&mt(' in domain ').                        $env{'form.ccuname'}.&mt(' in domain ').
                       $ENV{'form.ccdomain'}.'.');                        $env{'form.ccdomain'}.'.');
             return;              return;
         }          }
     }      }
     # Determine authentication method and password for the user being modified      # Determine authentication method and password for the user being modified
     my $amode='';      my $amode='';
     my $genpwd='';      my $genpwd='';
     if ($ENV{'form.login'} eq 'krb') {      if ($env{'form.login'} eq 'krb') {
  $amode='krb';   $amode='krb';
  $amode.=$ENV{'form.krbver'};   $amode.=$env{'form.krbver'};
  $genpwd=$ENV{'form.krbarg'};   $genpwd=$env{'form.krbarg'};
     } elsif ($ENV{'form.login'} eq 'int') {      } elsif ($env{'form.login'} eq 'int') {
  $amode='internal';   $amode='internal';
  $genpwd=$ENV{'form.intarg'};   $genpwd=$env{'form.intarg'};
     } elsif ($ENV{'form.login'} eq 'fsys') {      } elsif ($env{'form.login'} eq 'fsys') {
  $amode='unix';   $amode='unix';
  $genpwd=$ENV{'form.fsysarg'};   $genpwd=$env{'form.fsysarg'};
     } elsif ($ENV{'form.login'} eq 'loc') {      } elsif ($env{'form.login'} eq 'loc') {
  $amode='localauth';   $amode='localauth';
  $genpwd=$ENV{'form.locarg'};   $genpwd=$env{'form.locarg'};
  $genpwd=" " if (!$genpwd);   $genpwd=" " if (!$genpwd);
     } elsif (($ENV{'form.login'} eq 'nochange') ||      } elsif (($env{'form.login'} eq 'nochange') ||
              ($ENV{'form.login'} eq ''        )) {                ($env{'form.login'} eq ''        )) { 
         # There is no need to tell the user we did not change what they          # There is no need to tell the user we did not change what they
         # did not ask us to change.          # did not ask us to change.
         # If they are creating a new user but have not specified login          # If they are creating a new user but have not specified login
Line 932  ENDTHREEHEAD Line 1060  ENDTHREEHEAD
     $r->print($error.&mt('Invalid login mode or password').$end);          $r->print($error.&mt('Invalid login mode or password').$end);    
     return;      return;
     }      }
     if ($ENV{'form.makeuser'}) {      if ($env{'form.makeuser'}) {
         # Create a new user          # Create a new user
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
                     'cru'  => "Creating user",                                          'cru'  => "Creating user",                    
                     'id'   => "in domain"                      'id'   => "in domain"
    );     );
  $r->print(<<ENDNEWUSERHEAD);   $r->print(<<ENDNEWUSERHEAD);
 <h3>$lt{'cru'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h3>  <h3>$lt{'cru'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h3>
 ENDNEWUSERHEAD  ENDNEWUSERHEAD
         # Check for the authentication mode and password          # Check for the authentication mode and password
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
Line 947  ENDNEWUSERHEAD Line 1075  ENDNEWUSERHEAD
     return;      return;
  }   }
         # Determine desired host          # Determine desired host
         my $desiredhost = $ENV{'form.hserver'};          my $desiredhost = $env{'form.hserver'};
         if (lc($desiredhost) eq 'default') {          if (lc($desiredhost) eq 'default') {
             $desiredhost = undef;              $desiredhost = undef;
         } else {          } else {
             my %home_servers = &Apache::loncommon::get_library_servers              my %home_servers = &Apache::loncommon::get_library_servers
                 ($ENV{'form.ccdomain'});                    ($env{'form.ccdomain'});  
             if (! exists($home_servers{$desiredhost})) {              if (! exists($home_servers{$desiredhost})) {
                 $r->print($error.&mt('Invalid home server specified'));                  $r->print($error.&mt('Invalid home server specified'));
                 return;                  return;
Line 960  ENDNEWUSERHEAD Line 1088  ENDNEWUSERHEAD
         }          }
  # Call modifyuser   # Call modifyuser
  my $result = &Apache::lonnet::modifyuser   my $result = &Apache::lonnet::modifyuser
     ($ENV{'form.ccdomain'},$ENV{'form.ccuname'},$ENV{'form.cstid'},      ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cstid'},
              $amode,$genpwd,$ENV{'form.cfirst'},               $amode,$genpwd,$env{'form.cfirst'},
              $ENV{'form.cmiddle'},$ENV{'form.clast'},$ENV{'form.cgen'},               $env{'form.cmiddle'},$env{'form.clast'},$env{'form.cgen'},
              undef,$desiredhost               undef,$desiredhost
      );       );
  $r->print(&mt('Generating user').': '.$result);   $r->print(&mt('Generating user').': '.$result);
         my $home = &Apache::lonnet::homeserver($ENV{'form.ccuname'},          my $home = &Apache::lonnet::homeserver($env{'form.ccuname'},
                                                $ENV{'form.ccdomain'});                                                 $env{'form.ccdomain'});
         $r->print('<br />'.&mt('Home server').': '.$home.' '.          $r->print('<br />'.&mt('Home server').': '.$home.' '.
                   $Apache::lonnet::libserv{$home});                    $Apache::lonnet::libserv{$home});
     } elsif (($ENV{'form.login'} ne 'nochange') &&      } elsif (($env{'form.login'} ne 'nochange') &&
              ($ENV{'form.login'} ne ''        )) {               ($env{'form.login'} ne ''        )) {
  # Modify user privileges   # Modify user privileges
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                     'usr'  => "User",                                          'usr'  => "User",                    
                     'id'   => "in domain"                      'id'   => "in domain"
        );         );
  $r->print(<<ENDMODIFYUSERHEAD);   $r->print(<<ENDMODIFYUSERHEAD);
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  <h2>$lt{'usr'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h2>
 ENDMODIFYUSERHEAD  ENDMODIFYUSERHEAD
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
     $r->print($error.'Invalid login mode or password'.$end);          $r->print($error.'Invalid login mode or password'.$end);    
     return;      return;
  }   }
  # Only allow authentification modification if the person has authority   # Only allow authentification modification if the person has authority
  if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'})) {   if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) {
     $r->print('Modifying authentication: '.      $r->print('Modifying authentication: '.
                       &Apache::lonnet::modifyuserauth(                        &Apache::lonnet::modifyuserauth(
        $ENV{'form.ccdomain'},$ENV{'form.ccuname'},         $env{'form.ccdomain'},$env{'form.ccuname'},
                        $amode,$genpwd));                         $amode,$genpwd));
             $r->print('<br>'.&mt('Home server').': '.&Apache::lonnet::homeserver              $r->print('<br />'.&mt('Home server').': '.&Apache::lonnet::homeserver
   ($ENV{'form.ccuname'},$ENV{'form.ccdomain'}));    ($env{'form.ccuname'},$env{'form.ccdomain'}));
  } else {   } else {
     # Okay, this is a non-fatal error.      # Okay, this is a non-fatal error.
     $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');          $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.');    
  }   }
     }      }
     ##      ##
     if (! $ENV{'form.makeuser'} ) {      if (! $env{'form.makeuser'} ) {
         # Check for need to change          # Check for need to change
         my %userenv = &Apache::lonnet::get          my %userenv = &Apache::lonnet::get
             ('environment',['firstname','middlename','lastname','generation'],              ('environment',['firstname','middlename','lastname','generation'],
              $ENV{'form.ccdomain'},$ENV{'form.ccuname'});               $env{'form.ccdomain'},$env{'form.ccuname'});
         my ($tmp) = keys(%userenv);          my ($tmp) = keys(%userenv);
         if ($tmp =~ /^(con_lost|error)/i) {           if ($tmp =~ /^(con_lost|error)/i) { 
             %userenv = ();              %userenv = ();
Line 1010  ENDMODIFYUSERHEAD Line 1138  ENDMODIFYUSERHEAD
         # Check to see if we need to change user information          # Check to see if we need to change user information
         foreach ('firstname','middlename','lastname','generation') {          foreach ('firstname','middlename','lastname','generation') {
             # Strip leading and trailing whitespace              # Strip leading and trailing whitespace
             $ENV{'form.c'.$_} =~ s/(\s+$|^\s+)//g;               $env{'form.c'.$_} =~ s/(\s+$|^\s+)//g; 
         }          }
         if (&Apache::lonnet::allowed('mau',$ENV{'form.ccdomain'}) &&           if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}) && 
             ($ENV{'form.cfirstname'}  ne $userenv{'firstname'}  ||              ($env{'form.cfirstname'}  ne $userenv{'firstname'}  ||
              $ENV{'form.cmiddlename'} ne $userenv{'middlename'} ||               $env{'form.cmiddlename'} ne $userenv{'middlename'} ||
              $ENV{'form.clastname'}   ne $userenv{'lastname'}   ||               $env{'form.clastname'}   ne $userenv{'lastname'}   ||
              $ENV{'form.cgeneration'} ne $userenv{'generation'} )) {               $env{'form.cgeneration'} ne $userenv{'generation'} )) {
             # Make the change              # Make the change
             my %changeHash;              my %changeHash;
             $changeHash{'firstname'}  = $ENV{'form.cfirstname'};              $changeHash{'firstname'}  = $env{'form.cfirstname'};
             $changeHash{'middlename'} = $ENV{'form.cmiddlename'};              $changeHash{'middlename'} = $env{'form.cmiddlename'};
             $changeHash{'lastname'}   = $ENV{'form.clastname'};              $changeHash{'lastname'}   = $env{'form.clastname'};
             $changeHash{'generation'} = $ENV{'form.cgeneration'};              $changeHash{'generation'} = $env{'form.cgeneration'};
             my $putresult = &Apache::lonnet::put              my $putresult = &Apache::lonnet::put
                 ('environment',\%changeHash,                  ('environment',\%changeHash,
                  $ENV{'form.ccdomain'},$ENV{'form.ccuname'});                   $env{'form.ccdomain'},$env{'form.ccuname'});
             if ($putresult eq 'ok') {              if ($putresult eq 'ok') {
             # Tell the user we changed the name              # Tell the user we changed the name
  my %lt=&Apache::lonlocal::texthash(   my %lt=&Apache::lonlocal::texthash(
Line 1051  ENDMODIFYUSERHEAD Line 1179  ENDMODIFYUSERHEAD
     <td>$userenv{'lastname'}   </td>      <td>$userenv{'lastname'}   </td>
     <td>$userenv{'generation'} </td></tr>      <td>$userenv{'generation'} </td></tr>
 <tr><td>$lt{'chto'}</td>  <tr><td>$lt{'chto'}</td>
     <td>$ENV{'form.cfirstname'}  </td>      <td>$env{'form.cfirstname'}  </td>
     <td>$ENV{'form.cmiddlename'} </td>      <td>$env{'form.cmiddlename'} </td>
     <td>$ENV{'form.clastname'}   </td>      <td>$env{'form.clastname'}   </td>
     <td>$ENV{'form.cgeneration'} </td></tr>      <td>$env{'form.cgeneration'} </td></tr>
 </table>  </table>
 END  END
             } else { # error occurred              } else { # error occurred
                 $r->print("<h2>".&mt('Unable to successfully change environment for')." ".                  $r->print("<h2>".&mt('Unable to successfully change environment for')." ".
                       $ENV{'form.ccuname'}." ".&mt('in domain')." ".                        $env{'form.ccuname'}." ".&mt('in domain')." ".
                       $ENV{'form.ccdomain'}."</h2>");                        $env{'form.ccdomain'}."</h2>");
             }              }
         }  else { # End of if ($ENV ... ) logic          }  else { # End of if ($env ... ) logic
             # They did not want to change the users name but we can              # They did not want to change the users name but we can
             # still tell them what the name is              # still tell them what the name is
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
Line 1071  END Line 1199  END
                            'gen'  => "Generation"                             'gen'  => "Generation"
        );         );
                 $r->print(<<"END");                  $r->print(<<"END");
 <h2>$lt{'usr'} "$ENV{'form.ccuname'}" $lt{'id'} "$ENV{'form.ccdomain'}"</h2>  <h2>$lt{'usr'} "$env{'form.ccuname'}" $lt{'id'} "$env{'form.ccdomain'}"</h2>
 <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4>  <h4>$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} </h4>
 <h4>$lt{'gen'}: $userenv{'generation'}</h4>  <h4>$lt{'gen'}: $userenv{'generation'}</h4>
 END  END
Line 1080  END Line 1208  END
     ##      ##
     my $now=time;      my $now=time;
     $r->print('<h3>'.&mt('Modifying Roles').'</h3>');      $r->print('<h3>'.&mt('Modifying Roles').'</h3>');
     foreach (keys (%ENV)) {      foreach (keys (%env)) {
  next if (! $ENV{$_});   next if (! $env{$_});
  # Revoke roles   # Revoke roles
  if ($_=~/^form\.rev/) {   if ($_=~/^form\.rev/) {
     if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {      if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {
 # Revoke standard role  # Revoke standard role
         $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'.          $r->print(&mt('Revoking').' '.$2.' in '.$1.': <b>'.
                      &Apache::lonnet::revokerole($ENV{'form.ccdomain'},                       &Apache::lonnet::revokerole($env{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2).'</b><br>');                       $env{'form.ccuname'},$1,$2).'</b><br />');
  if ($2 eq 'st') {   if ($2 eq 'st') {
     $1=~/^\/(\w+)\/(\w+)/;      $1=~/^\/(\w+)\/(\w+)/;
     my $cid=$1.'_'.$2;      my $cid=$1.'_'.$2;
     $r->print(&mt('Drop from classlist').': <b>'.      $r->print(&mt('Drop from classlist').': <b>'.
  &Apache::lonnet::critical('put:'.   &Apache::lonnet::critical('put:'.
                              $ENV{'course.'.$cid.'.domain'}.':'.                               $env{'course.'.$cid.'.domain'}.':'.
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.                       $env{'course.'.$cid.'.num'}.':classlist:'.
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.                           &Apache::lonnet::escape($env{'form.ccuname'}.':'.
                              $ENV{'form.ccdomain'}).'='.                               $env{'form.ccdomain'}).'='.
                          &Apache::lonnet::escape($now.':'),                           &Apache::lonnet::escape($now.':'),
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');                       $env{'course.'.$cid.'.home'}).'</b><br />');
  }   }
     }       } 
     if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {      if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {
 # Revoke custom role  # Revoke custom role
  $r->print(&mt('Revoking custom role').   $r->print(&mt('Revoking custom role:').
                       ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.                        ' '.$4.' by '.$3.'@'.$2.' in '.$1.': <b>'.
                       &Apache::lonnet::revokecustomrole($ENV{'form.ccdomain'},                        &Apache::lonnet::revokecustomrole($env{'form.ccdomain'},
   $ENV{'form.ccuname'},$1,$2,$3,$4).    $env{'form.ccuname'},$1,$2,$3,$4).
  '</b><br>');   '</b><br />');
     }      }
  } elsif ($_=~/^form\.del/) {   } elsif ($_=~/^form\.del/) {
     if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {
         $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.          $r->print(&mt('Deleting').' '.$2.' in '.$1.': '.
                      &Apache::lonnet::assignrole($ENV{'form.ccdomain'},                       &Apache::lonnet::assignrole($env{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2,$now,0,1).'<br>');                       $env{'form.ccuname'},$1,$2,$now,0,1).'<br />');
  if ($2 eq 'st') {   if ($2 eq 'st') {
     $1=~/^\/(\w+)\/(\w+)/;      $1=~/^\/(\w+)\/(\w+)/;
     my $cid=$1.'_'.$2;      my $cid=$1.'_'.$2;
     $r->print(&mt('Drop from classlist').': <b>'.      $r->print(&mt('Drop from classlist').': <b>'.
  &Apache::lonnet::critical('put:'.   &Apache::lonnet::critical('put:'.
                              $ENV{'course.'.$cid.'.domain'}.':'.                               $env{'course.'.$cid.'.domain'}.':'.
                      $ENV{'course.'.$cid.'.num'}.':classlist:'.                       $env{'course.'.$cid.'.num'}.':classlist:'.
                          &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.                           &Apache::lonnet::escape($env{'form.ccuname'}.':'.
                              $ENV{'form.ccdomain'}).'='.                               $env{'form.ccdomain'}).'='.
                          &Apache::lonnet::escape($now.':'),                           &Apache::lonnet::escape($now.':'),
                      $ENV{'course.'.$cid.'.home'}).'</b><br>');                       $env{'course.'.$cid.'.home'}).'</b><br />');
  }   }
     }       }
  } elsif ($_=~/^form\.ren/) {   } elsif ($_=~/^form\.ren/) {
             my $udom = $ENV{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $ENV{'form.ccuname'};              my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.ren\:([^\_]+)\_([^\_]+)$/) {
                 my $url = $1;                  my $url = $1;
                 my $role = $2;                  my $role = $2;
Line 1149  END Line 1277  END
                         }                          }
                     }                      }
                 } else {                  } else {
     my $result=&Apache::lonnet::assignrole($ENV{'form.ccdomain'},      my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'},
                                $ENV{'form.ccuname'},$url,$role,0,$now);                                 $env{'form.ccuname'},$url,$role,0,$now);
     $output = &mt('Re-Enabling [_1] in [_2]: [_3]',      $output = &mt('Re-Enabling [_1] in [_2]: [_3]',
       $role,$url,$result).'<br />';        $role,$url,$result).'<br />';
  }   }
                 $r->print($output);                  $r->print($output);
     }       }
  } elsif ($_=~/^form\.act/) {   } elsif ($_=~/^form\.act/) {
             my $udom = $ENV{'form.ccdomain'};              my $udom = $env{'form.ccdomain'};
             my $uname = $ENV{'form.ccuname'};              my $uname = $env{'form.ccuname'};
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {      if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_cr_cr_([^\_]+)_(\w+)_([^\_]+)$/) {
                 # Activate a custom role                  # Activate a custom role
  my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);   my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5);
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
  my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;   my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five;
   
                 my $start = ( $ENV{'form.start_'.$full} ?                  my $start = ( $env{'form.start_'.$full} ?
                               $ENV{'form.start_'.$full} :                                $env{'form.start_'.$full} :
                               $now );                                $now );
                 my $end   = ( $ENV{'form.end_'.$full} ?                  my $end   = ( $env{'form.end_'.$full} ?
                               $ENV{'form.end_'.$full} :                                $env{'form.end_'.$full} :
                               0 );                                0 );
                                                                                                                                                                             
                 # split multiple sections                  # split multiple sections
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($ENV{'form.sec_'.$full},\%sections,$5);                  my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));                      $r->print(&commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end));
                 } else {                  } else {
                     foreach (sort {$a cmp $b} keys %sections) {      my %curr_groups =
                         my $securl = $url.'/'.$_;   &Apache::loncommon::coursegroups($one,$two);
                       foreach my $sec (sort {$a cmp $b} keys %sections) {
                           if (($sec eq 'none') || ($sec eq 'all') || 
                               exists($curr_groups{$sec})) {
                               $disallowed{$sec} = $url;
                               next;
                           }
                           my $securl = $url.'/'.$sec;
         $r->print(&commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));          $r->print(&commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end));
                     }                      }
                 }                  }
Line 1187  END Line 1322  END
  # Activate roles for sections with 3 id numbers   # Activate roles for sections with 3 id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
  my ($one,$two,$three)=($1,$2,$3);   my ($one,$two,$three)=($1,$2,$3);
  my $start = ( $ENV{'form.start_'.$one.'_'.$two.'_'.$three} ?    my $start = ( $env{'form.start_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.start_'.$one.'_'.$two.'_'.$three} :         $env{'form.start_'.$one.'_'.$two.'_'.$three} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$one.'_'.$two.'_'.$three} ?    my $end   = ( $env{'form.end_'.$one.'_'.$two.'_'.$three} ? 
       $ENV{'form.end_'.$one.'_'.$two.'_'.$three} :        $env{'form.end_'.$one.'_'.$two.'_'.$three} :
       0 );        0 );
  my $url='/'.$one.'/'.$two;   my $url='/'.$one.'/'.$two;
                 my $type = 'three';                  my $type = 'three';
                 # split multiple sections                  # split multiple sections
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($ENV{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);                  my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));                      $r->print(&commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,''));
                 } else {                  } else {
                       my %curr_groups = 
    &Apache::loncommon::coursegroups($one,$two);
                     my $emptysec = 0;                      my $emptysec = 0;
                     foreach my $sec (sort {$a cmp $b} keys %sections) {                      foreach my $sec (sort {$a cmp $b} keys %sections) {
                         $sec =~ s/\W//g;                          $sec =~ s/\W//g;
                         if ($sec ne '') {                            if ($sec ne '') {
                               if (($sec eq 'none') || ($sec eq 'all') || 
                                   exists($curr_groups{$sec})) {
                                   $disallowed{$sec} = $url;
                                   next;
                               }
                             my $securl = $url.'/'.$sec;                              my $securl = $url.'/'.$sec;
                             $r->print(&commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));                              $r->print(&commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec));
                         } else {                          } else {
Line 1218  END Line 1360  END
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {      } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
  # Activate roles for sections with two id numbers   # Activate roles for sections with two id numbers
  # set start, end times, and the url for the class   # set start, end times, and the url for the class
  my $start = ( $ENV{'form.start_'.$1.'_'.$2} ?    my $start = ( $env{'form.start_'.$1.'_'.$2} ? 
       $ENV{'form.start_'.$1.'_'.$2} :         $env{'form.start_'.$1.'_'.$2} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$1.'_'.$2} ?    my $end   = ( $env{'form.end_'.$1.'_'.$2} ? 
       $ENV{'form.end_'.$1.'_'.$2} :        $env{'form.end_'.$1.'_'.$2} :
       0 );        0 );
  my $url='/'.$1.'/';   my $url='/'.$1.'/';
                 # split multiple sections                  # split multiple sections
                 my %sections = ();                  my %sections = ();
                 my $num_sections = &build_roles($ENV{'form.sec_'.$1.'_'.$2},\%sections,$2);                  my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2);
                 if ($num_sections == 0) {                  if ($num_sections == 0) {
                     $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));                      $r->print(&commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,''));
                 } else {                  } else {
Line 1245  END Line 1387  END
                     }                      }
                 }                  }
     } else {      } else {
  $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br>');   $r->print('<p>'.&mt('ERROR').': '.&mt('Unknown command').' <tt>'.$_.'</tt></p><br />');
               }
               foreach my $key (sort(keys(%disallowed))) {
                   if (($key eq 'none') || ($key eq 'all')) {  
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is a reserved word.',$key));
                   } else {
                       $r->print('<p>'.&mt('[_1] may not be used as the name for a section, as it is the name of a course group.',$key));
                   }
                   $r->print(' '.&mt('Please <a href="javascript:history.go(-1)">go back</a> and choose a different section name.').'</p><br />');
             }              }
  }    }
     } # End of foreach (keys(%ENV))      } # End of foreach (keys(%env))
 # Flush the course logs so reverse user roles immediately updated  # Flush the course logs so reverse user roles immediately updated
     &Apache::lonnet::flushcourselogs();      &Apache::lonnet::flushcourselogs();
     $r->print('</body></html>');      $r->print('<p><a href="/adm/createuser">Create/Modify Another User</a></p>');
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub commit_customrole {  sub commit_customrole {
Line 1261  sub commit_customrole { Line 1412  sub commit_customrole {
                          ($end?', ending '.localtime($end):'').': <b>'.                           ($end?', ending '.localtime($end):'').': <b>'.
               &Apache::lonnet::assigncustomrole(                &Apache::lonnet::assigncustomrole(
                  $udom,$uname,$url,$three,$four,$five,$end,$start).                   $udom,$uname,$url,$three,$four,$five,$end,$start).
                  '</b><br>';                   '</b><br />';
     return $output;      return $output;
 }  }
   
Line 1286  sub commit_standardrole { Line 1437  sub commit_standardrole {
                ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                 ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.
                &Apache::lonnet::assignrole(                 &Apache::lonnet::assignrole(
                    $udom,$uname,$url,$three,$end,$start).                     $udom,$uname,$url,$three,$end,$start).
                    '</b><br>';                     '</b><br />';
     }      }
     return $output;      return $output;
 }  }
Line 1332  sub commit_studentrole { Line 1483  sub commit_studentrole {
         }          }
     } else {      } else {
         $$logmsg .= "Incomplete course id defined.  Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed";          $$logmsg .= "Incomplete course id defined.  Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed";
         $result = "Error: incomplete course id\n";          $result = "error: incomplete course id\n";
     }      }
     return $result;      return $result;
 }  }
Line 1374  sub build_roles { Line 1525  sub build_roles {
   
 sub custom_role_editor {  sub custom_role_editor {
     my $r=shift;      my $r=shift;
     my $rolename=$ENV{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     if ($rolename eq 'make new role') {      if ($rolename eq 'make new role') {
  $rolename=$ENV{'form.newrolename'};   $rolename=$env{'form.newrolename'};
     }      }
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
Line 1387  sub custom_role_editor { Line 1538  sub custom_role_editor {
         return;          return;
     }      }
   
     $r->print(&Apache::loncommon::bodytag(      $r->print(&Apache::loncommon::start_page('Custom Role Editor'));
                      'Create Users, Change User Privileges').'<h2>');  
     my $syspriv='';      my $syspriv='';
     my $dompriv='';      my $dompriv='';
     my $coursepriv='';      my $coursepriv='';
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
       $r->print('<h2>');
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
 # ------------------------------------------------- Get current role privileges  # ------------------------------------------------- Get current role privileges
Line 1466  ENDCCF Line 1617  ENDCCF
     '</td></tr>');      '</td></tr>');
     }      }
     $r->print(      $r->print(
    '<table><input type="submit" value="'.&mt('Define Role').'" /></form></body></html>');     '<table><input type="submit" value="'.&mt('Define Role').'" /></form>'.
         &Apache::loncommon::end_page());
 }  }
   
 # ---------------------------------------------------------- Call to definerole  # ---------------------------------------------------------- Call to definerole
 sub set_custom_role {  sub set_custom_role {
     my $r=shift;      my ($r) = @_;
   
     my $rolename=$ENV{'form.rolename'};      my $rolename=$env{'form.rolename'};
   
     $rolename=~s/[^A-Za-z0-9]//gs;      $rolename=~s/[^A-Za-z0-9]//gs;
   
Line 1482  sub set_custom_role { Line 1634  sub set_custom_role {
         return;          return;
     }      }
   
     $r->print(&Apache::loncommon::bodytag(      $r->print(&Apache::loncommon::start_page('Save Custom Role').'<h2>');
                      'Create Users, Change User Privileges').'<h2>');  
     my ($rdummy,$roledef)=      my ($rdummy,$roledef)=
  &Apache::lonnet::get('roles',["rolesdef_$rolename"]);   &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   
 # ------------------------------------------------------- Does this role exist?  # ------------------------------------------------------- Does this role exist?
     if (($rdummy ne 'con_lost') && ($roledef ne '')) {      if (($rdummy ne 'con_lost') && ($roledef ne '')) {
  $r->print(&mt('Existing Role').' "');   $r->print(&mt('Existing Role').' "');
Line 1502  sub set_custom_role { Line 1654  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':c'}) {          if ($env{'form.'.$priv.':c'}) {
     $courole.=':'.$_;      $courole.=':'.$_;
  }   }
     }      }
Line 1510  sub set_custom_role { Line 1662  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':d'}) {          if ($env{'form.'.$priv.':d'}) {
     $domrole.=':'.$_;      $domrole.=':'.$_;
  }   }
     }      }
Line 1518  sub set_custom_role { Line 1670  sub set_custom_role {
     foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {      foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
  my ($priv,$restrict)=split(/\&/,$_);   my ($priv,$restrict)=split(/\&/,$_);
         unless ($restrict) { $restrict=''; }          unless ($restrict) { $restrict=''; }
         if ($ENV{'form.'.$priv.':s'}) {          if ($env{'form.'.$priv.':s'}) {
     $sysrole.=':'.$_;      $sysrole.=':'.$_;
  }   }
     }      }
     $r->print('<br />Defining Role: '.      $r->print('<br />Defining Role: '.
    &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));     &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));
     if ($ENV{'request.course.id'}) {      if ($env{'request.course.id'}) {
         my $url='/'.$ENV{'request.course.id'};          my $url='/'.$env{'request.course.id'};
         $url=~s/\_/\//g;          $url=~s/\_/\//g;
  $r->print('<br />'.&mt('Assigning Role to Self').': '.   $r->print('<br />'.&mt('Assigning Role to Self').': '.
       &Apache::lonnet::assigncustomrole($ENV{'user.domain'},        &Apache::lonnet::assigncustomrole($env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $url,   $url,
  $ENV{'user.domain'},   $env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $rolename));   $rolename));
     }      }
     $r->print('</body></html>');      $r->print('<p><a href="/adm/createuser">Create another role, or Create/Modify a user.</a></p>');
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
Line 1548  sub handler { Line 1701  sub handler {
        return OK;         return OK;
     }      }
   
     if ((&Apache::lonnet::allowed('cta',$ENV{'request.course.id'})) ||      if ((&Apache::lonnet::allowed('cta',$env{'request.course.id'})) ||
         (&Apache::lonnet::allowed('cin',$ENV{'request.course.id'})) ||           (&Apache::lonnet::allowed('cin',$env{'request.course.id'})) || 
         (&Apache::lonnet::allowed('ccr',$ENV{'request.course.id'})) ||           (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) || 
         (&Apache::lonnet::allowed('cep',$ENV{'request.course.id'})) ||          (&Apache::lonnet::allowed('cep',$env{'request.course.id'})) ||
         (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||   (&authorpriv($env{'user.name'},$env{'request.role.domain'})) ||
         (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {          (&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))) {
        &Apache::loncommon::content_type($r,'text/html');         &Apache::loncommon::content_type($r,'text/html');
        $r->send_http_header;         $r->send_http_header;
        unless ($ENV{'form.phase'}) {         unless ($env{'form.phase'}) {
    &print_username_entry_form($r);     &print_username_entry_form($r);
        }         }
        if ($ENV{'form.phase'} eq 'get_user_info') {         if ($env{'form.phase'} eq 'get_user_info') {
            &print_user_modification_page($r);             &print_user_modification_page($r);
        } elsif ($ENV{'form.phase'} eq 'update_user_data') {         } elsif ($env{'form.phase'} eq 'update_user_data') {
            &update_user_data($r);             &update_user_data($r);
        } elsif ($ENV{'form.phase'} eq 'selected_custom_edit') {         } elsif ($env{'form.phase'} eq 'selected_custom_edit') {
            &custom_role_editor($r);             &custom_role_editor($r);
        } elsif ($ENV{'form.phase'} eq 'set_custom_roles') {         } elsif ($env{'form.phase'} eq 'set_custom_roles') {
    &set_custom_role($r);     &set_custom_role($r);
        }         }
    } else {     } else {
       $ENV{'user.error.msg'}=        $env{'user.error.msg'}=
         "/adm/createuser:mau:0:0:Cannot modify user data";          "/adm/createuser:mau:0:0:Cannot modify user data";
       return HTTP_NOT_ACCEPTABLE;         return HTTP_NOT_ACCEPTABLE; 
    }     }
Line 1592  sub course_level_table { Line 1745  sub course_level_table {
             'act'  => "Activate",              'act'  => "Activate",
             'rol'  => "Role",              'rol'  => "Role",
             'ext'  => "Extent",              'ext'  => "Extent",
             'grs'  => "Group/Section",              'grs'  => "Section",
             'sta'  => "Start",              'sta'  => "Start",
             'end'  => "End"              'end'  => "End"
     );      );
Line 1610  sub course_level_table { Line 1763  sub course_level_table {
  my ($domain,$cnum)=split(/\//,$thiscourse);   my ($domain,$cnum)=split(/\//,$thiscourse);
         my %sections_count = ();          my %sections_count = ();
         my $num_sections = 0;          my $num_sections = 0;
         if (defined($ENV{'request.course.id'})) {          if (defined($env{'request.course.id'})) {
             if ($ENV{'request.course.id'} eq $domain.'_'.$cnum) {              if ($env{'request.course.id'} eq $domain.'_'.$cnum) {
                 $num_sections = &Apache::loncommon::get_sections($domain,$cnum,\%sections_count);                  $num_sections = &Apache::loncommon::get_sections($domain,$cnum,\%sections_count);
             }              }
         }          }
Line 1658  ENDTIMEENTRY Line 1811  ENDTIMEENTRY
         foreach (sort keys %customroles) {          foreach (sort keys %customroles) {
     if (&Apache::lonnet::allowed('ccr',$thiscourse)) {      if (&Apache::lonnet::allowed('ccr',$thiscourse)) {
  my $plrole=$_;   my $plrole=$_;
                 my $customrole=$protectedcourse.'_cr_cr_'.$ENV{'user.domain'}.                  my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}.
     '_'.$ENV{'user.name'}.'_'.$plrole;      '_'.$env{'user.name'}.'_'.$plrole;
  $table .= <<END;   $table .= <<END;
 <tr bgcolor="#$bgcol">  <tr bgcolor="#$bgcol">
 <td><input type="checkbox" name="act_$customrole"></td>  <td><input type="checkbox" name="act_$customrole"></td>
Line 1741  sub course_level_dc { Line 1894  sub course_level_dc {
                     'crl'  => "Course Level",                      'crl'  => "Course Level",
                     'crt'  => "Course Title",                      'crt'  => "Course Title",
                     'rol'  => "Role",                      'rol'  => "Role",
                     'grs'  => "Group/Section",                      'grs'  => "Section",
                     'exs'  => "Existing sections",                      'exs'  => "Existing sections",
                     'new'  => "Define new section",                       'new'  => "Define new section", 
                     'sta'  => "Start",                      'sta'  => "Start",
Line 1759  sub course_level_dc { Line 1912  sub course_level_dc {
     }      }
     if ( keys %customroles > 0) {      if ( keys %customroles > 0) {
         foreach (sort keys %customroles) {          foreach (sort keys %customroles) {
             my $custrole='cr_cr_'.$ENV{'user.domain'}.              my $custrole='cr_cr_'.$env{'user.domain'}.
                     '_'.$ENV{'user.name'}.'_'.$_;                      '_'.$env{'user.name'}.'_'.$_;
             $otheritems .= '  <option value="'.$custrole.'">'.$_;              $otheritems .= '  <option value="'.$custrole.'">'.$_;
         }          }
     }      }
Line 1770  sub course_level_dc { Line 1923  sub course_level_dc {
                      ' <option value=""><--'.&mt('Pick course first').'</select></td>'.                       ' <option value=""><--'.&mt('Pick course first').'</select></td>'.
                      '<td>&nbsp;&nbsp;</td>'.                       '<td>&nbsp;&nbsp;</td>'.
                      '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.                       '<td valign="top">&nbsp;<b>'.$lt{'new'}.'</b><br />'.
                      '<input type="text" name="newsec" value="" /></td>'.                       '<input type="text" name="newsec" value="" />'.
                        '<input type="hidden" name="groups" value="" /></td>'.
                      '</tr></table></td>';                       '</tr></table></td>';
     $otheritems .= <<ENDTIMEENTRY;      $otheritems .= <<ENDTIMEENTRY;
 <td><input type=hidden name="start" value=''>  <td><input type=hidden name="start" value=''>

Removed from v.1.100  
changed lines
  Added in v.1.114


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