--- loncom/lonnet/perl/lonnet.pm 2006/05/01 16:00:44 1.734 +++ loncom/lonnet/perl/lonnet.pm 2006/05/30 12:47:18 1.740 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.734 2006/05/01 16:00:44 albertel Exp $ +# $Id: lonnet.pm,v 1.740 2006/05/30 12:47:18 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,6 +52,9 @@ use Storable qw(lock_store lock_nstore l use Time::HiRes qw( gettimeofday tv_interval ); use Cache::Memcached; use Digest::MD5; +use lib '/home/httpd/lib/perl'; +use LONCAPA; +use LONCAPA::Configuration; my $readit; my $max_connection_retries = 10; # Or some such value. @@ -1952,8 +1955,8 @@ sub courseiddump { sub dcmailput { my ($domain,$msgid,$message,$server)=@_; my $status = &Apache::lonnet::critical( - 'dcmailput:'.$domain.':'.&Apache::lonnet::escape($msgid).'='. - &Apache::lonnet::escape($message),$server); + 'dcmailput:'.$domain.':'.&escape($msgid).'='. + &escape($message),$server); return $status; } @@ -3982,7 +3985,6 @@ sub modify_group_roles { if ($result eq 'ok') { &devalidate_getgroups_cache($udom,$uname,$cdom,$cnum); } - return $result; } @@ -4125,6 +4127,8 @@ sub assignrole { $command.='_0_'.$start; } } + my $origstart = $start; + my $origend = $end; # actually delete if ($deleteflag) { if ((&allowed('dro',$udom)) || (&allowed('dro',$url))) { @@ -4142,6 +4146,11 @@ sub assignrole { # log new user role if status is ok if ($answer eq 'ok') { &userrolelog($role,$uname,$udom,$url,$start,$end); +# for course roles, perform group memberships changes triggered by role change. + unless ($role =~ /^gr/) { + &Apache::longroup::group_changes($udom,$uname,$url,$role,$origend, + $origstart); + } } return $answer; } @@ -4818,7 +4827,7 @@ sub stat_file { ($udom,$uname,$file) = ($uri =~ m-/(?:uploaded|editupload)/?([^/]*)/?([^/]*)/?(.*)-); $file = 'userfiles/'.$file; - $dir = &Apache::loncommon::propath($udom,$uname); + $dir = &propath($udom,$uname); } if ($uri =~ m-^/res/-) { ($udom,$uname) = @@ -5171,7 +5180,7 @@ sub EXT { # ----------------------------------------------------- Cascading lookup scheme my $symbp=$symbparm; - my $mapp=(&decode_symb($symbp))[0]; + my $mapp=&deversion((&decode_symb($symbp))[0]); my $symbparm=$symbp.'.'.$spacequalifierrest; my $mapparm=$mapp.'___(all).'.$spacequalifierrest; @@ -5319,9 +5328,29 @@ sub sort_course_groups { # Sort groups b sub packages_tab_default { my ($uri,$varname)=@_; my (undef,$part,$name)=split(/\./,$varname); - my $packages=&metadata($uri,'packages'); - foreach my $package (split(/,/,$packages)) { + + my (@extension,@specifics,$do_default); + foreach my $package (split(/,/,&metadata($uri,'packages'))) { my ($pack_type,$pack_part)=split(/_/,$package,2); + if ($pack_type eq 'default') { + $do_default=1; + } elsif ($pack_type eq 'extension') { + push(@extension,[$package,$pack_type,$pack_part]); + } else { + push(@specifics,[$package,$pack_type,$pack_part]); + } + } + # first look for a package that matches the requested part id + foreach my $package (@specifics) { + my (undef,$pack_type,$pack_part)=@{$package}; + next if ($pack_part ne $part); + if (defined($packagetab{"$pack_type&$name&default"})) { + return $packagetab{"$pack_type&$name&default"}; + } + } + # look for any possible matching non extension_ package + foreach my $package (@specifics) { + my (undef,$pack_type,$pack_part)=@{$package}; if (defined($packagetab{"$pack_type&$name&default"})) { return $packagetab{"$pack_type&$name&default"}; } @@ -5330,6 +5359,20 @@ sub packages_tab_default { return $packagetab{$pack_type."_".$pack_part."&$name&default"}; } } + # look for any posible extension_ match + foreach my $package (@extension) { + my ($package,$pack_type)=@{$package}; + if (defined($packagetab{"$pack_type&$name&default"})) { + return $packagetab{"$pack_type&$name&default"}; + } + if (defined($packagetab{$package."&$name&default"})) { + return $packagetab{$package."&$name&default"}; + } + } + # look for a global default setting + if ($do_default && defined($packagetab{"default&$name&default"})) { + return $packagetab{"default&$name&default"}; + } return undef; } @@ -5415,16 +5458,16 @@ sub metadata { } else { $metaentry{':packages'}=$package.$keyroot; } - foreach (sort keys %packagetab) { + foreach my $pack_entry (keys(%packagetab)) { my $part=$keyroot; $part=~s/^\_//; - if ($_=~/^\Q$package\E\&/ || - $_=~/^\Q$package\E_0\&/) { - my ($pack,$name,$subp)=split(/\&/,$_); + if ($pack_entry=~/^\Q$package\E\&/ || + $pack_entry=~/^\Q$package\E_0\&/) { + my ($pack,$name,$subp)=split(/\&/,$pack_entry); # ignore package.tab specified default values # here &package_tab_default() will fetch those if ($subp eq 'default') { next; } - my $value=$packagetab{$_}; + my $value=$packagetab{$pack_entry}; my $unikey; if ($pack =~ /_0$/) { $unikey='parameter_0_'.$name; @@ -5472,11 +5515,12 @@ sub metadata { my $dir=$filename; $dir=~s|[^/]*$||; $location=&filelocation($dir,$location); - foreach (sort(split(/\,/,&metadata($uri,'keys', - $location,$unikey, - $depthcount+1)))) { - $metaentry{':'.$_}=$metaentry{':'.$_}; - $metathesekeys{$_}=1; + my $metadata = + &metadata($uri,'keys', $location,$unikey, + $depthcount+1); + foreach my $meta (split(',',$metadata)) { + $metaentry{':'.$meta}=$metaentry{':'.$meta}; + $metathesekeys{$meta}=1; } } } else { @@ -5485,8 +5529,9 @@ sub metadata { $unikey.='_'.$token->[2]->{'name'}; } $metathesekeys{$unikey}=1; - foreach (@{$token->[3]}) { - $metaentry{':'.$unikey.'.'.$_}=$token->[2]->{$_}; + foreach my $param (@{$token->[3]}) { + $metaentry{':'.$unikey.'.'.$param} = + $token->[2]->{$param}; } my $internaltext=&HTML::Entities::decode($parser->get_text('/'.$entry)); my $default=$metaentry{':'.$unikey.'.default'}; @@ -5507,14 +5552,14 @@ sub metadata { } } my ($extension) = ($uri =~ /\.(\w+)$/); - foreach my $key (sort(keys(%packagetab))) { + foreach my $key (keys(%packagetab)) { #no specific packages #how's our extension if ($key!~/^extension_\Q$extension\E&/) { next; } &metadata_create_package_def($uri,$key,'extension_'.$extension, \%metathesekeys); } if (!exists($metaentry{':packages'})) { - foreach my $key (sort(keys(%packagetab))) { + foreach my $key (keys(%packagetab)) { #no specific packages well let's get default then if ($key!~/^default&/) { next; } &metadata_create_package_def($uri,$key,'default', @@ -5532,15 +5577,22 @@ sub metadata { my $dir=$filename; $dir=~s|[^/]*$||; $location=&filelocation($dir,$location); - foreach (sort(split(/\,/,&metadata($uri,'keys', - $location,'_rights', - $depthcount+1)))) { - #$metaentry{':'.$_}=$metacache{$uri}->{':'.$_}; - $metathesekeys{$_}=1; + my $rights_metadata = + &metadata($uri,'keys',$location,'_rights', + $depthcount+1); + foreach my $rights (split(',',$rights_metadata)) { + #$metaentry{':'.$rights}=$metacache{$uri}->{':'.$rights}; + $metathesekeys{$rights}=1; } } } - $metaentry{':keys'}=join(',',keys %metathesekeys); + # uniqifiy package listing + my %seen; + my @uniq_packages = + grep { ! $seen{$_} ++ } (split(',',$metaentry{':packages'})); + $metaentry{':packages'} = join(',',@uniq_packages); + + $metaentry{':keys'} = join(',',keys(%metathesekeys)); &metadata_generate_part0(\%metathesekeys,\%metaentry,$uri); $metaentry{':allpossiblekeys'}=join(',',keys %metathesekeys); &do_cache_new('meta',$uri,\%metaentry,60*60); @@ -5576,7 +5628,7 @@ sub metadata_create_package_def { sub metadata_generate_part0 { my ($metadata,$metacache,$uri) = @_; my %allnames; - foreach my $metakey (sort keys %$metadata) { + foreach my $metakey (keys(%$metadata)) { if ($metakey=~/^parameter\_(.*)/) { my $part=$$metacache{':'.$metakey.'.part'}; my $name=$$metacache{':'.$metakey.'.name'}; @@ -6411,7 +6463,7 @@ sub filelocation { my @ids=¤t_machine_ids(); foreach my $id (@ids) { if ($id eq $home) { $is_me=1; } } if ($is_me) { - $location=&Apache::loncommon::propath($udom,$uname). + $location=&propath($udom,$uname). '/userfiles/'.$filename; } else { $location=$Apache::lonnet::perlvar{'lonDocRoot'}.'/userfiles/'. @@ -6532,21 +6584,6 @@ sub freeze_escape { return &escape($value); } -# -------------------------------------------------------- Escape Special Chars - -sub escape { - my $str=shift; - $str =~ s/(\W)/"%".unpack('H2',$1)/eg; - return $str; -} - -# ----------------------------------------------------- Un-Escape Special Chars - -sub unescape { - my $str=shift; - $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; - return $str; -} sub thaw_unescape { my ($value)=@_;