--- loncom/lonnet/perl/lonnet.pm 2009/11/05 16:04:22 1.1041 +++ loncom/lonnet/perl/lonnet.pm 2009/11/28 21:33:57 1.1045 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.1041 2009/11/05 16:04:22 raeburn Exp $ +# $Id: lonnet.pm,v 1.1045 2009/11/28 21:33:57 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2760,7 +2760,8 @@ sub courserolelog { if (($trole eq 'cc') || ($trole eq 'in') || ($trole eq 'ep') || ($trole eq 'ad') || ($trole eq 'ta') || ($trole eq 'st') || - ($trole=~/^cr/) || ($trole eq 'gr')) { + ($trole=~/^cr/) || ($trole eq 'gr') || + ($trole eq 'co')) { if ($area =~ m-^/($match_domain)/($match_courseid)/?([^/]*)-) { my $cdom = $1; my $cnum = $2; @@ -3908,6 +3909,9 @@ sub custom_roleprivs { if (($rdummy ne 'con_lost') && ($roledef ne '')) { my ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef); if (defined($syspriv)) { + if ($trest =~ /^$match_community$/) { + $syspriv =~ s/bre\&S//; + } $$allroles{'cm./'}.=':'.$syspriv; $$allroles{$spec.'./'}.=':'.$syspriv; } @@ -5046,7 +5050,7 @@ sub allowed { my $courseprivid=''; my $ownaccess; - # Community Coordinator browsing resource space. + # Community Coordinator or Assistant Co-author browsing resource space. if (($priv eq 'bro') && ($env{'user.author'})) { if ($uri eq '') { $ownaccess = 1; @@ -5065,7 +5069,7 @@ sub allowed { if ($uri =~ m{^([^/]+)/?$}) { my $adom = $1; foreach my $key (keys(%env)) { - if ($key =~ m{^user\.role\.ca/\Q$adom\E}) { + if ($key =~ m{^user\.role\.(ca|aa)/\Q$adom\E}) { my ($start,$end) = split('.',$env{$key}); if (($now >= $start) && (!$end || $end < $now)) { $ownaccess = 1; @@ -5076,11 +5080,14 @@ sub allowed { } elsif ($uri =~ m{^([^/]+)/([^/]+)/?}) { my $adom = $1; my $aname = $2; - if ($env{"user.role.ca./$adom/$aname"}) { - my ($start,$end) = - split('.',$env{"user.role.ca./$adom/$aname"}); - if (($now >= $start) && (!$end || $end < $now)) { - $ownaccess = 1; + foreach my $role ('ca','aa') { + if ($env{"user.role.$role./$adom/$aname"}) { + my ($start,$end) = + split('.',$env{"user.role.$role./$adom/$aname"}); + if (($now >= $start) && (!$end || $end < $now)) { + $ownaccess = 1; + last; + } } } } @@ -5092,7 +5099,7 @@ sub allowed { # Course if ($env{'user.priv.'.$env{'request.role'}.'./'}=~/\Q$priv\E\&([^\:]*)/) { - unless (($priv eq 'bro' && !$ownaccess)) { + unless (($priv eq 'bro') && (!$ownaccess)) { $thisallowed.=$1; } } @@ -5101,7 +5108,7 @@ sub allowed { if ($env{'user.priv.'.$env{'request.role'}.'./'.(split(/\//,$uri))[0].'/'} =~/\Q$priv\E\&([^\:]*)/) { - unless (($priv eq 'bro' && !$ownaccess)) { + unless (($priv eq 'bro') && (!$ownaccess)) { $thisallowed.=$1; } } @@ -5113,7 +5120,7 @@ sub allowed { if ($env{'user.priv.'.$env{'request.role'}.'.'.$courseuri} =~/\Q$priv\E\&([^\:]*)/) { - unless (($priv eq 'bro' && !$ownaccess)) { + unless (($priv eq 'bro') && (!$ownaccess)) { $thisallowed.=$1; } } @@ -6224,12 +6231,32 @@ sub assignrole { $refused = 1; } if ($refused) { - if (($selfenroll == 1) && ($role eq 'st') && ($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { + my ($cdom,$cnum) = ($cwosec =~ m{^/?($match_domain)/($match_courseid)$}); + if (!$selfenroll && $context eq 'course') { + my %crsenv; + if ($role eq 'cc' || $role eq 'co') { + %crsenv = &userenvironment($cdom,$cnum,('internal.courseowner')); + if (($role eq 'cc') && ($cnum !~ /^$match_community$/)) { + if ($env{'request.role'} eq 'cc./'.$cdom.'/'.$cnum) { + if ($crsenv{'internal.courseowner'} eq + $env{'user.name'}.':'.$env{'user.domain'}) { + $refused = ''; + } + } + } elsif (($role eq 'co') && ($cnum =~ /^$match_community$/)) { + if ($env{'request.role'} eq 'co./'.$cdom.'/'.$cnum) { + if ($crsenv{'internal.courseowner'} eq + $env{'user.name'}.':'.$env{'user.domain'}) { + $refused = ''; + } + } + } + } + } elsif (($selfenroll == 1) && ($role eq 'st') && ($udom eq $env{'user.domain'}) && ($uname eq $env{'user.name'})) { $refused = ''; } elsif ($context eq 'requestcourses') { my @possroles = ('st','ta','ep','in','cc','co'); if ((grep(/^\Q$role\E$/,@possroles)) && ($env{'user.name'} ne '' && $env{'user.domain'} ne '')) { - my ($cdom,$cnum) = ($cwosec =~ m{^/?($match_domain)/($match_courseid)$}); my $wrongcc; if ($cnum =~ /^$match_community$/) { $wrongcc = 1 if ($role eq 'cc');