#!/usr/local/bin/perl # Show the left-side menu of Virtualmin domains, plus modules use strict; use warnings; no warnings 'redefine'; no warnings 'uninitialized'; # Globals our %in; our %text; our $base_remote_user; our $remote_user; our %miniserv; our %gaccess; our $session_id; our $trust_unknown_referers = 1; require "gray-theme/gray-theme-lib.pl"; require "gray-theme/theme.pl"; ReadParse(); # The body class selects the left frame styles our $gray_theme_body_class = 'left-frame'; my $is_master; # Is this user the master administrator? Virtualmin and Cloudmin each # have their own test for it if (foreign_available("virtual-server")) { # Virtualmin's master admin foreign_require("virtual-server"); $is_master = virtual_server::master_admin(); } elsif (foreign_available("server-manager")) { # Cloudmin's user with global permissions foreign_require("server-manager"); $is_master = server_manager::can_action(undef, "global"); } # Find all left-side items from Webmin my $sects = get_right_frame_sections(); my @leftitems = list_combined_webmin_menu($sects, \%in); my @lefttitles = grep { $_->{'type'} eq 'title' } @leftitems; # Work out what mode selector contains my @has = ( ); my %modmenu; foreach my $title (@lefttitles) { push(@has, { 'id' => $title->{'module'}, 'desc' => $title->{'desc'} }); $modmenu{$title->{'module'}}++; } my $nw = $sects->{'nowebmin'} || 0; if ($nw == 0 || $nw == 2 && $is_master) { # The Webmin modules mode is offered unless the settings hide it, # from everyone or from all but the master my $p = get_product_name(); push(@has, { 'id' => 'modules', 'desc' => $text{'has_'.$p} }); } # Default left-side mode my $mode = $in{'mode'} ? $in{'mode'} : $sects->{'tab'} && $sects->{'tab'} =~ /vm2/ ? "server-manager" : $sects->{'tab'} && $sects->{'tab'} =~ /virtualmin/ ? "virtual-server" : $sects->{'tab'} && $sects->{'tab'} =~ /mail/ ? "mailboxes" : $sects->{'tab'} && $sects->{'tab'} =~ /webmin/ ? "modules" : @leftitems ? $has[0]->{'id'} : "modules"; if (indexof($mode, (map { $_->{'id'} } @has)) < 0) { # A mode that is not offered falls back to the first one $mode = $has[0]->{'id'}; } # Product shown in the brand block, and its name my $prod = foreign_available("server-manager") ? 'cloudmin' : foreign_available("virtual-server") ? 'virtualmin' : get_product_name() eq 'usermin' ? 'usermin' : 'webmin'; my %prodnames = ( 'cloudmin' => $text{'has_vm2'}, 'virtualmin' => $text{'has_virtualmin'}, 'usermin' => $text{'has_usermin'}, 'webmin' => $text{'has_webmin'} ); popup_header($prodnames{$prod}); # The whole menu sits in one panel that floats on the page ground print "
\n"; # The loader starts on a click or a form submission aimed at the right # frame and stops when the new page there reports, through the functions # below, that it has loaded; a stuck loader stops on its own after 20 # seconds print <<'EOF'; EOF popup_footer(); # show_menu_items_list(&list, indent) # Actually prints the HTML for menu items sub show_menu_items_list { my ($items, $indent) = @_; foreach my $item (@$items) { if ($item->{'type'} eq 'item') { # Link to some page my $it = $item->{'target'} || ''; my $t = $it eq 'new' ? '_blank' : $it eq 'window' ? '_top' : 'right'; my $link = add_webprefix($item->{'link'}); if ($item->{'link'} =~ /^(https?):\/\//) { # Links to other sites open in a new window $t = '_blank'; $link = $item->{'link'}; } my $cls; if ($item->{'format'} eq 'link-new') { # Creation link shown as a button with a plus $cls = 'menu-create'; $item->{'desc'} = ui_svg_icon('plus', { 'size' => 15 }). " ".$item->{'desc'}; } else { # Ordinary link, indented inside a category and muted # when inactive $cls = 'menu-link'; $cls .= ' menu-sub' if ($indent); $cls .= ' inactive' if ($item->{'inactive'}); if ($item->{'id'} eq 'logout') { # Logout gets an icon and a muted look $cls .= ' menu-logout'; $item->{'desc'} = ui_svg_icon('power', { 'size' => 14 }). " ".$item->{'desc'}; } } print "". "$item->{'desc'}\n"; } elsif ($item->{'type'} eq 'cat') { # Start of a new category, opened when requested by the # frameset page my $c = $item->{'id'}; print "\n"; } elsif ($item->{'type'} eq 'html') { # Some HTML block print "\n"; } elsif ($item->{'type'} eq 'text') { # A line of text print "\n"; } elsif ($item->{'type'} eq 'hr') { # Separator line print "