Diff for /loncom/auth/lonroles.pm between versions 1.205 and 1.209.4.1

version 1.205, 2008/09/02 02:56:52 version 1.209.4.1, 2009/09/23 16:55:53
Line 146  sub handler { Line 146  sub handler {
 # Is this an ad-hoc CA-role?  # Is this an ad-hoc CA-role?
                 if (my ($domain,$user) =                  if (my ($domain,$user) =
     ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {      ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {
                    # Check if author blocked ca-access                      if (($domain eq $env{'user.domain'}) && ($user eq $env{'user.name'})) {
                     my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);                          delete($env{$envkey});
                     if ($blocked{'domcoord.author'} eq 'blocked') {                          $env{'form.au./'.$domain.'/'} = 1;
                         my %roleshash = &Apache::lonnet::get_my_roles($user,$domain);                          my ($server_status,$home) = &check_author_homeserver($user,$domain);
                         if (!defined($roleshash{$env{'user.name'}.':'.$env{'user.domain'}.':ca'})) {                           if ($server_status eq 'switchserver') {
                             delete($env{$envkey});                              my $trolecode = 'au./'.$domain.'/';
                             $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';                              my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
                               $r->internal_redirect($switchserver);
                           }
                           last;
                       }
                       if (my ($castart,$caend) = ($env{'user.role.ca./'.$domain.'/'.$user} =~ /^(\d*)\.(\d*)$/)) {
                           if (((($castart) && ($castart < $now)) || !$castart) && 
                               ((!$caend) || (($caend) && ($caend > $now)))) {
                               my ($server_status,$home) = &check_author_homeserver($user,$domain);
                               if ($server_status eq 'switchserver') {
                                   my $trolecode = 'ca./'.$domain.'/'.$user;
                                   my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
                                   $r->internal_redirect($switchserver);
                               }
                             last;                              last;
                         }                          }
                     }                      }
                       # Check if author blocked ca-access
                       my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);
                       if ($blocked{'domcoord.author'} eq 'blocked') {
                           delete($env{$envkey});
                           $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
                           last;
                       }
                     if ($dcroles{$domain}) {                      if ($dcroles{$domain}) {
                         my ($server_status,$home) = &check_author_homeserver($user,$domain);                          my ($server_status,$home) = &check_author_homeserver($user,$domain);
                         if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {                          if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {
Line 463  ENDHEADER Line 483  ENDHEADER
     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'};
       my $reinit=$env{'user.reinit'};
       delete $env{'user.reinit'};
   
 # -------------------------------------------------------- Generate Page Output  # -------------------------------------------------------- Generate Page Output
 # --------------------------------------------------------------- Error Header?  # --------------------------------------------------------------- Error Header?
Line 492  ENDHEADER Line 514  ENDHEADER
  &Apache::lonenc::check_encrypt($fn));   &Apache::lonenc::check_encrypt($fn));
     } else {      } else {
         if ($env{'user.error.msg'}) {          if ($env{'user.error.msg'}) {
     $r->print(              if ($reinit) {
                   $r->print(
    '<h3><span class="LC_error">'.
    &mt('As your session file for the course has expired, you will need to re-select the course.').'</span></h3>');
               } else {
           $r->print(
  '<h3><span class="LC_error">'.   '<h3><span class="LC_error">'.
  &mt('You need to choose another user role or enter a specific course for this function').'</span></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) {
Line 520  ENDHEADER Line 548  ENDHEADER
     my $possiblerole='';      my $possiblerole='';
     my %futureroles;      my %futureroles;
     my %roles_nextlogin;      my %roles_nextlogin;
       my %timezones;
     foreach $envkey (sort keys %env) {      foreach $envkey (sort keys %env) {
         my $button = 1;          my $button = 1;
         my $switchserver='';          my $switchserver='';
Line 529  ENDHEADER Line 558  ENDHEADER
             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 '' || $role =~ /^gr/);              next if (!defined($role) || $role eq '' || $role =~ /^gr/);
               my $timezone = &role_timezone($where,\%timezones);
             $tremark='';              $tremark='';
             $tpstart='&nbsp;';              $tpstart='&nbsp;';
             $tpend='&nbsp;';              $tpend='&nbsp;';
             $tfont='#000000';              $tfont='#000000';
             if ($tstart) {              if ($tstart) {
                 $tpstart=&Apache::lonlocal::locallocaltime($tstart);                  $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone);
             }              }
             if ($tend) {              if ($tend) {
                 $tpend=&Apache::lonlocal::locallocaltime($tend);                  $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone);
             }              }
             if ($env{'request.role'} eq $trolecode) {              if ($env{'request.role'} eq $trolecode) {
  $tstatus='selected';   $tstatus='selected';
Line 669  ENDHEADER Line 699  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,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit);
  $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 722  ENDHEADER Line 752  ENDHEADER
         }          }
         $r->print(&Apache::loncommon::end_page());          $r->print(&Apache::loncommon::end_page());
  return OK;   return OK;
 # Is there only one choice?  
     } elsif ($countactive==1) {  
         my $needs_switchserver;  
         if ($env{'user.author'}) {  
             $needs_switchserver = &check_needs_switchserver($possiblerole);  
         }  
         if ((!$needs_switchserver) && ($env{'request.role'} eq 'cm')) {  
     $r->print('<h3>'.&mt('Please stand by.').'</h3>'.  
         '<input type="hidden" name="'.$possiblerole.'" value="1" />'.  
             '<noscript><br /><input type="submit" name="submit" value="'.&mt('Continue').'" /></noscript>');  
     $r->print("</form>\n");  
     $r->rflush();  
     $r->print('<script type="text/javascript">document.forms.rolechoice.submit();</script>');  
     $r->print(&Apache::loncommon::end_page());  
     return OK;  
         }  
         if ($needs_switchserver) {  
             $r->print("<h2>".&mt('Server Switch Required')."</h2>\n".  
                       &mt('Construction Space access is only available from '.  
                           'the home server of the corresponding Author.').'<br />'.  
                       &mt("Click the 'Switch Server' link to go there.").'<br />');     
         }  
     }      }
 # More than one possible role  
 # ----------------------------------------------------------------------- Table  # ----------------------------------------------------------------------- Table
     unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {      unless ((!&Apache::lonmenu::show_course()) || ($nochoose) || ($countactive==1)) {
  $r->print("<h2>".&mt('Select a Course to Enter')."</h2>\n");   $r->print("<h2>".&mt('Select a Course to Enter')."</h2>\n");
Line 828  ENDHEADER Line 835  ENDHEADER
     return OK;      return OK;
 }  }
   
   sub role_timezone {
       my ($where,$timezones) = @_;
       my $timezone;
       if (ref($timezones) eq 'HASH') {
           if ($where =~ m{^/($match_domain)/($match_courseid)}) {
               my $cdom = $1;
               my $cnum = $2;
               if ($cdom && $cnum) {
                   if (!exists($timezones->{$cdom.'_'.$cnum})) {
                       my %timehash =
                           &Apache::lonnet::get('environment',['timezone'],$cdom,$cnum);
                       if ($timehash{'timezone'} eq '') {
                           if (!exists($timezones->{$cdom})) {
                               my %domdefaults =
                                   &Apache::lonnet::get_domain_defaults($cdom);
                               if ($domdefaults{'timezone_def'} eq '') {
                                   $timezones->{$cdom} = 'local';
                               } else {
                                   $timezones->{$cdom} = $domdefaults{'timezone_def'};
                               }
                           }
                           $timezones->{$cdom.'_'.$cnum} = $timezones->{$cdom};
                       } else {
                           $timezones->{$cdom.'_'.$cnum} =
                               &Apache::lonlocal::gettimezone($timehash{'timezone'});
                       }
                   }
                   $timezone = $timezones->{$cdom.'_'.$cnum};
               }
           } else {
               my ($tdom) = ($where =~ m{^/($match_domain)});
               if ($tdom) {
                   if (!exists($timezones->{$tdom})) {
                       my %domdefaults = &Apache::lonnet::get_domain_defaults($tdom);
                       if ($domdefaults{'timezone_def'} eq '') {
                           $timezones->{$tdom} = 'local';
                       } else {
                           $timezones->{$tdom} = $domdefaults{'timezone_def'};
                       }
                   }
                   $timezone = $timezones->{$tdom};
               }
           }
           if ($timezone eq 'local') {
               $timezone = undef;
           }
       }
       return $timezone;
   }
   
 sub roletable_headers {  sub roletable_headers {
     my ($r,$roleclass,$sortrole,$nochoose) = @_;      my ($r,$roleclass,$sortrole,$nochoose) = @_;
     my $doheaders;      my $doheaders;
Line 991  sub role_status { Line 1048  sub role_status {
 }  }
   
 sub build_roletext {  sub build_roletext {
     my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_;      my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit) = @_;
     my $roletext='<tr bgcolor="'.$tbg.'" class="LC_rolesmenu_'.$tstatus.'">';      my $roletext='<tr bgcolor="'.$tbg.'" class="LC_rolesmenu_'.$tstatus.'">';
     my $is_dc=($trolecode =~ m/^dc\./);      my $is_dc=($trolecode =~ m/^dc\./);
     my $rowspan=($is_dc) ? ''      my $rowspan=($is_dc) ? ''
Line 1021  sub build_roletext { Line 1078  sub build_roletext {
                 '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.                  '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                 &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.                  &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                         $trolecode."','".$buttonname.'\');" /></td>';                          $trolecode."','".$buttonname.'\');" /></td>';
           } elsif ($reinit) {
               $roletext.= 
                   '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                   &mt('Re-Select').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');" /></td>';
         } else {          } else {
             $roletext.='<td'.$rowspan.'>&nbsp;</td>';              $roletext.=
                   '<td'.$rowspan.'><input name="'.$buttonname.'" type="button" value="'.
                   &mt('Re-Initialize').'" onClick="javascript:enterrole(this.form,\''.
                           $trolecode."','".$buttonname.'\');" /></td>';
         }          }
     }      }
     if ($trolecode !~ m/^(dc|ca|au|aa)\./) {      if ($trolecode !~ m/^(dc|ca|au|aa)\./) {
Line 1139  sub adhoc_course_role { Line 1204  sub adhoc_course_role {
                         return;                          return;
                     }                      }
                 }                  }
                 my (%userroles,%newrole,%newgroups);                  my (%userroles,%newrole,%newgroups,%group_privs);
                   my %cgroups =
                       &Apache::lonnet::get_active_groups($env{'user.domain'},
                                               $env{'user.name'},$cdom,$cnum);
                   foreach my $group (keys(%cgroups)) {
                       $group_privs{$group} =
                           $env{'user.priv.cc./'.$cdom.'/'.$cnum.'./'.$cdom.'/'.$cnum.'/'.$group};
                   }
                   $newgroups{'/'.$cdom.'/'.$cnum} = \%group_privs;
                 my $area = '/'.$cdom.'/'.$cnum;                  my $area = '/'.$cdom.'/'.$cnum;
                 my $spec = $role.'.'.$area;                  my $spec = $role.'.'.$area;
                 if ($usec ne '') {                  if ($usec ne '') {
Line 1147  sub adhoc_course_role { Line 1220  sub adhoc_course_role {
                     $area .= '/'.$usec;                      $area .= '/'.$usec;
                 }                  }
                 &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);                  &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area);
                 &Apache::lonnet::set_userprivs(\%userroles,\%newrole,%newgroups);                  &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups);
                 my $adhocstart = $then-1;                  my $adhocstart = $then-1;
                 $userroles{'user.role.'.$spec} = $adhocstart.'.';                  $userroles{'user.role.'.$spec} = $adhocstart.'.';
                 &Apache::lonnet::appenv(\%userroles,[$role,'cm']);                  &Apache::lonnet::appenv(\%userroles,[$role,'cm']);

Removed from v.1.205  
changed lines
  Added in v.1.209.4.1


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