[LON-CAPA-cvs] cvs: loncom /lonnet/perl lonnet.pm
raeburn
raeburn@source.lon-capa.org
Thu, 24 Feb 2011 23:55:59 -0000
This is a MIME encoded message
--raeburn1298591759
Content-Type: text/plain
raeburn Thu Feb 24 23:55:59 2011 EDT
Modified files:
/loncom/lonnet/perl lonnet.pm
Log:
- Bug 5932. Roles Screen usability improvements
- New arg for &delenv() - $roles (array ref) contains roles for which
roles or privs may be deleted (similar to second arg in &appenv().
- Change to &get_my_roles() to allow filtering for gr 'roles'.
- &role_status() -change name of second arg to $update to reflect fact
that determination of status based on last update time, not log-in time.
- New routine: &get_groups_roles() - contains code previously in &role_status
to determine course roles for group members needing privs
- moved to facilitate reuse by lonroles::update_sesion_roles().
--raeburn1298591759
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20110224235559.txt"
Index: loncom/lonnet/perl/lonnet.pm
diff -u loncom/lonnet/perl/lonnet.pm:1.1103 loncom/lonnet/perl/lonnet.pm:1.1104
--- loncom/lonnet/perl/lonnet.pm:1.1103 Wed Feb 2 20:11:50 2011
+++ loncom/lonnet/perl/lonnet.pm Thu Feb 24 23:55:58 2011
@@ -1,7 +1,7 @@
# The LearningOnline Network
# TCP networking package
#
-# $Id: lonnet.pm,v 1.1103 2011/02/02 20:11:50 raeburn Exp $
+# $Id: lonnet.pm,v 1.1104 2011/02/24 23:55:58 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -612,11 +612,20 @@
# ----------------------------------------------------- Delete from Environment
sub delenv {
- my ($delthis,$regexp) = @_;
- if (($delthis=~/user\.role/) || ($delthis=~/user\.priv/)) {
- &logthis("<font color=\"blue\">WARNING: ".
- "Attempt to delete from environment ".$delthis);
- return 'error';
+ 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("<font color=\"blue\">WARNING: ".
+ "Attempt to delete from environment ".$delthis);
+ return 'error';
+ }
}
my $opened = open(my $env_file,'+<',$env{'user.environment'});
if ($opened
@@ -3154,6 +3163,10 @@
if (!grep(/^cr$/,@{$roles})) {
next;
}
+ } elsif ($role =~ /^gr\//) {
+ if (!grep(/^gr$/,@{$roles})) {
+ next;
+ }
} else {
next;
}
@@ -4081,7 +4094,6 @@
}
my %allroles=();
my %allgroups=();
- my $group_privs;
if ($rolesdump ne '') {
foreach my $entry (split(/&/,$rolesdump)) {
@@ -4098,6 +4110,7 @@
}
} 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 {
@@ -4250,7 +4263,7 @@
}
}
my $thesestr='';
- foreach my $priv (keys(%thesepriv)) {
+ foreach my $priv (sort(keys(%thesepriv))) {
$thesestr.=':'.$priv.'&'.$thesepriv{$priv};
}
$userroles->{'user.priv.'.$role} = $thesestr;
@@ -4259,7 +4272,7 @@
}
sub role_status {
- my ($rolekey,$then,$refresh,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;
+ my ($rolekey,$update,$refresh,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;
my @pwhere = ();
if (exists($env{$rolekey}) && $env{$rolekey} ne '') {
(undef,undef,$$role,@pwhere)=split(/\./,$rolekey);
@@ -4268,7 +4281,7 @@
$$trolecode=$$role.'.'.$$where;
($$tstart,$$tend)=split(/\./,$env{$rolekey});
$$tstatus='is';
- if ($$tstart && $$tstart>$then) {
+ if ($$tstart && $$tstart>$update) {
$$tstatus='future';
if ($$tstart<$now) {
if ($$tstart && $$tstart>$refresh) {
@@ -4293,32 +4306,9 @@
$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);
- 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;
- }
- }
- }
- }
+ &get_groups_roles($tdomain,$trest,
+ \%course_roles,\@rolecodes,
+ \%groups_roles);
} else {
push(@rolecodes,$$role);
&standard_roleprivs(\%allroles,$$role,$tdomain,$spec,$trest,$$where);
@@ -4332,7 +4322,7 @@
}
}
if ($$tend) {
- if ($$tend<$then) {
+ if ($$tend<$update) {
$$tstatus='expired';
} elsif ($$tend<$now) {
$$tstatus='will_not';
@@ -4342,12 +4332,70 @@
}
}
+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,$then,$refresh,$now,$checkrole,$caller) = @_;
+ my ($cdom,$cnum,$update,$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,$then,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
+ &role_status($cckey,$update,$refresh,$now,\$role,\$where,\$trolecode,\$tstatus,\$tstart,\$tend);
unless (($tstatus eq 'is') || ($tstatus eq 'will_not')) {
&set_adhoc_privileges($cdom,$cnum,$checkrole,$caller);
}
--raeburn1298591759--