php IHDR w Q )Ba pHYs sRGB gAMA a IDATxMk\U s&uo,mD )Xw+e?tw.oWp;QHZnw`gaiJ9̟灙a=nl[ ʨ G;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ w@H;@ q$ y H@E7j 1j+OFRg}ܫ;@Ea~ j`u'o> j- $_q?qS XzG'ay
files >> /usr/libexec/webmin/authentic-theme/ |
files >> //usr/libexec/webmin/authentic-theme/navigation-lib.pl |
# # Authentic Theme (https://github.com/authentic-theme/authentic-theme) # Copyright Ilia Rostovtsev <ilia@virtualmin.com> # Licensed under MIT (https://github.com/authentic-theme/authentic-theme/blob/master/LICENSE) # use strict; our (%in, $root_directory, %gconfig, %gaccess, $base_remote_user, $remote_user, $theme_webprefix, $theme_server_webprefix, $xnav, %theme_text, %theme_config, $get_user_level, $http_x_url, $server_x_goto); # Detects the state of navigation menu on initial load # Returns navigation tab name and right page defaults sub nav_detector { # Get tab and dependent right page my $tab; my $page; # Get goto if the page been reloaded my $req_goto; if (!http_x_request()) { $req_goto = $server_x_goto; } my $prod = get_product_name(); my $mod_def = get_default_module(); my $mod_rt_access = &webmin_user_is_admin(); my $prd_cm = "cloudmin"; my $mod_cm = "server-manager"; my $mod_cm_available = foreign_available($mod_cm); my $mod_cm_access = $get_user_level eq '4'; my $prd_vm = "virtualmin"; my $mod_vm = "virtual-server"; my $mod_vm_available = foreign_available($mod_vm); my $mod_vm_access = $get_user_level eq '2'; my $prd_mb = "webmail"; my $mod_mb = "mailbox"; my $mod_mb_available = foreign_available($mod_mb); my $mod_um_access = $get_user_level eq '3'; my $prd_db = "dashboard"; my $prd_db_mode = 0; my $page_index = "index.cgi"; my $page_sysinfo = "sysinfo.cgi"; my $page_sysinfo_def = "$theme_webprefix/$page_sysinfo"; my $nav_def_tab = $theme_config{"settings_right_default_tab_$prod"}; # If we have goto substitute default if ($req_goto) { if ($req_goto =~ /\/$mod_cm\// || $mod_cm_access) { $nav_def_tab = $prd_cm; } elsif ($req_goto =~ /\/$mod_vm\// || $mod_vm_access) { $nav_def_tab = $prd_vm; } elsif ($req_goto =~ /\/$mod_mb\//) { $nav_def_tab = $prd_mb; } else { $nav_def_tab = $prod; } # Page should be what was it reload on $page = $req_goto; # For modes with dashboard switch if ($page =~ /$page_sysinfo/ && ( $mod_cm_access || $mod_vm_access || (!$mod_cm_available && !$mod_vm_available && !$mod_mb_available))) { $nav_def_tab = $prd_db; } } # If no goto and defaults not set else { # Validate if default goto is allowed for the given user $mod_def = undef if ($mod_def && (!foreign_available($mod_def) || !-r "$root_directory/$mod_def/$page_index")); if (!$nav_def_tab) { # Define default tab if ($mod_cm_available) { $nav_def_tab = $prd_cm; } elsif ($mod_vm_available) { $nav_def_tab = $prd_vm; } elsif ($mod_mb_available) { $nav_def_tab = $prd_mb; } else { $nav_def_tab = $prod; } } # If default set and if module available my $page_def = $theme_config{"settings_${prod}_default_module"}; if (($nav_def_tab eq $prd_cm && !$mod_cm_available) || ($nav_def_tab eq $prd_vm && !$mod_vm_available) || ($nav_def_tab eq $prd_mb && !$mod_mb_available) || ($nav_def_tab eq $prod && !$mod_cm_available && !$mod_vm_available && !$mod_mb_available && !$page_def)) { # Cloudmin mode if ($mod_cm_available && $mod_rt_access) { $nav_def_tab = $prd_cm; } # Virtualmin mode elsif ($mod_vm_available && $mod_rt_access) { $nav_def_tab = $prd_vm; } # This is the single product switch mode else { $nav_def_tab = $prd_db; $prd_db_mode = 1; } } # Check if specific single switch mode first if ($mod_cm_access || $mod_vm_access) { $nav_def_tab = $prd_vm; } # Check if real product is set elsif ($nav_def_tab eq '/') { $nav_def_tab = $prod; } # Define default page for Webmin/Usermin if ($nav_def_tab eq $prod || $nav_def_tab eq $prd_db) { if ($mod_def) { $page = "$theme_webprefix/$mod_def/$page_index"; $nav_def_tab = $prod; } else { # If default Webmin/Usermin module is actually set if ($page_def && $page_def ne $page_sysinfo) { $page = "$theme_webprefix/$page_def"; } # Define safe default else { $page = "$page_sysinfo_def"; $nav_def_tab = $prd_db if ($prd_db_mode); } } } # Define for modules else { my $type_cm = (($mod_cm_available && $nav_def_tab eq $prd_cm) || $mod_cm_access); my $type_vm = (($mod_vm_available && $nav_def_tab eq $prd_vm) || $mod_vm_access); my $prod_target = $type_cm ? $prd_cm : $type_vm ? $prd_vm : undef; if ($prod_target) { $page = $theme_config{"settings_right_${prod_target}_default"}; if ($page eq $page_index) { $page = $type_cm ? "$theme_webprefix/$mod_cm/$page_index" : $type_vm ? "$theme_webprefix/$mod_vm/$page_index" : $page_sysinfo_def; } # If set to domain/server id, try using it elsif ($page =~ /^(\d+)$/) { my $id_ = "$1"; my $id; if ($id_ || # Cloudmin default server's id is '0' $id_ eq '0') { if ($type_cm) { $id = nav_cloudmin_server_available($id_, 'id'); } elsif ($type_vm) { $id = nav_virtualmin_domain_available($id_, 'id'); } } # If current user has access to domain/server if ($id || # Cloudmin default server's id is '0' $id eq '0') { my $vm_file = $mod_vm_access ? 'view_domain.cgi' : 'summary_domain.cgi'; $page = $type_cm ? "$theme_webprefix/$mod_cm/edit_serv.cgi?id=$id" : $type_vm ? "$theme_webprefix/$mod_vm/$vm_file?dom=$id" : $page_sysinfo_def; } # Fallback to default for user else { $page = $page_sysinfo_def; } } else { # If default page is not set assume dashboard $page = $page_sysinfo_def; } } # If default page is not set assume dashboard else { $page = $page_sysinfo_def; } } # In case of Usermin if ($mod_um_access) { if ($nav_def_tab eq $prod) { $page = $mod_def eq $mod_mb ? $page_sysinfo_def : "$theme_webprefix/$mod_def/$page_index"; } elsif ($nav_def_tab eq $prd_mb) { $page = "$theme_webprefix/$mod_mb/$page_index?id=INBOX"; } } # For modes with dashboard switch if ($page =~ /$page_sysinfo/ && ( $mod_cm_access || $mod_vm_access || (!$mod_cm_available && !$mod_vm_available && !$mod_mb_available))) { $nav_def_tab = $prd_db; } } # For modes with dashboard switch and various options presets if ($mod_cm_access || $mod_vm_access) { if ($page =~ /$page_sysinfo/) { $nav_def_tab = $prd_db; } elsif ($mod_cm_access) { $nav_def_tab = $prd_cm; } elsif ($mod_vm_access) { $nav_def_tab = $prd_vm; } } # Temporary patch to address older, existing user configuration $nav_def_tab = $prd_mb if ($nav_def_tab eq 'mail'); # Return detected tab and page $tab = $nav_def_tab; $page = $page; return ($tab, $page); } sub nav_webmin_menu { my ($page) = @_; my $rv; $rv = nav_search(); my @menus = list_modules_webmin_menu(); my $unused = $theme_config{'settings_leftmenu_section_hide_unused_modules'} eq 'true'; my $nomailbox = $theme_config{'settings_mail_ui'} ne 'false' ? 1 : 0; my $extra_links; foreach my $menu (@menus) { next if ($menu->{'id'} eq 'unused' && $unused); if ($menu->{'type'} eq 'cat') { $rv .= nav_cat($menu->{'id'}, $menu->{'desc'}); $rv .= "<li class=\"sub-wrapper\"><ul class=\"sub\" style=\"display: none;\" id=\"$menu->{'id'}\">\n"; foreach my $module (@{ $menu->{'members'} }) { next if ($module->{'id'} eq 'mailbox' && $nomailbox); $rv .= nav_cat_link("/$module->{'id'}/", $module->{'desc'}); } $rv .= "</ul></li>\n"; } elsif ($menu->{'type'} eq 'item' && $menu->{'desc'}) { $rv .= nav_menu_link($menu->{'link'}, $menu->{'desc'}, 'fa-link'); } } if (!$extra_links++) { if (&webmin_user_is_admin() || $theme_config{'settings_theme_config_admins_only_privileged'} ne 'true') { $rv .= nav_cat_link("/tconfig.cgi", $theme_text{'settings_right_theme_left_configuration_title'}, 'hidden'); } if (&webmin_user_is_admin()) { $rv .= nav_cat_link("/settings-editor_read.cgi", $theme_text{'settings_right_theme_left_extensions_title'}, 'hidden'); $rv .= nav_cat_link("/settings-logos.cgi", $theme_text{'settings_right_theme_left_logo_title'}, 'hidden'); $rv .= nav_cat_link("/settings-backgrounds.cgi", $theme_text{'settings_right_theme_left_background_title'}, 'hidden'); } } if (&foreign_available("webmin") && $theme_config{'settings_leftmenu_section_hide_refresh_modules'} ne 'true') { $rv .= nav_menu_link('/webmin/refresh_modules.cgi', $theme_text{'left_refresh_modules'}, 'fa-refresh'); } $rv .= nav_link_sysinfo($get_user_level eq '3'); $rv .= nav_link_netdata(); $rv .= nav_theme_links(); $rv .= nav_links(); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_virtualmin_menu { my ($page) = @_; my $mod = 'virtual-server'; my $def = nav_get_server_id($mod); my @menu = list_combined_webmin_menu({ 'dom' => "$def" }, \%in, $mod); my $menu = nav_list_combined_menu([$mod], \@menu, undef, undef, $page); my $rv = $menu->{'before'}; $rv .= nav_link_sysinfo(); $rv .= nav_link_sysstat(); $rv .= $menu->{'after'} if ($menu->{'after'}); $rv .= nav_theme_links(); $rv .= nav_links($menu->{'mode'}); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_cloudmin_menu { my ($page) = @_; my $mod = 'server-manager'; my $def = nav_get_server_id($mod); my @menu = list_combined_webmin_menu({ 'server' => "$def" }, \%in, $mod); my $menu = nav_list_combined_menu([$mod], \@menu, undef, undef, $page); my $rv = $menu->{'before'}; $rv .= nav_link_sysinfo(); $rv .= nav_theme_links(); $rv .= nav_links($menu->{'mode'}); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_mailbox_menu { my ($page) = @_; my $mod = 'mailbox'; my $nofolders = $theme_config{'settings_mail_ui'} ne 'false' ? 1 : 0; my @menu = list_combined_webmin_menu({ 'nofolders' => $nofolders }); my $menu = nav_list_combined_menu([$mod, 'changepass'], \@menu, undef, undef, $page); my $rv = $menu->{'before'}; $rv .= nav_menu_link("/uconfig.cgi?$mod", $theme_text{'theme_left_mail_prefs'}, 'fa-cog'); $rv .= nav_link_sysinfo('user'); $rv .= nav_theme_links(); $rv .= nav_links(); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_menu { my ($tab_mode) = @_; my ($tab, $page) = nav_detector(); my $rv; if ($tab eq 'cloudmin' || $tab_mode eq 'cloudmin') { $rv = nav_cloudmin_menu($page); } elsif ($tab eq 'virtualmin' || $tab_mode eq 'virtualmin') { $rv = nav_virtualmin_menu($page); } elsif ($tab eq 'webmail') { $rv = nav_mailbox_menu($page); } else { $rv = nav_webmin_menu($page); } return $rv; } sub nav_get_server_id { my ($module) = @_; my $default; # Try to find default my $module_ = $module eq 'virtual-server' ? 'virtualmin' : $module eq 'server-manager' ? 'cloudmin' : $module; if ($theme_config{ 'settings_right_' . $module_ . '_default' } =~ /^(\d+)$/) { $default = "$1"; } # If we have goto substitute default if ($server_x_goto =~ /\/$module\// && ($server_x_goto =~ /dom=(\d+)/ || $server_x_goto =~ /id=(\d+)/)) { my $id_ = "$1"; if ($id_ =~ /^(\d+)$/) { $default = "$id_"; } } return $default; } sub nav_detect_page { my ($page) = @_; my $rv; if ($page) { $page = quote_escape($page); $page =~ s/&/&/g; $rv .= "<li data-goto=\"$page\" class=\"hidden\"></li>\n"; } return $rv; } sub nav_detect_script { # Get goto hidden li element my $rv; if ($server_x_goto) { my $link = quote_escape($server_x_goto); $link =~ s/&/&/g; $rv = "<li data-script-goto><script>plugins.navigation.detect(\"$link\");plugins.navigation.detect(\"$link\", 1);\$(\"li[data-script-goto]\").remove();</script></li>\n"; } return $rv; } sub nav_menu_link { my ($link, $text, $icon, $hidden, $after) = @_; my $external_link = ($link =~ /^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/)/); if ($icon !~ /\s+/) { $icon = "fa fa-fw $icon"; } if ($after) { $after = " data-after"; } if ($hidden) { $hidden = " hidden"; } $link = "/$link" if (!$external_link && $link !~ /^\//); $link = ($external_link ? $link : "$theme_webprefix$link"); return "<li data-linked$after><a href=\"$link\" class=\"navigation_module_trigger$hidden\"><i class=\"$icon\"></i> <span>$text</span></a></li>\n"; } sub nav_cat_link { my ($link, $label, $hidden) = @_; my $rv; my $external_link = ($link =~ /^(http:\/\/|https:\/\/|ftp:\/\/|ftps:\/\/)/); $link = "/$link" if (!$external_link && $link !~ /^\//); $rv = '<li data-linked' . ($hidden && ' class="hidden"') . '>' . "\n"; $rv .= '<a' . ($hidden && ' data-parent-hidden') . ' href="' . ($external_link ? $link : "$theme_webprefix$link") . '"> ' . $label . '</a>' . "\n"; $rv .= "</li>\n"; return $rv; } sub nav_cat { my ($c, $label) = @_; my %icon_table = ('webmin' => 'fa-cog', 'usermin' => 'fa-cog', 'settings' => 'fa-cog', 'global_setting' => 'fa-cog', 'cat_settings' => 'fa-cog', 'system' => 'fa2 fa2-system', 'cat_system' => 'fa2 fa2-system', 'servers' => 'fa2 fa2-server', 'other' => 'fa2 fa2-tools', 'info' => 'fa-info', 'hardware' => 'fa2 fa2-disk', 'global_hardware' => 'fa2 fa2-disk', 'global_storage' => 'fa2 fa2-disk', 'cluster' => 'fa2 fa2-cluster', 'global_cluster' => 'fa-power-off', 'unused' => 'fa-puzzle-piece', 'global_unused' => 'fa-puzzle-piece', 'mail' => 'fa2 fa2-email scaled1_5', 'global_mail' => 'fa2 fa2-email scaled1_5', 'email' => 'fa2 fa2-email scaled1_5', 'global_email' => 'fa2 fa2-email scaled1_5', 'login' => 'fa-user', 'global_login' => 'fa-user', 'apps' => 'fa2 fa2-server', 'global_apps' => 'fa2 fa2-server', 'custom' => 'fa2 fa2-system', 'global_custom' => 'fa2 fa2-system', 'net' => 'fa2 fa2-network', 'ip' => 'fa2 fa2-network', 'global_ip' => 'fa2 fa2-network', 'check' => 'fa-user-md', 'global_check' => 'fa-user-md', 'add' => 'fa-plus', 'global_add' => 'fa-plus', 'backup' => 'fa-backup fa-1_15x', 'global_backup' => 'fa-backup fa-1_15x', 'global_server', => 'fa-cogs', 'cat_server', => 'fa-cogs', 'global_system' => 'fa-cogs', 'global_delete' => 'fa-plug', 'cat_delete' => 'fa-plug', 'global_logs' => 'fa-file-text', 'cat_logs' => 'fa-file-text', 'global_services' => 'fa-puzzle-piece', 'cat_services' => 'fa-puzzle-piece', 'create_new' => 'fa-plus', 'create_add' => 'fa-plus', 'create_create' => 'fa-server-add', 'global_gce' => 'fa-google', 'global_ec2' => 'fa2 fa2-amazon scaled1_5', 'global_hosts' => 'fa-globe', 'global_virtualmin' => 'fa-virtualmin scaled1_5', 'global_owners' => 'fa-users', 'global_monitor' => 'fa2 fa2-system', 'global_settings' => 'fa-cloud', 'cat_manage' => 'fa2 fa2-tools', 'cat_res' => 'fa-share-alt', 'global_admin' => 'fa-key', 'cat_admin' => 'fa-key', 'global_power' => 'fa-power-off', 'cat_power' => 'fa-power-off', 'cat_webmin' => 'fa-webmin webmin-cat-menu',); my $icon = $icon_table{$c} || 'fa-link'; if ($label) { my $rv; # Show link to close or open catgory $rv = "<li class=\"has-sub\">\n"; $rv .= "<a data-has-sub-link href=\"#$c\">"; $rv .= "<i class=\"fa $icon fa-fw\"></i> <span>$label</span></a>\n"; $rv .= '</li>' . "\n"; return $rv; } } sub nav_search { my $rv = "<li><br></li>"; if (-r "$root_directory/webmin_search.cgi" && $gaccess{'webminsearch'}) { $rv = "<li class=\"menu-container search-form-container\">\n"; $rv .= "<form id=\"webmin_search_form\" action=\"$theme_webprefix/webmin_search.cgi\" role=\"search\">\n"; $rv .= "<div class=\"form-group\">\n"; $rv .= "<input type=\"text\" class=\"form-control sidebar-search\" name=\"search\" placeholder=\"$theme_text{'left_search'}\">\n"; $rv .= "<i class=\"fa fa-search\"></i>\n"; $rv .= "</div>\n"; $rv .= "</form>\n</li>\n"; } return $rv; } sub nav_link_sysinfo { my ($user) = @_; return nav_menu_link('/sysinfo.cgi', $user ? $theme_text{'body_header1'} : $theme_text{'theme_xhred_titles_dashboard'}, ($user ? 'fa-user-circle' : 'fa-dashboard'), $theme_config{'settings_sysinfo_link_mini'} eq 'true', 1) if (dashboard_switch() ne '1'); } sub nav_link_sysstat { my $link; if (&webmin_user_is_admin()) { if (-d $root_directory . "/virtual-server/pro/timeplot") { $link = 'virtual-server/pro'; } elsif (-d $root_directory . "/server-manager/timeplot") { $link = 'server-manager'; } if ($link) { return nav_menu_link("/$link/history.cgi", $theme_text{'left_statistics'}, 'fa-area-chart', 0, 1); } } } sub nav_link_netdata { my $link; if (&webmin_user_is_admin()) { if (has_command('netdata') && $theme_config{'settings_leftmenu_netdata'} ne 'false') { ($theme_config{'settings_leftmenu_netdata_link'} ? ($link = $theme_config{'settings_leftmenu_netdata_link'}) : ($link = 'http://' . get_system_hostname() . ':19999')); } if ($link) { my $rv; $rv = "<li data-after class=\"leftmenu_netdata_link\">\n"; $rv .= "<a target=\"_blank\" href=\"$link\" class=\"navigation_external_link leftmenu_netdata_link\">\n"; $rv .= "<i class=\"fa fa-fw fa-line-chart\"></i> <span>$theme_text{'left_netdata'}</span>\n"; $rv .= "</a></li>\n"; return $rv; } } } sub nav_theme_links { my $extra = $theme_config{'settings_leftmenu_custom_links'}; my $rv = ""; if ($extra) { $extra = replace('\'', '"', un_urlize($extra, 1)); if ($extra && $extra =~ m/"extra":/) { my ($extra) = $extra =~ /\{(?:\{.*\}|[^{])*\}/sg; my $extra_json = convert_from_json($extra); foreach my $e (@{ $extra_json->{'extra'} }) { if (length($e->{"link"}) && (!length($e->{"level"}) || string_contains($e->{"level"}, $get_user_level))) { my $target = $e->{"target"}; if ($target) { $target = " target=\"$target\""; } if ($e->{"port"}) { my $host = get_env('http_host'); $host =~ s/:(\d+)$/:$e->{'port'}/; $e->{"link"} = "//$host$e->{'link'}"; } my $type = string_contains($e->{'link'}, '//') ? '' : 'data-linked'; my $type_class = $type ? "navigation_module_trigger" : "navigation_external_link"; $rv .= '<li ' . $type . ' data-after><a ' . $target . ' href="' . $e->{"link"} . '" class="' . $type_class . '"><i class="fa fa-fw fa-' . $e->{"icon"} . '"></i> <span>'; utf8::encode($e->{'title'}); $rv .= $e->{'title'}; $rv .= '</span></a></li>'; } } } } return $rv; } # Return HTML menu structure for given module sub nav_list_combined_menu { my ($modules, $items, $id, $group, $page) = @_; my ($nav_pos, $extra_links, $rv, $rv_after, $login_mode); my $gwp = sub { my ($link) = @_; # Link could but shouldn't end with just & $link =~ s/&$//; if ($link) { if (!string_starts_with($link, "http") && !string_starts_with($link, "ftp") && !string_starts_with($link, "www") && !string_starts_with($link, "../")) { $link = "/$link" if (!string_starts_with($link, "/")); $link = "$theme_webprefix$link" if ($link !~ /^\Q$theme_webprefix\E/); } } return $link; }; foreach my $item (@$items) { if ((grep {$_ eq $item->{'module'}} @{$modules}) || $group) { my $link = &$gwp($item->{'link'}); my $icon; my $rv_after_local; if ($item->{'type'} eq 'item' && $link !~ /virtual-server\/pro\/history\.cgi/) { # Define an icon for the link/accordion if ($link =~ /virtual-server\/index\.cgi/ || $link =~ /server-manager\/index\.cgi/) { $icon = '<i class="fa fa-fw fa-tasks"></i>'; } elsif ($link =~ /\/virtual-server\/edit_newvalidate\.cgi/ && !&webmin_user_is_admin()) { $icon = '<i class="fa fa-fw fa-user-md"></i>'; } elsif ($link =~ /mailbox\/list_folders\.cgi/ || $link =~ /mailbox\/list_ifolders\.cgi/) { $icon = '<i class="fa fa-fw fa-folder"></i>'; } elsif ($link =~ /mailbox\/list_addresses\.cgi/) { $icon = '<i class="fa fa-fw fa-address-book"></i>'; } elsif ($link =~ /filter\/edit_forward\.cgi/) { $icon = '<i class="fa fa-fw fa-share"></i>'; } elsif ($link =~ /filter\/edit_auto\.cgi/) { $icon = '<i class="fa fa-fw fa-reply-all"></i>'; } elsif ($link =~ /filter/) { $icon = '<i class="fa fa-fw fa-filter"></i>'; } elsif ($link =~ /mailbox\/edit_sig\.cgi/) { $icon = '<i class="fa fa-fw fa-pencil"></i>'; } elsif ($link =~ /mailbox\/index\.cgi?id=/) { $icon = '<i class="fa fa-fw fa-folder-o"></i>'; } elsif ($link =~ /\/#demo_history$/) { $icon = '<i class="fa fa-fw fa-area-chart"></i>'; $rv_after_local = $link; } if ($get_user_level == 1) { if ($link =~ /\/virtual-server\/edit_pass\.cgi/ && $link !~ /\/virtual-server\/edit_pass\.cgi\?/) { $icon = '<i class="fa fa-fw fa-key"></i>'; } elsif ($link =~ /\/virtual-server\/edit_newplan\.cgi/) { $icon = '<i class="fa fa-fw fa-list"></i>'; } elsif ($link =~ /\/virtual-server\/edit_newresels\.cgi/) { $icon = '<i class="fa fa-fw fa-cog"></i>'; } elsif ($link =~ /\/virtual-server\/bwgraph\.cgi/ && $id ne 'cat_logs') { $icon = '<i class="fa fa-fw fa-line-chart"></i>'; } } if ($link =~ /\/virtual-server\/domain_form\.cgi/) { $icon = '<i class="fa fa-fw fa-server-add"></i>'; } elsif ($link =~ /\/virtual-server\/edit_domain\.cgi/ || $link =~ /\/server-manager\/edit_serv\.cgi/) { $icon = '<i class="fa fa-fw fa2 fa2-settings"></i>'; } elsif ($link =~ /\/virtual-server\/view_domain\.cgi/) { $icon = '<i class="fa fa-fw fa-info-circle"></i>'; } elsif ($link =~ /\/virtual-server\/list_users\.cgi/) { $icon = '<i class="fa fa-fw fa2 fa2-users-cog"></i>'; } elsif ($link =~ /\/virtual-server\/list_aliases\.cgi/) { $icon = '<i class="fa fa-fw fa2 fa2-maillist"></i>'; } elsif ($link =~ /\/virtual-server\/list_databases\.cgi/) { $icon = '<i class="fa fa-fw fa-database"></i>'; } elsif ($link =~ /\/virtual-server\/list_scripts\.cgi/ || $link =~ /\/server-manager\/mass_update_form\.cgi/) { $icon = '<i class="fa fa-fw fa-update scaled1"></i>'; } elsif ($link =~ /\/filemin\/index\.cgi/) { $icon = '<i class="fa fa-fw fa-file-manager scaled2"></i>'; } elsif ($link =~ /\/virtual-server\/edit_html\.cgi/) { $icon = '<i class="fa fa-fw fa-globe"></i>'; } elsif ($link =~ /\/server-manager\/edit_pass\.cgi/ || $link =~ /\/virtual-server\/edit_pass\.cgi$/ || $link =~ /\/changepass\/$/) { $icon = '<i class="fa fa-fw fa-key"></i>'; } elsif ($link =~ /\/server-manager\/save_serv\.cgi/ && $link =~ /recheck=1/) { $icon = '<i class="fa fa-fw fa-exclamation-triangle"></i>'; } elsif ($link =~ /\/server-manager\/create_form\.cgi/ && !$group) { $icon = '<i class="fa fa-fw fa-server-add"></i>'; } elsif ($link =~ /\/server-manager\/save_serv\.cgi/) { if ($link =~ /refresh=1/) { $icon = '<i class="fa fa-fw fa-refresh"></i>'; } elsif ($link =~ /regen=1/) { $icon = '<i class="fa fa-fw fa-retweet"></i>'; } } elsif ( ($link =~ /^http:\/\// || $link =~ /^https:\/\// || $link =~ /^ftp:\/\// || $link =~ /^ftps:\/\//) && $link !~ /virtualmin\.com\/professional/) { $icon = '<i class="fa fa-fw fa-external-link"></i>'; } elsif ($link =~ /\.\.\/servers\/link\.cgi/) { $icon = '<i class="fa fa-fw fa-webmin scaled1_5"></i>'; } # Print Virtual Server Summary link my $print_server_summary = sub { my ($dom_id) = @_; return '<li data-linked><a target="page" class="navigation_module_trigger" href="' . $theme_webprefix . '/virtual-server/summary_domain.cgi?dom=' . $dom_id . '"><i class="fa fa-fw fa-info-circle"></i> <span>' . $theme_text{'right_vm_server_summary'} . '</span></a></li>' . "\n"; }; if ((&webmin_user_is_admin() || $get_user_level eq '1') && $link =~ /\/virtual-server\/domain_form\.cgi/ && nav_virtualmin_domain_available_count()) { my $dom_id = $item->{'link'}; $dom_id =~ /gparent=(\d+)/; $dom_id = $1; if ($dom_id) { $rv .= &$print_server_summary($dom_id); } } # Set variable in case it hasn't been set before if (!length $link) { $icon = undef; } my $rv_; $rv_ = '<li' . ($item->{'inactive'} ? " data-link-inactive" : "") . ' data-linked' . ( $item->{'target'} ? ' class="navigation_external"' : '' ) . '>' . "\n"; $rv_ .= '<a ' . ($link !~ /switch_user/ ? ' target="' . ($item->{'target'} ? '_blank' : 'page') . '" ' : '') . ' ' . ( (!$group && !$item->{'target'}) ? "class=\"navigation_module_trigger\" " : '' ) . 'href="' . $link . '">' . ($icon =~ /<i/ ? $icon : '') . ' <span>' . $item->{'desc'} . '</span></a>' . "\n"; $rv_ .= '</li>' . "\n"; $rv_ .= "\n"; if ($rv_after_local) { $rv_after .= $rv_; } else { $rv .= $rv_; } } elsif ($item->{'type'} eq 'html') { $rv .= '<li class="menu-container menu-status"><span class="badge"><i class="fa2 fa-fw fa2-pulsate"></i>' . $item->{'html'} . '</span></li>'; } elsif ($item->{'type'} eq 'text' && $item->{'desc'}) { if ($login_mode++ == 1) { $login_mode = "<span><strong>$theme_text{'theme_global_access_level'}</strong>: <em>@{[html_escape($item->{'desc'})]}</em></span>"; } } elsif ($item->{'type'} eq 'cat') { $rv .= nav_cat($item->{'id'}, $item->{'desc'}); $rv .= '<li class="sub-wrapper"><ul class="sub" style="display: none;" id="' . $item->{'id'} . '">' . "\n"; my $menu = nav_list_combined_menu([$item->{'module'}], $item->{'members'}, $item->{'id'}, 'group'); $rv .= $menu->{'before'}; if (($item->{'id'} eq 'global_setting' || $item->{'id'} eq 'global_settings') && &webmin_user_is_admin() && !$extra_links++) { $rv .= nav_cat_link("/tconfig.cgi", $theme_text{'settings_right_theme_left_configuration_title'}, 'hidden'); $rv .= nav_cat_link("/settings-editor_read.cgi", $theme_text{'settings_right_theme_left_extensions_title'}, 'hidden'); $rv .= nav_cat_link("/settings-logos.cgi", $theme_text{'settings_right_theme_left_logo_title'}, 'hidden'); $rv .= nav_cat_link("/settings-backgrounds.cgi", $theme_text{'theme_xhred_settings_right_theme_bgs_title'}, 'hidden'); if (check_pro_package('vm') eq '1' && $item->{'module'} eq 'virtual-server') { $rv .= nav_cat_link("/virtual-server/licence.cgi", $theme_text{'right_vlcheck'}, 1); } if (check_pro_package('cm') eq '1' && $item->{'module'} eq 'server-manager') { $rv .= nav_cat_link("/server-manager/licence.cgi", $theme_text{'right_slcheck'}, 1); } } elsif (!&webmin_user_is_admin() && $theme_config{'settings_theme_config_admins_only_privileged'} ne 'true' && !$extra_links++) { $rv .= nav_cat_link("/tconfig.cgi", $theme_text{'settings_right_theme_left_configuration_title'}, 1); } $rv .= "</ul></li>\n"; } elsif ($item->{'type'} eq 'hr') { if ($nav_pos++ eq '1') { $rv .= nav_search(); } } elsif (($item->{'type'} eq 'menu' || $item->{'type'} eq 'input') && $item->{'module'} ne 'mailbox') { # For with an input of some kind if ($item->{'cgi'}) { $rv .= "<li class=\"menu-container\"><form action='$item->{'cgi'}'>\n"; } else { $rv .= "<li class=\"menu-container\"><form>\n"; } foreach my $h (@{ $item->{'hidden'} }) { $rv .= ui_hidden(@$h); } $rv .= $item->{'desc'}, "\n"; if ($item->{'type'} eq 'menu' || $item->{'type'} eq 'input') { if ($item->{'name'} eq 'dname' && $item->{'module'} eq 'virtual-server') { # Force select type $item->{'name'} = 'dom'; $item->{'value'} = $item->{'domid'}; # Regenerate data for select $item->{'menu'} = [ map { [$_->{'id'}, virtual_server::shorten_domain_name($_), "title=\"" . virtual_server::show_domain_name($_) . "\""] } grep {virtual_server::can_edit_domain($_)} sort {$a->{'dom'} cmp $b->{'dom'}} virtual_server::list_domains()]; } my $data_title = $item->{'module'} eq 'virtual-server' ? $theme_text{'right_fdoms'} : $theme_text{'right_fvm2'}; my $select_width = ($theme_config{'settings_leftmenu_width'} - 11 * 2); my $style = "data-autocomplete-title=\"$data_title\" style=\"width:${select_width}px;\""; # Build select menu $rv .= ui_select($item->{'name'}, $item->{'value'}, $item->{'menu'}, 1, 0, 0, 0, $style); } $rv .= "</form></li>\n"; } } } return { 'before' => $rv, 'after' => $rv_after, 'mode' => $login_mode }; } # Returns a list of tiny square buttons for navigation menu sub nav_links { my ($login_mode) = @_; my $rv; $rv = '<li class="menu-container"><ul class="user-links"><li data-collapse-trigger-container data-linked' . get_button_tooltip('theme_xhred_tooltip_navigation_pinned', 'settings_hotkey_navigation', 'auto top') . ' class="user-link cursor-pointer' . ($theme_config{'settings_collapse_navigation_link'} eq 'false' && ' hidden') . '">'; $rv .= '<span><i data-collapse-trigger="1" class="fa fa2 fa-fw fa2-collapse-left"></i></span>'; $rv .= '</li>'; if ($theme_config{'settings_sysinfo_link_mini'} eq 'true' && dashboard_switch() ne '1') { $rv .= '<li data-linked' . get_button_tooltip('theme_xhred_titles_dashboard', 'settings_hotkey_sysinfo', 'auto top') . ' class="user-link">'; $rv .= '<a class="menu-exclude-link sidebar_sysinfo_link" href="' . $theme_webprefix . '/sysinfo.cgi"><i class="fa fa-fw fa-' . ($get_user_level eq '3' ? 'user-circle' : 'dashboard') . '"></i></a>'; $rv .= '</li>'; } $rv .= '<li data-linked' . get_button_tooltip('theme_tooltip_night_mode', 'settings_hotkey_toggle_key_night_mode', 'auto top') . ' class="user-link palette-toggle cursor-pointer' . ( $theme_config{'settings_show_night_mode_link'} ne 'false' ? '' : ' hidden' ) . '">'; $rv .= '<span><i class="fa fa-fw ' . (theme_night_mode() ? 'fa-sun' : 'fa-moon') . '"></i></span>'; $rv .= '</li>'; if ($theme_config{'settings_show_terminal_link2'} ne 'false' && foreign_available("shell")) { $rv .= '<li data-linked' . get_button_tooltip('theme_tooltip_terminal_link2', 'settings_hotkey_shell2', 'auto top') . ' class="user-link ported-console cursor-pointer">'; $rv .= '<span><i class="fa fa-fw fa-terminal"></i></span>'; $rv .= '</li>'; } $rv .= '<li data-linked' . get_button_tooltip('left_favorites', 'settings_hotkey_favorites', 'auto top') . ' class="user-link favorites cursor-pointer' . ($theme_config{'settings_favorites'} ne 'false' ? '' : ' hidden') . '">'; $rv .= '<span><i class="fa fa-fw fa-star"></i></span>'; $rv .= '</li>'; if ((&webmin_user_is_admin() && $theme_config{'settings_theme_options_button'} ne 'false') || (!&webmin_user_is_admin() && $theme_config{'settings_theme_config_admins_only_privileged'} ne 'true' && $theme_config{'settings_theme_options_button'} ne 'false')) { my $tooltip = get_button_tooltip('settings_title', 'settings_hotkey_open_module_config_privileged', 'auto top'); $rv .= "<li $tooltip data-linked class=\"user-link theme-options cursor-pointer\">"; $rv .= '<a class="menu-exclude-link" href="' . $theme_webprefix . '/tconfig.cgi" data-href="' . $theme_webprefix . '/tconfig.cgi"><i class="fa2 fa-fw fa2-palette"></i></a>'; $rv .= '</li>'; } if (&foreign_available("change-user") && $theme_config{'settings_leftmenu_button_language'} eq 'true') { $rv .= '<li data-linked' . get_button_tooltip('theme_xhred_title_language_locale', undef, 'auto top') . ' class="user-link"><a class="menu-exclude-link" href="' . $theme_webprefix . '/change-user"><i class="fa fa-fw fa-globe"></i></a></li>'; } my $foreign_acl = &foreign_available("acl"); my $user_mode = get_product_name() eq 'usermin'; my $edit_user = ($foreign_acl ? ("<hr class='hr-no-margin hr-darker'>" . $theme_text{'theme_tooltip_edit_user'}) : undef); my $title_proc; if (!$user_mode && $login_mode && $login_mode !~ /^\d+$/) { $title_proc = $login_mode . $edit_user; } else { $title_proc = $foreign_acl ? $theme_text{'theme_tooltip_edit_user'} : ( get_product_name() eq 'usermin' ? "<span><strong>$theme_text{'theme_global_access_level'}</strong>: <em>$theme_text{'theme_global_user_mode'}</em></span>" : undef); } my $user_title = get_button_tooltip($title_proc, undef, 'auto top', 1, undef, "aside"); my $menu_elem_br; my $menu_width = $theme_config{'settings_leftmenu_width'}; my $button_width = 26; my $button_margin = 2; my $char_width = 5.73; my $menu_lnk_colla = $theme_config{'settings_collapse_navigation_link'} eq 'true'; my $menu_lnk_dashb = $theme_config{'settings_sysinfo_link_mini'} eq 'true'; my $menu_lnk_night = $theme_config{'settings_show_night_mode_link'} eq 'true'; my $menu_lnk_term = $theme_config{'settings_show_terminal_link2'} eq 'true'; my $menu_lnk_favor = $theme_config{'settings_favorites'} eq 'true'; my $menu_lnk_themeconf = $theme_config{'settings_theme_options_button'} eq 'true'; my $menu_lnk_lang = $theme_config{'settings_leftmenu_button_language'} eq 'true'; my $menu_lnk_refresh = $theme_config{'settings_leftmenu_button_refresh'} eq 'true'; # Link buttons widths my $menu_width_needed = 0; foreach my $e ( ($menu_lnk_colla, $menu_lnk_dashb, $menu_lnk_night, $menu_lnk_term, $menu_lnk_favor, $menu_lnk_themeconf, $menu_lnk_lang, $menu_lnk_refresh)) { if ($e) { $menu_width_needed += ($button_width + $button_margin); } } # User button link $menu_width_needed += ($button_width + (4 * $button_margin)) + int($char_width * length($remote_user)); # Logout button link $menu_width_needed += $button_width; # Servers index menu $menu_width_needed += $button_width * 2 if ($theme_server_webprefix); if ($menu_width - $menu_width_needed < $button_width - $button_margin) { $menu_elem_br = '<li class="flex-br"></li>'; } my $cursor_def = !$foreign_acl ? ' cursor-default' : undef; $rv .= "$menu_elem_br<li $user_title class=\"user-link user-link-acl$cursor_def\">"; if ($foreign_acl) { $rv .= '<a class="menu-exclude-link" data-href="' . $theme_webprefix . '/acl/edit_user.cgi" href="' . $theme_webprefix . '/acl/edit_user.cgi?user=' . (get_env('base_remote_user') eq "root" ? "root" : $remote_user) . '"><i class="fa2 fa-fw ' . get_user_icon() . '"></i> <span>' . $remote_user . '</span></a>'; } else { $rv .= '<a class="menu-exclude-link cursor-default no-hover"><i class="fa2 fa-fw ' . get_user_icon() . '"></i> <span class="pointer-events-none">' . $remote_user . '</span></a>'; } $rv .= '</li>'; my %miniserv; &get_miniserv_config(\%miniserv); if ($miniserv{'logout'} && !get_env('ssl_user') && get_env('http_user_agent') !~ /webmin/i) { my $tooltip = get_button_tooltip(($main::session_id ? 'theme_tooltip_logout' : 'theme_xhred_tooltip_switch_user'), undef, 'auto top'); $rv .= "<li $tooltip class=\"user-link __logout-link\">"; if ($main::session_id) { $rv .= '<a data-nref class="menu-exclude-link" href="' . $theme_webprefix . '/session_login.cgi?logout=1"><i class="fa fa-fw fa-sign-out text-danger"></i></a>'; } else { $rv .= '<a data-nref class="menu-exclude-link" href="' . $theme_webprefix . '/switch_user.cgi"><i class="fa fa-fw fa-exchange text-danger"></i></a>'; } $rv .= '</li>'; } else { if ($theme_server_webprefix) { my $master_link = get_env('http_webmin_servers'); my $tooltip_go_to_master = get_button_tooltip('tooltip_back_to_servers_index_master', undef, 'auto top'); my $tooltip_other_servers = get_button_tooltip('tooltip_list_other_servers', undef, 'auto top'); $rv .= "<li class=\"user-link servers-index-link\">"; $rv .= '<a ' . $tooltip_go_to_master . ' data-nref class="menu-exclude-link" href="' . $master_link . '?' . $xnav . '"><i class="fa fa-fw fa2 fa2-server"></i></a>'; $rv .= ' <div data-http-webmin-servers="' . $master_link . '" ' . $tooltip_other_servers . ' class="popover-trigger hidden"> <a data-servers-index="popover"> <span class="popover-trigger-toggle" type="button" data-toggle="popover-trigger"> <span class="caret-" href="#">▼</span> </span> </a> </div> </li>'; } } $rv .= '<li data-linked' . get_button_tooltip('theme_xhred_filemanager_context_refresh', 'settings_hotkey_reload', 'auto top') . ' class="user-link' . ($theme_config{'settings_leftmenu_button_refresh'} ne 'true' && ' hidden') . '"><a class="menu-exclude-link" data-refresh="true" style="cursor: pointer"><i class="fa fa-fw fa-refresh"></i></a></li>'; $rv .= '</ul></li>'; $rv .= "\n"; return $rv; } # XXX - needs further refactor sub print_switch_webmin { my ($tab) = @_; my $prod = get_product_name(); my $checked = 0; if ($tab eq $prod) { $checked = 1; } print '<input class="dynamic" id="open_' . $prod . '" name="product-switcher" type="radio"' . ($checked ? " checked" : "") . '> <label' . get_button_tooltip( (get_product_name() eq 'usermin' ? 'theme_xhred_titles_um' : 'theme_xhred_titles_wm' ), 'settings_hotkey_toggle_key_' . get_product_name() . '', 'auto bottom' ) . ' for="open_' . get_product_name() . '"> <i class="wbm-webmin wbm-sm"></i><span>' . (&get_product_name() eq 'webmin' ? $theme_text{'theme_xhred_titles_wm'} : $theme_text{'theme_xhred_titles_um'} ) . '</span></label>'; } # XXX - needs further refactor sub print_switch_dashboard { my ($tab) = @_; my $checked = 0; if ($tab eq 'dashboard') { $checked = 1; } print '<input class="dynamic" id="open_dashboard" name="product-switcher" type="radio"' . ($checked ? " checked" : "") . '> <label' . get_button_tooltip('theme_xhred_titles_dashboard', 'settings_hotkey_sysinfo', 'auto right') . ' for="open_dashboard" style="padding-top: 1px;"> <i class="fa fa-stack fa-dashboard"></i><span>' . $theme_text{'theme_xhred_titles_dashboard'} . '</span></label>'; } # XXX - needs further refactor sub print_switch_virtualmin { my ($tab) = @_; my $checked = 0; if ($tab eq 'virtualmin') { $checked = 1; } print '<input class="dynamic" id="open_virtualmin" name="product-switcher" type="radio"' . ($checked ? " checked" : "") . '> <label' . get_button_tooltip('theme_xhred_titles_vm', 'settings_hotkey_toggle_key_virtualmin', 'auto right') . ' for="open_virtualmin"> <i class="wbm-virtualmin wbm-sm"></i><span>' . $theme_text{'theme_xhred_titles_vm'} . '</span></label>'; } # XXX - needs further refactor sub print_switch_cloudmin { my ($tab) = @_; my $checked = 0; if ($tab eq 'cloudmin') { $checked = 1; } print '<input class="dynamic" id="open_cloudmin" name="product-switcher" type="radio"' . ($checked ? " checked" : "") . '> <label' . get_button_tooltip('theme_xhred_titles_cm', 'settings_hotkey_toggle_key_cloudmin', 'auto right') . ' for="open_cloudmin"> <i class="wbm-cloudmin wbm-sm"></i><span>' . $theme_text{'theme_xhred_titles_cm'} . '</span></label>'; } # XXX - needs further refactor sub print_switch_webmail { my ($tab) = @_; my $checked = 0; if ($tab eq 'webmail') { $checked = 1; } print '<input class="dynamic" id="open_webmail" name="product-switcher" type="radio"' . ($checked ? " checked" : "") . '> <label' . get_button_tooltip('theme_xhred_titles_mail', 'settings_hotkey_toggle_key_webmail', 'auto right') . ' for="open_webmail"> <i class="fa fa-stack fa-envelope"></i> <span>' . $theme_text{'theme_xhred_titles_mail'} . '</span></label>'; } # XXX - needs further refactor sub print_switch { my ($t_var_switch_m, $t_var_product_m); if (&get_product_name() eq 'usermin' && &foreign_available("mailbox")) { $t_var_switch_m = '2'; $t_var_product_m = '4'; } elsif (!&foreign_available("virtual-server") && !&foreign_available("server-manager") || &get_product_name() eq 'usermin' || $get_user_level eq '2') { $t_var_switch_m = '2'; $t_var_product_m = '1'; } elsif (&foreign_available("virtual-server") && &foreign_available("server-manager")) { $t_var_switch_m = '3'; $t_var_product_m = '3'; } elsif (&foreign_available("virtual-server") || &foreign_available("server-manager") && (!&foreign_available("virtual-server") || !&foreign_available("server-manager"))) { $t_var_switch_m = '2'; $t_var_product_m = '2'; } my $o = ($theme_config{'settings_switch_rdisplay'} ne 'true' ? 'd' : 'r'); my ($tab, $page) = nav_detector(); print '<div class="switch-toggle switch-' . $t_var_switch_m . ' switch-mins">'; if ($t_var_product_m eq '1') { if ($o eq 'd') { if ($get_user_level eq '2') { print_switch_virtualmin($tab); print_switch_dashboard($tab); } else { print_switch_webmin($tab); print_switch_dashboard($tab); } } else { if ($get_user_level eq '2') { print_switch_dashboard($tab); print_switch_virtualmin($tab); } else { print_switch_dashboard($tab); print_switch_webmin($tab); } } } if ($t_var_product_m eq '2') { if ($get_user_level eq '4') { if ($o eq 'd') { print_switch_cloudmin($tab); print_switch_dashboard($tab); } else { print_switch_dashboard($tab); print_switch_cloudmin($tab); } } else { if ($o eq 'd') { print_switch_webmin($tab); &foreign_available("virtual-server") ? print_switch_virtualmin($tab) : print_switch_cloudmin($tab); } else { &foreign_available("virtual-server") ? print_switch_virtualmin($tab) : print_switch_cloudmin($tab); print_switch_webmin($tab); } } } if ($t_var_product_m eq '3') { if ($o eq 'd') { print_switch_webmin($tab); print_switch_virtualmin($tab); print_switch_cloudmin($tab); } else { print_switch_cloudmin($tab); print_switch_virtualmin($tab); print_switch_webmin($tab); } } if ($t_var_product_m eq '4') { if ($o eq 'd') { print_switch_webmail($tab); print_switch_webmin($tab); } else { print_switch_webmin($tab); print_switch_webmail($tab); } } print '<a></a> </div><div class="toggle-space"></div>'; } # XXX - needs further refactor sub dashboard_switch { if ($get_user_level eq '2' || $get_user_level eq '4' || (!foreign_available("virtual-server") && !foreign_available("server-manager") && (get_product_name() ne 'usermin' || (get_product_name() eq 'usermin' && !foreign_available("mailbox"))))) { return 1; } else { return 0; } } sub nav_virtualmin_domain_available { my ($id, $type, $gkey) = @_; if (&foreign_available('virtual-server')) { &foreign_require("virtual-server", "virtual-server-lib.pl"); foreach my $dom (&virtual_server::list_visible_domains()) { if ($id eq $dom->{$type}) { return $gkey ? $dom->{$gkey} : $dom->{$type}; } } } } sub nav_virtualmin_domain_available_count { if (&foreign_available('virtual-server')) { &foreign_require("virtual-server", "virtual-server-lib.pl"); my %doms = virtual_server::list_visible_domains(); return scalar(keys %doms); } } sub nav_cloudmin_server_available { my ($id, $type, $gkey) = @_; if (&foreign_available('server-manager')) { &foreign_require("server-manager", "server-manager-lib.pl"); foreach my $host (&server_manager::list_managed_servers()) { if ($id eq $host->{$type}) { return $gkey ? $host->{$gkey} : $host->{$type}; } } } } sub nav_menu_html_snippet { my $rv; my $html_snippet = $theme_config{'settings_leftmenu_user_html'}; my $html_snippet_limited = $theme_config{'settings_leftmenu_user_html_privileged'}; $html_snippet =~ s/(<(\/|\s*)(html|head|meta|link|title|body).*?>)//g; if ($html_snippet_limited ne 'true' || ($html_snippet_limited eq 'true' && &webmin_user_is_admin())) { $rv = '<li class="menu-container"><ul class="user-html"><li class="user-html-string">'; $rv .= $html_snippet; $rv .= "</li></ul></li>"; } } 1;y~or5J={Eeu磝Qk ᯘG{?+]ן?wM3X^歌>{7پK>on\jy Rg/=fOroNVv~Y+ NGuÝHWyw[eQʨSb> >}Gmx[o[<{Ϯ_qFvM IENDB`