Diff for /loncom/auth/lonroles.pm between versions 1.116 and 1.173

version 1.116, 2005/03/03 07:16:44 version 1.173, 2006/12/11 21:56:53
Line 30 Line 30
 package Apache::lonroles;  package Apache::lonroles;
   
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::lonuserstate();  use Apache::lonuserstate();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::File();  use Apache::File();
Line 39  use Apache::loncommon; Line 39  use Apache::loncommon;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 use Apache::lonannounce;  use Apache::lonannounce;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonpageflip();
   use Apache::lonnavdisplay();
   use GDBM_File;
   use LONCAPA qw(:DEFAULT :match);
    
   
 sub redirect_user {  sub redirect_user {
     my ($r,$title,$url,$msg,$launch_nav) = @_;      my ($r,$title,$url,$msg,$launch_nav) = @_;
Line 49  sub redirect_user { Line 54  sub redirect_user {
     my $swinfo=&Apache::lonmenu::rawconfig();      my $swinfo=&Apache::lonmenu::rawconfig();
     my $navwindow;      my $navwindow;
     if ($launch_nav eq 'on') {      if ($launch_nav eq 'on') {
  $navwindow.=&Apache::lonnavmaps::launch_win('now');   $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef,
          ($url =~ m-^/adm/whatsnew-));
     } else {      } else {
  $navwindow.=&Apache::lonnavmaps::close();   $navwindow.=&Apache::lonnavmaps::close();
     }      }
     my $bodytag=&Apache::loncommon::bodytag('Switching Role');      my $start_page = &Apache::loncommon::start_page('Switching Role',undef,
       {'redirect' => [1,$url],});
       my $end_page   = &Apache::loncommon::end_page();
   
 # Note to style police:   # Note to style police: 
 # This must only replace the spaces, nothing else, or it bombs elsewhere.  # This must only replace the spaces, nothing else, or it bombs elsewhere.
     $url=~s/ /\%20/g;      $url=~s/ /\%20/g;
     $r->print(<<ENDREDIR);      $r->print(<<ENDREDIR);
 <head><title>$title</title>  $start_page
 <meta HTTP-EQUIV="Refresh" CONTENT="1; url=$url">  
 </head>  
 <html>  
 $bodytag  
 <script type="text/javascript">  <script type="text/javascript">
 $swinfo  $swinfo
 </script>  </script>
 $navwindow  $navwindow
 <h1>$msg</h1>  <h1>$msg</h1>
 <a href="$url">Continue</a>  $end_page
 </body>  
 </html>  
 ENDREDIR  ENDREDIR
     return;      return;
 }  }
   
   sub error_page {
       my ($r,$error,$dest)=@_;
       &Apache::loncommon::content_type($r,'text/html');
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
       return OK if $r->header_only;
       $r->print(&Apache::loncommon::start_page('Problems during Course Initialization').
         '<script type="text/javascript">'.
         &Apache::lonmenu::rawconfig().'</script>'.
         '<p>'.&mt('The following problems occurred:').
         $error.
         '</p><br /><a href="'.$dest.'">'.&mt('Continue').'</a>'.
         &Apache::loncommon::end_page());
   }
   
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
   
     my $now=time;      my $now=time;
     my $then=$ENV{'user.login.time'};      my $then=$env{'user.login.time'};
     my $envkey;      my $envkey;
     my %dcroles = ();      my %dcroles = ();
     my $numdc = &check_fordc(\%dcroles,$then);      my $numdc = &check_fordc(\%dcroles,$then);
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
   
 # ================================================================== Roles Init  # ================================================================== Roles Init
     if ($ENV{'form.selectrole'}) {      if ($env{'form.selectrole'}) {
  if ($ENV{'request.course.id'}) {          if ($env{'form.newrole'}) {
     my %temp=('logout_'.$ENV{'request.course.id'} => time);              $env{'form.'.$env{'form.newrole'}}=1;
    }
    if ($env{'request.course.id'}) {
       my %temp=('logout_'.$env{'request.course.id'} => time);
     &Apache::lonnet::put('email_status',\%temp);      &Apache::lonnet::put('email_status',\%temp);
     &Apache::lonnet::delenv('user.state.'.$ENV{'request.course.id'});      &Apache::lonnet::delenv('user.state.'.$env{'request.course.id'});
  }   }
  &Apache::lonnet::appenv("request.course.id"   => '',   &Apache::lonnet::appenv("request.course.id"   => '',
  "request.course.fn"   => '',   "request.course.fn"   => '',
  "request.course.uri"  => '',   "request.course.uri"  => '',
  "request.course.sec"  => '',   "request.course.sec"  => '',
  "request.role"        => 'cm',   "request.role"        => 'cm',
                                 "request.role.adv"    => $ENV{'user.adv'},                                  "request.role.adv"    => $env{'user.adv'},
  "request.role.domain" => $ENV{'user.domain'});   "request.role.domain" => $env{'user.domain'});
   
 # Check if user is a DC trying to enter a course and needs privs to be created  # Check if user is a DC trying to enter a course and needs privs to be created
         if ($numdc > 0) {          if ($numdc > 0) {
             foreach my $envkey (keys %ENV) {              foreach my $envkey (keys %env) {
                 if ($envkey =~ m-^form\.cc\./(\w+)/(\w+)$-) {                  if (my ($domain,$coursenum) =
                     if ($dcroles{$1}) {      ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) {
                         my $cckey = 'user.role.cc./'.$1.'/'.$2;                      if ($dcroles{$domain}) {
                         &check_privs($cckey,$then,$now);                          &check_privs($domain,$coursenum,$then,$now);
                     }                      }
                     last;                      last;
                 }                  }
             }              }
         }          }
   
         foreach $envkey (keys %ENV) {          foreach $envkey (keys %env) {
             next if ($envkey!~/^user\.role\./);              next if ($envkey!~/^user\.role\./);
             my ($where,$trolecode,$role,$tstatus,$tend,$tstart);              my ($where,$trolecode,$role,$tstatus,$tend,$tstart);
             &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);              &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
             if ($ENV{'form.'.$trolecode}) {              if ($env{'form.'.$trolecode}) {
  if ($tstatus eq 'is') {   if ($tstatus eq 'is') {
     $where=~s/^\///;      $where=~s/^\///;
     my ($cdom,$cnum,$csec)=split(/\//,$where);      my ($cdom,$cnum,$csec)=split(/\//,$where);
   # check for course groups
                       my %coursegroups = &Apache::lonnet::get_active_groups(
                             $env{'user.domain'},$env{'user.name'},$cdom, $cnum);
                       my $cgrps = join(':',keys(%coursegroups));
   
 # store role if recent_role list being kept  # store role if recent_role list being kept
                     if ($ENV{'environment.recentroles'}) {                      if ($env{'environment.recentroles'}) {
                           my %frozen_roles =
                              &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
  &Apache::lonhtmlcommon::store_recent('roles',   &Apache::lonhtmlcommon::store_recent('roles',
      $trolecode,' ');       $trolecode,' ',$frozen_roles{$trolecode});
                     }                      }
   
   
 # check for keyed access  # check for keyed access
     if (($role eq 'st') &&       if (($role eq 'st') && 
                        ($ENV{'course.'.$cdom.'_'.$cnum.'.keyaccess'} eq 'yes')) {                         ($env{'course.'.$cdom.'_'.$cnum.'.keyaccess'} eq 'yes')) {
 # who is key authority?  # who is key authority?
  my $authdom=$cdom;   my $authdom=$cdom;
  my $authnum=$cnum;   my $authnum=$cnum;
  if ($ENV{'course.'.$cdom.'_'.$cnum.'.keyauth'}) {   if ($env{'course.'.$cdom.'_'.$cnum.'.keyauth'}) {
     ($authnum,$authdom)=      ($authnum,$authdom)=
  split(/\W/,$ENV{'course.'.$cdom.'_'.$cnum.'.keyauth'});   split(/:/,$env{'course.'.$cdom.'_'.$cnum.'.keyauth'});
  }   }
 # check with key authority  # check with key authority
  unless (&Apache::lonnet::validate_access_key(   unless (&Apache::lonnet::validate_access_key(
      $ENV{'environment.key.'.$cdom.'_'.$cnum},       $env{'environment.key.'.$cdom.'_'.$cnum},
      $authdom,$authnum)) {       $authdom,$authnum)) {
 # there is no valid key  # there is no valid key
      if ($ENV{'form.newkey'}) {       if ($env{'form.newkey'}) {
 # student attempts to register a new key  # student attempts to register a new key
  &Apache::loncommon::content_type($r,'text/html');   &Apache::loncommon::content_type($r,'text/html');
  &Apache::loncommon::no_cache($r);   &Apache::loncommon::no_cache($r);
  $r->send_http_header;   $r->send_http_header;
  my $swinfo=&Apache::lonmenu::rawconfig();   my $swinfo=&Apache::lonmenu::rawconfig();
  my $bodytag=&Apache::loncommon::bodytag   my $start_page=&Apache::loncommon::start_page
     ('Verifying Access Key to Unlock this Course');      ('Verifying Access Key to Unlock this Course');
    my $end_page=&Apache::loncommon::end_page();
  my $buttontext=&mt('Enter Course');   my $buttontext=&mt('Enter Course');
  my $message=&mt('Successfully registered key');   my $message=&mt('Successfully registered key');
  my $assignresult=   my $assignresult=
      &Apache::lonnet::assign_access_key(       &Apache::lonnet::assign_access_key(
      $ENV{'form.newkey'},       $env{'form.newkey'},
      $authdom,$authnum,       $authdom,$authnum,
      $cdom,$cnum,       $cdom,$cnum,
                                                      $ENV{'user.domain'},                                                       $env{'user.domain'},
      $ENV{'user.name'},       $env{'user.name'},
       'Assigned from '.$ENV{'REMOTE_ADDR'}.' at '.localtime().' for '.        'Assigned from '.$ENV{'REMOTE_ADDR'}.' at '.localtime().' for '.
                                                      $trolecode);                                                       $trolecode);
  unless ($assignresult eq 'ok') {   unless ($assignresult eq 'ok') {
Line 170  sub handler { Line 200  sub handler {
      $buttontext=&mt('Re-Enter Key');       $buttontext=&mt('Re-Enter Key');
  }   }
  $r->print(<<ENDENTEREDKEY);   $r->print(<<ENDENTEREDKEY);
 <head><title>Verifying Course Access Key</title>  $start_page
 </head>  
 <html>  
 $bodytag  
 <script>  <script>
 $swinfo  $swinfo
 </script>  </script>
Line 183  $swinfo Line 210  $swinfo
 <font size="+2">$message</font><br />  <font size="+2">$message</font><br />
 <input type="submit" value="$buttontext" />  <input type="submit" value="$buttontext" />
 </form>  </form>
 </body></html>  $end_page
 ENDENTEREDKEY  ENDENTEREDKEY
                                  return OK;                                   return OK;
      } else {       } else {
Line 192  ENDENTEREDKEY Line 219  ENDENTEREDKEY
  &Apache::loncommon::no_cache($r);   &Apache::loncommon::no_cache($r);
  $r->send_http_header;   $r->send_http_header;
  my $swinfo=&Apache::lonmenu::rawconfig();   my $swinfo=&Apache::lonmenu::rawconfig();
  my $bodytag=&Apache::loncommon::bodytag   my $start_page=&Apache::loncommon::start_page
     ('Enter Access Key to Unlock this Course');      ('Enter Access Key to Unlock this Course');
    my $end_page=&Apache::loncommon::end_page();
  $r->print(<<ENDENTERKEY);   $r->print(<<ENDENTERKEY);
 <head><title>Entering Course Access Key</title>  $start_page
 </head>  
 <html>  
 $bodytag  
 <script>  <script>
 $swinfo  $swinfo
 </script>  </script>
 <form method="post">  <form method="post">
 <input type="hidden" name="selectrole" value="1" />  <input type="hidden" name="selectrole" value="1" />
 <input type="hidden" name="$trolecode" value="1" />  <input type="hidden" name="$trolecode" value="1" />
 <input type="text" size="20" name="newkey" value="$ENV{'form.newkey'}" />  <input type="text" size="20" name="newkey" value="$env{'form.newkey'}" />
 <input type="submit" value="Enter key" />  <input type="submit" value="Enter key" />
 </form>  </form>
 </body></html>  $end_page
 ENDENTERKEY  ENDENTERKEY
  return OK;   return OK;
      }       }
  }   }
      }       }
     &Apache::lonnet::log($ENV{'user.domain'},      &Apache::lonnet::log($env{'user.domain'},
  $ENV{'user.name'},   $env{'user.name'},
  $ENV{'user.home'},   $env{'user.home'},
  "Role ".$trolecode);   "Role ".$trolecode);
           
     &Apache::lonnet::appenv(      &Apache::lonnet::appenv(
    'request.role'        => $trolecode,     'request.role'        => $trolecode,
    'request.role.domain' => $cdom,     'request.role.domain' => $cdom,
    'request.course.sec'  => $csec);     'request.course.sec'  => $csec,
                                              'request.course.groups' => $cgrps);
                     my $tadv=0;                      my $tadv=0;
     if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }  
     &Apache::lonnet::appenv('request.role.adv'    => $tadv);  
   
     my $msg=&mt('Entering course ...');      if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) {
                           my $msg;
     if (($cnum) && ($role ne 'ca')) {  
  my ($furl,$ferr)=   my ($furl,$ferr)=
     &Apache::lonuserstate::readmap($cdom.'/'.$cnum);      &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
  if (($ENV{'form.orgurl'}) &&    if (($env{'form.orgurl'}) && 
     ($ENV{'form.orgurl'}!~/^\/adm\/flip/)) {      ($env{'form.orgurl'}!~/^\/adm\/flip/)) {
     my $dest=$ENV{'form.orgurl'};      my $dest=$env{'form.orgurl'};
     if ( &Apache::lonnet::mod_perl_version() == 2 ) {      if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
  &Apache::lonnet::cleanenv();      &Apache::lonnet::appenv('request.role.adv'=>$tadv);
                               if (($ferr) && ($tadv)) {
    &error_page($r,$ferr,$dest);
       } else {
    $r->internal_redirect($dest);
     }      }
     $r->internal_redirect($dest);  
     return OK;      return OK;
  } else {   } else {
     unless ($ENV{'request.course.id'}) {      if (!$env{'request.course.id'}) {
  &Apache::lonnet::appenv(   &Apache::lonnet::appenv(
       "request.course.id"  => $cdom.'_'.$cnum);        "request.course.id"  => $cdom.'_'.$cnum);
  $furl='/adm/roles?tryagain=1';   $furl='/adm/roles?tryagain=1';
  $msg=   $msg=
     '<h1><font color=red>'.      '<h1><span class="LC_error">'.
  &mt('Could not initialize course at this time.').      &mt('Could not initialize [_1] at this time.',
     '</font></h1><h3>'.&mt('Please try again.').'</h3>'.$ferr;   $env{'course.'.$cdom.'_'.$cnum.'.description'}).
       '</span></h1><h3>'.&mt('Please try again.').'</h3>'.$ferr;
     }      }
       if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
       &Apache::lonnet::appenv('request.role.adv'=>$tadv);
   
     # Check to see if the user is a CC entering a course       if (($ferr) && ($tadv)) {
     # for the first time   &error_page($r,$ferr,$furl);
     my (undef, undef, $role, $courseid) = split(/\./, $envkey);      } else {
     if (substr($courseid, 0, 1) eq '/') {   # Check to see if the user is a CC entering a course 
  $courseid = substr($courseid, 1);   # for the first time
     }   my (undef, undef, $role, $courseid) = split(/\./, $envkey);
     $courseid =~ s/\//_/;   if (substr($courseid, 0, 1) eq '/') {
     if ($role eq 'cc' && $ENV{'course.' . $courseid .       $courseid = substr($courseid, 1);
   '.course.helper.not.run'}) {   }
  $furl = "/adm/helper/course.initialization.helper";   $courseid =~ s/\//_/;
    if ($role eq 'cc' && $env{'course.' . $courseid . 
         '.course.helper.not.run'}) {
       $furl = "/adm/helper/course.initialization.helper";
       # Send the user to the course they selected
    } elsif ($env{'request.course.id'}) {
       if (&Apache::lonnet::allowed('whn',
    $env{'request.course.id'})
    || &Apache::lonnet::allowed('whn',
       $env{'request.course.id'}.'/'
       .$env{'request.course.sec'})
    ) {
    my $startpage = &courseloadpage($courseid);
    unless ($startpage eq 'firstres') {         
       $msg = &mt('Entering [_1] ....',
          $env{'course.'.$courseid.'.description'});
       &redirect_user($r,&mt('New in course'),
      '/adm/whatsnew?refpage=start',$msg,
      $env{'environment.remotenavmap'});
       return OK;
    }
       }
    }
   # Are we allowed to look at the first resource?
    if ($furl !~ m|^/adm/|) {
   # Guess not ...
       $furl=&Apache::lonpageflip::first_accessible_resource();
    }
                                   $msg = &mt('Entering [_1] ...',
      $env{'course.'.$courseid.'.description'});
    &redirect_user($r,&mt('Entering [_1]',
         $env{'course.'.$courseid.'.description'}),
          $furl,$msg,
          $env{'environment.remotenavmap'});
     }      }
                             # Send the user to the course they selected      return OK;
                             &redirect_user($r,&mt('Entering Course'),  
                                            $furl,$msg,  
    $ENV{'environment.remotenavmap'});  
                             return OK;  
  }   }
     }      }
                     #                      #
                     # Send the user to the construction space they selected                      # Send the user to the construction space they selected
                     if ($role =~ /^(au|ca)$/) {                      if ($role =~ /^(au|ca|aa)$/) {
                         my $redirect_url = '/priv/';                          my $redirect_url = '/priv/';
                         if ($role eq 'au') {                          if ($role eq 'au') {
                             $redirect_url.=$ENV{'user.name'};                              $redirect_url.=$env{'user.name'};
                         } else {                          } else {
                             $where =~ /\/(.*)$/;                              $where =~ /\/(.*)$/;
                             $redirect_url .= $1;                              $redirect_url .= $1;
Line 304  ENDENTERKEY Line 362  ENDENTERKEY
     return OK if $r->header_only;      return OK if $r->header_only;
   
     my $swinfo=&Apache::lonmenu::rawconfig();      my $swinfo=&Apache::lonmenu::rawconfig();
     my $bodytag=&Apache::loncommon::bodytag('User Roles');      my $start_page=&Apache::loncommon::start_page('User Roles');
     my $helptag='<table><tr><td>'.&Apache::loncommon::help_open_menu('','General Intro','General_Intro','User Roles',1,undef,undef,undef,undef,,&mt("Click here for help")).'</td></td></tr></table>';      my $standby=&mt('Role selected. Please stand by.');
       $standby=~s/\n/\\n/g;
   
     $r->print(<<ENDHEADER);      $r->print(<<ENDHEADER);
 <html>  $start_page
 <head>  <br />
 <title>LON-CAPA User Roles</title>  
 </head>  
 $bodytag  
 $helptag<br />  
 <script>  <script>
 $swinfo  $swinfo
 window.focus();  window.focus();
   
   active=true;
   
   function enterrole (thisform,rolecode,buttonname) {
       if (active) {
    active=false;
           document.title='$standby';
           window.status='$standby';
    thisform.newrole.value=rolecode;
    thisform.submit();
       } else {
          alert('$standby');
       }   
   }
 </script>  </script>
 ENDHEADER  ENDHEADER
   
 # ------------------------------------------ Get Error Message from Environment  # ------------------------------------------ Get Error Message from Environment
   
     my ($fn,$priv,$nochoose,$error,$msg)=split(/:/,$ENV{'user.error.msg'});      my ($fn,$priv,$nochoose,$error,$msg)=split(/:/,$env{'user.error.msg'});
     if ($ENV{'user.error.msg'}) {      if ($env{'user.error.msg'}) {
  $r->log_reason(   $r->log_reason(
    "$msg for $ENV{'user.name'} domain $ENV{'user.domain'} access $priv",$fn);     "$msg for $env{'user.name'} domain $env{'user.domain'} access $priv",$fn);
     }      }
   
 # ------------------------------------------------- Can this user re-init, etc?  # ------------------------------------------------- Can this user re-init, etc?
   
     my $advanced=$ENV{'user.adv'};      my $advanced=$env{'user.adv'};
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);
     my $tryagain=$ENV{'form.tryagain'};      my $tryagain=$env{'form.tryagain'};
   
 # -------------------------------------------------------- Generate Page Output  # -------------------------------------------------------- Generate Page Output
 # --------------------------------------------------------------- Error Header?  # --------------------------------------------------------------- Error Header?
     if ($error) {      if ($error) {
  $r->print("<h1>LON-CAPA Access Control</h1>");   $r->print("<h1>LON-CAPA Access Control</h1>");
         $r->print("<hr><pre>Access  : ".          $r->print("<!-- LONCAPAACCESSCONTROLERRORSCREEN --><hr /><pre>Access  : ".
                   Apache::lonnet::plaintext($priv)."\n");                    Apache::lonnet::plaintext($priv)."\n");
         $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");          $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");
         $r->print("Action  : $msg\n</pre><hr>");          $r->print("Action  : $msg\n</pre><hr />");
    my $url=$fn;
    my $last;
    if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
    &GDBM_READER(),0640)) {
       $last=$hash{'last_known'};
       untie(%hash);
    }
    if ($last) { $fn.='?symb='.&escape($last); }
   
    &Apache::londocs::changewarning($r,undef,'You have modified your course recently, [_1] may fix this access problem.',
    &Apache::lonenc::check_encrypt($fn));
     } else {      } else {
         if ($ENV{'user.error.msg'}) {          if ($env{'user.error.msg'}) {
     $r->print(      $r->print(
  '<h3><font color=red>'.   '<h3><span class="LC_error">'.
  &mt('You need to choose another user role or enter a specific course for this function').'</font></h3>');   &mt('You need to choose another user role or enter a specific course for this function').'</span></h3>');
  }   }
     }      }
 # -------------------------------------------------------- Choice or no choice?  # -------------------------------------------------------- Choice or no choice?
     if ($nochoose) {      if ($nochoose) {
         if ($advanced) {   $r->print("<h2>".&mt('Sorry ...')."</h2>\n".
     $r->print("<h2>".&mt('Assigned User Roles')."</h2>\n");    &mt('This action is currently not authorized.').
         } else {    &Apache::loncommon::end_page());
     $r->print("<h2>".&mt('Sorry ...')."</h2>\n".   return OK;
       &mt('This resource might be part of'));  
     if ($ENV{'request.course.id'}) {  
  $r->print(&mt(' another'));  
     } else {  
  $r->print(&mt(' a certain'));  
     }   
     $r->print(&mt(' course.').'</body></html>');  
     return OK;  
         }   
     } else {      } else {
         if ($advanced) {          if ($advanced) {
     $r->print(&mt("Your home server is ").      $r->print(&mt("Your home server is ").
       $Apache::lonnet::hostname{&Apache::lonnet::homeserver        $Apache::lonnet::hostname{&Apache::lonnet::homeserver
                       ($ENV{'user.name'},$ENV{'user.domain'})}.                        ($env{'user.name'},$env{'user.domain'})}.
       "<br />\n");        "<br />\n");
     $r->print(&mt(      $r->print(&mt(
       "Author and Co-Author roles may not be available on servers other than your home server."));        "Author and Co-Author roles are not available on servers other than their respective home servers."));
         }          }
         if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) {          if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) {
        $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'};         $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'};
Line 378  ENDHEADER Line 450  ENDHEADER
         $r->print('<form method="post" name="rolechoice" action="'.(($fn)?$fn:$r->uri).'">');          $r->print('<form method="post" name="rolechoice" action="'.(($fn)?$fn:$r->uri).'">');
         $r->print('<input type="hidden" name="orgurl" value="'.$fn.'" />');          $r->print('<input type="hidden" name="orgurl" value="'.$fn.'" />');
         $r->print('<input type="hidden" name="selectrole" value="1" />');          $r->print('<input type="hidden" name="selectrole" value="1" />');
           $r->print('<input type="hidden" name="newrole" value="" />');
     }      }
     if ($ENV{'user.adv'}) {      if ($env{'user.adv'}) {
  $r->print(   $r->print(
       '<br /><label>'.&mt('Show all roles').': <input type="checkbox" name="showall"');        '<br /><label>'.&mt('Show all roles').': <input type="checkbox" name="showall"');
  if ($ENV{'form.showall'}) { $r->print(' checked="checked" '); }   if ($env{'form.showall'}) { $r->print(' checked="checked" '); }
  $r->print(' /></label><input type="submit" value="'.&mt('Display').'" />');   $r->print(' /></label><input type="submit" value="'.&mt('Display').'" />');
     }      }
   
Line 390  ENDHEADER Line 463  ENDHEADER
     my $countactive=0;      my $countactive=0;
     my $inrole=0;      my $inrole=0;
     my $possiblerole='';      my $possiblerole='';
     foreach $envkey (sort keys %ENV) {      foreach $envkey (sort keys %env) {
         my $button = 1;          my $button = 1;
         my $switchserver='';          my $switchserver='';
  my $roletext;   my $roletext;
Line 398  ENDHEADER Line 471  ENDHEADER
         if ($envkey=~/^user\.role\./) {          if ($envkey=~/^user\.role\./) {
             my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);              my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);
             &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);              &role_status($envkey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
             next if (!defined($role) || $role eq '');              next if (!defined($role) || $role eq '' || $role =~ /^gr/);
             $tremark='';              $tremark='';
             $tpstart='&nbsp;';              $tpstart='&nbsp;';
             $tpend='&nbsp;';              $tpend='&nbsp;';
Line 409  ENDHEADER Line 482  ENDHEADER
             if ($tend) {              if ($tend) {
                 $tpend=&Apache::lonlocal::locallocaltime($tend);                  $tpend=&Apache::lonlocal::locallocaltime($tend);
             }              }
             if ($ENV{'request.role'} eq $trolecode) {              if ($env{'request.role'} eq $trolecode) {
  $tstatus='selected';   $tstatus='selected';
             }              }
             my $tbg;              my $tbg;
             if (($tstatus eq 'is') || ($tstatus eq 'selected') ||              if (($tstatus eq 'is') 
                 ($ENV{'form.showall'})) {   || ($tstatus eq 'selected') 
    || ($tstatus eq 'will') 
    || ($tstatus eq 'future') 
                   || ($env{'form.showall'})) {
                 if ($tstatus eq 'is') {                  if ($tstatus eq 'is') {
                     $tbg='#77FF77';                      $tbg='#77FF77';
                     $tfont='#003300';                      $tfont='#003300';
Line 443  ENDHEADER Line 519  ENDHEADER
                 my $trole;                  my $trole;
                 if ($role =~ /^cr\//) {                  if ($role =~ /^cr\//) {
                     my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);                      my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
                     $tremark.='<br>'.&mt('Defined by ').$rauthor.      if ($tremark) { $tremark.='<br />'; }
                       $tremark.=&mt('Defined by ').$rauthor.
  &mt(' at ').$rdomain.'.';   &mt(' at ').$rdomain.'.';
                     $trole=$rrole;   }
                 } else {   $trole=Apache::lonnet::plaintext($role);
                     $trole=Apache::lonnet::plaintext($role);  
                 }  
                 my $ttype;                  my $ttype;
                 my $twhere;                  my $twhere;
                 my ($tdom,$trest,$tsection)=                  my ($tdom,$trest,$tsection)=
                     split(/\//,Apache::lonnet::declutter($where));                      split(/\//,Apache::lonnet::declutter($where));
                 # First, Co-Authorship roles                  # First, Co-Authorship roles
                 if ($role eq 'ca') {                  if (($role eq 'ca') || ($role eq 'aa')) {
                     my $home = &Apache::lonnet::homeserver($trest,$tdom);                      my $home = &Apache::lonnet::homeserver($trest,$tdom);
     my $allowed=0;      my $allowed=0;
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }      foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
                     if (!$allowed) {                      if (!$allowed) {
  $button=0;   $button=0;
                         $switchserver=&Apache::lonnet::escape('http://'.                          $switchserver='otherserver='.$home.'&role='.$trolecode;
                          $Apache::lonnet::hostname{$home}.  
                          '/adm/login?domain='.$ENV{'user.domain'}.  
   '&username='.$ENV{'user.name'}.  
                           '&firsturl=/priv/'.$trest.'/');  
                     }                      }
                     #next if ($home eq 'no_host');                      #next if ($home eq 'no_host');
                     $home = $Apache::lonnet::hostname{$home};                      $home = $Apache::lonnet::hostname{$home};
Line 473  ENDHEADER Line 544  ENDHEADER
                     $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').                      $twhere=&mt('User').': '.$trest.'<br />'.&mt('Domain').
  ': '.$tdom.'<br />'.   ': '.$tdom.'<br />'.
                         ' '.&mt('Server').':&nbsp;'.$home;                          ' '.&mt('Server').':&nbsp;'.$home;
                     $ENV{'course.'.$tdom.'_'.$trest.'.description'}='ca';                      $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';
     $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/');      $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/');
     $sortkey=$role."$trest:$tdom";      $sortkey=$role."$trest:$tdom";
                 } elsif ($role eq 'au') {                  } elsif ($role eq 'au') {
                     # Authors                      # Authors
                     my $home = &Apache::lonnet::homeserver                      my $home = &Apache::lonnet::homeserver
                         ($ENV{'user.name'},$ENV{'user.domain'});                          ($env{'user.name'},$env{'user.domain'});
     my $allowed=0;      my $allowed=0;
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }      foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
                     if (!$allowed) {                      if (!$allowed) {
  $button=0;   $button=0;
                         $switchserver=&Apache::lonnet::escape('http://'.                          $switchserver='otherserver='.$home.'&role='.$trolecode;
                          $Apache::lonnet::hostname{$home}.  
                           '/adm/login?domain='.$ENV{'user.domain'}.  
    '&username='.$ENV{'user.name'}.  
                            '&firsturl=/priv/'.$ENV{'user.name'}.'/');  
                     }                      }
                     #next if ($home eq 'no_host');                      #next if ($home eq 'no_host');
                     $home = $Apache::lonnet::hostname{$home};                      $home = $Apache::lonnet::hostname{$home};
                     $ttype='Construction Space';                      $ttype='Construction Space';
                     $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').                      $twhere=&mt('Domain').': '.$tdom.'<br />'.&mt('Server').
  ':&nbsp;'.$home;   ':&nbsp;'.$home;
                     $ENV{'course.'.$tdom.'_'.$trest.'.description'}='ca';                      $env{'course.'.$tdom.'_'.$trest.'.description'}='ca';
     $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$ENV{'user.name'}.'/');      $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/');
     $sortkey=$role;      $sortkey=$role;
                 } elsif ($trest) {                  } elsif ($trest) {
                     $ttype='Course';  
                     if ($tsection) {  
                         $ttype.='<br>'.&mt('Section/Group').': '.$tsection;  
     }  
                     my $tcourseid=$tdom.'_'.$trest;                      my $tcourseid=$tdom.'_'.$trest;
                     if ($ENV{'course.'.$tcourseid.'.description'}) {                      $ttype = &Apache::loncommon::course_type($tcourseid);
                         $twhere=$ENV{'course.'.$tcourseid.'.description'};                      $trole = &Apache::lonnet::plaintext($role,$ttype);
                       if ($env{'course.'.$tcourseid.'.description'}) {
                           $twhere=$env{'course.'.$tcourseid.'.description'};
  $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;   $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;
                         unless ($twhere eq &mt('Currently not available')) {                          unless ($twhere eq &mt('Currently not available')) {
     $twhere.=' <font size="-2">'.      $twhere.=' <font size="-2">'.
Line 522  ENDHEADER Line 587  ENDHEADER
                               ' <font size="-2">'.                                ' <font size="-2">'.
         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).          &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom,$tfont).
                               '</font>';                                '</font>';
                               $ttype = $newhash{'type'};
                               $trole = &Apache::lonnet::plaintext($role,$ttype);
                         } else {                          } else {
                             $twhere=&mt('Currently not available');                              $twhere=&mt('Currently not available');
                             $ENV{'course.'.$tcourseid.'.description'}=$twhere;                              $env{'course.'.$tcourseid.'.description'}=$twhere;
     $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;      $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey;
                               $ttype = 'Unavailable';
                         }                          }
                     }                      }
                       if ($tsection) {
                           $twhere.='<br />'.&mt('Section/Group').': '.$tsection;
       }
     if ($role ne 'st') { $twhere.="<br />".&mt('Domain').":".$tdom; }      if ($role ne 'st') { $twhere.="<br />".&mt('Domain').":".$tdom; }
                 } elsif ($tdom) {                  } elsif ($tdom) {
                     $ttype='Domain';                      $ttype='Domain';
Line 538  ENDHEADER Line 609  ENDHEADER
                     $twhere=&mt('system wide');                      $twhere=&mt('system wide');
     $sortkey=$role.$twhere;      $sortkey=$role.$twhere;
                 }                  }
                    $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver);
                 $roletext.=&build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$ttype,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver);  
  $roletext{$envkey}=$roletext;   $roletext{$envkey}=$roletext;
  if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}   if (!$sortkey) {$sortkey=$twhere."\0".$envkey;}
  $sortrole{$sortkey}=$envkey;   $sortrole{$sortkey}=$envkey;
Line 554  ENDHEADER Line 624  ENDHEADER
  } else {   } else {
     $r->print('<h2>'.&mt('Currently no active roles or courses').'</h2>');      $r->print('<h2>'.&mt('Currently no active roles or courses').'</h2>');
  }   }
  $r->print('</form></body></html>');   $r->print('</form>'.&Apache::loncommon::end_page());
  return OK;   return OK;
 # Is there only one choice?  # Is there only one choice?
     } elsif (($countactive==1) && ($ENV{'request.role'} eq 'cm')) {      } elsif (($countactive==1) && ($env{'request.role'} eq 'cm')) {
  $r->print('<h3>'.&mt('Please stand by.').'</h3>'.   $r->print('<h3>'.&mt('Please stand by.').'</h3>'.
     '<input type="hidden" name="'.$possiblerole.'" value="1" />');      '<input type="hidden" name="'.$possiblerole.'" value="1" />');
  $r->print("</form>\n");   $r->print("</form>\n");
  $r->rflush();   $r->rflush();
  $r->print('<script>document.forms.rolechoice.submit();</script>');   $r->print('<script>document.forms.rolechoice.submit();</script>');
  $r->print('</body></html>');   $r->print(&Apache::loncommon::end_page());
  return OK;   return OK;
     }      }
 # More than one possible role  # More than one possible role
Line 573  ENDHEADER Line 643  ENDHEADER
     }      }
     $r->print('<br /><table><tr>');      $r->print('<br /><table><tr>');
     unless ($nochoose) { $r->print('<th>&nbsp;</th>'); }      unless ($nochoose) { $r->print('<th>&nbsp;</th>'); }
     $r->print('<th>'.&mt('User Role').'</th><th colspan=2>'.&mt('Extent').      $r->print('<th>'.&mt('User Role').'</th><th>'.&mt('Extent').
          '</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th><th>'.           '</th><th>'.&mt('Start').'</th><th>'.&mt('End').'</th></tr>'."\n");
       &mt('Remarks and Calendar Announcements').'</th></tr>'."\n");  
     my $doheaders=-1;      my $doheaders=-1;
     foreach my $type ('Construction Space','Course','Domain','System') {      foreach my $type ('Domain','Construction Space','Course','Unavailable','System') {
  my $haverole=0;   my $haverole=0;
  foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {   foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
     if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {       if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) { 
Line 587  ENDHEADER Line 656  ENDHEADER
  if ($haverole) { $doheaders++; }   if ($haverole) { $doheaders++; }
     }      }
   
     if ($ENV{'environment.recentroles'}) {      if ($env{'environment.recentroles'}) {
         my %recent_roles =          my %recent_roles =
                &Apache::lonhtmlcommon::get_recent('roles',$ENV{'environment.recentrolesn'});                 &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
  my $output='';   my $output='';
  foreach (sort(keys(%recent_roles))) {   foreach (sort(keys(%recent_roles))) {
     if (defined($roletext{'user.role.'.$_})) {      if (defined($roletext{'user.role.'.$_})) {
  $output.=$roletext{'user.role.'.$_};   $output.=$roletext{'user.role.'.$_};
                   if ($_ =~ m-dc\./($match_domain)/- 
       && $dcroles{$1}) {
       $output .= &allcourses_row($1,'recent');
                   }
     } elsif ($numdc > 0) {      } elsif ($numdc > 0) {
                 unless ($_ =~/^error\:/) {                  unless ($_ =~/^error\:/) {
                     $output.=&display_cc_role('user.role.'.$_);                      $output.=&display_cc_role('user.role.'.$_);
Line 601  ENDHEADER Line 674  ENDHEADER
             }               } 
  }   }
  if ($output) {   if ($output) {
     $r->print("<tr bgcolor='#BBffBB'><td align='center' colspan='7'>".      $r->print("<tr><td align='center' colspan='5'><font face='arial'>".
       &mt('Recent Roles')."</td>");        &mt('Recent Roles')."</font></td>");
     $r->print($output);      $r->print($output);
     $r->print("</tr>");      $r->print("</tr>");
             $doheaders ++;              $doheaders ++;
Line 613  ENDHEADER Line 686  ENDHEADER
         $r->print(&coursepick_jscript());          $r->print(&coursepick_jscript());
         $r->print(&Apache::loncommon::coursebrowser_javascript());          $r->print(&Apache::loncommon::coursebrowser_javascript());
     }      }
     foreach my $type ('Construction Space','Course','Domain','System') {      foreach my $type ('Construction Space','Domain','Course','Unavailable','System') {
  my $output;   my $output;
  foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {   foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
     if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {       if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) { 
  $output.=$roletext{$sortrole{$which}};   $output.=$roletext{$sortrole{$which}};
                 if ($sortrole{$which} =~ m-dc\./(\w+)/-) {                  if ($sortrole{$which} =~ m-dc\./($match_domain)/-) {
                     if ($dcroles{$1}) {                      if ($dcroles{$1}) {
                         $output .= &allcourses_row($1);                          $output .= &allcourses_row($1,'');
                     }                      }
                 }                  }
     }      }
  }   }
  if ($output) {   if ($output) {
     if ($doheaders > 0) {      if ($doheaders > 0) {
  $r->print("<tr bgcolor='#BBffBB'>".   $r->print("<tr>".
   "<td align='center' colspan='7'>".&mt($type)."</td></tr>");    "<td align='center' colspan='5'><font face='arial'>".&mt($type)."</font></td></tr>");
     }      }
     $r->print($output);      $r->print($output);
  }   }
     }      }
     my $tremark='';      my $tremark='';
     my $tfont='#003300';      my $tfont='#003300';
     if ($ENV{'request.role'} eq 'cm') {      if ($env{'request.role'} eq 'cm') {
  $r->print('<tr bgcolor="#11CC55">');   $r->print('<tr bgcolor="#11CC55">');
         $tremark=&mt('Currently selected. ');          $tremark=&mt('Currently selected. ');
         $tfont='#002200';          $tfont='#002200';
Line 643  ENDHEADER Line 716  ENDHEADER
         $r->print('<tr bgcolor="#77FF77">');          $r->print('<tr bgcolor="#77FF77">');
     }      }
     unless ($nochoose) {      unless ($nochoose) {
  if ($ENV{'request.role'} ne 'cm') {   if ($env{'request.role'} ne 'cm') {
     $r->print('<td><input type=submit value="'.      $r->print('<td><input type="submit" value="'.
       &mt('Select').'" name="cm"></td>');        &mt('Select').'" name="cm"></td>');
  } else {   } else {
     $r->print('<td>&nbsp;</td>');      $r->print('<td>&nbsp;</td>');
  }   }
     }      }
     $r->print('<td colspan=5><font color="'.$tfont.'">'.&mt('No role specified').      $r->print('<td colspan="3"><font color="'.$tfont.'">'.&mt('No role specified').
       '</font></td><td><font color="'.$tfont.'">'.$tremark.        '</font></td><td><font color="'.$tfont.'">'.$tremark.
       '&nbsp;</font></td></tr>'."\n");        '&nbsp;</font></td></tr>'."\n");
   
Line 659  ENDHEADER Line 732  ENDHEADER
  $r->print("</form>\n");   $r->print("</form>\n");
     }      }
 # ------------------------------------------------------------ Privileges Info  # ------------------------------------------------------------ Privileges Info
     if (($advanced) && (($ENV{'user.error.msg'}) || ($error))) {      if (($advanced) && (($env{'user.error.msg'}) || ($error))) {
  $r->print('<hr><h2>Current Privileges</h2>');   $r->print('<hr /><h2>Current Privileges</h2>');
   
  foreach $envkey (sort keys %ENV) {   foreach $envkey (sort keys %env) {
     if ($envkey=~/^user\.priv\.$ENV{'request.role'}\./) {      if ($envkey=~/^user\.priv\.$env{'request.role'}\./) {
  my $where=$envkey;   my $where=$envkey;
  $where=~s/^user\.priv\.$ENV{'request.role'}\.//;   $where=~s/^user\.priv\.$env{'request.role'}\.//;
  my $ttype;   my $ttype;
  my $twhere;   my $twhere;
  my ($tdom,$trest,$tsec)=   my ($tdom,$trest,$tsec)=
     split(/\//,Apache::lonnet::declutter($where));      split(/\//,Apache::lonnet::declutter($where));
  if ($trest) {   if ($trest) {
     if ($ENV{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {      if ($env{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {
  $ttype='Construction Space';   $ttype='Construction Space';
  $twhere='User: '.$trest.', Domain: '.$tdom;   $twhere='User: '.$trest.', Domain: '.$tdom;
     } else {      } else {
  $ttype='Course';   $ttype= 
  $twhere=$ENV{'course.'.$tdom.'_'.$trest.'.description'};      &Apache::loncommon::course_type($tdom.'_'.$trest);
    $twhere=$env{'course.'.$tdom.'_'.$trest.'.description'};
  if ($tsec) {   if ($tsec) {
     $twhere.=' (Section/Group: '.$tsec.')';      $twhere.=' (Section: '.$tsec.')';
  }   }
     }      }
  } elsif ($tdom) {   } elsif ($tdom) {
Line 689  ENDHEADER Line 763  ENDHEADER
     $twhere='/';      $twhere='/';
  }   }
  $r->print("\n<h3>".$ttype.': '.$twhere.'</h3><ul>');   $r->print("\n<h3>".$ttype.': '.$twhere.'</h3><ul>');
  foreach (sort split(/:/,$ENV{$envkey})) {   foreach (sort split(/:/,$env{$envkey})) {
     if ($_) {      if ($_) {
  my ($prv,$restr)=split(/\&/,$_);   my ($prv,$restr)=split(/\&/,$_);
  my $trestr='';   my $trestr='';
Line 718  ENDHEADER Line 792  ENDHEADER
   $r->dir_config('lonVersion').'</i><br />'.    $r->dir_config('lonVersion').'</i><br />'.
   '<a href="/adm/logout">'.&mt('Logout').'</a></small></p>');    '<a href="/adm/logout">'.&mt('Logout').'</a></small></p>');
     }      }
     $r->print("</body></html>\n");      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
 sub role_status {  sub role_status {
     my ($rolekey,$then,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;      my ($rolekey,$then,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;
     my @pwhere = ();      my @pwhere = ();
     if (exists($ENV{$rolekey}) && $ENV{$rolekey} ne '') {      if (exists($env{$rolekey}) && $env{$rolekey} ne '') {
         (undef,undef,$$role,@pwhere)=split(/\./,$rolekey);          (undef,undef,$$role,@pwhere)=split(/\./,$rolekey);
         unless (!defined($$role) || $$role eq '') {          unless (!defined($$role) || $$role eq '') {
             $$where=join('.',@pwhere);              $$where=join('.',@pwhere);
             $$trolecode=$$role.'.'.$$where;              $$trolecode=$$role.'.'.$$where;
             ($$tstart,$$tend)=split(/\./,$ENV{$rolekey});              ($$tstart,$$tend)=split(/\./,$env{$rolekey});
             $$tstatus='is';              $$tstatus='is';
             if ($$tstart && $$tstart>$then) {              if ($$tstart && $$tstart>$then) {
  $$tstatus='future';   $$tstatus='future';
Line 748  sub role_status { Line 822  sub role_status {
 }  }
   
 sub build_roletext {  sub build_roletext {
     my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$ttype,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;      my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;
     my $roletext='<tr bgcolor="'.$tbg.'">';      my $roletext='<tr bgcolor="'.$tbg.'">';
       my $is_dc=($trolecode =~ m/^dc\./);
       my $rowspan=($is_dc) ? ''
                            : ' rowspan="2" ';
   
     unless ($nochoose) {      unless ($nochoose) {
           my $buttonname=$trolecode;
           $buttonname=~s/\W//g;
         if (!$button) {          if (!$button) {
             if ($switchserver) {              if ($switchserver) {
                 $roletext.='<td><a href="/adm/logout?handover='.                  $roletext.='<td'.$rowspan.'><a href="/adm/switchserver?'.
                 $switchserver.'">'.&mt('Switch Server').'</a></td>';                  $switchserver.'">'.&mt('Switch Server').'</a></td>';
             } else {              } else {
                 $roletext.=('<td>&nbsp;</td>');                  $roletext.=('<td'.$rowspan.'>&nbsp;</td>');
             }              }
         } elsif ($tstatus eq 'is') {          } elsif ($tstatus eq 'is') {
             $roletext.=('<td><input type=submit value="'.              $roletext.='<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                         &mt('Select').'" name="'.                          &mt('Select').'" onClick="javascript:enterrole(this.form,\''.
                         $trolecode.'"></td>');                          $trolecode."','".$buttonname.'\');"></td>';
         } elsif ($tryagain) {          } elsif ($tryagain) {
             $roletext.=              $roletext.=
                 '<td><input type=submit value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Try Selecting Again').'" name="'.$trolecode.'"></td>';                  &mt('Try Selecting Again').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');"></td>';
         } elsif ($advanced) {          } elsif ($advanced) {
             $roletext.=              $roletext.=
                 '<td><input type=submit value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Initialize').'" name="'.$trolecode.'"></td>';                  &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');"></td>';
         } else {          } else {
             $roletext.='<td>&nbsp;</td>';              $roletext.='<td'.$rowspan.'>&nbsp;</td>';
         }          }
     }      }
     $tremark.=&Apache::lonannounce::showday(time,1,      if ($trolecode !~ m/^(dc|ca|au|aa)\./) {
                  &Apache::lonannounce::readcalendar($tdom.'_'.$trest));   $tremark.=&Apache::lonannounce::showday(time,1,
    &Apache::lonannounce::readcalendar($tdom.'_'.$trest));
       }
     $roletext.='<td><font color="'.$tfont.'">'.$trole.      $roletext.='<td><font color="'.$tfont.'">'.$trole.
                '</font></td><td><font color="'.$tfont.'">'.$ttype.         '</font></td><td><font color="'.$tfont.'">'.$twhere.
                '</font></td><td><font color="'.$tfont.'">'.$twhere.  
                '</font></td><td><font color="'.$tfont.'">'.$tpstart.                 '</font></td><td><font color="'.$tfont.'">'.$tpstart.
                '</font></td><td><font color="'.$tfont.'">'.$tpend.                 '</font></td><td><font color="'.$tfont.'">'.$tpend.
                '</font></td><td><font color="'.$tfont.'">'.$tremark.                 '</font></td></tr>';
                '&nbsp;</font></td></tr>'."\n";      if (!$is_dc) {
    $roletext.='<tr bgcolor="'.$tbg.'"><td colspan="4"><font color="'.$tfont.'">'.$tremark.
       '&nbsp;</font></td></tr><tr><td colspan="5" height="3"></td></tr>'."\n";
       }
     return $roletext;      return $roletext;
 }  }
   
 sub check_privs {  sub check_privs {
     my ($cckey,$then,$now) = @_;      my ($cdom,$cnum,$then,$now) = @_;
     if ($ENV{$cckey}) {      my $cckey = 'user.role.cc./'.$cdom.'/'.$cnum; 
       if ($env{$cckey}) {
         my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);          my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend,$tfont);
         &role_status($cckey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);          &role_status($cckey,$then,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
         unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) {          unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) {
             &set_privileges($1,$2);              &set_privileges($cdom,$cnum);
         }          }
     } else {      } else {
         &set_privileges($1,$2);          &set_privileges($cdom,$cnum);
     }      }
 }  }
   
 sub check_fordc {  sub check_fordc {
     my ($dcroles,$then) = @_;      my ($dcroles,$then) = @_;
     my $numdc = 0;      my $numdc = 0;
     if ($ENV{'user.adv'}) {      if ($env{'user.adv'}) {
         foreach my $envkey (sort keys %ENV) {          foreach my $envkey (sort keys %env) {
             if ($envkey=~/^user\.role\.dc\.\/(\w+)\/$/) {              if ($envkey=~/^user\.role\.dc\.\/($match_domain)\/$/) {
                 my $dcdom = $1;                  my $dcdom = $1;
                 my $livedc = 1;                  my $livedc = 1;
                 my ($tstart,$tend)=split(/\./,$ENV{$envkey});                  my ($tstart,$tend)=split(/\./,$env{$envkey});
                 if ($tstart && $tstart>$then) { $livedc = 0; }                  if ($tstart && $tstart>$then) { $livedc = 0; }
                 if ($tend   && $tend  <$then) { $livedc = 0; }                  if ($tend   && $tend  <$then) { $livedc = 0; }
                 if ($livedc) {                  if ($livedc) {
Line 823  sub check_fordc { Line 908  sub check_fordc {
 }  }
   
 sub courselink {  sub courselink {
     my ($dcdom) = @_;      my ($dcdom,$rowtype,$selecttype) = @_;
     my $courseform=&Apache::loncommon::selectcourse_link      my $courseform=&Apache::loncommon::selectcourse_link
                      ('rolechoice','dccourse_'.$dcdom,'dcdomain_'.$dcdom,'coursedesc_'.$dcdom,$dcdom);                     ('rolechoice','dccourse'.$rowtype.'_'.$dcdom,
     my $hiddenitems = '<input type="hidden" name="dcdomain_'.$dcdom.'" value="'.$dcdom.'" />'.                      'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'.
                       '<input type="hidden" name="origdom_'.$dcdom.'" value="'.$dcdom.'" />'.                      $dcdom,$dcdom,undef);
                       '<input type="hidden" name="dccourse_'.$dcdom.'" value="" />'.      my $hiddenitems = '<input type="hidden" name="dcdomain'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.
                       '<input type="hidden" name="coursedesc_'.$dcdom.'" value="" />';                        '<input type="hidden" name="origdom'.$rowtype.'_'.$dcdom.'" value="'.$dcdom.'" />'.
                         '<input type="hidden" name="dccourse'.$rowtype.'_'.$dcdom.'" value="" />'.
                         '<input type="hidden" name="coursedesc'.$rowtype.'_'.$dcdom.'" value="" />';
     return $courseform.$hiddenitems;      return $courseform.$hiddenitems;
 }  }
   
Line 870  END Line 957  END
 }  }
   
 sub processpick {  sub processpick {
     my $dcdom = shift;  
     my $process_pick = <<"END";      my $process_pick = <<"END";
 <script>  <script>
 function process_pick(dom) {  function process_pick(dom) {
     var numbutton = getIndex(dom)      var pickedCourse=opener.document.rolechoice.$env{'form.cnumelement'}.value;
     var pickedCourse = opener.document.rolechoice.dccourse_$dcdom.value      var pickedDomain=opener.document.rolechoice.$env{'form.cdomelement'}.value;
     var pickedDomain = opener.document.rolechoice.dcdomain_$dcdom.value      var okDomain = 0;
     if (opener.document.rolechoice.dcdomain_$dcdom.value == opener.document.rolechoice.origdom_$dcdom.value) {  
       if (pickedDomain == dom) {
         if (pickedCourse != '') {          if (pickedCourse != '') {
             if (numbutton != -1) {              var courseTarget = "cc./"+pickedDomain+"/"+pickedCourse
                 var courseTarget = "cc./"+pickedDomain+"/"+pickedCourse              opener.document.title='Role selected. Please stand by.';
                 opener.document.rolechoice.elements[numbutton+1].name = courseTarget              opener.status='Role selected. Please stand by.';
                 opener.document.rolechoice.submit()      opener.document.rolechoice.newrole.value=courseTarget
             }              opener.document.rolechoice.submit()
         }          }
       } else {
           alert("You may only use this screen to select courses in the current domain: "+dom+"\\nPlease return to the roles page window and click the 'Select Course' link for domain: "+pickedDomain+",\\n if you are a Domain Coordinator in that domain, and wish to become a Course Coordinator in a course in the domain");
     }      }
 }  }
     
 function getIndex(dom) {  
     var callername = 'ccpick_'+dom  
     for (var i=0;i<opener.document.rolechoice.elements.length;i++) {  
         var elemname = opener.document.rolechoice.elements[i].name  
         if (elemname == callername) {  
             return i;  
         }  
     }  
     return -1;  
 }  
 </script>  </script>
 END  END
     return $process_pick;      return $process_pick;
Line 906  END Line 985  END
 sub display_cc_role {  sub display_cc_role {
     my $rolekey = shift;      my $rolekey = shift;
     my $roletext;      my $roletext;
     my $advanced = $ENV{'user.adv'};      my $advanced = $env{'user.adv'};
     my $tryagain = $ENV{'form.tryagain'};      my $tryagain = $env{'form.tryagain'};
     unless ($rolekey =~/^error\:/) {      unless ($rolekey =~/^error\:/) {
         if ($rolekey =~ m-^user\.role.cc\./(\w+)/(\w+)$-) {          if ($rolekey =~ m-^user\.role.cc\./($match_domain)/($match_courseid)$-) {
             my $tcourseid = $1.'_'.$2;              my $tcourseid = $1.'_'.$2;
             my $trolecode = 'cc./'.$1.'/'.$2;              my $trolecode = 'cc./'.$1.'/'.$2;
             my $trole = Apache::lonnet::plaintext('cc');  
             my $twhere;              my $twhere;
               my $ttype;
             my $tbg='#77FF77';              my $tbg='#77FF77';
             my $tfont='#003300';              my $tfont='#003300';
             my %newhash=&Apache::lonnet::coursedescription($tcourseid);              my %newhash=&Apache::lonnet::coursedescription($tcourseid);
Line 922  sub display_cc_role { Line 1001  sub display_cc_role {
                         ' <font size="-2">'.                          ' <font size="-2">'.
                         &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$2,$1,$tfont).                          &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$2,$1,$tfont).
                         '</font>';                          '</font>';
                   $ttype = $newhash{'type'};
             } else {              } else {
                 $twhere=&mt('Currently not available');                  $twhere=&mt('Currently not available');
                 $ENV{'course.'.$tcourseid.'.description'}=$twhere;                  $env{'course.'.$tcourseid.'.description'}=$twhere;
             }              }
               my $trole = &Apache::lonnet::plaintext('cc',$ttype);
             $twhere.="<br />".&mt('Domain').":".$1;              $twhere.="<br />".&mt('Domain').":".$1;
             $roletext = &build_roletext($trolecode,$1,$2,'is',$tryagain,$advanced,'',$tbg,$tfont,$trole,&mt('Course'),$twhere,'','','',1,'');              $roletext = &build_roletext($trolecode,$1,$2,'is',$tryagain,$advanced,'',$tbg,$tfont,$trole,$twhere,'','','',1,'');
         }          }
     }      }
     return $roletext;      return ($roletext);
 }  }
   
 sub allcourses_row {  sub allcourses_row {
     my $dcdom = shift;      my ($dcdom,$rowtype) = @_;
     my $ccrole = Apache::lonnet::plaintext('cc');  
     my $selectlink = &courselink($dcdom);  
     my $output = '<tr bgcolor="#77FF77">'.      my $output = '<tr bgcolor="#77FF77">'.
               '<td><input type="button" value="'.                   ' <td colspan="5">';
               &mt('Select').'" name="ccpick_'.$dcdom.'"'.      my $selectlink = &courselink($dcdom,$rowtype);
               'onClick="verifyCoursePick(this)">'.      my $ccrole = &Apache::lonnet::plaintext('cc');
               '<input type="hidden" name="pick_'.$dcdom.'" value="1"></td>'.      $output.= '<font color="#002200">'.$ccrole.'</font>'.
               '<td><font color="#002200">'.                ' <b>'.$selectlink.'</b>'.
               $ccrole.'</font></td><td>'.&mt('Course').'</td>'.                ' from '.&mt('Domain').' '.$dcdom.'<br />';
               '<td><font color="#002200">'.&mt('All courses').':<b>&nbsp;'.      $output .= '</tr><tr><td colspan="5" height="3"></td></tr>'."\n";
               $selectlink.'</b>'.  
               '<br />'.&mt('Domain').':'.$dcdom.'</font>'.  
               '<td colspan="4"><font color="#002200">'.  
               &mt('Course Coordinator access to all courses in domain').  
               ': <b>'.$dcdom.'</b></font></td></tr>'."\n";  
     return $output;      return $output;
 }  }
   
 sub recent_filename {  sub recent_filename {
     my $area=shift;      my $area=shift;
     return 'nohist_recent_'.&Apache::lonnet::escape($area);      return 'nohist_recent_'.&escape($area);
 }  }
   
 sub set_privileges {  sub set_privileges {
Line 963  sub set_privileges { Line 1037  sub set_privileges {
     my $area = '/'.$dcdom.'/'.$pickedcourse;      my $area = '/'.$dcdom.'/'.$pickedcourse;
     my $role = 'cc';      my $role = 'cc';
     my $spec = $role.'.'.$area;      my $spec = $role.'.'.$area;
     my $userroles = &Apache::lonnet::set_arearole($role,$area,'','',$dcdom,$ENV{'user.name'});      my %userroles = &Apache::lonnet::set_arearole($role,$area,'','',
     $env{'user.domain'},
     $env{'user.name'});
     my %ccrole = ();      my %ccrole = ();
     &Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area);      &Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area);
     my ($author,$adv)= &Apache::lonnet::set_userprivs(\$userroles,\%ccrole);      my ($author,$adv)= &Apache::lonnet::set_userprivs(\%userroles,\%ccrole);
     my @newprivs = split/\n/,$userroles;      &Apache::lonnet::appenv(%userroles);
     my %newccroles = ();      &Apache::lonnet::log($env{'user.domain'},
     foreach (@newprivs) {                           $env{'user.name'},
         my ($key,$val) = split/=/,$_;                           $env{'user.home'},
         $newccroles{$key} = $val;  
     }  
     &Apache::lonnet::appenv(%newccroles);  
     &Apache::lonnet::log($ENV{'user.domain'},  
                          $ENV{'user.name'},  
                          $ENV{'user.home'},  
                         "Role ".$role);                          "Role ".$role);
     &Apache::lonnet::appenv(      &Apache::lonnet::appenv(
                           'request.role'        => $role,                            'request.role'        => $spec,
                           'request.role.domain' => $dcdom,                            'request.role.domain' => $dcdom,
                           'request.course.sec'  => '');                            'request.course.sec'  => '');
     my $tadv=0;      my $tadv=0;
Line 987  sub set_privileges { Line 1057  sub set_privileges {
     &Apache::lonnet::appenv('request.role.adv'    => $tadv);      &Apache::lonnet::appenv('request.role.adv'    => $tadv);
 }  }
   
   sub courseloadpage {
       my ($courseid) = @_;
       my $startpage;
       my %entry_settings = &Apache::lonnet::get('nohist_whatsnew',
         [$courseid.':courseinit']);
       my ($tmp) = %entry_settings;
       unless ($tmp =~ /^error: 2 /) {
           $startpage = $entry_settings{$courseid.':courseinit'};
       }
       if ($startpage eq '') {
           if (exists($env{'environment.course_init_display'})) {
               $startpage = $env{'environment.course_init_display'};
           }
       }
       return $startpage;
   }
   
 1;  1;
 __END__  __END__
   

Removed from v.1.116  
changed lines
  Added in v.1.173


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.