Diff for /loncom/interface/loncreateuser.pm between versions 1.31 and 1.64

version 1.31, 2002/04/22 15:26:46 version 1.64, 2003/07/19 21:44:51
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (Create a course  
 # (My Desk  
 #  
 # (Internal Server Error Handler  
 #  
 # (Login Screen  
 # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,  
 # 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)  
 #  
 # YEAR=2001  
 # 3/1/1 Gerd Kortemeyer)  
 #  
 # 3/1 Gerd Kortemeyer)  
 #  
 # 2/14 Gerd Kortemeyer)  
 #  
 # 2/14,2/17,2/19,2/20,2/21,2/22,2/23,3/2,3/17,3/24,04/12 Gerd Kortemeyer  
 # April Guy Albertelli  
 # 05/10,10/16 Gerd Kortemeyer   
 # 11/12,11/13,11/15 Scott Harrison  
 # 02/11/02 Matthew Hall  
 #  
 # $Id$  
 ###  ###
   
 package Apache::loncreateuser;  package Apache::loncreateuser;
Line 55  package Apache::loncreateuser; Line 32  package Apache::loncreateuser;
 use strict;  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon;
   
 my $loginscript; # piece of javascript used in two separate instances  my $loginscript; # piece of javascript used in two separate instances
 my $generalrule;  my $generalrule;
Line 71  BEGIN { Line 49  BEGIN {
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom 
                   );                    );
     $loginscript  = &Apache::loncommon::authform_header(%param);  # no longer static due to configurable kerberos defaults
   #    $loginscript  = &Apache::loncommon::authform_header(%param);
     $generalrule  = &Apache::loncommon::authform_authorwarning(%param);      $generalrule  = &Apache::loncommon::authform_authorwarning(%param);
     $authformnop  = &Apache::loncommon::authform_nochange(%param);      $authformnop  = &Apache::loncommon::authform_nochange(%param);
     $authformkrb  = &Apache::loncommon::authform_kerberos(%param);  # no longer static due to configurable kerberos defaults
   #    $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
     $authformint  = &Apache::loncommon::authform_internal(%param);      $authformint  = &Apache::loncommon::authform_internal(%param);
     $authformfsys = &Apache::loncommon::authform_filesystem(%param);      $authformfsys = &Apache::loncommon::authform_filesystem(%param);
     $authformloc  = &Apache::loncommon::authform_local(%param);      $authformloc  = &Apache::loncommon::authform_local(%param);
 }  }
   
   
   # ======================================================= Existing Custom Roles
   
   sub my_custom_roles {
       my %returnhash=();
       my %rolehash=&Apache::lonnet::dump('roles');
       foreach (keys %rolehash) {
    if ($_=~/^rolesdef\_(\w+)$/) {
       $returnhash{$1}=$1;
    }
       }
       return %returnhash;
   }
   
   # ==================================================== Figure out author access
   
   sub authorpriv {
       my ($auname,$audom)=@_;
       if (($auname ne $ENV{'user.name'}) ||
           (($audom ne $ENV{'user.domain'}) &&
            ($audom ne $ENV{'request.role.domain'}))) { return ''; }
       unless (&Apache::lonnet::allowed('cca',$audom)) { return ''; }
       return 1;
   }
   
 # =================================================================== Phase one  # =================================================================== Phase one
   
 sub phase_one {  sub print_username_entry_form {
     my $r=shift;      my $r=shift;
     my $defdom=$ENV{'user.domain'};      my $defdom=$ENV{'request.role.domain'};
     $r->print(<<ENDDOCUMENT);      my @domains = &Apache::loncommon::get_domains();
       my $domform = &Apache::loncommon::select_dom_form($defdom,'ccdomain');
       my $bodytag =&Apache::loncommon::bodytag(
                                     'Create Users, Change User Privileges');
       my $selscript=&Apache::loncommon::studentbrowser_javascript();
       my $sellink=&Apache::loncommon::selectstudent_link
                                           ('crtuser','ccuname','ccdomain');
       my %existingroles=&my_custom_roles();
       my $choice=&Apache::loncommon::select_form('make new role','rolename',
    ('make new role' => 'Generate new role ...',%existingroles));
       $r->print(<<"ENDDOCUMENT");
 <html>  <html>
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
   $selscript
 </head>  </head>
 <body bgcolor="#FFFFFF">  $bodytag
 <h1>Create User, Change User Privileges</h1>  <form action="/adm/createuser" method="post" name="crtuser">
 <form action=/adm/createuser method=post>  <input type="hidden" name="phase" value="get_user_info">
 <input type=hidden name=phase value=two>  <h2>Set Individual User Roles</h2>
 Username: <input type=text size=15 name=ccuname><br>  <table>
 Domain: <input type=text size=15 name=ccdomain value=$defdom><p>  <tr><td>Username:</td><td><input type="text" size="15" name="ccuname">
 <input type=submit value="Continue">  </td><td rowspan="2">$sellink</td></tr><tr><td>
   Domain:</td><td>$domform</td></tr>
   </table>
   <input name="userrole" type="submit" value="User Roles" />
 </form>  </form>
   <form action="/adm/createuser" method="post" name="docustom">
   <input type="hidden" name="phase" value="selected_custom_edit">
   <h2>Edit Custom Role Privileges</h2>
   Name of Role: $choice <input type="text" size="15" name="newrolename" /><br />
   <input name="customeditor" type="submit" value="Custom Role Editor" />
 </body>  </body>
 </html>  </html>
 ENDDOCUMENT  ENDDOCUMENT
 }  }
   
 # =================================================================== Phase two  # =================================================================== Phase two
 sub phase_two {  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'};
   
     $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/;      $ccuname=~s/\W//gs;
     my $krbdefdom=$1;      $ccdomain=~s/\W//gs;
     $krbdefdom=~tr/a-z/A-Z/;  
       unless (($ccuname) && ($ccdomain)) {
    &print_username_entry_form($r);
           return;
       }
   
       my $defdom=$ENV{'request.role.domain'};
   
       my ($krbdef,$krbdefdom) =
          &Apache::loncommon::get_kerberos_defaults($defdom);
   
     my %param = ( formname => 'document.cu',      my %param = ( formname => 'document.cu',
                   kerb_def_dom => $krbdefdom                     kerb_def_dom => $krbdefdom,
                     kerb_def_auth => $krbdef
                   );                    );
     $loginscript  = &Apache::loncommon::authform_header(%param);      $loginscript  = &Apache::loncommon::authform_header(%param);
       $authformkrb  = &Apache::loncommon::authform_kerberos(%param);
     my $defdom=$ENV{'user.domain'};  
   
     $ccuname=~s/\W//g;      $ccuname=~s/\W//g;
     $ccdomain=~s/\W//g;      $ccdomain=~s/\W//g;
       my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
     my $dochead =<<"ENDDOCHEAD";      my $dochead =<<"ENDDOCHEAD";
 <html>  <html>
 <head>  <head>
Line 133  sub phase_two { Line 168  sub phase_two {
         parmwin.close();          parmwin.close();
     }      }
   
     function pjump(type,dis,value,marker,ret,call) {      $pjump_def
         parmwin=window.open("/adm/rat/parameter.html?type="+escape(type)  
                  +"&value="+escape(value)+"&marker="+escape(marker)  
                  +"&return="+escape(ret)  
                  +"&call="+escape(call)+"&name="+escape(dis),"LONCAPAparms",  
                  "height=350,width=350,scrollbars=no,menubar=no");  
   
     }  
   
     function dateset() {      function dateset() {
         eval("document.cu."+document.cu.pres_marker.value+          eval("document.cu."+document.cu.pres_marker.value+
Line 150  sub phase_two { Line 178  sub phase_two {
   
 </script>  </script>
 </head>  </head>
 <body bgcolor="#FFFFFF">  
 <img align="right" src="/adm/lonIcons/lonlogos.gif">  
 ENDDOCHEAD  ENDDOCHEAD
       $r->print(&Apache::loncommon::bodytag(
                                        'Create Users, Change User Privileges'));
     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="three">  <input type="hidden" name="phase"       value="update_user_data">
 <input type="hidden" name="ccuname"     value="$ccuname">  <input type="hidden" name="ccuname"     value="$ccuname">
 <input type="hidden" name="ccdomain"    value="$ccdomain">  <input type="hidden" name="ccdomain"    value="$ccdomain">
 <input type="hidden" name="pres_value"  value="" >  <input type="hidden" name="pres_value"  value="" >
Line 165  ENDFORMINFO Line 193  ENDFORMINFO
     my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);      my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain);
     my %incdomains;       my %incdomains; 
     my %inccourses;      my %inccourses;
     my %home_servers = &get_home_servers($ccdomain);        foreach (values(%Apache::lonnet::hostdom)) {
     foreach (%Apache::lonnet::hostdom) {  
        $incdomains{$_}=1;         $incdomains{$_}=1;
     }      }
     foreach (keys(%ENV)) {      foreach (keys(%ENV)) {
Line 176  ENDFORMINFO Line 203  ENDFORMINFO
     }      }
     if ($uhome eq 'no_host') {      if ($uhome eq 'no_host') {
         my $home_server_list=          my $home_server_list=
             '<option value="default" selected>default</option>'."\n";              '<option value="default" selected>default</option>'."\n".
         foreach (sort keys(%home_servers)) {                  &Apache::loncommon::home_server_option_list($ccdomain);
             $home_server_list.=          
                 '<option value="'.$_.'">'.$_.' '.  
                     $home_servers{$_}."</option>\n";  
         }  
  $r->print(<<ENDNEWUSER);   $r->print(<<ENDNEWUSER);
 $dochead  $dochead
 <h1>Create New User</h1>  <h1>Create New User</h1>
Line 218  ENDNEWUSER Line 242  ENDNEWUSER
 $dochead  $dochead
 <h1>Change User Privileges</h1>  <h1>Change User Privileges</h1>
 $forminfo  $forminfo
 <h2>User "$ccuname" in domain $ccdomain </h2>  <h2>User "$ccuname" in domain "$ccdomain"</h2>
 ENDCHANGEUSER  ENDCHANGEUSER
         # Get the users information          # Get the users information
         my %userenv = &Apache::lonnet::get('environment',          my %userenv = &Apache::lonnet::get('environment',
Line 236  END Line 260  END
         foreach ('firstname','middlename','lastname','generation') {          foreach ('firstname','middlename','lastname','generation') {
            if (&Apache::lonnet::allowed('mau',$ccdomain)) {             if (&Apache::lonnet::allowed('mau',$ccdomain)) {
               $r->print(<<"END");                            $r->print(<<"END");            
 <td><input type="text" name="c$_" value="$userenv{$_}" size="15"/></td>  <td><input type="text" name="c$_" value="$userenv{$_}" size="15" /></td>
 END  END
            } else {             } else {
                $r->print('<td>'.$userenv{$_}.'</td>');                 $r->print('<td>'.$userenv{$_}.'</td>');
Line 250  END Line 274  END
         my ($tmp) = keys(%rolesdump);          my ($tmp) = keys(%rolesdump);
         unless ($tmp =~ /^(con_lost|error)/i) {          unless ($tmp =~ /^(con_lost|error)/i) {
            my $now=time;             my $now=time;
            $r->print('<hr /><h3>Revoke Existing Roles</h3>'.             $r->print(<<END);
              '<table border=2><tr><th>Revoke</th><th>Role</th><th>Extent</th>'.  <hr />
      '<th>Start</th><th>End</th>');  <h3>Revoke Existing Roles</h3>
    foreach my $area (keys(%rolesdump)) {  <table border=2>
               if ($area!~/^rolesdef/) {  <tr><th>Revoke</th><th>Delete</th><th>Role</th><th>Extent</th><th>Start</th><th>End</th>
                  my $role = $rolesdump{$area};  END
                  my $thisrole=$area;     foreach my $area (sort keys(%rolesdump)) {
                  $area=~s/\_\w\w$//;                 next if ($area =~ /^rolesdef/);
                  my ($role_code,$role_end_time,$role_start_time) =                 my $role = $rolesdump{$area};
                      split(/_/,$role);                 my $thisrole=$area;
                  my $bgcol='ffffff';                 $area =~ s/\_\w\w$//;
                  my $allows=0;                 my ($role_code,$role_end_time,$role_start_time) = 
                  if ($area=~/^\/(\w+)\/(\d\w+)/) {                     split(/_/,$role);
                     my %coursedata=  # Is this a custom role? Get role owner and title.
                         &Apache::lonnet::coursedescription($1.'_'.$2);         my ($croleudom,$croleuname,$croletitle)=
                     my $carea='Course: '.$coursedata{'description'};             ($role_code=~/^cr\/(\w+)\/(\w+)\/(\w+)$/);
                     $inccourses{$1.'_'.$2}=1;                 my $bgcol='ffffff';
                     if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) {                 my $allowed=0;
                         $allows=1;                 my $delallowed=0;
                     }                 if ($area =~ /^\/(\w+)\/(\d\w+)/ ) {
                     # Compute the background color based on $area                     my ($coursedom,$coursedir) = ($1,$2);
                     $bgcol=$1.'_'.$2;                     # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3).
                     $bgcol=~s/[^8-9b-e]//g;                     my %coursedata=
                     $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,6);                         &Apache::lonnet::coursedescription($1.'_'.$2);
                     if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {     my $carea;
      if (defined($coursedata{'description'})) {
          $carea='Course: '.$coursedata{'description'}.
                              '<br />Domain: '.$coursedom.('&nbsp;'x8).
        &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom);
      } else {
          $carea='Unavailable course: '.$area;
      }
                      $inccourses{$1.'_'.$2}=1;
                      if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) ||
                          (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                          $allowed=1;
                      }
                      if ((&Apache::lonnet::allowed('dro',$1)) ||
                          (&Apache::lonnet::allowed('dro',$ccdomain))) {
                          $delallowed=1;
                      }
   # - custom role. Needs more info, too
      if ($croletitle) {
          if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) {
      $allowed=1;
      $thisrole.='.'.$role_code;
          }
      }
                      # Compute the background color based on $area
                      $bgcol=$1.'_'.$2;
                      $bgcol=~s/[^7-9a-e]//g;
                      $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
                      if ($area=~/^\/(\w+)\/(\d\w+)\/(\w+)/) {
                        $carea.='<br>Section/Group: '.$3;                         $carea.='<br>Section/Group: '.$3;
                     }                     }
                     $area=$carea;                     $area=$carea;
                  } else {                 } else {
                      # Determine if current user is able to revoke privileges                     # Determine if current user is able to revoke privileges
                      if ($area=~/^\/(\w+)\//) {                     if ($area=~ /^\/(\w+)\//) {
                         if (&Apache::lonnet::allowed('c'.$role_code,$1)) {                         if ((&Apache::lonnet::allowed('c'.$role_code,$1)) ||
                            $allows=1;                         (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) {
                         }                             $allowed=1;
                      } else {                         }
                         if (&Apache::lonnet::allowed('c'.$role_code,'/')) {                         if (((&Apache::lonnet::allowed('dro',$1))  ||
                            $allows=1;                              (&Apache::lonnet::allowed('dro',$ccdomain))) &&
                         }                             ($role_code ne 'dc')) {
                      }                             $delallowed=1;
                  }                         }
                  $r->print('<tr bgcolor=#"'.$bgcol.'"><td>');                     } else {
                  my $active=1;                         if (&Apache::lonnet::allowed('c'.$role_code,'/')) {
                  $active=0 if (($role_end_time) && ($now>$role_end_time));                             $allowed=1;
                  if (($active) && ($allows)) {                         }
                     $r->print('<input type="checkbox" name="rev:'                     }
                               .$thisrole.'">');                 }
                  } else {                 if ($role_code eq 'ca') {
                     $r->print('&nbsp;');                     $area=~/\/(\w+)\/(\w+)/;
                  }     if (&authorpriv($2,$1)) {
                  $r->print('</td><td>'.         $allowed=1;
                            &Apache::lonnet::plaintext($role_code).                     } else {
                            '</td><td>'.$area.'</td><td>'.                         $allowed=0;
                            ($role_start_time ? localtime($role_start_time)                     }
                                              : '&nbsp;' )                 }
                            .'</td><td>'.                 my $row = '';
                            ($role_end_time   ? localtime($role_end_time)                 $row.='<tr bgcolor="#'.$bgcol.'"><td>';
                                              : '&nbsp;' )                 my $active=1;
                            ."</td></tr>\n");                 $active=0 if (($role_end_time) && ($now>$role_end_time));
               }                 if (($active) && ($allowed)) {
                      $row.= '<input type="checkbox" name="rev:'.$thisrole.'">';
                  } else {
                      if ($active) {
                         $row.='&nbsp;';
      } else {
                         $row.='expired or revoked';
      }
                  }
          $row.='</td><td>';
                  if ($delallowed) {
                      $row.= '<input type="checkbox" name="del:'.$thisrole.'">';
                  } else {
                      $row.='&nbsp;';
                  }
          my $plaintext='';
          unless ($croletitle) {
      $plaintext=&Apache::lonnet::plaintext($role_code);
          } else {
              $plaintext=
    "Customrole '$croletitle' defined by $croleuname\@$croleudom";
          }
                  $row.= '</td><td>'.$plaintext.
                         '</td><td>'.$area.
                         '</td><td>'.($role_start_time?localtime($role_start_time)
                                                      : '&nbsp;' ).
                         '</td><td>'.($role_end_time  ?localtime($role_end_time)
                                                      : '&nbsp;' )
                         ."</td></tr>\n";
                  $r->print($row);
            } # end of foreach        (table building loop)             } # end of foreach        (table building loop)
    $r->print('</table>');     $r->print('</table>');
         }  # End of unless          }  # End of unless
  my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);   my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain);
  if ($currentauth=~/^krb4:/) {   if ($currentauth=~/^krb(4|5):/) {
     $currentauth=~/^krb4:(.*)/;      $currentauth=~/^krb(4|5):(.*)/;
     my $krbdefdom2=$1;      my $krbdefdom=$1;
             my %param = ( formname => 'document.cu',              my %param = ( formname => 'document.cu',
                           kerb_def_dom => $krbdefdom                             kerb_def_dom => $krbdefdom 
                           );                            );
             $loginscript  = &Apache::loncommon::authform_header(%param);              $loginscript  = &Apache::loncommon::authform_header(%param);
  }   }
  # Check for a bad authentication type   # Check for a bad authentication type
         unless ($currentauth=~/^krb4:/ or          unless ($currentauth=~/^krb(4|5):/ or
  $currentauth=~/^unix:/ or   $currentauth=~/^unix:/ or
  $currentauth=~/^internal:/ or   $currentauth=~/^internal:/ or
  $currentauth=~/^localauth:/   $currentauth=~/^localauth:/
  ) { # bad authentication scheme   ) { # bad authentication scheme
     if (&Apache::lonnet::allowed('mau',$ENV{'user.domain'})) {      if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {
  $r->print(<<ENDBADAUTH);   $r->print(<<ENDBADAUTH);
 <hr />  <hr />
 <script type="text/javascript" language="Javascript">  <script type="text/javascript" language="Javascript">
Line 360  ENDBADAUTH Line 441  ENDBADAUTH
         } else { # Authentication type is valid          } else { # Authentication type is valid
     my $authformcurrent='';      my $authformcurrent='';
     my $authform_other='';      my $authform_other='';
     if ($currentauth=~/^krb4:/) {      if ($currentauth=~/^krb(4|5):/) {
  $authformcurrent=$authformkrb;   $authformcurrent=$authformkrb;
  $authform_other="<p>$authformint</p>\n".   $authform_other="<p>$authformint</p>\n".
                     "<p>$authformfsys</p><p>$authformloc</p>";                      "<p>$authformfsys</p><p>$authformloc</p>";
Line 380  ENDBADAUTH Line 461  ENDBADAUTH
  $authform_other="<p>$authformkrb</p>".   $authform_other="<p>$authformkrb</p>".
                     "<p>$authformint</p><p>$authformfsys</p>";                      "<p>$authformint</p><p>$authformfsys</p>";
     }      }
     $authformcurrent=<<ENDCURRENTAUTH;              $authformcurrent.=' <i>(will override current values)</i><br />';
 <table border='1'>              if (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'})) {
 <tr>  
 <td><font color='#ff0000'>* * * WARNING * * *</font></td>  
 <td><font color='#ff0000'>* * * WARNING * * *</font></td>  
 </tr>  
 <tr><td bgcolor='#cbbcbb'>$authformcurrent</td>  
 <td bgcolor='#cbbcbb'>Changing this value will overwrite existing authentication for the user; you should notify the user of this change.</td></tr>  
 </table>  
 ENDCURRENTAUTH  
             if (&Apache::lonnet::allowed('mau',$ENV{'user.domain'})) {  
  # Current user has login modification privileges   # Current user has login modification privileges
  $r->print(<<ENDOTHERAUTHS);   $r->print(<<ENDOTHERAUTHS);
 <hr />  <hr />
Line 411  ENDOTHERAUTHS Line 483  ENDOTHERAUTHS
 #  #
 # Co-Author  # Co-Author
 #   # 
       if (&authorpriv($ENV{'user.name'},$ENV{'request.role.domain'}) &&
     if (&Apache::lonnet::allowed('cca',$ENV{'user.domain'})) {          ($ENV{'user.name'} ne $ccuname || $ENV{'user.domain'} ne $ccdomain)) {
           # No sense in assigning co-author role to yourself
  my $cuname=$ENV{'user.name'};   my $cuname=$ENV{'user.name'};
         my $cudom=$ENV{'user.domain'};          my $cudom=$ENV{'request.role.domain'};
        $r->print(<<ENDCOAUTH);         $r->print(<<ENDCOAUTH);
 <h4>Construction Space</h4>  <h4>Construction Space</h4>
 <table border=2><tr><th>Activate</th><th>Role</th><th>Extent</th>  <table border=2><tr><th>Activate</th><th>Role</th><th>Extent</th>
Line 470  ENDDROW Line 543  ENDDROW
 }  }
   
 # ================================================================= Phase Three  # ================================================================= Phase Three
 sub phase_three {  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'});
Line 483  sub phase_three { Line 556  sub phase_three {
 <head>  <head>
 <title>The LearningOnline Network with CAPA</title>  <title>The LearningOnline Network with CAPA</title>
 </head>  </head>
 <body bgcolor="#FFFFFF">  
 <img align="right" src="/adm/lonIcons/lonlogos.gif">  
 ENDTHREEHEAD  ENDTHREEHEAD
       my $title;
       if (exists($ENV{'form.makeuser'})) {
    $title='Set Privileges for New User';
       } else {
           $title='Modify User Privileges';
       }
       $r->print(&Apache::loncommon::bodytag($title));
     # Check Inputs      # Check Inputs
     if (! $ENV{'form.ccuname'} ) {      if (! $ENV{'form.ccuname'} ) {
  $r->print($error.'No login name specified.'.$end);   $r->print($error.'No login name specified.'.$end);
Line 520  ENDTHREEHEAD Line 598  ENDTHREEHEAD
     my $amode='';      my $amode='';
     my $genpwd='';      my $genpwd='';
     if ($ENV{'form.login'} eq 'krb') {      if ($ENV{'form.login'} eq 'krb') {
  $amode='krb4';   $amode='krb';
    $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';
Line 532  ENDTHREEHEAD Line 611  ENDTHREEHEAD
  $amode='localauth';   $amode='localauth';
  $genpwd=$ENV{'form.locarg'};   $genpwd=$ENV{'form.locarg'};
  $genpwd=" " if (!$genpwd);   $genpwd=" " if (!$genpwd);
       } elsif (($ENV{'form.login'} eq 'nochange') ||
                ($ENV{'form.login'} eq ''        )) { 
           # There is no need to tell the user we did not change what they
           # did not ask us to change.
           # If they are creating a new user but have not specified login
           # information this will be caught below.
     } else {      } else {
     $r->print($error.'Invalid login mode or password'.$end);          $r->print($error.'Invalid login mode or password'.$end);    
     return;      return;
Line 539  ENDTHREEHEAD Line 624  ENDTHREEHEAD
     if ($ENV{'form.makeuser'}) {      if ($ENV{'form.makeuser'}) {
         # Create a new user          # Create a new user
  $r->print(<<ENDNEWUSERHEAD);   $r->print(<<ENDNEWUSERHEAD);
 <h1>Create User</h1>  
 <h3>Creating user "$ENV{'form.ccuname'}" in domain "$ENV{'form.ccdomain'}"</h2>  <h3>Creating user "$ENV{'form.ccuname'}" in domain "$ENV{'form.ccdomain'}"</h2>
 ENDNEWUSERHEAD  ENDNEWUSERHEAD
         # Check for the authentication mode and password          # Check for the authentication mode and password
Line 552  ENDNEWUSERHEAD Line 636  ENDNEWUSERHEAD
         if (lc($desiredhost) eq 'default') {          if (lc($desiredhost) eq 'default') {
             $desiredhost = undef;              $desiredhost = undef;
         } else {          } else {
             my %home_servers = &get_home_servers($ENV{'form.ccdomain'});                my %home_servers = &Apache::loncommon::get_library_servers
                   ($ENV{'form.ccdomain'});  
             if (! exists($home_servers{$desiredhost})) {              if (! exists($home_servers{$desiredhost})) {
                 $r->print($error.'Invalid home server specified');                  $r->print($error.'Invalid home server specified');
                 return;                  return;
Line 570  ENDNEWUSERHEAD Line 655  ENDNEWUSERHEAD
                                                $ENV{'form.ccdomain'});                                                 $ENV{'form.ccdomain'});
         $r->print('<br>Home server: '.$home.' '.          $r->print('<br>Home server: '.$home.' '.
                   $Apache::lonnet::libserv{$home});                    $Apache::lonnet::libserv{$home});
     } elsif ($ENV{'form.login'} ne '') {      } elsif (($ENV{'form.login'} ne 'nochange') &&
                ($ENV{'form.login'} ne ''        )) {
  # Modify user privileges   # Modify user privileges
  $r->print(<<ENDMODIFYUSERHEAD);   $r->print(<<ENDMODIFYUSERHEAD);
 <h1>Change User Privileges</h1>  
 <h2>User "$ENV{'form.ccuname'}" in domain "$ENV{'form.ccdomain'}"</h2>  <h2>User "$ENV{'form.ccuname'}" in domain "$ENV{'form.ccdomain'}"</h2>
 ENDMODIFYUSERHEAD  ENDMODIFYUSERHEAD
         if (! $amode || ! $genpwd) {          if (! $amode || ! $genpwd) {
Line 581  ENDMODIFYUSERHEAD Line 666  ENDMODIFYUSERHEAD
     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{'user.domain'})) {   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'},
Line 667  END Line 752  END
  next if (! $ENV{$_});   next if (! $ENV{$_});
  # Revoke roles   # Revoke roles
  if ($_=~/^form\.rev/) {   if ($_=~/^form\.rev/) {
     if ($_=~/^form\.rev\:([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.rev\:([^\_]+)\_([^\_\.]+)$/) {
         $r->print('Revoking '.$2.' in '.$1.': '.  # Revoke standard role
           $r->print('Revoking '.$2.' in '.$1.': <b>'.
                        &Apache::lonnet::assignrole($ENV{'form.ccdomain'},
                        $ENV{'form.ccuname'},$1,$2,$now).'</b><br>');
    if ($2 eq 'st') {
       $1=~/^\/(\w+)\/(\w+)/;
       my $cid=$1.'_'.$2;
       $r->print('Drop from classlist: <b>'.
    &Apache::lonnet::critical('put:'.
                                $ENV{'course.'.$cid.'.domain'}.':'.
                        $ENV{'course.'.$cid.'.num'}.':classlist:'.
                            &Apache::lonnet::escape($ENV{'form.ccuname'}.':'.
                                $ENV{'form.ccdomain'}).'='.
                            &Apache::lonnet::escape($now.':'),
                        $ENV{'course.'.$cid.'.home'}).'</b><br>');
    }
       } 
       if ($_=~/^form\.rev\:([^\_]+)\_cr\.cr\/(\w+)\/(\w+)\/(\w+)$/) {
   # Revoke custom role
    $r->print(
                   'Revoking custom role '.$4.' by '.$3.'\@'.$2.' in '.$1.': <b>'.
    '</b><br>');
       }
    } elsif ($_=~/^form\.del/) {
       if ($_=~/^form\.del\:([^\_]+)\_([^\_]+)$/) {
           $r->print('Deleting '.$2.' in '.$1.': '.
                      &Apache::lonnet::assignrole($ENV{'form.ccdomain'},                       &Apache::lonnet::assignrole($ENV{'form.ccdomain'},
                      $ENV{'form.ccuname'},$1,$2,$now).'<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('Drop from classlist: '.      $r->print('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'}).'<br>');                       $ENV{'course.'.$cid.'.home'}).'</b><br>');
  }   }
     }       } 
  } elsif ($_=~/^form\.act/) {   } elsif ($_=~/^form\.act/) {
     if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {      if ($_=~/^form\.act\_([^\_]+)\_([^\_]+)\_([^\_]+)$/) {
  # 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 $start = ( $ENV{'form.start_'.$1.'_'.$2} ?   
       $ENV{'form.start_'.$1.'_'.$2} :    my $start = ( $ENV{'form.start_'.$1.'_'.$2.'_'.$3} ? 
         $ENV{'form.start_'.$1.'_'.$2.'_'.$3} : 
       $now );        $now );
  my $end   = ( $ENV{'form.end_'.$1.'_'.$2} ?    my $end   = ( $ENV{'form.end_'.$1.'_'.$2.'_'.$3} ? 
       $ENV{'form.end_'.$1.'_'.$2} :        $ENV{'form.end_'.$1.'_'.$2.'_'.$3} :
       0 );        0 );
  my $url='/'.$1.'/'.$2;   my $url='/'.$1.'/'.$2;
  if ($ENV{'form.sec_'.$1.'_'.$2.'_'.$3}) {   if ($ENV{'form.sec_'.$1.'_'.$2.'_'.$3}) {
     $url.='/'.$ENV{'form.sec_'.$1.'_'.$2.'_'.$3};      $url.='/'.$ENV{'form.sec_'.$1.'_'.$2.'_'.$3};
  }   }
  # Assign the role and report it   # Assign the role and report it
  $r->print('Assigning: '.$3.' in '.$url.': '.   $r->print('Assigning: '.$3.' in '.$url.
                            ($start?', starting '.localtime($start):'').
                            ($end?', ending '.localtime($end):'').': <b>'.
                           &Apache::lonnet::assignrole(                            &Apache::lonnet::assignrole(
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                                $ENV{'form.ccdomain'},$ENV{'form.ccuname'},
                               $url,$3,$end,$start).                                $url,$3,$end,$start).
   '<br>');    '</b><br>');
  # Handle students differently   # Handle students differently
  if ($3 eq 'st') {   if ($3 eq 'st') {
     $url=~/^\/(\w+)\/(\w+)/;      $url=~/^\/(\w+)\/(\w+)/;
     my $cid=$1.'_'.$2;      my $cid=$1.'_'.$2;
     $r->print('Add to classlist: '.      $r->print('Add to classlist: <b>'.
       &Apache::lonnet::critical(        &Apache::lonnet::critical(
   'put:'.$ENV{'course.'.$cid.'.domain'}.':'.    'put:'.$ENV{'course.'.$cid.'.domain'}.':'.
                            $ENV{'course.'.$cid.'.num'}.':classlist:'.                             $ENV{'course.'.$cid.'.num'}.':classlist:'.
Line 717  END Line 830  END
                                        $ENV{'form.ccdomain'} ).'='.                                         $ENV{'form.ccdomain'} ).'='.
                                    &Apache::lonnet::escape($end.':'.$start),                                     &Apache::lonnet::escape($end.':'.$start),
        $ENV{'course.'.$cid.'.home'})         $ENV{'course.'.$cid.'.home'})
       .'<br>');        .'</b><br>');
  }   }
     } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {      } elsif ($_=~/^form\.act\_([^\_]+)\_([^\_]+)$/) {
  # Activate roles for sections with two id numbers   # Activate roles for sections with two id numbers
Line 731  END Line 844  END
  my $url='/'.$1.'/';   my $url='/'.$1.'/';
  # Assign the role and report it.   # Assign the role and report it.
  $r->print('Assigning: '.$2.' in '.$url.': '.   $r->print('Assigning: '.$2.' in '.$url.': '.
                            ($start?', starting '.localtime($start):'').
                            ($end?', ending '.localtime($end):'').': <b>'.
                           &Apache::lonnet::assignrole(                            &Apache::lonnet::assignrole(
                               $ENV{'form.ccdomain'},$ENV{'form.ccuname'},                                $ENV{'form.ccdomain'},$ENV{'form.ccuname'},
                               $url,$2,$end,$start)                                $url,$2,$end,$start)
   .'<br>');    .'</b><br>');
     }      } else {
    $r->print('<p>ERROR: Unknown command <tt>'.$_.'</tt></p><br>');
               }
  }    } 
     } # End of foreach (keys(%ENV))      } # End of foreach (keys(%ENV))
     $r->print('</body></html>');      $r->print('</body></html>');
 }  }
   
   # ========================================================== Custom Role Editor
   
   sub custom_role_editor {
       my $r=shift;
       my $rolename=$ENV{'form.rolename'};
   
       if ($rolename eq 'make new role') {
    $rolename=$ENV{'form.newrolename'};
       }
   
       $rolename=~s/[^A-Za-z0-9]//gs;
   
       unless ($rolename) {
    &print_username_entry_form($r);
           return;
       }
   
       $r->print(&Apache::loncommon::bodytag(
                        'Create Users, Change User Privileges').'<h2>');
       my $syspriv='';
       my $dompriv='';
       my $coursepriv='';
       my ($rdummy,$roledef)=
    &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   # ------------------------------------------------------- Does this role exist?
       if (($rdummy ne 'con_lost') && ($roledef ne '')) {
    $r->print('Existing Role "');
   # ------------------------------------------------- Get current role privileges
    ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef);
       } else {
    $r->print('New Role "');
    $roledef='';
       }
       $r->print($rolename.'"</h2>');
   # ------------------------------------------------------- What can be assigned?
       my %full=();
       my %courselevel=();
       my %courselevelcurrent=();
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict='F'; }
           $courselevel{$priv}=$restrict;
           if ($coursepriv=~/\:$priv/) {
       $courselevelcurrent{$priv}=1;
    }
    $full{$priv}=1;
       }
       my %domainlevel=();
       my %domainlevelcurrent=();
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict='F'; }
           $domainlevel{$priv}=$restrict;
           if ($dompriv=~/\:$priv/) {
       $domainlevelcurrent{$priv}=1;
    }
    $full{$priv}=1;
       }
       my %systemlevel=();
       my %systemlevelcurrent=();
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict='F'; }
           $systemlevel{$priv}=$restrict;
           if ($syspriv=~/\:$priv/) {
       $systemlevelcurrent{$priv}=1;
    }
    $full{$priv}=1;
       }
       $r->print(<<ENDCCF);
   <form method="post">
   <input type="hidden" name="phase" value="set_custom_roles" />
   <input type="hidden" name="rolename" value="$rolename" />
   <table border="2">
   <tr><th>Privilege</th><th>Course Level</th><th>Domain Level</th>
   <th>System Level</th></tr>
   ENDCCF
       foreach (sort keys %full) {
    $r->print('<tr><td>'.&Apache::lonnet::plaintext($_).'</td><td>'.
       ($courselevel{$_}?'<input type="checkbox" name="'.$_.':c" '.
       ($courselevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').
       '</td><td>'.
       ($domainlevel{$_}?'<input type="checkbox" name="'.$_.':d" '.
       ($domainlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').
       '</td><td>'.
       ($systemlevel{$_}?'<input type="checkbox" name="'.$_.':s" '.
       ($systemlevelcurrent{$_}?'checked="1"':'').' />':'&nbsp;').
       '</td></tr>');
       }
       $r->print(
      '<table><input type="submit" value="Define Role" /></form></body></html>');
   }
   
   # ---------------------------------------------------------- Call to definerole
   sub set_custom_role {
       my $r=shift;
   
       my $rolename=$ENV{'form.rolename'};
   
       $rolename=~s/[^A-Za-z0-9]//gs;
   
       unless ($rolename) {
    &print_username_entry_form($r);
           return;
       }
   
       $r->print(&Apache::loncommon::bodytag(
                        'Create Users, Change User Privileges').'<h2>');
       my ($rdummy,$roledef)=
    &Apache::lonnet::get('roles',["rolesdef_$rolename"]);
   # ------------------------------------------------------- Does this role exist?
       if (($rdummy ne 'con_lost') && ($roledef ne '')) {
    $r->print('Existing Role "');
       } else {
    $r->print('New Role "');
    $roledef='';
       }
       $r->print($rolename.'"</h2>');
   # ------------------------------------------------------- What can be assigned?
       my $sysrole='';
       my $domrole='';
       my $courole='';
   
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:c'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict=''; }
           if ($ENV{'form.'.$priv.':c'}) {
       $courole.=':'.$_;
    }
       }
   
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:d'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict=''; }
           if ($ENV{'form.'.$priv.':d'}) {
       $domrole.=':'.$_;
    }
       }
   
       foreach (split(/\:/,$Apache::lonnet::pr{'cr:s'})) {
    my ($priv,$restrict)=split(/\&/,$_);
           unless ($restrict) { $restrict=''; }
           if ($ENV{'form.'.$priv.':s'}) {
       $sysrole.=':'.$_;
    }
       }
       $r->print('<br />Defining Role: '.
      &Apache::lonnet::definerole($rolename,$sysrole,$domrole,$courole));
       if ($ENV{'request.course.id'}) {
           my $url='/'.$ENV{'request.course.id'};
           $url=~s/\_/\//g;
    $r->print('<br />Assigning Role to Self: '.
         &Apache::lonnet::assigncustomrole($ENV{'user.domain'},
    $ENV{'user.name'},
    $url,
    $ENV{'user.domain'},
    $ENV{'user.name'},
    $rolename));
       }
       $r->print('</body></html>');
   }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 755  sub handler { Line 1034  sub handler {
         (&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{'user.domain'})) ||          (&Apache::lonnet::allowed('cca',$ENV{'request.role.domain'})) ||
         (&Apache::lonnet::allowed('mau',$ENV{'user.domain'}))) {          (&Apache::lonnet::allowed('mau',$ENV{'request.role.domain'}))) {
        $r->content_type('text/html');         $r->content_type('text/html');
        $r->send_http_header;         $r->send_http_header;
        unless ($ENV{'form.phase'}) {         unless ($ENV{'form.phase'}) {
    &phase_one($r);     &print_username_entry_form($r);
        }         }
        if ($ENV{'form.phase'} eq 'two') {         if ($ENV{'form.phase'} eq 'get_user_info') {
            &phase_two($r);             &print_user_modification_page($r);
        } elsif ($ENV{'form.phase'} eq 'three') {         } elsif ($ENV{'form.phase'} eq 'update_user_data') {
            &phase_three($r);             &update_user_data($r);
          } elsif ($ENV{'form.phase'} eq 'selected_custom_edit') {
              &custom_role_editor($r);
          } elsif ($ENV{'form.phase'} eq 'set_custom_roles') {
      &set_custom_role($r);
        }         }
    } else {     } else {
       $ENV{'user.error.msg'}=        $ENV{'user.error.msg'}=
Line 779  sub handler { Line 1062  sub handler {
 sub course_level_table {  sub course_level_table {
     my %inccourses = @_;      my %inccourses = @_;
     my $table = '';      my $table = '';
   # Custom Roles?
   
       my %customroles=&my_custom_roles();
   
     foreach (sort( keys(%inccourses))) {      foreach (sort( keys(%inccourses))) {
  my $thiscourse=$_;   my $thiscourse=$_;
  my $protectedcourse=$_;   my $protectedcourse=$_;
  $thiscourse=~s:_:/:g;   $thiscourse=~s:_:/:g;
  my %coursedata=&Apache::lonnet::coursedescription($thiscourse);   my %coursedata=&Apache::lonnet::coursedescription($thiscourse);
  my $area=$coursedata{'description'};   my $area=$coursedata{'description'};
    if (!defined($area)) { $area='Unavailable course: '.$_; }
  my $bgcol=$thiscourse;   my $bgcol=$thiscourse;
  $bgcol=~s/[^8-9b-e]//g;   $bgcol=~s/[^7-9a-e]//g;
  $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',0,6);   $bgcol=substr($bgcol.$bgcol.$bgcol.'ffffff',2,6);
  foreach  ('st','ta','ep','ad','in','cc') {   foreach  ('st','ta','ep','ad','in','cc') {
     if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {      if (&Apache::lonnet::allowed('c'.$_,$thiscourse)) {
  my $plrole=&Apache::lonnet::plaintext($_);   my $plrole=&Apache::lonnet::plaintext($_);
Line 817  ENDTIMEENTRY Line 1105  ENDTIMEENTRY
                 $table.= "</tr>\n";                  $table.= "</tr>\n";
             }              }
         }          }
           foreach (sort keys %customroles) {
       my $plrole=$_;
       $table .= <<ENDENTRY;
   <tr bgcolor="#$bgcol">
   <td><input type="checkbox" name="act_$protectedcourse\_$_"></td>
   <td>$plrole</td>
   <td>$area</td>
   <td><input type="text" size="5" name="sec_$protectedcourse\_$_"></td>
   <td><input type=hidden name="start_$protectedcourse\_$_" value=''>
   <a href=
   "javascript:pjump('date_start','Start Date $plrole',document.cu.start_$protectedcourse\_$_.value,'start_$protectedcourse\_$_','cu.pres','dateset')">Set Start Date</a></td>
   <td><input type=hidden name="end_$protectedcourse\_$_" value=''>
   <a href=
   "javascript:pjump('date_end','End Date $plrole',document.cu.end_$protectedcourse\_$_.value,'end_$protectedcourse\_$_','cu.pres','dateset')">Set End Date</a></td></tr>
   ENDENTRY
    }
     }      }
     return '' if ($table eq ''); # return nothing if there is nothing       return '' if ($table eq ''); # return nothing if there is nothing 
                                  # in the table                                   # in the table
Line 832  ENDTABLE Line 1136  ENDTABLE
 #---------------------------------------------- end functions for &phase_two  #---------------------------------------------- end functions for &phase_two
   
 #--------------------------------- functions for &phase_two and &phase_three  #--------------------------------- functions for &phase_two and &phase_three
 sub get_home_servers {  
     my $domain = shift;  
     my %home_servers;  
     foreach (keys(%Apache::lonnet::libserv)) {  
         if ($Apache::lonnet::hostdom{$_} eq $domain) {  
             $home_servers{$_} = $Apache::lonnet::hostname{$_};  
         }  
     }  
     return %home_servers;  
 }  
   
 #--------------------------end of functions for &phase_two and &phase_three  #--------------------------end of functions for &phase_two and &phase_three
   

Removed from v.1.31  
changed lines
  Added in v.1.64


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