$arguments) { add_submenu_page($parent, $arguments['page_title'], $arguments['menu_title'], $capability, wtsec_getRoute($page), $arguments['function']); } add_submenu_page(null, WTSEC_LIBRARY_Localization::lmsg('sign_in'), WTSEC_LIBRARY_Localization::lmsg('sign_in'), 'manage_options', wtsec_getRoute('login'), 'wtsec_login'); add_submenu_page($parent, WTSEC_LIBRARY_Localization::lmsg('logout'), WTSEC_LIBRARY_Localization::lmsg('logout'), 'manage_options', wtsec_getRoute('logout'), 'wtsec_logout'); } else { $capability = 'manage_options'; foreach (wtsec_pages() as $page => $arguments) { add_submenu_page(null, $arguments['page_title'], $arguments['menu_title'], $capability, wtsec_getRoute($page), function () { wp_safe_redirect(wtsec_getUrl('login')); }); } add_submenu_page($parent, WTSEC_LIBRARY_Localization::lmsg('sign_in'), WTSEC_LIBRARY_Localization::lmsg('sign_in'), 'manage_options', wtsec_getRoute('login'), 'wtsec_login'); add_submenu_page(null, WTSEC_LIBRARY_Localization::lmsg('logout'), WTSEC_LIBRARY_Localization::lmsg('logout'), 'manage_options', wtsec_getRoute('logout'), 'wtsec_logout'); } } function wtsec_index_page() { $host = WTSEC_LIBRARY_WT::getOwnSite(); $services = []; if (!empty($host)) { $checks = WTSEC_LIBRARY_WT::getAllChecks($host['id']); foreach ($checks as $service => $site) { if (empty($site) || !is_array($site)) { continue; } switch ($service) { case "availability": $services["wa"] = [ // "pause" => wtsec_getStatusStartPauseIcon($site['config']['isActive'], $site['config']['id'], $host['id']), "pause" => "", "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "response_time" => ceil($site['responseTime'] / 1000000) . ' ' . WTSEC_LIBRARY_Localization::lmsg('ms'), "availability" => $site['percent'] . '%', "availability_percent" => $site['percent'], "downtime" => ceil($site['downTime'] / 1000000) . ' ' . WTSEC_LIBRARY_Localization::lmsg('ms'), "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.availability') ]; break; case "ssl": if ((int)$site['expiryDate'] === 0) { $days_left = 0; } else { $earlier = new DateTime(); $later = new DateTime($site['expiryDate']); $days_left = $later->diff($earlier)->format("%a"); } $services["ssl"] = [ "pause" => "", "information" => wtsec_getInformation($service, $site['status']), "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "days_left" => $days_left, "issue_date" => $site['issueDate'], "expiry_date" => $site['expiryDate'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.ssl') ]; break; case "domain": if ((int)$site['expiredDate'] === 0) { $days_left = 0; } else { $earlier = new DateTime(); $later = new DateTime($site['expiredDate']); $days_left = $later->diff($earlier)->format("%a"); } $services["dec"] = [ "pause" => "", "registrar" => $site['registrar'], "owner" => $site['owner'], "information" => wtsec_getInformation($service, $site['status']), "email" => $site['email'], "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "days_left" => $days_left, "created" => $site['createdDate'], "expiry_date" => $site['expiredDate'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.domain') ]; break; case "reputation": $count = 0; if ($site['status'] != "clean") { foreach ($site['virusList'] as &$list) { if (!empty($list['viruses'])) { $count++; } } } $services["av"] = [ "pause" => "", "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "time_of_the_last_test" => $site['lastTest']['time'], "blacklists_entries" => $count, "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.reputation') ]; break; case "maliciousScript": $services["cms"] = [ "pause" => "", "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "time_of_the_last_test" => $site['lastTest']['time'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.malicious') ]; break; case "deface": $services["dc"] = [ "pause" => "", "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "time_of_the_last_test" => $site['lastTest']['time'], "number" => $site['count'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.deface') ]; break; case "ports": $services["ps"] = [ "pause" => "", "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "ip" => $site['ip'], "time_of_the_last_test" => $site['lastTest']['time'], "number" => count($site['tcp']), "tcp" => !empty($site['tcp']) ? implode(",", $site['tcp']) : '', "udp" => "", "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.port') ]; break; case "firewall": $service = "WAF"; $_service = strtolower($service); $domain = $host['hostname']; $uid = $host['id']; $chart = generateChart($site['chart']); $status = wtsec_checkStatus($uid, $service); $services["waf"] = [ "pause" => "", "site_address" => $domain, "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "time_of_the_last_check" => $site['lastTest']['time'], "attacks" => $chart['count_attacks'], "blocking" => $chart['count_blocks'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.firewall'), "actions" => wtsec_generateButtons($uid, $_service, $service, $status, WTSEC_SITE_URL), "chart" => json_encode($chart['chart'], true) ]; break; case "antivirus": $service = "AV"; $_service = strtolower($service); $domain = $host['hostname']; $uid = $host['id']; $status = wtsec_checkStatus($uid, $service); $services["vc"] = [ "pause" => "", "site_address" => $domain, "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "signatures" => (int)$site['stats']['infected'], "changes" => (int)$site['stats']['changed'], "list" => $site['stats']["infected"], "actions" => wtsec_generateButtons($uid, $_service, $service, $status, WTSEC_SITE_URL), "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.antivirus') ]; break; } } } wtsec_layout("dashboard", $services); } function generateChart($charts) { $count_attacks = 0; $count_blocks = 0; $d = date("d"); $m = date("m"); $c = []; $first_day = $d - 6; if ($first_day < 1) { $lastmonth = (int)date('d', strtotime('last day of previous month')); $lastmonth_day = $lastmonth; $lastmonth_month = (int)date('m', strtotime('last day of previous month')); $lastmonth = $lastmonth - ($first_day * -1); for ($i = $lastmonth; $i <= $lastmonth_day; $i++) { $c[$i] = [ 'day' => "{$i}/$lastmonth_month", 'count' => 0, ]; } $first_day = 1; } for ($i = $first_day; $i <= $d; $i++) { $c[$i] = [ 'day' => "{$i}/$m", 'count' => 0, ]; } foreach ($charts as $chart) { $d = (int)date("d", strtotime($chart['time'])); $c[$d]['count'] = $chart['blocked']; $count_attacks += $chart['attacks']; $count_blocks += $chart['blocked']; } //unset keys, because the js parser sorting by key in integer $result = []; foreach ($c as $d) { $result[] = $d; } return ['chart' => $result, 'count_attacks' => $count_attacks, 'count_blocks' => $count_blocks]; } function wtsec_getInformation($service, $status) { $information = [ "ssl" => [ WTSEC_LIBRARY_Localization::lmsg("statuses.ok"), WTSEC_LIBRARY_Localization::lmsg("statuses.invalid"), WTSEC_LIBRARY_Localization::lmsg("statuses.expired"), WTSEC_LIBRARY_Localization::lmsg("statuses.expires"), "unknown_status" => WTSEC_LIBRARY_Localization::lmsg("statuses.missing"), ], "domain" => [ WTSEC_LIBRARY_Localization::lmsg("statuses.ok"), WTSEC_LIBRARY_Localization::lmsg("statuses.expires"), "unknown_status" => WTSEC_LIBRARY_Localization::lmsg("statuses.error"), ] ]; return isset($information[$service][$status]) ? $information[$service][$status] : $information[$service]["unknown_status"]; } function wtsec_getStatusStartPauseIcon($status, $config_id, $host_id) { $icon = ''; switch ($status) { case "1": $icon = '
'; break; case "0": $icon = '
'; break; } return $icon; } function wtsec_options_page() { $host = WTSEC_LIBRARY_WT::getOwnSite(); $result = WTSEC_LIBRARY_WT::getOptions($host['id']); $options = []; if (isset($result['data']['userHost']['services'])) { foreach ($result['data']['userHost']['services'] as $service) { $configs = $service['configs'][0]; $options[$service['name']] = ['config_id' => $configs['id'], 'is_active' => $configs['isActive']]; } } $options['host_id'] = $host['id']; wtsec_layout("options", $options); } function wtsec_services_page() { wtsec_layout("services"); } function wtsec_antivirus_page() { $host = WTSEC_LIBRARY_WT::getOwnSite(); $services = []; if (!empty($host)) { $site = WTSEC_LIBRARY_WT::getAntivirus($host['id']); if (isset($site['data']['auth']['viewer']['sites']['one']['antivirus']['log'])) { $site = $site['data']['auth']['viewer']['sites']['one']['antivirus']; $service = "AV"; $_service = strtolower($service); $domain = $host['hostname']; $uid = $host['id']; $status = wtsec_checkStatus($uid, $service); $services["vc"] = [ "pause" => "", "site_address" => $domain, "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "signatures" => $site['stats']['infected'], "changes" => $site['stats']['changed'], "list" => $site["log"]['edges'], "actions" => $buttons = wtsec_generateButtons($uid, $_service, $service, $status, WTSEC_SITE_URL), "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.antivirus') ]; } } wtsec_layout("antivirus", $services); } function wtsec_login_form() { if (wtsec_request()->method === "POST") { $result = WTSEC_LIBRARY_WT::auth(wtsec_request()->key); if (isset($result['data']['guest']['apiKeys']['auth']['token']['value'])) { WTSEC_LIBRARY_Session::setNotification("success", WTSEC_LIBRARY_Localization::lmsg('successfully_activated')); $token = $result['data']['guest']['apiKeys']['auth']['token']['value']; WTSEC_LIBRARY_App::login($token); wtsec_app()->set("api_key", wtsec_request()->key); wp_safe_redirect(wtsec_getUrl('dashboard')); exit; } else { WTSEC_LIBRARY_Session::setNotification("error", WTSEC_LIBRARY_Localization::lmsg("form.incorrect")); } } wp_safe_redirect(wtsec_getUrl('login')); } function wtsec_cmd_ajax() { $service = strtoupper(wtsec_request()->service); $_service = strtolower(wtsec_request()->service); $uid = wtsec_request()->uid; $cmd = wtsec_request()->cmd; $status = wtsec_checkStatus($uid, $service); global $wp_filesystem; if (mb_stripos($cmd, "install") === false) { wtsec_cmd($wp_filesystem, $cmd, $service, $_service, $uid, $status, WTSEC_SITE_URL); wp_safe_redirect(wp_get_referer()); } else { $redirect = wtsec_getUrl("dashboard"); $form_url = wp_nonce_url(admin_url('admin-post.php?cmd=' . $cmd . '&action=ajax_cmd&service=' . $service . '&uid=' . $uid), "ajax_cmd"); if (wtsec_filesystem_init($form_url, '', false, false)) { wtsec_cmd($wp_filesystem, $cmd, $service, $_service, $uid, $status, WTSEC_SITE_URL); wp_safe_redirect($redirect); } } } function wtsec_login() { wtsec_layout("login"); } function wtsec_logout() { WTSEC_LIBRARY_App::logout(); } function wtsec_layout($template, $arguments = [], $faq = "faq") { $body = WTSEC_PLUGIN_PATH . "includes/" . $template . ".php"; $faq = WTSEC_PLUGIN_PATH . "includes/" . $faq . ".php"; require_once WTSEC_PLUGIN_PATH . "includes/layout.php"; } function wtsec_ajax_changeStatus() { if (wtsec_request()->method === "POST") { $host_id = wtsec_request()->host_id; $config_id = wtsec_request()->config_id; $result = WTSEC_LIBRARY_WT::changeStatus($config_id, $host_id); echo json_encode($result); } wp_die(); } function wtsec_changeStatus() { if (wtsec_request()->method === "POST") { $host_id = wtsec_request()->host_id; $config_id = wtsec_request()->config_id; WTSEC_LIBRARY_WT::changeStatus($config_id, $host_id); } wp_safe_redirect(wp_get_referer()); } function wtsec_page($page) { return wtsec_pages()[$page]; } function wtsec_getUrl($page) { return admin_url('admin.php?page=' . WTSEC_PAGE_PREFIX . $page); } function wtsec_getRoute($page) { return WTSEC_PAGE_PREFIX . $page; } function wtsec_pages() { return [ // "options" => [ // "page_title" => WTSEC_LIBRARY_Localization::lmsg('options'), // "menu_title" => WTSEC_LIBRARY_Localization::lmsg('options'), // "function" => "wtsec_options_page", // ], "services" => [ "page_title" => WTSEC_LIBRARY_Localization::lmsg('services'), "menu_title" => WTSEC_LIBRARY_Localization::lmsg('services'), "function" => "wtsec_services_page", ], "vc" => [ "page_title" => WTSEC_LIBRARY_Localization::lmsg('remote_antivirus'), "menu_title" => WTSEC_LIBRARY_Localization::lmsg('remote_antivirus'), "function" => "wtsec_antivirus_page", "vc_action" => "vc-action", "vc_function" => "wtsec_vc_function" ], ]; }