--- loncom/auth/lonroles.pm 2006/10/10 01:55:33 1.162.2.3
+++ loncom/auth/lonroles.pm 2007/03/02 23:17:48 1.176
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# User Roles Screen
#
-# $Id: lonroles.pm,v 1.162.2.3 2006/10/10 01:55:33 albertel Exp $
+# $Id: lonroles.pm,v 1.176 2007/03/02 23:17:48 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,8 +40,9 @@ use Apache::lonhtmlcommon;
use Apache::lonannounce;
use Apache::lonlocal;
use Apache::lonpageflip();
+use Apache::lonnavdisplay();
use GDBM_File;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub redirect_user {
@@ -53,8 +54,8 @@ sub redirect_user {
my $swinfo=&Apache::lonmenu::rawconfig();
my $navwindow;
if ($launch_nav eq 'on') {
- $navwindow.=&Apache::lonnavmaps::launch_win('now',undef,undef,
- ($url =~ m-^/adm/whatsnew-));
+ $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef,
+ ($url =~ m-^/adm/whatsnew-));
} else {
$navwindow.=&Apache::lonnavmaps::close();
}
@@ -125,7 +126,7 @@ sub handler {
if ($numdc > 0) {
foreach my $envkey (keys %env) {
if (my ($domain,$coursenum) =
- ($envkey =~ m-^form\.cc\./(\w+)/(\w+)$-)) {
+ ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) {
if ($dcroles{$domain}) {
&check_privs($domain,$coursenum,$then,$now);
}
@@ -164,7 +165,7 @@ sub handler {
my $authnum=$cnum;
if ($env{'course.'.$cdom.'_'.$cnum.'.keyauth'}) {
($authnum,$authdom)=
- split(/\W/,$env{'course.'.$cdom.'_'.$cnum.'.keyauth'});
+ split(/:/,$env{'course.'.$cdom.'_'.$cnum.'.keyauth'});
}
# check with key authority
unless (&Apache::lonnet::validate_access_key(
@@ -312,7 +313,7 @@ ENDENTERKEY
}
}
# Are we allowed to look at the first resource?
- if (!&Apache::lonnet::allowed('bre',$furl)) {
+ if ($furl !~ m|^/adm/|) {
# Guess not ...
$furl=&Apache::lonpageflip::first_accessible_resource();
}
@@ -406,10 +407,17 @@ ENDHEADER
# --------------------------------------------------------------- Error Header?
if ($error) {
$r->print("
LON-CAPA Access Control ");
- $r->print("Access : ".
- Apache::lonnet::plaintext($priv)."\n");
- $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");
- $r->print("Action : $msg\n ");
+ $r->print("");
+ if ($priv ne '') {
+ $r->print("Access : ".&Apache::lonnet::plaintext($priv)."\n");
+ }
+ if ($fn ne '') {
+ $r->print("Resource: ".&Apache::lonenc::check_encrypt($fn)."\n");
+ }
+ if ($msg ne '') {
+ $r->print("Action : $msg\n");
+ }
+ $r->print(" ");
my $url=$fn;
my $last;
if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
@@ -437,8 +445,8 @@ ENDHEADER
} else {
if ($advanced) {
$r->print(&mt("Your home server is ").
- $Apache::lonnet::hostname{&Apache::lonnet::homeserver
- ($env{'user.name'},$env{'user.domain'})}.
+ &Apache::lonnet::hostname(&Apache::lonnet::homeserver
+ ($env{'user.name'},$env{'user.domain'})).
" \n");
$r->print(&mt(
"Author and Co-Author roles are not available on servers other than their respective home servers."));
@@ -485,8 +493,11 @@ ENDHEADER
$tstatus='selected';
}
my $tbg;
- if (($tstatus eq 'is') || ($tstatus eq 'selected') ||
- ($env{'form.showall'})) {
+ if (($tstatus eq 'is')
+ || ($tstatus eq 'selected')
+ || ($tstatus eq 'will')
+ || ($tstatus eq 'future')
+ || ($env{'form.showall'})) {
if ($tstatus eq 'is') {
$tbg='#77FF77';
$tfont='#003300';
@@ -535,7 +546,7 @@ ENDHEADER
$switchserver='otherserver='.$home.'&role='.$trolecode;
}
#next if ($home eq 'no_host');
- $home = $Apache::lonnet::hostname{$home};
+ $home = &Apache::lonnet::hostname($home);
$ttype='Construction Space';
$twhere=&mt('User').': '.$trest.' '.&mt('Domain').
': '.$tdom.' '.
@@ -555,7 +566,7 @@ ENDHEADER
$switchserver='otherserver='.$home.'&role='.$trolecode;
}
#next if ($home eq 'no_host');
- $home = $Apache::lonnet::hostname{$home};
+ $home = &Apache::lonnet::hostname($home);
$ttype='Construction Space';
$twhere=&mt('Domain').': '.$tdom.' '.&mt('Server').
': '.$home;
@@ -593,7 +604,7 @@ ENDHEADER
}
}
if ($tsection) {
- $twhere.=' '.&mt('Section/Group').': '.$tsection;
+ $twhere.=' '.&mt('Section').': '.$tsection;
}
if ($role ne 'st') { $twhere.=" ".&mt('Domain').":".$tdom; }
} elsif ($tdom) {
@@ -642,7 +653,7 @@ ENDHEADER
$r->print(''.&mt('User Role').' '.&mt('Extent').
' '.&mt('Start').' '.&mt('End').' '."\n");
my $doheaders=-1;
- foreach my $type ('Domain','Construction Space','Course','Group','Unavailable','System') {
+ foreach my $type ('Domain','Construction Space','Course','Unavailable','System') {
my $haverole=0;
foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {
@@ -659,7 +670,8 @@ ENDHEADER
foreach (sort(keys(%recent_roles))) {
if (defined($roletext{'user.role.'.$_})) {
$output.=$roletext{'user.role.'.$_};
- if ($_ =~ m-dc\./(\w+)/- && $dcroles{$1}) {
+ if ($_ =~ m-dc\./($match_domain)/-
+ && $dcroles{$1}) {
$output .= &allcourses_row($1,'recent');
}
} elsif ($numdc > 0) {
@@ -681,12 +693,12 @@ ENDHEADER
$r->print(&coursepick_jscript());
$r->print(&Apache::loncommon::coursebrowser_javascript());
}
- foreach my $type ('Construction Space','Domain','Course','Group','Unavailable','System') {
+ foreach my $type ('Construction Space','Domain','Course','Unavailable','System') {
my $output;
foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) {
if ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/) {
$output.=$roletext{$sortrole{$which}};
- if ($sortrole{$which} =~ m-dc\./(\w+)/-) {
+ if ($sortrole{$which} =~ m-dc\./($match_domain)/-) {
if ($dcroles{$1}) {
$output .= &allcourses_row($1,'');
}
@@ -729,57 +741,7 @@ ENDHEADER
# ------------------------------------------------------------ Privileges Info
if (($advanced) && (($env{'user.error.msg'}) || ($error))) {
$r->print('Current Privileges ');
-
- foreach $envkey (sort keys %env) {
- if ($envkey=~/^user\.priv\.$env{'request.role'}\./) {
- my $where=$envkey;
- $where=~s/^user\.priv\.$env{'request.role'}\.//;
- my $ttype;
- my $twhere;
- my ($tdom,$trest,$tsec)=
- split(/\//,Apache::lonnet::declutter($where));
- if ($trest) {
- if ($env{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {
- $ttype='Construction Space';
- $twhere='User: '.$trest.', Domain: '.$tdom;
- } else {
- $ttype=
- &Apache::loncommon::course_type($tdom.'_'.$trest);
- $twhere=$env{'course.'.$tdom.'_'.$trest.'.description'};
- if ($tsec) {
- $twhere.=' (Section: '.$tsec.')';
- }
- }
- } elsif ($tdom) {
- $ttype='Domain';
- $twhere=$tdom;
- } else {
- $ttype='System';
- $twhere='/';
- }
- $r->print("\n".$ttype.': '.$twhere.' ');
- foreach (sort split(/:/,$env{$envkey})) {
- if ($_) {
- my ($prv,$restr)=split(/\&/,$_);
- my $trestr='';
- if ($restr ne 'F') {
- my $i;
- $trestr.=' (';
- for ($i=0;$iprint(''.
- Apache::lonnet::plaintext($prv).$trestr.
- ' ');
- }
- }
- $r->print(' ');
- }
- }
+ $r->print(&privileges_info());
}
$r->print(&Apache::lonnet::getannounce());
if ($advanced) {
@@ -791,6 +753,61 @@ ENDHEADER
return OK;
}
+sub privileges_info {
+ my ($which) = @_;
+ my $output;
+
+ $which ||= $env{'request.role'};
+
+ foreach my $envkey (sort(keys(%env))) {
+ next if ($envkey!~/^user\.priv\.\Q$which\E\.(.*)/);
+
+ my $where=$1;
+ my $ttype;
+ my $twhere;
+ my (undef,$tdom,$trest,$tsec)=split(m{/},$where);
+ if ($trest) {
+ if ($env{'course.'.$tdom.'_'.$trest.'.description'} eq 'ca') {
+ $ttype='Construction Space';
+ $twhere='User: '.$trest.', Domain: '.$tdom;
+ } else {
+ $ttype= &Apache::loncommon::course_type($tdom.'_'.$trest);
+ $twhere=$env{'course.'.$tdom.'_'.$trest.'.description'};
+ if ($tsec) {
+ my $sec_type = 'Section';
+ if (exists($env{"user.role.gr.$where"})) {
+ $sec_type = 'Group';
+ }
+ $twhere.=' ('.$sec_type.': '.$tsec.')';
+ }
+ }
+ } elsif ($tdom) {
+ $ttype='Domain';
+ $twhere=$tdom;
+ } else {
+ $ttype='System';
+ $twhere='/';
+ }
+ $output .= "\n".$ttype.': '.$twhere.' '."\n";
+ foreach my $priv (sort(split(/:/,$env{$envkey}))) {
+ next if (!$priv);
+
+ my ($prv,$restr)=split(/\&/,$priv);
+ my $trestr='';
+ if ($restr ne 'F') {
+ $trestr.=' ('.
+ join(', ',
+ map { &Apache::lonnet::plaintext($_) }
+ (split('',$restr))).') ';
+ }
+ $output .= "\n\t".
+ ''.&Apache::lonnet::plaintext($prv).$trestr.' ';
+ }
+ $output .= "\n".' ';
+ }
+ return $output;
+}
+
sub role_status {
my ($rolekey,$then,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_;
my @pwhere = ();
@@ -831,7 +848,7 @@ sub build_roletext {
$roletext.=''.&mt('Switch Server').' ';
} else {
- $roletext.=(' ');
+ $roletext.=(' ');
}
} elsif ($tstatus eq 'is') {
$roletext.=' '.
' '.
' '.
@@ -983,7 +1000,7 @@ sub display_cc_role {
my $advanced = $env{'user.adv'};
my $tryagain = $env{'form.tryagain'};
unless ($rolekey =~/^error\:/) {
- if ($rolekey =~ m-^user\.role.cc\./(\w+)/(\w+)$-) {
+ if ($rolekey =~ m-^user\.role.cc\./($match_domain)/($match_courseid)$-) {
my $tcourseid = $1.'_'.$2;
my $trolecode = 'cc./'.$1.'/'.$2;
my $twhere;
@@ -1013,13 +1030,11 @@ sub allcourses_row {
my ($dcdom,$rowtype) = @_;
my $output = ''.
' ';
- foreach my $type ('Course') {
- my $selectlink = &courselink($dcdom,$rowtype,$type);
- my $ccrole = &Apache::lonnet::plaintext('cc',$type);
- $output.= ''.$ccrole.' '.
+ my $selectlink = &courselink($dcdom,$rowtype);
+ my $ccrole = &Apache::lonnet::plaintext('cc');
+ $output.= ''.$ccrole.' '.
' '.$selectlink.' '.
' from '.&mt('Domain').' '.$dcdom.' ';
- }
$output .= ' '."\n";
return $output;
}
@@ -1034,7 +1049,9 @@ sub set_privileges {
my $area = '/'.$dcdom.'/'.$pickedcourse;
my $role = 'cc';
my $spec = $role.'.'.$area;
- my %userroles = &Apache::lonnet::set_arearole($role,$area,'','',$dcdom,$env{'user.name'});
+ my %userroles = &Apache::lonnet::set_arearole($role,$area,'','',
+ $env{'user.domain'},
+ $env{'user.name'});
my %ccrole = ();
&Apache::lonnet::standard_roleprivs(\%ccrole,$role,$dcdom,$spec,$pickedcourse,$area);
my ($author,$adv)= &Apache::lonnet::set_userprivs(\%userroles,\%ccrole);