# # Authentic Theme (https://github.com/authentic-theme/authentic-theme) # Copyright Ilia Rostovtsev # 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_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 = $gconfig{'gotomodule'}; 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)); 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)) { # This is the single product switch mode $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); $rv .= nav_cat($menu->{'id'}, $menu->{'desc'}); $rv .= "
  • \n"; } 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 ($rv, $login_mode); my $mod = 'virtual-server'; my $def = nav_get_server_id($mod); my @menu = list_combined_webmin_menu({ 'dom' => "$def" }, \%in, $mod); ($rv, $login_mode) = nav_list_combined_menu([$mod], \@menu, undef, undef, $page); $rv .= nav_link_sysinfo(); $rv .= nav_link_sysstat(); $rv .= nav_theme_links(); $rv .= nav_links($login_mode); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_cloudmin_menu { my ($page) = @_; my ($rv, $login_mode); my $mod = 'server-manager'; my $def = nav_get_server_id($mod); my @menu = list_combined_webmin_menu({ 'server' => "$def" }, \%in, $mod); ($rv, $login_mode) = nav_list_combined_menu([$mod], \@menu, undef, undef, $page); $rv .= nav_link_sysinfo(); $rv .= nav_theme_links(); $rv .= nav_links($login_mode); $rv .= nav_menu_html_snippet(); $rv .= nav_detect_page($page); $rv .= nav_detect_script(); return $rv; } sub nav_mailbox_menu { my ($page) = @_; my $rv; my $mod = 'mailbox'; my $nofolders = $theme_config{'settings_mail_ui'} ne 'false' ? 1 : 0; my @menu = list_combined_webmin_menu({ 'nofolders' => $nofolders }); ($rv) = nav_list_combined_menu([$mod, 'changepass'], \@menu, undef, undef, $page); $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 .= "
  • \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 = "
  • \n"; } return $rv; } sub nav_menu_link { my ($link, $text, $icon, $hidden, $after) = @_; if ($icon !~ /\s+/) { $icon = "fa fa-fw $icon"; } if ($after) { $after = " data-after"; } if ($hidden) { $hidden = " hidden"; } return "
  • $text
  • \n"; } sub nav_cat_link { my ($link, $label, $hidden) = @_; my $rv; $rv = '\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 = "
  • \n"; $rv .= ""; $rv .= " $label\n"; $rv .= '
  • ' . "\n"; return $rv; } } sub nav_search { my $rv = "

  • "; if (-r "$root_directory/webmin_search.cgi" && $gaccess{'webminsearch'}) { $rv = "
  • \n"; $rv .= "
    \n"; $rv .= "
    \n"; $rv .= "\n"; $rv .= "\n"; $rv .= "
    \n"; $rv .= "
    \n
  • \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 ($get_user_level eq '0') { 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 ($get_user_level eq '0') { 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 = "
  • \n"; $rv .= "\n"; $rv .= " $theme_text{'left_netdata'}\n"; $rv .= "
  • \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 .= '
  • '; utf8::encode($e->{'title'}); $rv .= $e->{'title'}; $rv .= '
  • '; } } } } return $rv; } # Return HTML menu structure for given module sub nav_list_combined_menu { my ($modules, $items, $id, $group, $page) = @_; my $nav_pos; my $extra_links; my $login_mode; my $rv; 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")) { $link = "/$link" if (!string_starts_with($link, "/")); $link = "$theme_webprefix$link"; } } return $link; }; foreach my $item (@$items) { if ((grep {$_ eq $item->{'module'}} @{$modules}) || $group) { my $link = &$gwp($item->{'link'}); my $icon; 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 = ''; } elsif ($link =~ /\/virtual-server\/edit_newvalidate\.cgi/ && $get_user_level ne '0') { $icon = ''; } elsif ($link =~ /mailbox\/list_folders\.cgi/ || $link =~ /mailbox\/list_ifolders\.cgi/) { $icon = ''; } elsif ($link =~ /mailbox\/list_addresses\.cgi/) { $icon = ''; } elsif ($link =~ /filter\/edit_forward\.cgi/) { $icon = ''; } elsif ($link =~ /filter\/edit_auto\.cgi/) { $icon = ''; } elsif ($link =~ /filter/) { $icon = ''; } elsif ($link =~ /mailbox\/edit_sig\.cgi/) { $icon = ''; } elsif ($link =~ /mailbox\/index\.cgi?id=/) { $icon = ''; } if ($get_user_level == 1) { if ($link =~ /\/virtual-server\/edit_pass\.cgi/ && $link !~ /\/virtual-server\/edit_pass\.cgi\?/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/edit_newplan\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/edit_newresels\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/bwgraph\.cgi/ && $id ne 'cat_logs') { $icon = ''; } } if ($link =~ /\/virtual-server\/domain_form\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/edit_domain\.cgi/ || $link =~ /\/server-manager\/edit_serv\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/view_domain\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/list_users\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/list_aliases\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/list_databases\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/list_scripts\.cgi/ || $link =~ /\/server-manager\/mass_update_form\.cgi/) { $icon = ''; } elsif ($link =~ /\/filemin\/index\.cgi/) { $icon = ''; } elsif ($link =~ /\/virtual-server\/edit_html\.cgi/) { $icon = ''; } elsif ($link =~ /\/server-manager\/edit_pass\.cgi/ || $link =~ /\/virtual-server\/edit_pass\.cgi$/ || $link =~ /\/changepass\/$/) { $icon = ''; } elsif ($link =~ /\/server-manager\/save_serv\.cgi/ && $link =~ /recheck=1/) { $icon = ''; } elsif ($link =~ /\/server-manager\/create_form\.cgi/ && !$group) { $icon = ''; } elsif ($link =~ /\/server-manager\/save_serv\.cgi/) { if ($link =~ /refresh=1/) { $icon = ''; } elsif ($link =~ /regen=1/) { $icon = ''; } } elsif ($link =~ /^http:\/\// || $link =~ /^https:\/\// || $link =~ /^ftp:\/\// || $link =~ /^ftps:\/\//) { $icon = ''; } elsif ($link =~ /\/\.\.\/servers\/link\.cgi/) { $icon = ''; } # Print Virtual Server Summary link my $print_server_summary = sub { my ($dom_id) = @_; return '
  • ' . $theme_text{'right_vm_server_summary'} . '
  • ' . "\n"; }; if (($get_user_level eq '0' || $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; } $rv .= '
  • {'target'} ? ' class="navigation_external"' : '' ) . '>' . "\n"; $rv .= '{'target'}) ? "class=\"navigation_module_trigger\" " : '' ) . 'href="' . $link . '">' . ($icon =~ /' . $item->{'desc'} . '' . "\n"; $rv .= '
  • ' . "\n"; $rv .= "\n"; } elsif ($item->{'type'} eq 'html') { $rv .= ''; } elsif ($item->{'type'} eq 'text' && $item->{'desc'}) { if ($login_mode++ == 1) { $login_mode = "$theme_text{'theme_global_access_level'}:  @{[html_escape($item->{'desc'})]}"; } } elsif ($item->{'type'} eq 'cat') { $rv .= nav_cat($item->{'id'}, $item->{'desc'}); $rv .= '
  • \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 .= "
  • \n"; } else { $rv .= "
  • \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 .= "
  • \n"; } } } return ($rv, $login_mode); } # Returns a list of tiny square buttons for navigation menu sub nav_links { my ($login_mode) = @_; my $rv; $rv = ''; $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 ' ' . (&get_product_name() eq 'webmin' ? $theme_text{'theme_xhred_titles_wm'} : $theme_text{'theme_xhred_titles_um'} ) . ''; } # XXX - needs further refactor sub print_switch_dashboard { my ($tab) = @_; my $checked = 0; if ($tab eq 'dashboard') { $checked = 1; } print ' ' . $theme_text{'theme_xhred_titles_dashboard'} . ''; } # XXX - needs further refactor sub print_switch_virtualmin { my ($tab) = @_; my $checked = 0; if ($tab eq 'virtualmin') { $checked = 1; } print ' ' . $theme_text{'theme_xhred_titles_vm'} . ''; } # XXX - needs further refactor sub print_switch_cloudmin { my ($tab) = @_; my $checked = 0; if ($tab eq 'cloudmin') { $checked = 1; } print ' ' . $theme_text{'theme_xhred_titles_cm'} . ''; } # XXX - needs further refactor sub print_switch_webmail { my ($tab) = @_; my $checked = 0; if ($tab eq 'webmail') { $checked = 1; } print ' ' . $theme_text{'theme_xhred_titles_mail'} . ''; } # 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 '
    '; 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 '
    '; } # 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' && $get_user_level eq '0')) { $rv = '"; } } 1;