Diff for /loncom/auth/lonacc.pm between versions 1.79 and 1.84

version 1.79, 2006/06/16 22:37:29 version 1.84, 2006/07/07 22:01:52
Line 140  sub portfolio_access { Line 140  sub portfolio_access {
     my $current_perms = &Apache::lonnet::get_portfile_permissions($udom,$unum);      my $current_perms = &Apache::lonnet::get_portfile_permissions($udom,$unum);
     my %access_controls = &Apache::lonnet::get_access_controls(      my %access_controls = &Apache::lonnet::get_access_controls(
                                              $current_perms,$group,$file_name);                                               $current_perms,$group,$file_name);
     my ($public);      my ($public,$guest,@domains,@users,@courses,@groups);
     my $now = time;      my $now = time;
     my $access_hash = $access_controls{$file_name};      my $access_hash = $access_controls{$file_name};
     if (ref($access_hash) eq 'HASH') {      if (ref($access_hash) eq 'HASH') {
Line 155  sub portfolio_access { Line 155  sub portfolio_access {
             if ($scope eq 'public') {              if ($scope eq 'public') {
                 $public = $key;                  $public = $key;
                 last;                  last;
               } elsif ($scope eq 'guest') {
                   $guest = $key;
               } elsif ($scope eq 'domains') {
                   push(@domains,$key);
               } elsif ($scope eq 'users') {
                   push(@users,$key);
               } elsif ($scope eq 'course') {
                   push(@courses,$key);
               } elsif ($scope eq 'group') {
                   push(@groups,$key);
             }              }
         }          }
         if ($public) {          if ($public) {
             return 'ok';              return 'ok';
         }          }
           if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
               if ($guest) {
                   return 'guest:'.$guest;
               }
           } else {
               if (@domains > 0) {
                   foreach my $domkey (@domains) {
                       my %content = &Apache::lonnet::parse_access_controls($$access_hash{$domkey});
                       if (ref($content{'dom'}) eq 'ARRAY') {
                           if (grep(/^\Q$env{'user.domain'}\E$/,@{$content{'dom'}})) {
                               return 'ok';
                           }
                       }
                   }
               }
               if (@users > 0) {
                   foreach my $userkey (@users) {
                       my %content = &Apache::lonnet::parse_access_controls($$access_hash{$userkey});
                       if (exists($content{'users'}{$env{'user.name'}.':'.$env{'user.domain'}})) {
                           return 'ok';
                       }
                   }
               }
               my %roleshash;
               my @courses_and_groups = @courses;
               push(@courses_and_groups,@groups); 
               if (@courses_and_groups > 0) {
                   my (%allgroups,%allroles); 
                   my ($start,$end,$role,$sec,$group);
                   foreach my $envkey (%env) {
                       if ($envkey =~ m-^user\.role\.(gr|cc|in|ta|ep|st)\./([^/]+)/([^/]+)/?([^/]*)$-) {
                           my $cid = $2.'_'.$3; 
                           if ($1 eq 'gr') {
                               $group = $4;
                               $allgroups{$cid}{$group} = $env{$envkey};
                           } else {
                               if ($4 eq '') {
                                   $sec = 'none';
                               } else {
                                   $sec = $4;
                               }
                               $allroles{$cid}{$1}{$sec} = $env{$envkey};
                           }
                       } elsif ($envkey =~ m-^user\.role\./cr/(\w+/\w+/\w*)./([^/]+)/([^/]+)/?([^/]*)$-) {
                           my $cid = $2.'_'.$3;
                           if ($4 eq '') {
                               $sec = 'none';
                           } else {
                               $sec = $4;
                           }
                           $allroles{$cid}{$1}{$sec} = $env{$envkey};
                       }
                   }
                   if (keys(%allroles) == 0) {
                       return;
                   }
                   foreach my $key (@courses_and_groups) {
                       my %content = &Apache::lonnet::parse_access_controls($$access_hash{$key});
                       my $cnum = $content{'number'};
                       my $cdom = $content{'domain'};
                       my $cid = $cdom.'_'.$cnum;
                       if (!exists($allroles{$cid})) {
                           next;
                       }    
                       foreach my $role_id (keys(%{$content{'roles'}})) {
                           my @sections = @{$content{'roles'}{$role_id}{'section'}};
                           my @groups = @{$content{'roles'}{$role_id}{'group'}};
                           my @status = @{$content{'roles'}{$role_id}{'access'}};
                           my @roles = @{$content{'roles'}{$role_id}{'role'}};
                           foreach my $role (keys(%{$allroles{$cid}})) {
                               if ((grep/^all$/,@roles) || (grep/^\Q$role\E$/,@roles)) {
                                   foreach my $sec (keys(%{$allroles{$cid}{$role}})) {
                                       if (&course_group_datechecker($allroles{$cid}{$role}{$sec},$now,\@status) eq 'ok') {
                                           if (grep/^all$/,@sections) {
                                               return 'ok';
                                           } else {
                                               if (grep/^$sec$/,@sections) {
                                                   return 'ok' 
                                               }
                                           }
                                       }
                                   }
                                   if (keys(%{$allgroups{$cid}}) == 0) {
                                       if (grep/^none$/,@groups) {
                                           return 'ok';
                                       }
                                   } else {
                                       if (grep/^all$/,@groups) {
                                           return 'ok';
                                       } 
                                       foreach my $group (keys(%{$allgroups{$cid}})) {
                                           if (grep/^$group$/,@groups) {
                                               return 'ok';
                                           }
                                       }
                                   } 
                               }
                           }
                       }
                   }
               }
               if ($guest) {
                   return 'guest:'.$guest;
               }
           }
     }      }
     return;      return;
 }  }
   
   sub course_group_datechecker {
       my ($dates,$now,$status) = @_;
       my ($start,$end) = split(/\./,$dates);
       if (!$start && !$end) {
           return 'ok';
       }
       if (grep/^active$/,@{$status}) {
           if (((!$start) || ($start && $start <= $now)) && ((!$end) || ($end && $end >= $now))) {
               return 'ok';
           }
       }
       if (grep/^previous$/,@{$status}) {
           if ($end > $now ) {
               return 'ok';
           }
       }
       if (grep/^future$/,@{$status}) {
           if ($start > $now) {
               return 'ok';
           }
       }
       return; 
   }
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     my $requrl=$r->uri;      my $requrl=$r->uri;
Line 226  sub handler { Line 365  sub handler {
   
 # ---------------------------------------------------------------- Check access  # ---------------------------------------------------------------- Check access
             my $now = time;              my $now = time;
             if ($requrl =~ m#/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$#) {              if ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$|) {
                 my $result = &portfolio_access($1,$2,$3);                  my $result = &portfolio_access($1,$2,$3);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     return OK;                      return OK;
                   } elsif ($result =~ /^guest:(\w+)$/) {
                       my $guestkey = $1;
                       #FIXME need to cause generation of an intermediate page
                 }                  }
             } elsif ($requrl =~ m#/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$#) {              } elsif ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$|) {
                 my $result = &portfolio_access($1,$2,$4.'/'.$3,$3);                  my $result = &portfolio_access($1,$2,$3.'/'.$4,$3);
                 if ($result eq 'ok') {                  if ($result eq 'ok') {
                     return OK;                      return OK;
                 }                  } elsif ($result =~ /^guest:(\w+)$/) {
                       my $guestkey = $1;
                       #FIXME need to cause generation of an intermediate page
   }
             }              }
             if ($requrl!~/^\/adm|public|prtspool\//) {              if ($requrl!~/^\/adm|public|prtspool\//) {
  my $access=&Apache::lonnet::allowed('bre',$requrl);   my $access=&Apache::lonnet::allowed('bre',$requrl);
Line 350  sub handler { Line 495  sub handler {
  return OK;   return OK;
     }      }
 # ------------------------------------- See if this is a viewable portfolio file  # ------------------------------------- See if this is a viewable portfolio file
     if ($requrl =~ m#/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$#) {      if ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$|) {
         my $result = &portfolio_access($1,$2,$3);          my $result = &portfolio_access($1,$2,$3);
         if ($result eq 'ok') {          if ($result eq 'ok') {
             return OK;              return OK;
           } elsif ($result =~ /^guest:(\w+)$/) {
               my $guestkey = $1;
               #FIXME need to cause generation of an intermediate page
         }          }
     } elsif ($requrl =~ m#/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$#) {      } elsif ($requrl =~ m|/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$|) {
         my $result = &portfolio_access($1,$2,$4.'/'.$3,$3);          my $result = &portfolio_access($1,$2,$3.'/'.$4,$3);
         if ($result eq 'ok') {          if ($result eq 'ok') {
             return OK;              return OK;
           } elsif ($result =~ /^guest:(\w+)$/) {
               my $guestkey = $1;
               #FIXME need to cause generation of an intermediate page
         }          }
     }      }
 # -------------------------------------------------------------- Not authorized  # -------------------------------------------------------------- Not authorized

Removed from v.1.79  
changed lines
  Added in v.1.84


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