Diff for /loncom/lond between versions 1.448 and 1.453

version 1.448, 2010/07/20 02:42:27 version 1.453, 2010/08/22 03:44:12
Line 1789  sub authenticate_handler { Line 1789  sub authenticate_handler {
         unless ($clientcancheckhost) {          unless ($clientcancheckhost) {
             my $uprimary_id = &Apache::lonnet::domain($udom,'primary');              my $uprimary_id = &Apache::lonnet::domain($udom,'primary');
             my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);              my $uint_dom = &Apache::lonnet::internet_dom($uprimary_id);
             my @intdoms = &Apache::lonnet::get_internet_names($clientname);                my @intdoms;
               my $internet_names = &Apache::lonnet::get_internet_names($clientname);
               if (ref($internet_names) eq 'ARRAY') {
                   @intdoms = @{$internet_names};
               }
             unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/,@intdoms)) {              unless ($uint_dom ne '' && grep(/^\Q$uint_dom\E$/,@intdoms)) {
                 my ($remote,$hosted);                  my ($remote,$hosted);
                 my $remotesession = &get_usersession_config($udom,'remotesession');                  my $remotesession = &get_usersession_config($udom,'remotesession');
Line 1800  sub authenticate_handler { Line 1804  sub authenticate_handler {
                 if (ref($hostedsession) eq 'HASH') {                  if (ref($hostedsession) eq 'HASH') {
                     $hosted = $hostedsession->{'hosted'};                      $hosted = $hostedsession->{'hosted'};
                 }                  }
                   my $loncaparev = $clientversion;
                   if ($loncaparev eq '') {
                       $loncaparev = $Apache::lonnet::loncaparevs{$clientname};
                   }
                 $canhost = &Apache::lonnet::can_host_session($udom,$clientname,                  $canhost = &Apache::lonnet::can_host_session($udom,$clientname,
                                                              $clientversion,                                                               $loncaparev,
                                                              $remote,$hosted);                                                               $remote,$hosted);
             }              }
         }          }
Line 3140  sub dump_with_regexp { Line 3148  sub dump_with_regexp {
   
     my $userinput = "$cmd:$tail";      my $userinput = "$cmd:$tail";
   
     my ($udom,$uname,$namespace,$regexp,$range)=split(/:/,$tail);      my ($udom,$uname,$namespace,$regexp,$range,$extra)=split(/:/,$tail);
     if (defined($regexp)) {      if (defined($regexp)) {
  $regexp=&unescape($regexp);   $regexp=&unescape($regexp);
     } else {      } else {
Line 3158  sub dump_with_regexp { Line 3166  sub dump_with_regexp {
     }      }
     my $hashref = &tie_user_hash($udom, $uname, $namespace,      my $hashref = &tie_user_hash($udom, $uname, $namespace,
  &GDBM_READER());   &GDBM_READER());
       my $clientcheckrole;
     if ($hashref) {      if ($hashref) {
         my $qresult='';          my $qresult='';
  my $count=0;   my $count=0;
           if ($extra ne '') {
               $extra = &Apache::lonnet::thaw_unescape($extra);
               $clientcheckrole = $extra->{'clientcheckrole'};
           }
           my @ids = &Apache::lonnet::current_machine_ids();
           my (%homecourses,$major,$minor,$now);
           if (($namespace eq 'roles') && (!$clientcheckrole)) {
               my $loncaparev = $clientversion;
               if ($loncaparev eq '') {
                   $loncaparev = $Apache::lonnet::loncaparevs{$clientname};
               }
               if ($loncaparev =~ /^\'?(\d+)\.(\d+)\.[\w.\-]+\'?/) {
                   $major = $1;
                   $minor = $2;
               }
               $now = time;
           }
  while (my ($key,$value) = each(%$hashref)) {   while (my ($key,$value) = each(%$hashref)) {
             if ($namespace eq 'roles') {              if ($namespace eq 'roles') {
                 if ($key =~ m{^/($LONCAPA::match_domain)/($LONCAPA::match_community)_(cc|co|in|ta|ep|ad|st|cr)}) {                  if ($key =~ m{^/($LONCAPA::match_domain)/($LONCAPA::match_courseid)(/?[^_]*)_(cc|co|in|ta|ep|ad|st|cr)$}) {
                     my $cdom = $1;                      my $cdom = $1;
                     my $cnum = $2;                      my $cnum = $2;
                     if ($clientversion =~ /^\'?(\d+)\.(\d+)/) {                      unless ($clientcheckrole) {
                         my $major = $1;                          next unless (&releasereqd_check($cnum,$cdom,$key,$value,$major,$minor,
                         my $minor = $2;                                                          $now,\%homecourses,\@ids));
                         next if (($major < 2) || (($major == 2) && ($minor < 9)));  
                     } else {  
                         my $homeserver = &Apache::lonnet::homeserver($cnum,$cdom);  
                         next unless ($currenthostid eq $homeserver);  
                     }                      }
                 }                  }
             }              }
Line 3192  sub dump_with_regexp { Line 3214  sub dump_with_regexp {
     }      }
  }   }
  if (&untie_user_hash($hashref)) {   if (&untie_user_hash($hashref)) {
               if (($namespace eq 'roles') && (!$clientcheckrole)) {
                   if (keys(%homecourses) > 0) {
                       $qresult .= &check_homecourses(\%homecourses,$udom,$regexp,$count,
                                                      $range,$start,$end,$major,$minor);
                   }
               }
     chop($qresult);      chop($qresult);
     &Reply($client, \$qresult, $userinput);      &Reply($client, \$qresult, $userinput);
  } else {   } else {
Line 7266  sub get_usersession_config { Line 7294  sub get_usersession_config {
     return;      return;
 }  }
   
   sub releasereqd_check {
       my ($cnum,$cdom,$key,$value,$major,$minor,$now,$homecourses,$ids) = @_;
       my $home = &Apache::lonnet::homeserver($cnum,$cdom);
       return if ($home eq 'no_host');
       my ($reqdmajor,$reqdminor,$displayrole);
       if ($cnum =~ /$LONCAPA::match_community/) {
           if ($major eq '' && $minor eq '') {
               return unless ((ref($ids) eq 'ARRAY') && 
                              (grep(/^\Q$home\E$/,@{$ids})));
           } else {
               $reqdmajor = 2;
               $reqdminor = 9;
               return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor));
           }
       }
       my ($role,$end,$start) = split(/_/,$value);
       if (!$end || $end > $now) {
           my $hashid = $cdom.':'.$cnum;
           my ($courseinfo,$cached) =
               &Apache::lonnet::is_cached_new('courseinfo',$hashid);
           if (defined($cached)) {
               if (ref($courseinfo) eq 'HASH') {
                   if (exists($courseinfo->{'releaserequired'})) {
                       my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'});
                       return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor));
                   }
               }
           } else {
               if (ref($ids) eq 'ARRAY') {
                   if (grep(/^\Q$home\E$/,@{$ids})) {
                       if (ref($homecourses) eq 'HASH') {
                           if (ref($homecourses->{$hashid}) eq 'ARRAY') {
                               push(@{$homecourses->{$hashid}},{$key=>$value});
                           } else {
                               $homecourses->{$hashid} = [{$key=>$value}];
                           }
                       }
                       return;
                   }
               }
               my $courseinfo = &get_courseinfo_hash($cnum,$cdom,$home);
               if (ref($courseinfo) eq 'HASH') {
                   if (exists($courseinfo->{'releaserequired'})) {
                       my ($reqdmajor,$reqdminor) = split(/\./,$courseinfo->{'releaserequired'});
                       return unless (&useable_role($reqdmajor,$reqdminor,$major,$minor));
                   }
               }
           }
       }
       return 1;
   }
   
   sub get_courseinfo_hash {
       my ($cnum,$cdom,$home) = @_;
       my $hashid = $cdom.':'.$cnum;
       my %info = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,1,[$home],'.');
       if (ref($info{$cdom.'_'.$cnum}) eq 'HASH') {
           return &Apache::lonnet::do_cache_new('courseinfo',$hashid,$info{$cdom.'_'.$cnum},600);
       }
       return;
   }
   
   sub check_homecourses {
       my ($homecourses,$udom,$regexp,$count,$range,$start,$end,$major,$minor) = @_;
       my ($result,%addtocache);
       if (ref($homecourses) eq 'HASH') {
           my %okcourses;
           my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT());
           if ($hashref) {
               while (my ($key,$value) = each(%$hashref)) {
                   my $unesc_key = &unescape($key);
                   next if ($unesc_key =~ /^lasttime:/);
                   my $items = &Apache::lonnet::thaw_unescape($value);
                   if (ref($items) eq 'HASH') {
                       my $hashid = $unesc_key;
                       $hashid =~ s/_/:/;
                       &Apache::lonnet::do_cache_new('courseinfo',$hashid,$items,600);
                       if (ref($homecourses->{$hashid}) eq 'ARRAY') {
                           my ($reqdmajor,$reqdminor) = split(/\./,$items->{'releaserequired'});
                           if (&useable_role($reqdmajor,$reqdminor,$major,$minor)) {
                               $okcourses{$hashid} = 1;
                           }
                       }
                   }
               }
               unless (&untie_domain_hash($hashref)) {
                   &logthis('Failed to untie tied hash for nohist_courseids.db');
               }
           } else {
               &logthis('Failed to tie hash for nohist_courseids.db');
               return;
           }
           foreach my $hashid (keys(%okcourses)) {
               if (ref($homecourses->{$hashid}) eq 'ARRAY') {
                   foreach my $role (@{$homecourses->{$hashid}}) {
                       if (ref($role) eq 'HASH') {
                           while (my ($key,$value) = each(%{$role})) {
                               if ($regexp eq '.') {
                                   $count++;
                                   if (defined($range) && $count >= $end)   { last; }
                                   if (defined($range) && $count <  $start) { next; }
                                   $result.=$key.'='.$value.'&';
                               } else {
                                   my $unescapeKey = &unescape($key);
                                   if (eval('$unescapeKey=~/$regexp/')) {
                                       $count++;
                                       if (defined($range) && $count >= $end)   { last; }
                                       if (defined($range) && $count <  $start) { next; }
                                       $result.="$key=$value&";
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
       return $result;
   }
   
   sub useable_role {
       my ($reqdmajor,$reqdminor,$major,$minor) = @_; 
       if ($reqdmajor ne '' && $reqdminor ne '') {
           return if (($major eq '' && $minor eq '') ||
                      ($major < $reqdmajor) ||
                      (($major == $reqdmajor) && ($minor < $reqdminor)));
       }
       return 1;
   }
   
 # ----------------------------------- POD (plain old documentation, CPAN style)  # ----------------------------------- POD (plain old documentation, CPAN style)
   
 =head1 NAME  =head1 NAME

Removed from v.1.448  
changed lines
  Added in v.1.453


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