--- loncom/auth/lonroles.pm 2016/10/23 18:30:32 1.269.2.27
+++ loncom/auth/lonroles.pm 2017/01/22 14:28:20 1.269.2.30
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.269.2.27 2016/10/23 18:30:32 raeburn Exp $
+# $Id: lonroles.pm,v 1.269.2.30 2017/01/22 14:28:20 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -310,92 +310,119 @@ sub handler {
"request.role.adv" => $env{'user.adv'},
"request.role.domain" => $env{'user.domain'}});
# Check if Domain Helpdesk role trying to enter a course needs privs to be created
- if ($env{'form.newrole'} =~ m{^cr/($match_domain)/\1\-domainconfig/(\w+)\./\1/($match_courseid)$}) {
+ if ($env{'form.newrole'} =~ m{^cr/($match_domain)/\1\-domainconfig/(\w+)\./\1/($match_courseid)(?:/(\w+)|$)}) {
my $cdom = $1;
my $rolename = $2;
my $cnum = $3;
+ my $sec = $4;
if ($custom_adhoc) {
- my %adhocroles = &Apache::lonnet::userenvironment($env{'user.domain'},$env{'user.name'},
- 'adhocroles.'.$cdom);
- if (keys(%adhocroles)) {
- my @adhoc = split(',',$adhocroles{'adhocroles.'.$cdom});
- if (grep(/^\Q$rolename\E$/,@adhoc)) {
+ my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($cdom.'_'.$cnum,1);
+ if (ref($possroles) eq 'ARRAY') {
+ if (grep(/^\Q$rolename\E$/,@{$possroles})) {
if (&Apache::lonnet::check_adhoc_privs($cdom,$cnum,$update,$refresh,$now,
- "cr/$cdom/$cdom".'-domainconfig/'.$rolename)) {
+ "cr/$cdom/$cdom".'-domainconfig/'.$rolename,undef,$sec)) {
&Apache::lonnet::appenv({"environment.internal.$cdom.$cnum.cr/$cdom/$cdom".'-domainconfig/'."$rolename.adhoc" => time});
}
}
}
}
- } elsif ($numdc > 0) {
+ } elsif (($numdc > 0) || ($numdh > 0)) {
# Check if user is a DC trying to enter a course or author space and needs privs to be created
+# Check if user is a DH trying to enter a course and needs privs to be created
foreach my $envkey (keys(%env)) {
+ if ($numdc) {
# Is this an ad-hoc Coordinator role?
- if (my ($ccrole,$domain,$coursenum) =
- ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) {
- if ($dcroles{$domain}) {
- if (&Apache::lonnet::check_adhoc_privs($domain,$coursenum,
- $update,$refresh,$now,$ccrole)) {
- &Apache::lonnet::appenv({"environment.internal.$domain.$coursenum.$ccrole.adhoc" => time});
- }
- }
- last;
- }
-# Is this an ad-hoc CA-role?
- if (my ($domain,$user) =
- ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {
- if (($domain eq $env{'user.domain'}) && ($user eq $env{'user.name'})) {
- delete($env{$envkey});
- $env{'form.au./'.$domain.'/'} = 1;
- my ($server_status,$home) = &check_author_homeserver($user,$domain);
- if ($server_status eq 'switchserver') {
- my $trolecode = 'au./'.$domain.'/';
- my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
- $r->internal_redirect($switchserver);
- return OK;
+ if (my ($ccrole,$domain,$coursenum) =
+ ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) {
+ if ($dcroles{$domain}) {
+ if (&Apache::lonnet::check_adhoc_privs($domain,$coursenum,
+ $update,$refresh,$now,$ccrole)) {
+ &Apache::lonnet::appenv({"environment.internal.$domain.$coursenum.$ccrole.adhoc" => time});
+ }
}
last;
}
- if (my ($castart,$caend) = ($env{'user.role.ca./'.$domain.'/'.$user} =~ /^(\d*)\.(\d*)$/)) {
- if (((($castart) && ($castart < $now)) || !$castart) &&
- ((!$caend) || (($caend) && ($caend > $now)))) {
+# Is this an ad-hoc CA-role?
+ if (my ($domain,$user) =
+ ($envkey =~ m-^form\.ca\./($match_domain)/($match_username)$-)) {
+ if (($domain eq $env{'user.domain'}) && ($user eq $env{'user.name'})) {
+ delete($env{$envkey});
+ $env{'form.au./'.$domain.'/'} = 1;
my ($server_status,$home) = &check_author_homeserver($user,$domain);
if ($server_status eq 'switchserver') {
- my $trolecode = 'ca./'.$domain.'/'.$user;
+ my $trolecode = 'au./'.$domain.'/';
my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
$r->internal_redirect($switchserver);
return OK;
}
last;
}
- }
- # Check if author blocked ca-access
- my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);
- if ($blocked{'domcoord.author'} eq 'blocked') {
- delete($env{$envkey});
- $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
+ if (my ($castart,$caend) = ($env{'user.role.ca./'.$domain.'/'.$user} =~ /^(\d*)\.(\d*)$/)) {
+ if (((($castart) && ($castart < $now)) || !$castart) &&
+ ((!$caend) || (($caend) && ($caend > $now)))) {
+ my ($server_status,$home) = &check_author_homeserver($user,$domain);
+ if ($server_status eq 'switchserver') {
+ my $trolecode = 'ca./'.$domain.'/'.$user;
+ my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode;
+ $r->internal_redirect($switchserver);
+ return OK;
+ }
+ last;
+ }
+ }
+ # Check if author blocked ca-access
+ my %blocked=&Apache::lonnet::get('environment',['domcoord.author'],$domain,$user);
+ if ($blocked{'domcoord.author'} eq 'blocked') {
+ delete($env{$envkey});
+ $env{'user.error.msg'}=':::1:User '.$user.' in domain '.$domain.' blocked domain coordinator access';
+ last;
+ }
+ if ($dcroles{$domain}) {
+ my ($server_status,$home) = &check_author_homeserver($user,$domain);
+ if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {
+ &Apache::lonnet::check_adhoc_privs($domain,$user,$update,
+ $refresh,$now,'ca');
+ if ($server_status eq 'switchserver') {
+ my $trolecode = 'ca./'.$domain.'/'.$user;
+ my $switchserver = '/adm/switchserver?'
+ .'otherserver='.$home.'&role='.$trolecode;
+ $r->internal_redirect($switchserver);
+ return OK;
+ }
+ } else {
+ delete($env{$envkey});
+ }
+ } else {
+ delete($env{$envkey});
+ }
last;
}
- if ($dcroles{$domain}) {
- my ($server_status,$home) = &check_author_homeserver($user,$domain);
- if (($server_status eq 'ok') || ($server_status eq 'switchserver')) {
- &Apache::lonnet::check_adhoc_privs($domain,$user,$update,
- $refresh,$now,'ca');
- if ($server_status eq 'switchserver') {
- my $trolecode = 'ca./'.$domain.'/'.$user;
- my $switchserver = '/adm/switchserver?'
- .'otherserver='.$home.'&role='.$trolecode;
- $r->internal_redirect($switchserver);
- return OK;
+ }
+ if ($numdh) {
+# Is this an ad hoc custom role in a course/community?
+ if (my ($domain,$rolename,$coursenum,$sec) = ($envkey =~ m{^form\.cr/($match_domain)/\1\-domainconfig/(\w+)\./\1/($match_courseid)(?:/(\w+)|$)})) {
+ if ($dhroles{$domain}) {
+ my ($possroles,$description) = &Apache::lonnet::get_my_adhocroles($domain.'_'.$coursenum,1);
+ if (ref($possroles) eq 'ARRAY') {
+ if (grep(/^\Q$rolename\E$/,@{$possroles})) {
+ if (&Apache::lonnet::check_adhoc_privs($domain,$coursenum,$update,$refresh,$now,
+ "cr/$domain/$domain".'-domainconfig/'.$rolename,
+ undef,$sec)) {
+ &Apache::lonnet::appenv({"environment.internal.$domain.$coursenum.cr/$domain/$domain".
+ '-domainconfig/'."$rolename.adhoc" => time});
+ }
+ } else {
+ delete($env{$envkey});
+ }
+ } else {
+ delete($env{$envkey});
}
} else {
delete($env{$envkey});
}
- } else {
- delete($env{$envkey});
+ last;
}
- last;
- }
+ }
}
}
@@ -534,7 +561,7 @@ ENDENTERKEY
$env{'user.name'},
$env{'user.home'},
"Role ".$trolecode);
-
+
&Apache::lonnet::appenv(
{'request.role' => $trolecode,
'request.role.domain' => $cdom,
@@ -543,6 +570,15 @@ ENDENTERKEY
my $tadv=0;
if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) {
+ if ($role =~ m{^\Qcr/$cdom/$cdom\E\-domainconfig/(\w+)$}) {
+ my $rolename = $1;
+ my %domdef = &Apache::lonnet::get_domain_defaults($cdom);
+ if (ref($domdef{'adhocroles'}) eq 'HASH') {
+ if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') {
+ &Apache::lonnet::appenv({'request.role.desc' => $domdef{'adhocroles'}{$rolename}{'desc'}});
+ }
+ }
+ }
my $msg;
my ($furl,$ferr)=
&Apache::lonuserstate::readmap($cdom.'/'.$cnum);
@@ -964,7 +1000,7 @@ ENDHEADER
my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,
$nochoose);
&print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,
- \%roletext);
+ \%roletext,$update,$then);
my $tremark='';
my $tbg;
if ($env{'request.role'} eq 'cm') {
@@ -1025,9 +1061,8 @@ ENDHEADER
if ($role =~ m{^dc\./($match_domain)/$}
&& $dcroles{$1}) {
$output .= &adhoc_roles_row($1,'recent');
- } elsif ($role =~ m{^dh\./($match_domain)/$}
- && ($env{'environment.adhocroles.'.$1} ne '')) {
- $output .= &adhoc_customroles_row($1,'recent');
+ } elsif ($role =~ m{^(dh)\./($match_domain)/$}) {
+ $output .= &adhoc_customroles_row($1,$2,'recent',$update,$then);
}
} elsif ($numdc > 0) {
unless ($role =~/^error\:/) {
@@ -1056,7 +1091,7 @@ ENDHEADER
$doheaders ++;
}
}
- &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext);
+ &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext,$update,$then);
if ($countactive > 1) {
my $tremark='';
my $tbg;
@@ -1133,6 +1168,7 @@ sub gather_roles {
my $tryagain = $env{'form.tryagain'};
my @ids = &Apache::lonnet::current_machine_ids();
if (ref($roles_in_env) eq 'HASH') {
+ my %adhocdesc;
foreach my $envkey (sort(keys(%{$roles_in_env}))) {
my $button = 1;
my $switchserver='';
@@ -1184,8 +1220,10 @@ sub gather_roles {
my $trole;
if ($role =~ /^cr\//) {
my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role);
- if ($tremark) { $tremark.='
'; }
- $tremark.=&mt('Custom role defined by [_1].',$rauthor.':'.$rdomain);
+ unless ($rauthor eq $rdomain.'-domainconfig') {
+ if ($tremark) { $tremark.='
'; }
+ $tremark.=&mt('Custom role defined by [_1].',$rauthor.':'.$rdomain);
+ }
}
$trole=Apache::lonnet::plaintext($role);
my $ttype;
@@ -1231,7 +1269,32 @@ sub gather_roles {
} elsif ($trest) {
my $tcourseid=$tdom.'_'.$trest;
$ttype = &Apache::loncommon::course_type($tcourseid);
- $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid);
+ if ($role !~ /^cr/) {
+ $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid);
+ } elsif ($role =~ m{^\Qcr/$tdom/$tdom\E\-domainconfig/(\w+)$}) {
+ my $rolename = $1;
+ my $desc;
+ if (ref($adhocdesc{$tdom}) eq 'HASH') {
+ $desc = $adhocdesc{$tdom}{$rolename};
+ } else {
+ my %domdef = &Apache::lonnet::get_domain_defaults($tdom);
+ if (ref($domdef{'adhocroles'}) eq 'HASH') {
+ foreach my $rolename (sort(keys(%{$domdef{'adhocroles'}}))) {
+ if (ref($domdef{'adhocroles'}{$rolename}) eq 'HASH') {
+ $adhocdesc{$tdom}{$rolename} = $domdef{'adhocroles'}{$rolename}{'desc'};
+ $desc = $adhocdesc{$tdom}{$rolename};
+ }
+ }
+ }
+ }
+ if ($desc ne '') {
+ $trole = $desc;
+ } else {
+ $trole = &mt('Helpdesk[_1]',' '.$rolename);
+ }
+ } else {
+ $trole = (split(/\//,$role,4))[-1];
+ }
if ($env{'course.'.$tcourseid.'.description'}) {
my $home=$env{'course.'.$tcourseid.'.home'};
$twhere=$env{'course.'.$tcourseid.'.description'};
@@ -1400,7 +1463,7 @@ sub roletypes {
}
sub print_rolerows {
- my ($r,$doheaders,$roleclass,$sortrole,$dcroles,$roletext) = @_;
+ my ($r,$doheaders,$roleclass,$sortrole,$dcroles,$roletext,$update,$then) = @_;
if ((ref($roleclass) eq 'HASH') && (ref($sortrole) eq 'HASH')) {
my @types = &roletypes();
foreach my $type (@types) {
@@ -1424,9 +1487,8 @@ sub print_rolerows {
$output .= &adhoc_roles_row($1,'');
}
}
- } elsif (($sortrole->{$which} =~ m{^user\.role\.dh\./($match_domain)/}) &&
- ($env{'environment.adhocroles.'.$1} ne '')) {
- $output .= &adhoc_customroles_row($1,'');
+ } elsif ($sortrole->{$which} =~ m{^user\.role\.(dh)\./($match_domain)/}) {
+ $output .= &adhoc_customroles_row($1,$2,'',$update,$then);
}
}
}
@@ -1594,7 +1656,8 @@ sub privileges_info {
}
sub build_roletext {
- my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver,$reinit,$switchwarning) = @_;
+ my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$trole,$twhere,
+ $tpstart,$tpend,$nochoose,$button,$switchserver,$reinit,$switchwarning) = @_;
my ($roletext,$roletext_end);
my $is_dc=($trolecode =~ m/^dc\./);
my $rowspan=($is_dc) ? ''
@@ -1709,8 +1772,11 @@ sub check_for_adhoc {
$numdc++;
} else {
$dhroles->{$roledom} = $envkey;
- if ($env{'environment.adhocroles.'.$roledom} ne '') {
- $numadhoc ++;
+ my %domdefaults = &Apache::lonnet::get_domain_defaults($roledom);
+ if (ref($domdefaults{'adhocroles'}) eq 'HASH') {
+ if (keys(%{$domdefaults{'adhocroles'}})) {
+ $numadhoc ++;
+ }
}
$numdh++;
}
@@ -1759,9 +1825,15 @@ sub adhoc_course_role {
my %cgroups =
&Apache::lonnet::get_active_groups($env{'user.domain'},
$env{'user.name'},$cdom,$cnum);
+ my $ccrole;
+ if ($crstype eq 'Community') {
+ $ccrole = 'co';
+ } else {
+ $ccrole = 'cc';
+ }
foreach my $group (keys(%cgroups)) {
$group_privs{$group} =
- $env{'user.priv.cc./'.$cdom.'/'.$cnum.'./'.$cdom.'/'.$cnum.'/'.$group};
+ $env{'user.priv.'.$ccrole.'./'.$cdom.'/'.$cnum.'./'.$cdom.'/'.$cnum.'/'.$group};
}
$newgroups{'/'.$cdom.'/'.$cnum} = \%group_privs;
my $area = '/'.$cdom.'/'.$cnum;
@@ -1926,20 +1998,25 @@ sub adhoc_roles_row {
}
sub adhoc_customroles_row {
- my ($dhdom,$rowtype) = @_;
- my $output = &Apache::loncommon::continue_data_table_row()
- .'