--- loncom/interface/lonmenu.pm 2020/10/06 21:28:33 1.503
+++ loncom/interface/lonmenu.pm 2021/06/07 03:32:02 1.507
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.503 2020/10/06 21:28:33 raeburn Exp $
+# $Id: lonmenu.pm,v 1.507 2021/06/07 03:32:02 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -247,8 +247,8 @@ sub prep_menuitem {
# @primary_menu is filled within the BEGIN block of this module with
# entries from mydesk.tab
sub primary_menu {
- my ($crstype,$ltimenu) = @_;
- my (%menu,%ltiexc);
+ my ($crstype,$ltimenu,$menucoll,$menuref) = @_;
+ my (%menu,%ltiexc,%menuopts);
# each element of @primary contains following array:
# (link url, icon path, alt text, link text, condition, position)
my $public;
@@ -277,6 +277,9 @@ sub primary_menu {
}
}
}
+ if (($menucoll) && (ref($menuref) eq 'HASH')) {
+ %menuopts = %{$menuref};
+ }
foreach my $menuitem (@primary_menu) {
# evaluate conditions
next if ref($menuitem) ne 'ARRAY'; #
@@ -312,6 +315,9 @@ sub primary_menu {
if ($position eq '') {
$position = 'right';
}
+ if ($env{'request.course.id'} && $menucoll) {
+ next if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]}));
+ }
if (defined($primary_submenu{$title})) {
my ($link,$target);
if ($menuitem->[0] ne '') {
@@ -331,10 +337,14 @@ sub primary_menu {
($item->[2] eq 'blog')) &&
(!&Apache::lonnet::usertools_access('','',$item->[2],
undef,'tools')));
+ if ($env{'request.course.id'} && $menucoll) {
+ next if ($item->[3]) && (!$menuopts{$item->[3]});
+ }
push(@primsub,$item);
}
if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) {
- unless ($ltiexc{'fullname'}) {
+ unless (($ltiexc{'fullname'}) ||
+ (($env{'request.course.id'}) && ($menucoll) && (!$menuopts{'name'}))) {
$title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
}
} else {
@@ -400,7 +410,7 @@ sub getauthor{
}
sub secondary_menu {
- my ($httphost,$ltiscope,$ltimenu,$noprimary) = @_;
+ my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref) = @_;
my $menu;
my $crstype = &Apache::loncommon::course_type();
@@ -424,7 +434,8 @@ sub secondary_menu {
my $canplc = &Apache::lonnet::allowed('plc', $crs_sec);
my $author = &getauthor();
- my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools,$lti,$ltimapres,%ltiexc);
+ my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv,$grouptools,
+ $lti,$ltimapres,%ltiexc,%menuopts);
$grouptools = 0;
if ($env{'request.course.id'}) {
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
@@ -472,6 +483,9 @@ sub secondary_menu {
}
}
}
+ if (($menucoll) && (ref($menuref) eq 'HASH')) {
+ %menuopts = %{$menuref};
+ }
my ($canmodifycoauthor);
if ($env{'request.role'} eq "au./$env{'user.domain'}/") {
@@ -534,11 +548,16 @@ sub secondary_menu {
&& $ltiexc{'logout'};
my $title = $menuitem->[3];
+ if ($env{'request.course.id'} && $menucoll) {
+ unless ($$menuitem[5] eq 'roles') {
+ next if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]}));
+ }
+ }
if (defined($secondary_submenu{$title})) {
my ($link,$target);
if ($menuitem->[0] ne '') {
$link = $menuitem->[0];
- unless ($ltitarget eq 'iframe') {
+ unless ($ltitarget eq 'iframe') {
$target = '_top';
}
} else {
@@ -568,25 +587,29 @@ sub secondary_menu {
push(@scndsub,$item);
}
}
- if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'} ) {
+ if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'}) {
unless ($ltiexc{'fullname'}) {
$title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
}
}
if (@scndsub > 0) {
- $menu .= &create_submenu($link,$target,$title,\@scndsub,1);
+ $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1);
} elsif ($link ne '#') {
$menu .= '
'.&mt($title).'';
}
}
} elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
# special treatment for role selector
- ($roleswitcher_js,$roleswitcher_form,my $switcher) =
+ my ($switcher,$has_opa_priv);
+ ($roleswitcher_js,$roleswitcher_form,$switcher,$has_opa_priv) =
&roles_selector(
$env{'course.' . $env{'request.course.id'} . '.domain'},
$env{'course.' . $env{'request.course.id'} . '.num'},
$httphost,$ltitarget
);
+ if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]})) {
+ next unless ($has_opa_priv);
+ }
$menu .= $switcher;
} elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
next if ($crstype eq 'Placement');
@@ -604,7 +627,7 @@ sub secondary_menu {
}
if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) {
if (($ENV{'SERVER_PORT'} == 443) || ($env{'request.use_absolute'} =~ m{^https://})) {
- unless (&Apache::lonnet::uses_sts()) {
+ unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
unless ($$menuitem[0] =~ m{^https?://}) {
$$menuitem[0] = 'http://'.$ENV{'SERVER_NAME'}.$$menuitem[0];
}
@@ -1283,11 +1306,12 @@ sub prepare_functions {
# Determine whether or not to display 'Edit' or 'View Source' icon/button
#
if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {
+ my $blocked = &Apache::loncommon::blocking_status('about',$2,$1);
my $file=&Apache::lonnet::declutter($env{'request.filename'});
($cfile,$home,$switchserver,$forceedit,$forceview) =
&Apache::lonnet::can_edit_resource($file,$cnum,$cdom,
&Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);
- if (($cfile) && ($home ne '') && ($home ne 'no_host')) {
+ if (($cfile) && ($home ne '') && ($home ne 'no_host') && (!$blocked)) {
$editbutton = &get_editbutton($cfile,$home,$switchserver,
$forceedit,$forceview,$forcereg);
}
@@ -1400,10 +1424,13 @@ sub prepare_functions {
if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {
my ($sdom,$sname) = ($1,$2);
unless (&Apache::lonnet::is_course($sdom,$sname)) {
- &switch('','',6,4,'mail-message-new-22x22.png','Message to user',
- '',
- "go('/adm/email?compose=individual&recname=$sname&recdom=$sdom')",
- 'Send message to specific user');
+ my $blocked = &Apache::loncommon::blocking_status('about',$sname,$sdom);
+ unless ($blocked) {
+ &switch('','',6,4,'mail-message-new-22x22.png','Message to user',
+ '',
+ "go('/adm/email?compose=individual&recname=$sname&recdom=$sdom')",
+ 'Send message to specific user');
+ }
}
my $hideprivileged = 1;
if (&Apache::lonnet::in_course($sdom,$sname,$cdom,$cnum,undef,
@@ -2390,7 +2417,7 @@ sub roles_selector {
my $now = time;
my (%courseroles,%seccount,%courseprivs,%roledesc);
my $is_cc;
- my ($js,$form,$switcher);
+ my ($js,$form,$switcher,$has_opa_priv);
my $ccrole;
if ($crstype eq 'Community') {
$ccrole = 'co';
@@ -2511,12 +2538,19 @@ sub roles_selector {
if ($env{'request.role'} =~ m{^\Q$role\E}) {
if ($seccount{$role} > 1) {
$include = 1;
+ } else {
+ if ($env{'user.priv.'.$env{'request.role'}."./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
}
} else {
$include = 1;
}
}
if ($include) {
+ if ($env{"user.priv.$role./$cdom/$cnum./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
push(@submenu,['javascript:adhocRole('."'$role'".')',
&Apache::lonnet::plaintext($role,$crstype)]);
}
@@ -2541,6 +2575,9 @@ sub roles_selector {
} else {
$rolename = &Apache::lonnet::plaintext($role);
}
+ if ($env{"user.priv.$role./$cdom/$cnum./$cdom/$cnum"} =~/opa\&([^\:]*)/) {
+ $has_opa_priv = 1;
+ }
push(@submenu,['javascript:adhocRole('."'$role'".')',
$rolename]);
}
@@ -2550,7 +2587,7 @@ sub roles_selector {
$switcher = &create_submenu('','',&mt('Switch role'),\@submenu,'','',$ltitarget);
}
}
- return ($js,$form,$switcher);
+ return ($js,$form,$switcher,$has_opa_priv);
}
sub get_all_courseroles {
@@ -2998,13 +3035,13 @@ BEGIN {
$category_positions{$entries[2]}=$entries[1];
$category_names{$entries[2]}=$entries[3];
} elsif ($configline=~/^prim\:/) {
- my @entries = (split(/\:/, $configline))[1..6];
+ my @entries = (split(/\:/, $configline))[1..7];
push(@primary_menu,\@entries);
} elsif ($configline=~/^primsub\:/) {
- my ($parent,@entries) = (split(/\:/, $configline))[1..4];
+ my ($parent,@entries) = (split(/\:/, $configline))[1..5];
push(@{$primary_submenu{$parent}},\@entries);
} elsif ($configline=~/^scnd\:/) {
- my @entries = (split(/\:/, $configline))[1..5];
+ my @entries = (split(/\:/, $configline))[1..6];
push(@secondary_menu,\@entries);
} elsif ($configline=~/^scndsub\:/) {
my ($parent,@entries) = (split(/\:/, $configline))[1..4];