mirror of
https://github.com/webmin/webmin.git
synced 2026-10-25 20:51:09 +00:00
This PR adds a "Page layout" setting to the Framed Theme, with a new single page layout that shows the menu on every page instead of in a frame. It's meant for people who can't or don't want to use frames, so the Legacy Theme is no longer the only option without frames. The menu code moved out of `left.cgi` into a shared menu-lib.pl, so both layouts build the same menu, frames look the same as before, and `left.cgi` shrinks from about 400 lines to about 60. The menu's module search box now follows the global "webminsearch" permission, which the old frame code never actually checked. One exception to be aware of. A server opened through Webmin Servers Index always uses frames, because that index only rewrites the links and redirects of framed pages.
182 lines
4.5 KiB
Perl
Executable File
182 lines
4.5 KiB
Perl
Executable File
# Functions used by theme CGIs
|
|
|
|
eval "use WebminCore;";
|
|
if ($@) {
|
|
do '../web-lib.pl';
|
|
do '../ui-lib.pl';
|
|
}
|
|
&init_config();
|
|
&load_theme_library();
|
|
%text = &load_language($current_theme);
|
|
$right_frame_sections_file = "$config_directory/$current_theme/sections";
|
|
$default_domains_to_show = 10;
|
|
|
|
# get_left_frame_width()
|
|
# Returns the width of the left frame in pixels, the same as the width of
|
|
# the menu in the single page layout
|
|
sub get_left_frame_width
|
|
{
|
|
return &theme_menu_width();
|
|
}
|
|
|
|
# list_virtualmin_theme_overlays()
|
|
# Returns a list of overlay themes suitable for this theme
|
|
sub list_virtualmin_theme_overlays
|
|
{
|
|
&foreign_require("webmin", "webmin-lib.pl");
|
|
local @rv;
|
|
foreach my $tinfo (&webmin::list_themes()) {
|
|
if ($tinfo->{'overlay'} &&
|
|
(!$tinfo->{'overlays'} ||
|
|
&indexof($current_theme,
|
|
split(/\s+/, $tinfo->{'overlays'})) >= 0)) {
|
|
push(@rv, $tinfo);
|
|
}
|
|
}
|
|
return @rv;
|
|
}
|
|
|
|
sub get_virtualmin_docs
|
|
{
|
|
local ($level) = @_;
|
|
return $level == 0 ? "http://www.virtualmin.com/documentation" :
|
|
$level == 1 ? "http://www.virtualmin.com/documentation/users/reseller" :
|
|
$level == 2 ? "http://www.virtualmin.com/documentation/users/server-owner" :
|
|
"http://www.virtualmin.com/documentation";
|
|
}
|
|
|
|
sub get_vm2_docs
|
|
{
|
|
local ($level) = @_;
|
|
return "http://www.virtualmin.com/documentation/cloudmin";
|
|
}
|
|
|
|
# get_right_frame_sections()
|
|
# Returns a hash containg details of visible right-frame sections
|
|
sub get_right_frame_sections
|
|
{
|
|
local %sects;
|
|
&read_file($right_frame_sections_file, \%sects);
|
|
if ($sects{'global'}) {
|
|
# Force use of global settings
|
|
return \%sects;
|
|
}
|
|
else {
|
|
# Can try personal settings, but fall back to global
|
|
local %usersects;
|
|
if (&read_file($right_frame_sections_file.".".$remote_user,
|
|
\%usersects)) {
|
|
return \%usersects;
|
|
}
|
|
else {
|
|
return \%sects;
|
|
}
|
|
}
|
|
}
|
|
|
|
# save_right_frame_sections(§s)
|
|
sub save_right_frame_sections
|
|
{
|
|
local ($sects) = @_;
|
|
&make_dir("$config_directory/$current_theme", 0700);
|
|
if ($sects->{'global'}) {
|
|
# Update global settings, for all users
|
|
&write_file($right_frame_sections_file, $sects);
|
|
}
|
|
else {
|
|
# Save own, and turn off global flag (if this is the master admin)
|
|
if (&foreign_check("virtual-server")) {
|
|
&foreign_require("virtual-server", "virtual-server-lib.pl");
|
|
if (&virtual_server::master_admin()) {
|
|
local %globalsect;
|
|
&read_file($right_frame_sections_file, \%globalsect);
|
|
$globalsect{'global'} = 0;
|
|
&write_file($right_frame_sections_file, \%globalsect);
|
|
}
|
|
}
|
|
&write_file($right_frame_sections_file.".".$remote_user, $sects);
|
|
}
|
|
}
|
|
|
|
# list_right_frame_sections()
|
|
# Returns a list of possible sections for the current user, as hash refs
|
|
sub list_right_frame_sections
|
|
{
|
|
local ($hasvirt, $level, $hasvm2) = &get_virtualmin_user_level();
|
|
local @rv;
|
|
if ($level == 0) {
|
|
# Master admin
|
|
if ($hasvirt) {
|
|
push(@rv, 'updates', 'status', 'newfeatures',
|
|
'quotas', 'bw', 'ips', 'sysinfo');
|
|
}
|
|
if ($hasvm2) {
|
|
push(@rv, 'vm2servers');
|
|
}
|
|
}
|
|
elsif ($level == 2) {
|
|
# Domain owner
|
|
push(@rv, 'virtualmin');
|
|
}
|
|
elsif ($level == 1) {
|
|
# Reseller
|
|
push(@rv, 'reseller', 'quotas', 'bw');
|
|
}
|
|
elsif ($level == 4) {
|
|
# Cloudmin system owner
|
|
push(@rv, 'owner', 'vm2servers');
|
|
}
|
|
else {
|
|
# Usermin
|
|
push(@rv, 'system');
|
|
}
|
|
@rv = map { { 'name' => $_,
|
|
'title' => $virtual_server::text{'right_'.$_.'header'} } } @rv;
|
|
|
|
# Add plugin-defined sections
|
|
if (($level == 0 || $level == 1 || $level == 2) && $hasvirt &&
|
|
defined(&virtual_server::list_plugin_sections)) {
|
|
push(@rv, &virtual_server::list_plugin_sections($level));
|
|
}
|
|
if (($level == 0 || $level == 4) && $hasvm2 &&
|
|
defined(&server_manager::list_plugin_sections)) {
|
|
push(@rv, &server_manager::list_plugin_sections($level));
|
|
}
|
|
|
|
return @rv;
|
|
}
|
|
|
|
# get_virtualmin_user_level()
|
|
# Returns three numbers - the first being a flag if virtualmin is installed,
|
|
# the second a user type (3=usermin, 2=domain, 1=reseller, 0=master, 4=system
|
|
# owner), the third a flag for Cloudmin
|
|
sub get_virtualmin_user_level
|
|
{
|
|
local ($hasvirt, $hasvm2, $level);
|
|
$hasvm2 = &foreign_available("server-manager");
|
|
$hasvirt = &foreign_available("virtual-server");
|
|
if ($hasvm2) {
|
|
&foreign_require("server-manager", "server-manager-lib.pl");
|
|
}
|
|
if ($hasvirt) {
|
|
&foreign_require("virtual-server", "virtual-server-lib.pl");
|
|
}
|
|
if ($hasvm2) {
|
|
$level = $server_manager::access{'owner'} ? 4 : 0;
|
|
}
|
|
elsif ($hasvirt) {
|
|
$level = &virtual_server::master_admin() ? 0 :
|
|
&virtual_server::reseller_admin() ? 1 : 2;
|
|
}
|
|
elsif (&get_product_name() eq "usermin") {
|
|
$level = 3;
|
|
}
|
|
else {
|
|
$level = 0;
|
|
}
|
|
return ($hasvirt, $level, $hasvm2);
|
|
}
|
|
|
|
1;
|
|
|