PluginProbe
WebTotem Security / 2.4.14
WebTotem Security v2.4.14
3.0.2 3.0.1 3.0.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 2.0 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.1 2.2.2 2.2.3 All 110 releases
← All changes | lib/Helper.php +306 -837 trunk2.4.14 View file →
@@ -11,12 +11,8 @@
11 11 * WebTotem Base class for Wordpress.
12 12 */
13 13 class WebTotem {
14 14
15 - public static function log($notice){
16 - file_put_contents(WEBTOTEM_PLUGIN_PATH . '/wtotem_log.txt', date('Y-m-d H:i:s') . ' ' . $notice . PHP_EOL, FILE_APPEND);
17 - }
18 -
19 15 /**
20 16 * Returns an URL from the admin dashboard.
21 17 *
22 18 * @param string $url
@@ -45,12 +41,11 @@
45 41 $user_role = 0;
46 42 } else {
47 43 $roles = $current_user->roles;
48 44
49 - if(in_array('administrator', $roles)) {
45 + // TODO добавить суперадмина
46 + if(in_array('administrator', $roles)){
50 47 $user_role = 1;
51 - } elseif(in_array('editor', $roles) or current_user_can('publish_posts')) {
52 - $user_role = 2;
53 48 } else {
54 49 $user_role = 0;
55 50 }
56 51 }
@@ -66,29 +61,11 @@
66 61 * @return bool
67 62 * Either TRUE or FALSE in case WordPress is being used as a multi-site instance.
68 63 */
69 64 public static function isMultiSite() {
70 - return (bool) ( (function_exists('is_multisite') && is_multisite()) || (defined('MULTISITE') && MULTISITE == true) );
65 + return (bool) (function_exists('is_multisite') && is_multisite());
71 66 }
72 67
73 -
74 - /**
75 - * Get user email.
76 - *
77 - * @return string
78 - * Returns user email.
79 - */
80 - public static function getUserEmail() {
81 - $email = WebTotemOption::getOption( "user_email" );
82 - if(!$email){
83 - if(WebTotemOption::isActivated()) {
84 -// $email = WebTotemAPI::getEmail();
85 - }
86 - WebTotemOption::setOptions(['user_email' => $email]);
87 - }
88 - return $email;
89 - }
90 -
91 68 /**
92 69 * Returns the md5 hash representing the content of a file.
93 70 *
94 71 * @param string $file
@@ -100,114 +77,20 @@
100 77 return substr(md5_file(WEBTOTEM_PLUGIN_PATH . '/' . $file), 0, 7);
101 78 }
102 79
103 80 /**
104 - * Returns full path to image.
81 + * Returns the md5 hash representing the content of a file.
105 82 *
106 83 * @param string $image
107 84 * Relative path to the file.
108 85 * @return string
109 - * Full path to image.
86 + * Seven first characters in the hash of the file.
110 87 */
111 88 public static function getImagePath($image) {
112 89 return WEBTOTEM_URL. '/includes/img/' . $image;
113 90 }
114 91
115 - /**
116 - * Checking whether the current domain belongs to the kz domain zone.
117 - *
118 - * @return bool
119 - * true is returned if the domain belongs to the kz domain zone.
120 - */
121 - public static function isKz() {
122 - $is_kz = json_decode(WebTotemOption::getOption('is_kz'), true);
123 - if(is_array($is_kz)){
124 - return $is_kz['value'];
125 - }
126 -
127 - if(function_exists('idn_to_utf')){
128 - $host = idn_to_utf8($_SERVER['HTTP_HOST']);
129 - } else {
130 - $host = $_SERVER['HTTP_HOST'];
131 - }
132 -
133 - $parts = explode('.', $host);
134 - $domain_zone = $parts[count($parts)-1];
135 -
136 - if($domain_zone === 'kz' or $domain_zone === 'қаз'){
137 - $is_kz['value'] = true;
138 - } else {
139 - $is_kz['value'] = false;
140 - }
141 -
142 - WebTotemOption::setOptions(['is_kz' => $is_kz]);
143 -
144 - return $is_kz['value'];
145 - }
146 -
147 - /**
148 - * Convert object to array.
149 - *
150 - * @param array $data
151 - * Array.
152 - * @return array
153 - * Returns array.
154 - */
155 - public static function convertObjectToArray($data){
156 -
157 - if(!is_array($data)) $data = (array)$data;
158 - array_walk_recursive($data, function(&$item){
159 - if(is_object($item)) $item = (array)$item;
160 - });
161 -
162 - return $data;
163 - }
164 -
165 - /**
166 - * Decodes a Base64URL-encoded string into a regular string.
167 - *
168 - * Base64URL is a URL-safe variant of Base64 commonly used in JWT and other web standards.
169 - * In Base64URL, the '+' and '/' characters are replaced with '-' and '_', and the '=' padding is often omitted.
170 - * This function converts Base64URL back to standard Base64 and then decodes it.
171 - *
172 - * @param string $data The input string encoded in Base64URL format.
173 - *
174 - * @return string|false Returns the decoded string, or false if decoding fails.
175 - */
176 - public static function base64UrlDecode($data) {
177 - $remainder = strlen($data) % 4;
178 - if ($remainder) {
179 - $data .= str_repeat('=', 4 - $remainder);
180 - }
181 - return base64_decode(strtr($data, '-_', '+/'));
182 - }
183 -
184 92 /**
185 - * Removing duplicates by one key.
186 - *
187 - * @param array $array
188 - * Array.
189 - * @param string $key
190 - * Delete duplicates with the same key.
191 - *
192 - * @return array
193 - * Returns array.
194 - */
195 - public static function arrayUniqueKey($array, $key) {
196 - $tmp = $key_array = array();
197 - $i = 0;
198 -
199 - foreach ($array as $val) {
200 - if (!in_array($val[$key], $key_array)) {
201 - $key_array[$i] = $val[$key];
202 - $tmp[$i] = $val;
203 - }
204 - $i++;
205 - }
206 - return $tmp;
207 - }
208 -
209 - /**
210 93 * Returns user IP address.
211 94 *
212 95 * @return string
213 96 * Returns user IP address.
@@ -237,60 +120,18 @@
237 120 }
238 121 return false;
239 122 }
240 123
241 - /**
242 - * Convert the file size to а human-readable format.
243 - *
244 - * @param string $bytes
245 - * File size in bytes.
246 - * @param string $decimals
247 - * The number of characters after the decimal point.
248 - *
249 - * @return string
250 - * Returns the file size in a human-readable format.
251 - */
252 - public static function humanFilesize($bytes, $decimals = 2) {
253 - $factor = floor((strlen($bytes) - 1) / 3);
254 - $unit_of_measurement = ($factor > 0) ? substr("KMGT", $factor - 1, 1) : '';
255 - $size = sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . $unit_of_measurement . 'B';
256 - return str_replace(".00", "", $size);
257 - }
258 -
259 - /**
260 - * Check whether the file is publicly accessible.
261 - *
262 - * @param string $url
263 - * http link to the file.
264 - * @param string $path
265 - * The path to the file.
266 - *
267 - * @return bool
268 - */
269 - public static function isPubliclyAccessible($url, $path) {
270 - $response = wp_remote_get($url);
271 -
272 - if ((int) floor(((int) wp_remote_retrieve_response_code($response) / 100)) === 2) {
273 - $handle = @fopen($path, 'r');
274 - if ($handle) {
275 - $contents = fread($handle, 700);
276 - fclose($handle);
277 - $remoteContents = substr(wp_remote_retrieve_body($response), 0, 700);
278 -
279 - return $contents === $remoteContents;
280 - }
281 - }
282 - return false;
283 - }
284 -
285 124 /**
286 125 * Check that the training period has passed for the firewall.
287 126 *
127 + * @param string $created_at
128 + * Date when the waf configuration was created.
129 + *
288 130 * @return bool
289 131 * Returns boolean.
290 132 */
291 - public static function isWafTraining() {
292 - $created_at = WebTotemOption::getOption('am_created_at');
133 + public static function isWafTraining($created_at) {
293 134 if($created_at) {
294 135 $when_waf_trained = strtotime('+2 day', strtotime($created_at));
295 136 $today = strtotime('today');
296 137
@@ -298,70 +139,30 @@
298 139 }
299 140 return FALSE;
300 141 }
301 142
302 - /**
303 - * Check if the data for the period is available.
304 - *
305 - * @param string $created_at
306 - * Date when the agent manager was created.
307 - *
308 - * @return array
309 - * Returns an array with periods.
310 - */
311 - public static function isPeriodAvailable() {
143 + /**
144 + * Converting a date to the appropriate format.
145 + *
146 + * @param string $date
147 + * Date in any format.
148 + * @param string $format
149 + * The format to which you want to convert the date.
150 + *
151 + * @return string
152 + * Returns converted Date.
153 + */
154 + public static function dateFormatter($date, $format = 'M j, Y \/ H:i') {
155 + if (!$date) {
156 + return __('Unknown', 'wtotem');
157 + }
312 158
313 - $created_at = WebTotemOption::getOption('am_created_at');
314 - if(!$created_at){
315 - return [
316 - 'monthly' => false,
317 - 'yearly' => false,
318 - ];
319 - }
320 - $diff = strtotime(gmdate("Y-m-d H:i:s")) - strtotime($created_at);
321 - $daysCount = floor($diff / 86400);
159 + $time_zone = WebTotemOption::getOption('time_zone_offset');
160 + $user_time = ($time_zone) ? strtotime($time_zone . 'hours', strtotime($date)) : strtotime($date);
322 161
323 - return [
324 - 'monthly' => $daysCount > 7,
325 - 'yearly' => $daysCount > 30,
326 - ];
162 + return date_i18n($format, $user_time);
163 + }
327 164
328 - }
329 -
330 - /**
331 - * Converting a date to the appropriate format.
332 - *
333 - * @param string $date
334 - * Date in any format.
335 - * @param string $format
336 - * The format to which you want to convert the date.
337 - *
338 - * @return string
339 - * Returns converted Date.
340 - * @throws Exception
341 - */
342 - public static function dateFormatter($date, $format = 'M j, Y \/ H:i') {
343 - if (!$date) {
344 - return __('Unknown', 'wtotem');
345 - }
346 -
347 - if ( is_numeric($date) && (int)$date == $date ){
348 - $date = date('Y-m-d H:i', $date);
349 - }
350 -
351 - if($wp_timezone = wp_timezone()){
352 - $UTC = new DateTimeZone("UTC");
353 - $date = new DateTime( $date, $UTC );
354 - $date->setTimezone( new DateTimeZone($wp_timezone->getName()) );
355 - return date_i18n($format,strtotime($date->format('Y-m-d H:i')));
356 - }
357 -
358 - $time_zone = WebTotemOption::getOption('time_zone_offset');
359 - $user_time = ($time_zone) ? strtotime($time_zone . 'hours', strtotime($date)) : strtotime($date);
360 -
361 - return date_i18n($format, $user_time);
362 - }
363 -
364 165 /**
365 166 * Get theme mode data.
366 167 *
367 168 * @return array
@@ -406,24 +207,24 @@
406 207
407 208 case is_array($days):
408 209 $to = $days[1] ?: $days[0];
409 210 $period = [
410 - 'from' => date('Y-m-d 00:00:01', strtotime(self::formatDate($days[0]))),
411 - 'to' => date('Y-m-d 23:59:59', strtotime(self::formatDate($to))),
211 + 'from' => strtotime(date('Y-m-d 00:00:01', strtotime($days[0]))),
212 + 'to' => strtotime(date('Y-m-d 23:59:59', strtotime($to))),
412 213 ];
413 214 break;
414 215
415 216 case $days <= 1:
416 217 $period = [
417 - 'from' => date('Y-m-d H:m:i', strtotime('-24 hours')),
418 - 'to' => date('Y-m-d H:m:i', time()),
218 + 'from' => strtotime('-24 hours'),
219 + 'to' => time(),
419 220 ];
420 221 break;
421 222
422 223 default:
423 224 $period = [
424 - 'from' => date('Y-m-d H:m:i', time() - ($days * 86400)),
425 - 'to' => date('Y-m-d H:m:i'),
225 + 'from' => time() - ($days * 86400),
226 + 'to' => time(),
426 227 ];
427 228 }
428 229
429 230 return $period;
@@ -428,48 +229,8 @@
428 229
429 230 return $period;
430 231 }
431 232
432 - /**
433 - * Converting a date from "j M, Y" format to 'd-m-Y' format.
434 - *
435 - * @return string
436 - * Returns date in new format
437 - */
438 - public static function formatDate($date){
439 - $month = [
440 - 'Jan' => 'Янв',
441 - 'Feb' => 'Фев',
442 - 'Mar' => 'Мар',
443 - 'Apr' => 'Апр',
444 - 'May' => 'Май',
445 - 'Jun' => 'Июн',
446 - 'Jul' => 'Июл',
447 - 'Aug' => 'Авг',
448 - 'Sep' => 'Сен',
449 - 'Oct' => 'Окт',
450 - 'Nov' => 'Ноя',
451 - 'Dec' => 'Дек',
452 - ];
453 -
454 - foreach ($month as $key => $value) {
455 - if (strpos($date, $value)) {
456 - $date = str_replace($value, $key, $date);
457 - }
458 - }
459 -
460 - $pattern = '/^(\d{1,2})\s+([a-zA-Z]+),\s+(\d{4})$/';
461 -
462 - if (preg_match($pattern, $date, $matches)) {
463 - $monthNumber = date_parse($matches[2])['month'];
464 -
465 - return sprintf('%02d-%02d-%04d', $matches[1], $monthNumber, $matches[3]);
466 - }
467 -
468 - return $date;
469 -
470 - }
471 -
472 233 /**
473 234 * Convert an array to a string with quotation marks.
474 235 *
475 236 * @param array $array
@@ -539,12 +300,9 @@
539 300
540 301 case 'clean':
541 302 case 'up':
542 303 case 'installed':
543 - case 'available':
544 - case 'enable':
545 304 case 'working':
546 - case 'good':
547 305 $status_data = [
548 306 'class' => 'is--status--ok',
549 307 'image' => $path . 'check-mark.svg',
550 308 'icon' => $path . 'icon_success_status.svg',
@@ -571,9 +329,8 @@
571 329 case 'expired':
572 330 case 'no_cert':
573 331 case 'expires':
574 332 case 'open_ports':
575 - case 'warning':
576 333 case 'not_supported':
577 334 case 'not_registered':
578 335 $status_data = [
579 336 'class' => 'is--status--warning',
@@ -582,12 +339,8 @@
582 339 ];
583 340 break;
584 341
585 342 case 'invalid':
586 - case 'revoked':
587 - case 'untrusted':
588 - case 'not_found':
589 - case 'wrong_host':
590 343 case 'error':
591 344 case 'down':
592 345 case 'expires_today':
593 346 case 'infected':
@@ -673,14 +426,8 @@
673 426 "changed" => __('Changed', 'wtotem'),
674 427 "new" => __('New', 'wtotem'),
675 428 "scanned" => __('Scanned', 'wtotem'),
676 429 "quarantine" => __('In quarantine', 'wtotem'),
677 - "good" => __('Good', 'wtotem'),
678 - "wrong_host" => __('Wrong host', 'wtotem'),
679 - "revoked" => __('Revoked', 'wtotem'),
680 - "untrusted" => __('Untrusted', 'wtotem'),
681 - "not_found" => __('Not found', 'wtotem'),
682 - "enable" => __('Enable', 'wtotem'),
683 430 ];
684 431
685 432 return (array_key_exists($status, $statuses)) ? $statuses[$status] : $status;
686 433 }
@@ -717,12 +464,9 @@
717 464 'session_error' => __('This means that the agent did not create a secure session. Possible causes include network issues, wrong server configuration, third-party firewalls. Please contact our support..', 'wtotem'),
718 465 'internal_error' => __('It means that the server is overloaded or there might be some problems with the connection. Usually, the issue resolves itself within 10-15 minutes. If the status does not change during two hours, please cordially contact our support..', 'wtotem'),
719 466 'working' => __('Everything is alright.', 'wtotem'),
720 467 'installed' => __('Everything is alright.', 'wtotem'),
721 - 'available' => __('Everything is alright.', 'wtotem'),
722 468 'not_installed' => __('You need to install agent manager to activate antivirus and firewall.', 'wtotem'),
723 - 'enable' => __('Enabled — the module is active; information is being collected and updated.', 'wtotem'),
724 -
725 469 ];
726 470
727 471 return (array_key_exists($status, $tooltips)) ? $tooltips[$status] : '';
728 472 }
@@ -747,107 +491,37 @@
747 491 $domains[$domain] = $domain;
748 492 }
749 493
750 494 $sites = [];
751 - foreach ((array) $data as $site) {
752 - if (!is_array($site) || empty($site['name'])) {
753 - continue;
495 + if(array_key_exists('edges', $data)){
496 + foreach ($data['edges'] as $site) {
497 + $site = $site['node'];
498 + // Take sites only from the multisite network.
499 + if(array_key_exists($site['hostname'], $domains)) {
500 + unset($domains[$site['hostname']]);
501 + $sites[] = [
502 + 'hostname' => $site['hostname'],
503 + 'title' => $site['title'],
504 + 'main_host' => $main_host['id'] == $site['id'],
505 + 'host_id' => $site['id'],
506 + 'url' => admin_url('admin.php?page=wtotem_dashboard&hid=' . $site['id']),
507 + 'firewall' => [
508 + 'status' => self::getStatusData($site['firewall']['status']),
509 + ],
510 + 'antivirus' => [
511 + 'status' => self::getStatusData($site['antivirus']['status']),
512 + ],
513 + 'stacks' => self::getStacksData($site['maliciousScript']['stack']),
514 + 'services' => self::getSiteServicesData($site),
515 + ];
516 + }
754 517 }
755 518
756 - // Take sites only from the multisite network.
757 - if (!array_key_exists($site['name'], $domains)) {
758 - continue;
759 - }
760 -
761 - unset($domains[$site['name']]);
762 -
763 - $modules = self::getHostModuleStatuses($site);
764 -
765 - $sites[] = [
766 - 'hostname' => $site['name'],
767 - 'title' => $site['name'],
768 - 'main_host' => $main_host['id'] == $site['id'],
769 - 'host_id' => $site['id'],
770 - 'url' => admin_url('admin.php?page=wtotem_dashboard&hid=' . $site['id']),
771 - 'firewall' => [
772 - 'status' => self::getStatusData($modules['waf'] ?? ''),
773 - ],
774 - 'antivirus' => [
775 - 'status' => self::getStatusData($modules['av'] ?? ''),
776 - ],
777 - 'stacks' => self::getStacksData([]),
778 - 'services' => self::getSiteServicesData(self::getHostServices($site, $modules)),
779 - ];
780 519 }
781 -
782 520 return $sites;
783 521 }
784 522
785 523 /**
786 - * Index a host's module statuses by module name.
787 - *
788 - * @param array $host
789 - * A single host entry from the hosts endpoint.
790 - *
791 - * @return array
792 - * Module name => status.
793 - */
794 - protected static function getHostModuleStatuses(array $host) {
795 - $statuses = [];
796 -
797 - foreach ($host['modules'] ?? [] as $module) {
798 - if (!empty($module['name'])) {
799 - $statuses[$module['name']] = $module['status'] ?? '';
800 - }
801 - }
802 -
803 - return $statuses;
804 - }
805 -
806 - /**
807 - * Shape a host entry the way getSiteServicesData() expects it.
808 - *
809 - * @param array $host
810 - * A single host entry from the hosts endpoint.
811 - * @param array $modules
812 - * Module name => status, as returned by getHostModuleStatuses().
813 - *
814 - * @return array
815 - * Service name => ['status' => ...].
816 - */
817 - protected static function getHostServices(array $host, array $modules) {
818 - $map = [
819 - 'ssl' => 'ssl',
820 - 'availability' => 'wa',
821 - 'reputation' => 'rc',
822 - 'ports' => 'ps',
823 - 'deface' => 'dc',
824 - 'domain' => 'dec',
825 - ];
826 -
827 - $services = [];
828 - foreach ($map as $key => $module_name) {
829 - if (isset($modules[$module_name])) {
830 - $services[$key] = ['status' => $modules[$module_name]];
831 - }
832 - }
833 -
834 - if (isset($host['ssl_result']['status'])) {
835 - $services['ssl'] = ['status' => $host['ssl_result']['status']];
836 - }
837 -
838 - if (isset($host['reputation_result']['status'])) {
839 - $services['reputation'] = ['status' => $host['reputation_result']['status']];
840 - }
841 -
842 - if (isset($host['availability_result']['last_status'])) {
843 - $services['availability'] = ['status' => $host['availability_result']['last_status']];
844 - }
845 -
846 - return $services;
847 - }
848 -
849 - /**
850 524 * Converting stacks data.
851 525 *
852 526 * @param array $stacks
853 527 * Stacks data from WebTotem.
@@ -855,12 +529,8 @@
855 529 * @return array
856 530 * Converted data.
857 531 */
858 532 protected static function getStacksData($stacks) {
859 - if (!$stacks) {
860 - return ['list' => [], 'other' => ['count' => 0, 'names' => []]];
861 - }
862 -
863 533 $apps = file_get_contents(WEBTOTEM_PLUGIN_PATH . '/includes/js/apps.json');
864 534 $apps = json_decode($apps, true);
865 535
866 536 $path = 'https://assets.wtotem.net/images/apps/';
@@ -1039,8 +709,54 @@
1039 709 return $services[$service];
1040 710 }
1041 711
1042 712 /**
713 + * Get reports with modules list.
714 + *
715 + * @param array $edges
716 + * Data on generated reports.
717 + *
718 + * @return array
719 + * Returns an array with converted data.
720 + */
721 + public static function getReports(array $edges) {
722 + $modulesLang = [
723 + 'wa' => __('Availability log', 'wtotem'),
724 + 'dc' => __('Deface log', 'wtotem'),
725 + 'ps' => __('Port log', 'wtotem'),
726 + 'rc' => __('Reputation log', 'wtotem'),
727 + 'sc' => __('Evaluation log', 'wtotem'),
728 + 'av' => __('Antivirus log', 'wtotem'),
729 + 'waf' => __('Firewall log', 'wtotem'),
730 + ];
731 +
732 + $reports = [];
733 +
734 + foreach ($edges as $edge) {
735 + if (in_array(FALSE, $edge["node"])) {
736 + $arr = [];
737 + foreach ($edge["node"] as $module => $value) {
738 + if ($value == TRUE && array_key_exists($module, $modulesLang)) {
739 + $arr[] = $modulesLang[$module];
740 + }
741 + }
742 + $modules = implode(", ", $arr);
743 + }
744 + else {
745 + $modules = __('All modules', 'wtotem');
746 + }
747 +
748 + $reports[] = [
749 + 'id' => $edge["node"]['id'],
750 + 'modules' => $modules,
751 + 'created_at' => self::dateFormatter($edge["node"]['createdAt']),
752 + ];
753 + }
754 +
755 + return $reports;
756 + }
757 +
758 + /**
1043 759 * Get reputation status description.
1044 760 *
1045 761 * @param string $status
1046 762 * Reputation status.
@@ -1171,29 +887,28 @@
1171 887 */
1172 888 public static function wafLogs(array $logs_) {
1173 889 $logs = [];
1174 890 foreach ($logs_ as $key => $log) {
891 + $log = $log['node'];
1175 892
1176 893 $logs[$key]['ip'] = $log['ip'];
1177 - $logs[$key]['request'] = urldecode($log['request']);
1178 - $logs[$key]['time'] = self::dateFormatter($log['date']);
1179 - $logs[$key]['country_code'] = strtoupper($log['country']);
1180 - $logs[$key]['country'] = self::getCountryName($log['country']);
1181 - $logs[$key]['blocked'] = $log['blocked'] ? __('Blocked', 'wtotem') : __('Not blocked', 'wtotem');
894 + $logs[$key]['request'] = htmlspecialchars(urldecode($log['request']));
895 + $logs[$key]['time'] = self::dateFormatter($log['time']);
896 + $logs[$key]['country_code'] = strtolower($log['country']);
897 + $logs[$key]['country'] = $log['location']['country']['nameEn'];
898 + $logs[$key]['blocked'] = $log['blocked'] ? __('Blocked IP', 'wtotem') : __('Not blocked', 'wtotem');
1182 899
1183 900 $more = [
1184 - 'ip' => $log['ip'],
1185 - 'proxy_ip' => $log['proxy_ip'],
1186 - 'source' => $log['source'],
1187 - 'request' => urldecode($log['request']),
1188 - 'user_agent' => $log['user_agent'],
1189 - 'time' => self::dateFormatter($log['date']),
1190 - 'type' => $log['type'],
1191 - 'category' => $log['signature_category'],
1192 - 'country' => self::getCountryName($log['country']),
1193 - 'payload' => urldecode($log['payload']),
1194 - 'hostname' => urldecode($log['hostname']),
1195 - 'is_trusted' => urldecode($log['is_trusted']),
901 + 'ip' => $log['ip'],
902 + 'proxy_ip' => $log['proxyIp'],
903 + 'source' => $log['source'],
904 + 'request' => htmlspecialchars(urldecode($log['request'])),
905 + 'user_agent' => $log['userAgent'],
906 + 'time' => self::dateFormatter($log['time']),
907 + 'type' => $log['type'],
908 + 'category' => $log['category'],
909 + 'country' => $log['location']['country']['nameEn'],
910 + 'payload' => htmlspecialchars(urldecode($log['payload'])),
1196 911 ];
1197 912
1198 913 $logs[$key]['more'] = json_encode($more);
1199 914 }
@@ -1211,25 +926,38 @@
1211 926 */
1212 927 public static function generateWafChart(array $charts) {
1213 928 $sum = 0;
1214 929 foreach ($charts as $chart) {
1215 - $sum += $chart['total_attacks'];
930 + $sum += $chart['attacks'];
1216 931 }
1217 932 if ($sum == 0) {
1218 - return [
1219 - 'chart' => FALSE,
1220 - 'count_attacks' => 0,
1221 - 'count_blocks' => 0,
1222 - 'days' => 0,
1223 - ];
933 + return ['chart' => FALSE, 'count_attacks' => 0, 'count_blocks' => 0];
1224 934 }
1225 935
936 + // Get days count.
937 + $charts_ = $charts;
938 + $first = array_shift($charts_);
939 + $last = array_pop($charts_);
940 + $days = ceil((strtotime($last['time']) - strtotime($first['time'])) / 86400);
1226 941
1227 942 // Set variables.
1228 943 $count_attacks = $count_blocks = 0;
1229 944
1230 945 foreach ($charts as $chart) {
1231 - $result[$chart["type"]] = $chart["statistics"];
946 + if ($days <= 1) {
947 + $time_zone = WebTotemOption::getOption('time_zone_offset');
948 + $userTime = ($time_zone) ? strtotime($time_zone . ' hours', strtotime($chart['time'])) : strtotime($chart['time']);
949 + }
950 + if (($chart['attacks'] and $days == 2) or $days != 2) {
951 + $result[] = [
952 + 'date' => ($days <= 1) ? date("Y-m-d H:00:00", $userTime) : date("Y-m-d", strtotime($chart['time'])),
953 + 'count' => $chart['blocked'],
954 + 'attacks' => $chart['attacks'],
955 + 'blocked' => $chart['blocked'],
956 + ];
957 + $count_attacks += $chart['attacks'];
958 + $count_blocks += $chart['blocked'];
959 + }
1232 960 }
1233 961
1234 962 if (!isset($result)) {
1235 963 return [
@@ -1235,9 +963,8 @@
1235 963 return [
1236 964 'chart' => FALSE,
1237 965 'count_attacks' => 0,
1238 966 'count_blocks' => 0,
1239 - 'days' => 0,
1240 967 ];
1241 968 }
1242 969
1243 970 return [
@@ -1243,8 +970,9 @@
1243 970 return [
1244 971 'chart' => json_encode($result),
1245 972 'count_attacks' => $count_attacks,
1246 973 'count_blocks' => $count_blocks,
974 + 'days' => $days,
1247 975 ];
1248 976 }
1249 977
1250 978 /**
@@ -1296,11 +1024,11 @@
1296 1024 $attacks = [];
1297 1025 $countries = [];
1298 1026 $labels = [];
1299 1027 foreach ($data as $value) {
1300 - $attacks[] = $value['total_attack'];
1301 - $labels[] = self::getCountryName($value['name']);
1302 - $countries[] = self::getCountryName($value['name'], 'en-US');
1028 + $attacks[] = $value['attacks'];
1029 + $labels[] = self::getCountryName($value['country']);
1030 + $countries[] = $value['location']['country']['nameEn'];
1303 1031 }
1304 1032 $result = ['attacks' => $attacks, 'countries' => $countries, 'labels' => $labels];
1305 1033
1306 1034 if (!$attacks) {
@@ -1309,145 +1037,72 @@
1309 1037
1310 1038 return json_encode($result, TRUE);
1311 1039 }
1312 1040
1313 - /**
1314 - * Reassembling the antivirus logs.
1315 - *
1316 - * @param array $logs_
1317 - * Antivirus logs from WebTotem.
1318 - *
1319 - * @return array
1320 - * Reassembled array of logs.
1321 - */
1322 - public static function getAntivirusLogsData(array $logs_) {
1323 - if(!$logs_){
1324 - return [];
1325 - }
1326 - $logs = [];
1327 - foreach ($logs_ as $key => $log) {
1041 + /**
1042 + * Reassembling the antivirus logs.
1043 + *
1044 + * @param array $logs_
1045 + * Antivirus logs from WebTotem.
1046 + *
1047 + * @return array
1048 + * Reassembled array of logs.
1049 + */
1050 + public static function getAntivirusLogs(array $logs_) {
1051 + $logs = [];
1052 + foreach ($logs_ as $key => $log) {
1053 + $log = $log['node'];
1328 1054
1329 - if(isset($log['infectedNum']) and $log['infectedNum']){
1330 - $log['status_info'] = 'infected';
1331 - $log['status_name'] = __('Infected', 'wtotem');
1332 - } else {
1333 - $log['status_info'] = 'clean';
1334 - $log['status_name'] = __('Clean', 'wtotem');
1335 - }
1055 + $file_info = new SplFileInfo(urldecode($log['filePath']));
1336 1056
1337 - $log['date'] = self::dateFormatter($log['date'], 'd M Y');
1338 - $log['data'] = json_encode($log);
1057 + $log['original_path'] = $log['filePath'];
1058 + $log['file_path'] = $file_info->getPath() . '/';
1059 + $log['file_name'] = $file_info->getFilename();
1060 + $log['time'] = self::dateFormatter($log['time']);
1061 + $log['permissions_changed'] = $log['permissionsChanged'];
1062 + $log['status'] = self::getStatusData($log['event']);
1063 + $log['class'] = 'wt-text--green';
1339 1064
1340 - $logs[$key] = $log;
1341 - }
1342 - return $logs;
1343 - }
1065 + switch ($log['event']) {
1066 + case 'modified':
1067 + case 'quarantine':
1068 + $log['class'] = "wt-text--yellow";
1069 + break;
1344 1070
1345 - /**
1346 - * Reassembling the Infected Files logs.
1347 - *
1348 - * @param array $logs_
1349 - * Antivirus logs from WebTotem.
1350 - *
1351 - * @return array
1352 - * Reassembled array of Infected Files logs.
1353 - */
1354 - public static function getInfectedFilesData(array $logs_) {
1355 - $logs = [];
1356 - foreach ($logs_ as $key => $log) {
1357 - $full_path = urldecode($log['name']);
1358 - $log['file_name'] = $name = basename($full_path);
1359 - $log['file_path'] = str_replace($name, "", $full_path);
1071 + case 'deleted':
1072 + $log['class'] = "wt-text--light-gray";
1073 + break;
1360 1074
1361 - $logs[$key] = $log;
1362 - }
1363 - return $logs;
1364 - }
1075 + case 'infected':
1076 + $log['class'] = "wt-text--red";
1077 + break;
1078 + }
1365 1079
1366 - /**
1367 - * Reassembling the antivirus logs.
1368 - *
1369 - * @param array $logs_
1370 - * Antivirus logs from WebTotem.
1371 - *
1372 - * @return array
1373 - * Reassembled array of logs.
1374 - */
1375 - public static function getAntivirusAlerts(array $logs_) {
1376 - $logs = [];
1377 - foreach ($logs_ as $key => $log) {
1378 -
1379 - switch ($log['type']) {
1380 - case 'file':
1381 - $log['type_text'] = "Suspicious file";
1382 - break;
1383 -
1384 - case 'skippedPaths':
1385 - $log['type_text'] = "Unscanned Paths";
1386 - break;
1387 -
1388 - default:
1389 - $log['type_text'] = $log['type'];
1390 - }
1391 -
1392 - $logs[$key] = $log;
1393 - }
1394 - return $logs;
1080 + $logs[$key] = $log;
1395 1081 }
1082 + return $logs;
1083 + }
1396 1084
1397 - /**
1398 - * Get open path data.
1399 - *
1400 - * @param array $_ports
1401 - * Open ports array.
1402 - *
1403 - * @return array
1404 - * Reassembled array of open ports.
1405 - */
1406 - public static function getOpenPortsData($ports) {
1407 - if(!$ports){
1408 - return [];
1409 - }
1410 - foreach ($ports as $key => $port) {
1411 - $summary = '';
1412 - if($port['cves']){
1413 - foreach ($port['cves'] as $item){
1414 - $summary .= '<p>' . $item['summary'] . '</p>';
1415 - }
1416 - }
1417 - $ports[$key]['cve_summary'] = $summary;
1418 - }
1419 - return $ports;
1085 + /**
1086 + * Reassembling the quarantine logs.
1087 + *
1088 + * @param array $logs_
1089 + * Quarantine logs from WebTotem.
1090 + *
1091 + * @return array
1092 + * Reassembled array of logs.
1093 + */
1094 + public static function getQuarantineLogs(array $logs_) {
1095 + $logs = [];
1096 + foreach ($logs_ as $key => $log) {
1097 + $logs[$key] = $log;
1098 + $logs[$key]['path'] = urldecode($log['path']);
1099 + $logs[$key]['date'] = self::dateFormatter($log['date']);
1420 1100 }
1421 1101
1102 + return $logs;
1103 + }
1422 1104
1423 - /**
1424 - * Reassembling the Quarantine logs.
1425 - *
1426 - * @param array $list_
1427 - * Quarantine path list from WebTotem.
1428 - *
1429 - * @return array
1430 - * Reassembled array of Quarantine logs.
1431 - */
1432 - public static function getQuarantineListData(array $list_) {
1433 - if(!$list_){
1434 - return [];
1435 - }
1436 - $list = [];
1437 -
1438 - foreach ($list_ as $key => $log) {
1439 -
1440 - $full_path = urldecode($log['name']);
1441 - $log['path'] = $full_path;
1442 - $log['file_name'] = $name = basename($full_path);
1443 - $log['file_path'] = str_replace($name, "", $full_path);
1444 -
1445 - $list[$key] = $log;
1446 - }
1447 - return $list;
1448 - }
1449 -
1450 1105 /**
1451 1106 * Generate an array of IP address data.
1452 1107 *
1453 1108 * @param array $data
@@ -1461,9 +1116,11 @@
1461 1116 public static function getIpList(array $data, $list_name) {
1462 1117 $list = [];
1463 1118 foreach ($data as $item) {
1464 1119 $list[] = [
1465 - 'ip' => $item,
1120 + 'ip' => $item['ip'],
1121 + 'id' => $item['id'],
1122 + 'created_at' => self::dateFormatter($item['createdAt']),
1466 1123 'list_name' => $list_name,
1467 1124 ];
1468 1125 }
1469 1126 return $list;
@@ -1469,8 +1126,30 @@
1469 1126 return $list;
1470 1127 }
1471 1128
1472 1129 /**
1130 + * Generate an array of URL address data.
1131 + *
1132 + * @param array $data
1133 + * URL addresses data from WebTotem.
1134 + *
1135 + * @return array
1136 + * Returns array of data.
1137 + */
1138 + public static function getUrlAllowList(array $data) {
1139 + $list = [];
1140 + foreach ($data as $item) {
1141 + $list[] = [
1142 + 'url' => $item['url'],
1143 + 'id' => $item['id'],
1144 + 'created_at' => self::dateFormatter($item['createdAt']),
1145 + 'list_name' => 'url_allow',
1146 + ];
1147 + }
1148 + return $list;
1149 + }
1150 +
1151 + /**
1473 1152 * Convert IP list to be transferred to WebTotem.
1474 1153 *
1475 1154 * @param string $data
1476 1155 * IP list.
@@ -1482,48 +1161,26 @@
1482 1161 if (!$data) {
1483 1162 return FALSE;
1484 1163 }
1485 1164
1486 - return preg_split("/(?(?=[\s,])[^.]|^$)/", $data);
1165 + $ips = preg_split("/(?(?=[\s,])[^.]|^$)/", $data);
1487 1166
1488 - }
1489 - /**
1490 - * Validate Ip or Cidr.
1491 - *
1492 - * @param string $input
1493 - * IP address. (IPv4 / IPv6 + CIDR)
1494 - *
1495 - * @return bool
1496 - * Returns the converted string.
1497 - */
1498 - public static function validateIpOrCidr(string $input): bool {
1499 -
1500 - if (strpos($input, '/') !== false) {
1501 - [$ip, $mask] = explode('/', $input, 2);
1502 -
1503 - if (!filter_var($ip, FILTER_VALIDATE_IP)) {
1504 - return false;
1505 - }
1506 -
1507 - if (!ctype_digit($mask)) {
1508 - return false;
1509 - }
1510 -
1511 - $mask = (int)$mask;
1512 -
1513 - if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
1514 - return $mask >= 0 && $mask <= 32;
1515 - }
1516 -
1517 - if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
1518 - return $mask >= 0 && $mask <= 128;
1519 - }
1520 -
1521 - return false;
1167 + if (is_array($ips)) {
1168 + $ips_ = '[';
1169 + foreach ($ips as $ip) {
1170 + if (!empty($ip)) {
1171 + $ips_ .= '"' . $ip . '",';
1522 1172 }
1173 + }
1174 + $ips_ = substr($ips_, 0, -1);
1175 + $ips_ .= ']';
1176 + }
1177 + else {
1178 + $ips_ = '"' . $ips . '"';
1179 + }
1523 1180
1524 - return filter_var($input, FILTER_VALIDATE_IP) !== false;
1525 - }
1181 + return $ips_;
1182 + }
1526 1183
1527 1184 /**
1528 1185 * Get data of the country with the most attacks.
1529 1186 *
@@ -1528,8 +1185,10 @@
1528 1185 * Get data of the country with the most attacks.
1529 1186 *
1530 1187 * @param array $map
1531 1188 * Map logs from WebTotem.
1189 + * @param int $count_attacks
1190 + * Total attacks.
1532 1191 *
1533 1192 * @return array
1534 1193 * Returns array of data.
1535 1194 */
@@ -1535,13 +1194,13 @@
1535 1194 */
1536 1195 public static function getMostAttacksData($map) {
1537 1196
1538 1197 if ($map) {
1539 - $most_attacks_key = array_search(max(array_column($map, 'total_attack')), array_column($map, 'total_attack'));
1540 - $total_attacks = array_sum(array_column($map, 'total_attack'));
1198 + $most_attacks_key = array_search(max(array_column($map, 'attacks')), array_column($map, 'attacks'));
1199 + $total_attacks = array_sum(array_column($map, 'attacks'));
1541 1200
1542 - $data['percent'] = ($total_attacks) ? round($map[$most_attacks_key]['total_attack'] / $total_attacks * 100) : 0;
1543 - $data['country'] = self::getCountryName($map[$most_attacks_key]['name']);
1201 + $data['percent'] = ($total_attacks) ? round($map[$most_attacks_key]['attacks'] / $total_attacks * 100) : 0;
1202 + $data['country'] = self::getCountryName($map[$most_attacks_key]['country']);
1544 1203 $data['offset'] = 176 / 100 * (100 - $data['percent']);
1545 1204
1546 1205 return $data;
1547 1206 }
@@ -1557,19 +1216,16 @@
1557 1216 *
1558 1217 * @return string
1559 1218 * Returns country name.
1560 1219 */
1561 - public static function getCountryName($key, $lang = false) {
1562 - if($lang == 'en-US'){
1563 - $countries = WebTotemCountryManager::getCountiesNameByCode();
1564 - } else {
1565 - $countries = WebTotemCountryManager::getStandardList();
1566 - }
1220 + public static function getCountryName($key) {
1221 + $countries = WebTotemCountryManager::getStandardList();
1567 1222 $key = (string) $key;
1568 1223
1569 1224 return (array_key_exists($key, $countries)) ? $countries[$key] : $key;
1570 1225 }
1571 1226
1227 +
1572 1228 /**
1573 1229 * Get configs data.
1574 1230 *
1575 1231 * @param array $array
@@ -1600,20 +1256,20 @@
1600 1256 * @return array
1601 1257 * Configs data array.
1602 1258 */
1603 1259 public static function getWafSettingData(array $settings) {
1604 - $_settings['gdn']['checked'] = (isset($settings['global_defense_network']) && !$settings['global_defense_network']) ? '' : 'checked';
1260 + $_settings['gdn']['checked'] = (isset($settings['gdn']) && !$settings['gdn']) ? '' : 'checked';
1605 1261 $_settings['dos'] = [
1606 - 'checked' => (isset($settings['dos_protect']) && !$settings['dos_protect']) ? '' : 'checked',
1607 - 'visually' => (isset($settings['dos_protect']) && !$settings['dos_protect']) ? 'visually-hidden' : '',
1262 + 'checked' => (isset($settings['dosProtection']) && !$settings['dosProtection']) ? '' : 'checked',
1263 + 'visually' => (isset($settings['dosProtection']) && !$settings['dosProtection']) ? 'visually-hidden' : '',
1608 1264 ];
1609 - $_settings['dos_limit'] = $settings['dos_limit'] ?: 1000;
1265 + $_settings['dos_limit'] = $settings['dosLimit'] ?: 1000;
1610 1266
1611 1267 $_settings['login_attempt'] = [
1612 - 'checked' => (isset($settings['login_protect']) && !$settings['login_protect']) ? '' : 'checked',
1613 - 'visually' => (isset($settings['login_protect']) && !$settings['login_protect']) ? 'visually-hidden' : '',
1268 + 'checked' => (isset($settings['loginAttemptsProtection']) && !$settings['loginAttemptsProtection']) ? '' : 'checked',
1269 + 'visually' => (isset($settings['loginAttemptsProtection']) && !$settings['loginAttemptsProtection']) ? 'visually-hidden' : '',
1614 1270 ];
1615 - $_settings['login_attempt_limit'] = $settings['login_attempt_limit'] ?: 20;
1271 + $_settings['login_attempt_limit'] = $settings['loginAttemptsLimit'] ?: 20;
1616 1272
1617 1273 return $_settings;
1618 1274 }
1619 1275
@@ -1628,11 +1284,9 @@
1628 1284 $settings = WebTotemOption::getPluginSettings();
1629 1285 $_settings = $settings;
1630 1286
1631 1287 $_settings['hide_wp_version_checked'] = (array_key_exists('hide_wp_version', $settings) and $settings['hide_wp_version']) ? 'checked' : '';
1632 - $_settings['disable_user_enumeration_checked'] = (array_key_exists('disable_user_enumeration', $settings) and $settings['disable_user_enumeration']) ? 'checked' : '';
1633 - $_settings['recaptcha_checked'] = (array_key_exists('recaptcha', $settings) and $settings['recaptcha']) ? 'checked' : '';
1634 - $_settings['two_factor_checked'] = (array_key_exists('two_factor', $settings) and $settings['two_factor']) ? 'checked' : '';
1288 + $_settings['recaptcha_checked'] = (array_key_exists('recaptcha', $settings) and $settings['recaptcha']) ? 'checked' : '';
1635 1289
1636 1290 return $_settings;
1637 1291 }
1638 1292
@@ -1676,256 +1330,70 @@
1676 1330 return $randomString;
1677 1331 }
1678 1332
1679 1333 /**
1680 - * Encodes the less than, greater than, ampersand,double quote
1681 - * and single quote characters. Will never double encode entities.
1682 - *
1683 - * @see https://developer.wordpress.org/reference/functions/esc_attr/
1684 - *
1685 - * @param string $text
1686 - * The text which is to be encoded.
1687 - *
1688 - * @return string
1689 - * The encoded text with HTML entities.
1690 - */
1691 - public static function escape($text = '') {
1692 - return esc_attr($text);
1693 - }
1334 + * Encodes the less than, greater than, ampersand,double quote
1335 + * and single quote characters. Will never double encode entities.
1336 + *
1337 + * @see https://developer.wordpress.org/reference/functions/esc_attr/
1338 + *
1339 + * @param string $text
1340 + * The text which is to be encoded.
1341 + *
1342 + * @return string
1343 + * The encoded text with HTML entities.
1344 + */
1345 + public static function escape($text = '')
1346 + {
1347 + return esc_attr($text);
1348 + }
1694 1349
1695 - /**
1696 - * Throw generic exception.
1697 - *
1698 - * @throws Exception
1699 - *
1700 - * @param string $message
1701 - * Error or information message.
1702 - * @param string $type
1703 - * Either info or error.
1704 - *
1705 - * @return bool
1706 - * False all the time, used for debug.
1707 - */
1708 - public static function throwException($message, $type = 'error') {
1709 - if (defined('WTOTEM_THROW_EXCEPTIONS') && WTOTEM_THROW_EXCEPTIONS === true && is_string($message) ) {
1710 - $message = str_replace( '<strong>WebTotem:</strong>', ($type === 'error' ? __('Error:', 'wtotem') : __('Info:', 'wtotem')), $message );
1711 - throw new Exception($message, $type === 'error' ? 157 : 333);
1712 - }
1713 - return false;
1714 - }
1715 -
1716 - /**
1717 - * Get audit logs data
1718 - *
1719 - * @return array
1720 - */
1721 - public static function getAuditLogs($data, $dates_count) {
1722 - $logs = [];
1723 - foreach ($data as $datum){
1724 - $date_time = strtotime($datum['created_at']);
1725 - $date = self::dateFormatter($date_time, 'M j, Y');
1726 -
1727 - $logs[$date]['date'] = $date;
1728 - $logs[$date]['count'] = $dates_count[$date];
1729 - $logs[$date]['logs'][] = [
1730 - 'time' => self::dateFormatter($date_time,'H:i'),
1731 - 'user_name' => $datum['user_name'],
1732 - 'status' => $datum['status'],
1733 - 'title' => $datum['title'],
1734 - 'event' => $datum['event'],
1735 - 'description' => $datum['description'],
1736 - 'ip' => $datum['ip'],
1737 - 'viewed' => (int) !$datum['viewed']
1738 - ];
1739 - }
1740 - return $logs;
1741 - }
1742 -
1743 1350 /**
1744 - * Get confidential files data
1351 + * Get notifications array.
1745 1352 *
1746 1353 * @return array
1354 + * Returns notifications array.
1747 1355 */
1748 - public static function getConfidentialFiles($data) {
1749 - foreach ($data as $key => $datum){
1750 - $data[$key]['modified_at'] = date_i18n('M j, Y \/ H:i', strtotime($datum['modified_at']));
1751 - $data[$key]['size'] = self::humanFilesize($datum['size']);
1752 - $data[$key]['name'] = urldecode($datum['name']);
1753 - $data[$key]['path'] = urldecode($datum['path']);
1754 - }
1755 - return $data;
1756 - }
1356 + public static function getNotifications() {
1757 1357
1758 - /**
1759 - * Get confidential files data
1760 - *
1761 - * @return array
1762 - */
1763 - public static function prepareLinksData($data) {
1764 - foreach ($data as $key => $datum){
1358 + $notifications_data = WebTotemOption::getNotificationsData();
1359 + $notifications = [];
1765 1360
1766 - $content = $datum['content'];
1767 - $source = $datum['source'];
1768 - if(strpos($content, 'http://') !== 0 and strpos($content, 'https://') !== 0 and strpos($content, '//') !== 0){
1769 - $match = substr_count($content, '../');
1770 - $content = str_replace("../", "", $content);
1771 - $content = ltrim($content, '/');
1361 + foreach ($notifications_data as $notification) {
1362 + switch ($notification['type']) {
1363 + case 'error':
1364 + $image = 'alert-error.svg';
1365 + $class = 'wtotem_alert__title_red';
1366 + break;
1772 1367
1773 - for($i=0; $i < 1+$match; $i++){
1774 - $source = substr($source, 0, strrpos($source, "/"));
1775 - }
1776 - $data[$key]['link'] = $source . '/' . $content;
1777 - } else {
1778 - $data[$key]['link'] = $content;
1779 - }
1780 - }
1781 - return $data;
1782 - }
1368 + case 'warning':
1369 + $image = 'alert-warning.svg';
1370 + $class = 'wtotem_alert__title_yellow';
1371 + break;
1783 1372
1373 + case 'success':
1374 + $image = 'alert-success.svg';
1375 + $class = 'wtotem_alert__title_green';
1376 + break;
1784 1377
1785 - /**
1786 - * Building navigation and forming a template
1787 - *
1788 - * @param integer $limit
1789 - * number of entries per 1 page
1790 - * @param integer $count_all
1791 - * total number of all entries
1792 - * @param integer $currentPage
1793 - * the number of the page being viewed
1794 - * @param integer $nextPrev
1795 - * Show the "Forward" and "Back" buttons
1796 - * @return mixed
1797 - * Generated navigation template ready for output
1798 - */
1799 - public static function paginationBuild($limit, $count_all, $currentPage = 1, $nextPrev = true) {
1800 - if( $limit < 1 OR $count_all <= $limit ) return '';
1801 - $count_pages = ceil( $count_all / $limit );
1378 + case 'info':
1379 + $image = 'info-blue.svg';
1380 + $class = 'wtotem_alert__title_blue';
1381 + break;
1382 + }
1802 1383
1803 - $spread = 3;
1804 - $separator = "<i>...</i>";
1805 - $wrap = "<div class=\"wtotem_pagination\">{pages}</div>";
1806 -
1807 - $nextTitle = '←';
1808 - $prevTitle = '→';
1809 -
1810 - $currentPage = intval( $currentPage );
1811 - if( $currentPage < 1 ) $currentPage = 1;
1812 -
1813 - $shift_start = max( $currentPage - $spread, 2 );
1814 - $shift_end = min( $currentPage + $spread, $count_pages-1 );
1815 - if( $shift_end < $spread * 2 ) {
1816 - $shift_end = min( $spread * 2, $count_pages-1 );
1817 - }
1818 - if( $shift_end == $count_pages - 1 AND $shift_start > 3 ) {
1819 - $shift_start = max( 3, min( $count_pages - $spread * 2 + 1, $shift_start ) );
1820 - }
1821 -
1822 - $list = self::getPaginationItem( 1, $currentPage );
1823 -
1824 - if ($shift_start == 3) {
1825 - $list .= self::getPaginationItem( 2, $currentPage );
1826 - } elseif ( $shift_start > 3 ) {
1827 - $list .= $separator;
1828 - }
1829 -
1830 - for( $i = $shift_start; $i <= $shift_end; $i++ ) {
1831 - $list .= self::getPaginationItem( $i, $currentPage );
1832 - }
1833 -
1834 - $last_page = $count_pages - 1;
1835 - if( $shift_end == $last_page-1 ){
1836 - $list .= self::getPaginationItem( $last_page, $currentPage );
1837 - } elseif( $shift_end < $last_page ) {
1838 - $list .= $separator;
1839 - }
1840 -
1841 - $list .= self::getPaginationItem( $count_pages, $currentPage );
1842 -
1843 - if( $nextPrev ) {
1844 - $list = self::getPaginationItem(
1845 - $currentPage > 1 ? $currentPage - 1 : 0,
1846 - $currentPage,
1847 - $nextTitle)
1848 - . $list
1849 - . self::getPaginationItem(
1850 - $currentPage < $count_pages ? $currentPage + 1 : 0,
1851 - $currentPage,
1852 - $prevTitle
1853 - );
1854 - }
1855 -
1856 - return str_replace( "{pages}", $list, $wrap );
1384 + $notifications[] = [
1385 + "text" => $notification['notice'],
1386 + "id" => self::generateRandomString(8),
1387 + "type" => self::getStatusText($notification['type']),
1388 + "image" => $image,
1389 + "class" => $class,
1390 + ];
1857 1391 }
1858 1392
1859 - /**
1860 - * Button/Link Formation
1861 - * @param int $page_num
1862 - * page number
1863 - * @param string $currentPage
1864 - * current page
1865 - * @param string $page_name
1866 - * if specified, the text will be displayed instead of the page number
1867 - * @return string
1868 - * span block with active page or link.
1869 - */
1870 - public static function getPaginationItem( $page_num, $currentPage, $page_name = '' ) {
1871 - if($page_num === 0){return '';}
1872 - $page_name = $page_name ?: $page_num;
1393 + return $notifications;
1394 + }
1873 1395
1874 - if( $currentPage == $page_num ) {
1875 - return "<span class=\"wtotem_pagination__number wtotem_pagination__number_active\">{$page_name}</span>";
1876 - } else {
1877 - return "<a href=\"#\" data-page=\"{$page_num}\" class=\"wtotem_pagination__number\">{$page_name}</a>";
1878 - }
1879 - }
1880 -
1881 - /**
1882 - * Get notifications array.
1883 - *
1884 - * @return array
1885 - * Returns notifications array.
1886 - */
1887 - public static function getNotifications() {
1888 -
1889 - $notifications_data = WebTotemOption::getNotificationsData();
1890 - $notifications = [];
1891 -
1892 - foreach ($notifications_data as $notification) {
1893 - switch ($notification['type']) {
1894 - case 'error':
1895 - $image = 'alert-error.svg';
1896 - $class = 'wtotem_alert__title_red';
1897 - break;
1898 -
1899 - case 'warning':
1900 - $image = 'alert-warning.svg';
1901 - $class = 'wtotem_alert__title_yellow';
1902 - break;
1903 -
1904 - case 'success':
1905 - $image = 'alert-success.svg';
1906 - $class = 'wtotem_alert__title_green';
1907 - break;
1908 -
1909 - case 'info':
1910 - $image = 'info-blue.svg';
1911 - $class = 'wtotem_alert__title_blue';
1912 - break;
1913 - }
1914 -
1915 - $notifications[] = [
1916 - "text" => $notification['notice'],
1917 - "id" => self::generateRandomString(8),
1918 - "type" => self::getStatusText($notification['type']),
1919 - "type_raw" => $notification['type'],
1920 - "image" => $image,
1921 - "class" => $class,
1922 - ];
1923 - }
1924 -
1925 - return $notifications;
1926 - }
1927 -
1928 1396 /**
1929 1397 * Get current agent installation statuses.
1930 1398 *
1931 1399 * @param array $agents_statuses
@@ -1936,9 +1404,10 @@
1936 1404 */
1937 1405 public static function getAgentsStatuses(array $agents_statuses) {
1938 1406 $agents = ['am', 'waf', 'av'];
1939 1407 $installing_statuses = [
1940 - 'not_available',
1408 + 'not_installed',
1409 + 'installing',
1941 1410 'internal_error',
1942 1411 'update_error',
1943 1412 'config_error',
1944 1413 'session_error',
@@ -1952,9 +1421,9 @@
1952 1421 $option_statuses[$agent] = $status['option_status'] ?: FALSE;
1953 1422
1954 1423 if ($agent == 'am') {
1955 1424 if ($status['file_status']) {
1956 - $process_statuses[$agent] = 'available';
1425 + $process_statuses[$agent] = 'installed';
1957 1426 }
1958 1427 else {
1959 1428 $process_statuses[$agent] = 'failed';
1960 1429 }
@@ -1963,13 +1432,13 @@
1963 1432 if ($status['file_status']) {
1964 1433 if (in_array($agents_statuses[$agent], $installing_statuses)) {
1965 1434 $process_statuses[$agent] = 'installing';
1966 1435 }
1967 - elseif ($agents_statuses[$agent] == 'not_available') {
1436 + elseif ($agents_statuses[$agent] == 'agent_not_available') {
1968 1437 $process_statuses[$agent] = 'failed';
1969 1438 }
1970 1439 else {
1971 - $process_statuses[$agent] = 'available';
1440 + $process_statuses[$agent] = 'installed';
1972 1441 }
1973 1442 }
1974 1443 else {
1975 1444 $process_statuses[$agent] = 'installing';