--- loncom/lonnet/perl/lonnet.pm 2012/02/08 01:05:20 1.1056.4.33.2.2 +++ loncom/lonnet/perl/lonnet.pm 2013/05/27 14:22:55 1.1056.4.37 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1056.4.33.2.2 2012/02/08 01:05:20 raeburn Exp $ +# $Id: lonnet.pm,v 1.1056.4.37 2013/05/27 14:22:55 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -636,20 +636,11 @@ sub appenv { # ----------------------------------------------------- Delete from Environment sub delenv { - my ($delthis,$regexp,$roles) = @_; - if (($delthis=~/^user\.role/) || ($delthis=~/^user\.priv/)) { - my $refused = 1; - if (ref($roles) eq 'ARRAY') { - my ($type,$role) = ($delthis =~ /^user\.(role|priv)\.([^.]+)\./); - if (grep(/^\Q$role\E$/,@{$roles})) { - $refused = 0; - } - } - if ($refused) { - &logthis("WARNING: ". - "Attempt to delete from environment ".$delthis); - return 'error'; - } + my ($delthis,$regexp) = @_; + if (($delthis=~/user\.role/) || ($delthis=~/user\.priv/)) { + &logthis("WARNING: ". + "Attempt to delete from environment ".$delthis); + return 'error'; } my $opened = open(my $env_file,'+<',$env{'user.environment'}); if ($opened @@ -3234,10 +3225,6 @@ sub get_my_roles { if (!grep(/^cr$/,@{$roles})) { next; } - } elsif ($role =~ /^gr\//) { - if (!grep(/^gr$/,@{$roles})) { - next; - } } else { next; } @@ -4076,9 +4063,12 @@ sub restore { if ($stuname) { $home=&homeserver($stuname,$domain); } if (!$symb) { - unless ($symb=escape(&symbread())) { return ''; } + return if ($namespace eq 'courserequests'); + unless ($symb=escape(&symbread())) { return ''; } } else { - $symb=&escape(&symbclean($symb)); + unless ($namespace eq 'courserequests') { + $symb=&escape(&symbclean($symb)); + } } if (!$namespace) { unless ($namespace=$env{'request.course.id'}) { @@ -4250,6 +4240,7 @@ sub rolesinit { } my %allroles=(); my %allgroups=(); + my $group_privs; if ($rolesdump ne '') { foreach my $entry (split(/&/,$rolesdump)) { @@ -4266,7 +4257,6 @@ sub rolesinit { } } elsif ($role =~ m|^gr/|) { ($trole,$tend,$tstart) = split(/_/,$role); - next if ($tstart eq '-1'); ($trole,$group_privs) = split(/\//,$trole); $group_privs = &unescape($group_privs); } else { @@ -4419,7 +4409,7 @@ sub set_userprivs { } } my $thesestr=''; - foreach my $priv (sort(keys(%thesepriv))) { + foreach my $priv (keys(%thesepriv)) { $thesestr.=':'.$priv.'&'.$thesepriv{$priv}; } $userroles->{'user.priv.'.$role} = $thesestr; @@ -4428,7 +4418,7 @@ sub set_userprivs { } sub role_status { - my ($rolekey,$update,$refresh,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_; + my ($rolekey,$then,$refresh,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_; my @pwhere = (); if (exists($env{$rolekey}) && $env{$rolekey} ne '') { (undef,undef,$$role,@pwhere)=split(/\./,$rolekey); @@ -4437,7 +4427,7 @@ sub role_status { $$trolecode=$$role.'.'.$$where; ($$tstart,$$tend)=split(/\./,$env{$rolekey}); $$tstatus='is'; - if ($$tstart && $$tstart>$update) { + if ($$tstart && $$tstart>$then) { $$tstatus='future'; if ($$tstart<$now) { if ($$tstart && $$tstart>$refresh) { @@ -4462,9 +4452,32 @@ sub role_status { $group_privs = &unescape($group_privs); &group_roleprivs(\%allgroups,$$where,$group_privs,$$tend,$$tstart); my %course_roles = &get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active'],['cc','co','in','ta','ep','ad','st','cr'],[$tdomain],1); - &get_groups_roles($tdomain,$trest, - \%course_roles,\@rolecodes, - \%groups_roles); + if (keys(%course_roles) > 0) { + my ($tnum) = ($trest =~ /^($match_courseid)/); + if ($tdomain ne '' && $tnum ne '') { + foreach my $key (keys(%course_roles)) { + if ($key =~ /^\Q$tnum\E:\Q$tdomain\E:([^:]+):?([^:]*)/) { + my $crsrole = $1; + my $crssec = $2; + if ($crsrole =~ /^cr/) { + unless (grep(/^cr$/,@rolecodes)) { + push(@rolecodes,'cr'); + } + } else { + unless(grep(/^\Q$crsrole\E$/,@rolecodes)) { + push(@rolecodes,$crsrole); + } + } + my $rolekey = $crsrole.'./'.$tdomain.'/'.$tnum; + if ($crssec ne '') { + $rolekey .= '/'.$crssec; + } + $rolekey .= './'; + $groups_roles{$rolekey} = \@rolecodes; + } + } + } + } } else { push(@rolecodes,$$role); &standard_roleprivs(\%allroles,$$role,$tdomain,$spec,$trest,$$where); @@ -4478,7 +4491,7 @@ sub role_status { } } if ($$tend) { - if ($$tend<$update) { + if ($$tend<$then) { $$tstatus='expired'; } elsif ($$tend<$now) { $$tstatus='will_not'; @@ -4488,70 +4501,12 @@ sub role_status { } } -sub get_groups_roles { - my ($cdom,$rest,$cdom_courseroles,$rolecodes,$groups_roles) = @_; - return unless((ref($cdom_courseroles) eq 'HASH') && - (ref($rolecodes) eq 'ARRAY') && - (ref($groups_roles) eq 'HASH')); - if (keys(%{$cdom_courseroles}) > 0) { - my ($cnum) = ($rest =~ /^($match_courseid)/); - if ($cdom ne '' && $cnum ne '') { - foreach my $key (keys(%{$cdom_courseroles})) { - if ($key =~ /^\Q$cnum\E:\Q$cdom\E:([^:]+):?([^:]*)/) { - my $crsrole = $1; - my $crssec = $2; - if ($crsrole =~ /^cr/) { - unless (grep(/^cr$/,@{$rolecodes})) { - push(@{$rolecodes},'cr'); - } - } else { - unless(grep(/^\Q$crsrole\E$/,@{$rolecodes})) { - push(@{$rolecodes},$crsrole); - } - } - my $rolekey = "$crsrole./$cdom/$cnum"; - if ($crssec ne '') { - $rolekey .= "/$crssec"; - } - $rolekey .= './'; - $groups_roles->{$rolekey} = $rolecodes; - } - } - } - } - return; -} - -sub delete_env_groupprivs { - my ($where,$courseroles,$possroles) = @_; - return unless((ref($courseroles) eq 'HASH') && (ref($possroles) eq 'ARRAY')); - my ($dummy,$udom,$uname,$group) = split(/\//,$where); - unless (ref($courseroles->{$udom}) eq 'HASH') { - %{$courseroles->{$udom}} = - &get_my_roles('','','userroles',['active'], - $possroles,[$udom],1); - } - if (ref($courseroles->{$udom}) eq 'HASH') { - foreach my $item (keys(%{$courseroles->{$udom}})) { - my ($cnum,$cdom,$crsrole,$crssec) = split(/:/,$item); - my $area = '/'.$cdom.'/'.$cnum; - my $privkey = "user.priv.$crsrole.$area"; - if ($crssec ne '') { - $privkey .= '/'.$crssec; - } - $privkey .= ".$area/$group"; - &Apache::lonnet::delenv($privkey,undef,[$crsrole]); - } - } - return; -} - sub check_adhoc_privs { - my ($cdom,$cnum,$update,$refresh,$now,$checkrole,$caller) = @_; + my ($cdom,$cnum,$then,$refresh,$now,$checkrole,$caller) = @_; my $cckey = 'user.role.'.$checkrole.'./'.$cdom.'/'.$cnum; if ($env{$cckey}) { my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); - &role_status($cckey,$update,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); + &role_status($cckey,$then,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend); unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) { &set_adhoc_privileges($cdom,$cnum,$checkrole,$caller); } @@ -7452,6 +7407,9 @@ sub store_userdata { $namevalue.=&escape($key).'='.&freeze_escape($$storehash{$key}).'&'; } $namevalue=~s/\&$//; + unless ($namespace eq 'courserequests') { + $datakey = &escape($datakey); + } $result = &reply("store:$udom:$uname:$namespace:$datakey:". $namevalue,$uhome); }