diff --git a/composer.json b/composer.json index d749ca2bf..a711bfe7a 100644 --- a/composer.json +++ b/composer.json @@ -27,12 +27,6 @@ "vendor/bin/phpcs --config-set installed_paths vendor/phpcompatibility/php-compatibility", "vendor/bin/phpcs --standard=tests/.phpcs.xml", "vendor/bin/psalm --no-cache --config=psalm.xml" - ], - "just_phpunit": [ - "vendor/bin/phpunit --configuration tests/phpunit.xml --debug" - ], - "just_psalm": [ - "vendor/bin/psalm --no-cache --config=psalm.xml --debug" ] }, "config": { diff --git a/inc/admin-templates/field-templates/checkbox.php b/inc/admin-templates/field-templates/checkbox.php deleted file mode 100644 index 62aaf9576..000000000 --- a/inc/admin-templates/field-templates/checkbox.php +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - settings[ $data['parent'] ] ? ' disabled="disabled"' : ''; ?> - - - -/> - - - - - - - - - - -
- diff --git a/inc/admin-templates/field-templates/hidden.php b/inc/admin-templates/field-templates/hidden.php deleted file mode 100644 index 8c6f4c1c8..000000000 --- a/inc/admin-templates/field-templates/hidden.php +++ /dev/null @@ -1,11 +0,0 @@ - - -/> diff --git a/inc/admin-templates/field-templates/number.php b/inc/admin-templates/field-templates/number.php deleted file mode 100644 index 7b39030ce..000000000 --- a/inc/admin-templates/field-templates/number.php +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -settings[ $data['parent'] ] ? ' disabled="disabled"' : '') - . ' value="' . $data['value'] . '" ' - . ' min="' . $data['min'] . '" ' - . ' max="' . $data['max'] . '" ' - . ($data['required'] ? ' required="required"' : '') - . '>'; - -?> - - - - - - - - diff --git a/inc/admin-templates/field-templates/radio.php b/inc/admin-templates/field-templates/radio.php deleted file mode 100644 index b42d98504..000000000 --- a/inc/admin-templates/field-templates/radio.php +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - -' . $text . ''; - return; -} - -foreach ($data['options'] as $option) { - echo '' - . '' - . ''; - echo ' '; -} - -?> diff --git a/inc/admin-templates/field-templates/select.php b/inc/admin-templates/field-templates/select.php deleted file mode 100644 index 8a4f86ae5..000000000 --- a/inc/admin-templates/field-templates/select.php +++ /dev/null @@ -1,44 +0,0 @@ - - - - -'; - -foreach ($data['options'] as $option) { - echo ''; -} -echo ''; -?> - - - - - - - - diff --git a/inc/admin-templates/field-templates/text.php b/inc/admin-templates/field-templates/text.php deleted file mode 100644 index 18f100574..000000000 --- a/inc/admin-templates/field-templates/text.php +++ /dev/null @@ -1,38 +0,0 @@ - - - - -data['moderate'] ? ' disabled="disabled"' : '') - . ($data['class'] ? ' class="' . $data['class'] . '"' : '') - . ($data['required'] ? ' required="required"' : '') - . 'value="' . ($data['value'] ?: $affiliate_short_code) . '" ' - . $readonly - . ($data['disabled'] || ($data['parent'] && ! $data['parent_value']) ? ' disabled="disabled"' : '') - . (! $data['children'] ? '' : ' children="' . implode(",", $data['children']) . '"') - . (! $data['children'] ? '' : ' onchange="spbcSettingsDependencies(\'' . implode(",", $data['children']) . '\')"') - . ' />'; -?> - - - - - - - - - - - - diff --git a/inc/admin-templates/field-templates/textarea.php b/inc/admin-templates/field-templates/textarea.php deleted file mode 100644 index 804d99907..000000000 --- a/inc/admin-templates/field-templates/textarea.php +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - -' + . __('Learn more', 'security-malware-firewall') + . '
', ), 'hash_denied_hash' => array( 'title' => 'denied_hash', @@ -4418,7 +4237,7 @@ function spbc_bulk_actions_description() add_action('spbc_before_returning_settings', 'spbc__send_local_settings_to_api'); /** - * Hook action to untrack users outside of UsersPassCheck roles array. + * Hook action to untrack users outside UsersPassCheck roles array. */ add_action('spbc_before_returning_settings', array(\CleantalkSP\SpbctWP\UsersPassCheckModule\UsersPassCheckModel::class, 'hookUntrackUsers')); @@ -4436,7 +4255,6 @@ function spbc__send_local_settings_to_api($settings) function spbc_cdn_checker__run_check_on_settings_change($settings) { if ( isset($settings['secfw__get_ip__enable_cdn_auto_self_check']) && $settings['secfw__get_ip__enable_cdn_auto_self_check'] != 0) { - //CDNHeadersChecker::sendCDNCheckerRequest(); SpbcCron::updateTask('cdn_check', 'spbc_cdn_checker__send_request', 86400, time() + 60); } } @@ -4545,13 +4363,6 @@ function spbc_scanner__cure_log_data_prepare(&$table) } } -function spbc_render_links_to_tag($value) -{ - $pattern = "/(https?:\/\/[^\s]+)/"; - $value = preg_replace($pattern, '$1', $value); - return Escape::escKsesPreset($value, 'spbc_settings__display__notifications'); -} - function spbc_scanner__last_scan_info($direct_call = false) { global $spbc; @@ -4589,19 +4400,13 @@ function spbc_scanner__last_scan_info($direct_call = false) */ function spbc_get_next_scan_launch_time_text() { - global $spbc; - - $task = \CleantalkSP\SpbctWP\Cron::getTask('scanner__launch'); - if ($spbc->settings['scanner__auto_start'] - && isset($task['next_call']) - ) { - return sprintf( - ' ' . __('The next automatic scan is scheduled on %s %s.', 'security-malware-firewall'), - date('M d, Y H:i:s', $task['next_call'] + ((float)get_option('gmt_offset') * 3600)), - spbc_wp_timezone_string() - ); - } - return ''; + $next_scan_time = spbc_get_next_scan_launch_time(); + return $next_scan_time + ? sprintf( + ' ' . __('The next automatic scan is scheduled on %s.', 'security-malware-firewall'), + $next_scan_time + ) + : ''; } /** @@ -4905,24 +4710,6 @@ function spbc_drop_to_defaults_on_key_clearance(\CleantalkSP\SpbctWP\State $spbc return $spbc; } -/** - * Draws custom save button block with navigator backlink button with echo. - * @return void *echo - */ -function spbc_settings_draw_save_button_bottom_block() -{ - $template = ' - '; - printf( - $template, - __('Save Changes', 'security-malware-firewall'), - __('Back to navigation', 'security-malware-firewall') - ); -} - /** * Get HTML content for change role template * @return void *echo diff --git a/inc/spbc-tools.php b/inc/spbc-tools.php index ea9863854..24522c63d 100644 --- a/inc/spbc-tools.php +++ b/inc/spbc-tools.php @@ -45,6 +45,10 @@ function spbc_log($message, $func = null, $params = array()) global $spbc; + if (!isset($spbc->debug) || !is_array($spbc->debug)) { + $spbc->debug = array(); + } + $time_Ms = (int) substr(microtime(), 2, 6); $key = date('Y-m-d H:i:s') . ':' . $time_Ms . ' ACTION ' . current_action() . ' FUNCTION ' . $func; diff --git a/js/public/spbct-react-bundle.js b/js/public/spbct-react-bundle.js index bbf211c4e..46002e981 100644 --- a/js/public/spbct-react-bundle.js +++ b/js/public/spbct-react-bundle.js @@ -376,7 +376,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa \**********************************************************/ (__unused_webpack_module, __webpack_exports__, __webpack_require__) { -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabContent)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/styles.css\");\n/* harmony import */ var _Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Preloader/Preloader */ \"./js/src/react/components/Preloader/Preloader.js\");\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.js\");\n/* harmony import */ var _TabDefault_TabDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TabDefault/TabDefault */ \"./js/src/react/components/TabContent/TabDefault/TabDefault.js\");\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n;\n\n\n\n\nfunction TabContent(_ref) {\n var sectionId = _ref.sectionId,\n isActive = _ref.isActive,\n tabComponent = _ref.tabComponent;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n sectionData = _useState2[0],\n setSectionData = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isActive && !sectionData) {\n if (sectionId === 'critical_updates' || sectionId === 'fswatcher' || sectionId === 'traffic_control' || sectionId === 'security_certified') {\n fetchContent();\n } else {\n fetchContentOld();\n }\n }\n }, [isActive, sectionData]);\n var fetchContent = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var requestData, data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n requestData = {\n action: 'spbct_get_tab_data',\n tab_name: sectionId\n };\n _context.n = 1;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__.sendAjaxRequest)(requestData, true);\n case 1:\n data = _context.v;\n setSectionData(data);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching content:', _t);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchContent() {\n return _ref2.apply(this, arguments);\n };\n }();\n var fetchContentOld = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var requestData, data, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n _context2.p = 0;\n requestData = {\n action: 'spbc_settings__draw_elements',\n tab_name: sectionId\n };\n _context2.n = 1;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__.sendAjaxRequest)(requestData);\n case 1:\n data = _context2.v;\n setSectionData(data);\n document.dispatchEvent(new CustomEvent('spbctTabLoaded', {\n bubbles: true,\n detail: {\n tab: sectionId\n }\n }));\n _context2.n = 3;\n break;\n case 2:\n _context2.p = 2;\n _t2 = _context2.v;\n console.error('Error fetching content:', _t2);\n case 3:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 2]]);\n }));\n return function fetchContentOld() {\n return _ref3.apply(this, arguments);\n };\n }();\n var isActiveClass = isActive ? 'spbc_tab_section--active' : '';\n var TabContentInner = tabComponent || _TabDefault_TabDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: 'spbc_tab-' + sectionId,\n className: 'spbc_tab spbc_tab-' + sectionId + ' ' + isActiveClass\n }, isActive && sectionData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabContentInner, {\n sectionId: sectionId,\n sectionData: sectionData,\n isActive: isActive\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabContent.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabContent)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/styles.css\");\n/* harmony import */ var _Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../Preloader/Preloader */ \"./js/src/react/components/Preloader/Preloader.js\");\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.js\");\n/* harmony import */ var _TabDefault_TabDefault__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TabDefault/TabDefault */ \"./js/src/react/components/TabContent/TabDefault/TabDefault.js\");\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n;\n\n\n\n\nfunction TabContent(_ref) {\n var sectionId = _ref.sectionId,\n isActive = _ref.isActive,\n tabComponent = _ref.tabComponent;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n sectionData = _useState2[0],\n setSectionData = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (isActive && !sectionData) {\n // Legacy way to get tab content for these sectionId-s - spbc_settings__draw_elements\n if (sectionId === 'scanner' || sectionId === 'backups' || sectionId === 'security_log' || sectionId === 'summary' || sectionId === 'debug') {\n fetchContentOld();\n } else {\n fetchContent();\n }\n }\n }, [isActive, sectionData]);\n var fetchContent = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var requestData, data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n requestData = {\n action: 'spbct_get_tab_data',\n tab_name: sectionId\n };\n _context.n = 1;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__.sendAjaxRequest)(requestData, true);\n case 1:\n data = _context.v;\n setSectionData(data);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching content:', _t);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchContent() {\n return _ref2.apply(this, arguments);\n };\n }();\n var fetchContentOld = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var requestData, data, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n _context2.p = 0;\n requestData = {\n action: 'spbc_settings__draw_elements',\n tab_name: sectionId\n };\n _context2.n = 1;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__.sendAjaxRequest)(requestData);\n case 1:\n data = _context2.v;\n setSectionData(data);\n document.dispatchEvent(new CustomEvent('spbctTabLoaded', {\n bubbles: true,\n detail: {\n tab: sectionId\n }\n }));\n _context2.n = 3;\n break;\n case 2:\n _context2.p = 2;\n _t2 = _context2.v;\n console.error('Error fetching content:', _t2);\n case 3:\n return _context2.a(2);\n }\n }, _callee2, null, [[0, 2]]);\n }));\n return function fetchContentOld() {\n return _ref3.apply(this, arguments);\n };\n }();\n var isActiveClass = isActive ? 'spbc_tab_section--active' : '';\n var TabContentInner = tabComponent || _TabDefault_TabDefault__WEBPACK_IMPORTED_MODULE_4__[\"default\"];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: 'spbc_tab-' + sectionId,\n className: 'spbc_tab spbc_tab-' + sectionId + ' ' + isActiveClass\n }, isActive && sectionData ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabContentInner, {\n sectionId: sectionId,\n sectionData: sectionData,\n isActive: isActive\n }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabContent.js?\n}"); /***/ }, @@ -1486,7 +1486,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa \*************************************************************************************/ (__unused_webpack_module, __webpack_exports__, __webpack_require__) { -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabSettingsGeneral)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSettingsGeneral/styles.css\");\n/* harmony import */ var _TabContentTypes_Html_TabContentHtml__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../TabContentTypes/Html/TabContentHtml */ \"./js/src/react/components/TabContentTypes/Html/TabContentHtml.js\");\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.js\");\n/* harmony import */ var _Preloader_Preloader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../Preloader/Preloader */ \"./js/src/react/components/Preloader/Preloader.js\");\n/* harmony import */ var _FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../FormElements/InputHidden */ \"./js/src/react/components/FormElements/InputHidden.js\");\n/* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings.js\");\n/* harmony import */ var _NoticeBanner_NoticeBanner__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../NoticeBanner/NoticeBanner */ \"./js/src/react/components/TabContent/NoticeBanner/NoticeBanner.js\");\n/* harmony import */ var _SettingsOverview_SettingsOverview__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../SettingsOverview/SettingsOverview */ \"./js/src/react/components/SettingsOverview/SettingsOverview.js\");\n/* harmony import */ var _QuickNavigation_QuickNavigation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./QuickNavigation/QuickNavigation */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavigation.js\");\nfunction _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = \"function\" == typeof Symbol ? Symbol : {}, n = r.iterator || \"@@iterator\", o = r.toStringTag || \"@@toStringTag\"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, \"_invoke\", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError(\"Generator is already running\"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = \"next\"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i[\"return\"]) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine2(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, \"Generator\"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, \"toString\", function () { return \"[object Generator]\"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }\nfunction _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, \"\", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2)); }, _regeneratorDefine2(e, r, n, t); }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n;\n\n\n\n\n\n\n\n\n\nfunction TabSettingsGeneral(_ref) {\n var _settings$objects, _settings$strings, _settings$strings2, _settings$strings3, _settings$objects2, _settings$objects3, _settings$strings4, _settings$strings5, _settings$strings6, _settings$strings7, _settings$flags, _settings$flags2, _settings$strings8, _settings$strings9, _settings$strings0, _settings$strings1, _settings$objects4, _settings$objects5, _settings$objects6;\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n sectionData: sectionData\n }),\n _useState2 = _slicedToArray(_useState, 2),\n sectionDataLegacy = _useState2[0],\n setSectionDataLegacy = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}),\n _useState4 = _slicedToArray(_useState3, 2),\n settings = _useState4[0],\n setSettings = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n settingsFetched = _useState6[0],\n setSettingsFetched = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n keyIsOk = _useState8[0],\n setKeyIsOk = _useState8[1];\n jQuery(document).ready(function () {\n // Show/Hide access key\n jQuery('#showHideLink').on('click', function () {\n jQuery('#spbc_key').val(jQuery('#spbc_key').attr('key'));\n jQuery('#spbc_key+div').show();\n jQuery(this).fadeOut(300);\n });\n\n // Set time zone filed value if key is bad\n // @ToDo unused code?\n if (!+spbcSettings.key_is_ok) {\n var d = new Date();\n jQuery('#spbc_admin_timezone').val(d.getTimezoneOffset() / 60 * -1);\n }\n\n /**\n * Shuffle authentication unique keys and salts\n */\n function spbcShuffleSalts() {\n var data = {};\n data.security = spbcSettings.ajax_nonce;\n data.action = 'spbc_action_shuffle_salts';\n jQuery.ajax({\n type: 'POST',\n async: false,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n document.location.reload();\n } else {\n alert(result.data);\n }\n }\n });\n }\n\n // Event for shuffle authentication unique keys and salts\n // Enabling the salt update button and repeatedly pressing\n var actionShuffleSaltsCountClicks = 0;\n jQuery(document).on('click', '#action-shuffle-salts', function (e) {\n e.preventDefault();\n var btn = jQuery(this);\n if (btn.hasClass('disabled')) {\n actionShuffleSaltsCountClicks++;\n if (actionShuffleSaltsCountClicks === 3) {\n btn.removeClass('disabled');\n }\n } else {\n actionShuffleSaltsCountClicks = 0;\n if (confirm('Are you sure?')) {\n spbcShuffleSalts();\n }\n }\n });\n jQuery('button[id*=\"action-adjust-change-\"]').click(function (e) {\n e.preventDefault();\n var data = {};\n data.action = 'spbc_action_adjust_change';\n data.adjust = jQuery(this).data('adjust');\n var params = {};\n params.button = document.getElementById('action-adjust-change-' + data.adjust);\n params.success = function () {\n document.location.reload();\n };\n spbcSendAJAXRequest(data, params);\n });\n jQuery('button[id*=\"action-adjust-reverse-\"]').click(function (e) {\n e.preventDefault();\n var data = {};\n data.action = 'spbc_action_adjust_reverse';\n data.adjust = jQuery(this).data('adjust');\n var params = {};\n params.button = document.getElementById('action-adjust-reverse-' + data.adjust);\n params.success = function () {\n document.location.reload();\n };\n spbcSendAJAXRequest(data, params);\n });\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setSectionDataLegacy(sectionData);\n fetchContent();\n }, []);\n\n // @ToDo - need to be moved to the separate hook, same duplication is in `TabContent` component\n var fetchContent = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var _data$flags, requestData, data, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n _context.p = 0;\n requestData = {\n action: 'spbct_get_tab_data',\n tab_name: sectionId\n };\n _context.n = 1;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_3__.sendAjaxRequest)(requestData, true);\n case 1:\n data = _context.v;\n setSettings(data);\n setKeyIsOk((_data$flags = data.flags) === null || _data$flags === void 0 ? void 0 : _data$flags.keyIsOk);\n setSettingsFetched(true);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching content:', _t);\n setSettingsFetched(true);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchContent() {\n return _ref2.apply(this, arguments);\n };\n }();\n if (!settingsFetched) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null);\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, window.spbcSettings && window.spbcSettings.critical > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_NoticeBanner_NoticeBanner__WEBPACK_IMPORTED_MODULE_7__[\"default\"], null), keyIsOk && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SettingsOverview_SettingsOverview__WEBPACK_IMPORTED_MODULE_8__[\"default\"], {\n settings: (_settings$objects = settings.objects) === null || _settings$objects === void 0 ? void 0 : _settings$objects.settings\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n id: 'spbc_settings_form',\n method: 'POST',\n action: 'options.php'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n id: 'option_page',\n name: 'option_page',\n value: (_settings$strings = settings.strings) === null || _settings$strings === void 0 ? void 0 : _settings$strings.settingsSlug\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n id: 'action',\n name: 'action',\n value: 'update'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n id: '_wpnonce',\n name: '_wpnonce',\n value: (_settings$strings2 = settings.strings) === null || _settings$strings2 === void 0 ? void 0 : _settings$strings2.nonce\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-settings-general-wrapper\",\n className: \"spbc-settings-general-wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-settings-general-wrapper-settings\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Settings__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n settingsSlug: (_settings$strings3 = settings.strings) === null || _settings$strings3 === void 0 ? void 0 : _settings$strings3.settingsSlug,\n settings: (_settings$objects2 = settings.objects) === null || _settings$objects2 === void 0 ? void 0 : _settings$objects2.settings,\n keyIsOk: keyIsOk,\n wpUserRolesOptions: (_settings$objects3 = settings.objects) === null || _settings$objects3 === void 0 ? void 0 : _settings$objects3.wp_user_roles_options,\n verificationEmail: (_settings$strings4 = settings.strings) === null || _settings$strings4 === void 0 ? void 0 : _settings$strings4.two_fa_verification_email_recipient,\n authLoginPageUrl: (_settings$strings5 = settings.strings) === null || _settings$strings5 === void 0 ? void 0 : _settings$strings5.auth_login_page_url,\n techSupportUrlPrefix: (_settings$strings6 = settings.strings) === null || _settings$strings6 === void 0 ? void 0 : _settings$strings6.tech_support_url_field_prefix,\n loginRenameNotifyAdminEmail: (_settings$strings7 = settings.strings) === null || _settings$strings7 === void 0 ? void 0 : _settings$strings7.login_rename_notify_admin_email,\n canActivatePlugins: (_settings$flags = settings.flags) === null || _settings$flags === void 0 ? void 0 : _settings$flags.canActivatePlugins,\n shuffleSaltsUnlocked: (_settings$flags2 = settings.flags) === null || _settings$flags2 === void 0 ? void 0 : _settings$flags2.shuffleSaltsUnlocked,\n visitorCurrentIp: (_settings$strings8 = settings.strings) === null || _settings$strings8 === void 0 ? void 0 : _settings$strings8.visitorCurrentIp,\n nextScheduledScanDescription: (_settings$strings9 = settings.strings) === null || _settings$strings9 === void 0 ? void 0 : _settings$strings9.nextScheduledScanDescription,\n scannerAutoStartManualTimezone: (_settings$strings0 = settings.strings) === null || _settings$strings0 === void 0 ? void 0 : _settings$strings0.scannerAutoStartManualTimezone,\n wlCompanyName: (_settings$strings1 = settings.strings) === null || _settings$strings1 === void 0 ? void 0 : _settings$strings1.wlCompanyName,\n visitorIpSources: (_settings$objects4 = settings.objects) === null || _settings$objects4 === void 0 ? void 0 : _settings$objects4.visitorIpSources,\n scannerExclusionsDir: (_settings$objects5 = settings.objects) === null || _settings$objects5 === void 0 ? void 0 : _settings$objects5.scannerExclusionsDir,\n scannerExclusionsURL: (_settings$objects6 = settings.objects) === null || _settings$objects6 === void 0 ? void 0 : _settings$objects6.scannerExclusionsURL\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabContentTypes_Html_TabContentHtml__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sectionId: sectionId,\n sectionData: sectionDataLegacy,\n isActive: isActive\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_QuickNavigation_QuickNavigation__WEBPACK_IMPORTED_MODULE_9__[\"default\"], {\n keyIsOk: keyIsOk\n }))));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabSettingsGeneral)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSettingsGeneral/styles.css\");\n/* harmony import */ var _FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../FormElements/InputHidden */ \"./js/src/react/components/FormElements/InputHidden.js\");\n/* harmony import */ var _Settings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Settings */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings.js\");\n/* harmony import */ var _NoticeBanner_NoticeBanner__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../NoticeBanner/NoticeBanner */ \"./js/src/react/components/TabContent/NoticeBanner/NoticeBanner.js\");\n/* harmony import */ var _SettingsOverview_SettingsOverview__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../SettingsOverview/SettingsOverview */ \"./js/src/react/components/SettingsOverview/SettingsOverview.js\");\n/* harmony import */ var _QuickNavigation_QuickNavigation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./QuickNavigation/QuickNavigation */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavigation.js\");\nfunction _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(r, a) { if (r) { if (\"string\" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }\nfunction _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }\nfunction _iterableToArrayLimit(r, l) { var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }\nfunction _arrayWithHoles(r) { if (Array.isArray(r)) return r; }\n;\n\n\n\n\n\n\nfunction TabSettingsGeneral(_ref) {\n var _sectionData$flags$ke, _sectionData$flags, _settings$objects, _settings$strings, _settings$strings2, _settings$strings3, _settings$objects2, _settings$objects3, _settings$strings4, _settings$strings5, _settings$strings6, _settings$strings7, _settings$flags, _settings$flags2, _settings$strings8, _settings$strings9, _settings$strings0, _settings$strings1, _settings$objects4, _settings$objects5, _settings$objects6;\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(sectionData),\n _useState2 = _slicedToArray(_useState, 2),\n settings = _useState2[0],\n setSettings = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((_sectionData$flags$ke = (_sectionData$flags = sectionData.flags) === null || _sectionData$flags === void 0 ? void 0 : _sectionData$flags.keyIsOk) !== null && _sectionData$flags$ke !== void 0 ? _sectionData$flags$ke : false),\n _useState4 = _slicedToArray(_useState3, 2),\n keyIsOk = _useState4[0],\n setKeyIsOk = _useState4[1];\n jQuery(document).ready(function () {\n // Show/Hide access key\n jQuery('#showHideLink').on('click', function () {\n jQuery('#spbc_key').val(jQuery('#spbc_key').attr('key'));\n jQuery('#spbc_key+div').show();\n jQuery(this).fadeOut(300);\n });\n\n // Set time zone filed value if key is bad\n // @ToDo unused code?\n if (!+spbcSettings.key_is_ok) {\n var d = new Date();\n jQuery('#spbc_admin_timezone').val(d.getTimezoneOffset() / 60 * -1);\n }\n\n /**\n * Shuffle authentication unique keys and salts\n */\n function spbcShuffleSalts() {\n var data = {};\n data.security = spbcSettings.ajax_nonce;\n data.action = 'spbc_action_shuffle_salts';\n jQuery.ajax({\n type: 'POST',\n async: false,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n document.location.reload();\n } else {\n alert(result.data);\n }\n }\n });\n }\n\n // Event for shuffle authentication unique keys and salts\n // Enabling the salt update button and repeatedly pressing\n var actionShuffleSaltsCountClicks = 0;\n jQuery(document).on('click', '#action-shuffle-salts', function (e) {\n e.preventDefault();\n var btn = jQuery(this);\n if (btn.hasClass('disabled')) {\n actionShuffleSaltsCountClicks++;\n if (actionShuffleSaltsCountClicks === 3) {\n btn.removeClass('disabled');\n }\n } else {\n actionShuffleSaltsCountClicks = 0;\n if (confirm('Are you sure?')) {\n spbcShuffleSalts();\n }\n }\n });\n jQuery('button[id*=\"action-adjust-change-\"]').click(function (e) {\n e.preventDefault();\n var data = {};\n data.action = 'spbc_action_adjust_change';\n data.adjust = jQuery(this).data('adjust');\n var params = {};\n params.button = document.getElementById('action-adjust-change-' + data.adjust);\n params.success = function () {\n document.location.reload();\n };\n spbcSendAJAXRequest(data, params);\n });\n jQuery('button[id*=\"action-adjust-reverse-\"]').click(function (e) {\n e.preventDefault();\n var data = {};\n data.action = 'spbc_action_adjust_reverse';\n data.adjust = jQuery(this).data('adjust');\n var params = {};\n params.button = document.getElementById('action-adjust-reverse-' + data.adjust);\n params.success = function () {\n document.location.reload();\n };\n spbcSendAJAXRequest(data, params);\n });\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var _sectionData$flags2;\n setSettings(sectionData);\n setKeyIsOk((_sectionData$flags2 = sectionData.flags) === null || _sectionData$flags2 === void 0 ? void 0 : _sectionData$flags2.keyIsOk);\n }, [sectionData]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, window.spbcSettings && window.spbcSettings.critical > 0 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_NoticeBanner_NoticeBanner__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null), keyIsOk && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SettingsOverview_SettingsOverview__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n settings: (_settings$objects = settings.objects) === null || _settings$objects === void 0 ? void 0 : _settings$objects.settings\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n id: 'spbc_settings_form',\n method: 'POST',\n action: 'options.php'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: 'option_page',\n name: 'option_page',\n value: (_settings$strings = settings.strings) === null || _settings$strings === void 0 ? void 0 : _settings$strings.settingsSlug\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: 'action',\n name: 'action',\n value: 'update'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: '_wpnonce',\n name: '_wpnonce',\n value: (_settings$strings2 = settings.strings) === null || _settings$strings2 === void 0 ? void 0 : _settings$strings2.nonce\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-settings-general-wrapper\",\n className: \"spbc-settings-general-wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-settings-general-wrapper-settings\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Settings__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n settingsSlug: (_settings$strings3 = settings.strings) === null || _settings$strings3 === void 0 ? void 0 : _settings$strings3.settingsSlug,\n settings: (_settings$objects2 = settings.objects) === null || _settings$objects2 === void 0 ? void 0 : _settings$objects2.settings,\n keyIsOk: keyIsOk,\n wpUserRolesOptions: (_settings$objects3 = settings.objects) === null || _settings$objects3 === void 0 ? void 0 : _settings$objects3.wp_user_roles_options,\n verificationEmail: (_settings$strings4 = settings.strings) === null || _settings$strings4 === void 0 ? void 0 : _settings$strings4.two_fa_verification_email_recipient,\n authLoginPageUrl: (_settings$strings5 = settings.strings) === null || _settings$strings5 === void 0 ? void 0 : _settings$strings5.auth_login_page_url,\n techSupportUrlPrefix: (_settings$strings6 = settings.strings) === null || _settings$strings6 === void 0 ? void 0 : _settings$strings6.tech_support_url_field_prefix,\n loginRenameNotifyAdminEmail: (_settings$strings7 = settings.strings) === null || _settings$strings7 === void 0 ? void 0 : _settings$strings7.login_rename_notify_admin_email,\n canActivatePlugins: (_settings$flags = settings.flags) === null || _settings$flags === void 0 ? void 0 : _settings$flags.canActivatePlugins,\n shuffleSaltsUnlocked: (_settings$flags2 = settings.flags) === null || _settings$flags2 === void 0 ? void 0 : _settings$flags2.shuffleSaltsUnlocked,\n visitorCurrentIp: (_settings$strings8 = settings.strings) === null || _settings$strings8 === void 0 ? void 0 : _settings$strings8.visitorCurrentIp,\n nextScheduledScanDescription: (_settings$strings9 = settings.strings) === null || _settings$strings9 === void 0 ? void 0 : _settings$strings9.nextScheduledScanDescription,\n scannerAutoStartManualTimezone: (_settings$strings0 = settings.strings) === null || _settings$strings0 === void 0 ? void 0 : _settings$strings0.scannerAutoStartManualTimezone,\n wlCompanyName: (_settings$strings1 = settings.strings) === null || _settings$strings1 === void 0 ? void 0 : _settings$strings1.wlCompanyName,\n visitorIpSources: (_settings$objects4 = settings.objects) === null || _settings$objects4 === void 0 ? void 0 : _settings$objects4.visitorIpSources,\n scannerExclusionsDir: (_settings$objects5 = settings.objects) === null || _settings$objects5 === void 0 ? void 0 : _settings$objects5.scannerExclusionsDir,\n scannerExclusionsURL: (_settings$objects6 = settings.objects) === null || _settings$objects6 === void 0 ? void 0 : _settings$objects6.scannerExclusionsURL\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_QuickNavigation_QuickNavigation__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n keyIsOk: keyIsOk\n }))));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js?\n}"); /***/ }, @@ -2495,85 +2495,53 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ return module.exports; /******/ } /******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = __webpack_modules__; -/******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ const getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ const getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; /******/ /******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter/value functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ if(Array.isArray(definition)) { -/******/ var i = 0; -/******/ while(i < definition.length) { -/******/ var key = definition[i++]; -/******/ var binding = definition[i++]; -/******/ if(!__webpack_require__.o(exports, key)) { -/******/ if(binding === 0) { -/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] }); -/******/ } else { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding }); -/******/ } -/******/ } else if(binding === 0) { i++; } -/******/ } -/******/ } else { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } +/******/ // define getter/value functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } -/******/ }; -/******/ })(); +/******/ } +/******/ }; /******/ /******/ /* webpack/runtime/global */ -/******/ (() => { -/******/ __webpack_require__.g = (function() { -/******/ if (typeof globalThis === 'object') return globalThis; -/******/ try { -/******/ return this || new Function('return this')(); -/******/ } catch (e) { -/******/ if (typeof window === 'object') return window; -/******/ } -/******/ })(); +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)); /******/ /******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; /******/ /******/ /* webpack/runtime/node module decorator */ -/******/ (() => { -/******/ __webpack_require__.nmd = (module) => { -/******/ module.paths = []; -/******/ if (!module.children) module.children = []; -/******/ return module; -/******/ }; -/******/ })(); +/******/ __webpack_require__.nmd = (module) => { +/******/ module.paths = []; +/******/ if (!module.children) module.children = []; +/******/ return module; +/******/ }; /******/ /******/ /* webpack/runtime/publicPath */ /******/ (() => { @@ -2587,14 +2555,14 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ const scripts = document.getElementsByTagName("script"); /******/ if(scripts.length) { /******/ let i = scripts.length - 1; -/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; +/******/ while (i > -1 && (!scriptUrl || !/^https?:/.test(scriptUrl))) scriptUrl = scripts[i--].src; /******/ } /******/ } /******/ } /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic. /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser"); -/******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/"); +/******/ scriptUrl = scriptUrl.replace(/^blob:|[?#].*$/g, "").replace(/\/[^/]+$/, "/"); /******/ __webpack_require__.p = scriptUrl; /******/ })(); /******/ @@ -2602,12 +2570,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ (() => { /******/ __webpack_require__.b = (typeof document !== 'undefined' && document.baseURI) || self.location.href; /******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ const installedChunks = { -/******/ "main": 0 -/******/ }; +/******/ // no installed chunks /******/ /******/ // no chunk on demand loading /******/ @@ -2625,9 +2588,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ })(); /******/ /******/ /* webpack/runtime/nonce */ -/******/ (() => { -/******/ __webpack_require__.nc = undefined; -/******/ })(); +/******/ __webpack_require__.nc = undefined; /******/ /************************************************************************/ /******/ diff --git a/js/spbc-settings.min.js b/js/spbc-settings.min.js index af31b2f07..dcc079615 100644 --- a/js/spbc-settings.min.js +++ b/js/spbc-settings.min.js @@ -1,2 +1,2 @@ -function spbcSwitchTab(e,t){var s=e.classList[1].replace("spbc_tab_nav-",""),n=new URLSearchParams(window.location.search),c=(n.set("spbc_tab",s),window.location.hash),c=window.location.pathname+"?"+n.toString()+c;if(history.replaceState(null,"",c),"backups"!==n.get("spbc_tab")&&jQuery(".spbc_tab_nav-backups").hide(),jQuery(".spbc_tab_nav").removeClass("spbc_tab_nav--active"),jQuery(".spbc_tab").removeClass("spbc_tab--active"),jQuery(e).addClass("spbc_tab_nav--active"),jQuery(".spbc_tab-"+s).addClass("spbc_tab--active"),jQuery(e).data("loaded")){if(t&&t.action)switch(t.action){case"highlight":spbcHighlightElement(t.target,t.times);break;case"click":setTimeout(function(){jQuery("#"+t.additional.target).click()},500)}}else{c={action:"spbc_settings__draw_elements",tab_name:s,security:spbcSettings.ajax_nonce};t={callback:spbcDrawSettingsCallback,notJson:!0,additional:t||null},spbcSendAJAXRequest(c,t,e)}}function spbcDrawSettingsCallback(e,t,s,n){jQuery(n).data("loaded",!0),jQuery(".spbc_tab-"+t.tab_name).replaceWith(e);n=jQuery(".spbc_tab-"+t.tab_name);if(n.addClass("spbc_tab--active"),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("data-setting")||self.attr("setting"))}),s.additional)switch(s.additional.action){case"highlight":spbcHighlightElement(s.additional.target,s.additional.times);break;case"click":setTimeout(function(){jQuery("#"+s.additional.target).click()},500)}jQuery(n).on("click",".spbc_hint-send_"+t.tab_name,function(){jQuery(".spbc_hint-send_"+t.tab_name).hide(),spbcSendAJAXRequest({action:"spbc_send_"+t.tab_name,tab_name:t.tab_name},{callback:spbcSendLogsCallback})}),window.location.hash&&null!==(e=document.getElementById(window.location.hash.substring(1)))&&e.scrollIntoView(),"function"==typeof spbcHighlightCriticalFilesNotice&&spbcHighlightCriticalFilesNotice(!1),spbcSaveSettingsButtonMobileLayout(),window.addEventListener("resize",e=>{spbcSaveSettingsButtonMobileLayout()})}function spbcSaveSettingsButtonMobileLayout(){var e=document.querySelector('div[name="spbc_settings--save_button_custom"]');e&&(900"+e.desc+"
"),jQuery(document).on("click",c)}},s)}function spbcStartShowHide(){jQuery(".spbcShortText").off("mouseover").on("mouseover",function(){jQuery(this).next().show()}).off("mouseout").on("mouseout",function(){jQuery(this).next().hide()}),jQuery(".spbcFullText").off("mouseout").on("mouseout",function(){jQuery(this).hide()}).off("mouseover").on("mouseover",function(){jQuery(this).show()})}function spbcScannerReloadScanInfo(){jQuery(".spbc_hint__last_scan_title").text(spbcScaner.look_below_for_scan_res);spbcSendAJAXRequest({action:"spbc_scanner__last_scan_info"},{callback:e=>{document.getElementById("spbc_scanner__last_scan_info").innerText=e.data}})}function spbcBannerCheck(){let c=setInterval(function(){spbcSendAJAXRequest({action:"spbc_settings__check_renew_banner"},{callback:function(e,t,s,n){e.close_renew_banner&&(jQuery("#spbc_renew_notice").length&&jQuery("#spbc_renew_notice").hide("slow"),jQuery("#spbc_trial_notice").length&&jQuery("#spbc_trial_notice").hide("slow"),clearInterval(c))}})},6e4)}function spbcToggleClass(t,s){for(let e=0;e"+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_export_button",function(){jQuery("#spbc-ajax-result").remove();var t=jQuery("option:selected",jQuery("#spbc_settings_templates_export")),s=jQuery("#spbc_settings_templates_export_name");if(s.css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{let e;if("new_template"===t.data("id")){var n=s.val();if(""===n)return void s.css("border-color","red");e={template_name:n}}else e={template_id:t.data("id")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_export",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_export_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_export_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_export_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_reset_button",function(){let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_reset"},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_reset_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_reset_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_reset_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}),jQuery(document).on("change","#spbc_settings_templates_export",function(){"new_template"===jQuery("option:selected",this).data("id")?jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").show():jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").hide()}),jQuery(document).on("click","#spbc-change-account-email",function(e){e.preventDefault();var e=jQuery(this),t=jQuery("#spbc-account-email"),s=t.text();spbcToggleClass(e,"active"),e.hasClass("active")?(e.text(e.data("save-text")),t.attr("contenteditable","true"),t.focus(),t.on("keydown",function(e){"Enter"===e.code&&e.preventDefault()}),t.on("input",function(e){"insertParagraph"===e.inputType&&e.preventDefault()})):(spbcSendAJAXRequest({action:"spbc_update_account_email",accountEmail:s},{timeout:5e3,callback:function(e,t,s,n){void 0!==e.success&&"ok"===e.success&&void 0!==e.manuallyLink&&jQuery("#spbc-key-manually-link").attr("href",e.manuallyLink),void 0!==e.error&&jQuery("#spbc-account-email").css("border-color","red")},errorOutput:function(e){spbcModal.loaded=e,spbcModal.open()}}),t.attr("contenteditable","false"),e.text(e.data("default-text")))}),jQuery(document).on("click",".spbct_notice-dismiss",function(e){var t=this.parentElement.classList;let s=t[t.length-1];document.querySelectorAll("."+s).forEach(e=>{e.parentElement.setAttribute("style","display:none;"),spbcSetCookie(s,1,2592e3)})}),jQuery(document).off("click",".spbc_long_description__show"),jQuery(document).on("click",".spbc_long_description__show",function(){self=jQuery(this),spbcHandleLongDescription(self,self.attr("data-setting")||self.attr("setting"))}),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("data-setting")||self.attr("setting"))}),document.referrer&&-1!==document.referrer.indexOf("page=spbc")||sessionStorage.removeItem("spbc_trial_renew_fullpage_dismissed"),sessionStorage.getItem("spbc_trial_renew_fullpage_dismissed")&&(jQuery(".spbc-trial-renew-fullpage").hide(),jQuery("#spbct-page--react").show()),jQuery("body").on("click",".spbc-trial-renew-fullpage .notice-dismiss",function(e){e.preventDefault(),sessionStorage.setItem("spbc_trial_renew_fullpage_dismissed","1"),jQuery(".spbc-trial-renew-fullpage").hide(),jQuery("#spbct-page--react").show()}),jQuery(document).off("click","#spbc_debug__run_pass_check_btn").on("click","#spbc_debug__run_pass_check_btn",function(){let t=jQuery(this),s=jQuery("#spbc_debug__pass_check_status");t.prop("disabled",!0),s.css("color","").text("Resetting records and running check, please wait..."),jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"spbc_debug_users_pass_check_run",security:spbcSettings.ajax_nonce},success:function(e){t.prop("disabled",!1),e.success?s.css("color","green").html("✓ Done! Total: "+e.data.total+", Checked: "+e.data.checked+", Leaked: "+e.data.leaked+" — You can now test the login form in incognito."):s.css("color","red").text("Error: "+(e.data||"unknown error"))},error:function(e){t.prop("disabled",!1),s.css("color","red").text("Request failed: "+e.status+" "+e.statusText)}})})}); +function spbcSwitchTab(e,t){var s=e.classList[1].replace("spbc_tab_nav-",""),n=new URLSearchParams(window.location.search),c=(n.set("spbc_tab",s),window.location.hash),c=window.location.pathname+"?"+n.toString()+c;if(history.replaceState(null,"",c),"backups"!==n.get("spbc_tab")&&jQuery(".spbc_tab_nav-backups").hide(),jQuery(".spbc_tab_nav").removeClass("spbc_tab_nav--active"),jQuery(".spbc_tab").removeClass("spbc_tab--active"),jQuery(e).addClass("spbc_tab_nav--active"),jQuery(".spbc_tab-"+s).addClass("spbc_tab--active"),jQuery(e).data("loaded")){if(t&&t.action)switch(t.action){case"highlight":spbcHighlightElement(t.target,t.times);break;case"click":setTimeout(function(){jQuery("#"+t.additional.target).click()},500)}}else{c={action:"spbc_settings__draw_elements",tab_name:s,security:spbcSettings.ajax_nonce};t={callback:spbcDrawSettingsCallback,notJson:!0,additional:t||null},spbcSendAJAXRequest(c,t,e)}}function spbcDrawSettingsCallback(e,t,s,n){jQuery(n).data("loaded",!0),jQuery(".spbc_tab-"+t.tab_name).replaceWith(e);n=jQuery(".spbc_tab-"+t.tab_name);if(n.addClass("spbc_tab--active"),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("data-setting")||self.attr("setting"))}),s.additional)switch(s.additional.action){case"highlight":spbcHighlightElement(s.additional.target,s.additional.times);break;case"click":setTimeout(function(){jQuery("#"+s.additional.target).click()},500)}jQuery(n).on("click",".spbc_hint-send_"+t.tab_name,function(){jQuery(".spbc_hint-send_"+t.tab_name).hide(),spbcSendAJAXRequest({action:"spbc_send_"+t.tab_name,tab_name:t.tab_name},{callback:spbcSendLogsCallback})}),window.location.hash&&null!==(e=document.getElementById(window.location.hash.substring(1)))&&e.scrollIntoView(),"function"==typeof spbcHighlightCriticalFilesNotice&&spbcHighlightCriticalFilesNotice(!1),spbcSaveSettingsButtonMobileLayout(),window.addEventListener("resize",e=>{spbcSaveSettingsButtonMobileLayout()})}function spbcSaveSettingsButtonMobileLayout(){var e=document.querySelector('div[name="spbc_settings--save_button_custom"]');e&&(900"+e.desc+"
"),jQuery(document).on("click",c)}},s)}function spbcStartShowHide(){jQuery(".spbcShortText").off("mouseover").on("mouseover",function(){jQuery(this).next().show()}).off("mouseout").on("mouseout",function(){jQuery(this).next().hide()}),jQuery(".spbcFullText").off("mouseout").on("mouseout",function(){jQuery(this).hide()}).off("mouseover").on("mouseover",function(){jQuery(this).show()})}function spbcScannerReloadScanInfo(){jQuery(".spbc_hint__last_scan_title").text(spbcScaner.look_below_for_scan_res);spbcSendAJAXRequest({action:"spbc_scanner__last_scan_info"},{callback:e=>{document.getElementById("spbc_scanner__last_scan_info").innerText=e.data}})}function spbcBannerCheck(){let c=setInterval(function(){spbcSendAJAXRequest({action:"spbc_settings__check_renew_banner"},{callback:function(e,t,s,n){e.close_renew_banner&&(jQuery("#spbc_renew_notice").length&&jQuery("#spbc_renew_notice").hide("slow"),jQuery("#spbc_trial_notice").length&&jQuery("#spbc_trial_notice").hide("slow"),clearInterval(c))}})},6e4)}function spbcCreateSupportUser(e){e.preventDefault();e=spbcSettings.support_user_creation_msg_array;spbcModal.open(),spbcModal.confirm(e.confirm_header,e.confirm_text,"",spbcCreateUserCallback)}function spbcCreateUserCallback(){spbcSendAJAXRequest({action:"spbc_create_support_user"},{timeout:5e3,callback:function(s,e,t,n){var c=spbcSettings.support_user_creation_msg_array;let a=c.default_error;if("object"==typeof s&&s.hasOwnProperty("success")&&s.hasOwnProperty("user_created")&&s.hasOwnProperty("mail_sent")&&s.hasOwnProperty("cron_updated")&&s.hasOwnProperty("user_data")&&s.hasOwnProperty("result_code")&&"object"==typeof s.user_data&&s.user_data.hasOwnProperty("username")&&s.user_data.hasOwnProperty("email")&&s.user_data.hasOwnProperty("password")&&s.success){if(s.user_created){let e="",t="";var o=c.cron_updated;return e=s.mail_sent?c.mail_sent_success:c.mail_sent_error,t=0===s.result_code?c.user_updated:c.user_created,jQuery("#spbc_stats_user_creation_username").text(s.user_data.username),jQuery("#spbc_stats_user_creation_email").text(s.user_data.email),jQuery("#spbc_stats_user_creation_password").text(s.user_data.password),jQuery("#spbc_stats_user_creation_mail_sent").text(e),jQuery("#spbc_stats_user_creation_title").text(t),jQuery("#spbc_stats_user_creation_cron_updated").text(o),void jQuery(".spbc_stats_user_creation_result").css("display","block")}-2===s.result_code?a=c.invalid_permission:-1===s.result_code?a=c.unknown_creation_error:-4===s.result_code?a=c.on_cooldown:-5===s.result_code&&(a=c.email_is_busy)}spbcModal.loaded=a,spbcModal.open()},errorOutput:function(e){spbcModal.loaded=e,spbcModal.open()}})}String.prototype.printf=function(){let e=this;for(var t in arguments){var s=e.substring(0,e.indexOf("%s",0)),n=e.substring(e.indexOf("%s",0)+2,e.length);e=s+arguments[t]+n}return e},jQuery(document).ready(function(){(jQuery("#spbc_renew_notice").length||jQuery("#spbc_trial_notice").length)&&spbcBannerCheck(),spbcSettings.key_changed&&jQuery("#spbc_button__sync").click(),jQuery(document).on("click","#spbc_settings_templates_import_button",function(){jQuery("#spbc-ajax-result").remove();var e=jQuery("option:selected",jQuery("#spbc_settings_templates_import"));if(jQuery("#spbc_settings_templates_import_name").css("border-color","inherit"),void 0===e.data("id"))console.log('Attribute "data-id" not set for the option.');else{e={template_id:e.data("id"),template_name:e.data("name"),settings:e.data("settings")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_import",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_import_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_import_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_import_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_export_button",function(){jQuery("#spbc-ajax-result").remove();var t=jQuery("option:selected",jQuery("#spbc_settings_templates_export")),s=jQuery("#spbc_settings_templates_export_name");if(s.css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{let e;if("new_template"===t.data("id")){var n=s.val();if(""===n)return void s.css("border-color","red");e={template_name:n}}else e={template_id:t.data("id")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_export",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_export_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_export_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_export_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_reset_button",function(){let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_reset"},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_reset_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_reset_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_reset_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}),jQuery(document).on("change","#spbc_settings_templates_export",function(){"new_template"===jQuery("option:selected",this).data("id")?jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").show():jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").hide()}),jQuery(document).on("click",".spbct_notice-dismiss",function(e){var t=this.parentElement.classList;let s=t[t.length-1];document.querySelectorAll("."+s).forEach(e=>{e.parentElement.setAttribute("style","display:none;"),spbcSetCookie(s,1,2592e3)})}),jQuery(document).off("click",".spbc_long_description__show"),jQuery(document).on("click",".spbc_long_description__show",function(){self=jQuery(this),spbcHandleLongDescription(self,self.attr("data-setting")||self.attr("setting"))}),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("data-setting")||self.attr("setting"))}),document.referrer&&-1!==document.referrer.indexOf("page=spbc")||sessionStorage.removeItem("spbc_trial_renew_fullpage_dismissed"),sessionStorage.getItem("spbc_trial_renew_fullpage_dismissed")&&(jQuery(".spbc-trial-renew-fullpage").hide(),jQuery("#spbct-page--react").show()),jQuery("body").on("click",".spbc-trial-renew-fullpage .notice-dismiss",function(e){e.preventDefault(),sessionStorage.setItem("spbc_trial_renew_fullpage_dismissed","1"),jQuery(".spbc-trial-renew-fullpage").hide(),jQuery("#spbct-page--react").show()}),jQuery(document).off("click","#spbc_debug__run_pass_check_btn").on("click","#spbc_debug__run_pass_check_btn",function(){let t=jQuery(this),s=jQuery("#spbc_debug__pass_check_status");t.prop("disabled",!0),s.css("color","").text("Resetting records and running check, please wait..."),jQuery.ajax({type:"POST",url:ajaxurl,data:{action:"spbc_debug_users_pass_check_run",security:spbcSettings.ajax_nonce},success:function(e){t.prop("disabled",!1),e.success?s.css("color","green").html("✓ Done! Total: "+e.data.total+", Checked: "+e.data.checked+", Leaked: "+e.data.leaked+" — You can now test the login form in incognito."):s.css("color","red").text("Error: "+(e.data||"unknown error"))},error:function(e){t.prop("disabled",!1),s.css("color","red").text("Request failed: "+e.status+" "+e.statusText)}})})}); //# sourceMappingURL=spbc-settings.min.js.map diff --git a/js/spbc-settings.min.js.map b/js/spbc-settings.min.js.map index bb24bc3a9..1c0a4d027 100644 --- a/js/spbc-settings.min.js.map +++ b/js/spbc-settings.min.js.map @@ -1 +1 @@ -{"version":3,"file":"spbc-settings.min.js","sources":["spbc-settings.js"],"sourcesContent":["// Printf for JS\nString.prototype.printf = function() { // eslint-disable-line no-extend-native\n let formatted = this;\n /* eslint-disable guard-for-in */\n for ( let arg in arguments ) { // eslint-disable-line prefer-rest-params\n let beforeFormatted = formatted.substring(0, formatted.indexOf('%s', 0));\n let afterFormatted = formatted.substring(formatted.indexOf('%s', 0)+2, formatted.length);\n formatted = beforeFormatted + arguments[arg] + afterFormatted; // eslint-disable-line prefer-rest-params\n }\n return formatted;\n};\n\n/**\n * Switching tabs\n *\n * @param {object} tab\n * @param {object} params\n */\nfunction spbcSwitchTab(tab, params) {\n let tabName = tab.classList[1].replace('spbc_tab_nav-', '');\n\n // update url\n let searchParams = new URLSearchParams(window.location.search);\n searchParams.set('spbc_tab', tabName);\n let hashParam = window.location.hash;\n let newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + hashParam;\n\n history.replaceState(null, '', newRelativePathQuery);\n\n // Hiding a tab 'Backups' if exist\n if (searchParams.get('spbc_tab') !== 'backups') {\n jQuery('.spbc_tab_nav-backups').hide();\n }\n\n // update active tab\n jQuery('.spbc_tab_nav').removeClass('spbc_tab_nav--active');\n jQuery('.spbc_tab').removeClass('spbc_tab--active');\n jQuery(tab).addClass('spbc_tab_nav--active');\n jQuery('.spbc_tab-' + tabName).addClass('spbc_tab--active');\n\n if (!jQuery(tab).data('loaded')) {\n let data = {\n action: 'spbc_settings__draw_elements',\n tab_name: tabName,\n security: spbcSettings.ajax_nonce,\n };\n params = {\n callback: spbcDrawSettingsCallback,\n notJson: true,\n additional: params || null,\n };\n spbcSendAJAXRequest( data, params, tab );\n } else if (params && params.action) {\n switch (params.action) {\n case 'highlight':\n spbcHighlightElement(params.target, params.times);\n break;\n case 'click':\n setTimeout(function() {\n jQuery('#'+params.additional.target).click();\n }, 500);\n break;\n }\n }\n}\n\n/**\n * Draws settings\n *\n * @param {*} result\n * @param {*} data\n * @param {*} params\n * @param {*} obj\n */\nfunction spbcDrawSettingsCallback(result, data, params, obj) {\n jQuery(obj).data('loaded', true);\n jQuery('.spbc_tab-'+data.tab_name).replaceWith(result);\n let tab = jQuery('.spbc_tab-'+data.tab_name);\n tab.addClass('spbc_tab--active');\n\n jQuery(document).off( 'click', '.spbc_long_recommendation__show');\n jQuery(document).on('click', '.spbc_long_recommendation__show', function() {\n self = jQuery(this);\n spbcSettingsShowRecommendation(self, self.attr('data-setting') || self.attr('setting'));\n });\n\n if (params.additional) {\n switch (params.additional.action) {\n case 'highlight':\n spbcHighlightElement(params.additional.target, params.additional.times);\n break;\n case 'click':\n setTimeout(function() {\n jQuery('#'+params.additional.target).click();\n }, 500);\n break;\n }\n }\n\n jQuery(tab).on('click', '.spbc_hint-send_'+data.tab_name, function() {\n jQuery('.spbc_hint-send_'+data.tab_name).hide();\n spbcSendAJAXRequest(\n {action: 'spbc_send_'+data.tab_name, tab_name: data.tab_name},\n {callback: spbcSendLogsCallback},\n );\n });\n\n // scroll to anchor\n if (window.location.hash) {\n let scrollToTag = document.getElementById(window.location.hash.substring(1));\n if (scrollToTag !== null) {\n scrollToTag.scrollIntoView();\n }\n }\n\n if (typeof spbcHighlightCriticalFilesNotice === 'function') {\n spbcHighlightCriticalFilesNotice(false);\n }\n\n spbcSaveSettingsButtonMobileLayout();\n window.addEventListener('resize', (event) => {\n spbcSaveSettingsButtonMobileLayout();\n });\n}\n\n/**\n * A chunk to hide the custom element \"submit button\" on large screen or make sticky on mobile\n */\nfunction spbcSaveSettingsButtonMobileLayout() {\n const selector = document.querySelector('div[name=\"spbc_settings--save_button_custom\"]');\n if (selector) {\n if (window.innerWidth > 900) {\n selector.style.display = 'none';\n } else {\n selector.style.display = 'flex';\n }\n }\n}\n\n/**\n * Sends logs\n *\n * @param {*} result\n * @param {*} data\n * @param {*} params\n * @param {*} obj\n */\nfunction spbcSendLogsCallback(result, data, params, obj) {\n jQuery('.spbc_tab_nav-'+data.tab_name).data('loaded', false);\n spbcSwitchTab(document.getElementsByClassName('spbc_tab_nav-'+data.tab_name)[0]);\n}\n\n/**\n * Disables/enables settings by ID\n *\n * @param {array} settingsIDs\n * @param {number} enable\n */\nfunction spbcSettingsDependenciesbyId(settingsIDs, enable) { // eslint-disable-line no-unused-vars\n if (typeof settingsIDs === 'string') {\n tmp = [];\n tmp.push(settingsIDs);\n settingsIDs = tmp;\n }\n\n enable = typeof enable === 'undefined' ? null : +enable;\n\n settingsIDs.forEach(function(settingID, i, arr) {\n let elem = document.getElementById('spbc_setting_'+settingID);\n let doDisable = function() {\n elem.setAttribute('disabled', 'disabled');\n };\n let doEnable = function() {\n elem.removeAttribute('disabled');\n };\n\n if (enable !== null) {\n // Set\n enable === 1 ? doEnable() : doDisable();\n } else {\n // Switch\n elem.getAttribute('disabled') === null ? doDisable() : doEnable();\n }\n });\n}\n\n/**\n * Recursive in case children found!\n *\n * Settings dependencies\n *\n * @param {array} settingNames\n * @param {number} enable\n */\nfunction spbcSettingsDependencies(settingNames, enable) { // eslint-disable-line no-unused-vars\n // Cast settingNames to array\n const eventTarget = window.event && window.event.target ? window.event.target : null;\n const isRadio = eventTarget && eventTarget.type === 'radio';\n const radioEnabled = isRadio && eventTarget.value == '1';\n const targetEnableFlag = eventTarget ?\n ((isRadio && !radioEnabled) || +eventTarget.checked) :\n null;\n const doEnableFlag = typeof enable === 'undefined' ? targetEnableFlag : +enable;\n\n settingNames = typeof settingNames === 'string' ? settingNames.split(',') : settingNames;\n\n settingNames.forEach(function(settingName, i, arr) {\n let elements = document.getElementsByName('spbc_settings['+settingName+']');\n if (elements.length === 0) {\n // multiple selector case\n elements = document.getElementsByName('spbc_settings['+settingName+'][]');\n }\n\n elements\n .forEach(function( elem, i, arr ) {\n let doDisable = function() {\n elem.setAttribute('disabled', 'disabled');\n };\n let doEnable = function() {\n elem.removeAttribute('disabled');\n };\n if (doEnableFlag !== null) {\n // Set\n doEnableFlag === 1 ? doEnable() : doDisable();\n } else {\n // Switch\n elem.getAttribute('disabled') === null ? doDisable() : doEnable();\n }\n\n let children = elem.getAttribute('data-children');\n if ( children !== null ) {\n spbcSettingsDependencies(children, doEnableFlag && elem.checked);\n }\n });\n });\n}\n\n/**\n * Shows recommendation\n *\n * @param {object} label\n * @param {string} settingId\n */\nfunction spbcSettingsShowRecommendation(label, settingId) {\n let removeRecommendationFunc = function(e) {\n if (\n typeof e === 'undefined' ||\n (\n jQuery(e.target).parent('.spbc_long_desc').length == 0 ||\n jQuery(e.target).hasClass('spbc_long_desc__cancel')\n ) && !jQuery(e.target).hasClass('spbc_long_recommendation__show')\n ) {\n jQuery('.spbc_long_desc').remove();\n jQuery(document).off('click', removeRecommendationFunc);\n }\n };\n\n removeRecommendationFunc();\n\n label.after('');\n let obj = jQuery('#spbc_long_desc__'+settingId);\n obj.append('')\n .append('')\n .css({\n top: label.position().top + 25,\n left: label.position().left + 5,\n });\n\n\n spbcSendAJAXRequest(\n {action: 'spbc_settings__get_recommendation', setting_id: settingId},\n {\n spinner: obj.children('img'),\n callback: function(result, data, params, obj) {\n obj.empty()\n .append('')\n .append('')\n .append(''+result.desc+'
');\n\n jQuery(document).on('click', removeRecommendationFunc);\n },\n },\n obj,\n );\n}\n\n/**\n * Shows/hides full text\n */\nfunction spbcStartShowHide() { // eslint-disable-line no-unused-vars\n jQuery('.spbcShortText')\n .off('mouseover' )\n .on('mouseover', function() {\n jQuery(this).next().show();\n })\n .off('mouseout' )\n .on('mouseout', function() {\n jQuery(this).next().hide();\n });\n jQuery('.spbcFullText')\n .off('mouseout' )\n .on('mouseout', function() {\n jQuery(this).hide();\n })\n .off('mouseover' )\n .on('mouseover', function() {\n jQuery(this).show();\n });\n}\n\n/**\n * Reloads last scan info\n */\nfunction spbcScannerReloadScanInfo() { // eslint-disable-line no-unused-vars\n jQuery('.spbc_hint__last_scan_title').text(spbcScaner.look_below_for_scan_res);\n const data = {\n action: 'spbc_scanner__last_scan_info',\n };\n const params = {\n callback: (result) => {\n document.getElementById('spbc_scanner__last_scan_info').innerText = result.data;\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Checking current account status for renew notice\n */\nfunction spbcBannerCheck() {\n let bannerChecker = setInterval( function() {\n spbcSendAJAXRequest(\n {action: 'spbc_settings__check_renew_banner'},\n {\n callback: function(result, data, params, obj) {\n if (result.close_renew_banner) {\n if (jQuery('#spbc_renew_notice').length) {\n jQuery('#spbc_renew_notice').hide('slow');\n }\n if (jQuery('#spbc_trial_notice').length) {\n jQuery('#spbc_trial_notice').hide('slow');\n }\n clearInterval(bannerChecker);\n }\n },\n },\n );\n }, 60000);\n}\n\njQuery(document).ready(function() {\n if (jQuery('#spbc_renew_notice').length || jQuery('#spbc_trial_notice').length) {\n spbcBannerCheck();\n }\n\n // Sync button migrated to react\n\n if ( spbcSettings.key_changed ) {\n jQuery('#spbc_button__sync').click();\n }\n\n // Get Key Auto button migrated to Signup Wizard\n\n // Import settings\n jQuery( document ).on('click', '#spbc_settings_templates_import_button', function() {\n jQuery('#spbc-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#spbc_settings_templates_import'));\n let templateNameInput = jQuery('#spbc_settings_templates_import_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data = {\n 'template_id': optionSelected.data('id'),\n 'template_name': optionSelected.data('name'),\n 'settings': optionSelected.data('settings'),\n };\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_import', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_import_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_import_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_import_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Export settings\n jQuery( document ).on('click', '#spbc_settings_templates_export_button', function() {\n jQuery('#spbc-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#spbc_settings_templates_export'));\n let templateNameInput = jQuery('#spbc_settings_templates_export_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data;\n if ( optionSelected.data('id') === 'new_template' ) {\n let templateName = templateNameInput.val();\n if ( templateName === '' ) {\n templateNameInput.css('border-color', 'red');\n return;\n }\n data = {\n 'template_name': templateName,\n };\n } else {\n data = {\n 'template_id': optionSelected.data('id'),\n };\n }\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_export', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_export_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_export_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_export_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Reset settings\n jQuery( document ).on('click', '#spbc_settings_templates_reset_button', function() {\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_reset'},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_reset_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_reset_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_reset_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n jQuery(document).on('change', '#spbc_settings_templates_export', function() {\n let optionSelected = jQuery('option:selected', this);\n if ( optionSelected.data('id') === 'new_template' ) {\n jQuery(this).parent().parent().find('#spbc_settings_templates_export_name').show();\n } else {\n jQuery(this).parent().parent().find('#spbc_settings_templates_export_name').hide();\n }\n });\n\n //* TAB_CONTROL\n // migrated to react\n //* / REFRESH TAB IF ctrl+F5 END\n\n /**\n * Change cleantalk account email\n */\n jQuery(document).on('click', '#spbc-change-account-email', function(e) {\n e.preventDefault();\n\n let $this = jQuery(this);\n let accountEmailField = jQuery('#spbc-account-email');\n let accountEmail = accountEmailField.text();\n\n spbcToggleClass($this, 'active');\n\n if ($this.hasClass('active')) {\n $this.text($this.data('save-text'));\n accountEmailField.attr('contenteditable', 'true');\n accountEmailField.focus();\n accountEmailField.on('keydown', function(e) {\n if (e.code === 'Enter') {\n e.preventDefault();\n }\n });\n accountEmailField.on('input', function(e) {\n if (e.inputType === 'insertParagraph') {\n e.preventDefault();\n }\n });\n } else {\n spbcSendAJAXRequest(\n {\n action: 'spbc_update_account_email',\n accountEmail: accountEmail,\n },\n {\n timeout: 5000,\n callback: function(result, data, params, obj) {\n if (result.success !== undefined && result.success === 'ok') {\n if (result.manuallyLink !== undefined) {\n jQuery('#spbc-key-manually-link').attr('href', result.manuallyLink);\n }\n }\n\n if (result.error !== undefined) {\n jQuery('#spbc-account-email').css('border-color', 'red');\n }\n },\n errorOutput: function(msg) {\n spbcModal.loaded = msg;\n spbcModal.open();\n },\n },\n );\n\n accountEmailField.attr('contenteditable', 'false');\n $this.text($this.data('default-text'));\n }\n });\n\n // Only handle legacy banners, not React Components\n // @ToDo remove the outdated way to close notice after transferring all tabs to components.\n jQuery(document).on('click', '.spbct_notice-dismiss', function(e) {\n let classListNotice = this.parentElement.classList;\n let classNoticeForClose = classListNotice[classListNotice.length - 1];\n\n document.querySelectorAll('.' + classNoticeForClose).forEach((element) => {\n element.parentElement.setAttribute('style', 'display:none;');\n spbcSetCookie(classNoticeForClose, 1, 86400 * 30);\n });\n });\n\n // @ToDo need to be refactored - this is the code dublication\n jQuery(document).off( 'click', '.spbc_long_description__show');\n jQuery(document).on('click', '.spbc_long_description__show', function() {\n self = jQuery(this);\n spbcHandleLongDescription(self, self.attr('data-setting') || self.attr('setting'));\n });\n\n // @ToDo need to be refactored - this is the code dublication\n jQuery(document).off( 'click', '.spbc_long_recommendation__show');\n jQuery(document).on('click', '.spbc_long_recommendation__show', function() {\n self = jQuery(this);\n spbcSettingsShowRecommendation(self, self.attr('data-setting') || self.attr('setting'));\n });\n\n // Reset dismiss flag if user came from outside plugin settings\n if (!document.referrer || document.referrer.indexOf('page=spbc') === -1) {\n sessionStorage.removeItem('spbc_trial_renew_fullpage_dismissed');\n }\n\n // Hide fullpage trial banner if it was already dismissed in this browser session\n if (sessionStorage.getItem('spbc_trial_renew_fullpage_dismissed')) {\n jQuery('.spbc-trial-renew-fullpage').hide();\n jQuery('#spbct-page--react').show();\n }\n\n jQuery('body').on('click', '.spbc-trial-renew-fullpage .notice-dismiss', function(e) {\n e.preventDefault();\n sessionStorage.setItem('spbc_trial_renew_fullpage_dismissed', '1');\n jQuery('.spbc-trial-renew-fullpage').hide();\n jQuery('#spbct-page--react').show();\n });\n\n jQuery(document)\n .off('click', '#spbc_debug__run_pass_check_btn')\n .on('click', '#spbc_debug__run_pass_check_btn', function() {\n let $btn = jQuery(this);\n let $st = jQuery('#spbc_debug__pass_check_status');\n $btn.prop('disabled', true);\n $st.css('color', '').text('Resetting records and running check, please wait...');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: {\n action: 'spbc_debug_users_pass_check_run',\n security: spbcSettings.ajax_nonce,\n },\n success: function(response) {\n $btn.prop('disabled', false);\n if (response.success) {\n $st.css('color', 'green').html(\n '✓ Done! Total: ' + response.data.total +\n ', Checked: ' + response.data.checked +\n ', Leaked: ' + response.data.leaked +\n ' — You can now test the login form in incognito.',\n );\n } else {\n $st.css('color', 'red').text('Error: ' + (response.data || 'unknown error'));\n }\n },\n error: function(xhr) {\n $btn.prop('disabled', false);\n $st.css('color', 'red').text('Request failed: ' + xhr.status + ' ' + xhr.statusText);\n },\n });\n });\n});\n\n/**\n * Toggle class for DOM elements\n * @param {Array} arr\n * @param {string} className\n * @return {void}\n */\nfunction spbcToggleClass(arr, className) {\n for (let i=0; i'+result.desc+'
');\n\n jQuery(document).on('click', removeRecommendationFunc);\n },\n },\n obj,\n );\n}\n\n/**\n * Shows/hides full text\n */\nfunction spbcStartShowHide() { // eslint-disable-line no-unused-vars\n jQuery('.spbcShortText')\n .off('mouseover' )\n .on('mouseover', function() {\n jQuery(this).next().show();\n })\n .off('mouseout' )\n .on('mouseout', function() {\n jQuery(this).next().hide();\n });\n jQuery('.spbcFullText')\n .off('mouseout' )\n .on('mouseout', function() {\n jQuery(this).hide();\n })\n .off('mouseover' )\n .on('mouseover', function() {\n jQuery(this).show();\n });\n}\n\n/**\n * Reloads last scan info\n */\nfunction spbcScannerReloadScanInfo() { // eslint-disable-line no-unused-vars\n jQuery('.spbc_hint__last_scan_title').text(spbcScaner.look_below_for_scan_res);\n const data = {\n action: 'spbc_scanner__last_scan_info',\n };\n const params = {\n callback: (result) => {\n document.getElementById('spbc_scanner__last_scan_info').innerText = result.data;\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Checking current account status for renew notice\n */\nfunction spbcBannerCheck() {\n let bannerChecker = setInterval( function() {\n spbcSendAJAXRequest(\n {action: 'spbc_settings__check_renew_banner'},\n {\n callback: function(result, data, params, obj) {\n if (result.close_renew_banner) {\n if (jQuery('#spbc_renew_notice').length) {\n jQuery('#spbc_renew_notice').hide('slow');\n }\n if (jQuery('#spbc_trial_notice').length) {\n jQuery('#spbc_trial_notice').hide('slow');\n }\n clearInterval(bannerChecker);\n }\n },\n },\n );\n }, 60000);\n}\n\njQuery(document).ready(function() {\n if (jQuery('#spbc_renew_notice').length || jQuery('#spbc_trial_notice').length) {\n spbcBannerCheck();\n }\n\n // Sync button migrated to react\n\n if ( spbcSettings.key_changed ) {\n jQuery('#spbc_button__sync').click();\n }\n\n // Get Key Auto button migrated to Signup Wizard\n\n // Import settings\n jQuery( document ).on('click', '#spbc_settings_templates_import_button', function() {\n jQuery('#spbc-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#spbc_settings_templates_import'));\n let templateNameInput = jQuery('#spbc_settings_templates_import_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data = {\n 'template_id': optionSelected.data('id'),\n 'template_name': optionSelected.data('name'),\n 'settings': optionSelected.data('settings'),\n };\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_import', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_import_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_import_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_import_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Export settings\n jQuery( document ).on('click', '#spbc_settings_templates_export_button', function() {\n jQuery('#spbc-ajax-result').remove();\n let optionSelected = jQuery('option:selected', jQuery('#spbc_settings_templates_export'));\n let templateNameInput = jQuery('#spbc_settings_templates_export_name');\n templateNameInput.css('border-color', 'inherit');\n if ( typeof optionSelected.data('id') === 'undefined' ) {\n console.log( 'Attribute \"data-id\" not set for the option.' );\n return;\n }\n let data;\n if ( optionSelected.data('id') === 'new_template' ) {\n let templateName = templateNameInput.val();\n if ( templateName === '' ) {\n templateNameInput.css('border-color', 'red');\n return;\n }\n data = {\n 'template_name': templateName,\n };\n } else {\n data = {\n 'template_id': optionSelected.data('id'),\n };\n }\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_export', data: data},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_export_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_export_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_export_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n // Reset settings\n jQuery( document ).on('click', '#spbc_settings_templates_reset_button', function() {\n let button = this;\n spbcSendAJAXRequest(\n {action: 'spbc_settings_templates_reset'},\n {\n timeout: 25000,\n button: button,\n spinner: jQuery('#spbc_settings_templates_reset_button .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n let selector;\n if (result.success) {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n jQuery('#spbc_settings_templates_reset_button .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_settings_templates_reset_button .spbc_success').hide(300);\n }, 2000);\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n setTimeout(function() {\n spbcModal.close();\n }, 2000);\n } else {\n selector = '' + result.data + '
';\n jQuery( selector ).insertAfter( jQuery(button) );\n }\n },\n },\n );\n });\n\n jQuery(document).on('change', '#spbc_settings_templates_export', function() {\n let optionSelected = jQuery('option:selected', this);\n if ( optionSelected.data('id') === 'new_template' ) {\n jQuery(this).parent().parent().find('#spbc_settings_templates_export_name').show();\n } else {\n jQuery(this).parent().parent().find('#spbc_settings_templates_export_name').hide();\n }\n });\n\n // Only handle legacy banners, not React Components\n // @ToDo remove the outdated way to close notice after transferring all tabs to components.\n jQuery(document).on('click', '.spbct_notice-dismiss', function(e) {\n let classListNotice = this.parentElement.classList;\n let classNoticeForClose = classListNotice[classListNotice.length - 1];\n\n document.querySelectorAll('.' + classNoticeForClose).forEach((element) => {\n element.parentElement.setAttribute('style', 'display:none;');\n spbcSetCookie(classNoticeForClose, 1, 86400 * 30);\n });\n });\n\n // @ToDo need to be refactored - this is the code dublication\n jQuery(document).off( 'click', '.spbc_long_description__show');\n jQuery(document).on('click', '.spbc_long_description__show', function() {\n self = jQuery(this);\n spbcHandleLongDescription(self, self.attr('data-setting') || self.attr('setting'));\n });\n\n // @ToDo need to be refactored - this is the code dublication\n jQuery(document).off( 'click', '.spbc_long_recommendation__show');\n jQuery(document).on('click', '.spbc_long_recommendation__show', function() {\n self = jQuery(this);\n spbcSettingsShowRecommendation(self, self.attr('data-setting') || self.attr('setting'));\n });\n\n // Reset dismiss flag if user came from outside plugin settings\n if (!document.referrer || document.referrer.indexOf('page=spbc') === -1) {\n sessionStorage.removeItem('spbc_trial_renew_fullpage_dismissed');\n }\n\n // Hide fullpage trial banner if it was already dismissed in this browser session\n if (sessionStorage.getItem('spbc_trial_renew_fullpage_dismissed')) {\n jQuery('.spbc-trial-renew-fullpage').hide();\n jQuery('#spbct-page--react').show();\n }\n\n jQuery('body').on('click', '.spbc-trial-renew-fullpage .notice-dismiss', function(e) {\n e.preventDefault();\n sessionStorage.setItem('spbc_trial_renew_fullpage_dismissed', '1');\n jQuery('.spbc-trial-renew-fullpage').hide();\n jQuery('#spbct-page--react').show();\n });\n\n jQuery(document)\n .off('click', '#spbc_debug__run_pass_check_btn')\n .on('click', '#spbc_debug__run_pass_check_btn', function() {\n let $btn = jQuery(this);\n let $st = jQuery('#spbc_debug__pass_check_status');\n $btn.prop('disabled', true);\n $st.css('color', '').text('Resetting records and running check, please wait...');\n jQuery.ajax({\n type: 'POST',\n url: ajaxurl,\n data: {\n action: 'spbc_debug_users_pass_check_run',\n security: spbcSettings.ajax_nonce,\n },\n success: function(response) {\n $btn.prop('disabled', false);\n if (response.success) {\n $st.css('color', 'green').html(\n '✓ Done! Total: ' + response.data.total +\n ', Checked: ' + response.data.checked +\n ', Leaked: ' + response.data.leaked +\n ' — You can now test the login form in incognito.',\n );\n } else {\n $st.css('color', 'red').text('Error: ' + (response.data || 'unknown error'));\n }\n },\n error: function(xhr) {\n $btn.prop('disabled', false);\n $st.css('color', 'red').text('Request failed: ' + xhr.status + ' ' + xhr.statusText);\n },\n });\n });\n});\n\n/**\n * Action to confirm creating support user.\n * @param {event} e\n * @return {void}\n */\nfunction spbcCreateSupportUser(e) { // eslint-disable-line no-unused-vars\n e.preventDefault();\n let localTextArray = spbcSettings.support_user_creation_msg_array;\n spbcModal.open();\n spbcModal.confirm(\n localTextArray.confirm_header,\n localTextArray.confirm_text,\n '',\n spbcCreateUserCallback,\n );\n}\n\n/**\n * Support user creation callback.\n * @return {void}\n */\nfunction spbcCreateUserCallback() {\n spbcSendAJAXRequest(\n {\n action: 'spbc_create_support_user',\n },\n {\n timeout: 5000,\n callback: function(result, data, params, obj) {\n let localTextArray = spbcSettings.support_user_creation_msg_array;\n let popupMsg = localTextArray.default_error;\n const responseValid = (\n typeof result === 'object' &&\n result.hasOwnProperty('success') &&\n result.hasOwnProperty('user_created') &&\n result.hasOwnProperty('mail_sent') &&\n result.hasOwnProperty('cron_updated') &&\n result.hasOwnProperty('user_data') &&\n result.hasOwnProperty('result_code') &&\n typeof result.user_data === 'object' &&\n result.user_data.hasOwnProperty('username') &&\n result.user_data.hasOwnProperty('email') &&\n result.user_data.hasOwnProperty('password')\n );\n if (responseValid && result.success) {\n if (result.user_created) {\n let mailSentMsg = '';\n let successCreationMsg = '';\n let cronUpdatedMsg = localTextArray.cron_updated;\n\n if (result.mail_sent) {\n mailSentMsg = localTextArray.mail_sent_success;\n } else {\n mailSentMsg = localTextArray.mail_sent_error;\n }\n\n if (result.result_code === 0) {\n successCreationMsg = localTextArray.user_updated;\n } else {\n successCreationMsg = localTextArray.user_created;\n }\n\n jQuery('#spbc_stats_user_creation_username').text(result.user_data.username);\n jQuery('#spbc_stats_user_creation_email').text(result.user_data.email);\n jQuery('#spbc_stats_user_creation_password').text(result.user_data.password);\n jQuery('#spbc_stats_user_creation_mail_sent').text(mailSentMsg);\n jQuery('#spbc_stats_user_creation_title').text(successCreationMsg);\n jQuery('#spbc_stats_user_creation_cron_updated').text(cronUpdatedMsg);\n jQuery('.spbc_stats_user_creation_result').css('display', 'block');\n return;\n } else {\n if (result.result_code === -2) {\n popupMsg = localTextArray.invalid_permission;\n } else if (result.result_code === -1) {\n popupMsg = localTextArray.unknown_creation_error;\n } else if (result.result_code === -4) {\n popupMsg = localTextArray.on_cooldown;\n } else if (result.result_code === -5) {\n popupMsg = localTextArray.email_is_busy;\n }\n }\n }\n spbcModal.loaded = popupMsg;\n spbcModal.open();\n },\n errorOutput: function(msg) {\n spbcModal.loaded = msg;\n spbcModal.open();\n },\n },\n );\n}\n"],"names":["spbcSwitchTab","tab","params","let","tabName","classList","replace","searchParams","URLSearchParams","window","location","search","hashParam","set","hash","newRelativePathQuery","pathname","toString","history","replaceState","get","jQuery","hide","removeClass","addClass","data","action","spbcHighlightElement","target","times","setTimeout","additional","click","tab_name","security","spbcSettings","ajax_nonce","callback","spbcDrawSettingsCallback","notJson","spbcSendAJAXRequest","result","obj","replaceWith","document","off","on","spbcSettingsShowRecommendation","self","this","attr","spbcSendLogsCallback","scrollToTag","getElementById","substring","scrollIntoView","spbcHighlightCriticalFilesNotice","spbcSaveSettingsButtonMobileLayout","addEventListener","selector","querySelector","innerWidth","style","display","getElementsByClassName","spbcSettingsDependenciesbyId","settingsIDs","enable","tmp","push","forEach","settingID","i","arr","elem","doDisable","setAttribute","doEnable","removeAttribute","getAttribute","spbcSettingsDependencies","settingNames","eventTarget","event","isRadio","type","radioEnabled","value","targetEnableFlag","checked","doEnableFlag","split","settingName","elements","getElementsByName","length","children","label","settingId","removeRecommendationFunc","e","parent","hasClass","remove","after","append","css","top","position","left","setting_id","spinner","empty","title","desc","spbcStartShowHide","next","show","spbcScannerReloadScanInfo","text","spbcScaner","look_below_for_scan_res","innerText","spbcBannerCheck","bannerChecker","setInterval","close_renew_banner","clearInterval","spbcCreateSupportUser","preventDefault","localTextArray","support_user_creation_msg_array","spbcModal","open","confirm","confirm_header","confirm_text","spbcCreateUserCallback","timeout","popupMsg","default_error","hasOwnProperty","user_data","success","user_created","mailSentMsg","successCreationMsg","cronUpdatedMsg","cron_updated","mail_sent","mail_sent_success","mail_sent_error","result_code","user_updated","username","email","password","invalid_permission","unknown_creation_error","on_cooldown","email_is_busy","loaded","errorOutput","msg","String","prototype","printf","formatted","arg","arguments","beforeFormatted","indexOf","afterFormatted","ready","key_changed","optionSelected","console","log","template_id","template_name","settings","button","insertAfter","reload","close","templateNameInput","templateName","val","find","classListNotice","parentElement","classNoticeForClose","querySelectorAll","element","spbcSetCookie","spbcHandleLongDescription","referrer","sessionStorage","removeItem","getItem","setItem","$btn","$st","prop","ajax","url","ajaxurl","response","html","total","leaked","error","xhr","status","statusText"],"mappings":"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"} \ No newline at end of file diff --git a/js/spbc-timeline-widget.min.js b/js/spbc-timeline-widget.min.js index ecdb14c2c..5ec0bd062 100644 --- a/js/spbc-timeline-widget.min.js +++ b/js/spbc-timeline-widget.min.js @@ -1,4 +1,4 @@ -class SpbcTimelineWidget{static markerRadius=4;static hoursRangeMax=24;static axisStepsCount=6;static userActionsUpstep=24;static legendCircleX=-120;static legendTextX=-105;static userLegendMaxRows=2;static userLegendRowHeight=18;static userLegendItemGap=15;static userLegendAxisOffset=60;constructor(){this.now=new Date,this.currentTimestamp=Math.floor(this.now.getTime()/1e3),this.eventsData=null,this.timelineMarkersData=[],this.timelineKnownEventsData=[],this.timelineEventTooltip=null,this.timelineStartTimestamp=this.currentTimestamp-3600*SpbcTimelineWidget.hoursRangeMax,this.usersCount=0,this.summaryEventsCount=0,this.userLegendExpanded=!1,this.selectedUserValue="most_active__action"}render(){var e;"undefined"!=typeof spbcTimelineWidgetData&&(this.timelineEventTooltip=document.getElementById("spbc-timeline-tooltip"),this.eventsData=spbcTimelineWidgetData.users_actions,spbcTimelineWidgetData.current_timestamp_local&&(this.currentTimestamp=Number(spbcTimelineWidgetData.current_timestamp_local)),this.timelineStartTimestamp=Number(spbcTimelineWidgetData.first_event_timestamp),this.timelineKnownEventsData=spbcTimelineWidgetData.known_events_data,this.timelineMarkersData=this.generateMarkersData(spbcTimelineWidgetData.found_types),(e=document.querySelector(".spbc_tab_section--active"))&&"spbc_tab-security_log"===e.id&&this.initTimeline(),window.addEventListener("spbctTabLoaded",e=>{"security_log"===e.detail.tab&&this.initTimeline()}),jQuery("#spbc-timeline-tab").on("click",e=>{e.hasOwnProperty("originalEvent")&&("1"!==localStorage.getItem("spbc_timeline_closed")?localStorage.setItem("spbc_timeline_closed","1"):localStorage.setItem("spbc_timeline_closed","0"))}),window.addEventListener("resize",()=>{this.selectedUserValue&&(this.userLegendExpanded=!1,"most_active__action"===this.selectedUserValue?this.drawUserTimelineMostActive():this.drawUserTimeline(this.selectedUserValue))}))}initTimeline(){let i=document.getElementById("spbc-timeline-user-select-wrapper");var e=document.getElementById("spbc-timeline-user-select-trigger");let s=document.getElementById("spbc-timeline-user-select-dropdown"),n=document.getElementById("spbc-timeline-user-select-value");var t,r,a,l=[];for(t in this.usersCount=0,this.summaryEventsCount=0,this.eventsData)this.eventsData.hasOwnProperty(t)&&(r=this.eventsData[t],0<(a=(Array.isArray(r)?r:r.events||[]).filter(e=>e.time>=this.timelineStartTimestamp&&e.time<=this.currentTimestamp)).length)&&(this.usersCount++,this.summaryEventsCount+=a.length,l.push({user:t,role:r.role||"unknown",eventsCount:a.length}));s.innerHTML="";let c=(e,t)=>{var i=document.createElement("div");return i.className="spbc-timeline-select-option",i.dataset.value=t,i.textContent=e,i};var o=c("Most Active Users","most_active__action"),o=(o.classList.add("selected"),s.appendChild(o),l.forEach(e=>{var t=e.user+` (${e.role}) (${e.eventsCount} events)`;s.appendChild(c(t,e.user))}),e.addEventListener("click",e=>{e.stopPropagation(),i.classList.toggle("open")}),document.addEventListener("click",e=>{i.contains(e.target)||i.classList.remove("open")}),s.addEventListener("click",e=>{var t,e=e.target.closest(".spbc-timeline-select-option");e&&(t=e.dataset.value,this.selectedUserValue=t,this.userLegendExpanded=!1,n.textContent=e.textContent,s.querySelectorAll(".spbc-timeline-select-option").forEach(e=>{e.classList.remove("selected")}),e.classList.add("selected"),i.classList.remove("open"),"most_active__action"===t?(this.drawUserTimelineMostActive(),(e=new URL(window.location)).searchParams.delete("users"),window.history.pushState({},"",e)):(this.drawUserTimeline(t),(e=new URL(window.location)).searchParams.set("users",t),window.history.pushState({},"",e)),updateSecurityLogTable())}),0{var t=(e.time-this.timelineStartTimestamp)/s*d,i=m+this.timelineMarkersData[e.event].upstep;u.appendChild(this.createEventElement(e,t,i,n))})}}measureTextWidth(e,t,i="spbc-timeline-legend-text"){var s=document.createElementNS("http://www.w3.org/2000/svg","text"),i=(s.setAttribute("class",i),s.textContent=t,s.style.visibility="hidden",e.appendChild(s),s.getComputedTextLength());return e.removeChild(s),i}calculateUserLegendRowsCount(t,i,s,n=null){var r=SpbcTimelineWidget.userLegendItemGap,a=SpbcTimelineWidget.markerRadius,l=this.measureTextWidth(t,"and 99 more")+r;let c=0,o=0;for(let e=0;e
"+e.pattern_title+" "+c))}jQuery(document).ready(function(){setTimeout(spbcCheckNewFiles,1e3)});
+let spbcErrorMsgCount=0;function spbcCheckNewFiles(){spbcErrorMsgCount
' + result.pattern_title + ' ' + pattern);\n }\n}\n"],"names":["let","spbcErrorMsgCount","spbcCheckNewFiles","spbcGetErrorMsgs","length","spbcGetLatestBlockedFile","setTimeout","mediaError","jQuery","uploadError","data","action","timestamp","spbcTimestamp","params","callback","spbcCheckFileBlockCallback","obj","first","spbcSendAJAXRequest","result","pattern","blocked","CRITICAL","DANGER","SUSPICIOUS","html","warning","pattern_title","document","ready"],"mappings":"AAAAA,IAAIC,kBAAoB,EAUxB,SAASC,oBAEDD,kBAAoBE,iBAAiB,EAAEC,QACvCH,kBAAoBE,iBAAiB,EAAEC,OACvCC,yBAAyB,EACzBJ,mBAAwC,GAEjCA,kBAAoBE,iBAAiB,EAAEC,SAC9CH,kBAAoBE,iBAAiB,EAAEC,QAE3CE,WAAWJ,kBAAmB,GAAI,CACtC,CAOA,SAASC,mBACLH,IAAIO,EAAaC,OAAO,4BAA4B,EAChDC,EAAcD,OAAO,uBAAuB,EAChD,OAAID,EAAWH,OACJG,EACAE,EAAYL,OACZK,EAEA,EAEf,CAKA,SAASJ,2BACLL,IAAIU,EAAO,CAACC,OAAQ,wBAAyBC,UAAWC,cAAc,CAAC,EACnEC,EAAS,CAACC,SAAUC,0BAA0B,EAC9CC,EAAMd,iBAAiB,EAAEe,MAAM,EACnCC,oBAAoBT,EAAMI,EAAQG,CAAG,CACzC,CAUA,SAASD,2BAA2BI,EAAQV,EAAMI,EAAQG,GACtD,IACQI,EADJD,EAAOE,UACHD,EAAUD,EAAOC,QAAQE,UAAYH,EAAOC,QAAQG,QAAUJ,EAAOC,QAAQI,WACjFR,EAAIS,KAAKN,EAAOO,QAAU,OAASP,EAAOQ,cAAgB,IAAMP,CAAO,EAE/E,CA7DAb,OAAOqB,QAAQ,EAAEC,MAAM,WAEnBxB,WAAWJ,kBAAmB,GAAI,CACtC,CAAC"}
\ No newline at end of file
+{"version":3,"file":"spbc-upload.min.js","sources":["spbc-upload.js"],"sourcesContent":["let spbcErrorMsgCount = 0;\n\njQuery(document).ready(function() {\n // Count error messages each 100ms\n setTimeout(spbcCheckNewFiles, 1000);\n});\n\n/**\n * Check blocked file and display error message about it\n */\nfunction spbcCheckNewFiles() {\n // If their more messages than were, fire AJAX request to get data\n if (spbcErrorMsgCount < spbcGetErrorMsgs().length) {\n spbcErrorMsgCount = spbcGetErrorMsgs().length;\n spbcGetLatestBlockedFile();\n spbcErrorMsgCount = spbcErrorMsgCount - 1;\n // If their fewer messages than were, recount\n } else if (spbcErrorMsgCount > spbcGetErrorMsgs().length) {\n spbcErrorMsgCount = spbcGetErrorMsgs().length;\n }\n setTimeout(spbcCheckNewFiles, 1000);\n}\n\n/**\n * Array of the appear errors notices on the page\n *\n * @return {{length}|*|jQuery|HTMLElement|*[]}\n */\nfunction spbcGetErrorMsgs() {\n let mediaError = jQuery('#media-upload-error .error');\n let uploadError = jQuery('.upload-error-message');\n if (mediaError.length) {\n return mediaError;\n } else if (uploadError.length) {\n return uploadError;\n } else {\n return [];\n }\n}\n\n/**\n * Fires AJAX request to get more info about the block\n */\nfunction spbcGetLatestBlockedFile() {\n let data = {action: 'spbc_check_file_block', timestamp: spbcTimestamp()};\n let params = {callback: spbcCheckFileBlockCallback};\n let obj = spbcGetErrorMsgs().first();\n spbcSendAJAXRequest(data, params, obj);\n}\n\n/**\n * Callback. Sets correct error message with details\n *\n * @param {obj|string} result\n * @param {obj} data\n * @param {obj} params\n * @param {obj} obj\n */\nfunction spbcCheckFileBlockCallback(result, data, params, obj) {\n if (result.blocked) {\n let pattern = '';\n if (result.pattern && typeof result.pattern === 'object') {\n pattern = result.pattern.CRITICAL || result.pattern.DANGER || result.pattern.SUSPICIOUS || '';\n }\n let message = [result.warning, result.pattern_title, pattern].filter(Boolean).join(' ');\n obj.text(message);\n }\n}\n"],"names":["let","spbcErrorMsgCount","spbcCheckNewFiles","spbcGetErrorMsgs","length","spbcGetLatestBlockedFile","setTimeout","mediaError","jQuery","uploadError","data","action","timestamp","spbcTimestamp","params","callback","spbcCheckFileBlockCallback","obj","first","spbcSendAJAXRequest","result","blocked","pattern","CRITICAL","DANGER","SUSPICIOUS","message","warning","pattern_title","filter","Boolean","join","text","document","ready"],"mappings":"AAAAA,IAAIC,kBAAoB,EAUxB,SAASC,oBAEDD,kBAAoBE,iBAAiB,EAAEC,QACvCH,kBAAoBE,iBAAiB,EAAEC,OACvCC,yBAAyB,EACzBJ,mBAAwC,GAEjCA,kBAAoBE,iBAAiB,EAAEC,SAC9CH,kBAAoBE,iBAAiB,EAAEC,QAE3CE,WAAWJ,kBAAmB,GAAI,CACtC,CAOA,SAASC,mBACLH,IAAIO,EAAaC,OAAO,4BAA4B,EAChDC,EAAcD,OAAO,uBAAuB,EAChD,OAAID,EAAWH,OACJG,EACAE,EAAYL,OACZK,EAEA,EAEf,CAKA,SAASJ,2BACLL,IAAIU,EAAO,CAACC,OAAQ,wBAAyBC,UAAWC,cAAc,CAAC,EACnEC,EAAS,CAACC,SAAUC,0BAA0B,EAC9CC,EAAMd,iBAAiB,EAAEe,MAAM,EACnCC,oBAAoBT,EAAMI,EAAQG,CAAG,CACzC,CAUA,SAASD,2BAA2BI,EAAQV,EAAMI,EAAQG,GACtD,GAAIG,EAAOC,QAAS,CAChBrB,IAAIsB,EAAU,GACVF,EAAOE,SAAqC,UAA1B,OAAOF,EAAOE,UAChCA,EAAUF,EAAOE,QAAQC,UAAYH,EAAOE,QAAQE,QAAUJ,EAAOE,QAAQG,YAAc,IAE3FC,EAAU,CAACN,EAAOO,QAASP,EAAOQ,cAAeN,GAASO,OAAOC,OAAO,EAAEC,KAAK,GAAG,EACtFd,EAAIe,KAAKN,CAAO,CACpB,CACJ,CAjEAlB,OAAOyB,QAAQ,EAAEC,MAAM,WAEnB5B,WAAWJ,kBAAmB,GAAI,CACtC,CAAC"}
\ No newline at end of file
diff --git a/js/src/react/components/TabContent/TabContent.js b/js/src/react/components/TabContent/TabContent.js
index f0bd5ea3d..d26098b6a 100644
--- a/js/src/react/components/TabContent/TabContent.js
+++ b/js/src/react/components/TabContent/TabContent.js
@@ -9,15 +9,17 @@ export default function TabContent({sectionId, isActive, tabComponent}) {
useEffect(() => {
if (isActive && !sectionData) {
+ // Legacy way to get tab content for these sectionId-s - spbc_settings__draw_elements
if (
- sectionId === 'critical_updates' ||
- sectionId === 'fswatcher' ||
- sectionId === 'traffic_control' ||
- sectionId === 'security_certified'
+ sectionId === 'scanner' ||
+ sectionId === 'backups' ||
+ sectionId === 'security_log' ||
+ sectionId === 'summary' ||
+ sectionId === 'debug'
) {
- fetchContent();
- } else {
fetchContentOld();
+ } else {
+ fetchContent();
}
}
}, [isActive, sectionData]);
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js b/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
index 1ef3b25bd..ff90590b7 100644
--- a/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
@@ -1,8 +1,5 @@
import React, {useEffect, useState} from 'react';
import './styles.css';
-import TabContentHtml from '../../TabContentTypes/Html/TabContentHtml';
-import {sendAjaxRequest} from '../../../modules/Http/Ajax';
-import Preloader from '../../Preloader/Preloader';
import InputHidden from '../../FormElements/InputHidden';
import Settings from './Settings';
import NoticeBanner from '../NoticeBanner/NoticeBanner';
@@ -10,10 +7,8 @@ import SettingsOverview from '../../SettingsOverview/SettingsOverview';
import QuickNavigation from './QuickNavigation/QuickNavigation';
export default function TabSettingsGeneral({sectionId, sectionData, isActive}) {
- const [sectionDataLegacy, setSectionDataLegacy] = useState({sectionData});
- const [settings, setSettings] = useState({});
- const [settingsFetched, setSettingsFetched] = useState(false);
- const [keyIsOk, setKeyIsOk] = useState(false);
+ const [settings, setSettings] = useState(sectionData);
+ const [keyIsOk, setKeyIsOk] = useState(sectionData.flags?.keyIsOk ?? false);
jQuery(document).ready(function() {
// Show/Hide access key
@@ -111,30 +106,9 @@ export default function TabSettingsGeneral({sectionId, sectionData, isActive}) {
});
useEffect(() => {
- setSectionDataLegacy(sectionData);
- fetchContent();
- }, []);
-
- // @ToDo - need to be moved to the separate hook, same duplication is in `TabContent` component
- const fetchContent = async () => {
- try {
- const requestData = {
- action: 'spbct_get_tab_data',
- tab_name: sectionId,
- };
- const data = await sendAjaxRequest(requestData, true);
- setSettings(data);
- setKeyIsOk(data.flags?.keyIsOk);
- setSettingsFetched(true);
- } catch (error) {
- console.error('Error fetching content:', error);
- setSettingsFetched(true);
- }
- };
-
- if (!settingsFetched) {
- return
' + result.pattern_title + ' ' + pattern);
+ let pattern = '';
+ if (result.pattern && typeof result.pattern === 'object') {
+ pattern = result.pattern.CRITICAL || result.pattern.DANGER || result.pattern.SUSPICIOUS || '';
+ }
+ let message = [result.warning, result.pattern_title, pattern].filter(Boolean).join(' ');
+ obj.text(message);
}
}
diff --git a/lib/CleantalkSP/Common/RemoteCalls.php b/lib/CleantalkSP/Common/RemoteCalls.php
index 7f59fb7ab..cde3c8084 100644
--- a/lib/CleantalkSP/Common/RemoteCalls.php
+++ b/lib/CleantalkSP/Common/RemoteCalls.php
@@ -181,7 +181,8 @@ public static function perform($host, $rc_action, $plugin_name, $api_key, $param
{
$params = static::buildParameters($rc_action, $plugin_name, $api_key, $params);
- if ($do_check) {
+ // Async RC is fire-and-forget; a sync test needs a 2nd PHP worker and deadlocks on low pm.max_children (e.g. Local WP).
+ if ($do_check && ! in_array('async', $patterns, true)) {
$result__rc_check_website = static::performTest($host, $params, $patterns);
if (! empty($result__rc_check_website['error'])) {
return $result__rc_check_website;
diff --git a/lib/CleantalkSP/SpbctWP/CleantalkSettingsTemplates.php b/lib/CleantalkSP/SpbctWP/CleantalkSettingsTemplates.php
index a9b50e689..ca11e1cd3 100644
--- a/lib/CleantalkSP/SpbctWP/CleantalkSettingsTemplates.php
+++ b/lib/CleantalkSP/SpbctWP/CleantalkSettingsTemplates.php
@@ -367,7 +367,7 @@ public static function settingsTemplatesValidateApiResponse($template_id, $templ
$services_templates_get_error = 'Parse services_templates_get API error: template_id is empty';
break;
}
- if ( $template['template_id'] === (int)$template_id ) {
+ if ( (int)$template['template_id'] === (int)$template_id ) {
if ( empty($template['options_site']) ) {
$services_templates_get_error = 'Parse services_templates_get API error: options_site is empty';
break;
diff --git a/lib/CleantalkSP/SpbctWP/FSWatcher/View/View.php b/lib/CleantalkSP/SpbctWP/FSWatcher/View/View.php
index 6752409c6..1c3de9829 100644
--- a/lib/CleantalkSP/SpbctWP/FSWatcher/View/View.php
+++ b/lib/CleantalkSP/SpbctWP/FSWatcher/View/View.php
@@ -25,16 +25,6 @@ public static function getReactData($data)
$dates = $storage::getAvailableJournals();
}
- $feature_state = $spbc->feature_restrictions->getState($spbc, 'fswatcher')->is_active;
- //todo This check is not needed fro now,
- // however any React tabs should has this check to keep on ride
- // if something changed in business logic.
- // So this behaviour and layout of sanitizedReasonOutput needs to be moved to React components.
-// if (false === $feature_state->is_active) {
-// echo $feature_state->sanitizedReasonOutput();
-// echo '';
-// return;
-// }
/*
* Filling
*/
@@ -59,7 +49,6 @@ public static function getReactData($data)
$data['strings']['noLogsText'] = __('No logs compared yet.', 'security-malware-firewall');
//flags
$data['flags']['snapshotsAreReady'] = static::snapshotsAreReady($dates);
- $data['flags']['featureRestricted'] = $feature_state;
//objects
$data['objects']['selectorOptionsDates'] = static::getSelectorDates($dates);
diff --git a/lib/CleantalkSP/SpbctWP/Firewall/UploadChecker.php b/lib/CleantalkSP/SpbctWP/Firewall/UploadChecker.php
index d884d2a1c..bc4038bdf 100644
--- a/lib/CleantalkSP/SpbctWP/Firewall/UploadChecker.php
+++ b/lib/CleantalkSP/SpbctWP/Firewall/UploadChecker.php
@@ -85,13 +85,21 @@ public static function uploadCheckerGetLastBlockInfo()
global $wpdb, $spbc;
$timestamp = intval(Post::getInt('timestamp'));
+ $current_ip = IP::get();
- // Select only latest ones.
+ if ( empty($current_ip) ) {
+ wp_send_json(array('blocked' => false));
+ }
+
+ // Select only latest ones filtered by requester's IP.
$result = $wpdb->get_results(
- 'SELECT *'
- . ' FROM ' . SPBC_TBL_FIREWALL_LOG
- . ' WHERE status = "DENY_BY_WAF_FILE" AND entry_timestamp > ' . ($timestamp - 2)
- . ' ORDER BY entry_timestamp DESC LIMIT 1;',
+ $wpdb->prepare(
+ 'SELECT * FROM ' . SPBC_TBL_FIREWALL_LOG
+ . ' WHERE status = "DENY_BY_WAF_FILE" AND entry_timestamp > %d AND ip_entry = %s'
+ . ' ORDER BY entry_timestamp DESC LIMIT 1',
+ $timestamp - 2,
+ $current_ip
+ ),
OBJECT
);
diff --git a/lib/CleantalkSP/SpbctWP/RemoteCalls.php b/lib/CleantalkSP/SpbctWP/RemoteCalls.php
index 409dac1e5..bff6bee28 100644
--- a/lib/CleantalkSP/SpbctWP/RemoteCalls.php
+++ b/lib/CleantalkSP/SpbctWP/RemoteCalls.php
@@ -370,7 +370,6 @@ public static function action__scanner__check_dir() // phpcs:ignore PSR1.Methods
$file_infos = Get::getArray('file_infos');
if ( ! is_array($file_infos) || ! $file_infos ) {
wp_send_json(array('error' => 'INVALID_FILE_INFOS'));
- return;
}
$results = array();
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/BinaryCheckModule/BinaryCheckModule.php b/lib/CleantalkSP/SpbctWP/Scanner/BinaryCheckModule/BinaryCheckModule.php
index f8403e2a6..fc0d6228f 100644
--- a/lib/CleantalkSP/SpbctWP/Scanner/BinaryCheckModule/BinaryCheckModule.php
+++ b/lib/CleantalkSP/SpbctWP/Scanner/BinaryCheckModule/BinaryCheckModule.php
@@ -19,6 +19,13 @@ class BinaryCheckModule
*/
private $statuses = array();
+ /**
+ * @var string[]
+ */
+ private static $executable_mime_types = array(
+ 'application/x-executable'
+ );
+
/**
* Runs the BinaryCheckModule to find malicious binary files in a single batch.
*
@@ -179,17 +186,8 @@ private function incrementStatus($status)
private function analyzeBinaryFile($binary_file_path)
{
- // Read first bytes of the file (we need at least 4 bytes for all checks)
- $handle = fopen($binary_file_path, 'rb');
- if (!$handle) {
- return false;
- }
-
- // Read first 4 bytes
- $first_bytes = fread($handle, 4);
- fclose($handle);
-
- if (strlen($first_bytes) < 4) {
+ $first_bytes = $this->getBinaryBytes($binary_file_path);
+ if (false === $first_bytes) {
return false;
}
@@ -237,9 +235,70 @@ private function markAsCritical($binary_file_path)
$wpdb->query(
$wpdb->prepare(
- "UPDATE " . SPBC_TBL_SCAN_FILES . " SET status = 'INFECTED', severity = 'CRITICAL' WHERE path = %s",
+ "UPDATE " . SPBC_TBL_SCAN_FILES . " SET status = 'INFECTED', severity = 'SUSPICIOUS', weak_spots = '{\"SUSPICIOUS\":{\"1\":[\"Executable binary file\"]}}' WHERE path = %s",
$binary_file_path
)
);
}
+
+ /**
+ * Get first 4 bytes of file
+ * @param $filename
+ * @return false|string String of bytes on success, false on failure.
+ */
+ private function getBinaryBytes($filename)
+ {
+ if (!file_exists($filename)) {
+ return false;
+ }
+
+ $handle = fopen($filename, 'rb');
+ if (!$handle) {
+ return false;
+ }
+ // Read first 4 bytes
+ $first_bytes = fread($handle, 4);
+ fclose($handle);
+
+ if (strlen($first_bytes) < 4) {
+ return false;
+ }
+
+ return $first_bytes;
+ }
+
+ /**
+ * Read MIME type and make decision if MIME is in expected static array.
+ * @param string $filename
+ * @param string $extension
+ * @return bool
+ */
+ public static function probablyBinaryExecutableFile($filename, $extension)
+ {
+ if (!is_string($filename) || !file_exists($filename)) {
+ return false;
+ }
+
+ $extension = strtolower((string) $extension);
+
+ // only empty or elf extension
+ if (!in_array($extension, ['', 'elf'], true)) {
+ return false;
+ }
+
+ if (function_exists('finfo_open') && function_exists('finfo_file')) {
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+ if (!$finfo) {
+ return false;
+ }
+ $mime = finfo_file($finfo, $filename);
+ finfo_close($finfo);
+
+ if (in_array($mime, self::$executable_mime_types, true)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
}
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php
index 1108188b9..2c0957dff 100644
--- a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php
+++ b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php
@@ -1051,8 +1051,12 @@ public function file_system_analysis($offset = null, $amount = null, $path_to_sc
$file['checked_heuristic'] = 0;
}
- // No extension → BINARY. With extension → NULL (preferred; Unknown also accepts legacy '').
- $source_sql = $ext === '' ? "'BINARY'" : 'NULL';
+ // If is probably binary executable file then set correct source, null otherwise
+ $source_sql = (
+ BinaryCheckModule::probablyBinaryExecutableFile($path_to_scan . $raw_path, $ext)
+ )
+ ? "'BINARY'"
+ : 'NULL';
$sql_row = '(\''
. $file['path'] . '\',\''
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Stages/DTO/SendFilesDTO.php b/lib/CleantalkSP/SpbctWP/Scanner/Stages/DTO/SendFilesDTO.php
index 839e6619d..ae69046b8 100644
--- a/lib/CleantalkSP/SpbctWP/Scanner/Stages/DTO/SendFilesDTO.php
+++ b/lib/CleantalkSP/SpbctWP/Scanner/Stages/DTO/SendFilesDTO.php
@@ -99,11 +99,6 @@ class SendFilesDTO extends DTO
*/
public $suspicious = [];
- /**
- * @var array
- */
- public $unknown = [];
-
/**
* @var string
*/
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php b/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php
deleted file mode 100644
index 38a4b078a..000000000
--- a/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php
+++ /dev/null
@@ -1,50 +0,0 @@
-spbc->settings['scanner__list_unknown']) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Getting data from the database
- *
- * @return array|object|null
- */
- protected function catchResultData()
- {
- return $this->db->fetchAll(
- 'SELECT full_hash, mtime, size, path, source, severity, detected_at'
- . ' FROM ' . SPBC_TBL_SCAN_FILES
- . ' WHERE (source IS NULL OR source = \'\') AND'
- . ' status <> "APPROVED_BY_USER" AND'
- . ' status <> "APPROVED_BY_CT" AND'
- . ' status <> "APPROVED_BY_CLOUD" AND'
- . ' detected_at >= ' . (time() - $this->spbc->settings['scanner__list_unknown__older_than'] * 86400) . ' AND'
- . ' path NOT LIKE "%wp-content%themes%" AND'
- . ' path NOT LIKE "%wp-content%plugins%" AND'
- . ' path NOT LIKE "%wp-content%cache%" AND'
- . ' (severity NOT IN ("CRITICAL","SUSPICIOUS") OR severity IS NULL)'
- );
- }
-}
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Stages/SendResultsStage.php b/lib/CleantalkSP/SpbctWP/Scanner/Stages/SendResultsStage.php
index dd78f683b..7ca46282e 100644
--- a/lib/CleantalkSP/SpbctWP/Scanner/Stages/SendResultsStage.php
+++ b/lib/CleantalkSP/SpbctWP/Scanner/Stages/SendResultsStage.php
@@ -13,7 +13,6 @@
use CleantalkSP\SpbctWP\Scanner\Stages\Repositories\CriticalRepository;
use CleantalkSP\SpbctWP\Scanner\Stages\Repositories\LinksRepository;
use CleantalkSP\SpbctWP\Scanner\Stages\Repositories\SuspiciousRepository;
-use CleantalkSP\SpbctWP\Scanner\Stages\Repositories\UnknownRepository;
use CleantalkSP\SpbctWP\Scanner\Surface;
use CleantalkSP\Variables\Request;
@@ -121,9 +120,6 @@ private function gatherFileData($dto)
$suspicious = new SuspiciousRepository();
$dto->suspicious = $suspicious->getResultData();
- $unknown = new UnknownRepository();
- $dto->unknown = $unknown->getResultData();
-
if ( ! empty($dto->critical)) {
$dto->failed_files = json_encode($dto->critical);
$dto->failed_files_rows = count($dto->critical);
diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Surface.php b/lib/CleantalkSP/SpbctWP/Scanner/Surface.php
index 55effe966..4f18b6072 100644
--- a/lib/CleantalkSP/SpbctWP/Scanner/Surface.php
+++ b/lib/CleantalkSP/SpbctWP/Scanner/Surface.php
@@ -2,6 +2,7 @@
namespace CleantalkSP\SpbctWP\Scanner;
+use CleantalkSP\SpbctWP\Scanner\BinaryCheckModule\BinaryCheckModule;
use CleantalkSP\SpbctWP\SpbcDevLogger;
class Surface
@@ -540,33 +541,14 @@ public function countFilesInDir($main_path)
if ($fileInfo->isFile()) {
$filename = $fileInfo->getFileName();
- $currentFileExtension = pathinfo($filename, PATHINFO_EXTENSION);
+ $current_file_extension = pathinfo($filename, PATHINFO_EXTENSION);
+ $real_path = $fileInfo->getRealPath();
- if ($currentFileExtension === '') {
- $this->output_files_count++;
- continue;
- }
-
- // Extensions filter
- if ( $currentFileExtension !== '' && ( $this->ext_except || $this->ext ) ) {
- if (
- ! $this->hasFileAllowedExtension(
- $currentFileExtension,
- $this->ext_except,
- $this->ext,
- $fileInfo->getPathname()
- )
- ) {
- continue;
- }
- }
-
- // Filenames exception filter
- if ( ! empty($this->files_except) && in_array($fileInfo->getPathname(), $this->files_except, true) ) {
- continue;
- }
+ $probably_binary = BinaryCheckModule::probablyBinaryExecutableFile($real_path, $current_file_extension);
+ $skip_by_restrictions = $this->skipFileByRestrictions($current_file_extension, $real_path);
+ $skip_by_filename = ! empty($this->files_except) && in_array($fileInfo->getPathname(), $this->files_except, true);
- if ( ! $this->isFileWithinAllowedSize($fileInfo->getPathname()) ) {
+ if (!$probably_binary && ($skip_by_restrictions || $skip_by_filename)) {
continue;
}
@@ -642,44 +624,31 @@ public function getFileStructure($main_path, $iterator_result, $is_root_dir)
$path = $main_path . DIRECTORY_SEPARATOR . $file_name;
if ( is_file($path) && !is_link($path) ) {
- $currentFileExtension = pathinfo($path, PATHINFO_EXTENSION);
-
- // Extensions filter (skip only the filter for extensionless files, keep the file itself)
- if ( $currentFileExtension !== '' && ( $this->ext_except || $this->ext ) ) {
- if (
- ! $this->hasFileAllowedExtension(
- $currentFileExtension,
- $this->ext_except,
- $this->ext,
- $path
- )
- ) {
- continue;
- }
- }
+ //
+ $current_file_extension = pathinfo($path, PATHINFO_EXTENSION);
+
+ $probably_binary = BinaryCheckModule::probablyBinaryExecutableFile($path, $current_file_extension);
+ $skip_by_restrictions = $this->skipFileByRestrictions($current_file_extension, $path);
+ $skip_by_filename = false;
// Filenames exception filter
- $relative_path = str_replace(realpath(ABSPATH), '', $path);
- if (DIRECTORY_SEPARATOR === '\\') {
- $relative_path = str_replace('/', '\\', $relative_path);
- }
- if (
- !empty($this->files_except)
- && in_array(
- ltrim($relative_path, '/\\'),
- array_map(function ($item) {
- return ltrim($item, '/\\');
- }, $this->files_except),
- true
- )
- ) {
- continue;
+ if (!empty($this->files_except) && is_array($this->files_except)) {
+ $files_except_array = array_map(function ($item) {
+ return ltrim($item, '/\\');
+ }, $this->files_except);
+ $relative_path = str_replace(realpath(ABSPATH), '', $path);
+ if (DIRECTORY_SEPARATOR === '\\') {
+ $relative_path = str_replace('/', '\\', $relative_path);
+ }
+ $skip_by_filename = in_array(ltrim($relative_path, '/\\'), $files_except_array, true);
}
- if ( ! $this->isFileWithinAllowedSize($path) ) {
+ //main skip logic check
+ if (!$probably_binary && ($skip_by_restrictions || $skip_by_filename)) {
continue;
}
+ //do collection work
$this->output_counter_files++;
// Resume in this directory (root or subdir): skip first on_exit_dir_offset matching files.
@@ -798,7 +767,7 @@ public function fileDetails($file_list, $path_offset)
if (
$db_full_hash
&& $current_file_full_hash !== $db_full_hash
- && $this->isFileWithinAllowedSize($val['path'])
+ && ! $this->skipFileByMaxAllowedSize($val['path'])
) {
$current_file_content = file_get_contents($val['path']);
$current_file_eol_type = spbc_PHP_logs__detect_EOL_type($val['path']);
@@ -903,14 +872,50 @@ public function filterFileExtensionUsingRegexp($extension, array $extensions)
*
* @return bool
*/
- private function isFileWithinAllowedSize($file_abs_path)
+ private function skipFileByMaxAllowedSize($file_abs_path)
{
$size = @filesize($file_abs_path);
- return false !== $size && $size <= self::SPBC_SURFACE__ALLOWED_MAX_FILE_SIZE;
+ return false === $size || $size > self::SPBC_SURFACE__ALLOWED_MAX_FILE_SIZE;
+ }
+
+ /**
+ * Make unified decision if file should be skipped.
+ * @param string $extension
+ * @param string $real_path
+ * @return bool
+ */
+ private function skipFileByRestrictions($extension, $real_path)
+ {
+ if (empty($real_path) || !is_string($real_path) || is_null($extension)) {
+ return false;
+ }
+ if ($extension === '') {
+ if ($this->skipNoExtensionFile($real_path)) {
+ return true;
+ }
+ } else {
+ if (
+ $this->skipFileByExtension(
+ $extension,
+ $this->ext_except,
+ $this->ext,
+ $real_path
+ )
+ ) {
+ return true;
+ }
+ }
+
+ if ( $this->skipFileByMaxAllowedSize($real_path) ) {
+ return true;
+ }
+
+ return false;
}
/**
+ * Perform extension filter for the file
* @param string $currentFileExtension
* @param array $ext_except
* @param array $ext
@@ -918,43 +923,52 @@ private function isFileWithinAllowedSize($file_abs_path)
*
* @return bool
*/
- private function hasFileAllowedExtension($currentFileExtension, array $ext_except, array $ext, $file_abs_path)
+ private function skipFileByExtension($currentFileExtension, array $ext_except, array $ext, $file_abs_path)
{
- //allow empty extensions for special ruleset
- if ( empty($currentFileExtension) && is_string($file_abs_path) && !empty($file_abs_path) ) {
- $size = @filesize($file_abs_path);
- $size_ok = false !== $size && $size < self::SPBC_SURFACE__ALLOWED_NO_EXTENSION_FILE_SIZE;
- $filename = @pathinfo($file_abs_path, PATHINFO_FILENAME);
- //regexp to find that filename contains lowercase AND uppercase
- $pattern = '/^(?=.*[a-z])(?=.*[A-Z]).+$/';
- $filename_ok = !empty($filename) && preg_match($pattern, $filename);
- if ($size_ok && $filename_ok) {
- return true;
- }
- }
-
if ($currentFileExtension === 'js') {
$size = @filesize($file_abs_path);
if (!$size) {
- return false;
+ return true;
}
if ($size > self::SPBC_SURFACE__ALLOWED_JS_FILE_SIZE || $size < self::SPBC_SURFACE__ALLOWED_JS_MIN_FILE_SIZE) {
- return false;
+ return true;
}
}
if (in_array($currentFileExtension, $ext_except, true)) {
- return false;
+ return true;
}
if (in_array($currentFileExtension, $ext, true)) {
- return true;
+ return false;
}
if ($this->filterFileExtensionUsingRegexp($currentFileExtension, $ext)) {
- return true;
+ return false;
}
- return false;
+ return true;
+ }
+
+ /**
+ * Decide if we do need skip noext file due special checks.
+ * @param string $file_abs_path
+ * @return bool
+ */
+ private function skipNoExtensionFile($file_abs_path)
+ {
+ //allow empty extensions for special ruleset
+ if ( is_string($file_abs_path) && !empty($file_abs_path) ) {
+ $size = @filesize($file_abs_path);
+ $size_ok = false !== $size && $size < self::SPBC_SURFACE__ALLOWED_NO_EXTENSION_FILE_SIZE;
+ $filename = @pathinfo($file_abs_path, PATHINFO_FILENAME);
+ //regexp to find that filename contains lowercase AND uppercase
+ $pattern = '/^(?=.*[a-z])(?=.*[A-Z]).+$/';
+ $filename_ok = !empty($filename) && preg_match($pattern, $filename);
+ if ($size_ok && $filename_ok) {
+ return false;
+ }
+ }
+ return true;
}
}
diff --git a/lib/CleantalkSP/SpbctWP/Variables/AltSessions.php b/lib/CleantalkSP/SpbctWP/Variables/AltSessions.php
index 6f047de21..e71bbd583 100644
--- a/lib/CleantalkSP/SpbctWP/Variables/AltSessions.php
+++ b/lib/CleantalkSP/SpbctWP/Variables/AltSessions.php
@@ -134,7 +134,6 @@ public static function setFromRemote($request = null)
'success' => false,
'error' => 'AltSessions: No cookies data provided.'
]);
- die();
}
if (empty($nonce)) {
@@ -142,14 +141,12 @@ public static function setFromRemote($request = null)
'success' => false,
'error' => 'AltSessions: No nonce provided.'
]);
- die();
}
if (!wp_verify_nonce($nonce, $action)) {
wp_send_json([
'success' => false,
'error' => 'AltSessions: Nonce verification failed. Please reload the page and try again.'
]);
- die();
}
// Remove double slashes
@@ -163,7 +160,6 @@ public static function setFromRemote($request = null)
'success' => false,
'error' => 'AltSessions: Internal JSON error: ' . json_last_error_msg()
]);
- die();
}
// Convert array of arrays to object
@@ -218,7 +214,6 @@ public static function setFromRemote($request = null)
'success' => false,
'error' => 'AltSessions: Internal JSON error: ' . json_last_error_msg()
]);
- die();
}
// Merge with old values if needed (not implemented here, but can be added)
diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php
index 31802b741..80f744fc4 100644
--- a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php
+++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php
@@ -303,6 +303,34 @@ public static function getInstalledPlugins()
return ['plugins' => $plugins, 'badges' => $badges];
}
+ /**
+ * Slug to PSC certificate ID map of the cached certified plugins.
+ *
+ * @param array