$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 dd($vl) { echo '
';
    print_r($vl);
    echo '
'; die(); } function myGrading($score) { if ($score < 0 || $score > 100) return ['grade' => '','color' => '']; if ($score == 100) return ['grade' => 'A+','color' => 'green']; $decimal = $score % 10; $score = $score / 10; $scores = ['F', 'F', 'F', 'F', 'F', 'F', 'C', 'B', 'B', 'A']; $colors = ['red', 'red', 'red', 'red', 'red', 'red', 'orange', 'orange', 'orange', 'green']; $grade = $scores[$score]; $color = $colors[$score]; if ($grade != 'F') { if ($decimal <= 2) $grade .= '-'; else if ($decimal >= 7) $grade .= '+'; } return ['grade' => $grade,'color' => $color]; } function convertTimeToReadable($date) { $lang = get_locale(); //enable russian language if ($lang === "ru_RU") { $lang .= ".UTF-8"; setlocale(LC_ALL, $lang); } if(strpos($date, ".") !== false){ $date = substr($date, 0, strpos($date, ".")); } return strftime("%B %e, %Y / %R", strtotime($date." UTC")); } function convertToCurrentTime($date) { $lang = get_locale(); //enable russian language if ($lang === "ru_RU") { $lang .= ".UTF-8"; setlocale(LC_ALL, $lang); } if(strpos($date, ".") !== false){ $date = substr($date, 0, strpos($date, ".")); } $date .= " UTC"; $current_time = strtotime($date); return ['date' => date("Y-m-d", $current_time),'time' => date("H:i:s",$current_time)]; } function wtsec_index_page() { $host = WTSEC_LIBRARY_WT::getOwnSite(); $services = []; if (!empty($host)) { $services = [ "settings" => [ "token" => WTSEC_LIBRARY_App::getToken(), "site_id" => $host['id'], ], "score" => [ "total_score" => 0, "tested_on" => "", "server_ip" => "", "location" => "", "description" => wtsec_locale("score.description"), "information" => "", "grade" => "", ], ]; $score = json_decode(WTSEC_LIBRARY_WT::getScore(), true); if (!empty($score)) { $total_score = round($score['totalScore']); $my_grading = myGrading($total_score); $services["score"] = [ "total_score" => $total_score."%", "tested_on" => convertTimeToReadable($score['date']), "server_ip" => $score['ip'], "location" => $score['country'], "description" => wtsec_locale("score.description"), "information" => wtsec_locale("score.higher_than_percent", ['percent' => $score['ishigherthan']]), "grade" => $my_grading['grade'], "color" => $my_grading['color'], ]; } $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'], "last_test" => convertTimeToReadable($site['lastTest']['time']), "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'), "solve_it" => in_array($site['status'],['clean','pending']) ? '' : wtsec_locale('solve_it'), ]; 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" => convertTimeToReadable($site['lastTest']['time']), "blacklists_entries" => $count, "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.reputation'), "reputation" => $site['status'] === "infected" ? wtsec_locale('bad_reputation') : wtsec_locale('good_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" => convertTimeToReadable($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'], "last_test" => convertTimeToReadable($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); $data = WTSEC_LIBRARY_WT::getFirewall($host['id']); $data = $data['data']['auth']['viewer']['sites']['one']['firewall']; $countryAttacks = getCountryAttacks($data['map'], $chart['count_attacks']); $edges = $data['logs']['edges']; $services["waf"] = [ "pause" => "", "site_address" => $domain, "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "_status" => $site['status'], "installed_status" => in_array($site['status'], ["not_installed", "error", "down", "not_supported", "not_registered"]) ? false : true, "time_of_the_last_check" => convertTimeToReadable($site['lastTest']['time']), "attacks" => $chart['count_attacks'], "blocking" => $chart['count_blocks'], "non-blocking" => $chart['count_attacks'] - $chart['count_blocks'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.firewall'), "actions" => wtsec_generateButtons($uid, $_service, $service, $site['status'], WTSEC_SITE_URL), "chart" => json_encode($chart['chart'], true), "edges" => $edges, "countryAttacks" => $countryAttacks, ]; 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']), "installed_status" => in_array($site['status'], ["not_installed", "error", "down", "not_supported", "not_registered"]) ? false : true, "_status" => $site['status'], "signatures" => (int)$site['stats']['infected'], "changes" => (int)$site['stats']['changed'], "scanned" => (int)$site['stats']['scaned'], "deleted" => (int)$site['stats']['deleted'], "list" => $site['stats']["infected"], "actions" => wtsec_generateButtons($uid, $_service, $service, $site['status'], WTSEC_SITE_URL), "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.antivirus') ]; break; } } //check AM, if not installed , run install $process = "installing"; $check_am_file = wtsec_checkInstalledFile("AM"); $am_installed = $check_am_file["status"]; $am_installed_status = wtsec_app()->get('am_installed'); if (!$am_installed && !$am_installed_status) { $am_is_installed = wtsec_cmd("am_install", "AM", "am", $host['id'], [], WTSEC_SITE_URL); if (!$am_is_installed) { $process = "failed"; wtsec_app()->set('am_installed', false); } else { wtsec_app()->set('am_installed', true); } } elseif ($services["vc"]["_status"] === "not_installed" || $services["waf"]["_status"] === "not_installed") { $process = "installing"; } else { $process = "installed"; } $services["am"] = [ "status" => WTSEC_LIBRARY_WT::getStatusIcon($am_installed ? "working" : "not_installed"), "actions" => wtsec_generateButtons($host['id'], "am", "AM", ["active" => $check_am_file], WTSEC_SITE_URL), "process_status" => $process, "installed" => $am_installed, ]; } wtsec_layout("dashboard", $services); } function getCountryAttacks($map, $countAttacks){ if($map){ $attackKey = array_search(max(array_column($map, 'attacks')), array_column($map, 'attacks')); $map[$attackKey]['percent'] = round($map[$attackKey]['attacks'] / $countAttacks * 100); $map[$attackKey]['country'] = wtsec_locale("countries.".$map[$attackKey]['country']); return $map[$attackKey]; } return ['percent' => 0, 'country' => false]; } function generateChart($charts) { $count_attacks = 0; $count_blocks = 0; $d = date("d"); $m = date("m"); $y = date("Y"); $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_year = (int)date('Y', strtotime('last day of previous month')); $lastmonth = $lastmonth - ($first_day * -1); for ($i = $lastmonth; $i <= $lastmonth_day; $i++) { $c[$i] = [ 'date' => $lastmonth_year.'-'.$lastmonth_month.'-'.$lastmonth_day, 'count' => 0, 'attacks' => 0, 'blocked' => 0, ]; } $first_day = 1; } for ($i = $first_day; $i <= $d; $i++) { $c[$i] = [ 'date' => $y.'-'.$m.'-'.$i, 'count' => 0, 'attacks' => 0, 'blocked' => 0, ]; } foreach ($charts as $chart) { $d = (int)date("d", strtotime($chart['time'])); $c[$d]['count'] = $chart['blocked']; $c[$d]['attacks'] = $chart['attacks']; $c[$d]['blocked'] = $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" => (int)$site['stats']['infected'], "changes" => (int)$site['stats']['changed'], "scanned" => (int)$site['stats']['scaned'], "deleted" => (int)$site['stats']['deleted'], "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_firewall_page() { $host = WTSEC_LIBRARY_WT::getOwnSite(); $services = []; if (!empty($host)) { $site = WTSEC_LIBRARY_WT::getFirewall($host['id']); $chart = WTSEC_LIBRARY_WT::getFirewallChart($host['id']); if (isset($site['data']['auth']['viewer']['sites']['one']['firewall']['logs'])) { $site = $site['data']['auth']['viewer']['sites']['one']['firewall']; $chart = $chart['data']['auth']['viewer']['sites']['one']['firewall']['chart']; $chart = generateChart($chart); $edges = $site['logs']['edges']; $domain = $host['hostname']; $countryAttacks = getCountryAttacks($site['map'], $chart['count_attacks']); $services["waf"] = [ "pause" => "", "site_address" => $domain, "status" => WTSEC_LIBRARY_WT::getStatusIcon($site['status']), "_status" => $site['status'], "installed_status" => in_array($site['status'], ["not_installed", "error", "down", "not_supported", "not_registered"]) ? false : true, "time_of_the_last_check" => convertTimeToReadable($site['lastTest']['time']), "attacks" => $chart['count_attacks'], "blocking" => $chart['count_blocks'], "non-blocking" => $chart['count_attacks'] - $chart['count_blocks'], "description" => WTSEC_LIBRARY_Localization::lmsg('descriptions.firewall'), "chart" => json_encode($chart['chart'], true), "edges" => $edges, "countryAttacks" => $countryAttacks, ]; } } wtsec_layout("firewall", $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); if (stripos($cmd, "install") === false) { wtsec_cmd($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($cmd, $service, $_service, $uid, $status, WTSEC_SITE_URL); wp_safe_redirect($redirect); } } } function wtsec_login() { require_once WTSEC_PLUGIN_PATH . "includes/login.php"; } 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" ], "waf" => [ "page_title" => WTSEC_LIBRARY_Localization::lmsg('firewall'), "menu_title" => WTSEC_LIBRARY_Localization::lmsg('firewall'), "function" => "wtsec_firewall_page", "vc_action" => "firewall-action", "vc_function" => "wtsec_firewall_function" ], ]; }