--- loncom/auth/lonroles.pm 2006/08/31 13:25:18 1.164 +++ loncom/auth/lonroles.pm 2007/09/10 11:44:00 1.178 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.164 2006/08/31 13:25:18 albertel Exp $ +# $Id: lonroles.pm,v 1.178 2007/09/10 11:44:00 www 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', @@ -430,19 +438,11 @@ ENDHEADER } # -------------------------------------------------------- Choice or no choice? if ($nochoose) { - $r->print("

".&mt('Sorry ...')."

\n". - &mt('This action is currently not authorized.'). + $r->print("

".&mt('Sorry ...')."

\n". + &mt('This action is currently not authorized.').''. &Apache::loncommon::end_page()); return OK; } else { - if ($advanced) { - $r->print(&mt("Your home server is "). - $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.")); - } if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) { $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'}; } @@ -453,9 +453,9 @@ ENDHEADER } if ($env{'user.adv'}) { $r->print( - '
'); } my (%roletext,%sortrole,%roleclass); @@ -538,7 +538,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.'
'. @@ -558,7 +558,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; @@ -596,7 +596,7 @@ ENDHEADER } } if ($tsection) { - $twhere.='
'.&mt('Section/Group').': '.$tsection; + $twhere.='
'.&mt('Section').': '.$tsection; } if ($role ne 'st') { $twhere.="
".&mt('Domain').":".$tdom; } } elsif ($tdom) { @@ -638,14 +638,14 @@ ENDHEADER # More than one possible role # ----------------------------------------------------------------------- Table unless (($advanced) || ($nochoose)) { - $r->print("

".&mt('Select a Course/Group to Enter')."

\n"); + $r->print("

".&mt('Select a Course to Enter')."

\n"); } - $r->print('
'); + $r->print('
'); unless ($nochoose) { $r->print(''); } $r->print(''."\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/) { @@ -662,7 +662,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) { @@ -684,12 +685,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,''); } @@ -721,8 +722,8 @@ ENDHEADER $r->print(''); } } - $r->print(''."\n"); $r->print('
 '.&mt('User Role').''.&mt('Extent'). ''.&mt('Start').''.&mt('End').'
 '.&mt('No role specified'). - ''.$tremark. + $r->print(''.&mt('No role specified'). + ''.$tremark. ' 
'); @@ -732,57 +733,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.'

'); - } - } + $r->print(&privileges_info()); } $r->print(&Apache::lonnet::getannounce()); if ($advanced) { @@ -794,6 +745,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'; + } + return $output; +} + sub role_status { my ($rolekey,$then,$now,$role,$where,$trolecode,$tstatus,$tstart,$tend) = @_; my @pwhere = (); @@ -821,7 +827,7 @@ sub role_status { sub build_roletext { my ($trolecode,$tdom,$trest,$tstatus,$tryagain,$advanced,$tremark,$tbg,$tfont,$trole,$twhere,$tpstart,$tpend,$nochoose,$button,$switchserver) = @_; - my $roletext=''; + my $roletext=''; my $is_dc=($trolecode =~ m/^dc\./); my $rowspan=($is_dc) ? '' : ' rowspan="2" '; @@ -831,8 +837,8 @@ sub build_roletext { $buttonname=~s/\W//g; if (!$button) { if ($switchserver) { - $roletext.=''.&mt('Switch Server').''; + $roletext.=''.&mt('Switch Server').''; } else { $roletext.=(' '); } @@ -854,17 +860,18 @@ sub build_roletext { $roletext.=' '; } } - $tremark.=&Apache::lonannounce::showday(time,1, - &Apache::lonannounce::readcalendar($tdom.'_'.$trest)); - + if ($trolecode !~ m/^(dc|ca|au|aa)\./) { + $tremark.=&Apache::lonannounce::showday(time,1, + &Apache::lonannounce::readcalendar($tdom.'_'.$trest)); + } $roletext.=''.$trole. ''.$twhere. ''.$tpstart. ''.$tpend. ''; if (!$is_dc) { - $roletext.=''.$tremark. - ' '."\n"; + $roletext.=''.$tremark. + ' '."\n"; } return $roletext; } @@ -888,7 +895,7 @@ sub check_fordc { my $numdc = 0; if ($env{'user.adv'}) { foreach my $envkey (sort keys %env) { - if ($envkey=~/^user\.role\.dc\.\/(\w+)\/$/) { + if ($envkey=~/^user\.role\.dc\.\/($match_domain)\/$/) { my $dcdom = $1; my $livedc = 1; my ($tstart,$tend)=split(/\./,$env{$envkey}); @@ -909,7 +916,7 @@ sub courselink { my $courseform=&Apache::loncommon::selectcourse_link ('rolechoice','dccourse'.$rowtype.'_'.$dcdom, 'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'. - $dcdom,$dcdom,undef,$selecttype); + $dcdom,$dcdom,undef); my $hiddenitems = ''. ''. ''. @@ -985,7 +992,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; @@ -1015,14 +1022,11 @@ sub allcourses_row { my ($dcdom,$rowtype) = @_; my $output = ''. ' '; - foreach my $type ('Course','Group') { - my $selectlink = &courselink($dcdom,$rowtype,$type); - my $ccrole = &Apache::lonnet::plaintext('cc',$type); - $output.= ''.$ccrole.''. - ' '.$selectlink.''. - ' from '.&mt('Domain').' '.$dcdom.'
'; - } - $output .= ''."\n"; + my $selectlink = &courselink($dcdom,$rowtype); + my $ccrole = &Apache::lonnet::plaintext('cc'); + $output.= ''. + &mt('[_1]: [_2] from domain [_3]',$ccrole,$selectlink,$dcdom). + '
'."\n"; return $output; } @@ -1036,7 +1040,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);