diff --git a/css/spbc-settings.min.css b/css/spbc-settings.min.css index a179af4f7..40ef87e92 100644 --- a/css/spbc-settings.min.css +++ b/css/spbc-settings.min.css @@ -1 +1 @@ -/** .circle used in resend code confirmation button in 2FA modal **/.circle{border-radius:50%;align-items:center;justify-content:center;position:relative;background-color:#03A9F4;clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 0, 50% 0, 50% 50%, 50% 50%)}.circle-inner{width:100%;height:100%;border-radius:50%;background:#f7f7f7;transform:scale(0.7)}.circle--small{width:16px;height:16px}.circle--mid{width:30px;height:30px}.-animation--circle{animation:animation-circle 2s linear forwards}.-animation--30s{animation-duration:30s !important}.-animation--2min{animation-duration:120s !important}@keyframes animation-circle{12.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 0, 0 0, 50% 50%, 50% 50%)}25%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 50%, 0 50%, 50% 50%, 50% 50%)}37.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 100%, 0 100%, 50% 50%, 50% 50%)}50%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 50%, 50% 50%)}62.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 50% 50%, 50% 50%)}75%{clip-path:polygon(50% 0%, 100% 0, 100% 50%, 100% 50%, 100% 50%, 100% 50%, 100% 50%, 50% 50%, 50% 50%)}87.5%{clip-path:polygon(50% 0%, 100% 0, 100% 0, 100% 0, 100% 0, 100% 0, 100% 0, 50% 50%, 50% 50%)}100%{clip-path:polygon(50% 0%, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 50%, 50% 50%)}}#confirmation-code--resend .circle,.spbc-2fa-confirmation-resend .circle{margin-left:5px;display:inline-block;vertical-align:text-bottom}/** 2FA confirmation modal: input + Resend on one row (narrow dialog vs .regular-text 25em) */.spbc-2fa-confirmation-row{display:flex;flex-direction:row;align-items:center;gap:10px;margin:1em 0}.spbc-2fa-confirmation-row .spbc-2fa-confirmation-input{flex:1 1 auto;min-width:0;width:auto !important;max-width:100%;box-sizing:border-box}.spbc-2fa-confirmation-row .spbc-2fa-confirmation-resend{flex-shrink:0}.spbc---hidden{display:none}.spbc---gray{color:gray}.spbc---red{color:red}.spbc---green{color:#037603}.spbc_bold{font-weight:800}/** .spbc_waf_reason* used in Firewall tab */.spbc_waf_reason_title{text-decoration:underline}.spbc_waf_reason{display:none}.spbc_waf_reason_title:hover + .spbc_waf_reason{display:inline}/** .spbc_sub* and spbc_affiliate_shortcode used in General settings tab */.spbc_sub_setting{margin-left:30px !important}.spbc_sub2_setting{margin-left:60px !important}.spbc_affiliate_shortcode{width:inherit !important;min-width:inherit !important}.spbc_highlighted{outline-offset:5px;outline-color:red;outline-width:3px !important;outline-style:solid !important}/** .spbc_progressbar* used in Scanner tab */.spbc_progressbar_counter{position:absolute;height:22px;width:100%;left:0;top:0;text-align:center}.spbc_progressbar_counter span{vertical-align:sub;line-height:22px;font-weight:600;font-size:18px}.spbc_preloader{width:20px;margin-left:5px;vertical-align:text-top;display:none}.spbc_preloader_button{height:15px;margin-left:5px;vertical-align:text-top;display:none}.spbc_scan_result_row td{text-align:center}.spbc_scan_result_row td:nth-child(1){text-align:left}.spbc_scan_result_row td:nth-child(2){text-align:right}.spbc_scan_result_row td:last-child button{margin-left:3px}.spbc_view_file_row_wrapper{line-height:19px}.spbc_view_file_row_wrapper:nth-child(odd){background:#ccc}.spbc_view_file_row_wrapper:nth-child(even){background:#ddd}.spbc_view_file_row_num{display:inline-block;width:30px;margin:0 0 0 5px;border-right:1px solid black}.spbc_view_file_row{display:inline;margin:0 0 0 5px;line-height:19px;font-size:1em;word-break:break-all}.spbcShortText{display:inline-block;width:100%}.spbcFullText{display:none;position:absolute;top:-5px;background:rgba(150,150,150,.9);color:white;padding:7px;border:1px solid rgb(51, 51, 51);border-radius:5px;z-index:20}.spbcFullText-right{display:none;position:absolute;top:0;right:0;background:rgba(150,150,150,.9);color:white;padding:7px;border:1px solid rgb(51, 51, 51);border-radius:5px;z-index:20}.spbcFullText a{color:white}.spbcFullText a:hover{color:#ddd}#spbc_scan_accordion .column-primary{position:initial}#spbc_scan_accordion tbody tr{position:relative}.spbc_accordion_category_wrapper{padding:0px 5px 10px 5px;border:1px solid lightgrey;border-radius:3px;margin-bottom:5px}.spbc_accordion_category_header{color:#026E88;font-weight:800;margin-left:10px !important}/* Pagination */div.pagination{margin:10px}ul.pagination{display:inline-block;margin:0}li.pagination{display:inline-block;margin-left:10px}span.current_page{font-size:1.3em;font-weight:600}/*Page header start*/.spbc_page_mob_info__about_block{display:none}/*Page header end*//* TABS */.spbc_long_description__show:hover{color:#aaaaaa;cursor:pointer}.spbc_settings_description{font-size:9pt;color:#888}.spbc_settings_description select{display:inline;position:relative;transform:scale(.7);left:-50px}.spbc_settings_description_status_php_execution{margin-top:5px;margin-left:18px;font-size:10pt;color:red;font-weight:600;list-style-type:disc}.spbc_tab-settings_general input[type=text]{min-width:255px;width:100%}.spbc_short_text_field input{min-width:70px !important;width:70px !important}.spbc_middle_text_field input{min-width:200px !important;width:200px !important}.spbc_long_text_field input[type=text]{min-width:200px;width:500px}/* Log button */.spbc__wrapper--center{margin:10px 0 10px 0;text-align:center}/* Settings banners */.spbc_settings_banner{display:inline-block;margin:1em 0;vertical-align:top;text-align:center}#spbc_rate_plugin{}.spbc_rate_block{border:1px dashed #666;width:400px;padding:0.2em}#spbc_translate_plugin{margin-left:10px}.spbc_rate_block{border:1px dashed #666;width:400px;padding:0.2em}#spbc_translate_plugin .spbc_button_rate{margin-bottom:10px}.spbc_button_rate{display:inline-block;text-align:center;vertical-align:middle;padding:12px 24px;border:1px solid #216298;border-radius:8px;background:#35a0f7;background:-webkit-gradient(linear, left top, left bottom, from(#35a0f7), to(#216298));background:-moz-linear-gradient(top, #35a0f7, #216298);background:linear-gradient(to bottom, #35a0f7, #216298);text-shadow:#153e5f 1px 1px 1px;font:normal normal bold 16px verdana;color:#ffffff;text-decoration:none}.spbc_button_rate:hover,.spbc_button_rate:focus{border:1px solid #297bbe;background:#40c0ff;background:-webkit-gradient(linear, left top, left bottom, from(#40c0ff), to(#2876b6));background:-moz-linear-gradient(top, #40c0ff, #2876b6);background:linear-gradient(to bottom, #40c0ff, #2876b6);color:#ffffff;text-decoration:none}.spbc_button_rate:active{background:#216298;background:-webkit-gradient(linear, left top, left bottom, from(#216298), to(#216298));background:-moz-linear-gradient(top, #216298, #216298);background:linear-gradient(to bottom, #216298, #216298)}#spbc_rate_plugin .spbc_button_rate:before{content:"\0000a0";display:inline-block;height:24px;width:24px;line-height:24px;margin:0 4px -6px -4px;position:relative;top:0px;left:0px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACjElEQVRIie1UTWsTURQ9dzKpofQLobQFlxqENF1JG0GE6sKuRLDtTKaBkJUIRdwpba2g9ge48gMEUUyTbrUutFmk1X6Q7kxDgi1YUSmlpsGYiTXtuy7GCYnaSRu3PczAfe/dd8695z0ecIAKsFVK0DQNLpcL8Xi8KgHZalFRNWe7uyMs2+RtkBQIjQerU/k3uVceHhmdyed/8NbWFg8OXrlXDY+020JdXf2NQMB/yuE4hHw+j5yur1df7h9QvQMXpiKRHSEECyF4cvJlQVG149VwlZ1BX58fsn1H7e29+OhMd7cEAMyM6PTMNAgfFUWrJSIAQgCAYAKIAECABACABGFt7fPPaDRqjItVqyrqG5vGAn7/kMfTBYMIyGQyeD0VMZKYweYGM2ZjpnR+eWVl8V08fnYiNP6t1Jbzc3PzbNryP38stsiKqp0uWuTz+eBqd9/s6uo02vpdPTOXxZuZDB7cfwgQGa0TIEmS7nA4PhhDkgBgdXV1FkTzRYHCtjjS4XZ3mGQmSsdEhKbGRqhqPwRz0ZOlRKImGBy/FA4F31gd8tG2tjaZmf+VUybS2tpaNpfeTMsADu+2xxRw2O12ENFftpTG6XQat26PQZIIzEA2m/1SKBSGGXhhWZmiaifezs7yfhGdnmFF1TqtuM0OksvvlzMnPZ4mq+RkMoVsNlu83ImlxDqATxUFwqHg94aGhsc9PeeuNjc372pRMpnExsZX5HI5xBZjd3aEuBsOBTcs7TGherXaa9eHIqlUioUQltYIIXhkZPT5XnjL7qXi1Wpkm6w5nccGWlpanLJNlkGQyEw1Pui6rs8tLFx+9vTJq30JlKK/3ycRCQkSFZ8Dcwszi4lwUOylgwNUxC8cBKAS7hIWzwAAAABJRU5ErkJggg==") no-repeat left center transparent;background-size:100% 100%}.spbc_rate_block_stars{margin:1em 0}.star-icon{color:#ddd;font-size:18px;position:relative}.star-icon.full:before{color:#FDE16D;content:'\2605';/* Full star in UTF8 */position:absolute;left:0;text-shadow:0 0 2px rgba(0,0,0,0.7)}.spbc_hint{color:#666}p.spbc_hint{margin:0px}.spbc_hint_warning{font-size:17px;font-weight:600;text-align:center;color:#eb8f00}.spbc_hint--link{color:#aaa;text-decoration:underline;cursor:pointer}.spbc_hint--top_right{position:relative;float:right;top:0px;right:10px}.spbc_auto_link{background:#ccc;border-color:#999;-webkit-box-shadow:inset 0 1px 0 rgba(200,200,200,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(200,200,200,.5),0 1px 0 rgba(0,0,0,.15);color:#000;text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:2px;border-radius:2px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_auto_link:hover{color:#fff}.spbc_manual_link_scan{color:#fff;background:#026E88;border-color:#026E88;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;-webkit-border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_manual_link{background:#fff;border-color:#026E88;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#026E88 !important;text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;-webkit-border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_manual_link:hover{text-decoration:underline}.spbc_page_buttons_links_basic_align{display:flex;align-items:center;justify-content:center;gap:5px}.spbc-btn-as-link{padding:0;margin:0;vertical-align:baseline;color:gray;border:0 none;border-bottom:1px solid;cursor:pointer}#spbc-account-email[contenteditable="true"]{padding:6px;background-color:#fff;border:1px solid #ccc}.spbc_dismiss{width:20px;height:20px;border-radius:5px}.spbc-links:visited{color:white}/* Popup tips */.spbc_popup_tip--icon---show:hover{color:#aaaaaa;cursor:pointer}.spbc_popup_tip--wrapper{position:absolute;background:#5a5a5a;min-width:80px;min-height:80px;max-width:500px;padding:10px;color:white;z-index:10}.spbc_popup_tip--icon---cancel{position:absolute;top:0px;right:5px;color:rgba(255,255,255,0.5)}.spbc_popup_tip--icon---cancel:hover{color:white}.spbc_popup_tip--angle{position:absolute;top:5px;left:-17px;width:10px;height:10px;background:#5a5a5a;-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.spbc_popup_tip--title{color:rgba(120,200,230,1);margin:0}.spbc_popup_tip--text{color:#fff !important}tr:hover .spbc_hint--wrapper{display:none}.spbc_log-wrapper{padding:5px;border:1px black solid;width:98%;min-height:300px;height:300px;border-bottom:5px dashed #5a5a5a}.spbc_log-wrapper .panel-body{height:100%;overflow-y:auto}.spbc_log-line{margin:0;padding:0 5px}.spbc_log-line:nth-child(odd){background:lightgrey}.spbc_log-block_header{margin:10px 0}.spbc_log-input--checkbox{width:auto}.spbc_log-label--checkbox{width:auto}button.ct_support_link{border:none;background:transparent;color:#666;text-decoration:underline;cursor:pointer}/* Modal Window Stiles */#spbc-modal-content{text-align:center}#spbc-modal-content > *{display:block;width:100%;margin:0}.spbc-modal-header{font-size:15px;font-weight:500}.spbc-modal-buttons-block{display:flex !important;gap:10px;justify-content:center}.spbc-modal-button{width:40%;height:35px;font-size:14px;font-weight:500;border:1px solid #60656b;background:#ffffff;border-radius:5px;cursor:pointer}.spbc-modal-button.spbc-modal-button-yes{background-color:#00a0d2;color:#ffffff !important}.spbc-modal-button:hover{background:#2ea2cc;color:#ffffff !important;border:1px solid #2ea2cc}.spbc-modal-file_path{color:#026E88}.spbc-modal-file_path_wrapper{margin:4% 0 1% 0;padding:5px;border:1px solid #F5F5FD;border-radius:4px}.spbc-popup-msg{width:98%;height:15px;text-align:center;padding:4px;border-radius:7px;position:relative;top:0;right:0;bottom:0;left:0;margin:auto}.popup--green{background:#DDFFDD;color:#006600;border:1px solid #006600}.popup--red{background:#FFDDDD;color:#660000;border:1px solid #660000}/* Scan results log */#spbcscan-results-log-module{min-height:300px;height:300px;border-bottom:5px dashed #5a5a5a}#spbcscan-results-log-module .panel-body{height:100%;overflow-y:auto}#spbcscan-scanner-caption h4{margin:10px 0;font-size:14px}#spbcscan-results-log-caption p{font-size:13px;margin:0 0 6px}#spbcscan-scanner-caption{display:flex;flex-wrap:wrap;flex-direction:row-reverse}#spbcscan-scanner-caption .column:first-child{width:75%;flex:0 0 75%}#spbcscan-scanner-caption .column:last-child{width:25%;flex:0 0 25%;padding-right:10px;box-sizing:border-box}.spbc-scan-log-title{color:#1d2327;font-size:1.3em;margin:0 0 15px !important;font-weight:600}.spbc--status{position:relative;padding-left:26px}.spbc--marker-green::before{content:'';position:absolute;width:10px;height:10px;background:#1dda23;border-radius:50%;left:10px;top:4px}.spbc--marker-yellow::before{content:'';position:absolute;width:10px;height:10px;background:#ffb000;border-radius:50%;left:10px;top:4px}.spbc--marker-red::before{content:'';position:absolute;width:10px;height:10px;background:#d63638;border-radius:50%;left:10px;top:4px}button#spbc_setting_get_key_auto:disabled{background:#ccc;color:#111;text-decoration:none}.spbct_notice-dismiss{position:relative;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#787c82;cursor:pointer}.spbc_accordion_header_caption__update_status{display:inline-flex;flex-direction:row;flex-wrap:nowrap;width:45%;align-items:flex-end;justify-content:flex-end}.spbc_accordion_header_caption__updated{display:inline;color:#FFFFFF;font-weight:bold}.spbc_setting__textarea{width:400px;height:150px}.spbc-settings-general-wrapper{display:flex;flex-direction:row;flex-wrap:nowrap}#spbc-settings-general-wrapper-settings{flex-grow:1}.spbc_settings--save_button_custom{position:sticky;bottom:0;display:flex;justify-content:center;flex-direction:row;align-items:baseline;flex-wrap:nowrap;padding:15px 0}/*stats part*/.spbc_stats_wrapper{display:flex;flex-direction:row}.spbc_stats_divider_left{width:70%}.spbc_stats_divider_right{width:30%;border-left:1px solid #eee}.spbc_stats_support_buttons_wrapper{display:flex;flex-direction:column;padding-left:6px}.spbc_stats_support_button{margin-top:12px}.spbc_stats_user_creation_result{background:#eee;margin-top:10px;padding:5px;border:1px solid lightgray;display:none}.spbc_stats_user_creation_value{margin-left:5px}#wpfooter{position:relative}html{scroll-behavior:smooth}.spbc_role_title{color:#999;font-size:12px;font-style:italic;background-color:#f0f0f0;padding:2px 5px;border-radius:5px;margin-left:5px}#spbc_change_role_button{cursor:pointer;width:100%;margin-top:20px}#spbc-role-capabilities-list{max-height:200px;overflow-y:auto;padding:8px;margin-top:10px;border-radius:4px}.spbc-accordion{margin-bottom:10px}.spbc-accordion-toggle{background:#f6f7f7;border:1px solid #e5e5e5;border-radius:4px;padding:8px 12px;width:100%;text-align:left;cursor:pointer;font-size:15px;outline:none;margin-bottom:0}.spbc-accordion-toggle:after{content:'▼';float:right;font-size:12px;transition:transform 0.2s}.spbc-accordion-content{border:1px solid #e5e5e5;border-top:none;padding:8px 12px;background:#fafbfc;border-radius:0 0 4px 4px}#spbc-role-capabilities-list{scrollbar-width:none;/* Firefox */-ms-overflow-style:none/* IE 10+ */}#spbc-role-capabilities-list::-webkit-scrollbar{display:none/* Chrome, Safari, Opera */}/* Fullpage trial/renew banner */.spbc-trial-renew-fullpage{display:flex;position:fixed;width:stretch;top:0;bottom:0;overflow-y:auto;justify-content:center;align-items:flex-start;font-family:Inter,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;color:#444;background-color:#f0f0f0;z-index:99}.spbc-trial-renew-fullpage-notice{padding:32px 64px 64px 64px !important;margin-top:5em !important;margin-bottom:5em !important}.spbc-trial-renew-fullpage-body{margin-top:32px;margin-left:32px}.spbc-banner-header{display:flex;justify-content:space-between}.spbc-trial-renew-fullpage-body .spbc-banner-button-wrapper{display:flex;margin:0}.spbc-trial-renew-fullpage-image{flex:1 1 0;min-width:0;max-width:576px;height:auto;object-fit:contain;margin:auto 0;align-self:flex-start}.spbc-banner-desc-block-row{line-height:22px}.spbc-banner-red-point{display:inline-block;width:8px;height:8px;background-color:#BB3323;border-radius:50%;margin-right:8px;vertical-align:middle}.spbc-banner-error{background-color:#ffffff !important;box-shadow:0px 4px 15px #84848440 !important;border-left-color:#BB3323 !important}.spbc-banner-background-container{display:grid;gap:16px;padding:32px;background-color:#F3F6F9;border-radius:8px}.spbc-banner-desc-block-title{font-size:18px;font-weight:bold;line-height:22px;color:#0A0A0A;margin-bottom:8px}.spbc-banner-stat-value{margin-bottom:0px;color:#444444;vertical-align:middle}.spbc-banner-desc-block-text{font-size:14px;line-height:22px;color:#717182;margin-left:12px;margin-top:0;vertical-align:middle}.spbc-banner-desc-blocks{display:grid;gap:16px;flex:1 1 0;min-width:0}.spbc-banner-desc-blocks-content{display:flex;gap:72px;flex-wrap:wrap;justify-content:center;margin:32px 0}.spbc-banner-check{vertical-align:middle}.spbc-trial-renew-upgrade{display:none;text-align:center}.spbc-trial-renew-upgrade-link{font-size:16px;line-height:22px;letter-spacing:0%;text-decoration:underline solid 0% #026E88 !important;text-underline-offset:25%;color:#026E88 !important}@media (max-width: 1366px){.spbc-banner-header{display:grid;gap:16px}.spbc-banner-desc-blocks-content{display:grid;gap:38px;place-items:center}.spbc-trial-renew-upgrade{display:block}}@media (max-width: 782px){.spbc-trial-renew-fullpage{padding-top:50px;padding-bottom:50px}.spbc-trial-renew-fullpage-notice{padding:24px 24px 32px 24px !important}.spbc-trial-renew-fullpage-body{margin-top:20px;margin-left:0}.spbc-banner-desc-blocks-content{gap:24px}.spbc-banner-background-container{padding:20px}.spbc-trial-renew-fullpage-image{width:100%}}@media (max-width: 480px){.spbc-trial-renew-fullpage-notice{padding:16px 12px 24px 12px !important}.spbc-banner-background-container{padding:16px}.spbc-banner-desc-blocks-content{gap:16px}.spbc-banner-desc-block-title{font-size:16px}} \ No newline at end of file +/** .circle used in resend code confirmation button in 2FA modal **/.circle{border-radius:50%;align-items:center;justify-content:center;position:relative;background-color:#03A9F4;clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 0, 50% 0, 50% 50%, 50% 50%)}.circle-inner{width:100%;height:100%;border-radius:50%;background:#f7f7f7;transform:scale(0.7)}.circle--small{width:16px;height:16px}.circle--mid{width:30px;height:30px}.-animation--circle{animation:animation-circle 2s linear forwards}.-animation--30s{animation-duration:30s !important}.-animation--2min{animation-duration:120s !important}@keyframes animation-circle{12.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 0, 0 0, 50% 50%, 50% 50%)}25%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 50%, 0 50%, 50% 50%, 50% 50%)}37.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 0 100%, 0 100%, 0 100%, 0 100%, 50% 50%, 50% 50%)}50%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 100%, 50% 50%, 50% 50%)}62.5%{clip-path:polygon(50% 0%, 100% 0, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 100% 100%, 50% 50%, 50% 50%)}75%{clip-path:polygon(50% 0%, 100% 0, 100% 50%, 100% 50%, 100% 50%, 100% 50%, 100% 50%, 50% 50%, 50% 50%)}87.5%{clip-path:polygon(50% 0%, 100% 0, 100% 0, 100% 0, 100% 0, 100% 0, 100% 0, 50% 50%, 50% 50%)}100%{clip-path:polygon(50% 0%, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 0, 50% 50%, 50% 50%)}}#confirmation-code--resend .circle,.spbc-2fa-confirmation-resend .circle{margin-left:5px;display:inline-block;vertical-align:text-bottom}/** 2FA confirmation modal: input + Resend on one row (narrow dialog vs .regular-text 25em) */.spbc-2fa-confirmation-row{display:flex;flex-direction:row;align-items:center;gap:10px;margin:1em 0}.spbc-2fa-confirmation-row .spbc-2fa-confirmation-input{flex:1 1 auto;min-width:0;width:auto !important;max-width:100%;box-sizing:border-box}.spbc-2fa-confirmation-row .spbc-2fa-confirmation-resend{flex-shrink:0}.spbc---hidden{display:none}.spbc---gray{color:gray}.spbc---red{color:red}.spbc---green{color:#037603}.spbc_bold{font-weight:800}/** .spbc_waf_reason* used in Firewall tab */.spbc_waf_reason_title{text-decoration:underline}.spbc_waf_reason{display:none}.spbc_waf_reason_title:hover + .spbc_waf_reason{display:inline}.spbc_highlighted{outline-offset:5px;outline-color:red;outline-width:3px !important;outline-style:solid !important}/** .spbc_progressbar* used in Scanner tab */.spbc_progressbar_counter{position:absolute;height:22px;width:100%;left:0;top:0;text-align:center}.spbc_progressbar_counter span{vertical-align:sub;line-height:22px;font-weight:600;font-size:18px}.spbc_preloader{width:20px;margin-left:5px;vertical-align:text-top;display:none}.spbc_preloader_button{height:15px;margin-left:5px;vertical-align:text-top;display:none}.spbc_scan_result_row td{text-align:center}.spbc_scan_result_row td:nth-child(1){text-align:left}.spbc_scan_result_row td:nth-child(2){text-align:right}.spbc_scan_result_row td:last-child button{margin-left:3px}.spbc_view_file_row_wrapper{line-height:19px}.spbc_view_file_row_wrapper:nth-child(odd){background:#ccc}.spbc_view_file_row_wrapper:nth-child(even){background:#ddd}.spbc_view_file_row_num{display:inline-block;width:30px;margin:0 0 0 5px;border-right:1px solid black}.spbc_view_file_row{display:inline;margin:0 0 0 5px;line-height:19px;font-size:1em;word-break:break-all}.spbcShortText{display:inline-block;width:100%}.spbcFullText{display:none;position:absolute;top:-5px;background:rgba(150,150,150,.9);color:white;padding:7px;border:1px solid rgb(51, 51, 51);border-radius:5px;z-index:20}.spbcFullText-right{display:none;position:absolute;top:0;right:0;background:rgba(150,150,150,.9);color:white;padding:7px;border:1px solid rgb(51, 51, 51);border-radius:5px;z-index:20}.spbcFullText a{color:white}.spbcFullText a:hover{color:#ddd}#spbc_scan_accordion .column-primary{position:initial}#spbc_scan_accordion tbody tr{position:relative}.spbc_accordion_category_wrapper{padding:0px 5px 10px 5px;border:1px solid lightgrey;border-radius:3px;margin-bottom:5px}.spbc_accordion_category_header{color:#026E88;font-weight:800;margin-left:10px !important}/* Pagination */div.pagination{margin:10px}ul.pagination{display:inline-block;margin:0}li.pagination{display:inline-block;margin-left:10px}span.current_page{font-size:1.3em;font-weight:600}/*Page header start*/.spbc_page_mob_info__about_block{display:none}/*Page header end*//* TABS */.spbc_long_description__show:hover{color:#aaaaaa;cursor:pointer}.spbc_settings_description{font-size:9pt;color:#888}.spbc_settings_description select{display:inline;position:relative;transform:scale(.7);left:-50px}.spbc_settings_description_status_php_execution{margin-top:5px;margin-left:18px;font-size:10pt;color:red;font-weight:600;list-style-type:disc}.spbc_tab-settings_general input[type=text]{min-width:255px;width:100%}.spbc_short_text_field input{min-width:70px !important;width:70px !important}.spbc_middle_text_field input{min-width:200px !important;width:200px !important}.spbc_long_text_field input[type=text]{min-width:200px;width:500px}/* Log button */.spbc__wrapper--center{margin:10px 0 10px 0;text-align:center}/* Settings banners */.spbc_settings_banner{display:inline-block;margin:1em 0;vertical-align:top;text-align:center}#spbc_rate_plugin{}.spbc_rate_block{border:1px dashed #666;width:400px;padding:0.2em}#spbc_translate_plugin{margin-left:10px}.spbc_rate_block{border:1px dashed #666;width:400px;padding:0.2em}#spbc_translate_plugin .spbc_button_rate{margin-bottom:10px}.spbc_button_rate{display:inline-block;text-align:center;vertical-align:middle;padding:12px 24px;border:1px solid #216298;border-radius:8px;background:#35a0f7;background:-webkit-gradient(linear, left top, left bottom, from(#35a0f7), to(#216298));background:-moz-linear-gradient(top, #35a0f7, #216298);background:linear-gradient(to bottom, #35a0f7, #216298);text-shadow:#153e5f 1px 1px 1px;font:normal normal bold 16px verdana;color:#ffffff;text-decoration:none}.spbc_button_rate:hover,.spbc_button_rate:focus{border:1px solid #297bbe;background:#40c0ff;background:-webkit-gradient(linear, left top, left bottom, from(#40c0ff), to(#2876b6));background:-moz-linear-gradient(top, #40c0ff, #2876b6);background:linear-gradient(to bottom, #40c0ff, #2876b6);color:#ffffff;text-decoration:none}.spbc_button_rate:active{background:#216298;background:-webkit-gradient(linear, left top, left bottom, from(#216298), to(#216298));background:-moz-linear-gradient(top, #216298, #216298);background:linear-gradient(to bottom, #216298, #216298)}#spbc_rate_plugin .spbc_button_rate:before{content:"\0000a0";display:inline-block;height:24px;width:24px;line-height:24px;margin:0 4px -6px -4px;position:relative;top:0px;left:0px;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACjElEQVRIie1UTWsTURQ9dzKpofQLobQFlxqENF1JG0GE6sKuRLDtTKaBkJUIRdwpba2g9ge48gMEUUyTbrUutFmk1X6Q7kxDgi1YUSmlpsGYiTXtuy7GCYnaSRu3PczAfe/dd8695z0ecIAKsFVK0DQNLpcL8Xi8KgHZalFRNWe7uyMs2+RtkBQIjQerU/k3uVceHhmdyed/8NbWFg8OXrlXDY+020JdXf2NQMB/yuE4hHw+j5yur1df7h9QvQMXpiKRHSEECyF4cvJlQVG149VwlZ1BX58fsn1H7e29+OhMd7cEAMyM6PTMNAgfFUWrJSIAQgCAYAKIAECABACABGFt7fPPaDRqjItVqyrqG5vGAn7/kMfTBYMIyGQyeD0VMZKYweYGM2ZjpnR+eWVl8V08fnYiNP6t1Jbzc3PzbNryP38stsiKqp0uWuTz+eBqd9/s6uo02vpdPTOXxZuZDB7cfwgQGa0TIEmS7nA4PhhDkgBgdXV1FkTzRYHCtjjS4XZ3mGQmSsdEhKbGRqhqPwRz0ZOlRKImGBy/FA4F31gd8tG2tjaZmf+VUybS2tpaNpfeTMsADu+2xxRw2O12ENFftpTG6XQat26PQZIIzEA2m/1SKBSGGXhhWZmiaifezs7yfhGdnmFF1TqtuM0OksvvlzMnPZ4mq+RkMoVsNlu83ImlxDqATxUFwqHg94aGhsc9PeeuNjc372pRMpnExsZX5HI5xBZjd3aEuBsOBTcs7TGherXaa9eHIqlUioUQltYIIXhkZPT5XnjL7qXi1Wpkm6w5nccGWlpanLJNlkGQyEw1Pui6rs8tLFx+9vTJq30JlKK/3ycRCQkSFZ8Dcwszi4lwUOylgwNUxC8cBKAS7hIWzwAAAABJRU5ErkJggg==") no-repeat left center transparent;background-size:100% 100%}.spbc_rate_block_stars{margin:1em 0}.star-icon{color:#ddd;font-size:18px;position:relative}.star-icon.full:before{color:#FDE16D;content:'\2605';/* Full star in UTF8 */position:absolute;left:0;text-shadow:0 0 2px rgba(0,0,0,0.7)}.spbc_hint{color:#666}p.spbc_hint{margin:0px}.spbc_hint_warning{font-size:17px;font-weight:600;text-align:center;color:#eb8f00}.spbc_hint--link{color:#aaa;text-decoration:underline;cursor:pointer}.spbc_hint--top_right{position:relative;float:right;top:0px;right:10px}.spbc_auto_link{background:#ccc;border-color:#999;-webkit-box-shadow:inset 0 1px 0 rgba(200,200,200,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(200,200,200,.5),0 1px 0 rgba(0,0,0,.15);color:#000;text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:2px;border-radius:2px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_auto_link:hover{color:#fff}.spbc_manual_link_scan{color:#fff;background:#026E88;border-color:#026E88;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;-webkit-border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_manual_link{background:#fff;border-color:#026E88;-webkit-box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(120,200,230,.5),0 1px 0 rgba(0,0,0,.15);color:#026E88 !important;text-decoration:none;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;-webkit-border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.spbc_manual_link:hover{text-decoration:underline}.spbc_page_buttons_links_basic_align{display:flex;align-items:center;justify-content:center;gap:5px}.spbc-btn-as-link{padding:0;margin:0;vertical-align:baseline;color:gray;border:0 none;border-bottom:1px solid;cursor:pointer}#spbc-account-email[contenteditable="true"]{padding:6px;background-color:#fff;border:1px solid #ccc}.spbc_dismiss{width:20px;height:20px;border-radius:5px}.spbc-links:visited{color:white}/* Popup tips */.spbc_popup_tip--icon---show:hover{color:#aaaaaa;cursor:pointer}.spbc_popup_tip--wrapper{position:absolute;background:#5a5a5a;min-width:80px;min-height:80px;max-width:500px;padding:10px;color:white;z-index:10}.spbc_popup_tip--icon---cancel{position:absolute;top:0px;right:5px;color:rgba(255,255,255,0.5)}.spbc_popup_tip--icon---cancel:hover{color:white}.spbc_popup_tip--angle{position:absolute;top:5px;left:-17px;width:10px;height:10px;background:#5a5a5a;-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.spbc_popup_tip--title{color:rgba(120,200,230,1);margin:0}.spbc_popup_tip--text{color:#fff !important}tr:hover .spbc_hint--wrapper{display:none}.spbc_log-wrapper{padding:5px;border:1px black solid;width:98%;min-height:300px;height:300px;border-bottom:5px dashed #5a5a5a}.spbc_log-wrapper .panel-body{height:100%;overflow-y:auto}.spbc_log-line{margin:0;padding:0 5px}.spbc_log-line:nth-child(odd){background:lightgrey}.spbc_log-block_header{margin:10px 0}.spbc_log-input--checkbox{width:auto}.spbc_log-label--checkbox{width:auto}button.ct_support_link{border:none;background:transparent;color:#666;text-decoration:underline;cursor:pointer}/* Modal Window Stiles */#spbc-modal-content{text-align:center}#spbc-modal-content > *{display:block;width:100%;margin:0}.spbc-modal-header{font-size:15px;font-weight:500}.spbc-modal-buttons-block{display:flex !important;gap:10px;justify-content:center}.spbc-modal-button{width:40%;height:35px;font-size:14px;font-weight:500;border:1px solid #60656b;background:#ffffff;border-radius:5px;cursor:pointer}.spbc-modal-button.spbc-modal-button-yes{background-color:#00a0d2;color:#ffffff !important}.spbc-modal-button:hover{background:#2ea2cc;color:#ffffff !important;border:1px solid #2ea2cc}.spbc-modal-file_path{color:#026E88}.spbc-modal-file_path_wrapper{margin:4% 0 1% 0;padding:5px;border:1px solid #F5F5FD;border-radius:4px}.spbc-popup-msg{width:98%;height:15px;text-align:center;padding:4px;border-radius:7px;position:relative;top:0;right:0;bottom:0;left:0;margin:auto}.popup--green{background:#DDFFDD;color:#006600;border:1px solid #006600}.popup--red{background:#FFDDDD;color:#660000;border:1px solid #660000}/* Scan results log */#spbcscan-results-log-module{min-height:300px;height:300px;border-bottom:5px dashed #5a5a5a}#spbcscan-results-log-module .panel-body{height:100%;overflow-y:auto}#spbcscan-scanner-caption h4{margin:10px 0;font-size:14px}#spbcscan-results-log-caption p{font-size:13px;margin:0 0 6px}#spbcscan-scanner-caption{display:flex;flex-wrap:wrap;flex-direction:row-reverse}#spbcscan-scanner-caption .column:first-child{width:75%;flex:0 0 75%}#spbcscan-scanner-caption .column:last-child{width:25%;flex:0 0 25%;padding-right:10px;box-sizing:border-box}.spbc-scan-log-title{color:#1d2327;font-size:1.3em;margin:0 0 15px !important;font-weight:600}.spbc--status{position:relative;padding-left:26px}.spbc--marker-green::before{content:'';position:absolute;width:10px;height:10px;background:#1dda23;border-radius:50%;left:10px;top:4px}.spbc--marker-yellow::before{content:'';position:absolute;width:10px;height:10px;background:#ffb000;border-radius:50%;left:10px;top:4px}.spbc--marker-red::before{content:'';position:absolute;width:10px;height:10px;background:#d63638;border-radius:50%;left:10px;top:4px}button#spbc_setting_get_key_auto:disabled{background:#ccc;color:#111;text-decoration:none}.spbct_notice-dismiss{position:relative;top:0;right:1px;border:none;margin:0;padding:9px;background:0 0;color:#787c82;cursor:pointer}.spbc_accordion_header_caption__update_status{display:inline-flex;flex-direction:row;flex-wrap:nowrap;width:45%;align-items:flex-end;justify-content:flex-end}.spbc_accordion_header_caption__updated{display:inline;color:#FFFFFF;font-weight:bold}.spbc_setting__textarea{width:400px;height:150px}.spbc-settings-general-wrapper{display:flex;flex-direction:row;flex-wrap:nowrap}#spbc-settings-general-wrapper-settings{flex-grow:1}.spbc_settings--save_button_custom{position:sticky;bottom:0;display:flex;justify-content:center;flex-direction:row;align-items:baseline;flex-wrap:nowrap;padding:15px 0}/*stats part*/.spbc_stats_wrapper{display:flex;flex-direction:row}.spbc_stats_divider_left{width:70%}.spbc_stats_divider_right{width:30%;border-left:1px solid #eee}.spbc_stats_support_buttons_wrapper{display:flex;flex-direction:column;padding-left:6px}.spbc_stats_support_button{margin-top:12px}.spbc_stats_user_creation_result{background:#eee;margin-top:10px;padding:5px;border:1px solid lightgray;display:none}.spbc_stats_user_creation_value{margin-left:5px}#wpfooter{position:relative}html{scroll-behavior:smooth}.spbc_role_title{color:#999;font-size:12px;font-style:italic;background-color:#f0f0f0;padding:2px 5px;border-radius:5px;margin-left:5px}#spbc_change_role_button{cursor:pointer;width:100%;margin-top:20px}#spbc-role-capabilities-list{max-height:200px;overflow-y:auto;padding:8px;margin-top:10px;border-radius:4px}.spbc-accordion{margin-bottom:10px}.spbc-accordion-toggle{background:#f6f7f7;border:1px solid #e5e5e5;border-radius:4px;padding:8px 12px;width:100%;text-align:left;cursor:pointer;font-size:15px;outline:none;margin-bottom:0}.spbc-accordion-toggle:after{content:'▼';float:right;font-size:12px;transition:transform 0.2s}.spbc-accordion-content{border:1px solid #e5e5e5;border-top:none;padding:8px 12px;background:#fafbfc;border-radius:0 0 4px 4px}#spbc-role-capabilities-list{scrollbar-width:none;/* Firefox */-ms-overflow-style:none/* IE 10+ */}#spbc-role-capabilities-list::-webkit-scrollbar{display:none/* Chrome, Safari, Opera */}/* Fullpage trial/renew banner */.spbc-trial-renew-fullpage{display:flex;position:fixed;width:stretch;top:0;bottom:0;overflow-y:auto;justify-content:center;align-items:flex-start;font-family:Inter,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;color:#444;background-color:#f0f0f0;z-index:99}.spbc-trial-renew-fullpage-notice{padding:32px 64px 64px 64px !important;margin-top:5em !important;margin-bottom:5em !important}.spbc-trial-renew-fullpage-body{margin-top:32px;margin-left:32px}.spbc-banner-header{display:flex;justify-content:space-between}.spbc-trial-renew-fullpage-body .spbc-banner-button-wrapper{display:flex;margin:0}.spbc-trial-renew-fullpage-image{flex:1 1 0;min-width:0;max-width:576px;height:auto;object-fit:contain;margin:auto 0;align-self:flex-start}.spbc-banner-desc-block-row{line-height:22px}.spbc-banner-red-point{display:inline-block;width:8px;height:8px;background-color:#BB3323;border-radius:50%;margin-right:8px;vertical-align:middle}.spbc-banner-error{background-color:#ffffff !important;box-shadow:0px 4px 15px #84848440 !important;border-left-color:#BB3323 !important}.spbc-banner-background-container{display:grid;gap:16px;padding:32px;background-color:#F3F6F9;border-radius:8px}.spbc-banner-desc-block-title{font-size:18px;font-weight:bold;line-height:22px;color:#0A0A0A;margin-bottom:8px}.spbc-banner-stat-value{margin-bottom:0px;color:#444444;vertical-align:middle}.spbc-banner-desc-block-text{font-size:14px;line-height:22px;color:#717182;margin-left:12px;margin-top:0;vertical-align:middle}.spbc-banner-desc-blocks{display:grid;gap:16px;flex:1 1 0;min-width:0}.spbc-banner-desc-blocks-content{display:flex;gap:72px;flex-wrap:wrap;justify-content:center;margin:32px 0}.spbc-banner-check{vertical-align:middle}.spbc-trial-renew-upgrade{display:none;text-align:center}.spbc-trial-renew-upgrade-link{font-size:16px;line-height:22px;letter-spacing:0%;text-decoration:underline solid 0% #026E88 !important;text-underline-offset:25%;color:#026E88 !important}@media (max-width: 1366px){.spbc-banner-header{display:grid;gap:16px}.spbc-banner-desc-blocks-content{display:grid;gap:38px;place-items:center}.spbc-trial-renew-upgrade{display:block}}@media (max-width: 782px){.spbc-trial-renew-fullpage{padding-top:50px;padding-bottom:50px}.spbc-trial-renew-fullpage-notice{padding:24px 24px 32px 24px !important}.spbc-trial-renew-fullpage-body{margin-top:20px;margin-left:0}.spbc-banner-desc-blocks-content{gap:24px}.spbc-banner-background-container{padding:20px}.spbc-trial-renew-fullpage-image{width:100%}}@media (max-width: 480px){.spbc-trial-renew-fullpage-notice{padding:16px 12px 24px 12px !important}.spbc-banner-background-container{padding:16px}.spbc-banner-desc-blocks-content{gap:16px}.spbc-banner-desc-block-title{font-size:16px}} \ No newline at end of file diff --git a/css/src/spbc-settings.css b/css/src/spbc-settings.css index 32be45069..97c708853 100644 --- a/css/src/spbc-settings.css +++ b/css/src/spbc-settings.css @@ -76,11 +76,6 @@ .spbc_waf_reason{display: none;} .spbc_waf_reason_title:hover + .spbc_waf_reason{display: inline;} -/** .spbc_sub* and spbc_affiliate_shortcode used in General settings tab */ -.spbc_sub_setting{margin-left: 30px !important;} -.spbc_sub2_setting{margin-left: 60px !important;} -.spbc_affiliate_shortcode{width:inherit !important; min-width: inherit !important} - .spbc_highlighted{ outline-offset: 5px; outline-color: red; diff --git a/inc/spbc-auth.php b/inc/spbc-auth.php index d5c65e705..3b7815c6b 100644 --- a/inc/spbc-auth.php +++ b/inc/spbc-auth.php @@ -139,10 +139,10 @@ function spbc_authenticate($user, $username) if ( is_wp_error($user) ) { /** - * @todo Migrate BFP disable from constant to settings option + * Constant kept for backward compatibility with temporary workaround via wp-config.php * @psalm-suppress RedundantCondition */ - if (!SPBC_BFP_DISABLE) { + if (!empty($spbc->settings['bfp__enabled']) && !SPBC_BFP_DISABLE) { spbc_authenticate__check_brute_force(); } diff --git a/inc/spbc-firewall.php b/inc/spbc-firewall.php index cc272ed63..747e471a0 100644 --- a/inc/spbc-firewall.php +++ b/inc/spbc-firewall.php @@ -14,7 +14,6 @@ use CleantalkSP\SpbctWP\Firewall\UploadChecker; use CleantalkSP\SpbctWP\Helpers\IP; use CleantalkSP\SpbctWP\Variables\Cookie; -use CleantalkSP\SpbctWP\RenameLoginPage; // Prevent direct call if ( ! defined('ABSPATH') ) { @@ -51,33 +50,30 @@ function spbc_firewall__check() spbc_firewall_check_waf($firewall); if ( class_exists('Poppyz_Core') ) { //fix poppyz plugin early start conflict - $GLOBALS['wp_rewrite'] = is_null($GLOBALS['wp_rewrite']) ? new WP_Rewrite() : $GLOBALS['wp_rewrite']; // Fix for early load WP_Rewrite - } - - $login_url = wp_login_url(); - if ( $spbc->settings['login_page_rename__enabled'] ) { - $GLOBALS['wp_rewrite'] = is_null($GLOBALS['wp_rewrite']) ? new WP_Rewrite() : $GLOBALS['wp_rewrite']; // Fix for early load WP_Rewrite - $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); + if ( empty($GLOBALS['wp_rewrite']) || ! ($GLOBALS['wp_rewrite'] instanceof WP_Rewrite) ) { + $GLOBALS['wp_rewrite'] = new WP_Rewrite(); // Fix for early load WP_Rewrite + } } - // Compare only the path part of URLs to avoid scheme mismatch issues. - $current_path = Server::getCanonicalPath() ?: Server::getCanonicalUri(); - $login_path = parse_url($login_url, PHP_URL_PATH) ?: '/wp-login.php'; - $is_login_page = strpos(trim($current_path, '/'), trim($login_path, '/')) === 0; - - $firewall->loadFwModule( - new BFP( - array( - 'api_key' => $spbc->api_key, - 'state' => $spbc, - 'is_login_page' => $is_login_page, - 'is_logged_in' => Cookie::getString('spbc_is_logged_in') === md5($spbc->data['salt'] . get_option('home')), - 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], - 'block_period' => $spbc->settings['bfp__block_period__5_fails'], - 'count_period' => $spbc->settings['bfp__count_interval'], // Counting login attempts in this interval + /** + * Constant kept for backward compatibility; may be overridden in wp-config.php + * @psalm-suppress RedundantCondition + */ + if (!empty($spbc->settings['bfp__enabled']) && !SPBC_BFP_DISABLE) { + $firewall->loadFwModule( + new BFP( + array( + 'api_key' => $spbc->api_key, + 'state' => $spbc, + 'is_login_page' => spbc_is_login_page_request(), + 'is_logged_in' => Cookie::getString('spbc_is_logged_in') === md5($spbc->data['salt'] . get_option('home')), + 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], + 'block_period' => $spbc->settings['bfp__block_period__5_fails'], + 'count_period' => $spbc->settings['bfp__count_interval'], // Counting login attempts in this interval + ) ) - ) - ); + ); + } if ( $spbc->settings['traffic_control__enabled'] && @@ -193,7 +189,9 @@ function spbc_upload_checker__check() //Nonce can be different here !( wp_verify_nonce(Request::getString('_wpnonce') ?: '', 'media-form') || - wp_verify_nonce(Request::getString('emr_nonce') ?: '', 'media_replace_upload') + wp_verify_nonce(Request::getString('emr_nonce') ?: '', 'media_replace_upload') || + // ACF Tools > Import Field Groups (JSON) + wp_verify_nonce(Request::getString('_acf_nonce') ?: '', 'import') ) ) { $run_checker_error = new WP_Error(403, __('You do not have sufficient permissions to upload files. Upload files request wrong', 'security-malware-firewall')); @@ -285,7 +283,7 @@ function spbc_firewall_skip_check() */ function spbc_firewall_skip_check_uploadchecker() { - global $spbc; + global $spbc, $pagenow; if (empty($_FILES)) { return true; @@ -298,6 +296,8 @@ function spbc_firewall_skip_check_uploadchecker() || \CleantalkSP\Variables\Server::inUri('/favicon.ico') // Exclude favicon.ico requests from the check || spbc_mailpoet_doing_cron() || spbc_is_cli() + || $pagenow === 'upload.php' + || $pagenow === 'async-upload.php' ) { return true; } diff --git a/inc/spbc-pluggable.php b/inc/spbc-pluggable.php index 00869f31b..b8b07b0d2 100644 --- a/inc/spbc-pluggable.php +++ b/inc/spbc-pluggable.php @@ -1,5 +1,7 @@ settings['login_page_rename__enabled']) ) { + if ( empty($GLOBALS['wp_rewrite']) || ! ($GLOBALS['wp_rewrite'] instanceof WP_Rewrite) ) { + $GLOBALS['wp_rewrite'] = new WP_Rewrite(); + } + $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); + } + + if ( spbc_request_uri_matches_url($login_url) ) { + return true; + } + + return spbc_is_woocommerce_login_request(); +} + +/** + * Detect WooCommerce My Account page / login form for BFP. + * + * @return bool + */ +function spbc_is_woocommerce_login_request() +{ + if ( ! spbc_is_plugin_active('woocommerce/woocommerce.php') ) { + return false; + } + + // Login form POST from WooCommerce My Account + if ( Post::getString('woocommerce-login-nonce') !== '' ) { + return true; + } + + // Visiting My Account so already-banned IPs are blocked before form submit + $myaccount_page_id = (int) get_option('woocommerce_myaccount_page_id'); + if ( ! $myaccount_page_id ) { + return false; + } + + $myaccount_url = get_permalink($myaccount_page_id); + if ( ! $myaccount_url ) { + return false; + } + + return spbc_request_uri_matches_url($myaccount_url); +} + +/** + * Whether the current REQUEST_URI matches the given absolute URL. + * Compares path and, when present, required query args — so plain-permalink + * URLs like /?my-login or /?page_id=37 do not match the whole site. + * + * @param string $url Absolute URL (e.g. from wp_login_url() / get_permalink()). + * + * @return bool + */ +function spbc_request_uri_matches_url($url) +{ + $url_parts = parse_url((string) $url); + if ( ! is_array($url_parts) ) { + return false; + } + + $target_path = isset($url_parts['path']) ? $url_parts['path'] : '/'; + $target_query = isset($url_parts['query']) ? $url_parts['query'] : ''; + + // Path: canonical (percent-decoded). Query: raw QUERY_STRING — do not take it from + // rawurldecoded REQUEST_URI (%3F in path / %2B semantics would break parsing). + $current_path = Server::getCanonicalPath(); + $current_query = (string) Server::get('QUERY_STRING', null, 'url'); + + if ( $current_path === '' ) { + $current_path = '/'; + } + + $target_path_norm = spbc_normalize_request_path($target_path); + $current_path_norm = spbc_normalize_request_path($current_path); + + // Query-based URLs (plain permalinks / renamed login): require path + query keys. + if ( $target_query !== '' ) { + if ( $target_path_norm !== $current_path_norm ) { + return false; + } + + parse_str($target_query, $target_params); + parse_str($current_query, $current_params); + + if ( empty($target_params) ) { + return false; + } + + foreach ( $target_params as $key => $value ) { + if ( ! array_key_exists($key, $current_params) ) { + return false; + } + if ( $value !== '' && (string) $current_params[$key] !== (string) $value ) { + return false; + } + } + + return true; + } + + // Path-only URL: never treat bare "/" as a match (would mark every request). + if ( $target_path_norm === '/' ) { + return false; + } + + $target_trim = trim($target_path_norm, '/'); + $current_trim = trim($current_path_norm, '/'); + + return $current_trim === $target_trim || strpos($current_trim, $target_trim . '/') === 0; +} + +/** + * @param string $path + * + * @return string + */ +function spbc_normalize_request_path($path) +{ + $path = (string) $path; + if ( $path === '' || $path === '/' ) { + return '/'; + } + + return '/' . trim($path, '/'); +} diff --git a/inc/spbc-settings.php b/inc/spbc-settings.php index 91a601ee8..92b3ddd3a 100644 --- a/inc/spbc-settings.php +++ b/inc/spbc-settings.php @@ -3,7 +3,6 @@ use CleantalkSP\Common\RateLimit\RateLimiterConfig; use CleantalkSP\Common\TextPlateStatic; use CleantalkSP\Security\LoginCollectingProtector; -use CleantalkSP\SpbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentSettings; use CleantalkSP\SpbctWP\API; use CleantalkSP\SpbctWP\Cron as SpbcCron; use CleantalkSP\SpbctWP\Escape; @@ -201,298 +200,7 @@ function spbc_settings__register() 'class_prefix' => 'spbc', 'ajax' => true, 'after' => 'spbc_settings_draw_save_button_bottom_block', - 'sections' => array( - 'scanner_setting' => array( - 'type' => 'section', - 'title' => __('Malware Scanner', 'security-malware-firewall'), - 'anchor' => 'scanner_setting', - 'display' => $spbc->scaner_enabled, - 'react_managed' => true, // Header is rendered by React SettingsGroup component. A temporary solution until the entire settings group is switched to React - 'fields' => array(), - ), - - // Modules vulnerability detection - 'vulnerability_check' => array( - 'type' => 'section', - 'title' => __('Modules vulnerability detection', 'security-malware-firewall'), - 'anchor' => 'vulnerability_check', - 'display' => current_user_can('activate_plugins'), - 'description' => VulnerabilityAlarmView::getServiceFeatureDescription(), - 'fields' => array( - 'vulnerability_check__test_before_install' => array( - 'type' => 'field', - 'title' => __('Test plugins for known vulnerabilities before install them', 'security-malware-firewall'), - 'description' => __('Request the research.cleantalk.org about the plugin status to let you know about vulnerability status on the page [Plugins->Add new]', 'security-malware-firewall'), - 'long_description' => true, - ), - 'vulnerability_check__enable_cron' => array( - 'type' => 'field', - 'title' => __('Test already installed plugins for known vulnerabilities', 'security-malware-firewall'), - 'long_description' => true, - 'description' => __('Every 24 hours the plugin checks all the installed plugins over database research.cleantalk.org. ', 'security-malware-firewall'), - 'children' => array('vulnerability_check__warn_on_modules_pages'), - ), - 'vulnerability_check__warn_on_modules_pages' => array( - 'type' => 'field', - 'title' => __('Warn me about known vulnerabilities of already installed plugins', 'security-malware-firewall'), - 'description' => __('Modify the page of installed plugins to let you know about vulnerabilities found', 'security-malware-firewall'), - 'parent' => 'vulnerability_check__enable_cron' - ), - 'vulnerability_check__show_reports' => array( - 'type' => 'field', - 'title' => __('Show security reports for plugins and themes before install a new one', 'security-malware-firewall'), - 'description' => __('Plugin reports in Appearance -> Themes and Plugins -> Add New Plugin about security tests that have been done for a specific version of plugin or theme. These tests provided by CleanTalk Research team or/and Cloud Malware Scanner.', 'security-malware-firewall'), - ), - ), - ), - - // Admin bar - 'admin_bar' => array( - 'type' => 'section', - 'title' => __('Admin Bar', 'security-malware-firewall'), - 'anchor' => 'admin_bar', - 'display' => current_user_can('activate_plugins'), - 'fields' => array( - 'admin_bar__show' => array( - 'type' => 'field', - 'title' => __('Show statistics in admin bar', 'security-malware-firewall'), - 'description' => __('Show/hide the ' . $spbc->data["wl_company_name"] . ' drop-down menu at the top bar of the WordPress backend.', 'security-malware-firewall'), - 'children' => array( - 'admin_bar__admins_online_counter', - 'admin_bar__brute_force_counter', - 'admin_bar__firewall_counter' - ), - ), - 'admin_bar__admins_online_counter' => array( - 'type' => 'field', - 'title' => __('Administrators online counter', 'security-malware-firewall'), - 'description' => __('Shows the number of administrators online in the admin bar.', 'security-malware-firewall'), - 'parent' => 'admin_bar__show', - ), - 'admin_bar__brute_force_counter' => array( - 'type' => 'field', - 'title' => __('Allowed/Blocked login attempts counter', 'security-malware-firewall'), - 'description' => __('Shows the number of blocked login attempts in the admin bar. Counts only the local database.', 'security-malware-firewall'), - 'parent' => 'admin_bar__show', - ), - 'admin_bar__firewall_counter' => array( - 'type' => 'field', - 'title' => __('Security Firewall counter', 'security-malware-firewall'), - 'description' => __('Shows the firewall counters in the admin bar. Counts only the local database.', 'security-malware-firewall'), - 'parent' => 'admin_bar__show', - ), - 'wp__dashboard_widget__show' => array( - 'type' => 'field', - 'title' => __('Security brief report widget', 'security-malware-firewall'), - 'description' => __('Shows the brief widget on the main admin page', 'security-malware-firewall'), - ), - ) - ), - - 'misc' => array( - 'type' => 'section', - 'title' => __('Miscellaneous', 'security-malware-firewall'), - 'anchor' => 'misc', - 'fields' => array( - 'misc__backend_logs_enable' => array( - 'display' => is_main_site(), - 'disabled' => ! $spbc->data['extra_package']['backend_logs'], - 'type' => 'field', - 'title' => __('Collect and send PHP logs', 'security-malware-firewall'), - 'description' => $spbc->data['extra_package']['backend_logs'] || $spbc->data["wl_mode_enabled"] - ? __('Collect and send PHP error logs to your ' . $spbc->data["wl_company_name"] . ' Dashboard where you can list them.', 'security-malware-firewall') - : sprintf( - __( - 'To see the collected logs please use the %sBackend PHP log%s. The %sextra package%s is required to start the collection, please click "Synchronize with the Cloud" in the plugin settings after purchasing the Extra package.', - 'security-malware-firewall' - ), - '', - '', - '', - '' - ), - 'long_description' => true, - ), - 'misc__prevent_logins_collecting' => array( - 'type' => 'field', - 'title' => __('Prevent collecting of authors logins', 'security-malware-firewall'), - 'long_description' => true, - 'description' => __('Prevent visitors from collecting logins of the content authors from the website links (like example.com/?author=1).', 'security-malware-firewall'), - ), - 'misc__prevent_logins_collecting_on_password_reset' => array( - 'type' => 'field', - 'title' => __('Prevent collecting of user login on password reset', 'security-malware-firewall'), - 'long_description' => true, - 'description' => __('The password reset error will not contain the data about selected username does not exist.', 'security-malware-firewall'), - ), - 'misc__show_link_in_login_form' => array( - 'type' => 'field', - 'title' => __('Let them know about protection', 'security-malware-firewall'), - 'description' => __('Place the ' . $spbc->data["wl_company_name"] . ' warning under the website login form: "Brute-force protection by ' . $spbc->data["wl_brandname"] . '. All attempts are being logged."', 'security-malware-firewall'), - ), - 'wp__disable_xmlrpc' => array( - 'type' => 'field', - 'title' => __('Disable XML-RPC', 'security-malware-firewall'), - 'description' => __('Turn this on to disable a WordPress out-of-date technology of connecting websites to miscellaneous systems.', 'security-malware-firewall'), - 'long_description' => true, - ), - 'wp__disable_rest_api' => array( - 'type' => 'field', - 'title' => __('Disable WordPress REST API', 'security-malware-firewall'), - 'description' => __('Restrict access to WordPress REST API endpoints for non-authenticated users. Select the mode below.', 'security-malware-firewall'), - 'long_description' => true, - 'input_type' => 'radio', - 'options' => array( - array('val' => 0, 'label' => __('Off', 'security-malware-firewall'),), - array('val' => 1, 'label' => __('Disable endpoint "users"', 'security-malware-firewall'), 'default'), - array('val' => 2, 'label' => __('Disable all endpoints', 'security-malware-firewall'),), - ), - ), - 'data__set_cookies' => array( - 'type' => 'field', - 'title' => __("Set cookies", 'security-malware-firewall'), - 'description' => __('Turn this option off or use the alternative mechanism for cookies to forbid the plugin generate any cookies on the website\'s front-end.', 'security-malware-firewall') - . '
' . __('Alternative mechanism will store data in the website database and will not set cookies in browsers, so any cache solution will work just fine.', 'security-malware-firewall'), - 'input_type' => 'radio', - 'options' => array( - array( - 'val' => 1, - 'label' => __('On', 'security-malware-firewall'), - 'children_enable' => 1, - ), - array( - 'val' => 0, - 'label' => __('Off', 'security-malware-firewall'), - 'children_enable' => 0, - ), - array( - 'val' => 2, - 'label' => __('Alternative mechanism', 'security-malware-firewall'), - 'children_enable' => 1, - ), - ), - ), - 'misc__forbid_to_show_in_iframes' => array( - 'type' => 'field', - 'title' => __('Forbid to show your website in iFrame tags on third-party websites', 'security-malware-firewall'), - 'description' => __('If this option is enabled, third-party websites can\'t show content of your website in IFrames.', 'security-malware-firewall'), - ), - 'data__additional_headers' => array( - 'display' => is_main_site(), - 'type' => 'field', - 'title' => __('Send additional HTTP headers', 'security-malware-firewall'), - 'description' => __('Add these headers to the HTTP responses on the public pages: X-Content-Type-Options, X-XSS-Protection to get protection from XSS and drive-by download attacks.', 'security-malware-firewall'), - 'long_description' => true, - ), - 'wp__upload_dir_prevent_php_execution' => array( - 'display' => is_main_site(), - 'type' => 'field', - 'title' => __('Disable PHP execution in uploads folder', 'security-malware-firewall'), - 'description' => \CleantalkSP\SpbctWP\UploadDirPreventPhpExecutionModule\UploadDirPreventPhpExecution::getDescription( - isset($spbc->data['upload_dir_prevent_php_execution_status']) ? $spbc->data['upload_dir_prevent_php_execution_status'] : null - ), - ), - 'wp__use_builtin_http_api' => array( - 'display' => is_main_site(), - 'type' => 'field', - 'title' => __('Use WordPress HTTP API', 'security-malware-firewall'), - 'description' => __('Alternative way of connection to the ' . $spbc->data["wl_company_name"] . ' Cloud. Enable it if you have connection issues.', 'security-malware-firewall'), - ), - 'misc_disable_file_editor' => array( - 'disabled' => is_multisite() && !is_network_admin(), - 'ms_disabled_text' => __('This setting is controlled by the network administrator.', 'security-malware-firewall'), - 'type' => 'field', - 'input_type' => 'radio', - 'options' => array( - array( - 'val' => 0, - 'label' => __('Off', 'security-malware-firewall'), - 'children_enable' => 1, - ), - array( - 'val' => 1, - 'label' => __('On', 'security-malware-firewall'), - 'children_enable' => 0, - ), - array( - 'val' => 2, - 'label' => __('Auto', 'security-malware-firewall'), - 'children_enable' => 1, - ), - ), - 'title' => __('Disable File Editor', 'security-malware-firewall'), - 'long_description' => true, - ), - 'misc__complete_deactivation' => array( - 'display' => is_main_site(), - 'type' => 'field', - 'title' => __('Complete deactivation', 'security-malware-firewall'), - 'description' => - sprintf( - __( - 'The plugin will leave no traces in WordPress after deactivation. It could help if you have problems with the plugin. All files backed up by Malware scanner will be removed from %s directory.', - 'security-malware-firewall' - ), - SPBC_PLUGIN_DIR . 'backups' . DIRECTORY_SEPARATOR - ) - ), - 'action_adjust' => array( - 'type' => 'field', - 'callback' => 'spbc_settings_field__action_adjust', - ), - 'monitoring__users' => array( - 'type' => 'field', - 'input_type' => 'hidden', - ), - ), - ), - // Trust text, affiliate settings - 'spbc_trusted_and_affiliate' => array( - 'type' => 'section', - 'display' => !$spbc->data["wl_mode_enabled"], - 'title' => __('Trust text, affiliate settings', 'security-malware-firewall'), - //'section' => 'hidden_section', - 'anchor' => 'spbc_trusted_and_affiliate', - 'fields' => array( - 'spbc_trusted_and_affiliate__shortcode' => array( - 'title' => __('Shortcode', 'security-malware-firewall'), - 'description' => __( - 'You can place this shortcode anywhere on your website. Adds trust text stating that the website is protected from malware by ' . $spbc->data["wl_brandname"] . ' protection', - 'security-malware-firewall' - ), - 'type' => 'field', - 'children' => array ('spbc_trusted_and_affiliate__shortcode_tag') - ), - 'spbc_trusted_and_affiliate__shortcode_tag' => array( - 'type' => 'field', - 'input_type' => 'text', - 'title' => __('<- Copy this text and place shortcode wherever you need.', 'security-malware-firewall'), - 'parent' => 'spbc_trusted_and_affiliate__shortcode', - 'class' => 'spbc_affiliate_shortcode', - 'disabled' => false, - ), - 'spbc_trusted_and_affiliate__footer' => array( - 'title' => __('Add to the footer', 'security-malware-firewall'), - 'description' => __( - 'Adds trust text stating that the website is protected from malware by ' . $spbc->data["wl_brandname"] . ' protection to the footer of your website.', - 'security-malware-firewall' - ), - 'type' => 'field' - ), - 'spbc_trusted_and_affiliate__add_id' => array( - 'title' => __( - 'Append your affiliate ID', - 'security-malware-firewall' - ), - 'description' => __( - 'Enable this option to append your specific affiliate ID to the trust text created by the options above ("Shortcode" or "Add to the footer"). Terms and your affiliate ID of the {CT_AFFILIATE_TERMS}.', - 'security-malware-firewall' - ), - 'type' => 'field' - ) - ), - ), - ), + 'sections' => array(), ), // Summary 'summary' => array( @@ -563,6 +271,10 @@ function spbc_settings__register() 'type' => 'field', 'callback' => 'spbc_field_debug' ), + 'debug_user_pass_check' => array( + 'type' => 'field', + 'callback' => 'spbc_field_debug_user_pass_check' + ), ), ), ), @@ -758,19 +470,13 @@ function spbc_settings__draw_elements($elems_to_draw = null, $direct_call = fals $hide_settings = '--hide'; } $section_class = 'spbc_tab_fields_group--' . $elem_name; - // A temporary solution until the entire settings group is switched to React - $is_react_managed = !empty($elem['react_managed']); $fields = isset($elem['fields']) ? $elem['fields'] : array(); - if ($is_react_managed && empty($fields)) { - break; - } echo '
'; - if (!$is_react_managed) { - echo '
' - . (! empty($elem['title']) ? '

' . $elem['title'] . '

' : '') - . (! empty($elem['description']) ? '
' . $elem['description'] . '
' : '') - . '
'; - } + + echo '
' + . (! empty($elem['title']) ? '

' . $elem['title'] . '

' : '') + . (! empty($elem['description']) ? '
' . $elem['description'] . '
' : '') + . '
'; spbc_settings__draw_elements($fields, true); echo '
'; break; @@ -828,57 +534,6 @@ function spbct_settings__the_settings_tab_draw($elem) echo $settings_content; } -/** - * Construct HTML for quick navigation bar for settings tab. - * @param array $elem - settings array element - * @return string - */ -function spbc_settings__get_quick_navbar_html($elem) -{ - global $spbc; - - $nav_link_template = '%s'; - $nav_bar_template = ' - '; - $nav_elements = isset($elem['sections']) && is_array($elem['sections']) ? array_keys($elem['sections']) : array(); - $nav_links_html = ''; - foreach ($nav_elements as $_index => $nav_element) { - //skip banner section from links list - if ($nav_element === 'section_top_banner') { - continue; - } - //Skip the rendering of the menu block if the White Label mod is enabled - if ($nav_element === 'spbc_trusted_and_affiliate' && $spbc->data["wl_mode_enabled"]) { - continue; - } - // get title from section or use section name - $title = isset($elem['sections'][$nav_element]['title']) - ? $elem['sections'][$nav_element]['title'] - : $nav_element; - // get anchor from section or use # - $anchor = isset($elem['sections'][$nav_element]['anchor']) - ? $elem['sections'][$nav_element]['anchor'] - : '#'; - // add a link to navbar - $nav_links_html .= sprintf( - $nav_link_template, - $anchor, - $nav_element, - $title - ); - } - - return sprintf( - $nav_bar_template, - __('Settings navigation', 'security-malware-firewall'), - $nav_links_html - ); -} - /** * @param $field * @@ -888,11 +543,6 @@ function spbc_settings__field__draw($field) { global $spbc; - if ( $field['name'] === 'spbc_trusted_and_affiliate__add_id' ) { - $href = '' . __($spbc->data["wl_company_name"] . ' Affiliate Program are here', 'security-malware-firewall') . ''; - $field['description'] = str_replace('{CT_AFFILIATE_TERMS}', $href, $field['description']); - } - echo '
'; try { @@ -1134,7 +784,7 @@ function spbc_field_options_overview_traffic_light() 'title' => __('Authentication and Logging In', 'security-malware-firewall'), 'anchor' => 'auth', 'features' => array( - array('label' => __('Brute Force Protection', 'security-malware-firewall'), 'enabled' => true, 'anchor' => 'auth'), + array('label' => __('Brute Force Protection', 'security-malware-firewall'), 'enabled' => ! empty($spbc->settings['bfp__enabled']), 'anchor' => 'auth'), array('label' => __('Two-factor authentication (2FA)', 'security-malware-firewall'), 'enabled' => ! empty($spbc->settings['2fa__enable']), 'anchor' => 'auth'), array('label' => __('Checking the user\'s password for information leaks', 'security-malware-firewall'), 'enabled' => ! empty($spbc->settings['check_pass__enable']), 'anchor' => 'auth'), array('label' => __('Change address to login script', 'security-malware-firewall'), 'enabled' => ! empty($spbc->settings['login_page_rename__enabled']), 'anchor' => 'auth'), @@ -1174,192 +824,6 @@ function spbc_field_options_overview_traffic_light() return $groups; } -/** - * Admin callback function - Displays field of Api Key - * @ToDo unused code? - */ -function spbc_field_key() -{ - global $spbc; - - echo "
"; - - if ( - is_main_site() || - $spbc->ms__work_mode == 3 || - ($spbc->ms__work_mode == 1 && is_super_admin()) - ) { - // Key is OK - if ($spbc->key_is_ok) { - echo ''; - - // Show account name associated with key - $url_company = $spbc->default_data['wl_url']; - if ($spbc->data["wl_mode_enabled"]) { - $url_company = $spbc->data["wl_url"]; - } - $url_company = str_replace(array('http://','https://', '/'), "", $url_company); - if ( ! empty($spbc->data['account_name_ob'])) { - echo '
' - . sprintf( - __('Account at ' . $url_company . ' is %s.', 'security-malware-firewall'), - '' . $spbc->data['account_name_ob'] . '' - ) - . '
'; - } - echo '' . __('Show Access Key', 'security-malware-firewall') . ''; - - $additional_links = apply_filters( - 'spct_key_additional_links', - array() - ); - if (count($additional_links) > 0) { - echo '    '; - foreach ($additional_links as $link) { - echo $link . '    '; - } - } - // Key is not OK - } else { - echo ''; - echo '

'; - $link = LinkConstructor::buildCleanTalkLink( - 'settings__get_access_key_button', - 'wordpress-security-plugin', - array( - 'platform' => 'wordpress', - 'email' => spbc_get_admin_email(), - 'website' => urlencode(parse_url(get_option('home'), PHP_URL_HOST)), - 'product_name' => 'security' - ) - ); - echo ' - - '; - echo ' ' . __('or', 'security-malware-firewall') . ' '; - echo ''; - echo '

'; - - // admin email - printf( - __( - 'Admin e-mail %s %s will be used for registration.', - 'security-malware-firewall' - ), - '' - . spbc_get_admin_email() - . '', - is_main_site() ? spbc_settings__btn_change_account_email_html() : '' - ); - - echo '
'; - echo ''; - echo '"; - echo '
'; - - echo ''; - } - } else { - echo '

' . __('Access key is provided by network administrator.', 'security-malware-firewall') . '

'; - } - - echo '
'; -} - -/** - * Show button for changed account email - */ -function spbc_settings__btn_change_account_email_html() -{ - return '()'; -} - -function spbc_field_service_utilization() -{ - global $spbc; - - echo '
'; - - if ($spbc->services_count && $spbc->services_max && $spbc->services_utilization) { - echo sprintf( - __('Hoster account utilization: %s%% ( %s of %s websites ).', 'security-malware-firewall'), - $spbc->services_utilization * 100, - $spbc->services_count, - $spbc->services_max - ); - - // Link to the dashboard, so user could extend your subscription for more sites - if ($spbc->services_utilization * 100 >= 90) { - echo ' '; - echo sprintf( - __('You could extend your subscription %shere%s.', 'security-malware-firewall'), - 'data["wl_support_url"] : $spbc->dashboard_link . '" target="_blank">', - '' - ); - } - } else { - _e('Enter the Hoster access key and synchronize with cloud to find out your hoster account utilization.', 'security-malware-firewall'); - } - - echo '
'; -} - -function spbc_field_bfp__heading() -{ - global $spbc; - - $description_pattern = 'If someone fails %s authorizations in a row within %s minutes, plugin blocks the visitor for %s ' - . 'by placing a record with "Blocked by BruteForce protection system" status to FireWall.'; - - $description = sprintf( - __($description_pattern, 'security-malware-firewall'), - $spbc->settings['bfp__allowed_wrong_auths'], - $spbc->settings['bfp__count_interval'] / 60, - spbc_seconds_to_human_time((int)$spbc->settings['bfp__block_period__5_fails']) - ); - - $out = '
'; - $out .= '
'; - $out .= __('Brute Force Protection options', 'security-malware-firewall'); - $out .= '
'; // close class="spbc_settings-field_title" - $out .= '
'; - $out .= $description; - $out .= '
'; // close class="spbc_settings_description" - $out .= '
'; // close class="spbc_wrapper_field" - - echo $out; -} - function spbc_field_security_logs__prepare_data(&$table) { if ($table->items_count) { @@ -1731,6 +1195,22 @@ function spbc_field_scanner__prepare_data__files(&$table) unset($row->actions['cure']); } + // wp-config.php: detect only; content view for Super Admin only; never send to cloud + if ( Scanner\Helper::isWpConfigPath($row->path) ) { + unset($row->actions['cure']); + unset($row->actions['delete']); + unset($row->actions['quarantine']); + unset($row->actions['replace']); + unset($row->actions['send']); + if ( ! Scanner\Helper::canViewWpConfigContents() ) { + unset($row->actions['view']); + unset($row->actions['view_bad']); + } + if ( ! empty($row->weak_spots) || (isset($row->severity) && $row->severity === 'CRITICAL') ) { + $status = '' . esc_html(Scanner\Helper::getWpConfigManualCleanupMessage()) . ''; + } + } + $table->items[] = array( 'cb' => $row->fast_hash, 'uid' => $row->fast_hash, @@ -3527,6 +3007,47 @@ function spbc_field_debug_drop() . '
'; } +add_action('wp_ajax_spbc_debug_users_pass_check_run', 'spbc_debug_users_pass_check_run'); +function spbc_debug_users_pass_check_run() +{ + spbc_check_ajax_referer('spbc_secret_nonce', 'security'); + + global $wpdb; + + // Reset all records so the worker processes them fresh + $wpdb->query("UPDATE {$wpdb->base_prefix}spbc_users_pass SET checked = 0"); + + // Run the worker directly (synchronous, no cron delay) + \CleantalkSP\SpbctWP\UsersPassCheckModule\UsersPassCheckCron::worker(); + + // Collect stats after the run + $total = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->base_prefix}spbc_users_pass"); + $checked = (int) $wpdb->get_var("SELECT COALESCE(SUM(checked), 0) FROM {$wpdb->base_prefix}spbc_users_pass"); + $leaked = (int) $wpdb->get_var("SELECT COALESCE(SUM(leaked), 0) FROM {$wpdb->base_prefix}spbc_users_pass"); + + if ($total > 0 && $checked === 0) { + wp_send_json_error('pwnedpasswords.com API unavailable or no pass hashes in table'); + return; + } + + wp_send_json_success(array( + 'total' => $total, + 'checked' => $checked, + 'leaked' => $leaked, + )); +} + +function spbc_field_debug_user_pass_check() +{ + ?> +
+
+ +   +
+ ' @@ -3885,6 +3406,16 @@ function spbc_sanitize_settings($settings) return $settings; } +/** + * Whether the current AJAX request comes from the React signup wizard. + * + * @return bool + */ +function spbc_settings__is_wizard_ajax_request() +{ + return Post::getInt('spbct_wizard_request') === 1; +} + //Get auto key button function spbc_get_key_auto($direct_call = false) { @@ -3913,6 +3444,9 @@ function spbc_get_key_auto($direct_call = false) $filtered_admin_email = apply_filters('spbc_get_api_key_email', $admin_email); $filtered_admin_email = filter_var($filtered_admin_email, FILTER_VALIDATE_EMAIL); + // Mark the registrations made by the Connect button of the setup wizard + $lead_source = spbc_settings__is_wizard_ajax_request() ? 'spbct_wizard_auto' : ''; + $result = API::method__get_api_key( 'security', $filtered_admin_email, @@ -3923,7 +3457,8 @@ function spbc_get_key_auto($direct_call = false) $user_ip, $wpms, $white_label, - $hoster_api_key + $hoster_api_key, + $lead_source ); if ( ! empty($result['error'])) { @@ -4906,14 +4441,6 @@ function spbc_cdn_checker__run_check_on_settings_change($settings) } } -/** - * @return void - */ -function spbc_settings_field__action_adjust() -{ - echo AdjustToEnvironmentSettings::render(); -} - function spbc_settings_field__secfw__get_ip__get_labels() { $options = array(); diff --git a/js/public/spbct-react-bundle.js b/js/public/spbct-react-bundle.js index c0494c3fb..bbf211c4e 100644 --- a/js/public/spbct-react-bundle.js +++ b/js/public/spbct-react-bundle.js @@ -26,7 +26,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\": () => (__WEBPACK_DEFAULT_EXPORT__)\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/Button/styles.css\");\n/* harmony import */ var _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../assets/preloader2.gif */ \"./js/src/react/assets/preloader2.gif\");\n/* harmony import */ var _assets_yes_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../assets/yes.png */ \"./js/src/react/assets/yes.png\");\n/* harmony import */ var _assets_fail_png__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../assets/fail.png */ \"./js/src/react/assets/fail.png\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useSync */ \"./js/src/react/hooks/useSync.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); }); }; }\n\n\n\n\n\n\nvar Button = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(function Button(_ref, ref) {\n var children = _ref.children,\n buttonText = _ref.buttonText,\n _ref$type = _ref.type,\n type = _ref$type === void 0 ? 'button' : _ref$type,\n url = _ref.url,\n lastSyncTitle = _ref.lastSyncTitle;\n var handleClick = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {\n var buttonComponent, preloader, buttonTextContainer, status;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n buttonComponent = e.currentTarget;\n preloader = buttonComponent.querySelector('.spbc_preloader_button');\n buttonTextContainer = buttonComponent.querySelector('#spbc_button__sync_regular');\n visibilityOn(preloader);\n buttonComponent.disabled = true;\n _context.n = 1;\n return (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_5__.runSync)(function (msg) {\n buttonTextContainer.innerText = msg;\n }, function (completeStatus) {\n if (completeStatus && completeStatus.reload) {\n window.location.reload();\n }\n });\n case 1:\n status = _context.v;\n visibilityOff(preloader);\n buttonComponent.disabled = false;\n if (status && status.success) {\n buttonTextContainer.innerText = 'Synchronized successfully';\n visibilityOn(getIcon(buttonComponent, true));\n } else {\n buttonTextContainer.innerText = status && status.message ? status.message : 'Sync failed';\n visibilityOn(getIcon(buttonComponent, false));\n }\n setTimeout(function () {\n buttonTextContainer.innerText = buttonText;\n visibilityOff(getIcon(buttonComponent, true));\n visibilityOff(getIcon(buttonComponent, false));\n }, 5000);\n case 2:\n return _context.a(2);\n }\n }, _callee);\n }));\n return function handleClick(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var visibilityOn = function visibilityOn(elem) {\n elem.style.display = 'block';\n };\n var visibilityOff = function visibilityOff(elem) {\n elem.style.display = 'none';\n };\n var getIcon = function getIcon(buttonComponent, ajaxSuccess) {\n var succesIcon = buttonComponent.querySelector('#button-icon-success');\n var failIcon = buttonComponent.querySelector('#button-icon-fail');\n return +ajaxSuccess ? succesIcon : failIcon;\n };\n if (type === 'button') {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"spbc_manual_link spbc_page_buttons_links_basic_align\",\n onClick: handleClick,\n id: \"spbc_button__sync\",\n ref: ref,\n title: lastSyncTitle\n }, children, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n id: \"spbc_button__sync_regular\"\n }, buttonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px',\n marginTop: '1px'\n },\n className: \"spbc_preloader_button\",\n src: _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n alt: 'Preloader Ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px'\n },\n id: \"button-icon-success\",\n className: \"spbc_success --hide\",\n src: _assets_yes_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n alt: 'Yes Ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px'\n },\n id: \"button-icon-fail\",\n className: \"spbc_success --hide\",\n src: _assets_fail_png__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n alt: 'Fail Ico'\n })));\n } else {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: url,\n className: \"spbc_manual_link spbc_page_buttons_links_basic_align\",\n target: \"_blank\",\n rel: \"noreferrer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_page_buttons_links_basic_align\"\n }, \" \", children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, buttonText)));\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Button);\n\n//# sourceURL=webpack:///./js/src/react/components/Button/Button.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\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/Button/styles.css\");\n/* harmony import */ var _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../assets/preloader2.gif */ \"./js/src/react/assets/preloader2.gif\");\n/* harmony import */ var _assets_yes_png__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../assets/yes.png */ \"./js/src/react/assets/yes.png\");\n/* harmony import */ var _assets_fail_png__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../assets/fail.png */ \"./js/src/react/assets/fail.png\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useSync */ \"./js/src/react/hooks/useSync.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); }); }; }\n;\n\n\n\n\n\nvar Button = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.forwardRef)(function Button(_ref, ref) {\n var children = _ref.children,\n buttonText = _ref.buttonText,\n _ref$type = _ref.type,\n type = _ref$type === void 0 ? 'button' : _ref$type,\n url = _ref.url,\n lastSyncTitle = _ref.lastSyncTitle;\n var handleClick = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(e) {\n var buttonComponent, preloader, buttonTextContainer, status;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n buttonComponent = e.currentTarget;\n preloader = buttonComponent.querySelector('.spbc_preloader_button');\n buttonTextContainer = buttonComponent.querySelector('#spbc_button__sync_regular');\n visibilityOn(preloader);\n buttonComponent.disabled = true;\n _context.n = 1;\n return (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_5__.runSync)(function (msg) {\n buttonTextContainer.innerText = msg;\n }, function (completeStatus) {\n if (completeStatus && completeStatus.reload) {\n window.location.reload();\n }\n });\n case 1:\n status = _context.v;\n visibilityOff(preloader);\n buttonComponent.disabled = false;\n if (status && status.success) {\n buttonTextContainer.innerText = 'Synchronized successfully';\n visibilityOn(getIcon(buttonComponent, true));\n } else {\n buttonTextContainer.innerText = status && status.message ? status.message : 'Sync failed';\n visibilityOn(getIcon(buttonComponent, false));\n }\n setTimeout(function () {\n buttonTextContainer.innerText = buttonText;\n visibilityOff(getIcon(buttonComponent, true));\n visibilityOff(getIcon(buttonComponent, false));\n }, 5000);\n case 2:\n return _context.a(2);\n }\n }, _callee);\n }));\n return function handleClick(_x) {\n return _ref2.apply(this, arguments);\n };\n }();\n var visibilityOn = function visibilityOn(elem) {\n elem.style.display = 'block';\n };\n var visibilityOff = function visibilityOff(elem) {\n elem.style.display = 'none';\n };\n var getIcon = function getIcon(buttonComponent, ajaxSuccess) {\n var succesIcon = buttonComponent.querySelector('#button-icon-success');\n var failIcon = buttonComponent.querySelector('#button-icon-fail');\n return +ajaxSuccess ? succesIcon : failIcon;\n };\n if (type === 'button') {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"spbc_manual_link spbc_page_buttons_links_basic_align\",\n onClick: handleClick,\n id: \"spbc_button__sync\",\n ref: ref,\n title: lastSyncTitle\n }, children, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n id: \"spbc_button__sync_regular\"\n }, buttonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px',\n marginTop: '1px'\n },\n className: \"spbc_preloader_button\",\n src: _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n alt: 'Preloader Ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px'\n },\n id: \"button-icon-success\",\n className: \"spbc_success --hide\",\n src: _assets_yes_png__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n alt: 'Yes Ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: {\n marginLeft: '10px'\n },\n id: \"button-icon-fail\",\n className: \"spbc_success --hide\",\n src: _assets_fail_png__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n alt: 'Fail Ico'\n })));\n } else {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: url,\n className: \"spbc_manual_link spbc_page_buttons_links_basic_align\",\n target: \"_blank\",\n rel: \"noreferrer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_page_buttons_links_basic_align\"\n }, \" \", children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, buttonText)));\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Button);\n\n//# sourceURL=webpack:///./js/src/react/components/Button/Button.js?\n}"); /***/ }, @@ -56,7 +56,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 */ InputRadioGroup)\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__);\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 * InputRadioGroup component\n * @param {string} id - Base ID for radio inputs\n * @param {string} name - Name attribute for all radio inputs\n * @param {string|number} value - Currently selected value\n * @param {Array} options - Array of options: [{value: '1', label: 'On'}, {value: '0', label: 'Off'}]\n * @param {function} onChange - Callback when selection changes\n * @param {string} className - Additional CSS class for each radio option wrapper\n * @param {boolean} disabled - Disable all radio inputs\n * @param {JSX.Element} separator - Separator element between radio options\n * @return {JSX.Element} Radio button group\n */\nfunction InputRadioGroup(_ref) {\n var id = _ref.id,\n name = _ref.name,\n initialValue = _ref.value,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? [] : _ref$options,\n onChange = _ref.onChange,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? 'spbc_radio_option' : _ref$className,\n _ref$disabled = _ref.disabled,\n disabled = _ref$disabled === void 0 ? false : _ref$disabled,\n _ref$separator = _ref.separator,\n separator = _ref$separator === void 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\\xA0\\xA0\\xA0\") : _ref$separator;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(String(initialValue !== null && initialValue !== void 0 ? initialValue : '')),\n _useState2 = _slicedToArray(_useState, 2),\n selectedValue = _useState2[0],\n setSelectedValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setSelectedValue(String(initialValue !== null && initialValue !== void 0 ? initialValue : ''));\n }, [initialValue]);\n var handleChange = function handleChange(event) {\n var newValue = event.target.value;\n setSelectedValue(newValue);\n if (onChange) {\n onChange(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, options.map(function (option, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: \"\".concat(id, \"-\").concat(option.value)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: className\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"radio\",\n id: \"\".concat(id, \"_\").concat(option.value),\n name: name,\n value: option.value,\n checked: selectedValue === String(option.value),\n onChange: handleChange,\n disabled: disabled || option.disabled,\n className: \"spbc_setting_field\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, option.label))), index < options.length - 1 && separator);\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/InputRadioGroup.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputRadioGroup)\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__);\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 * InputRadioGroup component\n * @param {string} id - Base ID for radio inputs\n * @param {string} name - Name attribute for all radio inputs\n * @param {string|number} value - Currently selected value\n * @param {Array} options - Array of options: [{value: '1', label: 'On'}, {value: '0', label: 'Off'}]\n * @param {function} onChange - Callback when selection changes\n * @param {string} className - Additional CSS class for each radio option wrapper\n * @param {boolean} disabled - Disable all radio inputs\n * @param {JSX.Element} separator - Separator element between radio options\n * @return {JSX.Element} Radio button group\n */\nfunction InputRadioGroup(_ref) {\n var id = _ref.id,\n name = _ref.name,\n initialValue = _ref.value,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? [] : _ref$options,\n onChange = _ref.onChange,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? 'spbc_radio_option' : _ref$className,\n _ref$disabled = _ref.disabled,\n disabled = _ref$disabled === void 0 ? false : _ref$disabled,\n _ref$separator = _ref.separator,\n separator = _ref$separator === void 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, \"\\xA0\\xA0\\xA0\\xA0\\xA0\") : _ref$separator;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(String(initialValue !== null && initialValue !== void 0 ? initialValue : '')),\n _useState2 = _slicedToArray(_useState, 2),\n selectedValue = _useState2[0],\n setSelectedValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setSelectedValue(String(initialValue !== null && initialValue !== void 0 ? initialValue : ''));\n }, [initialValue]);\n var handleChange = function handleChange(event) {\n var newValue = event.target.value;\n setSelectedValue(newValue);\n if (onChange) {\n onChange(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, options.map(function (option, index) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n key: \"\".concat(id, \"-\").concat(option.value)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: className\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"radio\",\n id: \"\".concat(id, \"_\").concat(option.value),\n name: name,\n value: option.value,\n checked: selectedValue === String(option.value),\n onChange: handleChange,\n disabled: disabled || option.disabled,\n className: \"spbc_setting_field\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, option.label))), index < options.length - 1 && separator);\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/InputRadioGroup.js?\n}"); /***/ }, @@ -66,7 +66,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 */ InputText)\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__);\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\nfunction InputText(props) {\n var id = props.id,\n name = props.name,\n _props$value = props.value,\n initialValue = _props$value === void 0 ? '' : _props$value,\n placeholder = props.placeholder,\n onChange = props.onChange,\n style = props.style;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialValue),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n var sanitize = function sanitize(str) {\n if (typeof str !== 'string') return str;\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''').replace(/\\//g, '/');\n };\n var handleChange = function handleChange(e) {\n var newValue = e.target.value;\n setInputValue(newValue);\n // Call `onChange` from props, if exists\n if (onChange) {\n onChange(e);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: sanitize(id),\n name: sanitize(name),\n value: inputValue,\n placeholder: sanitize(placeholder) || '',\n style: style || {},\n onChange: handleChange\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/InputText.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ InputText)\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__);\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;\nfunction InputText(props) {\n var id = props.id,\n name = props.name,\n _props$value = props.value,\n initialValue = _props$value === void 0 ? '' : _props$value,\n placeholder = props.placeholder,\n onChange = props.onChange,\n style = props.style;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialValue),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n var sanitize = function sanitize(str) {\n if (typeof str !== 'string') return str;\n return str.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''').replace(/\\//g, '/');\n };\n var handleChange = function handleChange(e) {\n var newValue = e.target.value;\n setInputValue(newValue);\n // Call `onChange` from props, if exists\n if (onChange) {\n onChange(e);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: sanitize(id),\n name: sanitize(name),\n value: inputValue,\n placeholder: sanitize(placeholder) || '',\n style: style || {},\n onChange: handleChange\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/InputText.js?\n}"); /***/ }, @@ -76,7 +76,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 */ Select)\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__);\nvar _excluded = [\"id\", \"name\", \"value\", \"options\", \"onChange\", \"className\", \"disabled\", \"placeholder\", \"multiple\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\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; }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n\nfunction Select(_ref) {\n var id = _ref.id,\n name = _ref.name,\n initialValue = _ref.value,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? [] : _ref$options,\n onChange = _ref.onChange,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? '' : _ref$className,\n _ref$disabled = _ref.disabled,\n disabled = _ref$disabled === void 0 ? false : _ref$disabled,\n _ref$placeholder = _ref.placeholder,\n placeholder = _ref$placeholder === void 0 ? '' : _ref$placeholder,\n _ref$multiple = _ref.multiple,\n multiple = _ref$multiple === void 0 ? false : _ref$multiple,\n props = _objectWithoutProperties(_ref, _excluded);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialValue !== undefined ? initialValue : multiple ? [] : ''),\n _useState2 = _slicedToArray(_useState, 2),\n selectedValue = _useState2[0],\n setSelectedValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (initialValue !== undefined) {\n setSelectedValue(initialValue);\n }\n }, [initialValue, multiple]);\n var handleChange = function handleChange(event) {\n var newValue = multiple ? Array.from(event.target.selectedOptions, function (option) {\n return option.value;\n }) : event.target.value;\n setSelectedValue(newValue);\n\n // Call `onChange` from props, if exists\n if (onChange) {\n onChange(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", _extends({\n id: id,\n name: name,\n value: selectedValue,\n onChange: handleChange,\n className: className,\n disabled: disabled,\n multiple: multiple\n }, props), placeholder && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\",\n disabled: true\n }, placeholder), options.map(function (option) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", _extends({\n key: option.value,\n value: option.value,\n disabled: option.disabled\n }, option.dataAttributes), option.label);\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/Select.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Select)\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__);\nvar _excluded = [\"id\", \"name\", \"value\", \"options\", \"onChange\", \"className\", \"disabled\", \"placeholder\", \"multiple\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\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; }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n;\nfunction Select(_ref) {\n var id = _ref.id,\n name = _ref.name,\n initialValue = _ref.value,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? [] : _ref$options,\n onChange = _ref.onChange,\n _ref$className = _ref.className,\n className = _ref$className === void 0 ? '' : _ref$className,\n _ref$disabled = _ref.disabled,\n disabled = _ref$disabled === void 0 ? false : _ref$disabled,\n _ref$placeholder = _ref.placeholder,\n placeholder = _ref$placeholder === void 0 ? '' : _ref$placeholder,\n _ref$multiple = _ref.multiple,\n multiple = _ref$multiple === void 0 ? false : _ref$multiple,\n props = _objectWithoutProperties(_ref, _excluded);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialValue !== undefined ? initialValue : multiple ? [] : ''),\n _useState2 = _slicedToArray(_useState, 2),\n selectedValue = _useState2[0],\n setSelectedValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (initialValue !== undefined) {\n setSelectedValue(initialValue);\n }\n }, [initialValue, multiple]);\n var handleChange = function handleChange(event) {\n var newValue = multiple ? Array.from(event.target.selectedOptions, function (option) {\n return option.value;\n }) : event.target.value;\n setSelectedValue(newValue);\n\n // Call `onChange` from props, if exists\n if (onChange) {\n onChange(event);\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"select\", _extends({\n id: id,\n name: name,\n value: selectedValue,\n onChange: handleChange,\n className: className,\n disabled: disabled,\n multiple: multiple\n }, props), placeholder && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", {\n value: \"\",\n disabled: true\n }, placeholder), options.map(function (option) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"option\", _extends({\n key: option.value,\n value: option.value,\n disabled: option.disabled\n }, option.dataAttributes), option.label);\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/FormElements/Select.js?\n}"); /***/ }, @@ -116,7 +116,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 */ LongDescriptionIco)\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/LongDescriptionIco/styles.css\");\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\nfunction LongDescriptionIco(_ref) {\n var description = _ref.description;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n descriptionShow = _useState2[0],\n setDescriptionShow = _useState2[1];\n var showLongDescription = function showLongDescription() {\n setDescriptionShow(true);\n };\n var hideLongDescription = function hideLongDescription() {\n setDescriptionShow(false);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'long_description_wrapper'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc_long_description spbc-icon-help-circled\",\n onClick: showLongDescription\n }), descriptionShow && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_long_desc\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_long_desc__angle_top_left\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc_long_desc__cancel spbc-icon-cancel\",\n onClick: hideLongDescription\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, description))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/LongDescriptionIco/LongDescriptionIco.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ LongDescriptionIco)\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/LongDescriptionIco/styles.css\");\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\nfunction LongDescriptionIco(_ref) {\n var description = _ref.description;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n descriptionShow = _useState2[0],\n setDescriptionShow = _useState2[1];\n var showLongDescription = function showLongDescription() {\n setDescriptionShow(true);\n };\n var hideLongDescription = function hideLongDescription() {\n setDescriptionShow(false);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'long_description_wrapper'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc_long_description spbc-icon-help-circled\",\n onClick: showLongDescription\n }), descriptionShow && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_long_desc\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_long_desc__angle_top_left\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc_long_desc__cancel spbc-icon-cancel\",\n onClick: hideLongDescription\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, description))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/LongDescriptionIco/LongDescriptionIco.js?\n}"); /***/ }, @@ -146,7 +146,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 */ ReactFileViewDialog)\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__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n// components/ReactFileViewDialog/ReactFileViewDialog.jsx\n\nvar __ = wp.i18n.__;\nfunction ReactFileViewDialog(_ref) {\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n title = _ref.title,\n children = _ref.children,\n _ref$maxWidth = _ref.maxWidth,\n maxWidth = _ref$maxWidth === void 0 ? '80%' : _ref$maxWidth,\n _ref$maxHeight = _ref.maxHeight,\n maxHeight = _ref$maxHeight === void 0 ? '70vh' : _ref$maxHeight,\n _ref$overlayStyle = _ref.overlayStyle,\n overlayStyle = _ref$overlayStyle === void 0 ? {} : _ref$overlayStyle,\n _ref$contentStyle = _ref.contentStyle,\n contentStyle = _ref$contentStyle === void 0 ? {} : _ref$contentStyle;\n if (!isOpen) return null;\n var defaultOverlayStyle = _objectSpread({\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'flex-start',\n zIndex: 9990\n }, overlayStyle);\n var defaultContentStyle = _objectSpread({\n backgroundColor: 'white',\n padding: '20px',\n borderRadius: '5px',\n marginTop: '100px',\n maxWidth: maxWidth,\n maxHeight: maxHeight,\n overflow: 'auto',\n position: 'relative'\n }, contentStyle);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-dialog-overlay\",\n style: defaultOverlayStyle,\n onClick: onClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-dialog-content\",\n style: defaultContentStyle,\n onClick: function onClick(e) {\n return e.stopPropagation();\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '15px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n style: {\n background: 'none',\n border: 'none',\n fontSize: '18px',\n cursor: 'pointer'\n },\n \"aria-label\": __('Close', 'security-malware-firewall')\n }, \"\\xD7\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, children)));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ReactFileViewDialog)\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__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n// components/ReactFileViewDialog/ReactFileViewDialog.jsx\n;\nvar __ = wp.i18n.__;\nfunction ReactFileViewDialog(_ref) {\n var isOpen = _ref.isOpen,\n onClose = _ref.onClose,\n title = _ref.title,\n children = _ref.children,\n _ref$maxWidth = _ref.maxWidth,\n maxWidth = _ref$maxWidth === void 0 ? '80%' : _ref$maxWidth,\n _ref$maxHeight = _ref.maxHeight,\n maxHeight = _ref$maxHeight === void 0 ? '70vh' : _ref$maxHeight,\n _ref$overlayStyle = _ref.overlayStyle,\n overlayStyle = _ref$overlayStyle === void 0 ? {} : _ref$overlayStyle,\n _ref$contentStyle = _ref.contentStyle,\n contentStyle = _ref$contentStyle === void 0 ? {} : _ref$contentStyle;\n if (!isOpen) return null;\n var defaultOverlayStyle = _objectSpread({\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'flex-start',\n zIndex: 9990\n }, overlayStyle);\n var defaultContentStyle = _objectSpread({\n backgroundColor: 'white',\n padding: '20px',\n borderRadius: '5px',\n marginTop: '100px',\n maxWidth: maxWidth,\n maxHeight: maxHeight,\n overflow: 'auto',\n position: 'relative'\n }, contentStyle);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-dialog-overlay\",\n style: defaultOverlayStyle,\n onClick: onClose\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-dialog-content\",\n style: defaultContentStyle,\n onClick: function onClick(e) {\n return e.stopPropagation();\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '15px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n onClick: onClose,\n style: {\n background: 'none',\n border: 'none',\n fontSize: '18px',\n cursor: 'pointer'\n },\n \"aria-label\": __('Close', 'security-malware-firewall')\n }, \"\\xD7\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, children)));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js?\n}"); /***/ }, @@ -156,7 +156,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 */ SettingsOverview)\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/SettingsOverview/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\");\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\nvar __ = wp.i18n.__;\n\n\n\nfunction SettingsOverview(_ref) {\n var settings = _ref.settings;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n settingsOverviewFetched = _useState2[0],\n setSettingsOverviewFetched = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n settingsOverview = _useState4[0],\n setSettingsOverview = _useState4[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!settingsOverview) {\n // @ToDo use settings property instead of separate ajax-call\n fetchSettingsOverview();\n }\n }, []);\n var fetchSettingsOverview = /*#__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: 'spbct_settings_overview'\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 setSettingsOverview(data);\n setSettingsOverviewFetched(true);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching settings overview:', _t);\n setSettingsOverviewFetched(true);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchSettingsOverview() {\n return _ref2.apply(this, arguments);\n };\n }();\n if (!settingsOverviewFetched) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null);\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group spbc_tab_fields_group--options_overview\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\",\n id: \"options_overview\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, __('Feature Status', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-options-overview-traffic-light\"\n }, settingsOverview.map(function (group, groupIndex) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: groupIndex,\n className: \"spbc-options-overview-traffic-light__group\"\n }, group.anchor ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"spbc-options-overview-traffic-light__subheading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\".concat(group.anchor)\n }, group.title)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"spbc-options-overview-traffic-light__subheading\"\n }, group.title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-options-overview-traffic-light__grid\"\n }, group.features.map(function (feature, featureIndex) {\n var stateClass = feature.enabled ? 'spbc-options-overview-traffic-light__item--on' : 'spbc-options-overview-traffic-light__item--off';\n var stateText = feature.enabled ? 'On' : 'Off';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: featureIndex,\n className: \"spbc-options-overview-traffic-light__item \".concat(stateClass)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__indicator\",\n \"aria-hidden\": \"true\"\n }), feature.anchor ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__label\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\".concat(feature.anchor)\n }, feature.label)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__label\"\n }, feature.label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__state\"\n }, stateText));\n })));\n }))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SettingsOverview/SettingsOverview.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SettingsOverview)\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/SettingsOverview/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\");\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;\nvar __ = wp.i18n.__;\n\n\n\nfunction SettingsOverview(_ref) {\n var settings = _ref.settings;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n settingsOverviewFetched = _useState2[0],\n setSettingsOverviewFetched = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n settingsOverview = _useState4[0],\n setSettingsOverview = _useState4[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!settingsOverview) {\n // @ToDo use settings property instead of separate ajax-call\n fetchSettingsOverview();\n }\n }, []);\n var fetchSettingsOverview = /*#__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: 'spbct_settings_overview'\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 setSettingsOverview(data);\n setSettingsOverviewFetched(true);\n _context.n = 3;\n break;\n case 2:\n _context.p = 2;\n _t = _context.v;\n console.error('Error fetching settings overview:', _t);\n setSettingsOverviewFetched(true);\n case 3:\n return _context.a(2);\n }\n }, _callee, null, [[0, 2]]);\n }));\n return function fetchSettingsOverview() {\n return _ref2.apply(this, arguments);\n };\n }();\n if (!settingsOverviewFetched) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null);\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group spbc_tab_fields_group--options_overview\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\",\n id: \"options_overview\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, __('Feature Status', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-options-overview-traffic-light\"\n }, settingsOverview.map(function (group, groupIndex) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: groupIndex,\n className: \"spbc-options-overview-traffic-light__group\"\n }, group.anchor ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"spbc-options-overview-traffic-light__subheading\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\".concat(group.anchor)\n }, group.title)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n className: \"spbc-options-overview-traffic-light__subheading\"\n }, group.title), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-options-overview-traffic-light__grid\"\n }, group.features.map(function (feature, featureIndex) {\n var stateClass = feature.enabled ? 'spbc-options-overview-traffic-light__item--on' : 'spbc-options-overview-traffic-light__item--off';\n var stateText = feature.enabled ? 'On' : 'Off';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: featureIndex,\n className: \"spbc-options-overview-traffic-light__item \".concat(stateClass)\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__indicator\",\n \"aria-hidden\": \"true\"\n }), feature.anchor ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__label\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\".concat(feature.anchor)\n }, feature.label)) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__label\"\n }, feature.label), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-options-overview-traffic-light__state\"\n }, stateText));\n })));\n }))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SettingsOverview/SettingsOverview.js?\n}"); /***/ }, @@ -176,7 +176,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 */ AccessKeyInterface)\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__);\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\nvar __ = wp.i18n.__;\nfunction AccessKeyInterface(_ref) {\n var handleBackToSignup = _ref.handleBackToSignup,\n handleShowConnectingInterface = _ref.handleShowConnectingInterface,\n setError = _ref.setError;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(__('Connect to CleanTalk', 'security-malware-firewall')),\n _useState2 = _slicedToArray(_useState, 2),\n buttonText = _useState2[0],\n setButtonText = _useState2[1];\n var handleSaveKey = function handleSaveKey(e) {\n e.preventDefault();\n var formData = new FormData(e.target);\n var apiKey = formData.get('spbc_key');\n setButtonText(__('Please, wait...', 'security-malware-firewall'));\n spbcSendAJAXRequest({\n action: 'spbc_save_key',\n apiKey: apiKey\n }, {\n timeout: 25000,\n button: document.getElementById('spbct-signup-wizard-save-key-btn'),\n callback: function callback(result) {\n setButtonText(__('Connect to CleanTalk', 'security-malware-firewall'));\n if (result.success) {\n handleShowConnectingInterface();\n } else {\n setError(result.msg);\n }\n }\n });\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card existing-user\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n href: '#',\n onClick: handleBackToSignup\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n width: \"22\",\n height: \"22\",\n viewBox: \"0 0 22 22\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M17.4154 11H4.58203\",\n stroke: \"#444444\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M10.9987 17.4115L4.58203 10.9948L10.9987 4.57812\",\n stroke: \"#444444\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })), __('Go to previous step', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-inner'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connect your site to CleanTalk cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Copy the access key you have received via email or you can get it from ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: 'https://cleantalk.org/my/?cp_mode=security',\n target: '_blank',\n rel: \"noreferrer\",\n style: {\n display: 'inline'\n }\n }, __('Cloud Dashboard', 'security-malware-firewall')), '. ', __('If your account has multiple domains select the one you want to use.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSaveKey\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'text',\n name: 'spbc_key',\n required: true,\n placeholder: __('Access key', 'security-malware-firewall')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: 'submit',\n name: 'submit',\n id: 'spbct-signup-wizard-save-key-btn'\n }, buttonText))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/AccessKeyInterface.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ AccessKeyInterface)\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__);\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;\nvar __ = wp.i18n.__;\nfunction AccessKeyInterface(_ref) {\n var handleBackToSignup = _ref.handleBackToSignup,\n handleShowConnectingInterface = _ref.handleShowConnectingInterface,\n setError = _ref.setError;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(__('Connect to CleanTalk', 'security-malware-firewall')),\n _useState2 = _slicedToArray(_useState, 2),\n buttonText = _useState2[0],\n setButtonText = _useState2[1];\n var handleSaveKey = function handleSaveKey(e) {\n e.preventDefault();\n var formData = new FormData(e.target);\n var apiKey = formData.get('spbc_key');\n setButtonText(__('Please, wait...', 'security-malware-firewall'));\n spbcSendAJAXRequest({\n action: 'spbc_save_key',\n apiKey: apiKey\n }, {\n timeout: 25000,\n button: document.getElementById('spbct-signup-wizard-save-key-btn'),\n callback: function callback(result) {\n setButtonText(__('Connect to CleanTalk', 'security-malware-firewall'));\n if (result.success) {\n handleShowConnectingInterface();\n } else {\n setError(result.msg);\n }\n }\n });\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card existing-user\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n href: '#',\n onClick: handleBackToSignup\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"svg\", {\n width: \"22\",\n height: \"22\",\n viewBox: \"0 0 22 22\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M17.4154 11H4.58203\",\n stroke: \"#444444\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"path\", {\n d: \"M10.9987 17.4115L4.58203 10.9948L10.9987 4.57812\",\n stroke: \"#444444\",\n strokeWidth: \"1.5\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n })), __('Go to previous step', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-inner'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connect your site to CleanTalk cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Copy the access key you have received via email or you can get it from ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: 'https://cleantalk.org/my/?cp_mode=security',\n target: '_blank',\n rel: \"noreferrer\",\n style: {\n display: 'inline'\n }\n }, __('Cloud Dashboard', 'security-malware-firewall')), '. ', __('If your account has multiple domains select the one you want to use.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSaveKey\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'text',\n name: 'spbc_key',\n required: true,\n placeholder: __('Access key', 'security-malware-firewall')\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: 'submit',\n name: 'submit',\n id: 'spbct-signup-wizard-save-key-btn'\n }, buttonText))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/AccessKeyInterface.js?\n}"); /***/ }, @@ -196,7 +196,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 */ ConnectingInterface)\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 _LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../LogoSvgForWizard */ \"./js/src/react/components/SignupWizard/LogoSvgForWizard.js\");\n/* harmony import */ var _WizardConnectingAnimation_webp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WizardConnectingAnimation.webp */ \"./js/src/react/components/SignupWizard/WizardConnectingAnimation.webp\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../hooks/useSync */ \"./js/src/react/hooks/useSync.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\nvar __ = wp.i18n.__;\nfunction ConnectingInterface(_ref) {\n var handleShowSuccessInterface = _ref.handleShowSuccessInterface;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0),\n _useState2 = _slicedToArray(_useState, 2),\n progress = _useState2[0],\n setProgress = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState4 = _slicedToArray(_useState3, 2),\n statusMessage = _useState4[0],\n setStatusMessage = _useState4[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var progressBarFill = document.querySelector('.spbct-signup-wizard-progressbar div');\n var handleProgress = function handleProgress(msg, percent) {\n setStatusMessage(msg);\n setProgress(percent);\n if (progressBarFill) {\n progressBarFill.style.width = \"\".concat(percent, \"%\");\n }\n };\n var handleComplete = function handleComplete(status) {\n if (status && status.reload) {\n window.location.reload();\n return;\n }\n if (status && status.success) {\n handleShowSuccessInterface();\n }\n };\n (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_3__.runSync)(handleProgress, handleComplete);\n }, []);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card spbct-signup-wizard-card-connecting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card-left\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-connecting-gif'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: _WizardConnectingAnimation_webp__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n alt: 'Connecting animation'\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-inner'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connecting your site to CleanTalk cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-progressbar-legend'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-progressbar-legend-text'\n }, statusMessage), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-progressbar-legend-percent'\n }, progress, \"%\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-progressbar'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null)))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/ConnectingInterface.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ConnectingInterface)\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 _LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../LogoSvgForWizard */ \"./js/src/react/components/SignupWizard/LogoSvgForWizard.js\");\n/* harmony import */ var _WizardConnectingAnimation_webp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../WizardConnectingAnimation.webp */ \"./js/src/react/components/SignupWizard/WizardConnectingAnimation.webp\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../hooks/useSync */ \"./js/src/react/hooks/useSync.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\nvar __ = wp.i18n.__;\nfunction ConnectingInterface(_ref) {\n var handleShowSuccessInterface = _ref.handleShowSuccessInterface;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0),\n _useState2 = _slicedToArray(_useState, 2),\n progress = _useState2[0],\n setProgress = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState4 = _slicedToArray(_useState3, 2),\n statusMessage = _useState4[0],\n setStatusMessage = _useState4[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var progressBarFill = document.querySelector('.spbct-signup-wizard-progressbar div');\n var handleProgress = function handleProgress(msg, percent) {\n setStatusMessage(msg);\n setProgress(percent);\n if (progressBarFill) {\n progressBarFill.style.width = \"\".concat(percent, \"%\");\n }\n };\n var handleComplete = function handleComplete(status) {\n if (status && status.reload) {\n window.location.reload();\n return;\n }\n if (status && status.success) {\n handleShowSuccessInterface();\n }\n };\n (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_3__.runSync)(handleProgress, handleComplete);\n }, []);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card spbct-signup-wizard-card-connecting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card-left\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-connecting-gif'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: _WizardConnectingAnimation_webp__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n alt: 'Connecting animation'\n }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-inner'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connecting your site to CleanTalk cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-progressbar-legend'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-progressbar-legend-text'\n }, statusMessage), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-progressbar-legend-percent'\n }, progress, \"%\")), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-progressbar'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null)))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/ConnectingInterface.js?\n}"); /***/ }, @@ -216,7 +216,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 */ SignupInterface)\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 _LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../LogoSvgForWizard */ \"./js/src/react/components/SignupWizard/LogoSvgForWizard.js\");\n/* harmony import */ var _BeautifulDigits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BeautifulDigits */ \"./js/src/react/components/SignupWizard/Screens/BeautifulDigits.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\nvar __ = wp.i18n.__;\nfunction SignupInterface(_ref) {\n var handleExistingUserClick = _ref.handleExistingUserClick,\n handleShowConnectingInterface = _ref.handleShowConnectingInterface,\n setError = _ref.setError,\n savedEmail = _ref.savedEmail,\n savedAgreedToTerms = _ref.savedAgreedToTerms,\n onFormDataChange = _ref.onFormDataChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(savedEmail),\n _useState2 = _slicedToArray(_useState, 2),\n email = _useState2[0],\n setEmail = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(savedAgreedToTerms),\n _useState4 = _slicedToArray(_useState3, 2),\n agreedToTerms = _useState4[0],\n setAgreedToTerms = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(__('Connect to Account', 'security-malware-firewall')),\n _useState6 = _slicedToArray(_useState5, 2),\n buttonText = _useState6[0],\n setButtonText = _useState6[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (onFormDataChange) {\n onFormDataChange(email, agreedToTerms);\n }\n }, [email, agreedToTerms, onFormDataChange]);\n var handleSignUp = function handleSignUp(e) {\n e.preventDefault();\n var formData = new FormData(e.target);\n var email = formData.get('email');\n var ctAdminTimezone = formData.get('ct_admin_timezone');\n setButtonText(__('Please, wait...', 'security-malware-firewall'));\n spbcSendAJAXRequest({\n action: 'spbc_get_key_auto',\n email: email,\n ct_admin_timezone: ctAdminTimezone\n }, {\n timeout: 25000,\n button: document.getElementById('spbct-signup-wizard-get-key-btn'),\n spinner: '',\n callback: function callback(result) {\n setButtonText(__('Connect to Account', 'security-malware-firewall'));\n if (result.success) {\n if (result.getTemplates) {\n // @ToDo Is this functionality needed? If yes - need to be fixed, not worked for now.\n spbcModal.loaded = result.getTemplates;\n spbcModal.open();\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n }\n handleShowConnectingInterface();\n } else {\n setError(result.msg);\n }\n }\n });\n };\n var fillTimezoneValue = function fillTimezoneValue() {\n var d = new Date();\n return d.getTimezoneOffset() / 60 * -1;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-left'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Protect your website in under 60 seconds', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Protect your website from malware, attacks, and suspicious activity', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Automatic, daily security updates', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Scan your website for hidden threats in real time', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BeautifulDigits__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-what-next'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-what-next-title'\n }, __('What happens next?', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-what-next-hint'\n }, __('Once connected, the plugin updates the firewall database, downloads malware signatures, and performs its first malware scan.', 'security-malware-firewall'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-right'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connect your website to CleanTalk cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSignUp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-input-title'\n }, __('Email address', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'email',\n name: 'email',\n required: true,\n value: email,\n onChange: function onChange(e) {\n return setEmail(e.target.value);\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group checkbox-block'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'checkbox',\n name: 'checkbox',\n id: 'checkbox',\n required: true,\n checked: agreedToTerms,\n onChange: function onChange(e) {\n return setAgreedToTerms(e.target.checked);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'checkbox'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('I agree to the Privacy Policy and', 'security-malware-firewall'), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: 'https://cleantalk.org/publicoffer',\n target: '_blank',\n rel: 'noreferrer'\n }, __('License Agreement', 'security-malware-firewall'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: 'submit',\n name: 'submit',\n id: 'spbct-signup-wizard-get-key-btn'\n }, buttonText)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'hidden',\n id: 'spbc_admin_timezone',\n name: 'ct_admin_timezone',\n value: fillTimezoneValue()\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n onClick: handleExistingUserClick,\n href: \"#\"\n }, __('I already have an Access Key', 'security-malware-firewall')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n href: 'options-general.php?page=spbc&spbc_tab=settings_general'\n }, __('Skip setup wizard', 'security-malware-firewall'))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/SignupInterface.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SignupInterface)\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 _LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../LogoSvgForWizard */ \"./js/src/react/components/SignupWizard/LogoSvgForWizard.js\");\n/* harmony import */ var _BeautifulDigits__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BeautifulDigits */ \"./js/src/react/components/SignupWizard/Screens/BeautifulDigits.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\nvar __ = wp.i18n.__;\nfunction SignupInterface(_ref) {\n var handleExistingUserClick = _ref.handleExistingUserClick,\n handleShowConnectingInterface = _ref.handleShowConnectingInterface,\n setError = _ref.setError,\n savedEmail = _ref.savedEmail,\n savedAgreedToTerms = _ref.savedAgreedToTerms,\n onFormDataChange = _ref.onFormDataChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(savedEmail),\n _useState2 = _slicedToArray(_useState, 2),\n email = _useState2[0],\n setEmail = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(savedAgreedToTerms),\n _useState4 = _slicedToArray(_useState3, 2),\n agreedToTerms = _useState4[0],\n setAgreedToTerms = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(__('Activate Security', 'security-malware-firewall')),\n _useState6 = _slicedToArray(_useState5, 2),\n buttonText = _useState6[0],\n setButtonText = _useState6[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (onFormDataChange) {\n onFormDataChange(email, agreedToTerms);\n }\n }, [email, agreedToTerms, onFormDataChange]);\n var handleSignUp = function handleSignUp(e) {\n e.preventDefault();\n var formData = new FormData(e.target);\n var email = formData.get('email');\n var ctAdminTimezone = formData.get('ct_admin_timezone');\n setButtonText(__('Please, wait...', 'security-malware-firewall'));\n spbcSendAJAXRequest({\n action: 'spbc_get_key_auto',\n email: email,\n ct_admin_timezone: ctAdminTimezone,\n spbct_wizard_request: 1\n }, {\n timeout: 25000,\n button: document.getElementById('spbct-signup-wizard-get-key-btn'),\n spinner: '',\n callback: function callback(result) {\n setButtonText(__('Activate Security', 'security-malware-firewall'));\n if (result.success) {\n if (result.getTemplates) {\n // @ToDo Is this functionality needed? If yes - need to be fixed, not worked for now.\n spbcModal.loaded = result.getTemplates;\n spbcModal.open();\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n }\n handleShowConnectingInterface();\n } else {\n setError(result.msg);\n }\n }\n });\n };\n var fillTimezoneValue = function fillTimezoneValue() {\n var d = new Date();\n return d.getTimezoneOffset() / 60 * -1;\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-card\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-left'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LogoSvgForWizard__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Protect your website in under 60 seconds', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Protect your website from malware, attacks, and suspicious activity', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Automatic, daily security updates', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-checked-ico'\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Scan your website for hidden threats in real time', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_BeautifulDigits__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-what-next'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-what-next-title'\n }, __('What happens next?', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-what-next-hint'\n }, __('Once connected, the plugin updates the firewall database, downloads malware signatures, and performs its first malware scan.', 'security-malware-firewall'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-card-right'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: 'spbct-signup-wizard-title'\n }, __('Connect Your Website to the Anti-Spam Cloud', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"form\", {\n onSubmit: handleSignUp\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbct-signup-wizard-form-group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: 'spbct-signup-wizard-input-title'\n }, __('Email address', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'email',\n name: 'email',\n required: true,\n value: email,\n onChange: function onChange(e) {\n return setEmail(e.target.value);\n }\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group checkbox-block'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'checkbox',\n name: 'checkbox',\n id: 'checkbox',\n required: true,\n checked: agreedToTerms,\n onChange: function onChange(e) {\n return setAgreedToTerms(e.target.checked);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'checkbox'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('I agree to the Privacy Policy and', 'security-malware-firewall'), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: 'https://cleantalk.org/publicoffer',\n target: '_blank',\n rel: 'noreferrer'\n }, __('License Agreement', 'security-malware-firewall'))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: 'submit',\n name: 'submit',\n id: 'spbct-signup-wizard-get-key-btn'\n }, buttonText)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: 'hidden',\n id: 'spbc_admin_timezone',\n name: 'ct_admin_timezone',\n value: fillTimezoneValue()\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbct-signup-wizard-form-group'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n onClick: handleExistingUserClick,\n href: \"#\"\n }, __('I already have an Access Key', 'security-malware-firewall')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: 'spbct-signup-wizard-skip-wizard-link',\n href: 'options-general.php?page=spbc&spbc_tab=settings_general'\n }, __('Skip setup wizard', 'security-malware-firewall'))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/Screens/SignupInterface.js?\n}"); /***/ }, @@ -236,7 +236,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 */ SignupWizard)\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/SignupWizard/styles.css\");\n/* harmony import */ var _Screens_AccessKeyInterface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Screens/AccessKeyInterface */ \"./js/src/react/components/SignupWizard/Screens/AccessKeyInterface.js\");\n/* harmony import */ var _Screens_SuccessInterface__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Screens/SuccessInterface */ \"./js/src/react/components/SignupWizard/Screens/SuccessInterface.js\");\n/* harmony import */ var _Screens_SignupInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Screens/SignupInterface */ \"./js/src/react/components/SignupWizard/Screens/SignupInterface.js\");\n/* harmony import */ var _Screens_ConnectingInterface__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screens/ConnectingInterface */ \"./js/src/react/components/SignupWizard/Screens/ConnectingInterface.js\");\n/* harmony import */ var _Screens_ErrorInterface__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Screens/ErrorInterface */ \"./js/src/react/components/SignupWizard/Screens/ErrorInterface.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 SignupWizard(_ref) {\n var dataRoot = _ref.dataRoot;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n error = _useState2[0],\n setError = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n showAccessKeyInterface = _useState4[0],\n setShowAccessKeyInterface = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n showSuccessInterface = _useState6[0],\n setShowSuccessInterface = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n showConnectingInterface = _useState8[0],\n setShowConnectingInterface = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n email: dataRoot.adminEmail ? dataRoot.adminEmail : '',\n agreedToTerms: true\n }),\n _useState0 = _slicedToArray(_useState9, 2),\n savedFormData = _useState0[0],\n setSavedFormData = _useState0[1];\n var handleBackToSignup = function handleBackToSignup(e) {\n e.preventDefault();\n setError(null);\n setShowAccessKeyInterface(false);\n setShowSuccessInterface(false);\n setShowConnectingInterface(false);\n };\n var handleExistingUserClick = function handleExistingUserClick(e) {\n e.preventDefault();\n setShowAccessKeyInterface(true);\n setShowSuccessInterface(false);\n setShowConnectingInterface(false);\n };\n var handleShowSuccessInterface = function handleShowSuccessInterface() {\n setShowSuccessInterface(true);\n setShowAccessKeyInterface(false);\n setShowConnectingInterface(false);\n };\n var handleShowConnectingInterface = function handleShowConnectingInterface() {\n setShowConnectingInterface(true);\n setShowAccessKeyInterface(false);\n setShowSuccessInterface(false);\n };\n var handleFormDataChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (email, agreedToTerms) {\n setSavedFormData({\n email: email,\n agreedToTerms: agreedToTerms\n });\n }, []);\n if (error) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_ErrorInterface__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n error: error,\n handleBackToSignup: handleBackToSignup\n });\n }\n if (showAccessKeyInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_AccessKeyInterface__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n handleBackToSignup: handleBackToSignup,\n handleShowConnectingInterface: handleShowConnectingInterface,\n setError: setError\n });\n }\n if (showSuccessInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_SuccessInterface__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null);\n }\n if (showConnectingInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_ConnectingInterface__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n handleShowSuccessInterface: handleShowSuccessInterface\n });\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_SignupInterface__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n handleExistingUserClick: handleExistingUserClick,\n handleShowConnectingInterface: handleShowConnectingInterface,\n setError: setError,\n savedEmail: savedFormData.email,\n savedAgreedToTerms: savedFormData.agreedToTerms,\n onFormDataChange: handleFormDataChange\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/SignupWizard.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SignupWizard)\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/SignupWizard/styles.css\");\n/* harmony import */ var _Screens_AccessKeyInterface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Screens/AccessKeyInterface */ \"./js/src/react/components/SignupWizard/Screens/AccessKeyInterface.js\");\n/* harmony import */ var _Screens_SuccessInterface__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Screens/SuccessInterface */ \"./js/src/react/components/SignupWizard/Screens/SuccessInterface.js\");\n/* harmony import */ var _Screens_SignupInterface__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Screens/SignupInterface */ \"./js/src/react/components/SignupWizard/Screens/SignupInterface.js\");\n/* harmony import */ var _Screens_ConnectingInterface__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Screens/ConnectingInterface */ \"./js/src/react/components/SignupWizard/Screens/ConnectingInterface.js\");\n/* harmony import */ var _Screens_ErrorInterface__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Screens/ErrorInterface */ \"./js/src/react/components/SignupWizard/Screens/ErrorInterface.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 SignupWizard(_ref) {\n var dataRoot = _ref.dataRoot;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState2 = _slicedToArray(_useState, 2),\n error = _useState2[0],\n setError = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n showAccessKeyInterface = _useState4[0],\n setShowAccessKeyInterface = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n showSuccessInterface = _useState6[0],\n setShowSuccessInterface = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n showConnectingInterface = _useState8[0],\n setShowConnectingInterface = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({\n email: dataRoot.adminEmail ? dataRoot.adminEmail : '',\n agreedToTerms: true\n }),\n _useState0 = _slicedToArray(_useState9, 2),\n savedFormData = _useState0[0],\n setSavedFormData = _useState0[1];\n var handleBackToSignup = function handleBackToSignup(e) {\n e.preventDefault();\n setError(null);\n setShowAccessKeyInterface(false);\n setShowSuccessInterface(false);\n setShowConnectingInterface(false);\n };\n var handleExistingUserClick = function handleExistingUserClick(e) {\n e.preventDefault();\n setShowAccessKeyInterface(true);\n setShowSuccessInterface(false);\n setShowConnectingInterface(false);\n };\n var handleShowSuccessInterface = function handleShowSuccessInterface() {\n setShowSuccessInterface(true);\n setShowAccessKeyInterface(false);\n setShowConnectingInterface(false);\n };\n var handleShowConnectingInterface = function handleShowConnectingInterface() {\n setShowConnectingInterface(true);\n setShowAccessKeyInterface(false);\n setShowSuccessInterface(false);\n };\n var handleFormDataChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (email, agreedToTerms) {\n setSavedFormData({\n email: email,\n agreedToTerms: agreedToTerms\n });\n }, []);\n if (error) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_ErrorInterface__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n error: error,\n handleBackToSignup: handleBackToSignup\n });\n }\n if (showAccessKeyInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_AccessKeyInterface__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n handleBackToSignup: handleBackToSignup,\n handleShowConnectingInterface: handleShowConnectingInterface,\n setError: setError\n });\n }\n if (showSuccessInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_SuccessInterface__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null);\n }\n if (showConnectingInterface) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_ConnectingInterface__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n handleShowSuccessInterface: handleShowSuccessInterface\n });\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Screens_SignupInterface__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n handleExistingUserClick: handleExistingUserClick,\n handleShowConnectingInterface: handleShowConnectingInterface,\n setError: setError,\n savedEmail: savedFormData.email,\n savedAgreedToTerms: savedFormData.agreedToTerms,\n onFormDataChange: handleFormDataChange\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/SignupWizard/SignupWizard.js?\n}"); /***/ }, @@ -356,7 +356,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 */ NoticeBanner)\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/NoticeBanner/styles.css\");\n/* harmony import */ var _hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../hooks/useCookie */ \"./js/src/react/hooks/useCookie.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\nvar __ = wp.i18n.__;\n\n\nfunction NoticeBanner() {\n var cookieName = 'spbct_notice-found_critical_files';\n var cookie = (0,_hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__.useCookie)(cookieName);\n var setCookie = (0,_hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__.useSetCookie)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n return cookie !== '1';\n }),\n _useState2 = _slicedToArray(_useState, 2),\n visible = _useState2[0],\n setVisible = _useState2[1];\n var handleDismiss = function handleDismiss(e) {\n setCookie(cookieName, 1, 30);\n setVisible(false);\n // Avoid infinite loop: do not dispatch click on the same button\n if (e && e.target && e.target.classList.contains('spbct_notice-dismiss-react')) return;\n // If needed, trigger jQuery handler for other elements (not this button)\n var event = new Event('click', {\n bubbles: true\n });\n document.querySelectorAll('.spbct_notice-dismiss-react').forEach(function (el) {\n if (el !== (e === null || e === void 0 ? void 0 : e.target)) el.dispatchEvent(event);\n });\n };\n if (!visible) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"notice notice-warning spbct_notice spbct_notice-found_critical_files\",\n style: {\n scrollMarginTop: '160px'\n },\n id: \"notice_id_found_critical_files\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc---top\"\n }, __('There\\'s a high probability that your website has been compromised, as critical files show signs of infection. Take action now by ordering malware removal from our experienced security specialists.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n alignContent: 'center',\n margin: '0 30px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: \"spbc_manual_link\",\n target: \"_blank\",\n href: window.spbcSettings.link_remove_malware_from_website,\n rel: \"noreferrer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc-icon-link-ext\"\n }), \"\\xA0\\xA0\", __('Request Malware removal', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"notice-dismiss spbct_notice-dismiss-react\",\n onClick: handleDismiss\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"screen-reader-text\"\n }, __('Dismiss this notice.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/NoticeBanner/NoticeBanner.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ NoticeBanner)\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/NoticeBanner/styles.css\");\n/* harmony import */ var _hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../hooks/useCookie */ \"./js/src/react/hooks/useCookie.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;\nvar __ = wp.i18n.__;\n\n\nfunction NoticeBanner() {\n var cookieName = 'spbct_notice-found_critical_files';\n var cookie = (0,_hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__.useCookie)(cookieName);\n var setCookie = (0,_hooks_useCookie__WEBPACK_IMPORTED_MODULE_2__.useSetCookie)();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n return cookie !== '1';\n }),\n _useState2 = _slicedToArray(_useState, 2),\n visible = _useState2[0],\n setVisible = _useState2[1];\n var handleDismiss = function handleDismiss(e) {\n setCookie(cookieName, 1, 30);\n setVisible(false);\n // Avoid infinite loop: do not dispatch click on the same button\n if (e && e.target && e.target.classList.contains('spbct_notice-dismiss-react')) return;\n // If needed, trigger jQuery handler for other elements (not this button)\n var event = new Event('click', {\n bubbles: true\n });\n document.querySelectorAll('.spbct_notice-dismiss-react').forEach(function (el) {\n if (el !== (e === null || e === void 0 ? void 0 : e.target)) el.dispatchEvent(event);\n });\n };\n if (!visible) return null;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"notice notice-warning spbct_notice spbct_notice-found_critical_files\",\n style: {\n scrollMarginTop: '160px'\n },\n id: \"notice_id_found_critical_files\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc---top\"\n }, __('There\\'s a high probability that your website has been compromised, as critical files show signs of infection. Take action now by ordering malware removal from our experienced security specialists.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n alignContent: 'center',\n margin: '0 30px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n className: \"spbc_manual_link\",\n target: \"_blank\",\n href: window.spbcSettings.link_remove_malware_from_website,\n rel: \"noreferrer\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc-icon-link-ext\"\n }), \"\\xA0\\xA0\", __('Request Malware removal', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"notice-dismiss spbct_notice-dismiss-react\",\n onClick: handleDismiss\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"screen-reader-text\"\n }, __('Dismiss this notice.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/NoticeBanner/NoticeBanner.js?\n}"); /***/ }, @@ -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 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}"); /***/ }, @@ -406,7 +406,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 */ FirewallTableRow)\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 _utils_Utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/Utilities */ \"./js/src/react/utils/Utilities.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n\n\nvar __ = wp.i18n.__;\nfunction FirewallTableRow(_ref) {\n var row = _ref.row,\n rowIndex = _ref.rowIndex;\n // AJAX wrapper for filter IP requests\n var filterIpAjaxWrapper = function filterIpAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n\n // Confirm modal window\n var spbcModalConfirm = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (callback) {\n var confirmHeader = __('Are you sure?', 'security-malware-firewall');\n var confirmText = __('Keep in mind, you have a few automatic options to deal with bots and DoS/DDoS attacks,', 'security-malware-firewall');\n confirmText += '

';\n confirmText += '
';\n confirmText += '1. ' + (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('Tune %s -> \"Traffic control\" in order to stop flood/DoS attacks on your site.', 'security-malware-firewall'), \"\\n \".concat(__('General settings', 'security-malware-firewall'), \"\\n \"));\n confirmText += '
';\n confirmText += '2. ' + __(\n // eslint-disable-next-line max-len\n '(Anti-Spam plugin) If you use Anti-Spam plugin by CleanTalk, turn option Advanced settings -> \"Anti-Crawler\" on. This options dead stops bots on your site, it protects from stealing content from the site!', 'security-malware-firewall');\n confirmText += '

';\n confirmText += (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('Anti-Spam plugin is here %s -> Anti-Spam by CleanTalk.', 'security-malware-firewall'), \"\\n \".concat(__('WordPress console -> Plugins', 'security-malware-firewall'), \"\\n \"));\n confirmText += ' ';\n confirmText += (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('If the plugin is not installed, ' + 'it can be found and installed through %s.', 'security-malware-firewall'), 'search');\n confirmText += '
';\n spbcModal.open();\n spbcModal.confirm(confirmHeader, confirmText, '', callback);\n }, []);\n\n // Handler for allowing an IP\n var handleAllowIp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (e) {\n e.preventDefault();\n spbcModalConfirm(function () {\n return handleAllowIpCallback(e.target);\n });\n }, []);\n var handleAllowIpCallback = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(target) {\n var originalText, originalPointerEvents, data, response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n originalText = target.textContent;\n originalPointerEvents = target.style.pointerEvents;\n target.style.pointerEvents = 'none';\n target.style.opacity = '0.5';\n target.textContent = __('Processing...', 'security-malware-firewall');\n data = {\n action: 'spbc_tc__filter_ip',\n ip: row.ip_entry,\n status: 'allow'\n };\n _context.p = 1;\n _context.n = 2;\n return filterIpAjaxWrapper(data);\n case 2:\n response = _context.v;\n if (response.success) {\n alert(__('Success.', 'security-malware-firewall'));\n } else {\n alert(response.data || __('An error occurred.', 'security-malware-firewall'));\n }\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Error allowing IP:', _t);\n alert(_t.message || __('An error occurred.', 'security-malware-firewall'));\n case 4:\n _context.p = 4;\n target.style.pointerEvents = originalPointerEvents;\n target.style.opacity = '';\n target.textContent = originalText;\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function (_x) {\n return _ref2.apply(this, arguments);\n };\n }(), [row.ip_entry]);\n\n // Handler for banning an IP\n var handleBanIp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (e) {\n e.preventDefault();\n spbcModalConfirm(function () {\n return handleBanIpCallback(e.target);\n });\n }, []);\n var handleBanIpCallback = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(target) {\n var originalText, originalPointerEvents, data, response, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n originalText = target.textContent;\n originalPointerEvents = target.style.pointerEvents;\n target.style.pointerEvents = 'none';\n target.style.opacity = '0.5';\n target.textContent = __('Processing...', 'security-malware-firewall');\n data = {\n action: 'spbc_tc__filter_ip',\n ip: row.ip_entry,\n status: 'deny'\n };\n _context2.p = 1;\n _context2.n = 2;\n return filterIpAjaxWrapper(data);\n case 2:\n response = _context2.v;\n if (response.success) {\n alert(__('Success.', 'security-malware-firewall'));\n } else {\n alert(response.data || __('An error occurred.', 'security-malware-firewall'));\n }\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error banning IP:', _t2);\n alert(_t2.message || __('An error occurred.', 'security-malware-firewall'));\n case 4:\n _context2.p = 4;\n target.style.pointerEvents = originalPointerEvents;\n target.style.opacity = '';\n target.textContent = originalText;\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3, 4, 5]]);\n }));\n return function (_x2) {\n return _ref3.apply(this, arguments);\n };\n }(), [row.ip_entry]);\n var formatTimestamp = function formatTimestamp(timestamp) {\n if (!timestamp) return '';\n var date = new Date(timestamp * 1000); // Convert Unix timestamp to milliseconds\n var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n var month = months[date.getMonth()];\n var day = date.getDate();\n var year = date.getFullYear();\n var hours = String(date.getHours()).padStart(2, '0');\n var minutes = String(date.getMinutes()).padStart(2, '0');\n var seconds = String(date.getSeconds()).padStart(2, '0');\n return \"\".concat(month, \" \").concat(day, \" \").concat(year, \", \").concat(hours, \":\").concat(minutes, \":\").concat(seconds);\n };\n var formatUserAgent = function formatUserAgent(userAgent) {\n if (!userAgent) return '';\n var maxLength = 50;\n if (userAgent.length <= maxLength) {\n return userAgent;\n }\n return userAgent.substring(0, maxLength) + '...';\n };\n var getCleanTalkUrl = function getCleanTalkUrl(ip) {\n var params = new URLSearchParams({\n utm_id: '',\n utm_term: '',\n utm_source: 'wordpress',\n utm_medium: 'dashboard',\n utm_content: 'firewall_log',\n utm_campaign: 'firewall'\n });\n return \"https://cleantalk.org/blacklists/\".concat(ip, \"?\").concat(params.toString());\n };\n var getCountryPart = function getCountryPart(country) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: \"https://cleantalk.org/images/flags/\".concat(country.country_code.toLowerCase(), \".png\"),\n alt: country.country_code\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), country.country_name, \" | \", country.subdivision, \" | \", country.city);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tr\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"column-ip_entry column-primary mob_block_1\",\n \"data-before\": __('IP', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ip_entry\"\n }, row.ip_entry), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: getCleanTalkUrl(row.ip_entry),\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, __('Lookup', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc-icon-link-ext\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), row.personal_status !== null && row.personal_status > 0 ? __('Allowed', 'security-malware-firewall') : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: handleAllowIp,\n className: \"spbcGreen\"\n }, __('Allow', 'security-malware-firewall')), \"\\xA0|\\xA0\", row.personal_status !== null && row.personal_status <= 0 ? __('Banned', 'security-malware-firewall') : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: handleBanIp,\n className: \"spbc---red\"\n }, __('Ban', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return window.spbcShowHideRows && window.spbcShowHideRows(rowIndex + 1, 'spbc_tbl__traffic_control_logs');\n },\n className: \"toggle-row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"screen-reader-text\"\n }, __('Show more details', 'security-malware-firewall')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"country column-country mob_entries mob_block_1 spbc_tbl__traffic_control_logs_block_1\",\n \"data-before\": __('Country', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, row.country ? getCountryPart(row.country) : '-'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['entry_timestamp', 'column-entry_timestamp', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Last Request', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\",\n \"data-sort-value\": row.entry_timestamp\n }, formatTimestamp(row.entry_timestamp)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['status', 'column-status', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Status', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: row.statusColor || 'spbcRed'\n }, row.status || __('Unknown', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['requests', 'column-requests', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Requests and attempts', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, row.requests || 0)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['requests_per', 'column-requests_per', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Requests per 5 minutes', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, row.requests_per || 0)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"page_url column-page_url mob_entries mob_block_1 spbc_tbl__traffic_control_logs_block_1\",\n \"data-before\": __('Page', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, row.page_url || '-'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['http_user_agent', 'column-http_user_agent', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('User Agent', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbcShortText\"\n }, formatUserAgent(row.http_user_agent || '')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbcFullText spbc_hide_table_cell_desc\"\n }, row.http_user_agent || '-')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ FirewallTableRow)\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 _utils_Utilities__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../utils/Utilities */ \"./js/src/react/utils/Utilities.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\n;\n\nvar __ = wp.i18n.__;\nfunction FirewallTableRow(_ref) {\n var row = _ref.row,\n rowIndex = _ref.rowIndex;\n // AJAX wrapper for filter IP requests\n var filterIpAjaxWrapper = function filterIpAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n\n // Confirm modal window\n var spbcModalConfirm = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (callback) {\n var confirmHeader = __('Are you sure?', 'security-malware-firewall');\n var confirmText = __('Keep in mind, you have a few automatic options to deal with bots and DoS/DDoS attacks,', 'security-malware-firewall');\n confirmText += '

';\n confirmText += '
';\n confirmText += '1. ' + (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('Tune %s -> \"Traffic control\" in order to stop flood/DoS attacks on your site.', 'security-malware-firewall'), \"\\n \".concat(__('General settings', 'security-malware-firewall'), \"\\n \"));\n confirmText += '
';\n confirmText += '2. ' + __(\n // eslint-disable-next-line max-len\n '(Anti-Spam plugin) If you use Anti-Spam plugin by CleanTalk, turn option Advanced settings -> \"Anti-Crawler\" on. This options dead stops bots on your site, it protects from stealing content from the site!', 'security-malware-firewall');\n confirmText += '

';\n confirmText += (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('Anti-Spam plugin is here %s -> Anti-Spam by CleanTalk.', 'security-malware-firewall'), \"\\n \".concat(__('WordPress console -> Plugins', 'security-malware-firewall'), \"\\n \"));\n confirmText += ' ';\n confirmText += (0,_utils_Utilities__WEBPACK_IMPORTED_MODULE_1__.sprintf)(__('If the plugin is not installed, ' + 'it can be found and installed through %s.', 'security-malware-firewall'), 'search');\n confirmText += '
';\n spbcModal.open();\n spbcModal.confirm(confirmHeader, confirmText, '', callback);\n }, []);\n\n // Handler for allowing an IP\n var handleAllowIp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (e) {\n e.preventDefault();\n spbcModalConfirm(function () {\n return handleAllowIpCallback(e.target);\n });\n }, []);\n var handleAllowIpCallback = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(target) {\n var originalText, originalPointerEvents, data, response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n originalText = target.textContent;\n originalPointerEvents = target.style.pointerEvents;\n target.style.pointerEvents = 'none';\n target.style.opacity = '0.5';\n target.textContent = __('Processing...', 'security-malware-firewall');\n data = {\n action: 'spbc_tc__filter_ip',\n ip: row.ip_entry,\n status: 'allow'\n };\n _context.p = 1;\n _context.n = 2;\n return filterIpAjaxWrapper(data);\n case 2:\n response = _context.v;\n if (response.success) {\n alert(__('Success.', 'security-malware-firewall'));\n } else {\n alert(response.data || __('An error occurred.', 'security-malware-firewall'));\n }\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error('Error allowing IP:', _t);\n alert(_t.message || __('An error occurred.', 'security-malware-firewall'));\n case 4:\n _context.p = 4;\n target.style.pointerEvents = originalPointerEvents;\n target.style.opacity = '';\n target.textContent = originalText;\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3, 4, 5]]);\n }));\n return function (_x) {\n return _ref2.apply(this, arguments);\n };\n }(), [row.ip_entry]);\n\n // Handler for banning an IP\n var handleBanIp = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (e) {\n e.preventDefault();\n spbcModalConfirm(function () {\n return handleBanIpCallback(e.target);\n });\n }, []);\n var handleBanIpCallback = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(target) {\n var originalText, originalPointerEvents, data, response, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n originalText = target.textContent;\n originalPointerEvents = target.style.pointerEvents;\n target.style.pointerEvents = 'none';\n target.style.opacity = '0.5';\n target.textContent = __('Processing...', 'security-malware-firewall');\n data = {\n action: 'spbc_tc__filter_ip',\n ip: row.ip_entry,\n status: 'deny'\n };\n _context2.p = 1;\n _context2.n = 2;\n return filterIpAjaxWrapper(data);\n case 2:\n response = _context2.v;\n if (response.success) {\n alert(__('Success.', 'security-malware-firewall'));\n } else {\n alert(response.data || __('An error occurred.', 'security-malware-firewall'));\n }\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error banning IP:', _t2);\n alert(_t2.message || __('An error occurred.', 'security-malware-firewall'));\n case 4:\n _context2.p = 4;\n target.style.pointerEvents = originalPointerEvents;\n target.style.opacity = '';\n target.textContent = originalText;\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3, 4, 5]]);\n }));\n return function (_x2) {\n return _ref3.apply(this, arguments);\n };\n }(), [row.ip_entry]);\n var formatTimestamp = function formatTimestamp(timestamp) {\n if (!timestamp) return '';\n var date = new Date(timestamp * 1000); // Convert Unix timestamp to milliseconds\n var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n var month = months[date.getMonth()];\n var day = date.getDate();\n var year = date.getFullYear();\n var hours = String(date.getHours()).padStart(2, '0');\n var minutes = String(date.getMinutes()).padStart(2, '0');\n var seconds = String(date.getSeconds()).padStart(2, '0');\n return \"\".concat(month, \" \").concat(day, \" \").concat(year, \", \").concat(hours, \":\").concat(minutes, \":\").concat(seconds);\n };\n var formatUserAgent = function formatUserAgent(userAgent) {\n if (!userAgent) return '';\n var maxLength = 50;\n if (userAgent.length <= maxLength) {\n return userAgent;\n }\n return userAgent.substring(0, maxLength) + '...';\n };\n var getCleanTalkUrl = function getCleanTalkUrl(ip) {\n var params = new URLSearchParams({\n utm_id: '',\n utm_term: '',\n utm_source: 'wordpress',\n utm_medium: 'dashboard',\n utm_content: 'firewall_log',\n utm_campaign: 'firewall'\n });\n return \"https://cleantalk.org/blacklists/\".concat(ip, \"?\").concat(params.toString());\n };\n\n // Adds a locale-aware thousands separator, keeps non numeric values (like '-') untouched\n var formatNumber = function formatNumber(number) {\n var value = Number(number);\n if (number === '' || number === null || isNaN(value)) {\n return number;\n }\n return value.toLocaleString();\n };\n var getLocationPart = function getLocationPart(country) {\n var countryCode = country.country_code || '';\n var parts = [];\n [country.country_name, country.subdivision, country.city].filter(function (part) {\n return typeof part === 'string' && part.trim() !== '';\n }).forEach(function (part) {\n var value = part.trim();\n if (!parts.some(function (added) {\n return added.toLowerCase() === value.toLowerCase();\n })) {\n parts.push(value);\n }\n });\n var location = parts.join(', ');\n if (countryCode === '' && location === '') {\n return '-';\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, countryCode !== '' ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n src: \"https://cleantalk.org/images/flags/\".concat(countryCode.toLowerCase(), \".png\"),\n alt: countryCode\n }) : null, countryCode !== '' && location !== '' ? \"\\xA0\" : null, location);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tr\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"column-ip_entry column-primary mob_block_1\",\n \"data-before\": __('IP', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"ip_entry\"\n }, row.ip_entry), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: getCleanTalkUrl(row.ip_entry),\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, __('Lookup', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n className: \"spbc-icon-link-ext\"\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), row.personal_status !== null && row.personal_status > 0 ? __('Allowed', 'security-malware-firewall') : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: handleAllowIp,\n className: \"spbcGreen\"\n }, __('Allow', 'security-malware-firewall')), \"\\xA0|\\xA0\", row.personal_status !== null && row.personal_status <= 0 ? __('Banned', 'security-malware-firewall') : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: handleBanIp,\n className: \"spbc---red\"\n }, __('Ban', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n onClick: function onClick() {\n return window.spbcShowHideRows && window.spbcShowHideRows(rowIndex + 1, 'spbc_tbl__traffic_control_logs');\n },\n className: \"toggle-row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"screen-reader-text\"\n }, __('Show more details', 'security-malware-firewall')))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"country column-country mob_entries mob_block_1 spbc_tbl__traffic_control_logs_block_1\",\n \"data-before\": __('Location', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, row.country ? getLocationPart(row.country) : '-'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['entry_timestamp', 'column-entry_timestamp', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Last Request', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\",\n \"data-sort-value\": row.entry_timestamp\n }, formatTimestamp(row.entry_timestamp)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['status', 'column-status', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Status', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: row.statusColor || 'spbcRed'\n }, row.status || __('Unknown', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['requests', 'column-requests', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Requests and attempts', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, formatNumber(row.requests || 0))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['requests_per', 'column-requests_per', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('Requests per 5 minutes', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, formatNumber(row.requests_per || 0))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: \"page_url column-page_url mob_entries mob_block_1 spbc_tbl__traffic_control_logs_block_1\",\n \"data-before\": __('Page', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, row.page_url || '-'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"td\", {\n className: ['http_user_agent', 'column-http_user_agent', 'tbl-width--100px', 'mob_entries', 'mob_block_1', 'spbc_tbl__traffic_control_logs_block_1'].join(' '),\n \"data-before\": __('User Agent', 'security-malware-firewall'),\n \"data-defore-no-code\": \"\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbcShortText\"\n }, formatUserAgent(row.http_user_agent || '')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbcFullText spbc_hide_table_cell_desc\"\n }, row.http_user_agent || '-')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js?\n}"); /***/ }, @@ -416,7 +416,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 */ TabFirewall)\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/TabFirewall/styles.css\");\n/* harmony import */ var _FirewallTableRow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FirewallTableRow */ \"./js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js\");\n/* harmony import */ var _tableSort__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tableSort */ \"./js/src/react/components/TabContent/TabFirewall/tableSort.js\");\n/* harmony import */ var _hooks_useGetHostNamesByIps__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../hooks/useGetHostNamesByIps */ \"./js/src/react/hooks/useGetHostNamesByIps.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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction TabFirewall(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(sectionData.objects.rows || []),\n _useState2 = _slicedToArray(_useState, 2),\n tableRows = _useState2[0],\n setTableRows = _useState2[1];\n var _useGetHostNamesByIps = (0,_hooks_useGetHostNamesByIps__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(),\n getHostNames = _useGetHostNamesByIps.getHostNames;\n var linkToControlPanel = 'https://cleantalk.org/my/logs_firewall';\n linkToControlPanel += \"?service=\".concat(sectionData.objects.service_id, \"&user_token=\").concat(sectionData.objects.user_token);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (sectionData.objects.rows) {\n setTableRows(sectionData.objects.rows);\n showHostnames();\n }\n }, [sectionData.objects.rows]);\n var topInfoText = function topInfoText() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left -display--inline-block\"\n }, sprintf(__(\n // eslint-disable-next-line max-len\n 'This list contains details of access attempts for the past hour and shows only the last %d records.', 'security-malware-firewall'), 20), \"\\xA0\", sprintf(__('The list updates itself every %d seconds automatically.', 'security-malware-firewall'), 60), \"\\xA0\", __('Traffic Control blocks visitors who open more than ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.objects.fw_settings.autoblock_amount), \" \", __('website pages within ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.objects.fw_settings.autoblock_timeframe), \" \", __('minutes.', 'security-malware-firewall'), __('You can adjust it ', 'security-malware-firewall'), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: function onClick() {\n document.querySelector('#spbc_tab-traffic_control').remove();\n spbcSwitchTab(document.getElementsByClassName('spbc_tab_nav-settings_general')[0], {\n target: 'spbc_setting_traffic_control__autoblock_amount',\n action: 'highlight',\n times: 3\n });\n }\n }, __('here', 'security-malware-firewall')), \".\\xA0\", __('Traffic Control is ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.flags.is_traffic_control_enabled ? __('active', 'security-malware-firewall') : __('inactive', 'security-malware-firewall')), \".\", __('Web Application Firewall (WAF) is ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.flags.is_waf_enabled ? __('active', 'security-malware-firewall') : __('inactive', 'security-malware-firewall')), \".\");\n };\n\n // Callback promise wrapper\n var fwAjaxWrapper = function fwAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n var showMoreButtonListener = function showMoreButtonListener() {\n if (!document.getElementById('spbc_show_more_fw_logs_button')) {\n return;\n }\n document.getElementById('spbc_show_more_fw_logs_button').addEventListener('click', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var data, response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n document.querySelector('.spbc__wrapper--show_more .spbc_preloader').style.display = 'block';\n if (!(spbcSettingsFWLogs.clicks < 2)) {\n _context.n = 5;\n break;\n }\n spbcSettingsFWLogs.clicks++;\n data = {\n action: 'spbc_show_more_security_firewall_logs',\n amount: spbcSettingsFWLogs.amount * spbcSettingsFWLogs.clicks\n };\n _context.p = 1;\n _context.n = 2;\n return fwAjaxWrapper(data);\n case 2:\n response = _context.v;\n if (response.error) {\n console.error(response.error);\n } else {\n // Add new rows to existing rows using React state\n if (response.objects && response.objects.rows) {\n setTableRows(function (prevRows) {\n return [].concat(_toConsumableArray(prevRows), _toConsumableArray(response.objects.rows));\n });\n if (response.objects.rows.length < spbcSettingsFWLogs.amount) {\n showControlPanelButton();\n }\n }\n }\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error(_t);\n case 4:\n _context.n = 6;\n break;\n case 5:\n showControlPanelButton();\n case 6:\n document.querySelector('.spbc__wrapper--show_more .spbc_preloader').style.display = 'none';\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3]]);\n })));\n };\n var showMoreButton = function showMoreButton() {\n var showMoreButtonLinkToControlPanel = document.querySelector('#spbc__show_more_logs_link_to_control_panel');\n if (showMoreButtonLinkToControlPanel) {\n showMoreButtonLinkToControlPanel.style.display = 'none';\n }\n var showMoreButton = document.querySelector('#spbc_show_more_fw_logs_button');\n if (showMoreButton) {\n showMoreButton.style.display = 'block';\n }\n };\n var showControlPanelButton = function showControlPanelButton() {\n var showMoreButton = document.querySelector('#spbc_show_more_fw_logs_button');\n if (showMoreButton) {\n showMoreButton.style.display = 'none';\n }\n var showMoreButtonLinkToControlPanel = document.querySelector('#spbc__show_more_logs_link_to_control_panel');\n if (showMoreButtonLinkToControlPanel) {\n showMoreButtonLinkToControlPanel.style.display = 'block';\n }\n };\n var moreLogsButtons = function moreLogsButtons() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc__wrapper--center spbc__wrapper--show_more\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_show_more_fw_logs_button\",\n className: \"spbc_manual_link\"\n }, \"Show more\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n className: \"spbc_preloader\",\n src: \"/wp-content/plugins/security-malware-firewall/images/preloader.gif\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc__show_more_logs_link_to_control_panel\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"-display--inline-block\"\n }, \"Proceed to:\\xA0\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n target: \"_blank\",\n rel: \"noreferrer\",\n href: linkToControlPanel,\n className: \"spbc_manual_link -display--inline-block\"\n }, \"Security Control Panel\"), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"-display--inline-block\"\n }, \"to see more.\")));\n };\n var table = function table(rows) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tbl__traffic_control_logs\",\n type: \"traffic_control\",\n className: \"tbl-root\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"table\", {\n className: \"wp-list-table widefat fixed striped\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"thead\", null, tableColumnNames()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tbody\", null, rows.map(function (row, idx) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FirewallTableRow__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n key: idx,\n row: row,\n rowIndex: idx\n });\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tfoot\", null, tableColumnNames())));\n };\n var tableColumnNames = function tableColumnNames() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tr\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"ip_entry\",\n className: \"manage-column column-ip_entry column-primary\"\n }, __('IP', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"country\",\n className: \"manage-column column-country\"\n }, __('Location', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"entry_timestamp\",\n className: \"manage-column column-entry_timestamp\"\n }, __('Last Request', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"status\",\n className: \"manage-column column-status\"\n }, __('Status', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"requests\",\n className: \"manage-column column-requests tbl-width--100px\"\n }, __('Requests and attempts', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"requests_per\",\n className: \"manage-column column-requests_per tbl-width--100px\"\n }, __('Requests per ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, __(' minutes', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"page_url\",\n className: \"manage-column column-page_url\"\n }, __('Page', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"http_user_agent\",\n className: \"manage-column column-http_user_agent\"\n }, __('User Agent', 'security-malware-firewall')));\n };\n var tableDescription = function tableDescription() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"description-firewall-table\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left\"\n }, __('Requests and attempts - shows the total number of requests with a designated status.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left\"\n }, __('Requests per ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, \" \", __('minutes - shows the total number of requests in the last ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, \" \", __('minutes', 'security-malware-firewall'), \".\"));\n };\n\n /**\n * Show hostnames under IPs\n */\n function showHostnames() {\n var ips = jQuery.unique(jQuery('#spbc_tbl__traffic_control_logs tbody tr').map(function () {\n return jQuery(this).find('.ip_entry').text();\n }).get());\n getHostNames(ips, showHostnameCallback);\n }\n\n /**\n * Show hostname callback\n * @param {*} result\n * @param {*} data\n */\n function showHostnameCallback(result, data) {\n if (result.success && result.hostnames) {\n var ip;\n var hostname;\n for (var i = 0; i < result.hostnames.length; i++) {\n ip = result.hostnames[i].network;\n hostname = result.hostnames[i].hostname;\n jQuery('#spbc_tbl__traffic_control_logs tbody tr').each(function () {\n if (jQuery(this).find('.ip_entry').text() === ip) {\n jQuery(this).find('.ip_entry').append('
' + hostname);\n }\n });\n }\n }\n }\n\n // Run showMoreButtonListener after showMoreButton renders\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (sectionData.flags.showMoreButton) {\n showMoreButton();\n showMoreButtonListener();\n } else {\n showControlPanelButton();\n }\n (0,_tableSort__WEBPACK_IMPORTED_MODULE_3__.sortTable)();\n (0,_tableSort__WEBPACK_IMPORTED_MODULE_3__.sortTableListener)();\n }, [sectionData.flags.showMoreButton, sectionData.objects.rows]);\n if (!sectionData.flags.is_key_ok) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tab-traffic_control\",\n className: \"spbc_tab spbc_tab-traffic_control spbc_tab_section--active\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'contents'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n margin: '10px auto',\n textAlign: 'center'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n style: {\n margin: '5px',\n display: 'inline-block'\n }\n }, __('Plugin does not work until you enter the Access key in ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: '/wp-admin/options-general.php?page=spbc&spbc_tab=settings_general'\n }, __('General settings', 'security-malware-firewall')), \".\"))))));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tab-traffic_control\",\n className: \"spbc_tab spbc_tab-traffic_control spbc_tab_section--\".concat(isActive ? 'active' : 'inactive')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'contents'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, topInfoText(), table(tableRows), moreLogsButtons(), tableDescription()))));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFirewall/TabFirewall.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabFirewall)\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/TabFirewall/styles.css\");\n/* harmony import */ var _FirewallTableRow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FirewallTableRow */ \"./js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js\");\n/* harmony import */ var _tableSort__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tableSort */ \"./js/src/react/components/TabContent/TabFirewall/tableSort.js\");\n/* harmony import */ var _hooks_useGetHostNamesByIps__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../hooks/useGetHostNamesByIps */ \"./js/src/react/hooks/useGetHostNamesByIps.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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction TabFirewall(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(sectionData.objects.rows || []),\n _useState2 = _slicedToArray(_useState, 2),\n tableRows = _useState2[0],\n setTableRows = _useState2[1];\n var _useGetHostNamesByIps = (0,_hooks_useGetHostNamesByIps__WEBPACK_IMPORTED_MODULE_4__[\"default\"])(),\n getHostNames = _useGetHostNamesByIps.getHostNames;\n var linkToControlPanel = 'https://cleantalk.org/my/logs_firewall';\n linkToControlPanel += \"?service=\".concat(sectionData.objects.service_id, \"&user_token=\").concat(sectionData.objects.user_token);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (sectionData.objects.rows) {\n setTableRows(sectionData.objects.rows);\n showHostnames();\n }\n }, [sectionData.objects.rows]);\n var topInfoText = function topInfoText() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left -display--inline-block\"\n }, sprintf(__(\n // eslint-disable-next-line max-len\n 'This list contains details of access attempts for the past hour and shows only the last %d records.', 'security-malware-firewall'), 20), \"\\xA0\", sprintf(__('The list updates itself every %d seconds automatically.', 'security-malware-firewall'), 60), \"\\xA0\", __('Traffic Control blocks visitors who open more than ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.objects.fw_settings.autoblock_amount), \" \", __('website pages within ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.objects.fw_settings.autoblock_timeframe), \" \", __('minutes.', 'security-malware-firewall'), __('You can adjust it ', 'security-malware-firewall'), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"#\",\n onClick: function onClick() {\n document.querySelector('#spbc_tab-traffic_control').remove();\n spbcSwitchTab(document.getElementsByClassName('spbc_tab_nav-settings_general')[0], {\n target: 'spbc_setting_traffic_control__autoblock_amount',\n action: 'highlight',\n times: 3\n });\n }\n }, __('here', 'security-malware-firewall')), \".\\xA0\", __('Traffic Control is ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.flags.is_traffic_control_enabled ? __('active', 'security-malware-firewall') : __('inactive', 'security-malware-firewall')), \".\", __('Web Application Firewall (WAF) is ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"b\", null, sectionData.flags.is_waf_enabled ? __('active', 'security-malware-firewall') : __('inactive', 'security-malware-firewall')), \".\");\n };\n\n // Callback promise wrapper\n var fwAjaxWrapper = function fwAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n var showMoreButtonListener = function showMoreButtonListener() {\n if (!document.getElementById('spbc_show_more_fw_logs_button')) {\n return;\n }\n document.getElementById('spbc_show_more_fw_logs_button').addEventListener('click', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var data, response, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n document.querySelector('.spbc__wrapper--show_more .spbc_preloader').style.display = 'block';\n if (!(spbcSettingsFWLogs.clicks < 2)) {\n _context.n = 5;\n break;\n }\n spbcSettingsFWLogs.clicks++;\n data = {\n action: 'spbc_show_more_security_firewall_logs',\n amount: spbcSettingsFWLogs.amount * spbcSettingsFWLogs.clicks\n };\n _context.p = 1;\n _context.n = 2;\n return fwAjaxWrapper(data);\n case 2:\n response = _context.v;\n if (response.error) {\n console.error(response.error);\n } else {\n // Add new rows to existing rows using React state\n if (response.objects && response.objects.rows) {\n setTableRows(function (prevRows) {\n return [].concat(_toConsumableArray(prevRows), _toConsumableArray(response.objects.rows));\n });\n if (response.objects.rows.length < spbcSettingsFWLogs.amount) {\n showControlPanelButton();\n }\n }\n }\n _context.n = 4;\n break;\n case 3:\n _context.p = 3;\n _t = _context.v;\n console.error(_t);\n case 4:\n _context.n = 6;\n break;\n case 5:\n showControlPanelButton();\n case 6:\n document.querySelector('.spbc__wrapper--show_more .spbc_preloader').style.display = 'none';\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[1, 3]]);\n })));\n };\n var showMoreButton = function showMoreButton() {\n var showMoreButtonLinkToControlPanel = document.querySelector('#spbc__show_more_logs_link_to_control_panel');\n if (showMoreButtonLinkToControlPanel) {\n showMoreButtonLinkToControlPanel.style.display = 'none';\n }\n var showMoreButton = document.querySelector('#spbc_show_more_fw_logs_button');\n if (showMoreButton) {\n showMoreButton.style.display = 'block';\n }\n };\n var showControlPanelButton = function showControlPanelButton() {\n var showMoreButton = document.querySelector('#spbc_show_more_fw_logs_button');\n if (showMoreButton) {\n showMoreButton.style.display = 'none';\n }\n var showMoreButtonLinkToControlPanel = document.querySelector('#spbc__show_more_logs_link_to_control_panel');\n if (showMoreButtonLinkToControlPanel) {\n showMoreButtonLinkToControlPanel.style.display = 'block';\n }\n };\n var moreLogsButtons = function moreLogsButtons() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc__wrapper--center spbc__wrapper--show_more\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_show_more_fw_logs_button\",\n className: \"spbc_manual_link\"\n }, \"Show more\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n className: \"spbc_preloader\",\n src: \"/wp-content/plugins/security-malware-firewall/images/preloader.gif\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc__show_more_logs_link_to_control_panel\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"-display--inline-block\"\n }, \"Proceed to:\\xA0\"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n target: \"_blank\",\n rel: \"noreferrer\",\n href: linkToControlPanel,\n className: \"spbc_manual_link -display--inline-block\"\n }, \"Security Control Panel\"), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n className: \"-display--inline-block\"\n }, \"to see more.\")));\n };\n var table = function table(rows) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tbl__traffic_control_logs\",\n type: \"traffic_control\",\n className: \"tbl-root\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"table\", {\n className: \"wp-list-table widefat fixed striped\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"thead\", null, tableColumnNames()), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tbody\", null, rows.map(function (row, idx) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FirewallTableRow__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n key: idx,\n row: row,\n rowIndex: idx\n });\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tfoot\", null, tableColumnNames())));\n };\n var tableColumnNames = function tableColumnNames() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"tr\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"ip_entry\",\n className: \"manage-column column-ip_entry column-primary\"\n }, __('IP', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"country\",\n className: \"manage-column column-country\"\n }, __('Location', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"entry_timestamp\",\n className: \"manage-column column-entry_timestamp\"\n }, __('Last Request', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"status\",\n className: \"manage-column column-status\"\n }, __('Status', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"requests\",\n className: \"manage-column column-requests tbl-width--100px\"\n }, __('Requests and attempts', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"requests_per\",\n className: \"manage-column column-requests_per tbl-width--100px\"\n }, __('Requests per ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, __(' minutes', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"page_url\",\n className: \"manage-column column-page_url\"\n }, __('Page', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"th\", {\n id: \"http_user_agent\",\n className: \"manage-column column-http_user_agent\"\n }, __('User Agent', 'security-malware-firewall')));\n };\n var tableDescription = function tableDescription() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"description-firewall-table\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left\"\n }, __('Requests and attempts - shows the total number of requests with a designated status.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc_hint spbc_hint--left\"\n }, __('Requests per ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, \" \", __('minutes - shows the total number of requests in the last ', 'security-malware-firewall'), sectionData.objects.fw_settings.autoblock_timeframe, \" \", __('minutes', 'security-malware-firewall'), \".\"));\n };\n\n /**\n * Show hostnames under IPs\n */\n function showHostnames() {\n var ips = jQuery.unique(jQuery('#spbc_tbl__traffic_control_logs tbody tr').map(function () {\n return jQuery(this).find('.ip_entry').text();\n }).get());\n getHostNames(ips, showHostnameCallback);\n }\n\n /**\n * Show hostname callback\n * @param {*} result\n * @param {*} data\n */\n function showHostnameCallback(result, data) {\n if (result.success && result.hostnames) {\n var ip;\n var hostname;\n for (var i = 0; i < result.hostnames.length; i++) {\n ip = result.hostnames[i].network;\n hostname = result.hostnames[i].hostname;\n jQuery('#spbc_tbl__traffic_control_logs tbody tr').each(function () {\n if (jQuery(this).find('.ip_entry').text() === ip) {\n jQuery(this).find('.ip_entry').append('
' + hostname);\n }\n });\n }\n }\n }\n\n // Run showMoreButtonListener after showMoreButton renders\n ;(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (sectionData.flags.showMoreButton) {\n showMoreButton();\n showMoreButtonListener();\n } else {\n showControlPanelButton();\n }\n ;(0,_tableSort__WEBPACK_IMPORTED_MODULE_3__.sortTable)();\n (0,_tableSort__WEBPACK_IMPORTED_MODULE_3__.sortTableListener)();\n }, [sectionData.flags.showMoreButton, sectionData.objects.rows]);\n if (!sectionData.flags.is_key_ok) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tab-traffic_control\",\n className: \"spbc_tab spbc_tab-traffic_control spbc_tab_section--active\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'contents'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n margin: '10px auto',\n textAlign: 'center'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", {\n style: {\n margin: '5px',\n display: 'inline-block'\n }\n }, __('Plugin does not work until you enter the Access key in ', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: '/wp-admin/options-general.php?page=spbc&spbc_tab=settings_general'\n }, __('General settings', 'security-malware-firewall')), \".\"))))));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_tab-traffic_control\",\n className: \"spbc_tab spbc_tab-traffic_control spbc_tab_section--\".concat(isActive ? 'active' : 'inactive')\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'contents'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, topInfoText(), table(tableRows), moreLogsButtons(), tableDescription()))));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFirewall/TabFirewall.js?\n}"); /***/ }, @@ -466,7 +466,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\": () => (__WEBPACK_DEFAULT_EXPORT__)\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__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\nvar FSWPreloader = function FSWPreloader(_ref) {\n var isVisible = _ref.isVisible,\n _ref$style = _ref.style,\n style = _ref$style === void 0 ? {} : _ref$style,\n _ref$id = _ref.id,\n id = _ref$id === void 0 ? 'fsw_preloader_default' : _ref$id;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: _objectSpread({\n display: isVisible ? 'inline' : 'none',\n marginLeft: '10px',\n marginTop: '1px',\n width: '16px'\n }, style),\n src: \"../../wp-content/plugins/security-malware-firewall/images/preloader2.gif\",\n alt: \"Loading...\",\n id: id\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FSWPreloader);\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFsWatcher/FSWPreloader.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\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__);\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n;\nvar FSWPreloader = function FSWPreloader(_ref) {\n var isVisible = _ref.isVisible,\n _ref$style = _ref.style,\n style = _ref$style === void 0 ? {} : _ref$style,\n _ref$id = _ref.id,\n id = _ref$id === void 0 ? 'fsw_preloader_default' : _ref$id;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"img\", {\n style: _objectSpread({\n display: isVisible ? 'inline' : 'none',\n marginLeft: '10px',\n marginTop: '1px',\n width: '16px'\n }, style),\n src: \"../../wp-content/plugins/security-malware-firewall/images/preloader2.gif\",\n alt: \"Loading...\",\n id: id\n });\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FSWPreloader);\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFsWatcher/FSWPreloader.js?\n}"); /***/ }, @@ -476,7 +476,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 */ TabFsWatchers)\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/TabFsWatcher/styles.css\");\n/* harmony import */ var _FSWPreloader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FSWPreloader */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWPreloader.js\");\n/* harmony import */ var _FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FSWComparisonSelectComponent */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWComparisonSelectComponent.js\");\n/* harmony import */ var _ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../ReactFileViewDialog/ReactFileViewDialog */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js\");\n/* harmony import */ var _ReactFileViewDialog_ReactFileViewContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ReactFileViewDialog/ReactFileViewContent */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewContent.js\");\n/* harmony import */ var _FSWComparisonTable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FSWComparisonTable */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWComparisonTable.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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\nvar __ = wp.i18n.__;\nfunction TabFsWatchers(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n // ---State vars---\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n firstDate = _useState2[0],\n setFirstDate = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState4 = _slicedToArray(_useState3, 2),\n secondDate = _useState4[0],\n setSecondDate = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState6 = _slicedToArray(_useState5, 2),\n comparisonData = _useState6[0],\n setComparisonData = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isLoadingCompare = _useState8[0],\n setIsLoadingCompare = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isLoadingCreate = _useState0[0],\n setIsLoadingCreate = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState10 = _slicedToArray(_useState1, 2),\n fileContent = _useState10[0],\n setFileContent = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n isDialogOpen = _useState12[0],\n setIsDialogOpen = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState14 = _slicedToArray(_useState13, 2),\n dialogTitle = _useState14[0],\n setDialogTitle = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState16 = _slicedToArray(_useState15, 2),\n isLoadingFile = _useState16[0],\n setIsLoadingFile = _useState16[1];\n\n // ---On page load effects---\n\n // Selectors initialize\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var datesObject = sectionData.objects.selectorOptionsDates;\n if (datesObject.length > 0) {\n var _datesObject$, _datesObject;\n setFirstDate(((_datesObject$ = datesObject[0]) === null || _datesObject$ === void 0 ? void 0 : _datesObject$.value) || '');\n setSecondDate(((_datesObject = datesObject[datesObject.length - 1]) === null || _datesObject === void 0 ? void 0 : _datesObject.value) || '');\n }\n }, [sectionData.objects.selectorOptionsDates]);\n\n // Automatic compare if any of selectors data prepared\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (firstDate && secondDate) {\n handleCompare();\n }\n }, [firstDate, secondDate]);\n\n // ---Callbacks---\n\n // Comparison logic callback\n var handleCompare = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var data, response, responseDataObj, availableFSWDataSetNames, _i, _availableFSWDataSetN, dataSetName, tableData, hasChanges, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(!firstDate || !secondDate)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setIsLoadingCompare(true);\n data = {\n action: 'spbct_fswatcher_compare',\n fswatcher__first_date: firstDate,\n fswatcher__second_date: secondDate\n };\n _context.p = 2;\n _context.n = 3;\n return fswAjaxWrapper(data);\n case 3:\n response = _context.v;\n responseDataObj = typeof response === 'string' ? JSON.parse(response) : response;\n if (!responseDataObj.error) {\n _context.n = 4;\n break;\n }\n alert(__('File System watcher JSON parse error: see console for details.', 'security-malware-firewall'));\n console.log('File System watcher JSON parse error: ' + responseDataObj.error);\n return _context.a(2);\n case 4:\n if (!(!responseDataObj || _typeof(responseDataObj) !== 'object')) {\n _context.n = 5;\n break;\n }\n throw new Error(__('Response is invalid.', 'security-malware-firewall'));\n case 5:\n availableFSWDataSetNames = ['added', 'changed', 'deleted'];\n _i = 0, _availableFSWDataSetN = availableFSWDataSetNames;\n case 6:\n if (!(_i < _availableFSWDataSetN.length)) {\n _context.n = 8;\n break;\n }\n dataSetName = _availableFSWDataSetN[_i];\n if (responseDataObj.hasOwnProperty(dataSetName)) {\n _context.n = 7;\n break;\n }\n throw new Error(__('Response has no required properties.', 'security-malware-firewall'));\n case 7:\n _i++;\n _context.n = 6;\n break;\n case 8:\n // Data transforming\n tableData = [];\n hasChanges = false;\n availableFSWDataSetNames.forEach(function (eventType) {\n var eventsArray = responseDataObj[eventType];\n if (eventsArray.length > 0) {\n hasChanges = true;\n eventsArray.forEach(function (event) {\n tableData.push(convertFSWEventToRow(event, eventType));\n });\n }\n });\n if (!hasChanges) {\n tableData.push({\n path: '',\n event_type: 'no_changes',\n date: '',\n isNoChanges: true\n });\n }\n setComparisonData(tableData);\n _context.n = 10;\n break;\n case 9:\n _context.p = 9;\n _t = _context.v;\n alert(_t.message + ' ' + __('Please contact', 'security-malware-firewall') + ' support@cleantalk.org');\n console.log('File System watcher response validating error: ' + _t.message);\n case 10:\n _context.p = 10;\n setIsLoadingCompare(false);\n return _context.f(10);\n case 11:\n return _context.a(2);\n }\n }, _callee, null, [[2, 9, 10, 11]]);\n })), [firstDate, secondDate]);\n\n // Snap creation logic callback\n var handleCreateSnapshot = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var data, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n setIsLoadingCreate(true);\n data = {\n action: 'spbct_fswatcher_create_snapshot'\n };\n _context2.p = 1;\n _context2.n = 2;\n return fswAjaxWrapper(data);\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error creating snapshot:', _t2);\n case 4:\n _context2.p = 4;\n setIsLoadingCreate(false);\n // TODO crunch, we need to rebuild page without reloading\n window.location.reload();\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3, 4, 5]]);\n })), []);\n\n // View file callback\n var handleViewFile = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(filePath) {\n var data, response, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.p = _context3.n) {\n case 0:\n setDialogTitle(__('Content of', 'security-malware-firewall') + ' ' + filePath);\n setIsDialogOpen(true);\n setIsLoadingFile(true);\n setFileContent(null);\n data = {\n action: 'spbct_fswatcher_view_file',\n fswatcher_file_path: filePath,\n fswatcher__first_date: firstDate,\n fswatcher__second_date: secondDate\n };\n _context3.p = 1;\n _context3.n = 2;\n return fswAjaxWrapper(data);\n case 2:\n response = _context3.v;\n if (response.error) {\n setFileContent([response.error]);\n } else if (response.data) {\n setFileContent(response.data.split('\\n'));\n } else {\n setFileContent(['Unknown error on reading file. Data is empty.']);\n }\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t3 = _context3.v;\n setFileContent([\"Error loading file: \".concat(_t3.message)]);\n case 4:\n _context3.p = 4;\n setIsLoadingFile(false);\n return _context3.f(4);\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 3, 4, 5]]);\n }));\n return function (_x) {\n return _ref4.apply(this, arguments);\n };\n }(), [firstDate, secondDate]);\n\n // Callback promise wrapper\n var fswAjaxWrapper = function fswAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n\n // --Misc--\n\n var closeDialog = function closeDialog() {\n setIsDialogOpen(false);\n setFileContent(null);\n setDialogTitle('');\n setIsLoadingFile(false);\n };\n var convertFSWEventToRow = function convertFSWEventToRow(event, eventType) {\n var row = {\n path: 'unknown',\n event_type: eventType.toUpperCase(),\n date: 'unknown',\n isNoChanges: false\n };\n if (event.length === 2) {\n if (typeof event[0] === 'string') {\n row.path = event[0];\n }\n if (typeof event[1] === 'string') {\n var d = new Date(Number(event[1]) * 1000);\n var shortMonthName = new Intl.DateTimeFormat('en-US', {\n month: 'short'\n }).format;\n var minutes = String(d.getMinutes()).padStart(2, '0');\n var seconds = String(d.getSeconds()).padStart(2, '0');\n row.date = \"\".concat(shortMonthName(d), \" \").concat(d.getDate(), \" \").concat(d.getFullYear(), \" \").concat(d.getHours(), \":\").concat(minutes, \":\").concat(seconds);\n }\n }\n return row;\n };\n var fswSettingsLink = sectionData.strings.spbcSettingsRootLink + '&spbc_tab=settings_general#spbc_setting_scanner__fs_watcher';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, sectionData.strings.innerHeader)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n padding: '0 0 0 10px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_description_box\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.commonDescription), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.extendedDescriptionPrefix, ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: fswSettingsLink\n }, sectionData.strings.innerHeader), ' ', sectionData.strings.extendedDescriptionPostfix, sectionData.strings.extendedDescription)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_create_snaps_button_area\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"spbc-icon-download\",\n id: \"fswatcher__create_snapshot\",\n onClick: handleCreateSnapshot,\n disabled: isLoadingCreate\n }, sectionData.strings.createSnapButtonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWPreloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isVisible: isLoadingCreate,\n id: 'fsw_preloader__create_snapshot'\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_snaps_not_ready_text\",\n style: {\n display: sectionData.flags.snapshotsAreReady ? 'none' : 'block'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.snapshotNotReadyText1), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.snapshotNotReadyText2)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: sectionData.flags.snapshotsAreReady ? 'block' : 'none'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.compareButtonDescription), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: 'fswatcher__first_date',\n selectLabel: sectionData.strings.firstDateLabel,\n value: firstDate,\n onChange: setFirstDate,\n options: sectionData.objects.selectorOptionsDates\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: 'fswatcher__second_date',\n selectLabel: sectionData.strings.secondDateLabel,\n value: secondDate,\n onChange: setSecondDate,\n options: sectionData.objects.selectorOptionsDates\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'inline',\n alignContent: 'flex-end'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"spbc-icon-exchange\",\n onClick: handleCompare,\n disabled: isLoadingCompare || !firstDate || !secondDate,\n style: {\n minHeight: '30px'\n }\n }, sectionData.strings.compareButtonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWPreloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isVisible: isLoadingCompare,\n id: 'fsw_preloader__compare_snaps'\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonTable__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n comparisonData: comparisonData,\n firstDate: firstDate,\n secondDate: secondDate,\n selectorOptionsDates: sectionData.objects.selectorOptionsDates,\n onViewFile: handleViewFile,\n strings: {\n columnHeaderPath: sectionData.strings.columnHeaderPath,\n columnHeaderEvent: sectionData.strings.columnHeaderEvent,\n columnHeaderChangeOn: sectionData.strings.columnHeaderChangeOn,\n noLogsText: sectionData.strings.noLogsText\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isOpen: isDialogOpen,\n onClose: closeDialog,\n title: dialogTitle,\n maxWidth: \"90%\",\n maxHeight: \"80vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n fileContent: fileContent,\n isLoading: isLoadingFile,\n preloaderStyle: {\n width: '50px',\n height: '50px'\n }\n })))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFsWatcher/TabFsWatchers.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabFsWatchers)\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/TabFsWatcher/styles.css\");\n/* harmony import */ var _FSWPreloader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FSWPreloader */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWPreloader.js\");\n/* harmony import */ var _FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FSWComparisonSelectComponent */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWComparisonSelectComponent.js\");\n/* harmony import */ var _ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../ReactFileViewDialog/ReactFileViewDialog */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js\");\n/* harmony import */ var _ReactFileViewDialog_ReactFileViewContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../ReactFileViewDialog/ReactFileViewContent */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewContent.js\");\n/* harmony import */ var _FSWComparisonTable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FSWComparisonTable */ \"./js/src/react/components/TabContent/TabFsWatcher/FSWComparisonTable.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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\nvar __ = wp.i18n.__;\nfunction TabFsWatchers(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n // ---State vars---\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n firstDate = _useState2[0],\n setFirstDate = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState4 = _slicedToArray(_useState3, 2),\n secondDate = _useState4[0],\n setSecondDate = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),\n _useState6 = _slicedToArray(_useState5, 2),\n comparisonData = _useState6[0],\n setComparisonData = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n isLoadingCompare = _useState8[0],\n setIsLoadingCompare = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState0 = _slicedToArray(_useState9, 2),\n isLoadingCreate = _useState0[0],\n setIsLoadingCreate = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState10 = _slicedToArray(_useState1, 2),\n fileContent = _useState10[0],\n setFileContent = _useState10[1];\n var _useState11 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState12 = _slicedToArray(_useState11, 2),\n isDialogOpen = _useState12[0],\n setIsDialogOpen = _useState12[1];\n var _useState13 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState14 = _slicedToArray(_useState13, 2),\n dialogTitle = _useState14[0],\n setDialogTitle = _useState14[1];\n var _useState15 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState16 = _slicedToArray(_useState15, 2),\n isLoadingFile = _useState16[0],\n setIsLoadingFile = _useState16[1];\n\n // ---On page load effects---\n\n // Selectors initialize\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var datesObject = sectionData.objects.selectorOptionsDates;\n if (datesObject.length > 0) {\n var _datesObject$, _datesObject;\n setFirstDate(((_datesObject$ = datesObject[0]) === null || _datesObject$ === void 0 ? void 0 : _datesObject$.value) || '');\n setSecondDate(((_datesObject = datesObject[datesObject.length - 1]) === null || _datesObject === void 0 ? void 0 : _datesObject.value) || '');\n }\n }, [sectionData.objects.selectorOptionsDates]);\n\n // Automatic compare if any of selectors data prepared\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (firstDate && secondDate) {\n handleCompare();\n }\n }, [firstDate, secondDate]);\n\n // ---Callbacks---\n\n // Comparison logic callback\n var handleCompare = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var data, response, responseDataObj, availableFSWDataSetNames, _i, _availableFSWDataSetN, dataSetName, tableData, hasChanges, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(!firstDate || !secondDate)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setIsLoadingCompare(true);\n data = {\n action: 'spbct_fswatcher_compare',\n fswatcher__first_date: firstDate,\n fswatcher__second_date: secondDate\n };\n _context.p = 2;\n _context.n = 3;\n return fswAjaxWrapper(data);\n case 3:\n response = _context.v;\n responseDataObj = typeof response === 'string' ? JSON.parse(response) : response;\n if (!responseDataObj.error) {\n _context.n = 4;\n break;\n }\n alert(__('File System watcher JSON parse error: see console for details.', 'security-malware-firewall'));\n console.log('File System watcher JSON parse error: ' + responseDataObj.error);\n return _context.a(2);\n case 4:\n if (!(!responseDataObj || _typeof(responseDataObj) !== 'object')) {\n _context.n = 5;\n break;\n }\n throw new Error(__('Response is invalid.', 'security-malware-firewall'));\n case 5:\n availableFSWDataSetNames = ['added', 'changed', 'deleted'];\n _i = 0, _availableFSWDataSetN = availableFSWDataSetNames;\n case 6:\n if (!(_i < _availableFSWDataSetN.length)) {\n _context.n = 8;\n break;\n }\n dataSetName = _availableFSWDataSetN[_i];\n if (responseDataObj.hasOwnProperty(dataSetName)) {\n _context.n = 7;\n break;\n }\n throw new Error(__('Response has no required properties.', 'security-malware-firewall'));\n case 7:\n _i++;\n _context.n = 6;\n break;\n case 8:\n // Data transforming\n tableData = [];\n hasChanges = false;\n availableFSWDataSetNames.forEach(function (eventType) {\n var eventsArray = responseDataObj[eventType];\n if (eventsArray.length > 0) {\n hasChanges = true;\n eventsArray.forEach(function (event) {\n tableData.push(convertFSWEventToRow(event, eventType));\n });\n }\n });\n if (!hasChanges) {\n tableData.push({\n path: '',\n event_type: 'no_changes',\n date: '',\n isNoChanges: true\n });\n }\n setComparisonData(tableData);\n _context.n = 10;\n break;\n case 9:\n _context.p = 9;\n _t = _context.v;\n alert(_t.message + ' ' + __('Please contact', 'security-malware-firewall') + ' support@cleantalk.org');\n console.log('File System watcher response validating error: ' + _t.message);\n case 10:\n _context.p = 10;\n setIsLoadingCompare(false);\n return _context.f(10);\n case 11:\n return _context.a(2);\n }\n }, _callee, null, [[2, 9, 10, 11]]);\n })), [firstDate, secondDate]);\n\n // Snap creation logic callback\n var handleCreateSnapshot = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var data, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n setIsLoadingCreate(true);\n data = {\n action: 'spbct_fswatcher_create_snapshot'\n };\n _context2.p = 1;\n _context2.n = 2;\n return fswAjaxWrapper(data);\n case 2:\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n console.error('Error creating snapshot:', _t2);\n case 4:\n _context2.p = 4;\n setIsLoadingCreate(false);\n // TODO crunch, we need to rebuild page without reloading\n window.location.reload();\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[1, 3, 4, 5]]);\n })), []);\n\n // View file callback\n var handleViewFile = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(filePath) {\n var data, response, _t3;\n return _regenerator().w(function (_context3) {\n while (1) switch (_context3.p = _context3.n) {\n case 0:\n setDialogTitle(__('Content of', 'security-malware-firewall') + ' ' + filePath);\n setIsDialogOpen(true);\n setIsLoadingFile(true);\n setFileContent(null);\n data = {\n action: 'spbct_fswatcher_view_file',\n fswatcher_file_path: filePath,\n fswatcher__first_date: firstDate,\n fswatcher__second_date: secondDate\n };\n _context3.p = 1;\n _context3.n = 2;\n return fswAjaxWrapper(data);\n case 2:\n response = _context3.v;\n if (response.error) {\n setFileContent([response.error]);\n } else if (response.data) {\n setFileContent(response.data.split('\\n'));\n } else {\n setFileContent(['Unknown error on reading file. Data is empty.']);\n }\n _context3.n = 4;\n break;\n case 3:\n _context3.p = 3;\n _t3 = _context3.v;\n setFileContent([\"Error loading file: \".concat(_t3.message)]);\n case 4:\n _context3.p = 4;\n setIsLoadingFile(false);\n return _context3.f(4);\n case 5:\n return _context3.a(2);\n }\n }, _callee3, null, [[1, 3, 4, 5]]);\n }));\n return function (_x) {\n return _ref4.apply(this, arguments);\n };\n }(), [firstDate, secondDate]);\n\n // Callback promise wrapper\n var fswAjaxWrapper = function fswAjaxWrapper(data) {\n return new Promise(function (resolve, reject) {\n var params = {\n callback: function callback(response) {\n if (_typeof(response) === 'object' && response.error) {\n reject(new Error(response.error));\n } else {\n resolve(response);\n }\n },\n error_callback: function error_callback(error) {\n reject(error);\n }\n };\n spbcSendAJAXRequest(data, params);\n });\n };\n\n // --Misc--\n\n var closeDialog = function closeDialog() {\n setIsDialogOpen(false);\n setFileContent(null);\n setDialogTitle('');\n setIsLoadingFile(false);\n };\n var convertFSWEventToRow = function convertFSWEventToRow(event, eventType) {\n var row = {\n path: 'unknown',\n event_type: eventType.toUpperCase(),\n date: 'unknown',\n isNoChanges: false\n };\n if (event.length === 2) {\n if (typeof event[0] === 'string') {\n row.path = event[0];\n }\n if (typeof event[1] === 'string') {\n var d = new Date(Number(event[1]) * 1000);\n var shortMonthName = new Intl.DateTimeFormat('en-US', {\n month: 'short'\n }).format;\n var minutes = String(d.getMinutes()).padStart(2, '0');\n var seconds = String(d.getSeconds()).padStart(2, '0');\n row.date = \"\".concat(shortMonthName(d), \" \").concat(d.getDate(), \" \").concat(d.getFullYear(), \" \").concat(d.getHours(), \":\").concat(minutes, \":\").concat(seconds);\n }\n }\n return row;\n };\n var fswSettingsLink = sectionData.strings.spbcSettingsRootLink + '&spbc_tab=settings_general#spbc_setting_scanner__fs_watcher';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, sectionData.strings.innerHeader)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n padding: '0 0 0 10px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_description_box\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.commonDescription), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.extendedDescriptionPrefix, ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: fswSettingsLink\n }, sectionData.strings.innerHeader), ' ', sectionData.strings.extendedDescriptionPostfix, sectionData.strings.extendedDescription)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_create_snaps_button_area\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"spbc-icon-download\",\n id: \"fswatcher__create_snapshot\",\n onClick: handleCreateSnapshot,\n disabled: isLoadingCreate\n }, sectionData.strings.createSnapButtonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWPreloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isVisible: isLoadingCreate,\n id: 'fsw_preloader__create_snapshot'\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc_fswatcher_snaps_not_ready_text\",\n style: {\n display: sectionData.flags.snapshotsAreReady ? 'none' : 'block'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.snapshotNotReadyText1), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.snapshotNotReadyText2)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: sectionData.flags.snapshotsAreReady ? 'block' : 'none'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sectionData.strings.compareButtonDescription), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '16px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: 'fswatcher__first_date',\n selectLabel: sectionData.strings.firstDateLabel,\n value: firstDate,\n onChange: setFirstDate,\n options: sectionData.objects.selectorOptionsDates\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonSelectComponent__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n className: 'fswatcher__second_date',\n selectLabel: sectionData.strings.secondDateLabel,\n value: secondDate,\n onChange: setSecondDate,\n options: sectionData.objects.selectorOptionsDates\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n display: 'inline',\n alignContent: 'flex-end'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n className: \"spbc-icon-exchange\",\n onClick: handleCompare,\n disabled: isLoadingCompare || !firstDate || !secondDate,\n style: {\n minHeight: '30px'\n }\n }, sectionData.strings.compareButtonText), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWPreloader__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isVisible: isLoadingCompare,\n id: 'fsw_preloader__compare_snaps'\n }))))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FSWComparisonTable__WEBPACK_IMPORTED_MODULE_6__[\"default\"], {\n comparisonData: comparisonData,\n firstDate: firstDate,\n secondDate: secondDate,\n selectorOptionsDates: sectionData.objects.selectorOptionsDates,\n onViewFile: handleViewFile,\n strings: {\n columnHeaderPath: sectionData.strings.columnHeaderPath,\n columnHeaderEvent: sectionData.strings.columnHeaderEvent,\n columnHeaderChangeOn: sectionData.strings.columnHeaderChangeOn,\n noLogsText: sectionData.strings.noLogsText\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n isOpen: isDialogOpen,\n onClose: closeDialog,\n title: dialogTitle,\n maxWidth: \"90%\",\n maxHeight: \"80vh\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n fileContent: fileContent,\n isLoading: isLoadingFile,\n preloaderStyle: {\n width: '50px',\n height: '50px'\n }\n })))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabFsWatcher/TabFsWatchers.js?\n}"); /***/ }, @@ -486,7 +486,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 */ TabScanner)\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/TabScanner/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\");\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread 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 _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\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; }\n\n\n\nfunction TabScanner(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n /**\n * Show popup tip\n *\n * @param {object} showIcon\n */\n window.spbcPopupTipShow = function (showIcon) {\n // eslint-disable-line no-unused-vars\n var tipTitle = showIcon.attr('spbc_tip_title') || null;\n var tipText = showIcon.attr('spbc_tip_text') || null;\n var _removeDescFunc = function removeDescFunc(e) {\n if (typeof e === 'undefined' || jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 || jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', _removeDescFunc);\n }\n };\n _removeDescFunc();\n showIcon.after('
');\n var obj = jQuery('.spbc_popup_tip--wrapper');\n obj.empty().append('
').css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25\n });\n obj.append('').append('

' + tipTitle + '

').append('

' + tipText + '

');\n jQuery(document).on('click', _removeDescFunc);\n showIcon.parents('tr').on('mouseout', _removeDescFunc);\n };\n\n /**\n * View file in the scanner\n *\n * @param {object} obj\n */\n window.spbcScannerButtonFileViewEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n document.addEventListener('spbcModalClosed', function (e) {\n spbcReloadAccordion();\n });\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\n window.spbcScannerAnalysisLogDeleteFromLog = function (obj) {\n // eslint-disable-line no-unused-vars\n var fileIds = [];\n var self = jQuery(obj);\n var spinner;\n if (jQuery(obj).hasClass('tbl-row_action')) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n var selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n selectedItems.each(function (index, element) {\n var elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n var data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds\n };\n var params = {\n spinner: spinner,\n callback: function callback() {\n window.location.reload();\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * View page in the scanner\n *\n * @param {object} obj\n */\n window.spbcScannerButtonPageViewEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n var wpWrap = jQuery('#wpwrap');\n var dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(wpWrap.width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height(document.documentElement.clientHeight / 100 * 25);\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n dialogWindow.append('\"Wait');\n var spinner = jQuery('#spbc_file_view_preloader');\n var sizeMultiplier = wpWrap.width() * 0.0004;\n spinner.height(128 * sizeMultiplier);\n spinner.width(128 * sizeMultiplier);\n spinner.css({\n left: dialogWindow.width() / 2 - 128 * sizeMultiplier / 2\n });\n spinner.css({\n top: dialogWindow.height() / 2 - 128 * sizeMultiplier / 2\n });\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Callback for file view\n *\n * @param {object} result\n */\n function spbcScannerButtonViewCallback(result) {\n // eslint-disable-line no-unused-vars\n var dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.empty();\n jQuery('#spbc_file_view_preloader').css({\n display: 'none'\n });\n var rowTemplate = '
%s';\n rowTemplate += '

%s


';\n\n /* eslint-disable guard-for-in */\n for (var row in result.file) {\n dialogWindow.append(rowTemplate.printf(row, result.file[row]));\n }\n var contentHeight = Object.keys(result.file).length * 19 < 76 ? 76 : Object.keys(result.file).length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var overflow = contentHeight < visibleHeight ? 'hidden' : 'scroll';\n var height = overflow === 'scroll' ? visibleHeight : contentHeight;\n dialogWindow.css({\n height: height,\n overflow: overflow\n });\n dialogWindow.dialog({\n modal: true,\n title: 'Loaded: ' + result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n height: height,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n console.log('FILE_VIEWED');\n }\n\n /**\n * Event for file view bad\n *\n * @param {object} obj\n */\n window.spbcScannerButtonFileViewBadEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadFileCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Event for page view bad\n *\n * @param {object} obj\n */\n window.spbcScannerButtonPageViewBadEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parent().attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\n function spbcScannerButtonViewBadFileCallback(result, data, params) {\n // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE_FILE');\n jQuery('#spbc_dialog').empty();\n var rowTemplate = '
%s';\n rowTemplate += '

%s


';\n var rowTemplateBad = '
';\n rowTemplateBad += '%s';\n rowTemplateBad += '

%s


';\n var severityParts = [];\n var severityPartsSorted = [];\n var severityKeysSorted = [];\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (var severity in result.weak_spots) {\n severityParts[severity] = Object.keys(result.weak_spots[severity]);\n }\n severityKeysSorted = Object.keys(severityParts).sort();\n\n /* eslint-disable guard-for-in */\n for (var key in severityKeysSorted) {\n severityPartsSorted[severityKeysSorted[key]] = severityParts[severityKeysSorted[key]];\n }\n\n /* eslint-disable guard-for-in */\n for (var severityPart in severityPartsSorted) {\n var headerName = 'spbc-dialog-row-header-' + severityPart.toLowerCase();\n var headerHtml = '';\n headerHtml += severityPart + ' weakspots:';\n var dialog = jQuery('#spbc_dialog');\n dialog.append(rowTemplate.printf('', headerHtml));\n dialog.append(rowTemplate.printf('...', '...'));\n var header = dialog.find('#' + headerName);\n header.parent().parent().css('text-align', 'center');\n header.parent().parent().css('border', '1px dotted');\n header.parent().parent().css('background', 'darkgrey');\n\n /* eslint-disable guard-for-in */\n for (var strNum in severityParts[severityPart]) {\n // Sort bad line\n strNum = _toConsumableArray(new Set(strNum)).sort();\n var row = +severityParts[severityPart][strNum];\n var displayDepth = 2;\n var temp = void 0;\n // Display only existing lines of file\n for (var currRow = row - displayDepth; currRow <= row + displayDepth; currRow++) {\n if (typeof result.file[currRow] !== 'undefined') {\n temp = row === currRow ? rowTemplateBad : rowTemplate;\n dialog.append(temp.printf(currRow, result.file[currRow]));\n }\n }\n\n // Placing an empty string between results\n dialog.append(rowTemplate.printf('...', '...'));\n }\n }\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n var contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n var height = overflow === 'scroll' ? visibleHeight : contentHeight;\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n }\n\n /**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\n function spbcScannerButtonViewBadCallback(result, data, params) {\n // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE');\n var afterClose = function afterClose() {};\n if (result.success == true) {\n console.log(result);\n var rowTemplate = '
' + '%s' + '

%s

' + '
';\n var rowTemplateBad = '
' + '%s' + '

%s

' + '
';\n var strNums = [];\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (var severity in result.weak_spots) {\n strNums = strNums.concat(Object.keys(result.weak_spots[severity]));\n }\n strNums = _toConsumableArray(new Set(strNums)).sort(); // Sort bad line\n // get a map of bad strings\n // TODO: Probably there can get something else except CRITICAL in the future\n var badStringsMap = new Map(Object.entries(result.weak_spots.CRITICAL));\n /* eslint-disable guard-for-in */\n for (var strNum in strNums) {\n if (strNum == 0 && badStringsMap.get(strNums[strNum]).toLowerCase().includes('doctype')) {\n continue;\n }\n var row = +strNums[strNum];\n var displayDepth = 2;\n\n // Display only existing lines of file\n for (var currRow = row - displayDepth; currRow <= row + displayDepth; currRow++) {\n if (typeof result.file[currRow] !== 'undefined') {\n var isBadString = row === currRow;\n var unformattedRow = void 0;\n var highlitedRow = void 0;\n if (isBadString) {\n unformattedRow = rowTemplateBad;\n } else {\n unformattedRow = rowTemplate;\n }\n if (isBadString && !result.file[currRow].includes('iframe')) {\n highlitedRow = unformattedRow.printf(currRow, badStringsMap.get(strNums[strNum]));\n } else {\n highlitedRow = unformattedRow.printf(currRow, result.file[currRow]);\n }\n jQuery('#spbc_dialog').append(highlitedRow);\n }\n }\n\n // Placing an empty string between results\n jQuery('#spbc_dialog').append(rowTemplate.printf('', ''));\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n }\n } else {\n var wrapperElement = '
%s
';\n jQuery('#spbc_dialog').append(wrapperElement.printf(result.content));\n afterClose = function afterClose() {\n document.location.reload();\n };\n }\n var contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var height = 'auto';\n var overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n close: afterClose\n });\n }\n\n /**\n * Cure file\n * @param {object} obj\n */\n window.spbcScannerButtonCureFileAjaxHandler = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var fileFastHash = self.parents('.row-actions').attr('uid');\n var data = {\n action: 'spbc_file_cure_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce\n };\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n } else {\n spbcModal.open().putError(result.data);\n }\n }\n });\n };\n\n /**\n * Restore file from backup\n * @param {object} obj\n */\n window.spbcScannerButtonRestoreFromBackupAjaxHandler = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var fileFastHash = self.parents('.row-actions').attr('uid');\n var data = {\n action: 'spbc_restore_file_from_backup_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce\n };\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n } else {\n spbcModal.open().putError(result.data);\n }\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n }\n });\n };\n\n /**\n * Show copy log to clipboard hint\n * @param {string} text\n */\n function spbcScannerCopyLogToClipboardHint(text) {\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').text(text);\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').show();\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').animate({\n opacity: 0\n }, 3000, function () {\n jQuery(this).hide();\n jQuery(this).css('opacity', 1);\n });\n }\n jQuery(document).ready(function () {\n // EVENT HADLING\n spbcTblBulkActionsListen(); // Table. Row bulk handler\n spbcTblRowActionsListen(); // Table. Row actions handler\n spbcTblPaginationListen(); // Table. Pagination handler\n spbcTblSortListen(); // Table. Sort handler\n\n spbcStartShowHide();\n\n // Preparing progressbar\n jQuery('#spbc_scaner_progress_bar').progressbar({\n value: 0,\n create: function create(event, ui) {\n event.target.style.position = 'relative';\n event.target.style.marginBottom = '12px';\n },\n change: function change(event, ui) {\n jQuery('.spbc_progressbar_counter span').text(jQuery(event.target).progressbar('option', 'value') + ' %');\n }\n });\n\n // Init scanner plugin\n window.spbcScanner = new SpbcMalwareScanner({\n settings: spbcScaner.settings,\n states: spbcScaner.states,\n button: jQuery('#spbc_perform_scan'),\n spinner: jQuery('#spbc_perform_scan').next(),\n callback: null,\n progress_overall: jQuery('#spbc_scaner_progress_overall'),\n progressbar: jQuery('#spbc_scaner_progress_bar'),\n progressbar_text: jQuery('.spbc_progressbar_counter span'),\n wrapper: document.getElementsByClassName('spbc_unchecked_file_list'),\n warnings: {\n long_scan: jQuery('.spbc_hint_warning__long_scan'),\n outdated: jQuery('.spbc_hint_warning__outdated')\n }\n });\n jQuery(document).on('click', '.spbc_popup_tip--icon---show', function () {\n spbcPopupTipShow(jQuery(this));\n });\n jQuery('#spbc_perform_scan').on('click', function () {\n jQuery('#spbcscan-results-log-module').remove();\n spbcScanner.actionControl();\n if (!jQuery('.spbc_log-wrapper .panel-body').length) {\n jQuery('.spbc_log-wrapper').append('
');\n }\n jQuery('.spbc_log-wrapper').resizable({\n handles: 'n, s',\n containment: 'document'\n });\n });\n jQuery('#spbcscan-results-log-module').resizable({\n handles: 'n, s',\n containment: 'document'\n });\n logActionsHandleClearLogs();\n logActionsHandleSaveToPDF();\n logActionsHandleMoreLogs();\n logActionsHandleCopyToClipboard();\n });\n function logActionsHandleClearLogs() {\n // Clear scanner's tables\n jQuery('#spbc_scanner_clear').on('click', function () {\n // eslint-disable-line no-unused-vars\n if (!confirm(spbcSettings.clear_results_confirm)) {\n return;\n }\n spbcSendAJAXRequest({\n action: 'spbc_scanner_clear'\n }, {\n type: 'GET',\n successCallback: function successCallback() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function success() {\n document.location.reload();\n }\n });\n });\n }\n function logActionsHandleSaveToPDF() {\n jQuery('#spbc_scanner_save_to_pdf').on('click', function () {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_save_to_pdf',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random()\n },\n xhrFields: {\n responseType: 'blob'\n },\n success: function success(data) {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_get_pdf_file_name',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random()\n },\n xhrFields: {\n responseType: 'text'\n },\n success: function success(filename) {\n var blob = new Blob([data]);\n var link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename.data;\n link.click();\n }\n });\n }\n });\n });\n }\n function logActionsHandleCopyToClipboard() {\n if (jQuery('#spbc_scanner_copy_log_to_clipboard').length) {\n jQuery('#spbc_scanner_copy_log_to_clipboard').on('click', function (e) {\n e.preventDefault();\n if (navigator.clipboard) {\n var log = jQuery('#spbcscan-results-log-module .panel-body').html();\n var formattedLog = log.replace(//g, '').replace(/<\\/b>/g, '');\n formattedLog = formattedLog.replace(/

/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(function () {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n })[\"catch\"](function (err) {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n }\n function logActionsHandleMoreLogs() {\n var element = jQuery('#spbcscan_results_log_body');\n var logAppendPreloader = jQuery('#spbcscan_results_log_preloader');\n if (!element || !logAppendPreloader) {\n return;\n }\n element.on('scroll', function () {\n // Check if load completed\n if (jQuery(this).data('stop-load')) {\n return;\n }\n\n // Is end of scroll\n var isAtBottom = this.scrollHeight - this.scrollTop <= this.clientHeight + 1;\n if (isAtBottom) {\n var $this = jQuery(this);\n var currentOffset = parseInt($this.data('offset')) || 0;\n logAppendPreloader.css('visibility', 'visible');\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_load_more_scan_logs',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n offset: currentOffset\n },\n xhrFields: {\n responseType: 'text'\n },\n success: function success(data) {\n if (data.success && data.data) {\n // increase and set new offset\n var newOffset = currentOffset + 100;\n $this.data('offset', newOffset);\n\n // add html to the log\n jQuery('#spbcscan_results_log_body').append(data.data);\n\n // if no data - stop load\n if (data.data.length === 0 || data.data.trim() === '') {\n $this.data('stop-load', 1);\n }\n } else {\n $this.data('stop-load', 1);\n }\n logAppendPreloader.css('visibility', 'hidden');\n },\n error: function error(xhr, status, _error) {\n logAppendPreloader.css('visibility', 'hidden');\n $this.data('stop-load', 1);\n }\n });\n }\n });\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabContentTypes_Html_TabContentHtml__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sectionId: sectionId,\n sectionData: sectionData,\n isActive: isActive\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabScanner/TabScanner.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabScanner)\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/TabScanner/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\");\nfunction _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread 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 _iterableToArray(r) { if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r); }\nfunction _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }\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; }\n;\n\n\nfunction TabScanner(_ref) {\n var sectionId = _ref.sectionId,\n sectionData = _ref.sectionData,\n isActive = _ref.isActive;\n /**\n * Show popup tip\n *\n * @param {object} showIcon\n */\n window.spbcPopupTipShow = function (showIcon) {\n // eslint-disable-line no-unused-vars\n var tipTitle = showIcon.attr('spbc_tip_title') || null;\n var tipText = showIcon.attr('spbc_tip_text') || null;\n var _removeDescFunc = function removeDescFunc(e) {\n if (typeof e === 'undefined' || jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 || jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', _removeDescFunc);\n }\n };\n _removeDescFunc();\n showIcon.after('

');\n var obj = jQuery('.spbc_popup_tip--wrapper');\n obj.empty().append('
').css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25\n });\n obj.append('').append('

' + tipTitle + '

').append('

' + tipText + '

');\n jQuery(document).on('click', _removeDescFunc);\n showIcon.parents('tr').on('mouseout', _removeDescFunc);\n };\n\n /**\n * View file in the scanner\n *\n * @param {object} obj\n */\n window.spbcScannerButtonFileViewEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n document.addEventListener('spbcModalClosed', function (e) {\n spbcReloadAccordion();\n });\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\n window.spbcScannerAnalysisLogDeleteFromLog = function (obj) {\n // eslint-disable-line no-unused-vars\n var fileIds = [];\n var self = jQuery(obj);\n var spinner;\n if (jQuery(obj).hasClass('tbl-row_action')) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n var selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n selectedItems.each(function (index, element) {\n var elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n var data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds\n };\n var params = {\n spinner: spinner,\n callback: function callback() {\n window.location.reload();\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * View page in the scanner\n *\n * @param {object} obj\n */\n window.spbcScannerButtonPageViewEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n var wpWrap = jQuery('#wpwrap');\n var dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(wpWrap.width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height(document.documentElement.clientHeight / 100 * 25);\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n dialogWindow.append('\"Wait');\n var spinner = jQuery('#spbc_file_view_preloader');\n var sizeMultiplier = wpWrap.width() * 0.0004;\n spinner.height(128 * sizeMultiplier);\n spinner.width(128 * sizeMultiplier);\n spinner.css({\n left: dialogWindow.width() / 2 - 128 * sizeMultiplier / 2\n });\n spinner.css({\n top: dialogWindow.height() / 2 - 128 * sizeMultiplier / 2\n });\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Callback for file view\n *\n * @param {object} result\n */\n function spbcScannerButtonViewCallback(result) {\n // eslint-disable-line no-unused-vars\n var dialogWindow = jQuery('#spbc_dialog');\n dialogWindow.empty();\n jQuery('#spbc_file_view_preloader').css({\n display: 'none'\n });\n var rowTemplate = '
%s';\n rowTemplate += '

%s


';\n\n /* eslint-disable guard-for-in */\n for (var row in result.file) {\n dialogWindow.append(rowTemplate.printf(row, result.file[row]));\n }\n var contentHeight = Object.keys(result.file).length * 19 < 76 ? 76 : Object.keys(result.file).length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var overflow = contentHeight < visibleHeight ? 'hidden' : 'scroll';\n var height = overflow === 'scroll' ? visibleHeight : contentHeight;\n dialogWindow.css({\n height: height,\n overflow: overflow\n });\n dialogWindow.dialog({\n modal: true,\n title: 'Loaded: ' + result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n height: height,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n console.log('FILE_VIEWED');\n }\n\n /**\n * Event for file view bad\n *\n * @param {object} obj\n */\n window.spbcScannerButtonFileViewBadEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadFileCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Event for page view bad\n *\n * @param {object} obj\n */\n window.spbcScannerButtonPageViewBadEvent = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parent().attr('uid')\n };\n var params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewBadCallback,\n errorOutput: function errorOutput(msg) {\n spbcModal.open().putError(msg);\n }\n };\n spbcSendAJAXRequest(data, params);\n };\n\n /**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\n function spbcScannerButtonViewBadFileCallback(result, data, params) {\n // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE_FILE');\n jQuery('#spbc_dialog').empty();\n var rowTemplate = '
%s';\n rowTemplate += '

%s


';\n var rowTemplateBad = '
';\n rowTemplateBad += '%s';\n rowTemplateBad += '

%s


';\n var severityParts = [];\n var severityPartsSorted = [];\n var severityKeysSorted = [];\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (var severity in result.weak_spots) {\n severityParts[severity] = Object.keys(result.weak_spots[severity]);\n }\n severityKeysSorted = Object.keys(severityParts).sort();\n\n /* eslint-disable guard-for-in */\n for (var key in severityKeysSorted) {\n severityPartsSorted[severityKeysSorted[key]] = severityParts[severityKeysSorted[key]];\n }\n\n /* eslint-disable guard-for-in */\n for (var severityPart in severityPartsSorted) {\n var headerName = 'spbc-dialog-row-header-' + severityPart.toLowerCase();\n var headerHtml = '';\n headerHtml += severityPart + ' weakspots:';\n var dialog = jQuery('#spbc_dialog');\n dialog.append(rowTemplate.printf('', headerHtml));\n dialog.append(rowTemplate.printf('...', '...'));\n var header = dialog.find('#' + headerName);\n header.parent().parent().css('text-align', 'center');\n header.parent().parent().css('border', '1px dotted');\n header.parent().parent().css('background', 'darkgrey');\n\n /* eslint-disable guard-for-in */\n for (var strNum in severityParts[severityPart]) {\n // Sort bad line\n strNum = _toConsumableArray(new Set(strNum)).sort();\n var row = +severityParts[severityPart][strNum];\n var displayDepth = 2;\n var temp = void 0;\n // Display only existing lines of file\n for (var currRow = row - displayDepth; currRow <= row + displayDepth; currRow++) {\n if (typeof result.file[currRow] !== 'undefined') {\n temp = row === currRow ? rowTemplateBad : rowTemplate;\n dialog.append(temp.printf(currRow, result.file[currRow]));\n }\n }\n\n // Placing an empty string between results\n dialog.append(rowTemplate.printf('...', '...'));\n }\n }\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n var contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n var height = overflow === 'scroll' ? visibleHeight : contentHeight;\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n }\n });\n }\n\n /**\n * Callback for file view bad\n *\n * @param {object} result\n * @param {object} data\n * @param {object} params\n */\n function spbcScannerButtonViewBadCallback(result, data, params) {\n // eslint-disable-line no-unused-vars\n console.log('FILE_VIEWED_BAD_CODE');\n var afterClose = function afterClose() {};\n if (result.success == true) {\n console.log(result);\n var rowTemplate = '
' + '%s' + '

%s

' + '
';\n var rowTemplateBad = '
' + '%s' + '

%s

' + '
';\n var strNums = [];\n result.weak_spots = JSON.parse(result.weak_spots);\n /* eslint-disable guard-for-in */\n for (var severity in result.weak_spots) {\n strNums = strNums.concat(Object.keys(result.weak_spots[severity]));\n }\n strNums = _toConsumableArray(new Set(strNums)).sort(); // Sort bad line\n // get a map of bad strings\n // TODO: Probably there can get something else except CRITICAL in the future\n var badStringsMap = new Map(Object.entries(result.weak_spots.CRITICAL));\n /* eslint-disable guard-for-in */\n for (var strNum in strNums) {\n if (strNum == 0 && badStringsMap.get(strNums[strNum]).toLowerCase().includes('doctype')) {\n continue;\n }\n var row = +strNums[strNum];\n var displayDepth = 2;\n\n // Display only existing lines of file\n for (var currRow = row - displayDepth; currRow <= row + displayDepth; currRow++) {\n if (typeof result.file[currRow] !== 'undefined') {\n var isBadString = row === currRow;\n var unformattedRow = void 0;\n var highlitedRow = void 0;\n if (isBadString) {\n unformattedRow = rowTemplateBad;\n } else {\n unformattedRow = rowTemplate;\n }\n if (isBadString && !result.file[currRow].includes('iframe')) {\n highlitedRow = unformattedRow.printf(currRow, badStringsMap.get(strNums[strNum]));\n } else {\n highlitedRow = unformattedRow.printf(currRow, result.file[currRow]);\n }\n jQuery('#spbc_dialog').append(highlitedRow);\n }\n }\n\n // Placing an empty string between results\n jQuery('#spbc_dialog').append(rowTemplate.printf('', ''));\n\n // Removing last empty string\n jQuery('#spbc_dialog div').last().remove();\n }\n } else {\n var wrapperElement = '
%s
';\n jQuery('#spbc_dialog').append(wrapperElement.printf(result.content));\n afterClose = function afterClose() {\n document.location.reload();\n };\n }\n var contentHeight = jQuery('#spbc_dialog div').length * 19 < 76 ? 76 : jQuery('#spbc_dialog div').length * 19;\n var visibleHeight = document.documentElement.clientHeight / 100 * 75;\n var height = 'auto';\n var overflow = contentHeight < visibleHeight ? 'no_scroll' : 'scroll';\n jQuery('#spbc_dialog').dialog({\n modal: true,\n title: result.file_path,\n position: {\n my: 'center top',\n at: 'center top+100px',\n of: window\n },\n width: +(jQuery('#wpwrap').width() / 100 * 80),\n show: {\n effect: 'blind',\n duration: 500\n },\n draggable: true,\n resizable: false,\n closeText: 'X',\n classes: {\n 'ui-dialog': 'spbc---top'\n },\n open: function open(event, ui) {\n event.target.style.overflow = overflow;\n jQuery('#spbc_dialog').height(height);\n jQuery('.ui-widget-overlay').on('click', function () {\n jQuery('#spbc_dialog').dialog('close');\n });\n },\n beforeClose: function beforeClose(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n close: afterClose\n });\n }\n\n /**\n * Cure file\n * @param {object} obj\n */\n window.spbcScannerButtonCureFileAjaxHandler = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var fileFastHash = self.parents('.row-actions').attr('uid');\n var data = {\n action: 'spbc_file_cure_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce\n };\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n } else {\n spbcModal.open().putError(result.data);\n }\n }\n });\n };\n\n /**\n * Restore file from backup\n * @param {object} obj\n */\n window.spbcScannerButtonRestoreFromBackupAjaxHandler = function (obj) {\n // eslint-disable-line no-unused-vars\n var self = jQuery(obj);\n var fileFastHash = self.parents('.row-actions').attr('uid');\n var data = {\n action: 'spbc_restore_file_from_backup_ajax_action',\n file_fast_hash: fileFastHash,\n security: spbcSettings.ajax_nonce\n };\n jQuery.ajax({\n type: 'POST',\n async: true,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function success(result) {\n if (result.success) {\n spbcModal.open().put(result.data);\n } else {\n spbcModal.open().putError(result.data);\n }\n document.addEventListener('spbcModalClosed', function (e) {\n document.location.reload();\n });\n }\n });\n };\n\n /**\n * Show copy log to clipboard hint\n * @param {string} text\n */\n function spbcScannerCopyLogToClipboardHint(text) {\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').text(text);\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').show();\n jQuery('#spbc_scanner_copy_log_to_clipboard_hint').animate({\n opacity: 0\n }, 3000, function () {\n jQuery(this).hide();\n jQuery(this).css('opacity', 1);\n });\n }\n jQuery(document).ready(function () {\n // EVENT HADLING\n spbcTblBulkActionsListen(); // Table. Row bulk handler\n spbcTblRowActionsListen(); // Table. Row actions handler\n spbcTblPaginationListen(); // Table. Pagination handler\n spbcTblSortListen(); // Table. Sort handler\n\n spbcStartShowHide();\n\n // Preparing progressbar\n jQuery('#spbc_scaner_progress_bar').progressbar({\n value: 0,\n create: function create(event, ui) {\n event.target.style.position = 'relative';\n event.target.style.marginBottom = '12px';\n },\n change: function change(event, ui) {\n jQuery('.spbc_progressbar_counter span').text(jQuery(event.target).progressbar('option', 'value') + ' %');\n }\n });\n\n // Init scanner plugin\n window.spbcScanner = new SpbcMalwareScanner({\n settings: spbcScaner.settings,\n states: spbcScaner.states,\n button: jQuery('#spbc_perform_scan'),\n spinner: jQuery('#spbc_perform_scan').next(),\n callback: null,\n progress_overall: jQuery('#spbc_scaner_progress_overall'),\n progressbar: jQuery('#spbc_scaner_progress_bar'),\n progressbar_text: jQuery('.spbc_progressbar_counter span'),\n wrapper: document.getElementsByClassName('spbc_unchecked_file_list'),\n warnings: {\n long_scan: jQuery('.spbc_hint_warning__long_scan'),\n outdated: jQuery('.spbc_hint_warning__outdated')\n }\n });\n jQuery(document).on('click', '.spbc_popup_tip--icon---show', function () {\n spbcPopupTipShow(jQuery(this));\n });\n jQuery('#spbc_perform_scan').on('click', function () {\n jQuery('#spbcscan-results-log-module').remove();\n spbcScanner.actionControl();\n if (!jQuery('.spbc_log-wrapper .panel-body').length) {\n jQuery('.spbc_log-wrapper').append('
');\n }\n jQuery('.spbc_log-wrapper').resizable({\n handles: 'n, s',\n containment: 'document'\n });\n });\n jQuery('#spbcscan-results-log-module').resizable({\n handles: 'n, s',\n containment: 'document'\n });\n logActionsHandleClearLogs();\n logActionsHandleSaveToPDF();\n logActionsHandleMoreLogs();\n logActionsHandleCopyToClipboard();\n });\n function logActionsHandleClearLogs() {\n // Clear scanner's tables\n jQuery('#spbc_scanner_clear').on('click', function () {\n // eslint-disable-line no-unused-vars\n if (!confirm(spbcSettings.clear_results_confirm)) {\n return;\n }\n spbcSendAJAXRequest({\n action: 'spbc_scanner_clear'\n }, {\n type: 'GET',\n successCallback: function successCallback() {\n document.location = document.location;\n },\n complete: null,\n errorOutput: null,\n context: this,\n timeout: 40000,\n success: function success() {\n document.location.reload();\n }\n });\n });\n }\n function logActionsHandleSaveToPDF() {\n jQuery('#spbc_scanner_save_to_pdf').on('click', function () {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_save_to_pdf',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random()\n },\n xhrFields: {\n responseType: 'blob'\n },\n success: function success(data) {\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_get_pdf_file_name',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random()\n },\n xhrFields: {\n responseType: 'text'\n },\n success: function success(filename) {\n var blob = new Blob([data]);\n var link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.download = filename.data;\n link.click();\n }\n });\n }\n });\n });\n }\n function logActionsHandleCopyToClipboard() {\n if (jQuery('#spbc_scanner_copy_log_to_clipboard').length) {\n jQuery('#spbc_scanner_copy_log_to_clipboard').on('click', function (e) {\n e.preventDefault();\n if (navigator.clipboard) {\n var log = jQuery('#spbcscan-results-log-module .panel-body').html();\n var formattedLog = log.replace(//g, '').replace(/<\\/b>/g, '');\n formattedLog = formattedLog.replace(/

/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(function () {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n })[\"catch\"](function (err) {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n }\n function logActionsHandleMoreLogs() {\n var element = jQuery('#spbcscan_results_log_body');\n var logAppendPreloader = jQuery('#spbcscan_results_log_preloader');\n if (!element || !logAppendPreloader) {\n return;\n }\n element.on('scroll', function () {\n // Check if load completed\n if (jQuery(this).data('stop-load')) {\n return;\n }\n\n // Is end of scroll\n var isAtBottom = this.scrollHeight - this.scrollTop <= this.clientHeight + 1;\n if (isAtBottom) {\n var $this = jQuery(this);\n var currentOffset = parseInt($this.data('offset')) || 0;\n logAppendPreloader.css('visibility', 'visible');\n jQuery.ajax({\n url: spbcSettings.ajaxurl,\n type: 'POST',\n data: {\n action: 'spbc_scanner_load_more_scan_logs',\n security: spbcSettings.ajax_nonce,\n no_cache: Math.random(),\n offset: currentOffset\n },\n xhrFields: {\n responseType: 'text'\n },\n success: function success(data) {\n if (data.success && data.data) {\n // increase and set new offset\n var newOffset = currentOffset + 100;\n $this.data('offset', newOffset);\n\n // add html to the log\n jQuery('#spbcscan_results_log_body').append(data.data);\n\n // if no data - stop load\n if (data.data.length === 0 || data.data.trim() === '') {\n $this.data('stop-load', 1);\n }\n } else {\n $this.data('stop-load', 1);\n }\n logAppendPreloader.css('visibility', 'hidden');\n },\n error: function error(xhr, status, _error) {\n logAppendPreloader.css('visibility', 'hidden');\n $this.data('stop-load', 1);\n }\n });\n }\n });\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_TabContentTypes_Html_TabContentHtml__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n sectionId: sectionId,\n sectionData: sectionData,\n isActive: isActive\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabScanner/TabScanner.js?\n}"); /***/ }, @@ -496,7 +496,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 */ TabSecurityCertified)\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 _Preloader_Preloader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Preloader/Preloader */ \"./js/src/react/components/Preloader/Preloader.js\");\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.js\");\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSecurityCertified/styles.css\");\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\nvar __ = wp.i18n.__;\nvar bindPluginDetailsModal = function bindPluginDetailsModal(container) {\n if (!container || container.dataset.pscModalBound) {\n return;\n }\n var $ = window.jQuery;\n if (!$ || typeof window.tb_click !== 'function') {\n return;\n }\n container.dataset.pscModalBound = '1';\n $(container).on('click', '.thickbox.open-plugin-details-modal', function (e) {\n var title = $(this).data('title') ? wp.i18n.sprintf(wp.i18n.__('Plugin: %s', 'security-malware-firewall'), $(this).data('title')) : wp.i18n.__('Plugin details', 'security-malware-firewall');\n e.preventDefault();\n e.stopPropagation();\n window.tb_click.call(this);\n $('#TB_window').attr({\n 'role': 'dialog',\n 'aria-label': wp.i18n.__('Plugin details', 'security-malware-firewall')\n }).addClass('plugin-details-modal');\n $('#TB_window').find('#TB_iframeContent').attr('title', title);\n });\n};\nfunction TabSecurityCertified(_ref) {\n var sectionData = _ref.sectionData;\n var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var sentinelRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var loadingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n var pageRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(1);\n var hasMoreRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n loading = _useState2[0],\n setLoading = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n hasMore = _useState4[0],\n setHasMore = _useState4[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!sectionData) {\n return;\n }\n pageRef.current = sectionData.page || 1;\n hasMoreRef.current = !!sectionData.has_more;\n setHasMore(!!sectionData.has_more);\n }, [sectionData]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!(sectionData !== null && sectionData !== void 0 && sectionData.html) || !containerRef.current) {\n return;\n }\n bindPluginDetailsModal(containerRef.current);\n }, [sectionData === null || sectionData === void 0 ? void 0 : sectionData.html]);\n var loadMore = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var nextPage, _containerRef$current, data, list, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(loadingRef.current || !hasMoreRef.current)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n loadingRef.current = true;\n setLoading(true);\n nextPage = pageRef.current;\n _context.p = 2;\n _context.n = 3;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_2__.sendAjaxRequest)({\n action: 'spbct_get_tab_data',\n tab_name: 'security_certified',\n page: nextPage,\n append: 1\n }, true);\n case 3:\n data = _context.v;\n list = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.querySelector('#the-list');\n if (list && data.rows_html) {\n list.insertAdjacentHTML('beforeend', data.rows_html);\n }\n pageRef.current = data.page || nextPage;\n hasMoreRef.current = !!data.has_more;\n setHasMore(!!data.has_more);\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error('Error loading PSC plugins:', _t);\n case 5:\n _context.p = 5;\n loadingRef.current = false;\n setLoading(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n })), []);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var sentinel = sentinelRef.current;\n if (!sentinel || !hasMore) {\n return;\n }\n var observer = new IntersectionObserver(function (entries) {\n if (entries.some(function (entry) {\n return entry.isIntersecting;\n })) {\n loadMore();\n }\n }, {\n root: null,\n rootMargin: '200px',\n threshold: 0\n });\n observer.observe(sentinel);\n return function () {\n return observer.disconnect();\n };\n }, [hasMore, loadMore, sectionData]);\n if (!sectionData || !sectionData.html) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, __('Security Certified', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-psc-plugins-tab__wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: containerRef,\n className: \"spbc-psc-plugins-tab__content\",\n dangerouslySetInnerHTML: {\n __html: sectionData.html\n }\n }), hasMore && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: sentinelRef,\n className: \"spbc-psc-plugins-tab__sentinel\",\n \"aria-hidden\": \"true\"\n }), loading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-psc-plugins-tab__loader\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSecurityCertified/TabSecurityCertified.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TabSecurityCertified)\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 _Preloader_Preloader__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../Preloader/Preloader */ \"./js/src/react/components/Preloader/Preloader.js\");\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.js\");\n/* harmony import */ var _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../assets/preloader2.gif */ \"./js/src/react/assets/preloader2.gif\");\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSecurityCertified/styles.css\");\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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nvar LOAD_MORE_OFFSET = 200;\nvar bindPluginDetailsModal = function bindPluginDetailsModal(container) {\n if (!container || container.dataset.pscModalBound) {\n return;\n }\n var $ = window.jQuery;\n if (!$ || typeof window.tb_click !== 'function') {\n return;\n }\n container.dataset.pscModalBound = '1';\n $(container).on('click', '.thickbox.open-plugin-details-modal', function (e) {\n var title = $(this).data('title') ? sprintf(__('Plugin: %s', 'security-malware-firewall'), $(this).data('title')) : __('Plugin details', 'security-malware-firewall');\n e.preventDefault();\n e.stopPropagation();\n window.tb_click.call(this);\n $('#TB_window').attr({\n 'role': 'dialog',\n 'aria-label': __('Plugin details', 'security-malware-firewall')\n }).addClass('plugin-details-modal');\n $('#TB_window').find('#TB_iframeContent').attr('title', title);\n });\n};\nfunction TabSecurityCertified(_ref) {\n var initialSectionData = _ref.sectionData;\n var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var sentinelRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var loadingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n var requestIdRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n var pageRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(1);\n var apiPageRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(0);\n var filterRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)('all');\n var searchRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)('');\n var hasMoreRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialSectionData),\n _useState2 = _slicedToArray(_useState, 2),\n sectionData = _useState2[0],\n setSectionData = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n loading = _useState4[0],\n setLoading = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n hasMore = _useState6[0],\n setHasMore = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((initialSectionData === null || initialSectionData === void 0 ? void 0 : initialSectionData.certified_last_month) || 0),\n _useState8 = _slicedToArray(_useState7, 2),\n certifiedLastMonth = _useState8[0],\n setCertifiedLastMonth = _useState8[1];\n var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((initialSectionData === null || initialSectionData === void 0 ? void 0 : initialSectionData.shown_count) || 0),\n _useState0 = _slicedToArray(_useState9, 2),\n shownTotal = _useState0[0],\n setShownTotal = _useState0[1];\n var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState10 = _slicedToArray(_useState1, 2),\n searchLoading = _useState10[0],\n setSearchLoading = _useState10[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setSectionData(initialSectionData);\n }, [initialSectionData]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!sectionData) {\n return;\n }\n pageRef.current = sectionData.page || 1;\n apiPageRef.current = sectionData.api_page || 0;\n filterRef.current = sectionData.filter || 'all';\n hasMoreRef.current = !!sectionData.has_more;\n setHasMore(!!sectionData.has_more);\n }, [sectionData]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!(sectionData !== null && sectionData !== void 0 && sectionData.html) || !containerRef.current) {\n return;\n }\n bindPluginDetailsModal(containerRef.current);\n\n // Restore search term in the re-rendered input.\n if (searchRef.current) {\n var input = containerRef.current.querySelector('[data-spbc-psc-search]');\n if (input) {\n input.value = searchRef.current;\n }\n }\n }, [sectionData === null || sectionData === void 0 ? void 0 : sectionData.html]);\n var request = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref2) {\n var filter, page, apiPage, append, search, requestId, _containerRef$current, requestData, data, list, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n filter = _ref2.filter, page = _ref2.page, apiPage = _ref2.apiPage, append = _ref2.append, search = _ref2.search;\n requestId = ++requestIdRef.current;\n loadingRef.current = true;\n setLoading(true);\n _context.p = 1;\n requestData = {\n action: 'spbct_get_tab_data',\n tab_name: 'security_certified',\n filter: filter,\n page: page,\n api_page: apiPage\n };\n if (search) {\n requestData.search = search;\n }\n if (append) {\n requestData.append = 1;\n }\n _context.n = 2;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_2__.sendAjaxRequest)(requestData, true);\n case 2:\n data = _context.v;\n if (!(requestId !== requestIdRef.current)) {\n _context.n = 3;\n break;\n }\n return _context.a(2);\n case 3:\n if (append) {\n _context.n = 4;\n break;\n }\n setSectionData(data);\n setCertifiedLastMonth(data.certified_last_month || 0);\n setShownTotal(data.shown_count || 0);\n return _context.a(2);\n case 4:\n list = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.querySelector('#the-list');\n if (list && data.rows_html) {\n list.insertAdjacentHTML('beforeend', data.rows_html);\n }\n pageRef.current = data.page || page;\n apiPageRef.current = data.api_page || apiPage;\n hasMoreRef.current = !!data.has_more;\n setHasMore(!!data.has_more);\n setCertifiedLastMonth(data.certified_last_month || 0);\n setShownTotal(data.shown_count || 0);\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n console.error('Error loading PSC plugins:', _t);\n case 6:\n _context.p = 6;\n if (requestId === requestIdRef.current) {\n loadingRef.current = false;\n setLoading(false);\n setSearchLoading(false);\n }\n return _context.f(6);\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[1, 5, 6, 7]]);\n }));\n return function (_x) {\n return _ref3.apply(this, arguments);\n };\n }(), []);\n var loadMore = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var sentinel;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n if (!(loadingRef.current || !hasMoreRef.current || searchRef.current)) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n _context2.n = 2;\n return request({\n filter: filterRef.current,\n page: pageRef.current,\n apiPage: apiPageRef.current,\n append: true\n });\n case 2:\n // The sentinel may still be on screen when the appended batch is short, and the observer\n // reports intersection changes only, so the next batch is requested explicitly.\n sentinel = sentinelRef.current;\n if (!(!sentinel || !hasMoreRef.current || loadingRef.current)) {\n _context2.n = 3;\n break;\n }\n return _context2.a(2);\n case 3:\n if (sentinel.getBoundingClientRect().top <= window.innerHeight + LOAD_MORE_OFFSET) {\n loadMore();\n }\n case 4:\n return _context2.a(2);\n }\n }, _callee2);\n })), [request]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var container = containerRef.current;\n if (!container) {\n return;\n }\n var onFilterClick = function onFilterClick(event) {\n var link = event.target.closest('[data-spbc-psc-filter]');\n if (!link || !container.contains(link)) {\n return;\n }\n event.preventDefault();\n var nextFilter = link.dataset.spbcPscFilter;\n if (nextFilter === filterRef.current) {\n return;\n }\n filterRef.current = nextFilter;\n searchRef.current = '';\n hasMoreRef.current = false;\n setHasMore(false);\n var input = container.querySelector('[data-spbc-psc-search]');\n if (input) {\n input.value = '';\n }\n request({\n filter: nextFilter,\n page: 1,\n apiPage: 0,\n append: false\n });\n };\n var performSearch = function performSearch() {\n var input = container.querySelector('[data-spbc-psc-search]');\n var term = input ? input.value.trim() : '';\n searchRef.current = term;\n hasMoreRef.current = false;\n setHasMore(false);\n setSearchLoading(true);\n if (!term) {\n request({\n filter: filterRef.current,\n page: 1,\n apiPage: 0,\n append: false\n });\n return;\n }\n request({\n filter: filterRef.current,\n page: 1,\n apiPage: 0,\n append: false,\n search: term\n });\n };\n var onSearchSubmit = function onSearchSubmit(event) {\n var btn = event.target.closest('[data-spbc-psc-search-submit]');\n if (!btn || !container.contains(btn)) {\n return;\n }\n event.preventDefault();\n performSearch();\n };\n var onSearchKeydown = function onSearchKeydown(event) {\n if (event.key !== 'Enter') {\n return;\n }\n var input = event.target.closest('[data-spbc-psc-search]');\n if (!input || !container.contains(input)) {\n return;\n }\n event.preventDefault();\n performSearch();\n };\n container.addEventListener('click', onFilterClick);\n container.addEventListener('click', onSearchSubmit);\n container.addEventListener('keydown', onSearchKeydown);\n return function () {\n container.removeEventListener('click', onFilterClick);\n container.removeEventListener('click', onSearchSubmit);\n container.removeEventListener('keydown', onSearchKeydown);\n };\n }, [request, sectionData === null || sectionData === void 0 ? void 0 : sectionData.html]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var sentinel = sentinelRef.current;\n if (!sentinel || !hasMore) {\n return;\n }\n var observer = new IntersectionObserver(function (entries) {\n if (entries.some(function (entry) {\n return entry.isIntersecting;\n })) {\n loadMore();\n }\n }, {\n root: null,\n rootMargin: LOAD_MORE_OFFSET + 'px',\n threshold: 0\n });\n observer.observe(sentinel);\n return function () {\n return observer.disconnect();\n };\n }, [hasMore, loadMore, sectionData]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var container = containerRef.current;\n if (!container) return;\n var searchDiv = container.querySelector('.spbc-psc-plugins-tab__search');\n if (!searchDiv) return;\n var img = searchDiv.querySelector('.spbc-psc-search-preloader');\n if (searchLoading) {\n if (!img) {\n img = document.createElement('img');\n img.className = 'spbc-psc-search-preloader';\n img.src = _assets_preloader2_gif__WEBPACK_IMPORTED_MODULE_3__[\"default\"];\n img.alt = '';\n var input = searchDiv.querySelector('[data-spbc-psc-search]');\n searchDiv.insertBefore(img, input);\n }\n img.style.display = 'inline-block';\n } else if (img) {\n img.style.display = 'none';\n }\n }, [searchLoading, sectionData === null || sectionData === void 0 ? void 0 : sectionData.html]);\n if (!sectionData || !sectionData.html) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_tab_fields_group\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, __('Security Certified', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-psc-plugins-tab__wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n className: \"spbc-psc-plugins-tab__intro\"\n }, __('This tab shows plugin releases certified by CleanTalk\\'s security team. We have reviewed these releases for vulnerabilities such as XSS, SQL injection, and backdoors. The full list of security tests is available', 'security-malware-firewall'), ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: \"https://research.cleantalk.org/reports\",\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }, __('here', 'security-malware-firewall')), '. ', __('While we make every effort to identify security issues, we cannot guarantee that any release shown in this tab is completely free of vulnerabilities.', 'security-malware-firewall'), (certifiedLastMonth > 0 || shownTotal > 0) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc-psc-plugins-tab__stats\"\n }, ' ', certifiedLastMonth > 0 && sprintf(__('%d plugins have been certified in the past month,', 'security-malware-firewall'), certifiedLastMonth), certifiedLastMonth > 0 && shownTotal > 0 && ' ', shownTotal > 0 && sprintf(__('bringing the total to %d certified plugins.', 'security-malware-firewall'), shownTotal))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: containerRef,\n className: \"spbc-psc-plugins-tab__content\",\n dangerouslySetInnerHTML: {\n __html: sectionData.html\n }\n }), hasMore && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n ref: sentinelRef,\n className: \"spbc-psc-plugins-tab__sentinel\",\n \"aria-hidden\": \"true\"\n }), loading && !searchLoading && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-psc-plugins-tab__loader\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Preloader_Preloader__WEBPACK_IMPORTED_MODULE_1__[\"default\"], null))))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSecurityCertified/TabSecurityCertified.js?\n}"); /***/ }, @@ -526,7 +526,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 */ QuickNavigation)\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 _QuickNavItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./QuickNavItem */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavItem.js\");\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/styles.css\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n\n\n\nvar __ = wp.i18n.__;\nfunction QuickNavigation(_ref) {\n var keyIsOk = _ref.keyIsOk;\n var navItems = [{\n href: '#apikey',\n id: 'spbc-quicknav--link-apikey',\n label: __('Access Key', 'security-malware-firewall'),\n show: true\n }, {\n href: '#auth_and_logging_in',\n id: 'spbc-quicknav--link-auth',\n label: __('Authentication and Logging In', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#firewall',\n id: 'spbc-quicknav--link-firewall',\n label: __('Firewall', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#scanner_settings',\n id: 'spbc-quicknav--link-scanner_settings',\n label: __('Malware Scanner', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#vulnerability_check',\n id: 'spbc-quicknav--link-vulnerability_check',\n label: __('Modules vulnerability detection', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#admin_bar',\n id: 'spbc-quicknav--link-admin_bar',\n label: __('Admin Bar', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#misc',\n id: 'spbc-quicknav--link-misc',\n label: __('Miscellaneous', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#spbc_trusted_and_affiliate',\n id: 'spbc-quicknav--link-spbc_trusted_and_affiliate',\n label: __('Trust text, affiliate settings', 'security-malware-firewall'),\n show: keyIsOk\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-quicknav--bar_wrapper\",\n className: \"spbc-quicknav--bar_wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-quicknav--links_wrapper\",\n className: \"spbc-quicknav--links_wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n id: \"spbc_quicknav--header\"\n }, \"Settings navigation\"), navItems.filter(function (item) {\n return item.show;\n }).map(function (item) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_QuickNavItem__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _extends({\n key: item.id\n }, item));\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"submit\",\n name: \"submit\",\n id: \"submit\",\n className: \"spbc_quicknav--save_button button-primary\",\n value: __('Save Changes', 'security-malware-firewall')\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavigation.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ QuickNavigation)\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 _QuickNavItem__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./QuickNavItem */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavItem.js\");\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./styles.css */ \"./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/styles.css\");\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n;\n\n\nvar __ = wp.i18n.__;\nfunction QuickNavigation(_ref) {\n var keyIsOk = _ref.keyIsOk;\n var navItems = [{\n href: '#apikey',\n id: 'spbc-quicknav--link-apikey',\n label: __('Access Key', 'security-malware-firewall'),\n show: true\n }, {\n href: '#auth_and_logging_in',\n id: 'spbc-quicknav--link-auth',\n label: __('Authentication and Logging In', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#firewall',\n id: 'spbc-quicknav--link-firewall',\n label: __('Firewall', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#scanner_settings',\n id: 'spbc-quicknav--link-scanner_settings',\n label: __('Malware Scanner', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#vulnerability_check',\n id: 'spbc-quicknav--link-vulnerability_check',\n label: __('Modules vulnerability detection', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#admin_bar',\n id: 'spbc-quicknav--link-admin_bar',\n label: __('Admin Bar', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#misc',\n id: 'spbc-quicknav--link-misc',\n label: __('Miscellaneous', 'security-malware-firewall'),\n show: keyIsOk\n }, {\n href: '#spbc_trusted_and_affiliate',\n id: 'spbc-quicknav--link-spbc_trusted_and_affiliate',\n label: __('Trust text, affiliate settings', 'security-malware-firewall'),\n show: keyIsOk\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-quicknav--bar_wrapper\",\n className: \"spbc-quicknav--bar_wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n id: \"spbc-quicknav--links_wrapper\",\n className: \"spbc-quicknav--links_wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h4\", {\n id: \"spbc_quicknav--header\"\n }, \"Settings navigation\"), navItems.filter(function (item) {\n return item.show;\n }).map(function (item) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_QuickNavItem__WEBPACK_IMPORTED_MODULE_1__[\"default\"], _extends({\n key: item.id\n }, item));\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"submit\",\n name: \"submit\",\n id: \"submit\",\n className: \"spbc_quicknav--save_button button-primary\",\n value: __('Save Changes', 'security-malware-firewall')\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/QuickNavigation/QuickNavigation.js?\n}"); /***/ }, @@ -536,7 +536,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 */ Settings)\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 _SettingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SettingsGroup */ \"./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js\");\n\n\nvar __ = wp.i18n.__;\nfunction Settings(props) {\n var settingsSlug = props.settingsSlug,\n settings = props.settings,\n keyIsOk = props.keyIsOk,\n wpUserRolesOptions = props.wpUserRolesOptions,\n verificationEmail = props.verificationEmail,\n authLoginPageUrl = props.authLoginPageUrl,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n shuffleSaltsUnlocked = props.shuffleSaltsUnlocked,\n visitorIpSources = props.visitorIpSources,\n scannerExclusionsDir = props.scannerExclusionsDir,\n scannerExclusionsURL = props.scannerExclusionsURL,\n visitorCurrentIp = props.visitorCurrentIp,\n nextScheduledScanDescription = props.nextScheduledScanDescription,\n scannerAutoStartManualTimezone = props.scannerAutoStartManualTimezone,\n wlCompanyName = props.wlCompanyName;\n var settingKeys = Object.keys(settings || {});\n var SETTINGS_SECTIONS_TITLES = {\n apikey: {\n title: __('Access Key', 'security-malware-firewall'),\n description: ''\n },\n auth_and_logging_in: {\n title: __('Authentication and Logging In', 'security-malware-firewall'),\n description: ''\n },\n firewall: {\n title: __('Firewall', 'security-malware-firewall'),\n description: __(\n // eslint-disable-next-line max-len\n 'Any IP addresses of the logged in administrators will be automatically added to your Personal Lists and will be approved all the time.', 'security-malware-firewall')\n },\n scanner_settings: {\n title: __('Malware Scanner', 'security-malware-firewall'),\n description: ''\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, settingKeys.map(function (sectionGroupId) {\n if (sectionGroupId === 'apikey') {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SettingsGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: sectionGroupId,\n groupTitle: SETTINGS_SECTIONS_TITLES[sectionGroupId].title,\n groupDescription: SETTINGS_SECTIONS_TITLES[sectionGroupId].description,\n groupId: sectionGroupId,\n settingsSlug: settingsSlug,\n settings: settings[sectionGroupId],\n keyIsOk: keyIsOk,\n wpUserRolesOptions: wpUserRolesOptions,\n verificationEmail: verificationEmail,\n authLoginPageUrl: authLoginPageUrl,\n techSupportUrlPrefix: techSupportUrlPrefix,\n loginRenameNotifyAdminEmail: loginRenameNotifyAdminEmail,\n canActivatePlugins: canActivatePlugins,\n shuffleSaltsUnlocked: shuffleSaltsUnlocked\n });\n }\n if (sectionGroupId === 'auth_and_logging_in' || sectionGroupId === 'scanner_settings' || sectionGroupId === 'firewall') {\n // todo: AG needs to be reduced in context\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SettingsGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: sectionGroupId,\n groupTitle: SETTINGS_SECTIONS_TITLES[sectionGroupId].title,\n groupDescription: SETTINGS_SECTIONS_TITLES[sectionGroupId].description,\n groupId: sectionGroupId,\n settingsSlug: settingsSlug,\n settings: settings[sectionGroupId],\n keyIsOk: keyIsOk,\n wpUserRolesOptions: wpUserRolesOptions,\n verificationEmail: verificationEmail,\n authLoginPageUrl: authLoginPageUrl,\n techSupportUrlPrefix: techSupportUrlPrefix,\n loginRenameNotifyAdminEmail: loginRenameNotifyAdminEmail,\n canActivatePlugins: canActivatePlugins,\n shuffleSaltsUnlocked: shuffleSaltsUnlocked,\n visitorIpSources: visitorIpSources,\n scannerExclusionsDir: scannerExclusionsDir,\n scannerExclusionsURL: scannerExclusionsURL,\n visitorCurrentIp: visitorCurrentIp,\n nextScheduledScanDescription: nextScheduledScanDescription,\n scannerAutoStartManualTimezone: scannerAutoStartManualTimezone,\n wlCompanyName: wlCompanyName\n });\n }\n return null;\n }));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Settings)\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 _SettingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SettingsGroup */ \"./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js\");\n/* harmony import */ var _Settings_VulnerabilityCheckDesc__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Settings/VulnerabilityCheckDesc */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../App */ \"./js/src/react/components/App.js\");\n\n\n\n\nvar __ = wp.i18n.__;\nfunction Settings(props) {\n var settingsSlug = props.settingsSlug,\n settings = props.settings,\n keyIsOk = props.keyIsOk,\n wpUserRolesOptions = props.wpUserRolesOptions,\n verificationEmail = props.verificationEmail,\n authLoginPageUrl = props.authLoginPageUrl,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n shuffleSaltsUnlocked = props.shuffleSaltsUnlocked,\n visitorIpSources = props.visitorIpSources,\n scannerExclusionsDir = props.scannerExclusionsDir,\n scannerExclusionsURL = props.scannerExclusionsURL,\n visitorCurrentIp = props.visitorCurrentIp,\n nextScheduledScanDescription = props.nextScheduledScanDescription,\n scannerAutoStartManualTimezone = props.scannerAutoStartManualTimezone,\n wlCompanyName = props.wlCompanyName;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_3__.DataRootContext) || {},\n wlModeEnabled = _ref.wlModeEnabled;\n var settingKeys = Object.keys(settings || {});\n var SETTINGS_SECTIONS_TITLES = {\n apikey: {\n title: __('Access Key', 'security-malware-firewall'),\n description: ''\n },\n auth_and_logging_in: {\n title: __('Authentication and Logging In', 'security-malware-firewall'),\n description: ''\n },\n firewall: {\n title: __('Firewall', 'security-malware-firewall'),\n description: __(\n // eslint-disable-next-line max-len\n 'Any IP addresses of the logged in administrators will be automatically added to your Personal Lists and will be approved all the time.', 'security-malware-firewall')\n },\n scanner_settings: {\n title: __('Malware Scanner', 'security-malware-firewall'),\n description: ''\n },\n vulnerability_check: {\n title: __('Modules vulnerability detection', 'security-malware-firewall'),\n description: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Settings_VulnerabilityCheckDesc__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null)\n },\n admin_bar: {\n title: __('Admin Bar', 'security-malware-firewall'),\n description: ''\n },\n misc: {\n title: __('Miscellaneous', 'security-malware-firewall'),\n description: ''\n },\n spbc_trusted_and_affiliate: {\n title: __('Trusted and Affiliate', 'security-malware-firewall'),\n description: ''\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, settingKeys.map(function (sectionGroupId) {\n if (!SETTINGS_SECTIONS_TITLES[sectionGroupId]) {\n return null;\n }\n if (sectionGroupId === 'spbc_trusted_and_affiliate' && wlModeEnabled) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SettingsGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n key: sectionGroupId,\n groupTitle: SETTINGS_SECTIONS_TITLES[sectionGroupId].title,\n groupDescription: SETTINGS_SECTIONS_TITLES[sectionGroupId].description,\n groupId: sectionGroupId,\n settingsSlug: settingsSlug,\n settings: settings[sectionGroupId],\n keyIsOk: keyIsOk,\n wpUserRolesOptions: wpUserRolesOptions,\n verificationEmail: verificationEmail,\n authLoginPageUrl: authLoginPageUrl,\n techSupportUrlPrefix: techSupportUrlPrefix,\n loginRenameNotifyAdminEmail: loginRenameNotifyAdminEmail,\n canActivatePlugins: canActivatePlugins,\n shuffleSaltsUnlocked: shuffleSaltsUnlocked,\n visitorIpSources: visitorIpSources,\n scannerExclusionsDir: scannerExclusionsDir,\n scannerExclusionsURL: scannerExclusionsURL,\n visitorCurrentIp: visitorCurrentIp,\n nextScheduledScanDescription: nextScheduledScanDescription,\n scannerAutoStartManualTimezone: scannerAutoStartManualTimezone,\n wlCompanyName: wlCompanyName\n });\n }));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings.js?\n}"); /***/ }, @@ -556,7 +556,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 */ TwoFaConfirmationDialog)\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 _ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../ReactFileViewDialog/ReactFileViewDialog */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js\");\n/* harmony import */ var _2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./2faConfirmationApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\n\n/**\n * @param {object} props\n * @param {boolean} props.isOpen\n * @param {function(): void} props.onCancel\n * @param {function(): void} props.onVerified\n * @param {string} props.verificationEmail\n * @return {JSX.Element|null}\n */\nfunction TwoFaConfirmationDialog(props) {\n var isOpen = props.isOpen,\n onCancel = props.onCancel,\n onVerified = props.onVerified,\n verificationEmail = props.verificationEmail;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n code = _useState2[0],\n setCode = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n resendBusy = _useState4[0],\n setResendBusy = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n resendCooldown = _useState6[0],\n setResendCooldown = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n okBusy = _useState8[0],\n setOkBusy = _useState8[1];\n var resendTimerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var clearResendTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n if (resendTimerRef.current) {\n clearTimeout(resendTimerRef.current);\n resendTimerRef.current = null;\n }\n }, []);\n var startResendCooldown = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n clearResendTimer();\n setResendCooldown(true);\n resendTimerRef.current = setTimeout(function () {\n setResendCooldown(false);\n resendTimerRef.current = null;\n }, 30000);\n }, [clearResendTimer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!isOpen) {\n setCode('');\n setResendBusy(false);\n setResendCooldown(false);\n setOkBusy(false);\n clearResendTimer();\n return;\n }\n startResendCooldown();\n return function () {\n clearResendTimer();\n };\n }, [isOpen, clearResendTimer, startResendCooldown]);\n var handleResend = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var res, msg, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(resendBusy || resendCooldown)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setResendBusy(true);\n _context.p = 2;\n _context.n = 3;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__.generateTwoFaConfirmationCode)();\n case 3:\n res = _context.v;\n if (res.success) {\n setCode('');\n startResendCooldown();\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Request failed.', 'security-malware-firewall');\n alert(msg);\n }\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error(_t);\n case 5:\n _context.p = 5;\n setResendBusy(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function handleResend() {\n return _ref.apply(this, arguments);\n };\n }();\n var handleOk = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var res, msg, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n if (!okBusy) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n setOkBusy(true);\n _context2.p = 2;\n _context2.n = 3;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__.checkTwoFaConfirmationCode)(code.trim());\n case 3:\n res = _context2.v;\n if (res.success) {\n clearResendTimer();\n onVerified();\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Code verification failed!', 'security-malware-firewall');\n alert(msg);\n }\n _context2.n = 5;\n break;\n case 4:\n _context2.p = 4;\n _t2 = _context2.v;\n alert(__('Code verification failed. Please try again.', 'security-malware-firewall'));\n case 5:\n _context2.p = 5;\n setOkBusy(false);\n return _context2.f(5);\n case 6:\n return _context2.a(2);\n }\n }, _callee2, null, [[2, 4, 5, 6]]);\n }));\n return function handleOk() {\n return _ref2.apply(this, arguments);\n };\n }();\n var email = verificationEmail || '';\n var checkInboxMsg = __('Check %s inbox for the confirmation code.', 'security-malware-firewall');\n /* eslint-disable max-len */\n var codeValidityNote = __('The code is valid for 10 minutes. If you want to change the status in this period, the new code won\\'t be sent, please, use the code you\\'ve already received.', 'security-malware-firewall');\n /* eslint-enable max-len */\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n isOpen: isOpen,\n onClose: onCancel,\n title: __('Confirmation code', 'security-malware-firewall'),\n maxWidth: \"360px\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sprintf(/* translators: %s: email address */\n checkInboxMsg, email)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"em\", null, codeValidityNote)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-2fa-confirmation-row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n name: \"spbct-confirmation-code\",\n value: code,\n onChange: function onChange(e) {\n return setCode(e.target.value);\n },\n className: \"regular-text spbc-2fa-confirmation-input\",\n autoComplete: \"one-time-code\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button button-primary spbc-2fa-confirmation-resend\",\n onClick: handleResend,\n disabled: resendBusy || resendCooldown\n }, __('Resend', 'security-malware-firewall'), resendCooldown && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"circle circle--small -animation--circle -animation--30s\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"circle-inner\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n marginTop: 16,\n textAlign: 'right'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button\",\n onClick: onCancel,\n disabled: okBusy\n }, __('Cancel', 'security-malware-firewall')), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button button-primary\",\n onClick: handleOk,\n disabled: okBusy\n }, __('OK', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TwoFaConfirmationDialog)\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 _ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../ReactFileViewDialog/ReactFileViewDialog */ \"./js/src/react/components/ReactFileViewDialog/ReactFileViewDialog.js\");\n/* harmony import */ var _2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./2faConfirmationApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\n\n/**\n * @param {object} props\n * @param {boolean} props.isOpen\n * @param {function(): void} props.onCancel\n * @param {function(): void} props.onVerified\n * @param {string} props.verificationEmail\n * @return {JSX.Element|null}\n */\nfunction TwoFaConfirmationDialog(props) {\n var isOpen = props.isOpen,\n onCancel = props.onCancel,\n onVerified = props.onVerified,\n verificationEmail = props.verificationEmail;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n code = _useState2[0],\n setCode = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState4 = _slicedToArray(_useState3, 2),\n resendBusy = _useState4[0],\n setResendBusy = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState6 = _slicedToArray(_useState5, 2),\n resendCooldown = _useState6[0],\n setResendCooldown = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n okBusy = _useState8[0],\n setOkBusy = _useState8[1];\n var resendTimerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var clearResendTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n if (resendTimerRef.current) {\n clearTimeout(resendTimerRef.current);\n resendTimerRef.current = null;\n }\n }, []);\n var startResendCooldown = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n clearResendTimer();\n setResendCooldown(true);\n resendTimerRef.current = setTimeout(function () {\n setResendCooldown(false);\n resendTimerRef.current = null;\n }, 30000);\n }, [clearResendTimer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (!isOpen) {\n setCode('');\n setResendBusy(false);\n setResendCooldown(false);\n setOkBusy(false);\n clearResendTimer();\n return;\n }\n startResendCooldown();\n return function () {\n clearResendTimer();\n };\n }, [isOpen, clearResendTimer, startResendCooldown]);\n var handleResend = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var res, msg, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n if (!(resendBusy || resendCooldown)) {\n _context.n = 1;\n break;\n }\n return _context.a(2);\n case 1:\n setResendBusy(true);\n _context.p = 2;\n _context.n = 3;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__.generateTwoFaConfirmationCode)();\n case 3:\n res = _context.v;\n if (res.success) {\n setCode('');\n startResendCooldown();\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Request failed.', 'security-malware-firewall');\n alert(msg);\n }\n _context.n = 5;\n break;\n case 4:\n _context.p = 4;\n _t = _context.v;\n console.error(_t);\n case 5:\n _context.p = 5;\n setResendBusy(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[2, 4, 5, 6]]);\n }));\n return function handleResend() {\n return _ref.apply(this, arguments);\n };\n }();\n var handleOk = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n var res, msg, _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n if (!okBusy) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2);\n case 1:\n setOkBusy(true);\n _context2.p = 2;\n _context2.n = 3;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_2__.checkTwoFaConfirmationCode)(code.trim());\n case 3:\n res = _context2.v;\n if (res.success) {\n clearResendTimer();\n onVerified();\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Code verification failed!', 'security-malware-firewall');\n alert(msg);\n }\n _context2.n = 5;\n break;\n case 4:\n _context2.p = 4;\n _t2 = _context2.v;\n alert(__('Code verification failed. Please try again.', 'security-malware-firewall'));\n case 5:\n _context2.p = 5;\n setOkBusy(false);\n return _context2.f(5);\n case 6:\n return _context2.a(2);\n }\n }, _callee2, null, [[2, 4, 5, 6]]);\n }));\n return function handleOk() {\n return _ref2.apply(this, arguments);\n };\n }();\n var email = verificationEmail || '';\n var checkInboxMsg = __('Check %s inbox for the confirmation code.', 'security-malware-firewall');\n /* eslint-disable max-len */\n var codeValidityNote = __('The code is valid for 10 minutes. If you want to change the status in this period, the new code won\\'t be sent, please, use the code you\\'ve already received.', 'security-malware-firewall');\n /* eslint-enable max-len */\n\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_ReactFileViewDialog_ReactFileViewDialog__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n isOpen: isOpen,\n onClose: onCancel,\n title: __('Confirmation code', 'security-malware-firewall'),\n maxWidth: \"360px\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, sprintf(/* translators: %s: email address */\n checkInboxMsg, email)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"em\", null, codeValidityNote)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc-2fa-confirmation-row\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n name: \"spbct-confirmation-code\",\n value: code,\n onChange: function onChange(e) {\n return setCode(e.target.value);\n },\n className: \"regular-text spbc-2fa-confirmation-input\",\n autoComplete: \"one-time-code\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button button-primary spbc-2fa-confirmation-resend\",\n onClick: handleResend,\n disabled: resendBusy || resendCooldown\n }, __('Resend', 'security-malware-firewall'), resendCooldown && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"circle circle--small -animation--circle -animation--30s\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"circle-inner\"\n })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", {\n style: {\n marginTop: 16,\n textAlign: 'right'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button\",\n onClick: onCancel,\n disabled: okBusy\n }, __('Cancel', 'security-malware-firewall')), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n className: \"button button-primary\",\n onClick: handleOk,\n disabled: okBusy\n }, __('OK', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js?\n}"); /***/ }, @@ -566,7 +566,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 */ Settings2faEnable)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n/* harmony import */ var _2faConfirmationDialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./2faConfirmationDialog */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js\");\n/* harmony import */ var _2faConfirmationApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./2faConfirmationApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nvar TWO_FA_CHILDREN = '2fa__roles,edit_tech_support_url__enabled,edit_tech_support_url__link,edit_tech_support_url__remove';\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string|number} props.value\n * @param {string} props.verificationEmail\n * @param {function(string, *): void} [props.onSettingChange]\n * @param {{value: string, label: string}[]} [props.wpUserRolesOptions]\n * @return {JSX.Element}\n */\nfunction Settings2faEnable(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n verificationEmail = props.verificationEmail,\n onSettingChange = props.onSettingChange,\n wpUserRolesOptions = props.wpUserRolesOptions;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n modalOpen = _useState2[0],\n setModalOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n pendingValue = _useState4[0],\n setPendingValue = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n radioOverride = _useState6[0],\n setRadioOverride = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n busy = _useState8[0],\n setBusy = _useState8[1];\n var serverVal = String(value !== null && value !== void 0 ? value : '');\n var effectiveRadio = radioOverride !== null ? radioOverride : serverVal;\n var applyOff = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setRadioOverride(null);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__enable', 0);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(TWO_FA_CHILDREN, 0);\n }\n }, [onSettingChange]);\n var handleChange = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(event) {\n var v, res, msg, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n v = event.target.value;\n if (!(v === '0')) {\n _context.n = 1;\n break;\n }\n applyOff();\n return _context.a(2);\n case 1:\n if (!(v !== '1' && v !== '-1')) {\n _context.n = 2;\n break;\n }\n return _context.a(2);\n case 2:\n setPendingValue(parseInt(v, 10));\n setRadioOverride(v);\n setBusy(true);\n _context.p = 3;\n _context.n = 4;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_3__.generateTwoFaConfirmationCode)();\n case 4:\n res = _context.v;\n if (res.success) {\n setModalOpen(true);\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Could not send confirmation code.', 'security-malware-firewall');\n alert(msg);\n setRadioOverride(null);\n setPendingValue(null);\n }\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n console.error(_t);\n case 6:\n _context.p = 6;\n setBusy(false);\n return _context.f(6);\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[3, 5, 6, 7]]);\n }));\n return function handleChange(_x) {\n return _ref.apply(this, arguments);\n };\n }();\n var handleModalCancel = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setModalOpen(false);\n setPendingValue(null);\n setRadioOverride(null);\n }, []);\n var handleVerified = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n if (pendingValue === null) {\n return;\n }\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__enable', pendingValue);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(TWO_FA_CHILDREN, 1);\n }\n var first = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ? [String(wpUserRolesOptions[0].value)] : [];\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__roles', first);\n setModalOpen(false);\n setPendingValue(null);\n setRadioOverride(null);\n }, [onSettingChange, pendingValue, wpUserRolesOptions]);\n var options = [{\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '0',\n label: __('Off', 'security-malware-firewall')\n }, {\n value: '-1',\n label: __('Only for new devices', 'security-malware-firewall')\n }];\n var email = verificationEmail || '';\n var verifyEmailHint = __('Verification code will be sent to the admin email (%s) to enable the feature.', 'security-malware-firewall');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Two-factor authentication (2FA)', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"2fa__enable\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n marginBottom: 10\n },\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, sprintf(/* translators: %s: email address */\n verifyEmailHint, email)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: effectiveRadio,\n options: options,\n onChange: handleChange,\n disabled: busy\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_2faConfirmationDialog__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: modalOpen,\n onCancel: handleModalCancel,\n onVerified: handleVerified,\n verificationEmail: verificationEmail\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Settings2faEnable)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n/* harmony import */ var _2faConfirmationDialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./2faConfirmationDialog */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js\");\n/* harmony import */ var _2faConfirmationApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./2faConfirmationApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nvar TWO_FA_CHILDREN = '2fa__roles,edit_tech_support_url__enabled,edit_tech_support_url__link,edit_tech_support_url__remove';\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string|number} props.value\n * @param {string} props.verificationEmail\n * @param {function(string, *): void} [props.onSettingChange]\n * @param {{value: string, label: string}[]} [props.wpUserRolesOptions]\n * @return {JSX.Element}\n */\nfunction Settings2faEnable(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n verificationEmail = props.verificationEmail,\n onSettingChange = props.onSettingChange,\n wpUserRolesOptions = props.wpUserRolesOptions;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState2 = _slicedToArray(_useState, 2),\n modalOpen = _useState2[0],\n setModalOpen = _useState2[1];\n var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState4 = _slicedToArray(_useState3, 2),\n pendingValue = _useState4[0],\n setPendingValue = _useState4[1];\n var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null),\n _useState6 = _slicedToArray(_useState5, 2),\n radioOverride = _useState6[0],\n setRadioOverride = _useState6[1];\n var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),\n _useState8 = _slicedToArray(_useState7, 2),\n busy = _useState8[0],\n setBusy = _useState8[1];\n var serverVal = String(value !== null && value !== void 0 ? value : '');\n var effectiveRadio = radioOverride !== null ? radioOverride : serverVal;\n var applyOff = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setRadioOverride(null);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__enable', 0);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(TWO_FA_CHILDREN, 0);\n }\n }, [onSettingChange]);\n var handleChange = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(event) {\n var v, res, msg, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n v = event.target.value;\n if (!(v === '0')) {\n _context.n = 1;\n break;\n }\n applyOff();\n return _context.a(2);\n case 1:\n if (!(v !== '1' && v !== '-1')) {\n _context.n = 2;\n break;\n }\n return _context.a(2);\n case 2:\n setPendingValue(parseInt(v, 10));\n setRadioOverride(v);\n setBusy(true);\n _context.p = 3;\n _context.n = 4;\n return (0,_2faConfirmationApi__WEBPACK_IMPORTED_MODULE_3__.generateTwoFaConfirmationCode)();\n case 4:\n res = _context.v;\n if (res.success) {\n setModalOpen(true);\n } else {\n msg = typeof res.data === 'string' ? res.data : __('Could not send confirmation code.', 'security-malware-firewall');\n alert(msg);\n setRadioOverride(null);\n setPendingValue(null);\n }\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n console.error(_t);\n case 6:\n _context.p = 6;\n setBusy(false);\n return _context.f(6);\n case 7:\n return _context.a(2);\n }\n }, _callee, null, [[3, 5, 6, 7]]);\n }));\n return function handleChange(_x) {\n return _ref.apply(this, arguments);\n };\n }();\n var handleModalCancel = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n setModalOpen(false);\n setPendingValue(null);\n setRadioOverride(null);\n }, []);\n var handleVerified = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {\n if (pendingValue === null) {\n return;\n }\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__enable', pendingValue);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(TWO_FA_CHILDREN, 1);\n }\n var first = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ? [String(wpUserRolesOptions[0].value)] : [];\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('2fa__roles', first);\n setModalOpen(false);\n setPendingValue(null);\n setRadioOverride(null);\n }, [onSettingChange, pendingValue, wpUserRolesOptions]);\n var options = [{\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '0',\n label: __('Off', 'security-malware-firewall')\n }, {\n value: '-1',\n label: __('Only for new devices', 'security-malware-firewall')\n }];\n var email = verificationEmail || '';\n var verifyEmailHint = __('Verification code will be sent to the admin email (%s) to enable the feature.', 'security-malware-firewall');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Two-factor authentication (2FA)', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"2fa__enable\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n marginBottom: 10\n },\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, sprintf(/* translators: %s: email address */\n verifyEmailHint, email)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: effectiveRadio,\n options: options,\n onChange: handleChange,\n disabled: busy\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_2faConfirmationDialog__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n isOpen: modalOpen,\n onCancel: handleModalCancel,\n onVerified: handleVerified,\n verificationEmail: verificationEmail\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js?\n}"); /***/ }, @@ -590,13 +590,53 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa /***/ }, +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarAdminsOnlineCounter.js" +/*!*******************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarAdminsOnlineCounter.js ***! + \*******************************************************************************************************/ +(__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 */ AdminBarAdminsOnlineCounter)\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\nvar __ = wp.i18n.__;\nfunction AdminBarAdminsOnlineCounter(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Administrators online counter', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Shows the number of administrators online in the admin bar.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarAdminsOnlineCounter.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarBruteForceCounter.js" +/*!*****************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarBruteForceCounter.js ***! + \*****************************************************************************************************/ +(__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 */ AdminBarBruteForceCounter)\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\nvar __ = wp.i18n.__;\nfunction AdminBarBruteForceCounter(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Allowed/Blocked login attempts counter', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Shows the number of blocked login attempts in the admin bar. Counts only the local database.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarBruteForceCounter.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarFirewallCounter.js" +/*!***************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarFirewallCounter.js ***! + \***************************************************************************************************/ +(__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 */ AdminBarFirewallCounter)\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\nvar __ = wp.i18n.__;\nfunction AdminBarFirewallCounter(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Security Firewall counter', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Shows the firewall counters in the admin bar. Counts only the local database.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarFirewallCounter.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarShow.js" +/*!****************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarShow.js ***! + \****************************************************************************************/ +(__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 */ AdminBarShow)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.js\");\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction AdminBarShow(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n wlCompanyName = props.wlCompanyName;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n handleSettingsDependencies('admin_bar__admins_online_counter,' + 'admin_bar__brute_force_counter,' + 'admin_bar__firewall_counter')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Show statistics in admin bar', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('Show/hide the %s drop-down menu at the top bar of the WordPress backend.', 'security-malware-firewall'), wlCompanyName !== null && wlCompanyName !== void 0 ? wlCompanyName : __('CleanTalk', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarShow.js?\n}"); + +/***/ }, + /***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js" /*!************************************************************************************************!*\ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js ***! \************************************************************************************************/ (__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 */ BfpAllowedWrongAuths)\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__);\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\nvar __ = wp.i18n.__;\nfunction BfpAllowedWrongAuths(props) {\n var id = props.id,\n name = props.name,\n initialValue = props.value;\n var minValue = 3;\n var defaultValue = 5;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n var val = parseInt(initialValue, 10);\n return !isNaN(val) && val >= minValue ? val : defaultValue;\n }),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n var handleChange = function handleChange(e) {\n setInputValue(e.target.value);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings-field_title\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Brute Force Protection options', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\",\n style: {\n marginBottom: '15px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __(\n // eslint-disable-next-line max-len\n 'If someone fails 5 authorizations in a row within 15 minutes, plugin blocks the visitor for 1 hour by placing a record with \"Blocked by BruteForce protection system\" status to FireWall.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Maximum authorization tries', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"number\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n min: \"3\",\n max: \"20\",\n onChange: handleChange\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BfpAllowedWrongAuths)\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__);\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;\nvar __ = wp.i18n.__;\nvar MIN_VALUE = 3;\nvar MAX_VALUE = 20;\nvar DEFAULT_VALUE = 5;\nfunction normalizeAuthsValue(value) {\n var parsed = parseInt(value, 10);\n if (isNaN(parsed) || parsed < MIN_VALUE) {\n return DEFAULT_VALUE;\n }\n if (parsed > MAX_VALUE) {\n return MAX_VALUE;\n }\n return parsed;\n}\nfunction BfpAllowedWrongAuths(props) {\n var id = props.id,\n name = props.name,\n initialValue = props.value,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n return normalizeAuthsValue(initialValue);\n }),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(normalizeAuthsValue(initialValue));\n }, [initialValue]);\n var handleChange = function handleChange(e) {\n var next = e.target.value;\n setInputValue(next);\n\n // Propagate only in-range values so intermediate keystrokes\n // (e.g. \"1\" while typing \"10\") do not reset the input via parent.\n var parsed = parseInt(next, 10);\n if (!isNaN(parsed) && parsed >= MIN_VALUE && parsed <= MAX_VALUE) {\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, parsed);\n }\n };\n var handleBlur = function handleBlur() {\n var normalized = normalizeAuthsValue(inputValue);\n setInputValue(normalized);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, normalized);\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Maximum authorization tries', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"number\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n min: MIN_VALUE,\n max: MAX_VALUE,\n className: \"spbc_setting_field\",\n onChange: handleChange,\n onBlur: handleBlur\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js?\n}"); /***/ }, @@ -606,7 +646,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 */ BfpBlockPeriod5Fails)\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 _FormElements_Select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/Select */ \"./js/src/react/components/FormElements/Select.js\");\n\n\nvar __ = wp.i18n.__;\nfunction BfpBlockPeriod5Fails(props) {\n var id = props.id,\n name = props.name,\n value = props.value;\n var options = [{\n value: '120',\n label: __('2 minutes', 'security-malware-firewall')\n }, {\n value: '300',\n label: __('5 minutes', 'security-malware-firewall')\n }, {\n value: '600',\n label: __('10 minutes', 'security-malware-firewall')\n }, {\n value: '1800',\n label: __('30 minutes', 'security-malware-firewall')\n }, {\n value: '3600',\n label: __('1 hour', 'security-malware-firewall')\n }, {\n value: '10800',\n label: __('3 hours', 'security-malware-firewall')\n }, {\n value: '21600',\n label: __('6 hours', 'security-malware-firewall')\n }, {\n value: '43200',\n label: __('12 hours', 'security-malware-firewall')\n }, {\n value: '86400',\n label: __('24 hours', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Blocking for', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_Select__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: 'spbc_setting_' + id,\n name: name,\n value: String(value),\n options: options,\n className: \"spbc_setting_field\"\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpBlockPeriod5Fails.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BfpBlockPeriod5Fails)\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 _FormElements_Select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/Select */ \"./js/src/react/components/FormElements/Select.js\");\n\n\nvar __ = wp.i18n.__;\nfunction BfpBlockPeriod5Fails(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var options = [{\n value: '120',\n label: __('2 minutes', 'security-malware-firewall')\n }, {\n value: '300',\n label: __('5 minutes', 'security-malware-firewall')\n }, {\n value: '600',\n label: __('10 minutes', 'security-malware-firewall')\n }, {\n value: '1800',\n label: __('30 minutes', 'security-malware-firewall')\n }, {\n value: '3600',\n label: __('1 hour', 'security-malware-firewall')\n }, {\n value: '10800',\n label: __('3 hours', 'security-malware-firewall')\n }, {\n value: '21600',\n label: __('6 hours', 'security-malware-firewall')\n }, {\n value: '43200',\n label: __('12 hours', 'security-malware-firewall')\n }, {\n value: '86400',\n label: __('24 hours', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Blocking for', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_Select__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: 'spbc_setting_' + id,\n name: name,\n value: String(value),\n options: options,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, parseInt(e.target.value, 10));\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpBlockPeriod5Fails.js?\n}"); /***/ }, @@ -616,7 +656,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 */ BfpCountInterval)\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 _FormElements_Select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/Select */ \"./js/src/react/components/FormElements/Select.js\");\n\n\nvar __ = wp.i18n.__;\nfunction BfpCountInterval(props) {\n var id = props.id,\n name = props.name,\n value = props.value;\n var options = [{\n value: '300',\n label: __('5 minutes', 'security-malware-firewall')\n }, {\n value: '600',\n label: __('10 minutes', 'security-malware-firewall')\n }, {\n value: '900',\n label: __('15 minutes', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Time frame to measure login attempts', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_Select__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: 'spbc_setting_' + id,\n name: name,\n value: String(value),\n options: options,\n className: \"spbc_setting_field\"\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ BfpCountInterval)\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 _FormElements_Select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/Select */ \"./js/src/react/components/FormElements/Select.js\");\n\n\nvar __ = wp.i18n.__;\nfunction BfpCountInterval(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var options = [{\n value: '300',\n label: __('5 minutes', 'security-malware-firewall')\n }, {\n value: '600',\n label: __('10 minutes', 'security-malware-firewall')\n }, {\n value: '900',\n label: __('15 minutes', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Time frame to measure login attempts', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_Select__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: 'spbc_setting_' + id,\n name: name,\n value: String(value),\n options: options,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, parseInt(e.target.value, 10));\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js?\n}"); /***/ }, @@ -640,6 +680,16 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa /***/ }, +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js" +/*!**************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js ***! + \**************************************************************************************/ +(__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 */ BfpEnabled)\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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nvar BFP_CHILDREN = 'bfp__allowed_wrong_auths,bfp__count_interval,bfp__block_period__5_fails';\n\n/**\n * Mirrors PHP spbc_seconds_to_human_time().\n *\n * @param {number|string} seconds\n * @return {string}\n */\nfunction secondsToHumanTime(seconds) {\n var sec = parseInt(seconds, 10) || 0;\n if (sec % 60 !== 0) {\n return sec + ' seconds';\n }\n if (sec / 60 / 60 < 1) {\n var minutes = sec / 60;\n if (minutes < 1) {\n return sec === 1 ? sec + ' second' : sec + ' seconds';\n }\n return minutes + (sec > 60 ? ' minutes' : ' minute');\n }\n if (sec / 60 / 60 / 24 < 1) {\n var hours = sec / 60 / 60;\n return hours + (sec > 3600 ? ' hours' : ' hour');\n }\n if (sec / 60 / 60 / 24 / 30 < 1) {\n var days = sec / 60 / 60 / 24;\n return days + (sec > 86400 ? ' days' : ' day');\n }\n return sec + ' seconds';\n}\nfunction BfpEnabled(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n groupSettings = props.groupSettings;\n var isEnabled = value === 1 || value === '1' || value === true;\n var allowedWrongAuths = parseInt(groupSettings === null || groupSettings === void 0 ? void 0 : groupSettings.bfp__allowed_wrong_auths, 10) || 5;\n var countIntervalMinutes = Math.floor((parseInt(groupSettings === null || groupSettings === void 0 ? void 0 : groupSettings.bfp__count_interval, 10) || 900) / 60);\n var blockPeriodHuman = secondsToHumanTime((groupSettings === null || groupSettings === void 0 ? void 0 : groupSettings.bfp__block_period__5_fails) || 3600);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(BFP_CHILDREN, isEnabled ? 1 : 0);\n }\n }, [isEnabled]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: isEnabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(BFP_CHILDREN, next);\n }\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Brute Force Protection', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, sprintf(\n // eslint-disable-next-line max-len\n __('If someone fails %s authorizations in a row within %s minutes, plugin blocks the visitor for %s by placing a record with \"Blocked by BruteForce protection system\" status to FireWall.', 'security-malware-firewall'), allowedWrongAuths, countIntervalMinutes, blockPeriodHuman))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js?\n}"); + +/***/ }, + /***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CDNCheckerEnabled.js" /*!*********************************************************************************************!*\ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CDNCheckerEnabled.js ***! @@ -670,13 +720,33 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa /***/ }, +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js" +/*!*************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js ***! + \*************************************************************************************************/ +(__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 */ DataAdditionalHeaders)\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\nvar __ = wp.i18n.__;\nfunction DataAdditionalHeaders(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Send additional HTTP headers', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Add these headers to the HTTP responses on the public pages: X-Content-Type-Options, X-XSS-Protection to get protection from XSS and drive-by download attacks.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js" +/*!******************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js ***! + \******************************************************************************************/ +(__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 */ DataSetCookies)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n\n\nvar __ = wp.i18n.__;\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string|number} props.value\n * @param {function(string, *): void} [props.onSettingChange]\n * @return {JSX.Element}\n */\nfunction DataSetCookies(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var options = [{\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '0',\n label: __('Off', 'security-malware-firewall')\n }, {\n value: '2',\n label: __('Alternative mechanism', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Set cookies', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n marginBottom: 10\n },\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, __('Turn this option off or use the alternative mechanism for cookies to forbid the plugin generate any cookies on the website\\'s front-end.', 'security-malware-firewall'), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), __('Alternative mechanism will store data in the website database and will not set cookies in browsers, so any cache solution will work just fine.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: value !== null && value !== void 0 ? value : '0',\n options: options,\n onChange: function onChange(e) {\n var next = e.target.value;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n },\n disabled: false\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js?\n}"); + +/***/ }, + /***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js" /*!*****************************************************************************************************!*\ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js ***! \*****************************************************************************************************/ (__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 */ EditTechSupportUrlEnabled)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.js\");\n/* harmony import */ var _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlEnabled(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n authLoginPageUrl = props.authLoginPageUrl,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_2__.isAuth2faActive)(groupSettings);\n var disabled = !twoFaOn;\n var loginUrl = authLoginPageUrl || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__enabled', next);\n handleSettingsDependencies('edit_tech_support_url__link,edit_tech_support_url__remove')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Change the technical support link on the 2FA authorization page.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Set your own site-based URL for a support page.', 'security-malware-firewall'), ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: loginUrl,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, loginUrl))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ EditTechSupportUrlEnabled)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.js\");\n/* harmony import */ var _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlEnabled(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n authLoginPageUrl = props.authLoginPageUrl,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_2__.isAuth2faActive)(groupSettings);\n var disabled = !twoFaOn;\n var loginUrl = authLoginPageUrl || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__enabled', next);\n handleSettingsDependencies('edit_tech_support_url__link,edit_tech_support_url__remove')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Change the technical support link on the 2FA authorization page.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Set your own site-based URL for a support page.', 'security-malware-firewall'), ' ', /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: loginUrl,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, loginUrl))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js?\n}"); /***/ }, @@ -686,7 +756,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 */ EditTechSupportUrlLink)\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 _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlLink(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isAuth2faActive)(groupSettings);\n var techOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isEditTechSupportUrlEnabled)(groupSettings);\n var disabled = !twoFaOn || !techOn;\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Technical support URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: disabled,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__link', e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ EditTechSupportUrlLink)\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 _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlLink(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isAuth2faActive)(groupSettings);\n var techOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isEditTechSupportUrlEnabled)(groupSettings);\n var disabled = !twoFaOn || !techOn;\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Technical support URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: disabled,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__link', e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js?\n}"); /***/ }, @@ -696,7 +766,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 */ EditTechSupportUrlRemove)\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 _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlRemove(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isAuth2faActive)(groupSettings);\n var techOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isEditTechSupportUrlEnabled)(groupSettings);\n var disabled = !twoFaOn || !techOn;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__remove', e.target.checked ? 1 : 0);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Remove the technical support link from the 2FA authorization page', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ EditTechSupportUrlRemove)\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 _editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./editTechSupportUrlUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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\nvar __ = wp.i18n.__;\nfunction EditTechSupportUrlRemove(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var twoFaOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isAuth2faActive)(groupSettings);\n var techOn = (0,_editTechSupportUrlUtils__WEBPACK_IMPORTED_MODULE_1__.isEditTechSupportUrlEnabled)(groupSettings);\n var disabled = !twoFaOn || !techOn;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('edit_tech_support_url__remove', e.target.checked ? 1 : 0);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Remove the technical support link from the 2FA authorization page', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js?\n}"); /***/ }, @@ -716,7 +786,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 */ LoginPageRenameEnabled)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameEnabled(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__enabled', next);\n handleSettingsDependencies('login_page_rename__name,' + 'login_page_rename__redirect,' + 'login_page_rename__send_email_notification')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Change address to login script', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Please note that this will not hide the links to your registration page on your website.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ LoginPageRenameEnabled)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameEnabled(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__enabled', next);\n handleSettingsDependencies('login_page_rename__name,' + 'login_page_rename__redirect,' + 'login_page_rename__send_email_notification')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Change address to login script', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Please note that this will not hide the links to your registration page on your website.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js?\n}"); /***/ }, @@ -726,7 +796,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 */ LoginPageRenameName)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameName(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Login URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: !renameOn,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__name', e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ LoginPageRenameName)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameName(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Login URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: !renameOn,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__name', e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js?\n}"); /***/ }, @@ -736,7 +806,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 */ LoginPageRenameRedirect)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameRedirect(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Redirect URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: !renameOn,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__redirect', e.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('If someone tries to access the default login page they will be redirected to the URL above.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ LoginPageRenameRedirect)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameRedirect(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var prefix = techSupportUrlPrefix || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_middle_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Redirect URL: ', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, prefix)), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: !renameOn,\n className: \"spbc_middle_text_field spbc_setting_field\",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__redirect', e.target.value);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('If someone tries to access the default login page they will be redirected to the URL above.', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js?\n}"); /***/ }, @@ -746,7 +816,87 @@ 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 */ LoginPageRenameSendEmail)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameSendEmail(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var disabled = !renameOn || !canActivatePlugins;\n var email = loginRenameNotifyAdminEmail || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__send_email_notification', e.target.checked ? 1 : 0);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Send the notification with the new login page URL to the admin email address', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"login_page_rename__send_email_notification\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('The email will be sent to', 'security-malware-firewall'), ' ', \"(\", email, \")\")));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ LoginPageRenameSendEmail)\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 _loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loginPageRenameUtils */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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\nvar __ = wp.i18n.__;\nfunction LoginPageRenameSendEmail(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value === 1 || value === '1' || value === true),\n _useState2 = _slicedToArray(_useState, 2),\n checked = _useState2[0],\n setChecked = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setChecked(value === 1 || value === '1' || value === true);\n }, [value]);\n var renameOn = (0,_loginPageRenameUtils__WEBPACK_IMPORTED_MODULE_1__.isLoginPageRenameEnabled)(groupSettings);\n var disabled = !renameOn || !canActivatePlugins;\n var email = loginRenameNotifyAdminEmail || '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: \"1\",\n checked: checked,\n disabled: disabled,\n className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n setChecked(e.target.checked);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange('login_page_rename__send_email_notification', e.target.checked ? 1 : 0);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Send the notification with the new login page URL to the admin email address', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"login_page_rename__send_email_notification\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('The email will be sent to', 'security-malware-firewall'), ' ', \"(\", email, \")\")));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js" +/*!*************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js ***! + \*************************************************************************************************/ +(__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 */ MiscBackendLogsEnable)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nvar createInterpolateElement = wp.element.createInterpolateElement;\nfunction MiscBackendLogsEnable(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n wlCompanyName = props.wlCompanyName;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n myBillingLink = _ref.myBillingLink,\n backendLogsEnabled = _ref.backendLogsEnabled,\n backendLogsLink = _ref.backendLogsLink,\n wlModeEnabled = _ref.wlModeEnabled;\n var isDisabled = !backendLogsEnabled;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n disabled: isDisabled,\n onChange: function onChange(e) {\n if (isDisabled) {\n return;\n }\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Collect and send PHP logs', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), backendLogsEnabled || wlModeEnabled ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('Collect and send PHP error logs to your %s Dashboard where you can list them.', 'security-malware-firewall'), wlModeEnabled && wlCompanyName ? wlCompanyName : __('CleanTalk', 'security-malware-firewall'))) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, createInterpolateElement(__('To see the collected logs please use the Backend PHP log. The extra package is required to start the collection, please click \"Synchronize with the Cloud\" in the plugin settings after purchasing the Extra package.', 'security-malware-firewall'), {\n a1: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: backendLogsLink,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n }),\n a2: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: myBillingLink,\n target: \"_blank\",\n rel: \"noopener noreferrer\"\n })\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js" +/*!****************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js ***! + \****************************************************************************************************/ +(__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 */ MiscCompleteDeactivation)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction MiscCompleteDeactivation(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n spbctPluginDir = _ref.spbctPluginDir,\n directorySeparator = _ref.directorySeparator;\n var backupDir = \"\".concat(spbctPluginDir !== null && spbctPluginDir !== void 0 ? spbctPluginDir : '', \"backups\").concat(directorySeparator !== null && directorySeparator !== void 0 ? directorySeparator : '/');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Complete deactivation', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('The plugin will leave no traces in WordPress after deactivation. It could help if you have problems with the plugin. All files backed up by Malware scanner will be removed from %s directory.', 'security-malware-firewall'), backupDir)));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js" +/*!*************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js ***! + \*************************************************************************************************/ +(__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 */ MiscDisableFileEditor)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n\n\nvar __ = wp.i18n.__;\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string|number} props.value\n * @param {function} props.onSettingChange\n * @return {JSX.Element}\n */\nfunction MiscDisableFileEditor(props) {\n var _window$spbcSettings;\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var options = [{\n value: '0',\n label: __('Off', 'security-malware-firewall')\n }, {\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '2',\n label: __('Auto', 'security-malware-firewall')\n }];\n var isDisabled = !((_window$spbcSettings = window.spbcSettings) !== null && _window$spbcSettings !== void 0 && _window$spbcSettings.wpms);\n var msDisabledText = __('This setting is controlled by the network administrator.', 'security-malware-firewall');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Disable File Editor', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"misc_disable_file_editor\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), isDisabled ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"notice notice-info\",\n style: {\n margin: '10px 0'\n }\n }, msDisabledText) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: value !== null && value !== void 0 ? value : '0',\n options: options,\n onChange: function onChange(e) {\n var next = e.target.value;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js" +/*!*****************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js ***! + \*****************************************************************************************************/ +(__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 */ MiscForbidToShowInIframes)\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\nvar __ = wp.i18n.__;\nfunction MiscForbidToShowInIframes(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Forbid to show your website in iFrame tags on third-party websites', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('If this option is enabled, third-party websites can\\'t show content of your website in IFrames.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js" +/*!*******************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js ***! + \*******************************************************************************************************/ +(__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 */ MiscPreventLoginsCollecting)\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\nvar __ = wp.i18n.__;\nfunction MiscPreventLoginsCollecting(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Prevent collecting of authors logins', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Prevent visitors from collecting logins of the content authors from the website links (like example.com/?author=1).', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js" +/*!**********************************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js ***! + \**********************************************************************************************************************/ +(__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 */ MiscPreventLoginsCollectingOnPasswordReset)\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\nvar __ = wp.i18n.__;\nfunction MiscPreventLoginsCollectingOnPasswordReset(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Prevent collecting of user login on password reset', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('The password reset error will not contain the data about selected username does not exist.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js" +/*!***************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js ***! + \***************************************************************************************************/ +(__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 */ MiscShowLinkInLoginForm)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction MiscShowLinkInLoginForm(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n wlCompanyName = props.wlCompanyName;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n brandname = _ref.brandname;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Let them know about protection', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('Place the %s warning under the website login form: \"Brute-force protection by %s. All attempts are being logged.', 'security-malware-firewall'), wlCompanyName !== null && wlCompanyName !== void 0 ? wlCompanyName : __('CleanTalk', 'security-malware-firewall'), brandname !== null && brandname !== void 0 ? brandname : __('Security by CleanTalk', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js" +/*!*******************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js ***! + \*******************************************************************************************/ +(__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 */ MonitoringUsers)\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 _FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputHidden */ \"./js/src/react/components/FormElements/InputHidden.js\");\n\n\nfunction MonitoringUsers(props) {\n var id = props.id,\n name = props.name,\n value = props.value;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputHidden__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: value || '1'\n });\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js?\n}"); /***/ }, @@ -766,7 +916,47 @@ 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 */ OutboundLinksMirrors)\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__);\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\nvar __ = wp.i18n.__;\nfunction OutboundLinksMirrors(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Exclusions:', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: true,\n className: \"spbc_long_text_field spbc_setting_field\",\n style: {\n maxWidth: 500\n },\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksMirrors.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ OutboundLinksMirrors)\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__);\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;\nvar __ = wp.i18n.__;\nfunction OutboundLinksMirrors(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Exclusions:', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: true,\n className: \"spbc_long_text_field spbc_setting_field\",\n style: {\n maxWidth: 500\n },\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksMirrors.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js" +/*!********************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js ***! + \********************************************************************************************************/ +(__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 */ SPBCTrustedAndAffiliateAddId)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar __ = wp.i18n.__;\nfunction SPBCTrustedAndAffiliateAddId(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n wlCompanyName = props.wlCompanyName;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n trustedAndAffiliateAddIdLink = _ref.trustedAndAffiliateAddIdLink;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Append your affiliate ID', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Enable this option to append your specific affiliate ID to the trust text created by the options above (\"Shortcode\" or \"Add to the footer\"). Terms and your affiliate ID of the', 'security-malware-firewall'), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: trustedAndAffiliateAddIdLink,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, wlCompanyName + __('Affiliate Program', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js" +/*!*********************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js ***! + \*********************************************************************************************************/ +(__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 */ SPBCTrustedAndAffiliateFooter)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction SPBCTrustedAndAffiliateFooter(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n brandname = _ref.brandname;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Add to the footer', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('Adds trust text stating that the website is protected from malware by %s protection to the footer of your website.', 'security-malware-firewall'), brandname !== null && brandname !== void 0 ? brandname : __('Security by CleanTalk', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js" +/*!************************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js ***! + \************************************************************************************************************/ +(__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 */ SPBCTrustedAndAffiliateShortcode)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.js\");\n/* harmony import */ var _App__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\n\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction SPBCTrustedAndAffiliateShortcode(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_2__.DataRootContext) || {},\n brandname = _ref.brandname;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n handleSettingsDependencies('spbc_trusted_and_affiliate__shortcode_tag')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Shortcode', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('You can place this shortcode anywhere on your website. Adds trust text stating that the website is protected from malware by %s protection', 'security-malware-firewall'), brandname !== null && brandname !== void 0 ? brandname : __('Security by CleanTalk', 'security-malware-firewall'))));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js" +/*!***************************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js ***! + \***************************************************************************************************************/ +(__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 */ SPBCTrustedAndAffiliateShortcodeTag)\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\nvar __ = wp.i18n.__;\nvar SHORTCODE_VALUE = '[cleantalk_security_affiliate_link]';\nfunction SPBCTrustedAndAffiliateShortcodeTag(props) {\n var id = props.id,\n name = props.name,\n groupSettings = props.groupSettings;\n var parentValue = groupSettings === null || groupSettings === void 0 ? void 0 : groupSettings['spbc_trusted_and_affiliate__shortcode'];\n var isDisabled = !parentValue || parentValue === 0 || parentValue === '0';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_affiliate_shortcode spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: SHORTCODE_VALUE,\n readOnly: true,\n disabled: isDisabled,\n className: \"spbc_affiliate_shortcode\"\n }), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--text\"\n }, __('<- Copy this text and place shortcode wherever you need.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js?\n}"); /***/ }, @@ -1036,7 +1226,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 */ TrafficControlAutoblockAmount)\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__);\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\nvar __ = wp.i18n.__;\nfunction TrafficControlAutoblockAmount(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_short_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Block a visitor if count of the opened pages in the Time frame more than', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: false,\n className: \"spbc_short_text_field spbc_setting_field \",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockAmount.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ TrafficControlAutoblockAmount)\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__);\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;\nvar __ = wp.i18n.__;\nfunction TrafficControlAutoblockAmount(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value !== undefined && value !== null ? String(value) : ''),\n _useState2 = _slicedToArray(_useState, 2),\n inputValue = _useState2[0],\n setInputValue = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n setInputValue(value !== undefined && value !== null ? String(value) : '');\n }, [value]);\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field spbc_short_text_field spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Block a visitor if count of the opened pages in the Time frame more than', 'security-malware-firewall'))), \"\\xA0\", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"text\",\n id: 'spbc_setting_' + id,\n name: name,\n value: inputValue,\n disabled: false,\n className: \"spbc_short_text_field spbc_setting_field \",\n onChange: function onChange(e) {\n setInputValue(e.target.value);\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockAmount.js?\n}"); /***/ }, @@ -1110,6 +1300,86 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa /***/ }, +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js" +/*!**************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js ***! + \**************************************************************************************************/ +(__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 */ VulnerabilityCheckDesc)\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\nvar __ = wp.i18n.__;\nfunction VulnerabilityCheckDesc() {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, __('The Security plugin performs a scheduled request to the CleanTalk API to check every installed plugin or theme for known vulnerabilities. The report data are updated with the next triggers:', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"ul\", {\n style: {\n marginLeft: '2%',\n listStyle: 'disc'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", null, __('within 100 seconds of any plugin or theme being activated', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", null, __('within 30 seconds since the Security plugin is activated', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"li\", null, __('every 24 hours after the last update', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"p\", null, __('Also, the single check runs every time you observe plugins/themes install pages for every listed item.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js" +/*!********************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js ***! + \********************************************************************************************************/ +(__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 */ VulnerabilityCheckEnableCron)\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 _hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../hooks/useSettingsDependencies */ \"./js/src/react/hooks/useSettingsDependencies.js\");\n\n\nvar __ = wp.i18n.__;\nfunction VulnerabilityCheckEnableCron(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n handleSettingsDependencies('vulnerability_check__warn_on_modules_pages')(e);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Test already installed plugins for known vulnerabilities', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Every 24 hours the plugin checks all the installed plugins over database research.cleantalk.org.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js" +/*!*********************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js ***! + \*********************************************************************************************************/ +(__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 */ VulnerabilityCheckShowReports)\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\nvar __ = wp.i18n.__;\nfunction VulnerabilityCheckShowReports(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Show security reports for plugins and themes before install a new one', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Plugin reports in Appearance -> Themes and Plugins -> Add New Plugin about security tests that have been done for a specific version of plugin or theme. These tests provided by CleanTalk Research team or/and Cloud Malware Scanner.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js" +/*!***************************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js ***! + \***************************************************************************************************************/ +(__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 */ VulnerabilityCheckTestBeforeInstall)\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\nvar __ = wp.i18n.__;\nfunction VulnerabilityCheckTestBeforeInstall(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Test plugins for known vulnerabilities before install them', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Request the research.cleantalk.org about the plugin status to let you know about vulnerability status on the page [Plugins->Add new]', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js" +/*!****************************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js ***! + \****************************************************************************************************************/ +(__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 */ VulnerabilityCheckWarnOnModulesPages)\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\nvar __ = wp.i18n.__;\nfunction VulnerabilityCheckWarnOnModulesPages(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_sub_setting\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Warn me about known vulnerabilities of already installed plugins', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Modify the page of installed plugins to let you know about vulnerabilities found', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js" +/*!*************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js ***! + \*************************************************************************************************/ +(__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 */ WPDashboardWidgetShow)\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\nvar __ = wp.i18n.__;\nfunction WPDashboardWidgetShow(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Security brief report widget', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Shows the brief widget on the main admin page', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js" +/*!**********************************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js ***! + \**********************************************************************************************************/ +(__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 */ WPUploadDirPreventPhpExecution)\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 _App__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../App */ \"./js/src/react/components/App.js\");\n\n\nvar __ = wp.i18n.__;\nfunction WPUploadDirPreventPhpExecution(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var _ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_App__WEBPACK_IMPORTED_MODULE_1__.DataRootContext) || {},\n wpUploadDirPreventPhpExecutionDesc = _ref.wpUploadDirPreventPhpExecutionDesc;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Disable PHP execution in uploads folder', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, wpUploadDirPreventPhpExecutionDesc));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js" +/*!***********************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js ***! + \***********************************************************************************************/ +(__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 */ WPUseBuiltinHttpApi)\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\nvar _wp$i18n = wp.i18n,\n __ = _wp$i18n.__,\n sprintf = _wp$i18n.sprintf;\nfunction WPUseBuiltinHttpApi(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange,\n wlCompanyName = props.wlCompanyName;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Use WordPress HTTP API', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, sprintf(__('Alternative way of connection to the %s Cloud. Enable it if you have connection issues.', 'security-malware-firewall'), wlCompanyName)));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js?\n}"); + +/***/ }, + /***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafBlockerEnabled.js" /*!*********************************************************************************************!*\ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafBlockerEnabled.js ***! @@ -1160,6 +1430,26 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa /***/ }, +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js" +/*!********************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js ***! + \********************************************************************************************/ +(__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 */ WpDisableRestApi)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n\n\nvar __ = wp.i18n.__;\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string|number} props.value\n * @param {string} props.verificationEmail\n * @param {function(string, *): void} [props.onSettingChange]\n * @param {{value: string, label: string}[]} [props.wpUserRolesOptions]\n * @return {JSX.Element}\n */\nfunction WpDisableRestApi(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n var options = [{\n value: '0',\n label: __('Off', 'security-malware-firewall')\n }, {\n value: '1',\n label: __('Disable endpoint \"users\"', 'security-malware-firewall')\n }, {\n value: '2',\n label: __('Disable all endpoints', 'security-malware-firewall')\n }];\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Disable WordPress REST API', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"wp__disable_rest_api\",\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n style: {\n marginBottom: 10\n },\n className: \"spbc_settings_description\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Restrict access to WordPress REST API endpoints for non-authenticated users. Select the mode below.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n id: id,\n name: name,\n value: value !== null && value !== void 0 ? value : '0',\n options: options,\n onChange: function onChange(e) {\n var next = e.target.value;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n },\n disabled: false\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js?\n}"); + +/***/ }, + +/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js" +/*!*******************************************************************************************!*\ + !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js ***! + \*******************************************************************************************/ +(__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 */ WpDisableXmlrpc)\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\nvar __ = wp.i18n.__;\nfunction WpDisableXmlrpc(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onSettingChange = props.onSettingChange;\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"input\", {\n type: \"checkbox\",\n id: 'spbc_setting_' + id,\n name: name,\n value: value,\n checked: value === 1 || value === '1' || value === true,\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n onSettingChange === null || onSettingChange === void 0 || onSettingChange(id, next);\n }\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"label\", {\n htmlFor: 'spbc_setting_' + id,\n className: \"spbc_setting-field_title--field\"\n }, __('Disable XML-RPC', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": id,\n className: \"spbc_long_description__show spbc-icon-help-circled\"\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, __('Turn this on to disable a WordPress out-of-date technology of connecting websites to miscellaneous systems.', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js?\n}"); + +/***/ }, + /***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js" /*!***************************************************************************************************!*\ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js ***! @@ -1186,7 +1476,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 */ SettingsGroup)\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 _Settings_SettingApiKey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Settings/SettingApiKey */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingApiKey.js\");\n/* harmony import */ var _Settings_SettingWpmsWorkMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Settings/SettingWpmsWorkMode */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingWpmsWorkMode.js\");\n/* harmony import */ var _Settings_SettingWpmsHosterApiKey__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Settings/SettingWpmsHosterApiKey */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingWpmsHosterApiKey.js\");\n/* harmony import */ var _Settings_BfpDelay1Fails__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Settings/BfpDelay1Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpDelay1Fails.js\");\n/* harmony import */ var _Settings_BfpDelay5Fails__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Settings/BfpDelay5Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpDelay5Fails.js\");\n/* harmony import */ var _Settings_BfpAllowedWrongAuths__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings/BfpAllowedWrongAuths */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js\");\n/* harmony import */ var _Settings_BfpCountInterval__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Settings/BfpCountInterval */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js\");\n/* harmony import */ var _Settings_BfpBlockPeriod5Fails__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Settings/BfpBlockPeriod5Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpBlockPeriod5Fails.js\");\n/* harmony import */ var _Settings_CheckPassEnable__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Settings/CheckPassEnable */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js\");\n/* harmony import */ var _Settings_CheckPassRoles__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Settings/CheckPassRoles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js\");\n/* harmony import */ var _Settings_2faEnable__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Settings/2faEnable */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js\");\n/* harmony import */ var _Settings_2faRoles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Settings/2faRoles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlEnabled__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlLink__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlLink */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlRemove__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlRemove */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js\");\n/* harmony import */ var _Settings_LoginPageRenameEnabled__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Settings/LoginPageRenameEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js\");\n/* harmony import */ var _Settings_LoginPageRenameName__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Settings/LoginPageRenameName */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js\");\n/* harmony import */ var _Settings_LoginPageRenameRedirect__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Settings/LoginPageRenameRedirect */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js\");\n/* harmony import */ var _Settings_LoginPageRenameSendEmail__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Settings/LoginPageRenameSendEmail */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js\");\n/* harmony import */ var _Settings_ActionShuffleSalts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Settings/ActionShuffleSalts */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js\");\n/* harmony import */ var _Settings_FwCustomMessage__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Settings/FwCustomMessage */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/FwCustomMessage.js\");\n/* harmony import */ var _Settings_SecFwEnabled__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Settings/SecFwEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SecFwEnabled.js\");\n/* harmony import */ var _Settings_WafEnabled__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Settings/WafEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafEnabled.js\");\n/* harmony import */ var _Settings_WafXssCheck__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Settings/WafXssCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafXssCheck.js\");\n/* harmony import */ var _Settings_WafSqlCheck__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Settings/WafSqlCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafSqlCheck.js\");\n/* harmony import */ var _Settings_WafExploitCheck__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Settings/WafExploitCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafExploitCheck.js\");\n/* harmony import */ var _Settings_WafBlockerEnabled__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Settings/WafBlockerEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafBlockerEnabled.js\");\n/* harmony import */ var _Settings_UploadCheckerFiles__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Settings/UploadCheckerFiles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/UploadCheckerFiles.js\");\n/* harmony import */ var _Settings_UploadCheckerModules__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Settings/UploadCheckerModules */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/UploadCheckerModules.js\");\n/* harmony import */ var _Settings_TrafficControlEnabled__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Settings/TrafficControlEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlEnabled.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockTimeframe__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockTimeframe */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockTimeframe.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockAmount__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockAmount */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockAmount.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockPeriod__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockPeriod.js\");\n/* harmony import */ var _Settings_TrafficControlExcludeAuthorizedUsers__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Settings/TrafficControlExcludeAuthorizedUsers */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlExcludeAuthorizedUsers.js\");\n/* harmony import */ var _Settings_VisitorIPFromHeader__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Settings/VisitorIPFromHeader */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VisitorIPFromHeader.js\");\n/* harmony import */ var _Settings_CDNCheckerEnabled__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Settings/CDNCheckerEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CDNCheckerEnabled.js\");\n/* harmony import */ var _Settings_ScannerAutoStartEnabled__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Settings/ScannerAutoStartEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartEnabled.js\");\n/* harmony import */ var _Settings_ScannerAutoStartPeriod__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Settings/ScannerAutoStartPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartPeriod.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManual__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManual */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManual.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManualTime__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManualTime */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManualTime.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManualTZ__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManualTZ */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManualTZ.js\");\n/* harmony import */ var _Settings_OutboundLinksEnabled__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Settings/OutboundLinksEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksEnabled.js\");\n/* harmony import */ var _Settings_OutboundLinksMirrors__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Settings/OutboundLinksMirrors */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksMirrors.js\");\n/* harmony import */ var _Settings_ScannerImportantFilesListing__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Settings/ScannerImportantFilesListing */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerImportantFilesListing.js\");\n/* harmony import */ var _Settings_ScannerHeuristicAnalysis__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Settings/ScannerHeuristicAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerHeuristicAnalysis.js\");\n/* harmony import */ var _Settings_ScannerHeuristicAnalysisAutoSend__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Settings/ScannerHeuristicAnalysisAutoSend */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerHeuristicAnalysisAutoSend.js\");\n/* harmony import */ var _Settings_ScannerSignatureAnalysis__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Settings/ScannerSignatureAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerSignatureAnalysis.js\");\n/* harmony import */ var _Settings_ScannerBinaryAnalysis__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Settings/ScannerBinaryAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerBinaryAnalysis.js\");\n/* harmony import */ var _Settings_ScannerOSCronAnalysis__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Settings/ScannerOSCronAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerOSCronAnalysis.js\");\n/* harmony import */ var _Settings_ScannerDBTriggerAnalysis__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Settings/ScannerDBTriggerAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerDBTriggerAnalysis.js\");\n/* harmony import */ var _Settings_ScannerPathExclusionsView__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Settings/ScannerPathExclusionsView */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerPathExclusionsView.js\");\n/* harmony import */ var _Settings_ScannerCureMalware__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Settings/ScannerCureMalware */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerCureMalware.js\");\n/* harmony import */ var _Settings_ScannerFrontendAnalysis__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Settings/ScannerFrontendAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendAnalysis.js\");\n/* harmony import */ var _Settings_ScannerFrontendAnalysisCSRFEnabled__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Settings/ScannerFrontendAnalysisCSRFEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendAnalysisCSRFEnabled.js\");\n/* harmony import */ var _Settings_ScannerFrontendDomainExclusionsView__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Settings/ScannerFrontendDomainExclusionsView */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendDomainExclusionsView.js\");\n/* harmony import */ var _Settings_ScannerListUnknownFiles__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Settings/ScannerListUnknownFiles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListUnknownFiles.js\");\n/* harmony import */ var _Settings_ScannerFSWatcherEnabled__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Settings/ScannerFSWatcherEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFSWatcherEnabled.js\");\n/* harmony import */ var _Settings_ScannerListUnknownOlderThan__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Settings/ScannerListUnknownOlderThan */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListUnknownOlderThan.js\");\n/* harmony import */ var _Settings_ScannerFSWSnapshotsPeriod__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Settings/ScannerFSWSnapshotsPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFSWSnapshotsPeriod.js\");\n/* harmony import */ var _Settings_ScannerListApprovedByCleantalk__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Settings/ScannerListApprovedByCleantalk */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListApprovedByCleantalk.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction SettingsGroup(props) {\n var groupId = props.groupId,\n groupTitle = props.groupTitle,\n groupDescription = props.groupDescription,\n settings = props.settings,\n settingsSlug = props.settingsSlug,\n keyIsOk = props.keyIsOk,\n wpUserRolesOptions = props.wpUserRolesOptions,\n verificationEmail = props.verificationEmail,\n authLoginPageUrl = props.authLoginPageUrl,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n shuffleSaltsUnlocked = props.shuffleSaltsUnlocked,\n visitorIpSources = props.visitorIpSources,\n scannerExclusionsDir = props.scannerExclusionsDir,\n scannerExclusionsURL = props.scannerExclusionsURL,\n visitorCurrentIp = props.visitorCurrentIp,\n nextScheduledScanDescription = props.nextScheduledScanDescription,\n scannerAutoStartManualTimezone = props.scannerAutoStartManualTimezone,\n wlCompanyName = props.wlCompanyName;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings),\n _useState2 = _slicedToArray(_useState, 2),\n liveSettings = _useState2[0],\n setLiveSettings = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (groupId === 'auth_and_logging_in' || groupId === 'firewall' || groupId === 'scanner_settings') {\n setLiveSettings(settings);\n }\n }, [groupId, settings]);\n var patchSetting = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (key, val) {\n setLiveSettings(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, key, val));\n });\n }, []);\n var displaySettings = groupId === 'auth_and_logging_in' || groupId === 'firewall' || groupId === 'scanner_settings' ? liveSettings : settings;\n var componentMap = {\n 'spbc_key': _Settings_SettingApiKey__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n 'ms__work_mode': _Settings_SettingWpmsWorkMode__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n 'ms__hoster_api_key': _Settings_SettingWpmsHosterApiKey__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n // BFP settings\n 'bfp__delay__1_fails': _Settings_BfpDelay1Fails__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n 'bfp__delay__5_fails': _Settings_BfpDelay5Fails__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n 'bfp__allowed_wrong_auths': _Settings_BfpAllowedWrongAuths__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n 'bfp__count_interval': _Settings_BfpCountInterval__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n 'bfp__block_period__5_fails': _Settings_BfpBlockPeriod5Fails__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n // Passleak settings\n 'check_pass__enable': _Settings_CheckPassEnable__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n 'check_pass__roles': _Settings_CheckPassRoles__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n '2fa__enable': _Settings_2faEnable__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n '2fa__roles': _Settings_2faRoles__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n 'edit_tech_support_url__enabled': _Settings_EditTechSupportUrlEnabled__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n 'edit_tech_support_url__link': _Settings_EditTechSupportUrlLink__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n 'edit_tech_support_url__remove': _Settings_EditTechSupportUrlRemove__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n 'login_page_rename__enabled': _Settings_LoginPageRenameEnabled__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n 'login_page_rename__name': _Settings_LoginPageRenameName__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n 'login_page_rename__redirect': _Settings_LoginPageRenameRedirect__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n 'login_page_rename__send_email_notification': _Settings_LoginPageRenameSendEmail__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n 'action_shuffle_salts': _Settings_ActionShuffleSalts__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n // Firewall settings\n 'fw__custom_message': _Settings_FwCustomMessage__WEBPACK_IMPORTED_MODULE_21__[\"default\"],\n 'secfw__enabled': _Settings_SecFwEnabled__WEBPACK_IMPORTED_MODULE_22__[\"default\"],\n 'waf__enabled': _Settings_WafEnabled__WEBPACK_IMPORTED_MODULE_23__[\"default\"],\n 'waf__xss_check': _Settings_WafXssCheck__WEBPACK_IMPORTED_MODULE_24__[\"default\"],\n 'waf__sql_check': _Settings_WafSqlCheck__WEBPACK_IMPORTED_MODULE_25__[\"default\"],\n 'waf__exploit_check': _Settings_WafExploitCheck__WEBPACK_IMPORTED_MODULE_26__[\"default\"],\n 'waf_blocker__enabled': _Settings_WafBlockerEnabled__WEBPACK_IMPORTED_MODULE_27__[\"default\"],\n 'upload_checker__file_check': _Settings_UploadCheckerFiles__WEBPACK_IMPORTED_MODULE_28__[\"default\"],\n 'upload_checker__do_check_wordpress_modules': _Settings_UploadCheckerModules__WEBPACK_IMPORTED_MODULE_29__[\"default\"],\n 'traffic_control__enabled': _Settings_TrafficControlEnabled__WEBPACK_IMPORTED_MODULE_30__[\"default\"],\n 'traffic_control__autoblock_timeframe': _Settings_TrafficControlAutoblockTimeframe__WEBPACK_IMPORTED_MODULE_31__[\"default\"],\n 'traffic_control__autoblock_amount': _Settings_TrafficControlAutoblockAmount__WEBPACK_IMPORTED_MODULE_32__[\"default\"],\n 'traffic_control__autoblock_period': _Settings_TrafficControlAutoblockPeriod__WEBPACK_IMPORTED_MODULE_33__[\"default\"],\n 'traffic_control__exclude_authorised_users': _Settings_TrafficControlExcludeAuthorizedUsers__WEBPACK_IMPORTED_MODULE_34__[\"default\"],\n 'secfw__get_ip': _Settings_VisitorIPFromHeader__WEBPACK_IMPORTED_MODULE_35__[\"default\"],\n 'secfw__get_ip__enable_cdn_auto_self_check': _Settings_CDNCheckerEnabled__WEBPACK_IMPORTED_MODULE_36__[\"default\"],\n // scanner\n 'scanner__auto_start': _Settings_ScannerAutoStartEnabled__WEBPACK_IMPORTED_MODULE_37__[\"default\"],\n 'scanner__auto_start__set_period': _Settings_ScannerAutoStartPeriod__WEBPACK_IMPORTED_MODULE_38__[\"default\"],\n 'scanner__auto_start_manual': _Settings_ScannerAutoStartManual__WEBPACK_IMPORTED_MODULE_39__[\"default\"],\n 'scanner__auto_start_manual_time': _Settings_ScannerAutoStartManualTime__WEBPACK_IMPORTED_MODULE_40__[\"default\"],\n 'scanner__auto_start_manual_tz': _Settings_ScannerAutoStartManualTZ__WEBPACK_IMPORTED_MODULE_41__[\"default\"],\n 'scanner__outbound_links': _Settings_OutboundLinksEnabled__WEBPACK_IMPORTED_MODULE_42__[\"default\"],\n 'scanner__outbound_links_mirrors': _Settings_OutboundLinksMirrors__WEBPACK_IMPORTED_MODULE_43__[\"default\"],\n 'scanner__important_files_listing': _Settings_ScannerImportantFilesListing__WEBPACK_IMPORTED_MODULE_44__[\"default\"],\n 'scanner__heuristic_analysis': _Settings_ScannerHeuristicAnalysis__WEBPACK_IMPORTED_MODULE_45__[\"default\"],\n 'scanner__schedule_send_heuristic_suspicious_files': _Settings_ScannerHeuristicAnalysisAutoSend__WEBPACK_IMPORTED_MODULE_46__[\"default\"],\n 'scanner__signature_analysis': _Settings_ScannerSignatureAnalysis__WEBPACK_IMPORTED_MODULE_47__[\"default\"],\n 'scanner__binary_analysis': _Settings_ScannerBinaryAnalysis__WEBPACK_IMPORTED_MODULE_48__[\"default\"],\n 'scanner__os_cron_analysis': _Settings_ScannerOSCronAnalysis__WEBPACK_IMPORTED_MODULE_49__[\"default\"],\n 'scanner__db_trigger_analysis': _Settings_ScannerDBTriggerAnalysis__WEBPACK_IMPORTED_MODULE_50__[\"default\"],\n 'scanner__path_exclusions_view': _Settings_ScannerPathExclusionsView__WEBPACK_IMPORTED_MODULE_51__[\"default\"],\n 'scanner__auto_cure': _Settings_ScannerCureMalware__WEBPACK_IMPORTED_MODULE_52__[\"default\"],\n 'scanner__frontend_analysis': _Settings_ScannerFrontendAnalysis__WEBPACK_IMPORTED_MODULE_53__[\"default\"],\n 'scanner__frontend_analysis__csrf': _Settings_ScannerFrontendAnalysisCSRFEnabled__WEBPACK_IMPORTED_MODULE_54__[\"default\"],\n 'scanner__frontend_analysis__domains_exclusions_view': _Settings_ScannerFrontendDomainExclusionsView__WEBPACK_IMPORTED_MODULE_55__[\"default\"],\n 'scanner__list_unknown': _Settings_ScannerListUnknownFiles__WEBPACK_IMPORTED_MODULE_56__[\"default\"],\n 'scanner__list_unknown__older_than': _Settings_ScannerListUnknownOlderThan__WEBPACK_IMPORTED_MODULE_58__[\"default\"],\n 'scanner__list_approved_by_cleantalk': _Settings_ScannerListApprovedByCleantalk__WEBPACK_IMPORTED_MODULE_60__[\"default\"],\n 'scanner__fs_watcher': _Settings_ScannerFSWatcherEnabled__WEBPACK_IMPORTED_MODULE_57__[\"default\"],\n 'scanner__fs_watcher__snapshots_period': _Settings_ScannerFSWSnapshotsPeriod__WEBPACK_IMPORTED_MODULE_59__[\"default\"]\n // ... other different types\n };\n var settingKeys = Object.keys(settings || {});\n if (settingKeys.length === 0) {\n return null;\n }\n var wrapperClassName = 'spbc_tab_fields_group';\n\n // A temporary solution until the entire settings group is switched to React\n if (groupId === 'scanner_settings') {\n wrapperClassName += ' spbc_tab_fields_group--bottom_gluing';\n }\n\n // Hide the fields instead of apikey during apikey is empty\n wrapperClassName += !keyIsOk && groupId !== 'apikey' ? ' --hide' : '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: wrapperClassName\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\",\n id: groupId\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: '#' + groupId\n }, groupTitle)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, groupDescription)), settingKeys.map(function (settingKey, index) {\n var settingValue = displaySettings[settingKey];\n var settingName = \"\".concat(settingsSlug, \"[\").concat(settingKey, \"]\");\n var Component = componentMap[settingKey];\n if (!Component) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: \"\".concat(groupId, \"-\").concat(settingKey, \"-\").concat(index),\n className: \"spbc_setting_error spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_error_message\"\n }, \"Component for setting `\", settingKey, \"` not defined.\"));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: \"\".concat(groupId, \"-\").concat(settingKey, \"-\").concat(index),\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Component, {\n id: settingKey,\n name: settingName,\n value: settingValue,\n keyIsOk: keyIsOk,\n groupSettings: displaySettings,\n wpUserRolesOptions: wpUserRolesOptions,\n verificationEmail: verificationEmail,\n authLoginPageUrl: authLoginPageUrl,\n techSupportUrlPrefix: techSupportUrlPrefix,\n loginRenameNotifyAdminEmail: loginRenameNotifyAdminEmail,\n canActivatePlugins: canActivatePlugins,\n shuffleSaltsUnlocked: shuffleSaltsUnlocked,\n visitorCurrentIp: visitorCurrentIp,\n nextScheduledScanDescription: nextScheduledScanDescription,\n scannerAutoStartManualTimezone: scannerAutoStartManualTimezone,\n wlCompanyName: wlCompanyName,\n visitorIpSources: visitorIpSources,\n scannerExclusionsDir: scannerExclusionsDir,\n scannerExclusionsURL: scannerExclusionsURL,\n onSettingChange: groupId === 'auth_and_logging_in' || groupId === 'firewall' || groupId === 'scanner_settings' ? patchSetting : undefined\n }));\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SettingsGroup)\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 _Settings_SettingApiKey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Settings/SettingApiKey */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingApiKey.js\");\n/* harmony import */ var _Settings_SettingWpmsWorkMode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Settings/SettingWpmsWorkMode */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingWpmsWorkMode.js\");\n/* harmony import */ var _Settings_SettingWpmsHosterApiKey__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Settings/SettingWpmsHosterApiKey */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingWpmsHosterApiKey.js\");\n/* harmony import */ var _Settings_BfpEnabled__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Settings/BfpEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js\");\n/* harmony import */ var _Settings_BfpDelay1Fails__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Settings/BfpDelay1Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpDelay1Fails.js\");\n/* harmony import */ var _Settings_BfpDelay5Fails__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./Settings/BfpDelay5Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpDelay5Fails.js\");\n/* harmony import */ var _Settings_BfpAllowedWrongAuths__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Settings/BfpAllowedWrongAuths */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpAllowedWrongAuths.js\");\n/* harmony import */ var _Settings_BfpCountInterval__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./Settings/BfpCountInterval */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js\");\n/* harmony import */ var _Settings_BfpBlockPeriod5Fails__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./Settings/BfpBlockPeriod5Fails */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpBlockPeriod5Fails.js\");\n/* harmony import */ var _Settings_CheckPassEnable__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Settings/CheckPassEnable */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js\");\n/* harmony import */ var _Settings_CheckPassRoles__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./Settings/CheckPassRoles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js\");\n/* harmony import */ var _Settings_2faEnable__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Settings/2faEnable */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js\");\n/* harmony import */ var _Settings_2faRoles__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./Settings/2faRoles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlEnabled__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlLink__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlLink */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js\");\n/* harmony import */ var _Settings_EditTechSupportUrlRemove__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./Settings/EditTechSupportUrlRemove */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js\");\n/* harmony import */ var _Settings_LoginPageRenameEnabled__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./Settings/LoginPageRenameEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js\");\n/* harmony import */ var _Settings_LoginPageRenameName__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./Settings/LoginPageRenameName */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js\");\n/* harmony import */ var _Settings_LoginPageRenameRedirect__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./Settings/LoginPageRenameRedirect */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js\");\n/* harmony import */ var _Settings_LoginPageRenameSendEmail__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./Settings/LoginPageRenameSendEmail */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js\");\n/* harmony import */ var _Settings_ActionShuffleSalts__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./Settings/ActionShuffleSalts */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js\");\n/* harmony import */ var _Settings_FwCustomMessage__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./Settings/FwCustomMessage */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/FwCustomMessage.js\");\n/* harmony import */ var _Settings_SecFwEnabled__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./Settings/SecFwEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SecFwEnabled.js\");\n/* harmony import */ var _Settings_WafEnabled__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./Settings/WafEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafEnabled.js\");\n/* harmony import */ var _Settings_WafXssCheck__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./Settings/WafXssCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafXssCheck.js\");\n/* harmony import */ var _Settings_WafSqlCheck__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./Settings/WafSqlCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafSqlCheck.js\");\n/* harmony import */ var _Settings_WafExploitCheck__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./Settings/WafExploitCheck */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafExploitCheck.js\");\n/* harmony import */ var _Settings_WafBlockerEnabled__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./Settings/WafBlockerEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WafBlockerEnabled.js\");\n/* harmony import */ var _Settings_UploadCheckerFiles__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./Settings/UploadCheckerFiles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/UploadCheckerFiles.js\");\n/* harmony import */ var _Settings_UploadCheckerModules__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./Settings/UploadCheckerModules */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/UploadCheckerModules.js\");\n/* harmony import */ var _Settings_TrafficControlEnabled__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./Settings/TrafficControlEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlEnabled.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockTimeframe__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockTimeframe */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockTimeframe.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockAmount__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockAmount */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockAmount.js\");\n/* harmony import */ var _Settings_TrafficControlAutoblockPeriod__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./Settings/TrafficControlAutoblockPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlAutoblockPeriod.js\");\n/* harmony import */ var _Settings_TrafficControlExcludeAuthorizedUsers__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./Settings/TrafficControlExcludeAuthorizedUsers */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/TrafficControlExcludeAuthorizedUsers.js\");\n/* harmony import */ var _Settings_VisitorIPFromHeader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./Settings/VisitorIPFromHeader */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VisitorIPFromHeader.js\");\n/* harmony import */ var _Settings_CDNCheckerEnabled__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./Settings/CDNCheckerEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CDNCheckerEnabled.js\");\n/* harmony import */ var _Settings_ScannerAutoStartEnabled__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Settings/ScannerAutoStartEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartEnabled.js\");\n/* harmony import */ var _Settings_ScannerAutoStartPeriod__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Settings/ScannerAutoStartPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartPeriod.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManual__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManual */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManual.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManualTime__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManualTime */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManualTime.js\");\n/* harmony import */ var _Settings_ScannerAutoStartManualTZ__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./Settings/ScannerAutoStartManualTZ */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerAutoStartManualTZ.js\");\n/* harmony import */ var _Settings_OutboundLinksEnabled__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./Settings/OutboundLinksEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksEnabled.js\");\n/* harmony import */ var _Settings_OutboundLinksMirrors__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./Settings/OutboundLinksMirrors */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/OutboundLinksMirrors.js\");\n/* harmony import */ var _Settings_ScannerImportantFilesListing__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./Settings/ScannerImportantFilesListing */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerImportantFilesListing.js\");\n/* harmony import */ var _Settings_ScannerHeuristicAnalysis__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./Settings/ScannerHeuristicAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerHeuristicAnalysis.js\");\n/* harmony import */ var _Settings_ScannerHeuristicAnalysisAutoSend__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./Settings/ScannerHeuristicAnalysisAutoSend */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerHeuristicAnalysisAutoSend.js\");\n/* harmony import */ var _Settings_ScannerSignatureAnalysis__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./Settings/ScannerSignatureAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerSignatureAnalysis.js\");\n/* harmony import */ var _Settings_ScannerBinaryAnalysis__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./Settings/ScannerBinaryAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerBinaryAnalysis.js\");\n/* harmony import */ var _Settings_ScannerOSCronAnalysis__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./Settings/ScannerOSCronAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerOSCronAnalysis.js\");\n/* harmony import */ var _Settings_ScannerDBTriggerAnalysis__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./Settings/ScannerDBTriggerAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerDBTriggerAnalysis.js\");\n/* harmony import */ var _Settings_ScannerPathExclusionsView__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./Settings/ScannerPathExclusionsView */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerPathExclusionsView.js\");\n/* harmony import */ var _Settings_ScannerCureMalware__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./Settings/ScannerCureMalware */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerCureMalware.js\");\n/* harmony import */ var _Settings_ScannerFrontendAnalysis__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./Settings/ScannerFrontendAnalysis */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendAnalysis.js\");\n/* harmony import */ var _Settings_ScannerFrontendAnalysisCSRFEnabled__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./Settings/ScannerFrontendAnalysisCSRFEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendAnalysisCSRFEnabled.js\");\n/* harmony import */ var _Settings_ScannerFrontendDomainExclusionsView__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./Settings/ScannerFrontendDomainExclusionsView */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFrontendDomainExclusionsView.js\");\n/* harmony import */ var _Settings_ScannerListUnknownFiles__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./Settings/ScannerListUnknownFiles */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListUnknownFiles.js\");\n/* harmony import */ var _Settings_ScannerFSWatcherEnabled__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./Settings/ScannerFSWatcherEnabled */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFSWatcherEnabled.js\");\n/* harmony import */ var _Settings_ScannerListUnknownOlderThan__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./Settings/ScannerListUnknownOlderThan */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListUnknownOlderThan.js\");\n/* harmony import */ var _Settings_ScannerFSWSnapshotsPeriod__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./Settings/ScannerFSWSnapshotsPeriod */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerFSWSnapshotsPeriod.js\");\n/* harmony import */ var _Settings_ScannerListApprovedByCleantalk__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./Settings/ScannerListApprovedByCleantalk */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ScannerListApprovedByCleantalk.js\");\n/* harmony import */ var _Settings_VulnerabilityCheckTestBeforeInstall__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./Settings/VulnerabilityCheckTestBeforeInstall */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js\");\n/* harmony import */ var _Settings_VulnerabilityCheckEnableCron__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./Settings/VulnerabilityCheckEnableCron */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js\");\n/* harmony import */ var _Settings_VulnerabilityCheckWarnOnModulesPages__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./Settings/VulnerabilityCheckWarnOnModulesPages */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js\");\n/* harmony import */ var _Settings_VulnerabilityCheckShowReports__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./Settings/VulnerabilityCheckShowReports */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js\");\n/* harmony import */ var _Settings_AdminBarShow__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./Settings/AdminBarShow */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarShow.js\");\n/* harmony import */ var _Settings_AdminBarAdminsOnlineCounter__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./Settings/AdminBarAdminsOnlineCounter */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarAdminsOnlineCounter.js\");\n/* harmony import */ var _Settings_AdminBarBruteForceCounter__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./Settings/AdminBarBruteForceCounter */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarBruteForceCounter.js\");\n/* harmony import */ var _Settings_AdminBarFirewallCounter__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./Settings/AdminBarFirewallCounter */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/AdminBarFirewallCounter.js\");\n/* harmony import */ var _Settings_WPDashboardWidgetShow__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./Settings/WPDashboardWidgetShow */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js\");\n/* harmony import */ var _Settings_MiscBackendLogsEnable__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./Settings/MiscBackendLogsEnable */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js\");\n/* harmony import */ var _Settings_MiscPreventLoginsCollecting__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./Settings/MiscPreventLoginsCollecting */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js\");\n/* harmony import */ var _Settings_MiscPreventLoginsCollectingOnPasswordReset__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./Settings/MiscPreventLoginsCollectingOnPasswordReset */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js\");\n/* harmony import */ var _Settings_MiscShowLinkInLoginForm__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./Settings/MiscShowLinkInLoginForm */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js\");\n/* harmony import */ var _Settings_WpDisableXmlrpc__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./Settings/WpDisableXmlrpc */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js\");\n/* harmony import */ var _Settings_WpDisableRestApi__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./Settings/WpDisableRestApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js\");\n/* harmony import */ var _Settings_DataSetCookies__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./Settings/DataSetCookies */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js\");\n/* harmony import */ var _Settings_MiscForbidToShowInIframes__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./Settings/MiscForbidToShowInIframes */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js\");\n/* harmony import */ var _Settings_DataAdditionalHeaders__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./Settings/DataAdditionalHeaders */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js\");\n/* harmony import */ var _Settings_WPUploadDirPreventPhpExecution__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./Settings/WPUploadDirPreventPhpExecution */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js\");\n/* harmony import */ var _Settings_WPUseBuiltinHttpApi__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./Settings/WPUseBuiltinHttpApi */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js\");\n/* harmony import */ var _Settings_MiscDisableFileEditor__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./Settings/MiscDisableFileEditor */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js\");\n/* harmony import */ var _Settings_MiscCompleteDeactivation__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./Settings/MiscCompleteDeactivation */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js\");\n/* harmony import */ var _Settings_MonitoringUsers__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./Settings/MonitoringUsers */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js\");\n/* harmony import */ var _Settings_SPBCTrustedAndAffiliateShortcode__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./Settings/SPBCTrustedAndAffiliateShortcode */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js\");\n/* harmony import */ var _Settings_SPBCTrustedAndAffiliateShortcodeTag__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./Settings/SPBCTrustedAndAffiliateShortcodeTag */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js\");\n/* harmony import */ var _Settings_SPBCTrustedAndAffiliateFooter__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./Settings/SPBCTrustedAndAffiliateFooter */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js\");\n/* harmony import */ var _Settings_SPBCTrustedAndAffiliateAddId__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./Settings/SPBCTrustedAndAffiliateAddId */ \"./js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfunction SettingsGroup(props) {\n var groupId = props.groupId,\n groupTitle = props.groupTitle,\n groupDescription = props.groupDescription,\n settings = props.settings,\n settingsSlug = props.settingsSlug,\n keyIsOk = props.keyIsOk,\n wpUserRolesOptions = props.wpUserRolesOptions,\n verificationEmail = props.verificationEmail,\n authLoginPageUrl = props.authLoginPageUrl,\n techSupportUrlPrefix = props.techSupportUrlPrefix,\n loginRenameNotifyAdminEmail = props.loginRenameNotifyAdminEmail,\n canActivatePlugins = props.canActivatePlugins,\n shuffleSaltsUnlocked = props.shuffleSaltsUnlocked,\n visitorIpSources = props.visitorIpSources,\n scannerExclusionsDir = props.scannerExclusionsDir,\n scannerExclusionsURL = props.scannerExclusionsURL,\n visitorCurrentIp = props.visitorCurrentIp,\n nextScheduledScanDescription = props.nextScheduledScanDescription,\n scannerAutoStartManualTimezone = props.scannerAutoStartManualTimezone,\n wlCompanyName = props.wlCompanyName;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings),\n _useState2 = _slicedToArray(_useState, 2),\n liveSettings = _useState2[0],\n setLiveSettings = _useState2[1];\n var useLiveSettings = groupId !== 'apikey';\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (useLiveSettings) {\n setLiveSettings(settings);\n }\n }, [groupId, settings]);\n var patchSetting = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (key, val) {\n setLiveSettings(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, key, val));\n });\n }, []);\n var displaySettings = useLiveSettings ? liveSettings : settings;\n var componentMap = {\n 'spbc_key': _Settings_SettingApiKey__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n 'ms__work_mode': _Settings_SettingWpmsWorkMode__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n 'ms__hoster_api_key': _Settings_SettingWpmsHosterApiKey__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n // BFP settings\n 'bfp__enabled': _Settings_BfpEnabled__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n 'bfp__delay__1_fails': _Settings_BfpDelay1Fails__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n 'bfp__delay__5_fails': _Settings_BfpDelay5Fails__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n 'bfp__allowed_wrong_auths': _Settings_BfpAllowedWrongAuths__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n 'bfp__count_interval': _Settings_BfpCountInterval__WEBPACK_IMPORTED_MODULE_8__[\"default\"],\n 'bfp__block_period__5_fails': _Settings_BfpBlockPeriod5Fails__WEBPACK_IMPORTED_MODULE_9__[\"default\"],\n // Passleak settings\n 'check_pass__enable': _Settings_CheckPassEnable__WEBPACK_IMPORTED_MODULE_10__[\"default\"],\n 'check_pass__roles': _Settings_CheckPassRoles__WEBPACK_IMPORTED_MODULE_11__[\"default\"],\n '2fa__enable': _Settings_2faEnable__WEBPACK_IMPORTED_MODULE_12__[\"default\"],\n '2fa__roles': _Settings_2faRoles__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n 'edit_tech_support_url__enabled': _Settings_EditTechSupportUrlEnabled__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n 'edit_tech_support_url__link': _Settings_EditTechSupportUrlLink__WEBPACK_IMPORTED_MODULE_15__[\"default\"],\n 'edit_tech_support_url__remove': _Settings_EditTechSupportUrlRemove__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n 'login_page_rename__enabled': _Settings_LoginPageRenameEnabled__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n 'login_page_rename__name': _Settings_LoginPageRenameName__WEBPACK_IMPORTED_MODULE_18__[\"default\"],\n 'login_page_rename__redirect': _Settings_LoginPageRenameRedirect__WEBPACK_IMPORTED_MODULE_19__[\"default\"],\n 'login_page_rename__send_email_notification': _Settings_LoginPageRenameSendEmail__WEBPACK_IMPORTED_MODULE_20__[\"default\"],\n 'action_shuffle_salts': _Settings_ActionShuffleSalts__WEBPACK_IMPORTED_MODULE_21__[\"default\"],\n // Firewall settings\n 'fw__custom_message': _Settings_FwCustomMessage__WEBPACK_IMPORTED_MODULE_22__[\"default\"],\n 'secfw__enabled': _Settings_SecFwEnabled__WEBPACK_IMPORTED_MODULE_23__[\"default\"],\n 'waf__enabled': _Settings_WafEnabled__WEBPACK_IMPORTED_MODULE_24__[\"default\"],\n 'waf__xss_check': _Settings_WafXssCheck__WEBPACK_IMPORTED_MODULE_25__[\"default\"],\n 'waf__sql_check': _Settings_WafSqlCheck__WEBPACK_IMPORTED_MODULE_26__[\"default\"],\n 'waf__exploit_check': _Settings_WafExploitCheck__WEBPACK_IMPORTED_MODULE_27__[\"default\"],\n 'waf_blocker__enabled': _Settings_WafBlockerEnabled__WEBPACK_IMPORTED_MODULE_28__[\"default\"],\n 'upload_checker__file_check': _Settings_UploadCheckerFiles__WEBPACK_IMPORTED_MODULE_29__[\"default\"],\n 'upload_checker__do_check_wordpress_modules': _Settings_UploadCheckerModules__WEBPACK_IMPORTED_MODULE_30__[\"default\"],\n 'traffic_control__enabled': _Settings_TrafficControlEnabled__WEBPACK_IMPORTED_MODULE_31__[\"default\"],\n 'traffic_control__autoblock_timeframe': _Settings_TrafficControlAutoblockTimeframe__WEBPACK_IMPORTED_MODULE_32__[\"default\"],\n 'traffic_control__autoblock_amount': _Settings_TrafficControlAutoblockAmount__WEBPACK_IMPORTED_MODULE_33__[\"default\"],\n 'traffic_control__autoblock_period': _Settings_TrafficControlAutoblockPeriod__WEBPACK_IMPORTED_MODULE_34__[\"default\"],\n 'traffic_control__exclude_authorised_users': _Settings_TrafficControlExcludeAuthorizedUsers__WEBPACK_IMPORTED_MODULE_35__[\"default\"],\n 'secfw__get_ip': _Settings_VisitorIPFromHeader__WEBPACK_IMPORTED_MODULE_36__[\"default\"],\n 'secfw__get_ip__enable_cdn_auto_self_check': _Settings_CDNCheckerEnabled__WEBPACK_IMPORTED_MODULE_37__[\"default\"],\n // scanner\n 'scanner__auto_start': _Settings_ScannerAutoStartEnabled__WEBPACK_IMPORTED_MODULE_38__[\"default\"],\n 'scanner__auto_start__set_period': _Settings_ScannerAutoStartPeriod__WEBPACK_IMPORTED_MODULE_39__[\"default\"],\n 'scanner__auto_start_manual': _Settings_ScannerAutoStartManual__WEBPACK_IMPORTED_MODULE_40__[\"default\"],\n 'scanner__auto_start_manual_time': _Settings_ScannerAutoStartManualTime__WEBPACK_IMPORTED_MODULE_41__[\"default\"],\n 'scanner__auto_start_manual_tz': _Settings_ScannerAutoStartManualTZ__WEBPACK_IMPORTED_MODULE_42__[\"default\"],\n 'scanner__outbound_links': _Settings_OutboundLinksEnabled__WEBPACK_IMPORTED_MODULE_43__[\"default\"],\n 'scanner__outbound_links_mirrors': _Settings_OutboundLinksMirrors__WEBPACK_IMPORTED_MODULE_44__[\"default\"],\n 'scanner__important_files_listing': _Settings_ScannerImportantFilesListing__WEBPACK_IMPORTED_MODULE_45__[\"default\"],\n 'scanner__heuristic_analysis': _Settings_ScannerHeuristicAnalysis__WEBPACK_IMPORTED_MODULE_46__[\"default\"],\n 'scanner__schedule_send_heuristic_suspicious_files': _Settings_ScannerHeuristicAnalysisAutoSend__WEBPACK_IMPORTED_MODULE_47__[\"default\"],\n 'scanner__signature_analysis': _Settings_ScannerSignatureAnalysis__WEBPACK_IMPORTED_MODULE_48__[\"default\"],\n 'scanner__binary_analysis': _Settings_ScannerBinaryAnalysis__WEBPACK_IMPORTED_MODULE_49__[\"default\"],\n 'scanner__os_cron_analysis': _Settings_ScannerOSCronAnalysis__WEBPACK_IMPORTED_MODULE_50__[\"default\"],\n 'scanner__db_trigger_analysis': _Settings_ScannerDBTriggerAnalysis__WEBPACK_IMPORTED_MODULE_51__[\"default\"],\n 'scanner__path_exclusions_view': _Settings_ScannerPathExclusionsView__WEBPACK_IMPORTED_MODULE_52__[\"default\"],\n 'scanner__auto_cure': _Settings_ScannerCureMalware__WEBPACK_IMPORTED_MODULE_53__[\"default\"],\n 'scanner__frontend_analysis': _Settings_ScannerFrontendAnalysis__WEBPACK_IMPORTED_MODULE_54__[\"default\"],\n 'scanner__frontend_analysis__csrf': _Settings_ScannerFrontendAnalysisCSRFEnabled__WEBPACK_IMPORTED_MODULE_55__[\"default\"],\n 'scanner__frontend_analysis__domains_exclusions_view': _Settings_ScannerFrontendDomainExclusionsView__WEBPACK_IMPORTED_MODULE_56__[\"default\"],\n 'scanner__list_unknown': _Settings_ScannerListUnknownFiles__WEBPACK_IMPORTED_MODULE_57__[\"default\"],\n 'scanner__list_unknown__older_than': _Settings_ScannerListUnknownOlderThan__WEBPACK_IMPORTED_MODULE_59__[\"default\"],\n 'scanner__list_approved_by_cleantalk': _Settings_ScannerListApprovedByCleantalk__WEBPACK_IMPORTED_MODULE_61__[\"default\"],\n 'scanner__fs_watcher': _Settings_ScannerFSWatcherEnabled__WEBPACK_IMPORTED_MODULE_58__[\"default\"],\n 'scanner__fs_watcher__snapshots_period': _Settings_ScannerFSWSnapshotsPeriod__WEBPACK_IMPORTED_MODULE_60__[\"default\"],\n // vulnerability_check\n 'vulnerability_check__test_before_install': _Settings_VulnerabilityCheckTestBeforeInstall__WEBPACK_IMPORTED_MODULE_62__[\"default\"],\n 'vulnerability_check__enable_cron': _Settings_VulnerabilityCheckEnableCron__WEBPACK_IMPORTED_MODULE_63__[\"default\"],\n 'vulnerability_check__warn_on_modules_pages': _Settings_VulnerabilityCheckWarnOnModulesPages__WEBPACK_IMPORTED_MODULE_64__[\"default\"],\n 'vulnerability_check__show_reports': _Settings_VulnerabilityCheckShowReports__WEBPACK_IMPORTED_MODULE_65__[\"default\"],\n // admin_bar\n 'admin_bar__show': _Settings_AdminBarShow__WEBPACK_IMPORTED_MODULE_66__[\"default\"],\n 'admin_bar__admins_online_counter': _Settings_AdminBarAdminsOnlineCounter__WEBPACK_IMPORTED_MODULE_67__[\"default\"],\n 'admin_bar__brute_force_counter': _Settings_AdminBarBruteForceCounter__WEBPACK_IMPORTED_MODULE_68__[\"default\"],\n 'admin_bar__firewall_counter': _Settings_AdminBarFirewallCounter__WEBPACK_IMPORTED_MODULE_69__[\"default\"],\n 'wp__dashboard_widget__show': _Settings_WPDashboardWidgetShow__WEBPACK_IMPORTED_MODULE_70__[\"default\"],\n // misc\n 'misc__backend_logs_enable': _Settings_MiscBackendLogsEnable__WEBPACK_IMPORTED_MODULE_71__[\"default\"],\n 'misc__prevent_logins_collecting': _Settings_MiscPreventLoginsCollecting__WEBPACK_IMPORTED_MODULE_72__[\"default\"],\n 'misc__prevent_logins_collecting_on_password_reset': _Settings_MiscPreventLoginsCollectingOnPasswordReset__WEBPACK_IMPORTED_MODULE_73__[\"default\"],\n 'misc__show_link_in_login_form': _Settings_MiscShowLinkInLoginForm__WEBPACK_IMPORTED_MODULE_74__[\"default\"],\n 'wp__disable_xmlrpc': _Settings_WpDisableXmlrpc__WEBPACK_IMPORTED_MODULE_75__[\"default\"],\n 'wp__disable_rest_api': _Settings_WpDisableRestApi__WEBPACK_IMPORTED_MODULE_76__[\"default\"],\n 'data__set_cookies': _Settings_DataSetCookies__WEBPACK_IMPORTED_MODULE_77__[\"default\"],\n 'misc__forbid_to_show_in_iframes': _Settings_MiscForbidToShowInIframes__WEBPACK_IMPORTED_MODULE_78__[\"default\"],\n 'data__additional_headers': _Settings_DataAdditionalHeaders__WEBPACK_IMPORTED_MODULE_79__[\"default\"],\n 'wp__upload_dir_prevent_php_execution': _Settings_WPUploadDirPreventPhpExecution__WEBPACK_IMPORTED_MODULE_80__[\"default\"],\n 'wp__use_builtin_http_api': _Settings_WPUseBuiltinHttpApi__WEBPACK_IMPORTED_MODULE_81__[\"default\"],\n 'misc_disable_file_editor': _Settings_MiscDisableFileEditor__WEBPACK_IMPORTED_MODULE_82__[\"default\"],\n 'misc__complete_deactivation': _Settings_MiscCompleteDeactivation__WEBPACK_IMPORTED_MODULE_83__[\"default\"],\n 'monitoring__users': _Settings_MonitoringUsers__WEBPACK_IMPORTED_MODULE_84__[\"default\"],\n // Trusted and affiliate\n 'spbc_trusted_and_affiliate__shortcode': _Settings_SPBCTrustedAndAffiliateShortcode__WEBPACK_IMPORTED_MODULE_85__[\"default\"],\n 'spbc_trusted_and_affiliate__shortcode_tag': _Settings_SPBCTrustedAndAffiliateShortcodeTag__WEBPACK_IMPORTED_MODULE_86__[\"default\"],\n 'spbc_trusted_and_affiliate__footer': _Settings_SPBCTrustedAndAffiliateFooter__WEBPACK_IMPORTED_MODULE_87__[\"default\"],\n 'spbc_trusted_and_affiliate__add_id': _Settings_SPBCTrustedAndAffiliateAddId__WEBPACK_IMPORTED_MODULE_88__[\"default\"]\n };\n var settingKeys = Object.keys(settings || {});\n if (settingKeys.length === 0) {\n return null;\n }\n var wrapperClassName = 'spbc_tab_fields_group';\n\n // Hide the fields instead of apikey during apikey is empty\n wrapperClassName += !keyIsOk && groupId !== 'apikey' ? ' --hide' : '';\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: wrapperClassName\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_group_header\",\n id: groupId\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"h3\", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"a\", {\n href: '#' + groupId\n }, groupTitle)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_settings_description\"\n }, groupDescription)), settingKeys.map(function (settingKey, index) {\n var settingValue = displaySettings[settingKey];\n var settingName = \"\".concat(settingsSlug, \"[\").concat(settingKey, \"]\");\n var Component = componentMap[settingKey];\n if (!Component) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: \"\".concat(groupId, \"-\").concat(settingKey, \"-\").concat(index),\n className: \"spbc_setting_error spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_error_message\"\n }, \"Component for setting `\", settingKey, \"` not defined.\"));\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n key: \"\".concat(groupId, \"-\").concat(settingKey, \"-\").concat(index),\n className: \"spbc_wrapper_field\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Component, {\n id: settingKey,\n name: settingName,\n value: settingValue,\n keyIsOk: keyIsOk,\n groupSettings: displaySettings,\n wpUserRolesOptions: wpUserRolesOptions,\n verificationEmail: verificationEmail,\n authLoginPageUrl: authLoginPageUrl,\n techSupportUrlPrefix: techSupportUrlPrefix,\n loginRenameNotifyAdminEmail: loginRenameNotifyAdminEmail,\n canActivatePlugins: canActivatePlugins,\n shuffleSaltsUnlocked: shuffleSaltsUnlocked,\n visitorCurrentIp: visitorCurrentIp,\n nextScheduledScanDescription: nextScheduledScanDescription,\n scannerAutoStartManualTimezone: scannerAutoStartManualTimezone,\n wlCompanyName: wlCompanyName,\n visitorIpSources: visitorIpSources,\n scannerExclusionsDir: scannerExclusionsDir,\n scannerExclusionsURL: scannerExclusionsURL,\n onSettingChange: useLiveSettings ? patchSetting : undefined\n }));\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js?\n}"); /***/ }, @@ -1196,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 _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}"); /***/ }, @@ -1246,7 +1536,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 */ useCookie: () => (/* binding */ useCookie),\n/* harmony export */ useSetCookie: () => (/* binding */ useSetCookie)\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__);\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// useCookie - universial hook for getting cookie value\nfunction useCookie(name) {\n var getCookie = function getCookie(name) {\n var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));\n return match ? match[2] : null;\n };\n /* eslint-disable no-unused-vars */\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n return getCookie(name);\n }),\n _useState2 = _slicedToArray(_useState, 2),\n cookie = _useState2[0],\n setCookieState = _useState2[1];\n /* eslint-enable no-unused-vars */\n return cookie;\n}\n\n// useSetCookie - universial hook for setting cookie value\nfunction useSetCookie() {\n var setCookie = function setCookie(name, value, days) {\n var expires = new Date(Date.now() + days * 86400e3).toUTCString();\n var cookieStr = name + '=' + value + '; expires=' + expires + '; path=/; SameSite=Lax';\n if (window.location.protocol === 'https:') {\n cookieStr += '; Secure';\n }\n document.cookie = cookieStr;\n };\n return setCookie;\n}\n\n//# sourceURL=webpack:///./js/src/react/hooks/useCookie.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useCookie: () => (/* binding */ useCookie),\n/* harmony export */ useSetCookie: () => (/* binding */ useSetCookie)\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__);\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// useCookie - universial hook for getting cookie value\nfunction useCookie(name) {\n var getCookie = function getCookie(name) {\n var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));\n return match ? match[2] : null;\n };\n /* eslint-disable no-unused-vars */\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(function () {\n return getCookie(name);\n }),\n _useState2 = _slicedToArray(_useState, 2),\n cookie = _useState2[0],\n setCookieState = _useState2[1];\n /* eslint-enable no-unused-vars */\n return cookie;\n}\n\n// useSetCookie - universial hook for setting cookie value\nfunction useSetCookie() {\n var setCookie = function setCookie(name, value, days) {\n var expires = new Date(Date.now() + days * 86400e3).toUTCString();\n var cookieStr = name + '=' + value + '; expires=' + expires + '; path=/; SameSite=Lax';\n if (window.location.protocol === 'https:') {\n cookieStr += '; Secure';\n }\n document.cookie = cookieStr;\n };\n return setCookie;\n}\n\n//# sourceURL=webpack:///./js/src/react/hooks/useCookie.js?\n}"); /***/ }, @@ -1276,7 +1566,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 */ runSync: () => (/* binding */ runSync)\n/* harmony export */ });\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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); }); }; }\n\nvar POLL_INTERVAL_MS = 2000;\nvar MAX_POLL_DURATION_MS = 10 * 60 * 1000;\nfunction createFailedStatus(message) {\n return {\n error: true,\n success: false,\n in_progress: false,\n message: message,\n percent: 0,\n reload: false\n };\n}\nfunction pollSyncStatus(_x) {\n return _pollSyncStatus.apply(this, arguments);\n}\nfunction _pollSyncStatus() {\n _pollSyncStatus = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(onProgress) {\n var startedAt, status, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n startedAt = Date.now();\n case 1:\n if (false) // removed by dead control flow\n{}\n if (!(Date.now() - startedAt > MAX_POLL_DURATION_MS)) {\n _context.n = 2;\n break;\n }\n return _context.a(2, createFailedStatus('Sync timed out. Please try again.'));\n case 2:\n status = void 0;\n _context.p = 3;\n _context.n = 4;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__.sendAjaxRequest)({\n action: 'spbc_react_sync_status'\n }, true);\n case 4:\n status = _context.v;\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n return _context.a(2, createFailedStatus('Sync status request failed.'));\n case 6:\n if (!(!status || _typeof(status) !== 'object')) {\n _context.n = 7;\n break;\n }\n return _context.a(2, createFailedStatus('Sync status request failed.'));\n case 7:\n if (onProgress && status.message) {\n onProgress(status.message, status.percent || 0);\n }\n if (status.in_progress) {\n _context.n = 8;\n break;\n }\n return _context.a(2, status);\n case 8:\n _context.n = 9;\n return new Promise(function (resolve) {\n return setTimeout(resolve, POLL_INTERVAL_MS);\n });\n case 9:\n _context.n = 1;\n break;\n case 10:\n return _context.a(2);\n }\n }, _callee, null, [[3, 5]]);\n }));\n return _pollSyncStatus.apply(this, arguments);\n}\nfunction runSync(_x2) {\n return _runSync.apply(this, arguments);\n}\nfunction _runSync() {\n _runSync = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(onProgress) {\n var onComplete,\n startResult,\n _status,\n _status2,\n status,\n _args2 = arguments,\n _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n onComplete = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : null;\n _context2.p = 1;\n _context2.n = 2;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__.sendAjaxRequest)({\n action: 'spbc_react_sync_start'\n }, true);\n case 2:\n startResult = _context2.v;\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n _status = createFailedStatus('Sync start request failed.');\n if (onComplete && typeof onComplete === 'function') {\n onComplete(_status);\n }\n return _context2.a(2, _status);\n case 4:\n if (!(!startResult || _typeof(startResult) !== 'object')) {\n _context2.n = 5;\n break;\n }\n _status2 = createFailedStatus('Sync start request failed.');\n if (onComplete && typeof onComplete === 'function') {\n onComplete(_status2);\n }\n return _context2.a(2, _status2);\n case 5:\n _context2.n = 6;\n return pollSyncStatus(onProgress);\n case 6:\n status = _context2.v;\n if (onComplete && typeof onComplete === 'function') {\n onComplete(status);\n }\n return _context2.a(2, status);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return _runSync.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./js/src/react/hooks/useSync.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ runSync: () => (/* binding */ runSync)\n/* harmony export */ });\n/* harmony import */ var _modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/Http/Ajax */ \"./js/src/react/modules/Http/Ajax.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 _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\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); }); }; }\n;\nvar POLL_INTERVAL_MS = 2000;\nvar MAX_POLL_DURATION_MS = 10 * 60 * 1000;\nfunction createFailedStatus(message) {\n return {\n error: true,\n success: false,\n in_progress: false,\n message: message,\n percent: 0,\n reload: false\n };\n}\nfunction pollSyncStatus(_x) {\n return _pollSyncStatus.apply(this, arguments);\n}\nfunction _pollSyncStatus() {\n _pollSyncStatus = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(onProgress) {\n var startedAt, status, _t;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.p = _context.n) {\n case 0:\n startedAt = Date.now();\n case 1:\n if (false) // removed by dead control flow\n{}\n if (!(Date.now() - startedAt > MAX_POLL_DURATION_MS)) {\n _context.n = 2;\n break;\n }\n return _context.a(2, createFailedStatus('Sync timed out. Please try again.'));\n case 2:\n status = void 0;\n _context.p = 3;\n _context.n = 4;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__.sendAjaxRequest)({\n action: 'spbc_react_sync_status'\n }, true);\n case 4:\n status = _context.v;\n _context.n = 6;\n break;\n case 5:\n _context.p = 5;\n _t = _context.v;\n return _context.a(2, createFailedStatus('Sync status request failed.'));\n case 6:\n if (!(!status || _typeof(status) !== 'object')) {\n _context.n = 7;\n break;\n }\n return _context.a(2, createFailedStatus('Sync status request failed.'));\n case 7:\n if (onProgress && status.message) {\n onProgress(status.message, status.percent || 0);\n }\n if (status.in_progress) {\n _context.n = 8;\n break;\n }\n return _context.a(2, status);\n case 8:\n _context.n = 9;\n return new Promise(function (resolve) {\n return setTimeout(resolve, POLL_INTERVAL_MS);\n });\n case 9:\n _context.n = 1;\n break;\n case 10:\n return _context.a(2);\n }\n }, _callee, null, [[3, 5]]);\n }));\n return _pollSyncStatus.apply(this, arguments);\n}\nfunction runSync(_x2) {\n return _runSync.apply(this, arguments);\n}\nfunction _runSync() {\n _runSync = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(onProgress) {\n var onComplete,\n startResult,\n _status,\n _status2,\n status,\n _args2 = arguments,\n _t2;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.p = _context2.n) {\n case 0:\n onComplete = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : null;\n _context2.p = 1;\n _context2.n = 2;\n return (0,_modules_Http_Ajax__WEBPACK_IMPORTED_MODULE_0__.sendAjaxRequest)({\n action: 'spbc_react_sync_start'\n }, true);\n case 2:\n startResult = _context2.v;\n _context2.n = 4;\n break;\n case 3:\n _context2.p = 3;\n _t2 = _context2.v;\n _status = createFailedStatus('Sync start request failed.');\n if (onComplete && typeof onComplete === 'function') {\n onComplete(_status);\n }\n return _context2.a(2, _status);\n case 4:\n if (!(!startResult || _typeof(startResult) !== 'object')) {\n _context2.n = 5;\n break;\n }\n _status2 = createFailedStatus('Sync start request failed.');\n if (onComplete && typeof onComplete === 'function') {\n onComplete(_status2);\n }\n return _context2.a(2, _status2);\n case 5:\n _context2.n = 6;\n return pollSyncStatus(onProgress);\n case 6:\n status = _context2.v;\n if (onComplete && typeof onComplete === 'function') {\n onComplete(status);\n }\n return _context2.a(2, status);\n }\n }, _callee2, null, [[1, 3]]);\n }));\n return _runSync.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./js/src/react/hooks/useSync.js?\n}"); /***/ }, @@ -1316,7 +1606,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 */ ServiceButtons)\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/pageElements/ServiceButtons/styles.css\");\n/* harmony import */ var _components_Button_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/Button/Button */ \"./js/src/react/components/Button/Button.js\");\n/* harmony import */ var _components_SvgIcons_DashboardButtonSvg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/SvgIcons/DashboardButtonSvg */ \"./js/src/react/components/SvgIcons/DashboardButtonSvg.js\");\n/* harmony import */ var _components_SvgIcons_SynchronizeSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/SvgIcons/SynchronizeSvg */ \"./js/src/react/components/SvgIcons/SynchronizeSvg.js\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useSync */ \"./js/src/react/hooks/useSync.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\nvar __ = wp.i18n.__;\n\n\n\n\n\nfunction ServiceButtons() {\n var syncButtonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n lastSyncHint = _useState2[0],\n setLastSyncHint = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (spbcSettings && spbcSettings.key_changed && syncButtonRef.current) {\n syncButtonRef.current.click();\n return;\n }\n if (spbcSettings && spbcSettings.sync_in_progress) {\n (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_5__.runSync)(null, function (status) {\n if (status && status.reload) {\n window.location.reload();\n }\n });\n }\n getLastSyncHint();\n }, []);\n var getLastSyncHint = function getLastSyncHint() {\n if (spbcSettings && spbcSettings.last_sync_date) {\n setLastSyncHint(__('Last Synced', 'security-malware-firewall') + ' ' + spbcSettings.last_sync_date);\n } else {\n setLastSyncHint(__('Not Synced yet', 'security-malware-firewall'));\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'wrap spbc_page_buttons_wrapper'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Button_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n buttonText: __('Security Dashboard', 'security-malware-firewall'),\n type: 'link',\n url: 'https://cleantalk.org/my?cp_mode=security'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SvgIcons_DashboardButtonSvg__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Button_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n buttonText: __('Synchronize with Cloud', 'security-malware-firewall'),\n ref: syncButtonRef,\n lastSyncTitle: lastSyncHint\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SvgIcons_SynchronizeSvg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null))));\n}\n\n//# sourceURL=webpack:///./js/src/react/pageElements/ServiceButtons/ServiceButtons.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ ServiceButtons)\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/pageElements/ServiceButtons/styles.css\");\n/* harmony import */ var _components_Button_Button__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../components/Button/Button */ \"./js/src/react/components/Button/Button.js\");\n/* harmony import */ var _components_SvgIcons_DashboardButtonSvg__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/SvgIcons/DashboardButtonSvg */ \"./js/src/react/components/SvgIcons/DashboardButtonSvg.js\");\n/* harmony import */ var _components_SvgIcons_SynchronizeSvg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/SvgIcons/SynchronizeSvg */ \"./js/src/react/components/SvgIcons/SynchronizeSvg.js\");\n/* harmony import */ var _hooks_useSync__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../hooks/useSync */ \"./js/src/react/hooks/useSync.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;\nvar __ = wp.i18n.__;\n\n\n\n\n\nfunction ServiceButtons() {\n var syncButtonRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n lastSyncHint = _useState2[0],\n setLastSyncHint = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (spbcSettings && spbcSettings.key_changed && syncButtonRef.current) {\n syncButtonRef.current.click();\n return;\n }\n if (spbcSettings && spbcSettings.sync_in_progress) {\n (0,_hooks_useSync__WEBPACK_IMPORTED_MODULE_5__.runSync)(null, function (status) {\n if (status && status.reload) {\n window.location.reload();\n }\n });\n }\n getLastSyncHint();\n }, []);\n var getLastSyncHint = function getLastSyncHint() {\n if (spbcSettings && spbcSettings.last_sync_date) {\n setLastSyncHint(__('Last Synced', 'security-malware-firewall') + ' ' + spbcSettings.last_sync_date);\n } else {\n setLastSyncHint(__('Not Synced yet', 'security-malware-firewall'));\n }\n };\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'wrap spbc_page_buttons_wrapper'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Button_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n buttonText: __('Security Dashboard', 'security-malware-firewall'),\n type: 'link',\n url: 'https://cleantalk.org/my?cp_mode=security'\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SvgIcons_DashboardButtonSvg__WEBPACK_IMPORTED_MODULE_3__[\"default\"], null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_Button_Button__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n buttonText: __('Synchronize with Cloud', 'security-malware-firewall'),\n ref: syncButtonRef,\n lastSyncTitle: lastSyncHint\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_SvgIcons_SynchronizeSvg__WEBPACK_IMPORTED_MODULE_4__[\"default\"], null))));\n}\n\n//# sourceURL=webpack:///./js/src/react/pageElements/ServiceButtons/ServiceButtons.js?\n}"); /***/ }, @@ -1326,7 +1616,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 */ Tabs)\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/pageElements/Tabs/styles.css\");\n/* harmony import */ var _config_Tabs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config/Tabs */ \"./js/src/react/config/Tabs.js\");\n/* harmony import */ var _config_Constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config/Constants */ \"./js/src/react/config/Constants.js\");\n/* harmony import */ var _components_TabHead_TabHead__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/TabHead/TabHead */ \"./js/src/react/components/TabHead/TabHead.js\");\n/* harmony import */ var _components_TabContent_TabContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/TabContent/TabContent */ \"./js/src/react/components/TabContent/TabContent.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\nfunction Tabs(props) {\n var tabsData = props.data;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n activeTab = _useState2[0],\n setActiveTab = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var urlParams = new URLSearchParams(window.location.search);\n var spbcTab = urlParams.get('spbc_tab');\n setActiveTab(spbcTab || _config_Constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_SECTION);\n }, []);\n var tabsHeadInfo = [];\n var tabsContentInfo = [];\n _config_Tabs__WEBPACK_IMPORTED_MODULE_2__.TABS\n // Check some tabs and sections are available\n .filter(function (tab) {\n var _conditions$tab$tabId;\n var conditions = {\n critical_updates: tabsData.isVulnerabilityCheckEnabled && tabsData.isWPMSMainSite,\n traffic_control: tabsData.isSecFWEnabled,\n fswatcher: tabsData.isFsWatcherEnabled && tabsData.isWPMSMainSite,\n scanner: tabsData.isWPMSMainSite,\n debug: tabsData.displayDebug,\n backups: activeTab === tab.tabId\n };\n return (_conditions$tab$tabId = conditions[tab.tabId]) !== null && _conditions$tab$tabId !== void 0 ? _conditions$tab$tabId : true;\n })\n // Prepare tabs and sections data\n .map(function (tab) {\n tabsHeadInfo.push({\n tabId: tab.tabId,\n tabName: tab.tabName,\n isActive: activeTab === tab.tabId,\n svgIcon: tab.svgIcon\n });\n tabsContentInfo.push({\n sectionId: tab.tabId,\n isActive: activeTab === tab.tabId,\n tabComponent: tab.tabComponent\n });\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbc_tabs_nav_wrapper'\n }, tabsHeadInfo.map(function (tabHeadInfo) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TabHead_TabHead__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: tabHeadInfo.tabId,\n tabId: tabHeadInfo.tabId,\n tabName: tabHeadInfo.tabName,\n isActive: tabHeadInfo.isActive\n }, tabHeadInfo.svgIcon);\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbc_tabs_sections_wrapper'\n }, tabsContentInfo.map(function (tabContentInfo) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TabContent_TabContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: tabContentInfo.sectionId,\n sectionId: tabContentInfo.sectionId,\n isActive: tabContentInfo.isActive,\n tabComponent: tabContentInfo.tabComponent\n });\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/pageElements/Tabs/Tabs.js?\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Tabs)\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/pageElements/Tabs/styles.css\");\n/* harmony import */ var _config_Tabs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config/Tabs */ \"./js/src/react/config/Tabs.js\");\n/* harmony import */ var _config_Constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config/Constants */ \"./js/src/react/config/Constants.js\");\n/* harmony import */ var _components_TabHead_TabHead__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/TabHead/TabHead */ \"./js/src/react/components/TabHead/TabHead.js\");\n/* harmony import */ var _components_TabContent_TabContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/TabContent/TabContent */ \"./js/src/react/components/TabContent/TabContent.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\nfunction Tabs(props) {\n var tabsData = props.data;\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(''),\n _useState2 = _slicedToArray(_useState, 2),\n activeTab = _useState2[0],\n setActiveTab = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n var urlParams = new URLSearchParams(window.location.search);\n var spbcTab = urlParams.get('spbc_tab');\n setActiveTab(spbcTab || _config_Constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_SECTION);\n }, []);\n var tabsHeadInfo = [];\n var tabsContentInfo = [];\n _config_Tabs__WEBPACK_IMPORTED_MODULE_2__.TABS\n // Check some tabs and sections are available\n .filter(function (tab) {\n var _conditions$tab$tabId;\n var conditions = {\n critical_updates: tabsData.isVulnerabilityCheckEnabled && tabsData.isWPMSMainSite,\n traffic_control: tabsData.isSecFWEnabled,\n fswatcher: tabsData.isFsWatcherEnabled && tabsData.isWPMSMainSite,\n scanner: tabsData.isWPMSMainSite,\n debug: tabsData.displayDebug,\n backups: activeTab === tab.tabId\n };\n return (_conditions$tab$tabId = conditions[tab.tabId]) !== null && _conditions$tab$tabId !== void 0 ? _conditions$tab$tabId : true;\n })\n // Prepare tabs and sections data\n .map(function (tab) {\n tabsHeadInfo.push({\n tabId: tab.tabId,\n tabName: tab.tabName,\n isActive: activeTab === tab.tabId,\n svgIcon: tab.svgIcon\n });\n tabsContentInfo.push({\n sectionId: tab.tabId,\n isActive: activeTab === tab.tabId,\n tabComponent: tab.tabComponent\n });\n });\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbc_tabs_nav_wrapper'\n }, tabsHeadInfo.map(function (tabHeadInfo) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TabHead_TabHead__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n key: tabHeadInfo.tabId,\n tabId: tabHeadInfo.tabId,\n tabName: tabHeadInfo.tabName,\n isActive: tabHeadInfo.isActive\n }, tabHeadInfo.svgIcon);\n })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: 'spbc_tabs_sections_wrapper'\n }, tabsContentInfo.map(function (tabContentInfo) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_TabContent_TabContent__WEBPACK_IMPORTED_MODULE_5__[\"default\"], {\n key: tabContentInfo.sectionId,\n sectionId: tabContentInfo.sectionId,\n isActive: tabContentInfo.isActive,\n tabComponent: tabContentInfo.tabComponent\n });\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/pageElements/Tabs/Tabs.js?\n}"); /***/ }, @@ -1616,7 +1906,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa \******************************************************************************************************************/ (module, __webpack_exports__, __webpack_require__) { -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.spbc-psc-plugins-tab__content .wrap {\n margin: 0;\n padding: 0;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__intro {\n margin: 0 0 16px;\n}\n\n.spbc-psc-plugins-tab__wrapper {\n position: relative;\n padding: 0 0 0 10px;\n}\n\n.spbc-psc-plugins-tab__sentinel {\n height: 1px;\n width: 100%;\n}\n\n.spbc-psc-plugins-tab__loader {\n display: flex;\n justify-content: center;\n padding: 16px 0 24px;\n}\n`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSecurityCertified/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.spbc-psc-plugins-tab__content .wrap {\n margin: 0;\n padding: 0;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__intro {\n margin: 0 0 16px;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0 0 12px;\n gap: 12px;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__filters {\n float: none;\n margin: 0;\n padding: 0;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__filter.current {\n font-weight: 600;\n color: #1d2327;\n text-decoration: none;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__search {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-search-preloader {\n height: 20px;\n width: auto;\n flex-shrink: 0;\n}\n\n.spbc-psc-plugins-tab__content .spbc-psc-plugins-tab__search-input {\n min-width: 200px;\n padding: 4px 8px;\n}\n\n.spbc-psc-plugins-tab__wrapper {\n position: relative;\n padding: 0 0 0 10px;\n}\n\n.spbc-psc-plugins-tab__sentinel {\n height: 1px;\n width: 100%;\n}\n\n.spbc-psc-plugins-tab__loader {\n display: flex;\n justify-content: center;\n padding: 16px 0 24px;\n}\n\n.spbc-psc-plugins-tab__content .no-plugin-results {\n padding: 100px 0 !important;\n}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSecurityCertified/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); /***/ }, @@ -1646,7 +1936,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa \****************************************************************************************************************/ (module, __webpack_exports__, __webpack_require__) { -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Show/hide key link */\n#showHideLink{\n display: inline-block;\n margin-top: 5px;\n color: #777;\n}\n`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Show/hide key link */\n#showHideLink{\n display: inline-block;\n margin-top: 5px;\n color: #777;\n}\n\n/* Trusted and affiliate */\n.spbc_affiliate_shortcode {\n width:auto !important;\n}\n/** .spbc_sub* and spbc_affiliate_shortcode used in General settings tab */\n.spbc_sub_setting{margin-left: 30px !important;}\n.spbc_sub2_setting{margin-left: 60px !important;}`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); /***/ }, @@ -1656,7 +1946,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa \*********************************************************************************************/ (module, __webpack_exports__, __webpack_require__) { -eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.spbc_tab{\n display: none;\n margin: 0;\n background-color: white;\n}\n.spbc_tab_section {\n display: none;\n}\n.spbc_tab_section--active {\n display: block;\n}\n.spbc_tab_fields_group{\n position: relative;\n min-width: 255px;\n margin: 10px auto;\n border: 1px solid #e5e5e5;\n box-shadow: 0 1px 1px rgba(0,0,0,.04);\n -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.04);\n background: #fdfdfd;\n}\n/* A temporary solution until the entire settings group is switched to React */\n.spbc_tab_fields_group--bottom_gluing{\n margin-bottom: 0;\n border-bottom: 1px solid #e5e5e500;\n}\n.spbc_tab_fields_group--firewall{\n\tmargin-top: 0;\n border-top: 1px solid #e5e5e500;\n}\n/*END A temporary solution until the entire settings group is switched to React */\n.spbc_group_header{\n margin: 0 0 10px 0;\n padding: 10px;\n border-bottom: 1px solid #eee;\n}\n.spbc_group_header > h3 {\n margin: 0;\n}\n.spbc_group_header > h3 > a {\n color: #1d2327;\n text-decoration: none;\n}\n.spbc_wrapper_field{\n margin: 0 15px 15px 15px;\n}\n.spbc_wrapper_field label{\n vertical-align: baseline;\n}\n.spbc_wrapper_field h4{\n margin: 10px 15px 5px 15px;\n}\n`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); +eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.spbc_tab{\n display: none;\n margin: 0;\n background-color: white;\n}\n.spbc_tab_section {\n display: none;\n}\n.spbc_tab_section--active {\n display: block;\n}\n.spbc_tab_fields_group{\n position: relative;\n min-width: 255px;\n margin: 10px auto;\n border: 1px solid #e5e5e5;\n box-shadow: 0 1px 1px rgba(0,0,0,.04);\n -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.04);\n background: #fdfdfd;\n}\n.spbc_group_header{\n margin: 0 0 10px 0;\n padding: 10px;\n border-bottom: 1px solid #eee;\n}\n.spbc_group_header > h3 {\n margin: 0;\n}\n.spbc_group_header > h3 > a {\n color: #1d2327;\n text-decoration: none;\n}\n.spbc_wrapper_field{\n margin: 0 15px 15px 15px;\n}\n.spbc_wrapper_field label{\n vertical-align: baseline;\n}\n.spbc_wrapper_field h4{\n margin: 10px 15px 5px 15px;\n}\n`, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/styles.css?./node_modules/css-loader/dist/cjs.js\n}"); /***/ }, @@ -2173,17 +2463,17 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ }); /************************************************************************/ /******/ // The module cache -/******/ var __webpack_module_cache__ = {}; +/******/ const __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ const cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ const module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ loaded: false, /******/ exports: {} @@ -2192,7 +2482,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ // Execute the module function /******/ if (!(moduleId in __webpack_modules__)) { /******/ delete __webpack_module_cache__[moduleId]; -/******/ var e = new Error("Cannot find module '" + moduleId + "'"); +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); /******/ e.code = 'MODULE_NOT_FOUND'; /******/ throw e; /******/ } @@ -2213,7 +2503,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? +/******/ const getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); @@ -2223,11 +2513,26 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { -/******/ // define getter functions for harmony exports +/******/ // 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] }); +/******/ 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] }); +/******/ } /******/ } /******/ } /******/ }; @@ -2254,7 +2559,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ if(Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); @@ -2272,16 +2577,16 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ /******/ /* webpack/runtime/publicPath */ /******/ (() => { -/******/ var scriptUrl; +/******/ let scriptUrl; /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + ""; -/******/ var document = __webpack_require__.g.document; +/******/ const document = __webpack_require__.g.document; /******/ if (!scriptUrl && document) { -/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') +/******/ if (document.currentScript?.tagName.toUpperCase() === 'SCRIPT') /******/ scriptUrl = document.currentScript.src; /******/ if (!scriptUrl) { -/******/ var scripts = document.getElementsByTagName("script"); +/******/ const scripts = document.getElementsByTagName("script"); /******/ if(scripts.length) { -/******/ var i = scripts.length - 1; +/******/ let i = scripts.length - 1; /******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src; /******/ } /******/ } @@ -2300,7 +2605,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ // object to store loaded and loading chunks /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { +/******/ const installedChunks = { /******/ "main": 0 /******/ }; /******/ @@ -2329,7 +2634,7 @@ eval("{module.exports = __webpack_require__.p + \"d0e8437c6ac4a5a78136.woff2\";\ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./js/src/react/index.js"); +/******/ let __webpack_exports__ = __webpack_require__("./js/src/react/index.js"); /******/ /******/ })() ; \ No newline at end of file diff --git a/js/spbc-settings.min.js b/js/spbc-settings.min.js index 22a718b5d..af31b2f07 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");var s=jQuery("#spbc_long_desc__"+t);s.append("").append("

").css({top:e.position().top+25,left:e.position().left+5}),spbcSendAJAXRequest({action:"spbc_settings__get_recommendation",setting_id:t},{spinner:s.children("img"),callback:function(e,t,s,n){n.empty().append("
").append("").append("

"+e.title+"

").append("

"+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",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","#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()})}); +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");var s=jQuery("#spbc_long_desc__"+t);s.append("").append("
").css({top:e.position().top+25,left:e.position().left+5}),spbcSendAJAXRequest({action:"spbc_settings__get_recommendation",setting_id:t},{spinner:s.children("img"),callback:function(e,t,s,n){n.empty().append("
").append("").append("

"+e.title+"

").append("

"+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",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","#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)}})})}); //# sourceMappingURL=spbc-settings.min.js.map diff --git a/js/spbc-settings.min.js.map b/js/spbc-settings.min.js.map index b8c68e43e..bb24bc3a9 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.title+'

')\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\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 {\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.title+'

')\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 { if (onFormDataChange) { @@ -32,13 +32,14 @@ export default function SignupInterface({ action: 'spbc_get_key_auto', email: email, ct_admin_timezone: ctAdminTimezone, + spbct_wizard_request: 1, }, { timeout: 25000, button: document.getElementById('spbct-signup-wizard-get-key-btn'), spinner: '', callback: function(result) { - setButtonText(__('Connect to Account', 'security-malware-firewall')); + setButtonText(__('Activate Security', 'security-malware-firewall')); if (result.success) { if (result.getTemplates) { // @ToDo Is this functionality needed? If yes - need to be fixed, not worked for now. @@ -97,7 +98,7 @@ export default function SignupInterface({

- {__('Connect your website to CleanTalk cloud', 'security-malware-firewall')} + {__('Connect Your Website to the Anti-Spam Cloud', 'security-malware-firewall')}

diff --git a/js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js b/js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js index 45b26202a..07e12c2bf 100644 --- a/js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js +++ b/js/src/react/components/TabContent/TabFirewall/FirewallTableRow.js @@ -178,14 +178,43 @@ export default function FirewallTableRow({row, rowIndex}) { return `https://cleantalk.org/blacklists/${ip}?${params.toString()}`; }; - const getCountryPart = (country) => { + // Adds a locale-aware thousands separator, keeps non numeric values (like '-') untouched + const formatNumber = (number) => { + const value = Number(number); + if (number === '' || number === null || isNaN(value)) { + return number; + } + return value.toLocaleString(); + }; + + const getLocationPart = (country) => { + const countryCode = country.country_code || ''; + + const parts = []; + [country.country_name, country.subdivision, country.city] + .filter((part) => typeof part === 'string' && part.trim() !== '') + .forEach((part) => { + const value = part.trim(); + if (!parts.some((added) => added.toLowerCase() === value.toLowerCase())) { + parts.push(value); + } + }); + const location = parts.join(', '); + + if (countryCode === '' && location === '') { + return '-'; + } + return (
- {country.country_code}
- {country.country_name} | {country.subdivision} | {country.city} + { countryCode !== '' ? ( + {countryCode} + ) : null } + { countryCode !== '' && location !== '' ? '\u00A0' : null } + {location}
); }; @@ -246,12 +275,12 @@ export default function FirewallTableRow({row, rowIndex}) { { row.country ? - getCountryPart(row.country) : + getLocationPart(row.country) : '-' } @@ -305,7 +334,7 @@ export default function FirewallTableRow({row, rowIndex}) { data-before={__('Requests and attempts', 'security-malware-firewall')} data-defore-no-code='' > - {row.requests || 0} + {formatNumber(row.requests || 0)} - {row.requests_per || 0} + {formatNumber(row.requests_per || 0)} { if (!container || container.dataset.pscModalBound) { @@ -19,8 +22,8 @@ const bindPluginDetailsModal = (container) => { $(container).on('click', '.thickbox.open-plugin-details-modal', function(e) { const title = $(this).data('title') ? - wp.i18n.sprintf(wp.i18n.__('Plugin: %s', 'security-malware-firewall'), $(this).data('title')) : - wp.i18n.__('Plugin details', 'security-malware-firewall'); + sprintf(__('Plugin: %s', 'security-malware-firewall'), $(this).data('title')) : + __('Plugin details', 'security-malware-firewall'); e.preventDefault(); e.stopPropagation(); @@ -29,7 +32,7 @@ const bindPluginDetailsModal = (container) => { $('#TB_window') .attr({ 'role': 'dialog', - 'aria-label': wp.i18n.__('Plugin details', 'security-malware-firewall'), + 'aria-label': __('Plugin details', 'security-malware-firewall'), }) .addClass('plugin-details-modal'); @@ -37,15 +40,27 @@ const bindPluginDetailsModal = (container) => { }); }; -export default function TabSecurityCertified({sectionData}) { +export default function TabSecurityCertified({sectionData: initialSectionData}) { const containerRef = useRef(null); const sentinelRef = useRef(null); const loadingRef = useRef(false); + const requestIdRef = useRef(0); const pageRef = useRef(1); + const apiPageRef = useRef(0); + const filterRef = useRef('all'); + const searchRef = useRef(''); const hasMoreRef = useRef(false); + const [sectionData, setSectionData] = useState(initialSectionData); const [loading, setLoading] = useState(false); const [hasMore, setHasMore] = useState(false); + const [certifiedLastMonth, setCertifiedLastMonth] = useState(initialSectionData?.certified_last_month || 0); + const [shownTotal, setShownTotal] = useState(initialSectionData?.shown_count || 0); + const [searchLoading, setSearchLoading] = useState(false); + + useEffect(() => { + setSectionData(initialSectionData); + }, [initialSectionData]); useEffect(() => { if (!sectionData) { @@ -53,6 +68,8 @@ export default function TabSecurityCertified({sectionData}) { } pageRef.current = sectionData.page || 1; + apiPageRef.current = sectionData.api_page || 0; + filterRef.current = sectionData.filter || 'all'; hasMoreRef.current = !!sectionData.has_more; setHasMore(!!sectionData.has_more); }, [sectionData]); @@ -63,42 +80,183 @@ export default function TabSecurityCertified({sectionData}) { } bindPluginDetailsModal(containerRef.current); - }, [sectionData?.html]); - const loadMore = useCallback(async () => { - if (loadingRef.current || !hasMoreRef.current) { - return; + // Restore search term in the re-rendered input. + if (searchRef.current) { + const input = containerRef.current.querySelector('[data-spbc-psc-search]'); + if (input) { + input.value = searchRef.current; + } } + }, [sectionData?.html]); + + const request = useCallback(async ({filter, page, apiPage, append, search}) => { + const requestId = ++requestIdRef.current; loadingRef.current = true; setLoading(true); - const nextPage = pageRef.current; - try { - const data = await sendAjaxRequest({ + const requestData = { action: 'spbct_get_tab_data', tab_name: 'security_certified', - page: nextPage, - append: 1, - }, true); + filter, + page, + api_page: apiPage, + }; + + if (search) { + requestData.search = search; + } + + if (append) { + requestData.append = 1; + } + + const data = await sendAjaxRequest(requestData, true); + + // A newer request (a filter switch) has been started meanwhile, its result wins. + if (requestId !== requestIdRef.current) { + return; + } + + if (!append) { + setSectionData(data); + setCertifiedLastMonth(data.certified_last_month || 0); + setShownTotal(data.shown_count || 0); + return; + } const list = containerRef.current?.querySelector('#the-list'); if (list && data.rows_html) { list.insertAdjacentHTML('beforeend', data.rows_html); } - pageRef.current = data.page || nextPage; + pageRef.current = data.page || page; + apiPageRef.current = data.api_page || apiPage; hasMoreRef.current = !!data.has_more; setHasMore(!!data.has_more); + setCertifiedLastMonth(data.certified_last_month || 0); + setShownTotal(data.shown_count || 0); } catch (error) { console.error('Error loading PSC plugins:', error); } finally { - loadingRef.current = false; - setLoading(false); + if (requestId === requestIdRef.current) { + loadingRef.current = false; + setLoading(false); + setSearchLoading(false); + } } }, []); + const loadMore = useCallback(async () => { + if (loadingRef.current || !hasMoreRef.current || searchRef.current) { + return; + } + + await request({ + filter: filterRef.current, + page: pageRef.current, + apiPage: apiPageRef.current, + append: true, + }); + + // The sentinel may still be on screen when the appended batch is short, and the observer + // reports intersection changes only, so the next batch is requested explicitly. + const sentinel = sentinelRef.current; + if (!sentinel || !hasMoreRef.current || loadingRef.current) { + return; + } + + if (sentinel.getBoundingClientRect().top <= window.innerHeight + LOAD_MORE_OFFSET) { + loadMore(); + } + }, [request]); + + useEffect(() => { + const container = containerRef.current; + if (!container) { + return; + } + + const onFilterClick = (event) => { + const link = event.target.closest('[data-spbc-psc-filter]'); + if (!link || !container.contains(link)) { + return; + } + + event.preventDefault(); + + const nextFilter = link.dataset.spbcPscFilter; + if (nextFilter === filterRef.current) { + return; + } + + filterRef.current = nextFilter; + searchRef.current = ''; + hasMoreRef.current = false; + setHasMore(false); + + const input = container.querySelector('[data-spbc-psc-search]'); + if (input) { + input.value = ''; + } + + request({filter: nextFilter, page: 1, apiPage: 0, append: false}); + }; + + const performSearch = () => { + const input = container.querySelector('[data-spbc-psc-search]'); + const term = input ? input.value.trim() : ''; + + searchRef.current = term; + hasMoreRef.current = false; + setHasMore(false); + setSearchLoading(true); + + if (!term) { + request({filter: filterRef.current, page: 1, apiPage: 0, append: false}); + return; + } + + request({filter: filterRef.current, page: 1, apiPage: 0, append: false, search: term}); + }; + + const onSearchSubmit = (event) => { + const btn = event.target.closest('[data-spbc-psc-search-submit]'); + if (!btn || !container.contains(btn)) { + return; + } + + event.preventDefault(); + performSearch(); + }; + + const onSearchKeydown = (event) => { + if (event.key !== 'Enter') { + return; + } + + const input = event.target.closest('[data-spbc-psc-search]'); + if (!input || !container.contains(input)) { + return; + } + + event.preventDefault(); + performSearch(); + }; + + container.addEventListener('click', onFilterClick); + container.addEventListener('click', onSearchSubmit); + container.addEventListener('keydown', onSearchKeydown); + + return () => { + container.removeEventListener('click', onFilterClick); + container.removeEventListener('click', onSearchSubmit); + container.removeEventListener('keydown', onSearchKeydown); + }; + }, [request, sectionData?.html]); + useEffect(() => { const sentinel = sentinelRef.current; if (!sentinel || !hasMore) { @@ -111,7 +269,7 @@ export default function TabSecurityCertified({sectionData}) { loadMore(); } }, - {root: null, rootMargin: '200px', threshold: 0}, + {root: null, rootMargin: LOAD_MORE_OFFSET + 'px', threshold: 0}, ); observer.observe(sentinel); @@ -119,6 +277,30 @@ export default function TabSecurityCertified({sectionData}) { return () => observer.disconnect(); }, [hasMore, loadMore, sectionData]); + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const searchDiv = container.querySelector('.spbc-psc-plugins-tab__search'); + if (!searchDiv) return; + + let img = searchDiv.querySelector('.spbc-psc-search-preloader'); + + if (searchLoading) { + if (!img) { + img = document.createElement('img'); + img.className = 'spbc-psc-search-preloader'; + img.src = preloaderGif; + img.alt = ''; + const input = searchDiv.querySelector('[data-spbc-psc-search]'); + searchDiv.insertBefore(img, input); + } + img.style.display = 'inline-block'; + } else if (img) { + img.style.display = 'none'; + } + }, [searchLoading, sectionData?.html]); + if (!sectionData || !sectionData.html) { return null; } @@ -132,6 +314,30 @@ export default function TabSecurityCertified({sectionData}) {

{__('Security Certified', 'security-malware-firewall')}

+

+ {__('This tab shows plugin releases certified by CleanTalk\'s security team. We have reviewed these releases for vulnerabilities such as XSS, SQL injection, and backdoors. The full list of security tests is available', 'security-malware-firewall')} + {' '} + + {__('here', 'security-malware-firewall')} + + {'. '} + {__('While we make every effort to identify security issues, we cannot guarantee that any release shown in this tab is completely free of vulnerabilities.', 'security-malware-firewall')} + + {(certifiedLastMonth > 0 || shownTotal > 0) && ( + + {' '} + {certifiedLastMonth > 0 && sprintf( + __('%d plugins have been certified in the past month,', 'security-malware-firewall'), + certifiedLastMonth, + )} + {certifiedLastMonth > 0 && shownTotal > 0 && ' '} + {shownTotal > 0 && sprintf( + __('bringing the total to %d certified plugins.', 'security-malware-firewall'), + shownTotal, + )} + + )} +

); diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js index 35a84dc04..f933837a8 100644 --- a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpCountInterval.js @@ -3,7 +3,7 @@ import Select from '../../../FormElements/Select'; const {__} = wp.i18n; export default function BfpCountInterval(props) { - const {id, name, value} = props; + const {id, name, value, onSettingChange} = props; const options = [ {value: '300', label: __('5 minutes', 'security-malware-firewall')}, @@ -25,6 +25,9 @@ export default function BfpCountInterval(props) { value={String(value)} options={options} className="spbc_setting_field" + onChange={(e) => { + onSettingChange?.(id, parseInt(e.target.value, 10)); + }} />
); diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js new file mode 100644 index 000000000..9d6b84b58 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/BfpEnabled.js @@ -0,0 +1,96 @@ +import React, {useEffect} from 'react'; +const {__, sprintf} = wp.i18n; + +const BFP_CHILDREN = + 'bfp__allowed_wrong_auths,bfp__count_interval,bfp__block_period__5_fails'; + +/** + * Mirrors PHP spbc_seconds_to_human_time(). + * + * @param {number|string} seconds + * @return {string} + */ +function secondsToHumanTime(seconds) { + const sec = parseInt(seconds, 10) || 0; + + if (sec % 60 !== 0) { + return sec + ' seconds'; + } + + if (sec / 60 / 60 < 1) { + const minutes = sec / 60; + if (minutes < 1) { + return sec === 1 ? sec + ' second' : sec + ' seconds'; + } + return minutes + (sec > 60 ? ' minutes' : ' minute'); + } + + if (sec / 60 / 60 / 24 < 1) { + const hours = sec / 60 / 60; + return hours + (sec > 3600 ? ' hours' : ' hour'); + } + + if (sec / 60 / 60 / 24 / 30 < 1) { + const days = sec / 60 / 60 / 24; + return days + (sec > 86400 ? ' days' : ' day'); + } + + return sec + ' seconds'; +} + +export default function BfpEnabled(props) { + const {id, name, value, onSettingChange, groupSettings} = props; + const isEnabled = value === 1 || value === '1' || value === true; + + const allowedWrongAuths = parseInt(groupSettings?.bfp__allowed_wrong_auths, 10) || 5; + const countIntervalMinutes = + Math.floor((parseInt(groupSettings?.bfp__count_interval, 10) || 900) / 60); + const blockPeriodHuman = secondsToHumanTime( + groupSettings?.bfp__block_period__5_fails || 3600, + ); + + useEffect(() => { + if (typeof window.spbcSettingsDependencies === 'function') { + window.spbcSettingsDependencies(BFP_CHILDREN, isEnabled ? 1 : 0); + } + }, [isEnabled]); + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + if (typeof window.spbcSettingsDependencies === 'function') { + window.spbcSettingsDependencies(BFP_CHILDREN, next); + } + }} + /> + +
+ + {sprintf( + // eslint-disable-next-line max-len + __('If someone fails %s authorizations in a row within %s minutes, plugin blocks the visitor for %s by placing a record with "Blocked by BruteForce protection system" status to FireWall.', 'security-malware-firewall'), + allowedWrongAuths, + countIntervalMinutes, + blockPeriodHuman, + )} + +
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js new file mode 100644 index 000000000..7b70f32dc --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataAdditionalHeaders.js @@ -0,0 +1,32 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function DataAdditionalHeaders(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + __('Add these headers to the HTTP responses on the public pages: X-Content-Type-Options, X-XSS-Protection to get protection from XSS and drive-by download attacks.', 'security-malware-firewall') + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js new file mode 100644 index 000000000..11836b398 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/DataSetCookies.js @@ -0,0 +1,52 @@ +import React from 'react'; +import InputRadioGroup from '../../../FormElements/InputRadioGroup'; + +const {__} = wp.i18n; + +/** + * @param {object} props + * @param {string} props.id + * @param {string} props.name + * @param {string|number} props.value + * @param {function(string, *): void} [props.onSettingChange] + * @return {JSX.Element} + */ +export default function DataSetCookies(props) { + const {id, name, value, onSettingChange} = props; + + const options = [ + {value: '1', label: __('On', 'security-malware-firewall')}, + {value: '0', label: __('Off', 'security-malware-firewall')}, + {value: '2', label: __('Alternative mechanism', 'security-malware-firewall')}, + ]; + + return ( + <> + + {__('Set cookies', 'security-malware-firewall')} + + +
+ + <> + {__('Turn this option off or use the alternative mechanism for cookies to forbid the plugin generate any cookies on the website\'s front-end.', 'security-malware-firewall')} +
+ {__('Alternative mechanism will store data in the website database and will not set cookies in browsers, so any cache solution will work just fine.', 'security-malware-firewall')} + +
+
+
+ { + const next = e.target.value; + onSettingChange?.(id, next); + }} + disabled={false} + /> + + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js new file mode 100644 index 000000000..0702c760f --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscBackendLogsEnable.js @@ -0,0 +1,68 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; +const {__, sprintf} = wp.i18n; +const {createInterpolateElement} = wp.element; + +export default function MiscBackendLogsEnable(props) { + const {id, name, value, onSettingChange, wlCompanyName} = props; + const {myBillingLink, backendLogsEnabled, backendLogsLink, wlModeEnabled} = useContext(DataRootContext) || {}; + + const isDisabled = !backendLogsEnabled; + + return ( + <> + { + if (isDisabled) { + return; + } + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + + + {(backendLogsEnabled || wlModeEnabled) ? ( +
{ + sprintf( + __('Collect and send PHP error logs to your %s Dashboard where you can list them.', 'security-malware-firewall'), + wlModeEnabled && wlCompanyName ? wlCompanyName : __('CleanTalk', 'security-malware-firewall'), + ) + }
+ ) : ( +
+ {createInterpolateElement( + __( + 'To see the collected logs please use the Backend PHP log. The extra package is required to start the collection, please click "Synchronize with the Cloud" in the plugin settings after purchasing the Extra package.', + 'security-malware-firewall', + ), + { + a1: , + a2: , + }, + )} +
+ )} + + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js new file mode 100644 index 000000000..009dadbfb --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscCompleteDeactivation.js @@ -0,0 +1,41 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; +const {__, sprintf} = wp.i18n; + +export default function MiscCompleteDeactivation(props) { + const {id, name, value, onSettingChange} = props; + const {spbctPluginDir, directorySeparator} = useContext(DataRootContext) || {}; + const backupDir = `${spbctPluginDir ?? ''}backups${directorySeparator ?? '/'}`; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + sprintf( + __( + 'The plugin will leave no traces in WordPress after deactivation. It could help if you have problems with the plugin. All files backed up by Malware scanner will be removed from %s directory.', + 'security-malware-firewall', + ), + backupDir, + ) + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js new file mode 100644 index 000000000..fb9ea5b4c --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscDisableFileEditor.js @@ -0,0 +1,49 @@ +import React from 'react'; +import InputRadioGroup from '../../../FormElements/InputRadioGroup'; + +const {__} = wp.i18n; + +/** + * @param {object} props + * @param {string} props.id + * @param {string} props.name + * @param {string|number} props.value + * @param {function} props.onSettingChange + * @return {JSX.Element} + */ +export default function MiscDisableFileEditor(props) { + const {id, name, value, onSettingChange} = props; + + const options = [ + {value: '0', label: __('Off', 'security-malware-firewall')}, + {value: '1', label: __('On', 'security-malware-firewall')}, + {value: '2', label: __('Auto', 'security-malware-firewall')}, + ]; + + const isDisabled = !window.spbcSettings?.wpms; + const msDisabledText = __('This setting is controlled by the network administrator.', 'security-malware-firewall'); + + return ( + <> + + {__('Disable File Editor', 'security-malware-firewall')} + + + + {isDisabled ? ( +
{msDisabledText}
+ ) : ( + { + const next = e.target.value; + onSettingChange?.(id, next); + }} + /> + )} + + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js new file mode 100644 index 000000000..0ab601f5e --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscForbidToShowInIframes.js @@ -0,0 +1,32 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function MiscForbidToShowInIframes(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + __('If this option is enabled, third-party websites can\'t show content of your website in IFrames.', 'security-malware-firewall') + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js new file mode 100644 index 000000000..21f760c29 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollecting.js @@ -0,0 +1,30 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function MiscPreventLoginsCollecting(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{__('Prevent visitors from collecting logins of the content authors from the website links (like example.com/?author=1).', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js new file mode 100644 index 000000000..f9dd1eafe --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscPreventLoginsCollectingOnPasswordReset.js @@ -0,0 +1,30 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function MiscPreventLoginsCollectingOnPasswordReset(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{__('The password reset error will not contain the data about selected username does not exist.', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js new file mode 100644 index 000000000..158f02ebf --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MiscShowLinkInLoginForm.js @@ -0,0 +1,37 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; +const {__, sprintf} = wp.i18n; + +export default function MiscShowLinkInLoginForm(props) { + const {id, name, value, onSettingChange, wlCompanyName} = props; + const {brandname} = useContext(DataRootContext) || {}; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + +
{ + sprintf( + __('Place the %s warning under the website login form: "Brute-force protection by %s. All attempts are being logged.', 'security-malware-firewall'), + wlCompanyName ?? __('CleanTalk', 'security-malware-firewall'), + brandname ?? __('Security by CleanTalk', 'security-malware-firewall'), + ) + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js new file mode 100644 index 000000000..66b80f682 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/MonitoringUsers.js @@ -0,0 +1,13 @@ +import React from 'react'; +import InputHidden from '../../../FormElements/InputHidden'; + +export default function MonitoringUsers(props) { + const {id, name, value} = props; + return ( + + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js new file mode 100644 index 000000000..0bcb620a2 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateAddId.js @@ -0,0 +1,38 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; + +const {__} = wp.i18n; + +export default function SPBCTrustedAndAffiliateAddId(props) { + const {id, name, value, onSettingChange, wlCompanyName} = props; + const {trustedAndAffiliateAddIdLink} = useContext(DataRootContext) || {}; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + +
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js new file mode 100644 index 000000000..52301b7f8 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateFooter.js @@ -0,0 +1,38 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; + +const {__, sprintf} = wp.i18n; + +export default function SPBCTrustedAndAffiliateFooter(props) { + const {id, name, value, onSettingChange} = props; + const {brandname} = useContext(DataRootContext) || {}; + + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + +
{ + sprintf( + __('Adds trust text stating that the website is protected from malware by %s protection to the footer of your website.', 'security-malware-firewall'), + brandname ?? __('Security by CleanTalk', 'security-malware-firewall'), + ) + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js new file mode 100644 index 000000000..91024b500 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcode.js @@ -0,0 +1,43 @@ +import React, {useContext} from 'react'; +import useSettingsDependencies from '../../../../hooks/useSettingsDependencies'; +import {DataRootContext} from '../../../App'; + +const {__, sprintf} = wp.i18n; + +export default function SPBCTrustedAndAffiliateShortcode(props) { + const {id, name, value, onSettingChange} = props; + const handleSettingsDependencies = useSettingsDependencies(); + const {brandname} = useContext(DataRootContext) || {}; + + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + handleSettingsDependencies( + 'spbc_trusted_and_affiliate__shortcode_tag', + )(e); + }} + /> + +
{ + sprintf( + __('You can place this shortcode anywhere on your website. Adds trust text stating that the website is protected from malware by %s protection', 'security-malware-firewall'), + brandname ?? __('Security by CleanTalk', 'security-malware-firewall'), + ) + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js new file mode 100644 index 000000000..a7b1ea432 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SPBCTrustedAndAffiliateShortcodeTag.js @@ -0,0 +1,28 @@ +import React from 'react'; +const {__} = wp.i18n; + +const SHORTCODE_VALUE = '[cleantalk_security_affiliate_link]'; + +export default function SPBCTrustedAndAffiliateShortcodeTag(props) { + const {id, name, groupSettings} = props; + + const parentValue = groupSettings?.['spbc_trusted_and_affiliate__shortcode']; + const isDisabled = !parentValue || parentValue === 0 || parentValue === '0'; + + return ( +
+ +   +
+ ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js new file mode 100644 index 000000000..e5766ad9f --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckDesc.js @@ -0,0 +1,16 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function VulnerabilityCheckDesc() { + return ( + <> +

{__('The Security plugin performs a scheduled request to the CleanTalk API to check every installed plugin or theme for known vulnerabilities. The report data are updated with the next triggers:', 'security-malware-firewall')}

+
    +
  • {__('within 100 seconds of any plugin or theme being activated', 'security-malware-firewall')}
  • +
  • {__('within 30 seconds since the Security plugin is activated', 'security-malware-firewall')}
  • +
  • {__('every 24 hours after the last update', 'security-malware-firewall')}
  • +
+

{__('Also, the single check runs every time you observe plugins/themes install pages for every listed item.', 'security-malware-firewall')}

+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js new file mode 100644 index 000000000..e289ca95b --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckEnableCron.js @@ -0,0 +1,36 @@ +import React from 'react'; +import useSettingsDependencies from '../../../../hooks/useSettingsDependencies'; + +const {__} = wp.i18n; + +export default function VulnerabilityCheckEnableCron(props) { + const {id, name, value, onSettingChange} = props; + const handleSettingsDependencies = useSettingsDependencies(); + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + handleSettingsDependencies( + 'vulnerability_check__warn_on_modules_pages', + )(e); + }} + /> + + +
{__('Every 24 hours the plugin checks all the installed plugins over database research.cleantalk.org.', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js new file mode 100644 index 000000000..3260a4a32 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckShowReports.js @@ -0,0 +1,31 @@ +import React from 'react'; + +const {__} = wp.i18n; + +export default function VulnerabilityCheckShowReports(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{__('Plugin reports in Appearance -> Themes and Plugins -> Add New Plugin about security tests that have been done for a specific version of plugin or theme. These tests provided by CleanTalk Research team or/and Cloud Malware Scanner.', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js new file mode 100644 index 000000000..5913b0b46 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckTestBeforeInstall.js @@ -0,0 +1,30 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function VulnerabilityCheckTestBeforeInstall(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{__('Request the research.cleantalk.org about the plugin status to let you know about vulnerability status on the page [Plugins->Add new]', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js new file mode 100644 index 000000000..536a776e0 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/VulnerabilityCheckWarnOnModulesPages.js @@ -0,0 +1,30 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function VulnerabilityCheckWarnOnModulesPages(props) { + const {id, name, value, onSettingChange} = props; + + return ( +
+ { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{__('Modify the page of installed plugins to let you know about vulnerabilities found', 'security-malware-firewall')}
+
+ ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js new file mode 100644 index 000000000..6f710d322 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPDashboardWidgetShow.js @@ -0,0 +1,29 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function WPDashboardWidgetShow(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + +
{__('Shows the brief widget on the main admin page', 'security-malware-firewall')}
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js new file mode 100644 index 000000000..58a764c99 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUploadDirPreventPhpExecution.js @@ -0,0 +1,34 @@ +import React, {useContext} from 'react'; +import {DataRootContext} from '../../../App'; +const {__} = wp.i18n; + +export default function WPUploadDirPreventPhpExecution(props) { + const {id, name, value, onSettingChange} = props; + const {wpUploadDirPreventPhpExecutionDesc} = useContext(DataRootContext) || {}; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + wpUploadDirPreventPhpExecutionDesc + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js new file mode 100644 index 000000000..cdaee521c --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WPUseBuiltinHttpApi.js @@ -0,0 +1,35 @@ +import React from 'react'; +const {__, sprintf} = wp.i18n; + +export default function WPUseBuiltinHttpApi(props) { + const {id, name, value, onSettingChange, wlCompanyName} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + sprintf( + __('Alternative way of connection to the %s Cloud. Enable it if you have connection issues.', 'security-malware-firewall'), + wlCompanyName, + ) + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js new file mode 100644 index 000000000..58be4c4d7 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableRestApi.js @@ -0,0 +1,53 @@ +import React from 'react'; +import InputRadioGroup from '../../../FormElements/InputRadioGroup'; + +const {__} = wp.i18n; + +/** + * @param {object} props + * @param {string} props.id + * @param {string} props.name + * @param {string|number} props.value + * @param {string} props.verificationEmail + * @param {function(string, *): void} [props.onSettingChange] + * @param {{value: string, label: string}[]} [props.wpUserRolesOptions] + * @return {JSX.Element} + */ +export default function WpDisableRestApi(props) { + const {id, name, value, onSettingChange} = props; + + const options = [ + {value: '0', label: __('Off', 'security-malware-firewall')}, + {value: '1', label: __('Disable endpoint "users"', 'security-malware-firewall')}, + {value: '2', label: __('Disable all endpoints', 'security-malware-firewall')}, + ]; + + return ( + <> + + {__('Disable WordPress REST API', 'security-malware-firewall')} + + +
+ + {__( + 'Restrict access to WordPress REST API endpoints for non-authenticated users. Select the mode below.', + 'security-malware-firewall', + )} + +
+
+ { + const next = e.target.value; + onSettingChange?.(id, next); + }} + disabled={false} + /> + + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js new file mode 100644 index 000000000..998948203 --- /dev/null +++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/WpDisableXmlrpc.js @@ -0,0 +1,32 @@ +import React from 'react'; +const {__} = wp.i18n; + +export default function WpDisableXmlrpc(props) { + const {id, name, value, onSettingChange} = props; + + return ( + <> + { + const next = e.target.checked ? 1 : 0; + onSettingChange?.(id, next); + }} + /> + + +
{ + __('Turn this on to disable a WordPress out-of-date technology of connecting websites to miscellaneous systems.', 'security-malware-firewall') + }
+ + ); +} diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js b/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js index 18bc2dc21..09427a071 100644 --- a/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js +++ b/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js @@ -2,6 +2,7 @@ import React, {useState, useEffect, useCallback} from 'react'; import SettingApiKey from './Settings/SettingApiKey'; import SettingWpmsWorkMode from './Settings/SettingWpmsWorkMode'; import SettingWpmsHosterApiKey from './Settings/SettingWpmsHosterApiKey'; +import BfpEnabled from './Settings/BfpEnabled'; import BfpDelay1Fails from './Settings/BfpDelay1Fails'; import BfpDelay5Fails from './Settings/BfpDelay5Fails'; import BfpAllowedWrongAuths from './Settings/BfpAllowedWrongAuths'; @@ -59,6 +60,33 @@ import ScannerFSWatcherEnabled from './Settings/ScannerFSWatcherEnabled'; import ScannerListUnknownOlderThan from './Settings/ScannerListUnknownOlderThan'; import ScannerFSWSnapshotsPeriod from './Settings/ScannerFSWSnapshotsPeriod'; import ScannerListApprovedByCleantalk from './Settings/ScannerListApprovedByCleantalk'; +import VulnerabilityCheckTestBeforeInstall from './Settings/VulnerabilityCheckTestBeforeInstall'; +import VulnerabilityCheckEnableCron from './Settings/VulnerabilityCheckEnableCron'; +import VulnerabilityCheckWarnOnModulesPages from './Settings/VulnerabilityCheckWarnOnModulesPages'; +import VulnerabilityCheckShowReports from './Settings/VulnerabilityCheckShowReports'; +import AdminBarShow from './Settings/AdminBarShow'; +import AdminBarAdminsOnlineCounter from './Settings/AdminBarAdminsOnlineCounter'; +import AdminBarBruteForceCounter from './Settings/AdminBarBruteForceCounter'; +import AdminBarFirewallCounter from './Settings/AdminBarFirewallCounter'; +import WPDashboardWidgetShow from './Settings/WPDashboardWidgetShow'; +import MiscBackendLogsEnable from './Settings/MiscBackendLogsEnable'; +import MiscPreventLoginsCollecting from './Settings/MiscPreventLoginsCollecting'; +import MiscPreventLoginsCollectingOnPasswordReset from './Settings/MiscPreventLoginsCollectingOnPasswordReset'; +import MiscShowLinkInLoginForm from './Settings/MiscShowLinkInLoginForm'; +import WpDisableXmlrpc from './Settings/WpDisableXmlrpc'; +import WpDisableRestApi from './Settings/WpDisableRestApi'; +import DataSetCookies from './Settings/DataSetCookies'; +import MiscForbidToShowInIframes from './Settings/MiscForbidToShowInIframes'; +import DataAdditionalHeaders from './Settings/DataAdditionalHeaders'; +import WPUploadDirPreventPhpExecution from './Settings/WPUploadDirPreventPhpExecution'; +import WPUseBuiltinHttpApi from './Settings/WPUseBuiltinHttpApi'; +import MiscDisableFileEditor from './Settings/MiscDisableFileEditor'; +import MiscCompleteDeactivation from './Settings/MiscCompleteDeactivation'; +import MonitoringUsers from './Settings/MonitoringUsers'; +import SPBCTrustedAndAffiliateShortcode from './Settings/SPBCTrustedAndAffiliateShortcode'; +import SPBCTrustedAndAffiliateShortcodeTag from './Settings/SPBCTrustedAndAffiliateShortcodeTag'; +import SPBCTrustedAndAffiliateFooter from './Settings/SPBCTrustedAndAffiliateFooter'; +import SPBCTrustedAndAffiliateAddId from './Settings/SPBCTrustedAndAffiliateAddId'; export default function SettingsGroup(props) { const { @@ -86,12 +114,10 @@ export default function SettingsGroup(props) { const [liveSettings, setLiveSettings] = useState(settings); + const useLiveSettings = groupId !== 'apikey'; + useEffect(() => { - if ( - groupId === 'auth_and_logging_in' || - groupId === 'firewall' || - groupId === 'scanner_settings' - ) { + if (useLiveSettings) { setLiveSettings(settings); } }, [groupId, settings]); @@ -100,18 +126,14 @@ export default function SettingsGroup(props) { setLiveSettings((prev) => ({...prev, [key]: val})); }, []); - const displaySettings = - groupId === 'auth_and_logging_in' || - groupId === 'firewall' || - groupId === 'scanner_settings' ? - liveSettings : - settings; + const displaySettings = useLiveSettings ? liveSettings : settings; const componentMap = { 'spbc_key': SettingApiKey, 'ms__work_mode': SettingWpmsWorkMode, 'ms__hoster_api_key': SettingWpmsHosterApiKey, // BFP settings + 'bfp__enabled': BfpEnabled, 'bfp__delay__1_fails': BfpDelay1Fails, 'bfp__delay__5_fails': BfpDelay5Fails, 'bfp__allowed_wrong_auths': BfpAllowedWrongAuths, @@ -172,7 +194,37 @@ export default function SettingsGroup(props) { 'scanner__list_approved_by_cleantalk': ScannerListApprovedByCleantalk, 'scanner__fs_watcher': ScannerFSWatcherEnabled, 'scanner__fs_watcher__snapshots_period': ScannerFSWSnapshotsPeriod, - // ... other different types + // vulnerability_check + 'vulnerability_check__test_before_install': VulnerabilityCheckTestBeforeInstall, + 'vulnerability_check__enable_cron': VulnerabilityCheckEnableCron, + 'vulnerability_check__warn_on_modules_pages': VulnerabilityCheckWarnOnModulesPages, + 'vulnerability_check__show_reports': VulnerabilityCheckShowReports, + // admin_bar + 'admin_bar__show': AdminBarShow, + 'admin_bar__admins_online_counter': AdminBarAdminsOnlineCounter, + 'admin_bar__brute_force_counter': AdminBarBruteForceCounter, + 'admin_bar__firewall_counter': AdminBarFirewallCounter, + 'wp__dashboard_widget__show': WPDashboardWidgetShow, + // misc + 'misc__backend_logs_enable': MiscBackendLogsEnable, + 'misc__prevent_logins_collecting': MiscPreventLoginsCollecting, + 'misc__prevent_logins_collecting_on_password_reset': MiscPreventLoginsCollectingOnPasswordReset, + 'misc__show_link_in_login_form': MiscShowLinkInLoginForm, + 'wp__disable_xmlrpc': WpDisableXmlrpc, + 'wp__disable_rest_api': WpDisableRestApi, + 'data__set_cookies': DataSetCookies, + 'misc__forbid_to_show_in_iframes': MiscForbidToShowInIframes, + 'data__additional_headers': DataAdditionalHeaders, + 'wp__upload_dir_prevent_php_execution': WPUploadDirPreventPhpExecution, + 'wp__use_builtin_http_api': WPUseBuiltinHttpApi, + 'misc_disable_file_editor': MiscDisableFileEditor, + 'misc__complete_deactivation': MiscCompleteDeactivation, + 'monitoring__users': MonitoringUsers, + // Trusted and affiliate + 'spbc_trusted_and_affiliate__shortcode': SPBCTrustedAndAffiliateShortcode, + 'spbc_trusted_and_affiliate__shortcode_tag': SPBCTrustedAndAffiliateShortcodeTag, + 'spbc_trusted_and_affiliate__footer': SPBCTrustedAndAffiliateFooter, + 'spbc_trusted_and_affiliate__add_id': SPBCTrustedAndAffiliateAddId, }; const settingKeys = Object.keys(settings || {}); @@ -183,11 +235,6 @@ export default function SettingsGroup(props) { let wrapperClassName = 'spbc_tab_fields_group'; - // A temporary solution until the entire settings group is switched to React - if ( groupId === 'scanner_settings' ) { - wrapperClassName += ' spbc_tab_fields_group--bottom_gluing'; - } - // Hide the fields instead of apikey during apikey is empty wrapperClassName += ! keyIsOk && groupId !== 'apikey' ? ' --hide' : ''; @@ -243,13 +290,7 @@ export default function SettingsGroup(props) { visitorIpSources={visitorIpSources} scannerExclusionsDir={scannerExclusionsDir} scannerExclusionsURL={scannerExclusionsURL} - onSettingChange={ - groupId === 'auth_and_logging_in' || - groupId === 'firewall' || - groupId === 'scanner_settings' ? - patchSetting : - undefined - } + onSettingChange={useLiveSettings ? patchSetting : undefined} />
); diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/styles.css b/js/src/react/components/TabContent/TabSettingsGeneral/styles.css index 4ba9aee4f..bd47c96b9 100644 --- a/js/src/react/components/TabContent/TabSettingsGeneral/styles.css +++ b/js/src/react/components/TabContent/TabSettingsGeneral/styles.css @@ -4,3 +4,11 @@ margin-top: 5px; color: #777; } + +/* Trusted and affiliate */ +.spbc_affiliate_shortcode { + width:auto !important; +} +/** .spbc_sub* and spbc_affiliate_shortcode used in General settings tab */ +.spbc_sub_setting{margin-left: 30px !important;} +.spbc_sub2_setting{margin-left: 60px !important;} \ No newline at end of file diff --git a/js/src/react/components/TabContent/styles.css b/js/src/react/components/TabContent/styles.css index 34fc0c8a8..da07349c9 100644 --- a/js/src/react/components/TabContent/styles.css +++ b/js/src/react/components/TabContent/styles.css @@ -18,16 +18,6 @@ -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.04); background: #fdfdfd; } -/* A temporary solution until the entire settings group is switched to React */ -.spbc_tab_fields_group--bottom_gluing{ - margin-bottom: 0; - border-bottom: 1px solid #e5e5e500; -} -.spbc_tab_fields_group--firewall{ - margin-top: 0; - border-top: 1px solid #e5e5e500; -} -/*END A temporary solution until the entire settings group is switched to React */ .spbc_group_header{ margin: 0 0 10px 0; padding: 10px; diff --git a/js/src/spbc-settings.js b/js/src/spbc-settings.js index a634eb525..4b3ee5a7d 100644 --- a/js/src/spbc-settings.js +++ b/js/src/spbc-settings.js @@ -610,6 +610,40 @@ jQuery(document).ready(function() { 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 $btn = jQuery(this); + let $st = jQuery('#spbc_debug__pass_check_status'); + $btn.prop('disabled', true); + $st.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(response) { + $btn.prop('disabled', false); + if (response.success) { + $st.css('color', 'green').html( + '✓ Done! Total: ' + response.data.total + + ', Checked: ' + response.data.checked + + ', Leaked: ' + response.data.leaked + + ' — You can now test the login form in incognito.', + ); + } else { + $st.css('color', 'red').text('Error: ' + (response.data || 'unknown error')); + } + }, + error: function(xhr) { + $btn.prop('disabled', false); + $st.css('color', 'red').text('Request failed: ' + xhr.status + ' ' + xhr.statusText); + }, + }); + }); }); /** diff --git a/lib/CleantalkSP/Common/API.php b/lib/CleantalkSP/Common/API.php index 2f1990141..a5d894c9a 100755 --- a/lib/CleantalkSP/Common/API.php +++ b/lib/CleantalkSP/Common/API.php @@ -205,6 +205,7 @@ public static function method__get_2s_blacklists_db($api_key, $out = null) // ph * @param bool $wpms * @param bool $white_label * @param string $hoster_api_key + * @param string $lead_source Source of the registration * * @return array|bool|mixed */ @@ -218,7 +219,8 @@ public static function method__get_api_key( // phpcs:ignore PSR1.Methods.CamelCa $user_ip = null, $wpms = false, $white_label = false, - $hoster_api_key = '' + $hoster_api_key = '', + $lead_source = '' ) { $request = array( 'method_name' => 'get_api_key', @@ -232,6 +234,7 @@ public static function method__get_api_key( // phpcs:ignore PSR1.Methods.CamelCa 'wpms_setup' => $wpms, 'hoster_whitelabel' => $white_label, 'hoster_api_key' => $hoster_api_key, + 'lead_source' => $lead_source, ); return static::sendRequest($request); diff --git a/lib/CleantalkSP/Common/HTTP/Request.php b/lib/CleantalkSP/Common/HTTP/Request.php index 4cd3c3804..ae7258e7f 100644 --- a/lib/CleantalkSP/Common/HTTP/Request.php +++ b/lib/CleantalkSP/Common/HTTP/Request.php @@ -44,7 +44,7 @@ class Request * get_code - getting only HTTP response code * async - async requests. Sends request and return 'true' value. Doesn't wait for response. * get - makes GET-type request instead of default POST-type - * ssl - uses SSL + * ssl - ensure TLS peer/host verification and CA bundle (enabled by default) * cache - allow caching for this request * retry_with_socket - make another request with socket if cURL failed to retrieve data */ @@ -113,7 +113,7 @@ public function setData($data) * get_code - getting only HTTP response code * async - async requests. Sends request and return 'true' value. Doesn't wait for response. * get - makes GET-type request instead of default POST-type - * ssl - uses SSL + * ssl - ensure TLS peer/host verification and CA bundle (enabled by default) * cache - allow caching for this request * retry_with_socket - make another request with socket if cURL failed to retrieve data * @@ -379,10 +379,10 @@ private function convertOptionsTocURLFormat() $temp_options[CURLOPT_TIMEOUT] = $option_value; // String break; case 'sslverify': - if ($option_value) { - $temp_options[CURLOPT_SSL_VERIFYPEER] = (bool)$option_value; // Boolean - $temp_options[CURLOPT_SSL_VERIFYHOST] = (int)(bool)$option_value; // Int 0|1 - } + $temp_options[CURLOPT_SSL_VERIFYPEER] = (bool)$option_value; + // VERIFYHOST must be 2 for hostname check; 1 is deprecated and insecure + $temp_options[CURLOPT_SSL_VERIFYHOST] = $option_value ? 2 : 0; + unset($this->options[$option_name]); break; case 'sslcertificates': $temp_options[CURLOPT_CAINFO] = $option_name; // String @@ -412,32 +412,35 @@ private function convertOptionsTocURLFormat() */ protected function appendOptionsObligatory() { - // Merging OBLIGATORY options with GIVEN options - $this->options = array_replace( - array( - CURLOPT_URL => ! is_array($this->url) ? $this->url : null, - CURLOPT_TIMEOUT => 50, - CURLOPT_LOW_SPEED_TIME => 25, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_CONNECTTIMEOUT => 5000, - CURLOPT_FORBID_REUSE => true, - CURLOPT_USERAGENT => self::AGENT . '; ' . (Server::getString('SERVER_NAME') ?: 'UNKNOWN_HOST'), - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => $this->data, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_SSL_VERIFYHOST => 0, - CURLOPT_HTTPHEADER => array( - 'Expect:', // Fix for large data and old servers http://php.net/manual/ru/function.curl-setopt.php#82418 - 'Expires: ' . date(DATE_RFC822, mktime(0, 0, 0, 1, 1, 1971)), - 'Cache-Control: no-store, no-cache, must-revalidate', - 'Cache-Control: post-check=0, pre-check=0', - 'Pragma: no-cache', - ), - CURLOPT_FOLLOWLOCATION => true, - CURLOPT_MAXREDIRS => 5, + $defaults = array( + CURLOPT_URL => ! is_array($this->url) ? $this->url : null, + CURLOPT_TIMEOUT => 50, + CURLOPT_LOW_SPEED_TIME => 25, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CONNECTTIMEOUT => 5000, + CURLOPT_FORBID_REUSE => true, + CURLOPT_USERAGENT => self::AGENT . '; ' . (Server::getString('SERVER_NAME') ?: 'UNKNOWN_HOST'), + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $this->data, + CURLOPT_SSL_VERIFYPEER => true, + CURLOPT_SSL_VERIFYHOST => 2, + CURLOPT_HTTPHEADER => array( + 'Expect:', // Fix for large data and old servers http://php.net/manual/ru/function.curl-setopt.php#82418 + 'Expires: ' . date(DATE_RFC822, mktime(0, 0, 0, 1, 1, 1971)), + 'Cache-Control: no-store, no-cache, must-revalidate', + 'Cache-Control: post-check=0, pre-check=0', + 'Pragma: no-cache', ), - $this->options + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_MAXREDIRS => 5, ); + + if (defined('CLEANTALK_CASERT_PATH') && CLEANTALK_CASERT_PATH) { + $defaults[CURLOPT_CAINFO] = CLEANTALK_CASERT_PATH; + } + + // Merging OBLIGATORY options with GIVEN options + $this->options = array_replace($defaults, $this->options); } /** diff --git a/lib/CleantalkSP/SpbctWP/Activator.php b/lib/CleantalkSP/SpbctWP/Activator.php index 1d89dadc1..691c6bd5f 100644 --- a/lib/CleantalkSP/SpbctWP/Activator.php +++ b/lib/CleantalkSP/SpbctWP/Activator.php @@ -5,6 +5,7 @@ use CleantalkSP\SpbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentHandler; use CleantalkSP\SpbctWP\Cron as SpbcCron; use CleantalkSP\SpbctWP\HTTP\CDNHeadersChecker; +use CleantalkSP\SpbctWP\VulnerabilityAlarm\PscCertifiedPluginsCache; class Activator { @@ -142,6 +143,12 @@ public static function activation($network, $redirect = true) add_option('spbc_activation__redirect', $redirect_url); } + try { + PscCertifiedPluginsCache::warm(); + } catch ( \Exception $exception ) { + spbc_log('Couldn\'t warm the PSC certified plugins cache. ' . $exception->getMessage()); + } + if ( $spbc->api_key || ( ! is_main_site() && $spbc->network_settings['ms__work_mode'] != 2 ) ) { return; } diff --git a/lib/CleantalkSP/SpbctWP/AdjustToEnvironmentModule/AdjustToEnvironmentSettings.php b/lib/CleantalkSP/SpbctWP/AdjustToEnvironmentModule/AdjustToEnvironmentSettings.php index 9d0a75e8f..f04d01bfa 100644 --- a/lib/CleantalkSP/SpbctWP/AdjustToEnvironmentModule/AdjustToEnvironmentSettings.php +++ b/lib/CleantalkSP/SpbctWP/AdjustToEnvironmentModule/AdjustToEnvironmentSettings.php @@ -2,6 +2,9 @@ namespace CleantalkSP\SpbctWP\AdjustToEnvironmentModule; +/** + * @psalm-suppress UnusedClass + */ class AdjustToEnvironmentSettings { public static function render() diff --git a/lib/CleantalkSP/SpbctWP/DB/SQLSchema.php b/lib/CleantalkSP/SpbctWP/DB/SQLSchema.php index 9e8bab34a..2ede25594 100644 --- a/lib/CleantalkSP/SpbctWP/DB/SQLSchema.php +++ b/lib/CleantalkSP/SpbctWP/DB/SQLSchema.php @@ -525,5 +525,22 @@ class SQLSchema extends \CleantalkSP\Common\DB\SQLSchema array('type' => 'PRIMARY', 'name' => 'KEY', 'body' => '(`id`)'), ), ), + + 'psc_plugins_cache' => array( + 'columns' => array( + array('field' => 'id', 'type' => 'int unsigned', 'null' => 'no', 'extra' => 'AUTO_INCREMENT'), + array('field' => 'slug', 'type' => 'varchar(191)', 'null' => 'no',), + array('field' => 'source', 'type' => "enum('installed','catalog')", 'null' => 'no',), + array('field' => 'sort_order', 'type' => 'int', 'null' => 'no', 'default' => '0',), + array('field' => 'plugin_data', 'type' => 'longtext', 'null' => 'no',), + array('field' => 'badge_data', 'type' => 'longtext', 'null' => 'no',), + array('field' => 'updated_at', 'type' => 'int', 'null' => 'no', 'default' => '0',), + ), + 'indexes' => array( + array('type' => 'PRIMARY', 'name' => 'KEY', 'body' => '(`id`)'), + array('type' => 'UNIQUE', 'name' => 'slug_source', 'body' => '(`slug`, `source`)'), + array('type' => 'KEY', 'name' => 'source_sort', 'body' => '(`source`, `sort_order`)'), + ), + ), ); } diff --git a/lib/CleantalkSP/SpbctWP/Deactivator.php b/lib/CleantalkSP/SpbctWP/Deactivator.php index fff746b4b..7bb6f9271 100644 --- a/lib/CleantalkSP/SpbctWP/Deactivator.php +++ b/lib/CleantalkSP/SpbctWP/Deactivator.php @@ -305,6 +305,8 @@ public static function deleteBlogTables() //ok $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'spbc_sessions'); // @psalm-suppress WpdbUnsafeMethodsIssue $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'spbc_surface_completed_dirs'); + // @psalm-suppress WpdbUnsafeMethodsIssue + $wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'spbc_psc_plugins_cache'); } /** diff --git a/lib/CleantalkSP/SpbctWP/FSWatcher/Scan/Scan.php b/lib/CleantalkSP/SpbctWP/FSWatcher/Scan/Scan.php index 1a35aa0c2..9a1fe12fc 100644 --- a/lib/CleantalkSP/SpbctWP/FSWatcher/Scan/Scan.php +++ b/lib/CleantalkSP/SpbctWP/FSWatcher/Scan/Scan.php @@ -27,8 +27,28 @@ public static function run(FSWatcherParams $params) protected static function scan() { + $directory = new \RecursiveDirectoryIterator( + self::$params->dir_to_watch, + \RecursiveDirectoryIterator::SKIP_DOTS + ); + $exclude_dirs = self::$params->exclude_dirs; + $filtered = new \RecursiveCallbackFilterIterator( + $directory, + static function ($current) use ($exclude_dirs) { + try { + if ($current->isDir() && in_array($current->getFilename(), $exclude_dirs, true)) { + return false; + } + } catch (\RuntimeException $e) { + // Path is outside open_basedir or otherwise inaccessible + return false; + } + + return true; + } + ); $iterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator(self::$params->dir_to_watch, \RecursiveDirectoryIterator::SKIP_DOTS), + $filtered, \RecursiveIteratorIterator::SELF_FIRST, \RecursiveIteratorIterator::CATCH_GET_CHILD ); diff --git a/lib/CleantalkSP/SpbctWP/FSWatcher/Storage/FileStorage.php b/lib/CleantalkSP/SpbctWP/FSWatcher/Storage/FileStorage.php index bb13ecd3d..62ef35de9 100644 --- a/lib/CleantalkSP/SpbctWP/FSWatcher/Storage/FileStorage.php +++ b/lib/CleantalkSP/SpbctWP/FSWatcher/Storage/FileStorage.php @@ -103,10 +103,11 @@ public static function writeJournal($iterator, $extensions_to_watch, $exclude_di $fp = fopen((string)$journal, 'w'); foreach ($iterator as $path => $dir) { - if ($dir->isDir() && !in_array($dir->getFilename(), $exclude_dirs)) { - $iterator->next(); - } else { - if (in_array($dir->getExtension(), $extensions_to_watch)) { + try { + if ($dir->isDir()) { + continue; + } + if (in_array($dir->getExtension(), $extensions_to_watch, true)) { $mtime = @filemtime((string)$path); if ( empty($mtime) ) { clearstatcache($path); @@ -121,6 +122,8 @@ public static function writeJournal($iterator, $extensions_to_watch, $exclude_di fputcsv($fp, [$path, $mtime], ",", '"', "\\"); } + } catch (\RuntimeException $e) { + continue; } } fclose($fp); diff --git a/lib/CleantalkSP/SpbctWP/Firewall.php b/lib/CleantalkSP/SpbctWP/Firewall.php index 17a68ff79..c0b60446d 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall.php +++ b/lib/CleantalkSP/SpbctWP/Firewall.php @@ -3,7 +3,6 @@ namespace CleantalkSP\SpbctWP; use CleantalkSP\Variables\Server; -use CleantalkSP\SpbctWP\Helpers\Helper; use CleantalkSP\Security\Firewall\Result; use CleantalkSP\SpbctWP\Firewall\FirewallState; @@ -56,79 +55,105 @@ public function updateLog(Result $fw_result) } unset($pattern); - $log_item = array( - - 'ip' => $fw_result->ip, - 'time' => time(), - 'status' => $fw_result->status, - 'pattern' => ! empty($fw_result->pattern) - ? json_encode($fw_result->pattern) - : '', - 'signature_id' => $fw_result->signature_id, - 'triggered_for' => ! empty($fw_result->triggered_for) - ? Helper::prepareParamForSQLQuery(substr($fw_result->triggered_for, 0, 100), '') - : '', - 'page_url' => substr( - addslashes( - (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') . Server::getString('HTTP_HOST') . Server::getString( - 'REQUEST_URI' - ) - ), - 0, - 4096 - ), - 'http_user_agent' => Server::getString('HTTP_USER_AGENT') - ? addslashes(htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300))) - : 'unknown', - 'request_method' => Server::getString('REQUEST_METHOD'), - 'x_forwarded_for' => addslashes(htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15))), - 'network' => $fw_result->network, - 'mask' => $fw_result->mask, - 'is_personal' => $fw_result->is_personal, - 'country_code' => $fw_result->country_code, + // Truncate before escaping — addslashes-then-substr left a dangling \ at the cut (SQLi). + $page_url = substr( + (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') + . Server::getString('HTTP_HOST') + . Server::getString('REQUEST_URI'), + 0, + 4096 ); + $http_user_agent = Server::getString('HTTP_USER_AGENT') + ? htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300)) + : 'unknown'; + $request_method = substr(Server::getString('REQUEST_METHOD'), 0, 5); + $x_forwarded_for = htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15)); + $pattern = ! empty($fw_result->pattern) ? json_encode($fw_result->pattern) : ''; + $triggered_for = ! empty($fw_result->triggered_for) ? substr($fw_result->triggered_for, 0, 100) : ''; + $signature_id = (int) $fw_result->signature_id; + $network = ($fw_result->network === '' || $fw_result->network === null) + ? '' + : (string) $fw_result->network; + $mask = ($fw_result->mask === '' || $fw_result->mask === null) + ? '' + : (string) $fw_result->mask; + $country_code = (string) $fw_result->country_code; + $is_personal = (int) $fw_result->is_personal; + $status = (string) $fw_result->status; + $ip = (string) $fw_result->ip; + $time = time(); - $signature_chunk = !empty($fw_result->signature_id) ? (string)$fw_result->signature_id : ''; - - $log_item['id'] = md5( - $fw_result->ip . $log_item['http_user_agent'] . $fw_result->status . $fw_result->waf_action . $signature_chunk + $signature_chunk = ! empty($fw_result->signature_id) ? (string) $fw_result->signature_id : ''; + $id = md5( + $fw_result->ip . $http_user_agent . $fw_result->status . $fw_result->waf_action . $signature_chunk ); $query = "INSERT INTO " . SPBC_TBL_FIREWALL_LOG . " SET - entry_id = '{$log_item['id']}', - ip_entry = '{$log_item['ip']}', - entry_timestamp = {$log_item['time']}, - status = '{$log_item['status']}', - pattern = IF('{$log_item['pattern']}' = '', NULL, '{$log_item['pattern']}'), - signature_id = IF({$log_item['signature_id']} = 0, NULL, {$log_item['signature_id']}), - triggered_for = IF('{$log_item['triggered_for']}' = '', NULL, '{$log_item['triggered_for']}'), + entry_id = %s, + ip_entry = %s, + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = 1, - page_url = '{$log_item['page_url']}', - http_user_agent = '{$log_item['http_user_agent']}', - request_method = '{$log_item['request_method']}', - x_forwarded_for = IF('{$log_item['x_forwarded_for']}' = '', NULL, '{$log_item['x_forwarded_for']}'), - network = IF('{$log_item['network']}' = '' OR '{$log_item['network']}' IS NULL, NULL, {$log_item['network']}), - mask = IF('{$log_item['mask']}' = '' OR '{$log_item['mask']}' IS NULL, NULL, {$log_item['mask']}), - country_code = IF('{$log_item['country_code']}' = '', NULL, '{$log_item['country_code']}'), - is_personal = {$log_item['is_personal']} + page_url = %s, + http_user_agent = %s, + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d ON DUPLICATE KEY UPDATE ip_entry = ip_entry, - entry_timestamp = {$log_item['time']}, - status = '{$log_item['status']}', - pattern = IF('{$log_item['pattern']}' = '', NULL, '{$log_item['pattern']}'), - signature_id = IF({$log_item['signature_id']} = 0, NULL, {$log_item['signature_id']}), - triggered_for = IF('{$log_item['triggered_for']}' = '', NULL, '{$log_item['triggered_for']}'), + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = requests + 1, - page_url = '{$log_item['page_url']}', + page_url = %s, http_user_agent = http_user_agent, - request_method = '{$log_item['request_method']}', - x_forwarded_for = IF('{$log_item['x_forwarded_for']}' = '', NULL, '{$log_item['x_forwarded_for']}'), - network = IF('{$log_item['network']}' = '' OR '{$log_item['network']}' IS NULL, NULL, {$log_item['network']}), - mask = IF('{$log_item['mask']}' = '' OR '{$log_item['mask']}' IS NULL, NULL, {$log_item['mask']}), - country_code = IF('{$log_item['country_code']}' = '', NULL, '{$log_item['country_code']}'), - is_personal = {$log_item['is_personal']}"; + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d"; - $this->db->execute($query); + $this->db->prepare( + $query, + array( + $id, + $ip, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $http_user_agent, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + ) + )->execute(); } /** diff --git a/lib/CleantalkSP/SpbctWP/Firewall/UploadCheckWPModules.php b/lib/CleantalkSP/SpbctWP/Firewall/UploadCheckWPModules.php index 536520d07..257559f71 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/UploadCheckWPModules.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/UploadCheckWPModules.php @@ -4,7 +4,6 @@ use CleantalkSP\Security\Firewall\Result; use CleantalkSP\SpbctWP\Helpers\Data; -use CleantalkSP\SpbctWP\Helpers\Helper; use CleantalkSP\SpbctWP\Helpers\IP; use CleantalkSP\SpbctWP\VulnerabilityAlarm\VulnerabilityAlarm; use CleantalkSP\Variables\Server; @@ -174,72 +173,114 @@ private static function logDenyUploadedModule(Result $upload_checker_result) } unset($pattern); - $pattern = ! empty($upload_checker_result->pattern) ? json_encode($upload_checker_result->pattern) : ''; - $triggered_for = ''; - if ( ! empty($upload_checker_result->triggered_for) ) { - $triggered_for = Helper::prepareParamForSQLQuery(substr($upload_checker_result->triggered_for, 0, 100), ''); - } + // Truncate before escaping — addslashes-then-substr left a dangling \ at the cut (SQLi). + $pattern = ! empty($upload_checker_result->pattern) + ? json_encode($upload_checker_result->pattern) + : ''; + $triggered_for = ! empty($upload_checker_result->triggered_for) + ? substr($upload_checker_result->triggered_for, 0, 100) + : ''; $page_url = substr( - addslashes( - (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') - . Server::getString('HTTP_HOST') - . Server::get('REQUEST_URI', null, 'url') - ), + (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') + . Server::getString('HTTP_HOST') + . Server::get('REQUEST_URI', null, 'url'), 0, 4096 ); $http_user_agent = Server::getString('HTTP_USER_AGENT') - ? addslashes(htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300))) + ? htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300)) : 'unknown'; - $ip = $upload_checker_result->ip; + $ip = (string) $upload_checker_result->ip; $time = time(); - $status = $upload_checker_result->status; - $request_method = Server::getString('REQUEST_METHOD'); - $x_forwarded_for = addslashes(htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15))); - $network = $upload_checker_result->network; - $mask = $upload_checker_result->mask; - $is_personal = $upload_checker_result->is_personal; - $country_code = $upload_checker_result->country_code; - $id = md5($upload_checker_result->ip . $http_user_agent . $upload_checker_result->status . $upload_checker_result->waf_action . $upload_checker_result->triggered_for); - $signature_id = $upload_checker_result->signature_id; + $status = (string) $upload_checker_result->status; + $request_method = substr(Server::getString('REQUEST_METHOD'), 0, 5); + $x_forwarded_for = htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15)); + $network = ($upload_checker_result->network === '' || $upload_checker_result->network === null) + ? '' + : (string) $upload_checker_result->network; + $mask = ($upload_checker_result->mask === '' || $upload_checker_result->mask === null) + ? '' + : (string) $upload_checker_result->mask; + $is_personal = (int) $upload_checker_result->is_personal; + $country_code = (string) $upload_checker_result->country_code; + $id = md5( + $upload_checker_result->ip + . $http_user_agent + . $upload_checker_result->status + . $upload_checker_result->waf_action + . $upload_checker_result->triggered_for + ); + $signature_id = (int) $upload_checker_result->signature_id; $query = "INSERT INTO " . SPBC_TBL_FIREWALL_LOG . " SET - entry_id = '$id', - ip_entry = '$ip', - entry_timestamp = $time, - status = '$status', - pattern = IF('$pattern' = '', NULL, '$pattern'), - signature_id = IF('$signature_id' = 0, NULL, '$signature_id'), - triggered_for = IF('$triggered_for' = '', NULL, '$triggered_for'), + entry_id = %s, + ip_entry = %s, + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = 1, - page_url = '$page_url', - http_user_agent = '$http_user_agent', - request_method = '$request_method', - x_forwarded_for = IF('$x_forwarded_for' = '', NULL, '$x_forwarded_for'), - network = IF('$network' = '' OR '$network' IS NULL, NULL, $network), - mask = IF('$mask' = '' OR '$mask' IS NULL, NULL, $mask), - country_code = IF('$country_code' = '', NULL, '$country_code'), - is_personal = $is_personal + page_url = %s, + http_user_agent = %s, + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d ON DUPLICATE KEY UPDATE ip_entry = ip_entry, - entry_timestamp = $time, - status = '$status', - pattern = IF('$pattern' = '', NULL, '$pattern'), - signature_id = IF('$signature_id' = 0, NULL, '$signature_id'), - triggered_for = IF('$triggered_for' = '', NULL, '$triggered_for'), + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = requests + 1, - page_url = '$page_url', + page_url = %s, http_user_agent = http_user_agent, - request_method = '$request_method', - x_forwarded_for = IF('$x_forwarded_for' = '', NULL, '$x_forwarded_for'), - network = IF('$network' = '' OR '$network' IS NULL, NULL, $network), - mask = IF('$mask' = '' OR '$mask' IS NULL, NULL, $mask), - country_code = IF('$country_code' = '', NULL, '$country_code'), - is_personal = $is_personal"; + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d"; - // @psalm-suppress WpdbUnsafeMethodsIssue - $wpdb->query($query); + $wpdb->query( + $wpdb->prepare( + $query, + array( + $id, + $ip, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $http_user_agent, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + ) + ) + ); } /** diff --git a/lib/CleantalkSP/SpbctWP/Firewall/WAF.php b/lib/CleantalkSP/SpbctWP/Firewall/WAF.php index 0d5932bcd..db38b6780 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/WAF.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/WAF.php @@ -295,73 +295,106 @@ public function log(Result $waf_result) } unset($pattern); + // Truncate before escaping — addslashes-then-substr left a dangling \ at the cut (SQLi). $pattern = ! empty($waf_result->pattern) ? json_encode($waf_result->pattern) : ''; $triggered_for = ! empty($waf_result->triggered_for) - ? Helper::prepareParamForSQLQuery(substr($waf_result->triggered_for, 0, 100), '') + ? substr($waf_result->triggered_for, 0, 100) : ''; $page_url = substr( - addslashes( - (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') - . Server::getString('HTTP_HOST') - . Server::get('REQUEST_URI', null, 'url') - ), + (Server::getString('HTTPS') !== 'off' ? 'https://' : 'http://') + . Server::getString('HTTP_HOST') + . Server::get('REQUEST_URI', null, 'url'), 0, 4096 ); $http_user_agent = Server::getString('HTTP_USER_AGENT') - ? addslashes(htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300))) + ? htmlspecialchars(substr(Server::getString('HTTP_USER_AGENT'), 0, 300)) : 'unknown'; - $ip = $waf_result->ip; + $ip = (string) $waf_result->ip; $time = time(); - $status = $waf_result->status; - $request_method = Server::getString('REQUEST_METHOD'); - $x_forwarded_for = addslashes(htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15))); - $network = $waf_result->network; - $mask = $waf_result->mask; - $is_personal = $waf_result->is_personal; - $country_code = $waf_result->country_code; + $status = (string) $waf_result->status; + $request_method = substr(Server::getString('REQUEST_METHOD'), 0, 5); + $x_forwarded_for = htmlspecialchars(substr(Server::getString('HTTP_X_FORWARDED_FOR'), 0, 15)); + $network = ($waf_result->network === '' || $waf_result->network === null) + ? '' + : (string) $waf_result->network; + $mask = ($waf_result->mask === '' || $waf_result->mask === null) + ? '' + : (string) $waf_result->mask; + $is_personal = (int) $waf_result->is_personal; + $country_code = (string) $waf_result->country_code; $id = md5($waf_result->ip . $http_user_agent . $waf_result->status . $waf_result->waf_action); - $signature_id = $waf_result->signature_id; - + $signature_id = (int) $waf_result->signature_id; $query = "INSERT INTO " . SPBC_TBL_FIREWALL_LOG . " SET - entry_id = '$id', - ip_entry = '$ip', - entry_timestamp = $time, - status = '$status', - pattern = IF('$pattern' = '', NULL, '$pattern'), - signature_id = IF('$signature_id' = 0, NULL, '$signature_id'), - triggered_for = IF('$triggered_for' = '', NULL, '$triggered_for'), + entry_id = %s, + ip_entry = %s, + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = 1, - page_url = '$page_url', - http_user_agent = '$http_user_agent', - request_method = '$request_method', - x_forwarded_for = IF('$x_forwarded_for' = '', NULL, '$x_forwarded_for'), - network = IF('$network' = '' OR '$network' IS NULL, NULL, $network), - mask = IF('$mask' = '' OR '$mask' IS NULL, NULL, $mask), - country_code = IF('$country_code' = '', NULL, '$country_code'), - is_personal = $is_personal + page_url = %s, + http_user_agent = %s, + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d ON DUPLICATE KEY UPDATE ip_entry = ip_entry, - entry_timestamp = $time, - status = '$status', - pattern = IF('$pattern' = '', NULL, '$pattern'), - signature_id = IF('$signature_id' = 0, NULL, '$signature_id'), - triggered_for = IF('$triggered_for' = '', NULL, '$triggered_for'), + entry_timestamp = %d, + status = %s, + pattern = NULLIF(%s, ''), + signature_id = NULLIF(%d, 0), + triggered_for = NULLIF(%s, ''), requests = requests + 1, - page_url = '$page_url', + page_url = %s, http_user_agent = http_user_agent, - request_method = '$request_method', - x_forwarded_for = IF('$x_forwarded_for' = '', NULL, '$x_forwarded_for'), - network = IF('$network' = '' OR '$network' IS NULL, NULL, $network), - mask = IF('$mask' = '' OR '$mask' IS NULL, NULL, $mask), - country_code = IF('$country_code' = '', NULL, '$country_code'), - is_personal = $is_personal"; - - $this->db->execute($query); + request_method = %s, + x_forwarded_for = NULLIF(%s, ''), + network = NULLIF(%s, ''), + mask = NULLIF(%s, ''), + country_code = NULLIF(%s, ''), + is_personal = %d"; + + $this->db->prepare( + $query, + array( + $id, + $ip, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $http_user_agent, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + $time, + $status, + $pattern, + $signature_id, + $triggered_for, + $page_url, + $request_method, + $x_forwarded_for, + $network, + $mask, + $country_code, + $is_personal, + ) + )->execute(); } /** @@ -376,6 +409,11 @@ private static function hasSignature($data, $signature) $result_signature_body = false; $result_additionally_params = false; + // Skip catch-all regex without headers/URL (e.g. #.*# with empty waf_headers) — mass FP + if ( self::isUnsafeCatchAllSignature($signature_body, $what_to_check_additionally) ) { + return false; + } + $is_regexp = Helper::isRegexp($signature_body); if ( $is_regexp && preg_match($signature_body, $data) ) { @@ -423,6 +461,33 @@ private static function hasSignature($data, $signature) return false; } + /** + * Detect catch-all regex WAF rules that have no headers/URL constraints. + * Such rules (e.g. body "#.*#" with empty waf_headers) match every request + * and cause mass false positives. + * + * @param string $signature_body + * @param string $what_to_check_additionally + * + * @return bool + */ + private static function isUnsafeCatchAllSignature($signature_body, $what_to_check_additionally) + { + if ( $what_to_check_additionally !== 'nothing' ) { + return false; + } + + if ( ! is_string($signature_body) || ! Helper::isRegexp($signature_body) ) { + return false; + } + + // Matches empty string and an arbitrary probe → pattern accepts any input + $probe = 'spbct_waf_probe_catchall_check'; + + return @preg_match($signature_body, '') === 1 + && @preg_match($signature_body, $probe) === 1; + } + /** * Compare signature headers and request headers * diff --git a/lib/CleantalkSP/SpbctWP/HTTP/Request.php b/lib/CleantalkSP/SpbctWP/HTTP/Request.php index 56d442e38..e1dae515f 100644 --- a/lib/CleantalkSP/SpbctWP/HTTP/Request.php +++ b/lib/CleantalkSP/SpbctWP/HTTP/Request.php @@ -160,6 +160,28 @@ protected function appendOptionsObligatory() if ( $spbc->settings['wp__use_builtin_http_api'] ) { $this->options['useragent'] = self::AGENT; + $this->options['verifyname'] = true; + $this->ensureSslCertificatePath(); + } + } + + /** + * Point Requests library to WordPress CA bundle instead of missing default cacert.pem. + */ + private function ensureSslCertificatePath() + { + $ca = defined('CLEANTALK_CASERT_PATH') ? CLEANTALK_CASERT_PATH : ''; + if ( ! $ca || ! @is_readable($ca) ) { + return; + } + + $this->options['verify'] = $ca; + + if ( class_exists('\WpOrg\Requests\Requests') ) { + /** @psalm-suppress UndefinedClass */ + \WpOrg\Requests\Requests::set_certificate_path($ca); + } elseif ( class_exists('\Requests') ) { + \Requests::set_certificate_path($ca); } } diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Helper.php b/lib/CleantalkSP/SpbctWP/Scanner/Helper.php index 00080157d..b45b8cbcb 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/Helper.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/Helper.php @@ -322,6 +322,73 @@ public static function getRowActionsNeedsNoConfirm() return is_string($actions) ? $actions : '{[]}'; } + /** + * Whether the given path is the site-root WordPress wp-config.php (critical, no auto-cure). + * Does not match files named wp-config.php in subdirectories (e.g. uploads). + * + * @param string $path Absolute or relative file path (as stored in scan table or filesystem) + * @return bool + */ + public static function isWpConfigPath($path) + { + $normalized = str_replace('\\', '/', (string) $path); + + if (defined('ABSPATH')) { + $abspath = rtrim(str_replace('\\', '/', ABSPATH), '/'); + if ($abspath !== '' && stripos($normalized, $abspath . '/') === 0) { + $normalized = substr($normalized, strlen($abspath)); + } + } + + return ltrim($normalized, '/') === 'wp-config.php'; + } + + /** + * Message shown when wp-config.php infection is detected (manual cleanup only). + * + * @return string + */ + public static function getWpConfigManualCleanupMessage() + { + return __( + 'Infection detected in wp-config.php. Automatic cure is disabled for this critical file — manual cleanup is required. Please contact support or order a malware removal.', + 'security-malware-firewall' + ); + } + + /** + * Whether the current user may view wp-config.php contents in the scanner UI. + * Restricted to Super Admins to reduce credential exposure. + * + * @return bool + */ + public static function canViewWpConfigContents() + { + return function_exists('is_super_admin') && is_super_admin(); + } + + /** + * @return string + */ + public static function getWpConfigViewRestrictedMessage() + { + return __( + 'Only a Super Admin can view wp-config.php contents (credentials protection).', + 'security-malware-firewall' + ); + } + + /** + * @return string + */ + public static function getWpConfigSendRestrictedMessage() + { + return __( + 'wp-config.php cannot be sent for analysis because it contains sensitive credentials.', + 'security-malware-firewall' + ); + } + /** * query * Get SQL *WHERE* suffix for SELECT query depends on files category. @@ -367,7 +434,7 @@ public static function getSQLWhereAddictionForTableOfCategory($category) case 'unknown': $res = ' WHERE status NOT IN ("APPROVED_BY_USER","APPROVED_BY_CT","APPROVED_BY_CLOUD","DENIED_BY_CT","ERROR") AND detected_at >= ' . (time() - $spbc->settings['scanner__list_unknown__older_than'] * 86400) . ' AND - source IS NULL AND + (source IS NULL OR source = \'\') AND source_type IS NULL AND size > 0 AND path NOT LIKE "%wp-content%themes%" AND diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php b/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php index 7e3428926..de85655e4 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScanRepository.php @@ -35,6 +35,20 @@ public static function getPendingQueueFiles() ); } + /** + * Get fast hashes of the files known to the cloud analysis + * @return array + */ + public static function getCloudAnalysisFilesFastHashes() + { + global $wpdb; + + return (array) $wpdb->get_col( + 'SELECT DISTINCT fast_hash FROM ' . SPBC_TBL_SCAN_FILES + . ' WHERE pscan_file_id IS NOT NULL AND fast_hash IS NOT NULL AND fast_hash <> ""' + ); + } + /** * Get file info by fast_hash * @return array|null diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/FileSystemActions.php b/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/FileSystemActions.php index f0d107ea7..c09fc5603 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/FileSystemActions.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/FileSystemActions.php @@ -37,6 +37,10 @@ public static function deleteFile($file_id) return array('error' => 'FILE_NOT_FOUND'); } + if (Helper::isWpConfigPath($file_info['path'])) { + return array('error' => Helper::getWpConfigManualCleanupMessage()); + } + if ($file_info['status'] == 'QUARANTINED') { return array('error' => 'USE_QUARANTINE_DELETE'); } @@ -254,6 +258,10 @@ public static function replaceFileWithOriginal($file_id) return array('error' => 'FILE_NOT_FOUND'); } + if (Helper::isWpConfigPath($file_info['path'])) { + return array('error' => Helper::getWpConfigManualCleanupMessage()); + } + if (!file_exists($root_path . $file_info['path'])) { return array('error' => 'FILE_NOT_EXISTS'); } @@ -335,6 +343,10 @@ public static function viewFile($file_id) return array('error' => 'FILE_NOT_FOUND'); } + if (Helper::isWpConfigPath($file_info['path']) && ! Helper::canViewWpConfigContents()) { + return array('error' => Helper::getWpConfigViewRestrictedMessage()); + } + $file_path = $file_info['status'] == 'QUARANTINED' ? $file_info['q_path'] : $root_path . $file_info['path']; if (!file_exists($file_path)) { diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/QuarantineActions.php b/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/QuarantineActions.php index de6a345e3..7503c8037 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/QuarantineActions.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScannerActions/QuarantineActions.php @@ -3,6 +3,7 @@ namespace CleantalkSP\SpbctWP\Scanner\ScannerActions; use CleantalkSP\SpbctWP\Helpers\HTTP; +use CleantalkSP\SpbctWP\Scanner\Helper; class QuarantineActions { @@ -184,6 +185,10 @@ public static function doQuarantineFile($file_id) return array('error' => 'FILE_NOT_FOUND'); } + if (Helper::isWpConfigPath($file_info['path'])) { + return array('error' => Helper::getWpConfigManualCleanupMessage()); + } + if (!file_exists($root_path . $file_info['path'])) { return array('error' => 'FILE_NOT_EXISTS'); } diff --git a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php index 0303883f3..1108188b9 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/ScannerQueue.php @@ -2,6 +2,8 @@ namespace CleantalkSP\SpbctWP\Scanner; +use CleantalkSP\SpbctWP\AdminBannersModule\AdminBanners\AdminBannerCriticalFilesWarning; +use CleantalkSP\SpbctWP\AdminBannersModule\AdminBannersHandler; use CleantalkSP\SpbctWP\API; use CleantalkSP\SpbctWP\Cron; use CleantalkSP\SpbctWP\DB; @@ -965,7 +967,7 @@ public function file_system_analysis($offset = null, $amount = null, $path_to_sc 'amount' => $amount, 'extensions' => 'php, html, htm, js, php2, php3, php4, php5, php6, php7, phtml, shtml, phar, odf, [ot.]', 'extensions_exceptions' => '', //array('jpg', 'jpeg', 'png', 'gif', 'css', 'txt', 'zip', 'xml', 'json') - 'file_exceptions' => array('wp-config.php'), + 'file_exceptions' => array(), 'files_mandatory' => array(), 'dir_exceptions' => array(SPBC_PLUGIN_DIR . 'quarantine'), // important! @@ -1049,13 +1051,25 @@ public function file_system_analysis($offset = null, $amount = null, $path_to_sc $file['checked_heuristic'] = 0; } - // if extension is not set, set 'source' to 'binary' - $file['source'] = ! $ext ? 'BINARY' : ''; + // No extension → BINARY. With extension → NULL (preferred; Unknown also accepts legacy ''). + $source_sql = $ext === '' ? "'BINARY'" : 'NULL'; + + $sql_row = '(\'' + . $file['path'] . '\',\'' + . $file['size'] . '\',\'' + . $file['perms'] . '\',\'' + . $file['mtime'] . '\',\'' + . $file['fast_hash'] . '\',\'' + . $file['full_hash'] . '\',\'' + . $file['detected_at'] . '\',\'' + . $file['checked_heuristic'] . '\',' + . $source_sql + . ')'; if ( ! spbc_check_ascii($file['path']) ) { - $sql_query__values_non_ascii[] = '(\'' . implode('\',\'', $file) . '\')'; + $sql_query__values_non_ascii[] = $sql_row; } else { - $sql_query__values[] = '(\'' . implode('\',\'', $file) . '\')'; + $sql_query__values[] = $sql_row; } } @@ -1063,7 +1077,7 @@ public function file_system_analysis($offset = null, $amount = null, $path_to_sc size = VALUES(`size`), perms = VALUES(`perms`), - source = source, + source = IF(source IS NULL OR source = '', VALUES(`source`), source), source_type = source_type, version = version, @@ -1674,6 +1688,13 @@ public function signature_analysis($status = 'UNKNOWN,MODIFIED,OK,INFECTED,ERROR $severity = ! empty($file['severity']) ? $file['severity'] : $result->severity; $statuses->addStatus($status); + // Reset Critical Count banner if critical found again + if ( $severity === 'CRITICAL' ) { + $banners_handler = new AdminBannersHandler($spbc); + $critical_files_banner_obj = new AdminBannerCriticalFilesWarning($banners_handler); + update_option($critical_files_banner_obj->prefix . $critical_files_banner_obj::NAME . '_' . $banners_handler->getUserId(), ''); + } + if ( $weak_spots !== 'NULL' ) { if ($result->status === 'INFECTED') { $critical_files_found += 1; diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Services/SendFileToCloudService.php b/lib/CleantalkSP/SpbctWP/Scanner/Services/SendFileToCloudService.php index e738e1407..5438d14bd 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/Services/SendFileToCloudService.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/Services/SendFileToCloudService.php @@ -4,6 +4,7 @@ use CleantalkSP\SpbctWP\API as SpbcAPI; use CleantalkSP\SpbctWP\DTO\MScanFilesDTO; +use CleantalkSP\SpbctWP\Scanner\Helper; use CleantalkSP\SpbctWP\Scanner\ScannerActions\ScanActions; use CleantalkSP\SpbctWP\Scanner\ScannerActions\ScanResultsTableActions; use CleantalkSP\SpbctWP\Scanner\ScanRepository; @@ -31,6 +32,11 @@ public static function sendFile($file_id, $do_rescan = true) return array('error' => 'FILE_NOT_FOUND'); } + // Never send wp-config.php — contains DB credentials and salts + if (isset($file_info['path']) && Helper::isWpConfigPath($file_info['path'])) { + return array('error' => Helper::getWpConfigSendRestrictedMessage()); + } + // Binary files cannot be sent for analysis if (isset($file_info['source']) && $file_info['source'] === 'BINARY') { return array('error' => __('Binary files cannot be sent for analysis.', 'security-malware-firewall')); diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Stages/CureStage.php b/lib/CleantalkSP/SpbctWP/Scanner/Stages/CureStage.php index 3184efa65..c904ee13b 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/Stages/CureStage.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/Stages/CureStage.php @@ -9,6 +9,7 @@ use CleantalkSP\SpbctWP\Scanner\CureLog\CureLog; use CleantalkSP\SpbctWP\Scanner\CureLog\CureLogRecord; use CleantalkSP\SpbctWP\Scanner\FileInfoExtended; +use CleantalkSP\SpbctWP\Scanner\Helper; use CleantalkSP\SpbctWP\Scanner\ScannerActions\BackupsActions; use CleantalkSP\SpbctWP\Scanner\ScanningLog\ScanningLogFacade; use CleantalkSP\SpbctWP\Scanner\ScanningStagesModule\ScanningStagesStorage; @@ -106,9 +107,10 @@ public function getFilesToCure($limit = null) { // get files with signatures (excluding binary files) $files_with_signatures = ' - SELECT fast_hash, full_hash, mtime + SELECT fast_hash, full_hash, mtime, path FROM ' . SPBC_TBL_SCAN_FILES . ' - WHERE weak_spots LIKE "%SIGNATURES%" AND (source IS NULL OR source != \'BINARY\') + WHERE weak_spots LIKE "%SIGNATURES%" + AND (source IS NULL OR source != \'BINARY\') '; $files_with_signatures = $this->db->fetchAll($files_with_signatures, OBJECT_K); @@ -118,6 +120,10 @@ public function getFilesToCure($limit = null) $to_cure_fast_hashes = array(); foreach ($files_with_signatures as $key => $value) { + // Root wp-config.php: detect only, never auto-cure + if (isset($value->path) && Helper::isWpConfigPath($value->path)) { + continue; + } if (isset($cure_log_data[$key])) { //fast hash found, do check for last cure date and hash $found_by_fast_hash = $cure_log_data[$key]; // skip restored files @@ -232,6 +238,12 @@ public function processCure($file) */ private function preCheckFile($file, $cure_log_record) { + if ( isset($file['path']) && Helper::isWpConfigPath($file['path']) ) { + $cure_log_record->cure_status = 0; + $cure_log_record->fail_reason = Helper::getWpConfigManualCleanupMessage(); + return $cure_log_record; + } + BackupsActions::createBackupsForFilesWithSignatures(); //check if file has backup diff --git a/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php b/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php index f52d2b6d2..38a4b078a 100644 --- a/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php +++ b/lib/CleantalkSP/SpbctWP/Scanner/Stages/Repositories/UnknownRepository.php @@ -36,7 +36,7 @@ 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 AND' + . ' WHERE (source IS NULL OR source = \'\') AND' . ' status <> "APPROVED_BY_USER" AND' . ' status <> "APPROVED_BY_CT" AND' . ' status <> "APPROVED_BY_CLOUD" AND' diff --git a/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php b/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php index c5e64b3e4..046c577b4 100644 --- a/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php +++ b/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php @@ -67,11 +67,11 @@ private static function groupSettings($settings) { global $spbc; + $key_to_group = self::buildKeyToGroupMap(); $grouped_settings = []; + foreach ($settings as $key => $value) { - if ( - $key === 'spbc_key' - ) { + if ($key === 'spbc_key') { if ( ! ( is_main_site() || @@ -82,100 +82,51 @@ private static function groupSettings($settings) $value = 'Provided by admin'; } $grouped_settings['apikey'][$key] = $value; - } - if ( - $key === 'bfp__heading' || - $key === 'bfp__delay__1_fails' || - $key === 'bfp__delay__5_fails' || - $key === 'bfp__allowed_wrong_auths' || - $key === 'bfp__count_interval' || - $key === 'bfp__block_period__5_fails' || - $key === 'check_pass__enable' || - $key === 'check_pass__roles' || - $key === '2fa__enable' || - $key === '2fa__roles' || - $key === 'edit_tech_support_url__enabled' || - $key === 'edit_tech_support_url__link' || - $key === 'edit_tech_support_url__remove' || - $key === 'login_page_rename__enabled' || - $key === 'login_page_rename__name' || - $key === 'login_page_rename__redirect' || - $key === 'login_page_rename__send_email_notification' - ) { - $grouped_settings['auth_and_logging_in'][$key] = $value; - } - - if ( is_multisite() && is_main_site() && - ( $key === 'ms__work_mode' || - $key === 'ms__hoster_api_key' || - $key === 'ms__service_utilization' ) // <----- @ToDo Remove? - ) { - $grouped_settings['apikey'][$key] = $value; + continue; } if ( - $key === 'fw__custom_message' || - $key === 'secfw__enabled' || - // WAF - $key === 'waf__enabled' || - $key === 'waf__xss_check' || - $key === 'waf__sql_check' || - $key === 'waf__exploit_check' || - $key === 'waf_blocker__enabled' || - // Upload checker - $key === 'upload_checker__file_check' || - $key === 'upload_checker__do_check_wordpress_modules' || - // Traffic control - $key === 'traffic_control__enabled' || - $key === 'traffic_control__autoblock_timeframe' || - $key === 'traffic_control__autoblock_amount' || - $key === 'traffic_control__autoblock_period' || - $key === 'traffic_control__exclude_authorised_users' || - $key === 'secfw__get_ip' || - $key === 'secfw__get_ip__enable_cdn_auto_self_check' + is_multisite() && is_main_site() && + in_array($key, ['ms__work_mode', 'ms__hoster_api_key', 'ms__service_utilization'], true) ) { - $grouped_settings['firewall'][$key] = $value; + $grouped_settings['apikey'][$key] = $value; + continue; } - if ( - $key === 'scanner__auto_start' || - $key === 'scanner__auto_start__set_period' || - $key === 'scanner__auto_start_manual' || - $key === 'scanner__auto_start_manual_time' || - $key === 'scanner__auto_start_manual_tz' || - $key === 'scanner__outbound_links' || - $key === 'scanner__outbound_links_mirrors' || - $key === 'scanner__important_files_listing' || - $key === 'scanner__heuristic_analysis' || - $key === 'scanner__schedule_send_heuristic_suspicious_files' || - $key === 'scanner__signature_analysis' || - $key === 'scanner__binary_analysis' || - $key === 'scanner__os_cron_analysis' || - $key === 'scanner__db_trigger_analysis' || - $key === 'scanner__path_exclusions_view' || - $key === 'scanner__frontend_analysis' || - $key === 'scanner__frontend_analysis__csrf' || - $key === 'scanner__frontend_analysis__domains_exclusions_view' || - $key === 'scanner__list_unknown' || - $key === 'scanner__list_unknown__older_than' || - $key === 'scanner__list_approved_by_cleantalk' || - $key === 'scanner__fs_watcher' || - $key === 'scanner__fs_watcher__snapshots_period' - ) { - $grouped_settings['scanner_settings'][$key] = $value; + if (isset($key_to_group[$key])) { + $grouped_settings[$key_to_group[$key]][$key] = $value; } } - $ordered_settings = self::orderGroupElements($grouped_settings); + return self::orderGroupElements($grouped_settings); + } - return $ordered_settings; + /** + * Builds a reverse map: setting_key => group_name from the ordering ruleset. + * + * @return array + */ + private static function buildKeyToGroupMap() + { + $map = []; + foreach (self::getOrderingRuleset() as $group_name => $keys) { + foreach ($keys as $key) { + $map[$key] = $group_name; + } + } + return $map; } - private static function orderGroupElements($grouped_settings) + /** + * Single source of truth for settings groups ordering. + * + * @return array + */ + private static function getOrderingRuleset() { - $ordering_ruleset = [ + return [ 'auth_and_logging_in' => [ - 'bfp__heading', + 'bfp__enabled', 'bfp__delay__1_fails', 'bfp__delay__5_fails', 'bfp__allowed_wrong_auths', @@ -228,6 +179,7 @@ private static function orderGroupElements($grouped_settings) 'scanner__os_cron_analysis', 'scanner__db_trigger_analysis', 'scanner__path_exclusions_view', + 'scanner__auto_cure', 'scanner__frontend_analysis', 'scanner__frontend_analysis__csrf', 'scanner__frontend_analysis__domains_exclusions_view', @@ -236,8 +188,49 @@ private static function orderGroupElements($grouped_settings) 'scanner__list_approved_by_cleantalk', 'scanner__fs_watcher', 'scanner__fs_watcher__snapshots_period', - ] + ], + 'vulnerability_check' => [ + 'vulnerability_check__test_before_install', + 'vulnerability_check__enable_cron', + 'vulnerability_check__warn_on_modules_pages', + 'vulnerability_check__show_reports', + ], + 'admin_bar' => [ + 'admin_bar__show', + 'admin_bar__admins_online_counter', + 'admin_bar__brute_force_counter', + 'admin_bar__firewall_counter', + 'wp__dashboard_widget__show', + ], + 'misc' => [ + 'misc__backend_logs_enable', + 'misc__prevent_logins_collecting', + 'misc__prevent_logins_collecting_on_password_reset', + 'misc__show_link_in_login_form', + 'wp__disable_xmlrpc', + 'wp__disable_rest_api', + 'data__set_cookies', + 'misc__forbid_to_show_in_iframes', + 'data__additional_headers', + 'wp__upload_dir_prevent_php_execution', + 'wp__use_builtin_http_api', + 'misc_disable_file_editor', + 'misc__complete_deactivation', + 'action_adjust', + 'monitoring__users', + ], + 'spbc_trusted_and_affiliate' => [ + 'spbc_trusted_and_affiliate__shortcode', + 'spbc_trusted_and_affiliate__shortcode_tag', + 'spbc_trusted_and_affiliate__footer', + 'spbc_trusted_and_affiliate__add_id', + ], ]; + } + + private static function orderGroupElements($grouped_settings) + { + $ordering_ruleset = self::getOrderingRuleset(); foreach ($ordering_ruleset as $group_name => $ruleset) { // UI-only field (not a saved option); rendered by React ActionShuffleSalts @@ -252,7 +245,18 @@ private static function orderGroupElements($grouped_settings) } $grouped_settings[$group_name] = $ordered; } - return $grouped_settings; + + // Rebuild in $ordering_ruleset key order (PHP arrays keep insertion order) + $result = []; + if (isset($grouped_settings['apikey'])) { + $result['apikey'] = $grouped_settings['apikey']; + } + foreach (array_keys($ordering_ruleset) as $group_name) { + if (isset($grouped_settings[$group_name])) { + $result[$group_name] = $grouped_settings[$group_name]; + } + } + return $result; } /** diff --git a/lib/CleantalkSP/SpbctWP/State.php b/lib/CleantalkSP/SpbctWP/State.php index 3c27e7cc8..3176d62ee 100644 --- a/lib/CleantalkSP/SpbctWP/State.php +++ b/lib/CleantalkSP/SpbctWP/State.php @@ -43,6 +43,7 @@ class State extends \CleantalkSP\Common\State '2fa__roles' => array('administrator'), 'check_pass__enable' => 0, 'check_pass__roles' => array(), //default is empty, will be generated due settings draw + 'bfp__enabled' => 1, 'bfp__allowed_wrong_auths' => 5, 'bfp__delay__1_fails' => 3, // Delay to sleep after 1 wrong auth 'bfp__delay__5_fails' => 10, // Delay to sleep after 5 wrong auths diff --git a/lib/CleantalkSP/SpbctWP/Sync.php b/lib/CleantalkSP/SpbctWP/Sync.php index 5bfb2268b..4c722b095 100644 --- a/lib/CleantalkSP/SpbctWP/Sync.php +++ b/lib/CleantalkSP/SpbctWP/Sync.php @@ -3,7 +3,10 @@ namespace CleantalkSP\SpbctWP; use CleantalkSP\SpbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentHandler; +use CleantalkSP\SpbctWP\Scanner\ScannerAjaxEndpoints; +use CleantalkSP\SpbctWP\Scanner\ScanRepository; use CleantalkSP\SpbctWP\Settings\FilesScanPathExclusion; +use CleantalkSP\SpbctWP\VulnerabilityAlarm\PscCertifiedPluginsCache; class Sync { @@ -17,6 +20,8 @@ class Sync 'settings_exclusions' => 'Handling exclusions...', 'adjust_env' => 'Adjusting environment...', 'vulnerability_check' => 'Running vulnerability check...', + 'analysis_log_update' => 'Updating cloud analysis verdicts...', + 'psc_cache_warm' => 'Preparing Security Certified cache...', 'finalize' => 'Sync end...', ); @@ -101,6 +106,8 @@ public static function run() self::stepSettingsExclusions(); self::stepAdjustEnv(); self::stepVulnerabilityCheck(); + self::stepAnalysisLogUpdate($account_is_ok); + self::stepPscCacheWarm(); $out = array( 'success' => true, @@ -179,6 +186,12 @@ public static function runCurrentStep() case 'vulnerability_check': self::stepVulnerabilityCheck(); break; + case 'analysis_log_update': + self::stepAnalysisLogUpdate($account_is_ok); + break; + case 'psc_cache_warm': + self::stepPscCacheWarm(); + break; case 'finalize': self::stepFinalize(); @@ -392,6 +405,45 @@ private static function stepVulnerabilityCheck() Cron::updateTask('check_vulnerabilities', 'spbc_security_check_vulnerabilities', 86400, time()); } + /** + * Pull actual cloud verdicts for the scan results files. + * The cloud verdict may be changed after the file processing is done, + * so the files with the final verdict have to be re-checked too. + * + * @param bool $account_is_ok + */ + private static function stepAnalysisLogUpdate($account_is_ok) + { + global $spbc; + + if ( ! $account_is_ok || ! is_main_site() ) { + return; + } + + $file_ids = ScanRepository::getCloudAnalysisFilesFastHashes(); + + if ( empty($file_ids) ) { + return; + } + + $result = ScannerAjaxEndpoints::checkFilesAnalysisStatus(true, $file_ids); + + if ( ! empty($result['error']) ) { + $spbc->error_add('analysis_log_update', $result); + } else { + $spbc->error_delete('analysis_log_update'); + } + } + + private static function stepPscCacheWarm() + { + try { + PscCertifiedPluginsCache::warm(); + } catch ( \Exception $exception ) { + spbc_log('Couldn\'t warm the PSC certified plugins cache. ' . $exception->getMessage()); + } + } + private static function stepFinalize() { global $spbc; diff --git a/lib/CleantalkSP/SpbctWP/Views/Settings.php b/lib/CleantalkSP/SpbctWP/Views/Settings.php index 39c69cdae..7b75c48fe 100644 --- a/lib/CleantalkSP/SpbctWP/Views/Settings.php +++ b/lib/CleantalkSP/SpbctWP/Views/Settings.php @@ -72,6 +72,22 @@ public static function page() 'spbcErrors' => spbc_settings__error__output(), 'adminEmail' => spbc_get_admin_email(), 'accountNameOb' => $spbc->data["account_name_ob"], + + // settings + 'backendLogsEnabled' => $spbc->data['extra_package']['backend_logs'], + 'wlModeEnabled' => $spbc->data["wl_mode_enabled"], + 'wlCompanyName' => $spbc->data["wl_company_name"], + 'backendLogsLink' => self::getBackendLogsLink(), + 'myBillingLink' => self::getMyBillingLink(), + 'wpUploadDirPreventPhpExecutionDesc' => \CleantalkSP\SpbctWP\UploadDirPreventPhpExecutionModule\UploadDirPreventPhpExecution::getDescription( + isset($spbc->data['upload_dir_prevent_php_execution_status']) ? $spbc->data['upload_dir_prevent_php_execution_status'] : null + ), + 'spbctPluginDir' => SPBC_PLUGIN_DIR, + 'directorySeparator' => DIRECTORY_SEPARATOR, + 'trustedAndAffiliateAddIdLink' => LinkConstructor::buildSimpleLink( + 'https://cleantalk.org', + 'my/partners' + ), ]; $display_debug = in_array(Server::getDomain(), array( @@ -177,6 +193,38 @@ private static function goToCleantalkLink() return $link; } + private static function getBackendLogsLink() + { + global $spbc; + + $link = ''; + + if ($spbc->key_is_ok && $spbc->user_token) { + $link = LinkConstructor::buildSimpleLink( + 'https://cleantalk.org/', + 'my/backend_logs?user_token=' . $spbc->user_token + ); + } + + return $link; + } + + private static function getMyBillingLink() + { + global $spbc; + + $link = ''; + + if ($spbc->key_is_ok) { + $link = LinkConstructor::buildSimpleLink( + 'https://cleantalk.org/', + 'my/bill/security?package=1' + ); + } + + return $link; + } + private static function support2Link() { global $spbc; diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsApi.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsApi.php index 2b565109e..3525b748d 100644 --- a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsApi.php +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsApi.php @@ -26,6 +26,7 @@ public static function fetchPage($page = 1, $limit = null, $list_params = null) $body = wp_json_encode([ 'psc_like' => 'PSC', + 'app_status' => 'safe_psc', 'list_params' => $list_params, 'limit' => (int) $limit, 'page' => $page, @@ -87,4 +88,14 @@ public static function fetchPage($page = 1, $limit = null, $list_params = null) 'total' => $total, ]; } + + /** + * Fetch all PSC catalog items in a single request. + * + * @return array{items: array>, total: int}|WP_Error + */ + public static function fetchAll() + { + return self::fetchPage(1, 500, self::CATALOG_LIST_PARAMS); + } } diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php new file mode 100644 index 000000000..31802b741 --- /dev/null +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCache.php @@ -0,0 +1,588 @@ + $slug, + 'source' => PscCertifiedPluginsCacheRepository::SOURCE_CATALOG, + 'sort_order' => $sort_order++, + 'plugin_data' => $plugin_data, + 'badge_data' => self::encodeBadge($all_badges[$slug]), + ]; + } + } + + PscCertifiedPluginsCacheRepository::replaceAll(array_merge($installed_rows, $catalog_rows)); + + global $spbc; + + $spbc->data['psc_catalog_total'] = $catalog_total ?: count($catalog_rows); + $spbc->data['psc_catalog_exhausted'] = true; + $spbc->data['psc_cache_updated_at'] = time(); + $spbc->save('data'); + } + + /** + * Read rows from the cache table starting at $db_offset, enrich and filter + * by PSC version until we collect $per_page valid items or exhaust the table. + * + * @param int $db_offset Row offset in the cache table. + * @param int $per_page + * @return array{plugins: array>, badges: array>, db_offset: int} + */ + public static function getPageWithEnrichment($db_offset, $per_page) + { + $db_offset = max(0, (int) $db_offset); + $batch_size = $per_page * 2; + + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + $plugins = []; + $badges = []; + $total_rows = PscCertifiedPluginsCacheRepository::countRows(); + + while (count($plugins) < $per_page && $db_offset < $total_rows) { + $rows = PscCertifiedPluginsCacheRepository::getRows(null, $db_offset, $batch_size); + + if (empty($rows)) { + break; + } + + // Advance offset per processed row so an early break doesn't skip unvisited rows. + foreach ($rows as $row) { + $db_offset++; + + $slug = sanitize_title((string) ($row['slug'] ?? '')); + $badge = self::decodeBadge((string) ($row['badge_data'] ?? '')); + + if (empty($slug) || empty($badge)) { + continue; + } + + $plugin = self::decodePlugin((string) ($row['plugin_data'] ?? '')); + $is_stub = $plugin && empty($plugin['num_ratings']) && empty($plugin['active_installs']); + $is_stale = empty($plugin) || $is_stub || (time() - (int) ($row['updated_at'] ?? 0) > self::CACHE_TTL); + + if ($is_stale) { + $plugin = self::fetchAndCachePlugin($slug, (string) ($row['source'] ?? 'catalog'), $badge); + } + + if (empty($plugin)) { + continue; + } + + $report = $badge['report_object'] ?? null; + if ($report instanceof PluginReport && ! self::isVersionInPscRange($report, (string) ($plugin['version'] ?? ''))) { + continue; + } + + $plugins[] = $plugin; + $badges[$slug] = $badge; + + if (count($plugins) >= $per_page) { + break; + } + } + } + + return [ + 'plugins' => $plugins, + 'badges' => $badges, + 'db_offset' => $db_offset, + ]; + } + + /** + * @param string $slug + * @param string $source + * @param array $badge + * @return array|null + */ + private static function fetchAndCachePlugin($slug, $source, $badge) + { + $catalog_item = [ + 'slug' => $slug, + 'app_name' => $badge['app_name'] ?? $slug, + 'app_status' => 'safe_psc', + 'psc' => $badge['psc'] ?? '', + 'id' => $badge['id'] ?? '', + 'rs_app_version_max' => $badge['current_version'] ?? '', + ]; + + $plugin = PscCertifiedPluginsCatalogScanner::fetchPluginFromCatalogItem($catalog_item); + + if (! $plugin) { + return null; + } + + // Only cache real WP.org data, not fallback stubs with synthetic version. + if (! empty($plugin['num_ratings']) || ! empty($plugin['active_installs'])) { + PscCertifiedPluginsCacheRepository::updatePluginData($slug, $source, self::encodePlugin($plugin)); + } + + return $plugin; + } + + /** + * Search cached PSC plugins by name (partial match). + * + * @param string $term + * @return array{plugins: array>, badges: array>} + */ + public static function searchByName($term) + { + $rows = PscCertifiedPluginsCacheRepository::getRows(null, 0, 0); + + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + $term_lower = mb_strtolower(trim($term)); + $plugins = []; + $badges = []; + + foreach ($rows as $row) { + $slug = sanitize_title((string) ($row['slug'] ?? '')); + $badge = self::decodeBadge((string) ($row['badge_data'] ?? '')); + + if (empty($slug) || empty($badge)) { + continue; + } + + $app_name = mb_strtolower((string) ($badge['app_name'] ?? $slug)); + $slug_as_name = mb_strtolower(str_replace('-', ' ', $slug)); + + if (mb_strpos($app_name, $term_lower) === false && mb_strpos($slug_as_name, $term_lower) === false) { + continue; + } + + $plugin = self::decodePlugin((string) ($row['plugin_data'] ?? '')); + + if (empty($plugin)) { + $plugin = self::fetchAndCachePlugin($slug, (string) ($row['source'] ?? 'catalog'), $badge); + } + + if (empty($plugin)) { + continue; + } + + $report = $badge['report_object'] ?? null; + if ($report instanceof PluginReport && ! self::isVersionInPscRange($report, (string) ($plugin['version'] ?? ''))) { + continue; + } + + $plugins[] = $plugin; + $badges[$slug] = $badge; + } + + return [ + 'plugins' => $plugins, + 'badges' => $badges, + ]; + } + + /** + * @return array{plugins: array>, badges: array>} + */ + public static function getInstalledPlugins() + { + $version_map = self::getInstalledPluginsVersionMap(); + + if (empty($version_map)) { + return ['plugins' => [], 'badges' => []]; + } + + $rows = PscCertifiedPluginsCacheRepository::getRowsBySlugs(array_keys($version_map)); + + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + $plugins = []; + $badges = []; + $seen = []; + + foreach ($rows as $row) { + $slug = sanitize_title((string) ($row['slug'] ?? '')); + $badge = self::decodeBadge((string) ($row['badge_data'] ?? '')); + + if (empty($slug) || empty($badge) || isset($seen[$slug])) { + continue; + } + + $report = $badge['report_object'] ?? null; + $installed_version = $version_map[$slug] ?? ''; + + if ($report instanceof PluginReport && $installed_version !== '' && ! self::isVersionInPscRange($report, $installed_version)) { + continue; + } + + $seen[$slug] = true; + + $plugin = self::decodePlugin((string) ($row['plugin_data'] ?? '')); + + if (empty($plugin)) { + $plugin = self::fetchAndCachePlugin($slug, (string) ($row['source'] ?? 'catalog'), $badge); + } + + if (empty($plugin)) { + continue; + } + + $plugins[] = $plugin; + $badges[$slug] = $badge; + } + + return ['plugins' => $plugins, 'badges' => $badges]; + } + + /** + * @return int + */ + public static function countAll() + { + return PscCertifiedPluginsCacheRepository::countRows(); + } + + /** + * @return int + */ + public static function countInstalled() + { + $version_map = self::getInstalledPluginsVersionMap(); + + if (empty($version_map)) { + return 0; + } + + $rows = PscCertifiedPluginsCacheRepository::getRowsBySlugs(array_keys($version_map)); + $seen = []; + $count = 0; + + foreach ($rows as $row) { + $slug = sanitize_title((string) ($row['slug'] ?? '')); + $badge = self::decodeBadge((string) ($row['badge_data'] ?? '')); + + if (empty($slug) || empty($badge) || isset($seen[$slug])) { + continue; + } + + $report = $badge['report_object'] ?? null; + $installed_version = $version_map[$slug] ?? ''; + + if ($report instanceof PluginReport && $installed_version !== '' && ! self::isVersionInPscRange($report, $installed_version)) { + continue; + } + + $seen[$slug] = true; + $count++; + } + + return $count; + } + + /** + * @return int + */ + public static function countCertifiedLastMonth() + { + $rows = PscCertifiedPluginsCacheRepository::getRows(null, 0, 0); + $one_month_ago = strtotime('-1 month'); + $count = 0; + + foreach ($rows as $row) { + $badge = self::decodeBadge((string) ($row['badge_data'] ?? '')); + + if (empty($badge)) { + continue; + } + + $pub_date = (string) ($badge['publication_date'] ?? ''); + + if ($pub_date === '') { + continue; + } + + $timestamp = strtotime($pub_date); + + if ($timestamp !== false && $timestamp >= $one_month_ago) { + $count++; + } + } + + return $count; + } + + /** + * Returns true when the given version falls within the PSC-certified range. + * + * @param PluginReport $report + * @param string $version + * @return bool + */ + private static function isVersionInPscRange($report, $version) + { + if ($version === '') { + return true; + } + + if (! empty($report->rs_app_version_max) && version_compare($version, $report->rs_app_version_max, '>')) { + return false; + } + + if (! empty($report->rs_app_version_min) && version_compare($version, $report->rs_app_version_min, '<')) { + return false; + } + + return true; + } + + /** + * @return array slug => installed version + */ + private static function getInstalledPluginsVersionMap() + { + if (! function_exists('get_plugins')) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $map = []; + + foreach (get_plugins() as $plugin_file => $plugin_data) { + $slug = sanitize_title(dirname((string) $plugin_file)); + + // Single-file plugins (e.g. hello.php) have no directory; fall back to TextDomain. + if ($slug === '' || $slug === '.') { + $slug = ! empty($plugin_data['TextDomain']) + ? sanitize_title((string) $plugin_data['TextDomain']) + : ''; + } + + if ($slug !== '' && $slug !== '.' && ! isset($map[$slug])) { + $map[$slug] = (string) ($plugin_data['Version'] ?? ''); + } + } + + return $map; + } + + /** + * @return array + */ + private static function buildInstalledRows() + { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + + self::ensureVulnerabilityLibrary(); + + $safe_plugins = VulnerabilityAlarm::getSafePlugins(get_plugins(), false); + $rows = []; + $sort_order = 0; + + foreach ($safe_plugins as $safe_plugin) { + $slug = sanitize_title((string) ($safe_plugin['slug'] ?? '')); + + if (empty($slug) || empty($safe_plugin['psc'])) { + continue; + } + + $report = $safe_plugin['report_object'] ?? null; + $plugin = PscCertifiedPluginsCatalogScanner::fetchPluginFromCatalogItem([ + 'slug' => $slug, + 'app_name' => $report instanceof PluginReport && ! empty($report->app_name) ? $report->app_name : $slug, + 'rs_app_version_max' => $safe_plugin['current_version'] ?? '', + 'psc' => $safe_plugin['psc'], + 'id' => $safe_plugin['id'] ?? '', + 'app_status' => 'safe_psc', + ]); + + if (! $plugin) { + continue; + } + + $rows[] = [ + 'slug' => $slug, + 'source' => PscCertifiedPluginsCacheRepository::SOURCE_INSTALLED, + 'sort_order' => $sort_order++, + 'plugin_data' => self::encodePlugin($plugin), + 'badge_data' => self::encodeBadge($safe_plugin), + ]; + } + + return $rows; + } + + /** + * Installed plugins are matched against the locally stored vulnerability reports, + * so the library has to exist before the very first warm-up. + * + * @return void + */ + private static function ensureVulnerabilityLibrary() + { + if (get_option(VulnerabilityAlarm::VULNERABILITY_LIST) instanceof ApiResults) { + return; + } + + try { + VulnerabilityAlarm::updateWPModulesVulnerabilities(); + } catch (\Exception $exception) { + spbc_log('PSC cache: unable to update vulnerabilities library. ' . $exception->getMessage()); + } + } + + /** + * @param array|object $plugin + * @return string + */ + private static function encodePlugin($plugin) + { + return (string) wp_json_encode(PscCertifiedPluginsCatalogScanner::toArray($plugin)); + } + + /** + * @param string $json + * @return array|null + */ + private static function decodePlugin($json) + { + if ($json === '') { + return null; + } + + $decoded = json_decode($json, true); + + return is_array($decoded) ? $decoded : null; + } + + /** + * @param array $badge + * @return string + */ + private static function encodeBadge($badge) + { + $payload = $badge; + + if (($payload['report_object'] ?? null) instanceof PluginReport) { + $payload['report_object'] = get_object_vars($payload['report_object']); + } + + return (string) wp_json_encode($payload); + } + + /** + * @param string $json + * @return array|null + */ + private static function decodeBadge($json) + { + if ($json === '') { + return null; + } + + $decoded = json_decode($json, true); + + if (! is_array($decoded)) { + return null; + } + + if (is_array($decoded['report_object'] ?? null)) { + $report = new PluginReport(); + + foreach ($decoded['report_object'] as $key => $value) { + if (property_exists($report, $key) && (is_scalar($value) || $value === null)) { + $report->$key = (string) $value; + } + } + + $decoded['report_object'] = $report; + } + + return $decoded; + } + + /** + * @return void + */ + private static function ensureTableExists() + { + $tables_analyzer = new \CleantalkSP\SpbctWP\DB\TablesAnalyzer(); + + foreach ($tables_analyzer->getNotExistingTables() as $not_existing_table) { + if ($not_existing_table !== SPBC_TBL_PSC_PLUGINS_CACHE) { + continue; + } + + $db_tables_creator = new \CleantalkSP\SpbctWP\DB\TablesCreator(); + $db_tables_creator->createTable($not_existing_table); + } + } +} diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCacheRepository.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCacheRepository.php new file mode 100644 index 000000000..ae8938f6c --- /dev/null +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCacheRepository.php @@ -0,0 +1,141 @@ + $rows + * @return void + */ + public static function replaceAll($rows) + { + global $wpdb; + + DB::getInstance()->execute('TRUNCATE TABLE ' . SPBC_TBL_PSC_PLUGINS_CACHE); + + $updated_at = time(); + + foreach ($rows as $row) { + $wpdb->replace( + SPBC_TBL_PSC_PLUGINS_CACHE, + [ + 'slug' => $row['slug'], + 'source' => $row['source'], + 'sort_order' => (int) $row['sort_order'], + 'plugin_data' => $row['plugin_data'], + 'badge_data' => $row['badge_data'], + 'updated_at' => $updated_at, + ], + ['%s', '%s', '%d', '%s', '%s', '%d'] + ); + } + } + + /** + * Installed plugins always go first, then the catalog ones in the order they came from the API. + * + * @param string|null $source + * @param int $offset + * @param int $limit + * @return array> + */ + public static function getRows($source = null, $offset = 0, $limit = 0) + { + global $wpdb; + + $sql = 'SELECT slug, source, sort_order, plugin_data, badge_data, updated_at FROM ' . SPBC_TBL_PSC_PLUGINS_CACHE; + $args = []; + + if ($source !== null) { + $sql .= ' WHERE source = %s'; + $args[] = $source; + } + + $sql .= " ORDER BY CASE source WHEN 'installed' THEN 0 ELSE 1 END ASC, sort_order ASC"; + + if ($limit > 0) { + $sql .= ' LIMIT %d OFFSET %d'; + $args[] = $limit; + $args[] = (int) $offset; + } + + $prepared = empty($args) ? $sql : $wpdb->prepare($sql, $args); + $rows = DB::getInstance()->fetchAll($prepared); + + return is_array($rows) ? $rows : []; + } + + /** + * @param string|null $source + * @return int + */ + public static function countRows($source = null) + { + global $wpdb; + + $sql = 'SELECT COUNT(*) AS cnt FROM ' . SPBC_TBL_PSC_PLUGINS_CACHE; + + if ($source !== null) { + $sql = $wpdb->prepare($sql . ' WHERE source = %s', $source); + } + + $row = DB::getInstance()->fetch($sql); + + return isset($row->cnt) ? (int) $row->cnt : 0; + } + + /** + * @param string $slug + * @param string $source + * @param string $plugin_data + * @return void + */ + public static function updatePluginData($slug, $source, $plugin_data) + { + global $wpdb; + + $wpdb->update( + SPBC_TBL_PSC_PLUGINS_CACHE, + [ + 'plugin_data' => $plugin_data, + 'updated_at' => time(), + ], + [ + 'slug' => $slug, + 'source' => $source, + ], + ['%s', '%d'], + ['%s', '%s'] + ); + } + + /** + * @param array $slugs + * @return array> + */ + public static function getRowsBySlugs(array $slugs) + { + global $wpdb; + + if (empty($slugs)) { + return []; + } + + $placeholders = implode(', ', array_fill(0, count($slugs), '%s')); + $sql = 'SELECT slug, source, sort_order, plugin_data, badge_data, updated_at FROM ' . SPBC_TBL_PSC_PLUGINS_CACHE + . ' WHERE slug IN (' . $placeholders . ')' + . " ORDER BY CASE source WHEN 'installed' THEN 0 ELSE 1 END ASC, sort_order ASC"; + + $rows = DB::getInstance()->fetchAll($wpdb->prepare($sql, $slugs)); + + return is_array($rows) ? $rows : []; + } +} diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCatalogScanner.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCatalogScanner.php new file mode 100644 index 000000000..14592eeda --- /dev/null +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsCatalogScanner.php @@ -0,0 +1,196 @@ + $items + * @return array> + */ + public static function filterPscCatalogItems($items) + { + $psc_items = []; + + foreach ($items as $item) { + if (! is_array($item)) { + continue; + } + + if (($item['app_status'] ?? '') !== 'safe_psc' || empty($item['slug']) || empty($item['psc'])) { + continue; + } + + $psc_items[] = $item; + } + + return $psc_items; + } + + /** + * @param array> $items + * @return array> + */ + public static function buildBadgesFromCatalogItems($items) + { + $badges = []; + + foreach ($items as $item) { + $slug = sanitize_title((string) $item['slug']); + $version = self::getCatalogItemVersion($item); + $report = self::buildReportFromCatalogItem($item); + + if (empty($slug) || empty($report->psc)) { + continue; + } + + if (! empty($version) && ! VulnerabilityAlarmService::isModuleVersionMatchesReport($report, $version, true)) { + continue; + } + + $badges[$slug] = [ + 'slug' => $slug, + 'id' => sanitize_text_field((string) ($item['id'] ?? '')), + 'psc' => sanitize_text_field((string) $item['psc']), + 'report_object' => $report, + 'current_version' => $version, + 'app_name' => sanitize_text_field((string) ($item['app_name'] ?? $slug)), + 'publication_date' => sanitize_text_field((string) ($item['publication_date'] ?? '')), + ]; + } + + return $badges; + } + + /** + * WP_Plugin_Install_List_Table expects plain arrays, including the nested `icons` data, + * so the WordPress.org response is normalized before it reaches the cache or the renderer. + * + * @param array $item + * @return array|null + */ + public static function fetchPluginFromCatalogItem($item) + { + $slug = sanitize_title((string) $item['slug']); + $plugin = plugins_api( + 'plugin_information', + [ + 'slug' => $slug, + 'fields' => [ + 'short_description' => true, + 'icons' => true, + 'banners' => true, + 'reviews' => true, + 'downloaded' => true, + 'active_installs' => true, + 'last_updated' => true, + 'added' => true, + 'homepage' => true, + 'rating' => true, + 'num_ratings' => true, + ], + ] + ); + + if ($plugin instanceof WP_Error || ! is_object($plugin) || empty($plugin->slug)) { + return self::buildPluginStubFromCatalogItem($item); + } + + return self::toArray($plugin); + } + + /** + * @param object|array $plugin + * @return array + */ + public static function toArray($plugin) + { + $normalized = json_decode((string) wp_json_encode($plugin), true); + + return is_array($normalized) ? $normalized : (array) $plugin; + } + + /** + * @param array $item + * @return array|null + */ + public static function buildPluginStubFromCatalogItem($item) + { + $slug = sanitize_title((string) ($item['slug'] ?? '')); + + if (empty($slug)) { + return null; + } + + $version = self::getCatalogItemVersion($item); + $name = ! empty($item['app_name']) ? sanitize_text_field((string) $item['app_name']) : $slug; + $timestamp = ! empty($item['publication_date']) + ? strtotime((string) $item['publication_date']) + : false; + $last_updated = $timestamp ? gmdate('Y-m-d', $timestamp) : gmdate('Y-m-d'); + + return [ + 'slug' => $slug, + 'name' => $name, + 'version' => $version, + 'author' => '', + 'short_description' => $version + ? sprintf( + /* translators: %s: Certified plugin version. */ + __('CleanTalk certified release: %s.', 'security-malware-firewall'), + $version + ) + : __('CleanTalk certified plugin release.', 'security-malware-firewall'), + 'icons' => [ + 'default' => 'https://s.w.org/plugins/geopattern-icon/' . rawurlencode($slug) . '.svg', + ], + 'last_updated' => $last_updated, + 'homepage' => 'https://wordpress.org/plugins/' . $slug . '/', + 'download_link' => 'https://downloads.wordpress.org/plugin/' . $slug . '.zip', + 'requires' => false, + 'requires_php' => false, + 'tested' => get_bloginfo('version'), + 'rating' => 0, + 'num_ratings' => 0, + 'active_installs' => 0, + 'downloaded' => 0, + ]; + } + + /** + * @param array $item + * @return string + */ + public static function getCatalogItemVersion($item) + { + if (! empty($item['rs_app_version_max'])) { + return (string) $item['rs_app_version_max']; + } + + if (! empty($item['rs_app_version_min'])) { + return (string) $item['rs_app_version_min']; + } + + return ''; + } + + /** + * @param array $item + * @return PluginReport + */ + public static function buildReportFromCatalogItem($item) + { + $report = new PluginReport(); + $report->slug = sanitize_title((string) ($item['slug'] ?? '')); + $report->app_status = 'safe_psc'; + $report->psc = (string) ($item['psc'] ?? ''); + $report->id = isset($item['id']) ? (string) $item['id'] : ''; + $report->rs_app_version_min = isset($item['rs_app_version_min']) ? (string) $item['rs_app_version_min'] : ''; + $report->rs_app_version_max = isset($item['rs_app_version_max']) ? (string) $item['rs_app_version_max'] : ''; + + return $report; + } +} diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsController.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsController.php index 2685664bd..c57c83b97 100644 --- a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsController.php +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/PscCertifiedPluginsController.php @@ -61,34 +61,43 @@ public static function ajaxRenderTab() self::loadListTableDependencies(); $page = max(1, (int) ($_POST['page'] ?? $_POST['paged'] ?? 1)); + $api_page = max(0, (int) ($_POST['api_page'] ?? 0)); $append = ! empty($_POST['append']); + $search = isset($_POST['search']) ? sanitize_text_field((string) $_POST['search']) : ''; + $filter = isset($_POST['filter']) && sanitize_text_field((string) $_POST['filter']) === SpbcPluginInstallListTable::FILTER_INSTALLED + ? SpbcPluginInstallListTable::FILTER_INSTALLED + : SpbcPluginInstallListTable::FILTER_ALL; - if (! $append && $page === 1) { - delete_transient(SpbcPluginInstallListTable::OVERFLOW_TRANSIENT_PREFIX . get_current_user_id()); + if (! $append) { + SpbcPluginInstallListTable::clearSession(); } $_REQUEST['paged'] = $page; - $list_table = self::createListTable(); + $list_table = self::createListTable($filter, $api_page, $search); $list_table->prepare_items(); + $response = [ + 'page' => $list_table->getNextPage(), + 'api_page' => $list_table->getNextApiPage(), + 'has_more' => $list_table->has_more(), + 'filter' => $filter, + 'search' => $search, + 'certified_last_month' => PscCertifiedPluginsCache::countCertifiedLastMonth(), + 'shown_count' => PscCertifiedPluginsCache::countAll(), + ]; + if ($append) { - wp_send_json([ - 'rows_html' => $list_table->get_rows_html(), - 'page' => $list_table->getNextApiPage(), - 'has_more' => $list_table->has_more(), - ]); + $response['rows_html'] = $list_table->get_rows_html(); + + wp_send_json($response); } ob_start(); - self::renderListTable($list_table); - $html = (string) ob_get_clean(); + self::renderListTable($list_table, $filter); + $response['html'] = (string) ob_get_clean(); - wp_send_json([ - 'html' => $html, - 'page' => $list_table->getNextApiPage(), - 'has_more' => $list_table->has_more(), - ]); + wp_send_json($response); } /** @@ -131,24 +140,34 @@ public static function enqueueAssets() private static function loadListTableDependencies() { require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-plugin-install-list-table.php'; } /** + * @param string $filter + * @param int $api_page + * @param string $search * @return SpbcPluginInstallListTable */ - private static function createListTable() + private static function createListTable($filter = SpbcPluginInstallListTable::FILTER_ALL, $api_page = 0, $search = '') { self::loadListTableDependencies(); - return new SpbcPluginInstallListTable(); + $list_table = new SpbcPluginInstallListTable(); + $list_table->setFilter($filter); + $list_table->setRequestedApiPage($api_page); + $list_table->setSearch($search); + + return $list_table; } /** * @param SpbcPluginInstallListTable $list_table + * @param string $filter * @return void */ - public static function renderListTable($list_table) + public static function renderListTable($list_table, $filter = SpbcPluginInstallListTable::FILTER_ALL) { if (! current_user_can('install_plugins')) { echo '

' . esc_html__('Sorry, you are not allowed to install plugins on this site.', 'security-malware-firewall') . '

'; @@ -157,7 +176,7 @@ public static function renderListTable($list_table) echo '
'; echo ''; } + /** + * @param string $filter + * @return void + */ + private static function renderFilterLinks($current_filter) + { + $installed_count = PscCertifiedPluginsCache::countInstalled(); + + $links = [ + SpbcPluginInstallListTable::FILTER_ALL => __('All certified', 'security-malware-firewall'), + SpbcPluginInstallListTable::FILTER_INSTALLED => sprintf( + /* translators: %s: Number of certified plugins installed on this site. */ + __('Installed on this site (%s)', 'security-malware-firewall'), + number_format_i18n($installed_count) + ), + ]; + + echo '
'; + + echo '
    '; + + $rendered = 0; + foreach ($links as $filter => $label) { + $is_current = $filter === $current_filter; + $separator = ++$rendered < count($links) ? ' | ' : ''; + + printf( + '
  • %s%s
  • ', + $is_current ? ' current' : '', + esc_attr($filter), + $is_current ? ' aria-current="page"' : '', + esc_html($label), + $separator + ); + } + + echo '
'; + + printf( + '', + esc_attr__('Search plugins...', 'security-malware-firewall'), + esc_html__('Search', 'security-malware-firewall') + ); + + echo '
'; + } + /** * @return string */ diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/SpbcPluginInstallListTable.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/SpbcPluginInstallListTable.php index 6a41bd622..ea65d78cb 100644 --- a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/SpbcPluginInstallListTable.php +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/SpbcPluginInstallListTable.php @@ -3,13 +3,14 @@ namespace CleantalkSP\SpbctWP\VulnerabilityAlarm; use CleantalkSP\SpbctWP\VulnerabilityAlarm\Dto\PluginReport; -use WP_Error; class SpbcPluginInstallListTable extends \WP_Plugin_Install_List_Table { - const OVERFLOW_TRANSIENT_PREFIX = 'spbc_psc_tab_overflow_'; + const SESSION_TRANSIENT_PREFIX = 'spbc_psc_tab_session_'; - const MAX_API_PAGES_PER_REQUEST = 50; + const FILTER_ALL = 'all'; + + const FILTER_INSTALLED = 'installed'; /** * @var array @@ -26,6 +27,31 @@ class SpbcPluginInstallListTable extends \WP_Plugin_Install_List_Table */ private $next_api_page = 1; + /** + * @var int + */ + private $next_page = 2; + + /** + * @var bool + */ + private $has_more = false; + + /** + * @var string + */ + private $filter = self::FILTER_ALL; + + /** + * @var int + */ + private $requested_api_page = 0; + + /** + * @var string + */ + private $search_term = ''; + public function __construct() { $screen = function_exists('get_current_screen') ? get_current_screen() : null; @@ -37,359 +63,168 @@ public function __construct() } /** + * @param string $filter * @return void */ - public function prepare_items() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps + public function setFilter($filter) { - require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; - - $start_api_page = max(1, $this->get_pagenum()); - $per_page = PscCertifiedPluginsApi::PER_PAGE; - - $this->psc_badges_by_slug = []; - $badge_plugins = []; - $overflow_plugins = []; - $seen_slugs = []; - - $stored_overflow = $this->getOverflow(); - foreach ($stored_overflow['plugins'] as $plugin) { - $slug = VulnerabilityAlarm::getPluginSlug($plugin); - if (empty($slug) || isset($seen_slugs[$slug])) { - continue; - } - - $seen_slugs[$slug] = true; - $badge_plugins[] = $plugin; - } - - if (! empty($stored_overflow['badges']) && is_array($stored_overflow['badges'])) { - $this->psc_badges_by_slug = $stored_overflow['badges']; - } - - $this->clearOverflow(); - - $api_page = $start_api_page; - $pages_scanned = 0; - - while (count($badge_plugins) < $per_page && $pages_scanned < self::MAX_API_PAGES_PER_REQUEST) { - $api_result = PscCertifiedPluginsApi::fetchPage( - $api_page, - null, - PscCertifiedPluginsApi::CATALOG_LIST_PARAMS - ); - - if ($api_result instanceof WP_Error) { - if ($api_page === $start_api_page && empty($badge_plugins)) { - $this->error = $api_result; - } - - break; - } - - $this->catalog_total = (int) $api_result['total']; - $pages_scanned++; - - if (empty($api_result['items'])) { - $this->next_api_page = $api_page + 1; - break; - } - - $psc_items = $this->filterPscCatalogItems($api_result['items']); - $this->mergePscBadgesFromCatalogItems($psc_items); - $batch_plugins = $this->fetchPluginsFromCatalogItems($psc_items); - - foreach ($batch_plugins as $plugin) { - $slug = VulnerabilityAlarm::getPluginSlug($plugin); - - if (empty($slug) || isset($seen_slugs[$slug])) { - continue; - } - - if (empty($this->psc_badges_by_slug[$slug])) { - continue; - } - - $seen_slugs[$slug] = true; - - if (count($badge_plugins) < $per_page) { - $badge_plugins[] = $plugin; - continue; - } - - $overflow_plugins[] = $plugin; - } - - $this->next_api_page = $api_page + 1; - - if (count($badge_plugins) >= $per_page) { - break; - } - - if ($api_page * $per_page >= $this->catalog_total) { - break; - } - - $api_page++; - } - - if (! empty($overflow_plugins)) { - $overflow_badges = []; - - foreach ($overflow_plugins as $plugin) { - $slug = VulnerabilityAlarm::getPluginSlug($plugin); - - if (! empty($slug) && ! empty($this->psc_badges_by_slug[$slug])) { - $overflow_badges[$slug] = $this->psc_badges_by_slug[$slug]; - } - } - - $this->saveOverflow($overflow_plugins, $overflow_badges); - } - - $this->items = $badge_plugins; - - $this->set_pagination_args([ - 'total_items' => $this->catalog_total, - 'per_page' => $per_page, - 'total_pages' => (int) ceil(max(1, $this->catalog_total) / $per_page), - ]); + $this->filter = $filter === self::FILTER_INSTALLED ? self::FILTER_INSTALLED : self::FILTER_ALL; } /** - * @return int + * Research API page to continue from, provided by the previous response. + * + * @param int $api_page + * @return void */ - public function getNextApiPage() + public function setRequestedApiPage($api_page) { - return $this->next_api_page; + $this->requested_api_page = max(0, (int) $api_page); } /** - * @return bool + * @param string $term + * @return void */ - public function has_more() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps + public function setSearch($term) { - $per_page = (int) ($this->_pagination_args['per_page'] ?? PscCertifiedPluginsApi::PER_PAGE); + $this->search_term = sanitize_text_field(trim($term)); + } - if (! empty($this->getOverflow()['plugins'])) { - return true; + /** + * @return void + */ + public function prepare_items() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps + { + if ($this->search_term !== '') { + $this->prepareSearchResults(); + return; } - if ($this->catalog_total <= 0) { - return false; + if ($this->filter === self::FILTER_INSTALLED) { + $this->prepareInstalledItems(); + return; } - return ($this->next_api_page - 1) * $per_page < $this->catalog_total; - } + $per_page = PscCertifiedPluginsApi::PER_PAGE; - /** - * @return string - */ - public function get_rows_html() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps - { - return $this->withPscBadgeFilters(function () { - ob_start(); - $this->display_rows_or_placeholder(); + // api_page carries the real DB offset for cursor-based pagination. + $db_offset = $this->requested_api_page > 0 ? $this->requested_api_page : 0; - return (string) ob_get_clean(); - }); + $this->preparePageFromCache($db_offset, $per_page); } /** * @return void */ - public function display() + private function prepareSearchResults() { - $this->withPscBadgeFilters(function () { - parent::display(); - }); + $result = PscCertifiedPluginsCache::searchByName($this->search_term); + + $this->psc_badges_by_slug = $result['badges']; + $this->items = $result['plugins']; + $this->catalog_total = count($result['plugins']); + $this->next_page = 1; + $this->next_api_page = 0; + $this->has_more = false; + + $this->set_pagination_args([ + 'total_items' => $this->catalog_total, + 'per_page' => max(1, $this->catalog_total), + 'total_pages' => 1, + ]); } /** - * @param array $items - * @return array> + * @return void */ - private function filterPscCatalogItems($items) + private function prepareInstalledItems() { - $psc_items = []; - - foreach ($items as $item) { - if (! is_array($item)) { - continue; - } + $cached = PscCertifiedPluginsCache::getInstalledPlugins(); - if (($item['app_status'] ?? '') !== 'safe_psc' || empty($item['slug']) || empty($item['psc'])) { - continue; - } - - $psc_items[] = $item; - } + $this->psc_badges_by_slug = $cached['badges']; + $this->items = $cached['plugins']; + $this->catalog_total = count($cached['plugins']); + $this->next_page = 1; + $this->next_api_page = 0; + $this->has_more = false; - return $psc_items; + $this->set_pagination_args([ + 'total_items' => $this->catalog_total, + 'per_page' => max(1, $this->catalog_total), + 'total_pages' => 1, + ]); } /** - * @param array> $items - * @return array + * @param int $db_offset + * @param int $per_page + * @return void */ - private function fetchPluginsFromCatalogItems($items) + private function preparePageFromCache($db_offset, $per_page) { - $plugins = []; + $result = PscCertifiedPluginsCache::getPageWithEnrichment($db_offset, $per_page); + $total_rows = PscCertifiedPluginsCache::countAll(); - foreach ($items as $item) { - $plugin = $this->fetchPluginFromCatalogItem($item); + $this->psc_badges_by_slug = $result['badges']; + $this->items = $result['plugins']; + $this->catalog_total = $total_rows; + $this->next_page = 0; + $this->next_api_page = $result['db_offset']; + $this->has_more = $result['db_offset'] < $total_rows; - if ($plugin) { - $plugins[] = $plugin; - } - } - - return $plugins; + $this->set_pagination_args([ + 'total_items' => $total_rows, + 'per_page' => $per_page, + 'total_pages' => (int) ceil(max(1, $total_rows) / $per_page), + ]); } /** - * @param array> $items - * @return void + * @return int */ - private function mergePscBadgesFromCatalogItems($items) + public function getNextPage() { - foreach ($items as $item) { - $slug = sanitize_title((string) $item['slug']); - $version = $this->getCatalogItemVersion($item); - $report = $this->buildReportFromCatalogItem($item); - - if (empty($slug) || empty($report->psc)) { - continue; - } - - if (! empty($version) && ! VulnerabilityAlarmService::isModuleVersionMatchesReport($report, $version, true)) { - continue; - } - - $this->psc_badges_by_slug[$slug] = [ - 'slug' => $slug, - 'id' => sanitize_text_field((string) ($item['id'] ?? '')), - 'psc' => sanitize_text_field((string) $item['psc']), - 'report_object' => $report, - 'current_version' => $version, - ]; - } + return $this->next_page; } /** - * @param array $item - * @return object|null + * @return int */ - private function fetchPluginFromCatalogItem($item) + public function getNextApiPage() { - $slug = sanitize_title((string) $item['slug']); - $plugin = plugins_api( - 'plugin_information', - [ - 'slug' => $slug, - 'fields' => [ - 'short_description' => true, - 'icons' => true, - 'banners' => true, - 'reviews' => true, - 'downloaded' => true, - 'active_installs' => true, - 'last_updated' => true, - 'added' => true, - 'homepage' => true, - 'rating' => true, - 'num_ratings' => true, - ], - ] - ); - - if ($plugin instanceof WP_Error || ! is_object($plugin) || empty($plugin->slug)) { - return $this->buildPluginStubFromCatalogItem($item); - } - - return $plugin; + return $this->next_api_page; } /** - * Build a plugin card object from PSC catalog data when WordPress.org is unavailable. - * - * @param array $item - * @return object|null + * @return bool */ - private function buildPluginStubFromCatalogItem($item) + public function has_more() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps { - $slug = sanitize_title((string) ($item['slug'] ?? '')); - - if (empty($slug)) { - return null; - } - - $version = $this->getCatalogItemVersion($item); - $name = ! empty($item['app_name']) ? sanitize_text_field((string) $item['app_name']) : $slug; - $timestamp = ! empty($item['publication_date']) - ? strtotime((string) $item['publication_date']) - : false; - $last_updated = $timestamp ? gmdate('Y-m-d', $timestamp) : gmdate('Y-m-d'); - - return (object) [ - 'slug' => $slug, - 'name' => $name, - 'version' => $version, - 'author' => '', - 'short_description' => $version - ? sprintf( - /* translators: %s: Certified plugin version. */ - __('CleanTalk certified release: %s.', 'security-malware-firewall'), - $version - ) - : __('CleanTalk certified plugin release.', 'security-malware-firewall'), - 'icons' => [ - 'default' => 'https://s.w.org/plugins/geopattern-icon/' . rawurlencode($slug) . '.svg', - ], - 'last_updated' => $last_updated, - 'homepage' => 'https://wordpress.org/plugins/' . $slug . '/', - 'download_link' => 'https://downloads.wordpress.org/plugin/' . $slug . '.zip', - 'requires' => false, - 'requires_php' => false, - 'tested' => get_bloginfo('version'), - 'rating' => 0, - 'num_ratings' => 0, - 'active_installs' => 0, - 'downloaded' => 0, - ]; + return $this->has_more; } /** - * @param array $item * @return string */ - private function getCatalogItemVersion($item) + public function get_rows_html() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps { - if (! empty($item['rs_app_version_max'])) { - return (string) $item['rs_app_version_max']; - } - - if (! empty($item['rs_app_version_min'])) { - return (string) $item['rs_app_version_min']; - } + return $this->withPscBadgeFilters(function () { + ob_start(); + $this->display_rows_or_placeholder(); - return ''; + return (string) ob_get_clean(); + }); } /** - * @param array $item - * @return PluginReport + * @return void */ - private function buildReportFromCatalogItem($item) + public function display() { - $report = new PluginReport(); - $report->slug = sanitize_title((string) ($item['slug'] ?? '')); - $report->app_status = 'safe_psc'; - $report->psc = (string) ($item['psc'] ?? ''); - $report->id = isset($item['id']) ? (string) $item['id'] : ''; - $report->rs_app_version_min = isset($item['rs_app_version_min']) ? (string) $item['rs_app_version_min'] : ''; - $report->rs_app_version_max = isset($item['rs_app_version_max']) ? (string) $item['rs_app_version_max'] : ''; - - return $report; + $this->withPscBadgeFilters(function () { + parent::display(); + }); } /** @@ -442,93 +277,20 @@ public function filterPluginInstallActionLinks($action_links, $plugin) return $action_links; } - /** - * @return array{plugins: array, badges: array} - */ - private function getOverflow() - { - $stored = get_transient($this->getOverflowTransientKey()); - - if (! is_array($stored)) { - return [ - 'plugins' => [], - 'badges' => [], - ]; - } - - return [ - 'plugins' => is_array($stored['plugins'] ?? null) ? $stored['plugins'] : [], - 'badges' => is_array($stored['badges'] ?? null) ? $stored['badges'] : [], - ]; - } - - /** - * @param array $plugins - * @param array $badges - * @return void - */ - private function saveOverflow($plugins, $badges) - { - if (empty($plugins)) { - $this->clearOverflow(); - - return; - } - - set_transient( - $this->getOverflowTransientKey(), - [ - 'plugins' => $plugins, - 'badges' => $badges, - ], - HOUR_IN_SECONDS - ); - } - /** * @return void */ - private function clearOverflow() + public static function clearSession() { - delete_transient($this->getOverflowTransientKey()); + delete_transient(self::getSessionTransientKey()); } /** * @return string */ - private function getOverflowTransientKey() - { - return self::OVERFLOW_TRANSIENT_PREFIX . get_current_user_id(); - } - - /** - * Intro text shown above the plugin list (views() is not called by WP_Plugin_Install_List_Table::display()). - * - * @return void - */ - public static function renderIntroMessage() + private static function getSessionTransientKey() { - $tests_url = 'https://research.cleantalk.org/reports'; - - echo '

'; - echo wp_kses( - sprintf( - /* translators: %s: URL to the full list of PSC security tests */ - __( - 'This tab shows plugin releases certified by CleanTalk\'s security team. We have reviewed these releases for vulnerabilities such as XSS, SQL injection, and backdoors. The full list of security tests is available here. While we make every effort to identify security issues, we cannot guarantee that any release shown in this tab is completely free of vulnerabilities.', - 'security-malware-firewall' - ), - esc_url($tests_url) - ), - [ - 'a' => [ - 'href' => true, - 'target' => true, - 'rel' => true, - ], - ] - ); - echo '

'; + return self::SESSION_TRANSIENT_PREFIX . get_current_user_id(); } /** diff --git a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/VulnerabilityAlarmView.php b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/VulnerabilityAlarmView.php index bcb2ef0d3..bd879b322 100755 --- a/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/VulnerabilityAlarmView.php +++ b/lib/CleantalkSP/SpbctWP/VulnerabilityAlarm/VulnerabilityAlarmView.php @@ -414,33 +414,6 @@ public static function getLastUpdateResultReplacements() return $replacements; } - public static function getServiceFeatureDescription() - { - $template = ' -

%s

-
    -
  • %s
  • -
  • %s
  • -
  • %s
  • -
-

%s

- '; - $common_text = esc_html__('The Security plugin performs a scheduled request to the CleanTalk API to check every installed plugin or theme for known vulnerabilities. The report data are updated with the next triggers:', 'security-malware-firewall'); - $cron_module = esc_html__('within 100 seconds of any plugin or theme being activated', 'security-malware-firewall'); - $cron_self = esc_html__('within 30 seconds since the Security plugin is activated', 'security-malware-firewall'); - $cron_common = esc_html__('every 24 hours after the last update', 'security-malware-firewall'); - $on_lists = esc_html__('Also, the single check runs every time you observe plugins/themes install pages for every listed item.', 'security-malware-firewall'); - $template = sprintf( - $template, - $common_text, - $cron_module, - $cron_self, - $cron_common, - $on_lists - ); - return $template; - } - /** * Collects data for the Critical Updates tab in JSON format * @return array diff --git a/readme.txt b/readme.txt index 24a68da6a..5e2f4bd8b 100644 --- a/readme.txt +++ b/readme.txt @@ -2,9 +2,9 @@ Contributors: glomberg, alexandergull, sergefcleantalk Tags: security, firewall, malware, login, 2fa Requires at least: 5.0 -Tested up to: 7.0 +Tested up to: 7.1 Requires PHP: 7.2 -Stable tag: 2.185 +Stable tag: 2.186 License: GPLv2 License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -376,6 +376,30 @@ Security FireWall can mitigate HTTP/HTTPS DDoS attacks. When an intruder makes G == Changelog == += 2.186 Aug 17, 2026 +* Mod. Settings. Transferring settings to React +* New. UserPassCheck. Debugging functionality using the cron task launch button +* Mod. UserPassCheck. Rendering the status of the check and its results +* Mod. PSCTab. Caching data for fast content display +* Upd. Settings. Add BFP option. (#694) +* Upd. Firewall. Improve BFP module to protect woo login. (#693) +* Security Firewall UI update +* UI update. Renamed the account creation button and description. Add new params in request +* Mod. PSCTab. Filtering by installed plug-ins, PC search, active PSC filtering +* Fix. PSCTab. Edits for the formation of values for the total number of PSCs, edits for comments +* Fix. Remote Calls. Wrong response fixed. (#707) +* Fix. Settings. Auto cure setting fixed. +* Fix. Admin banners. Critical files banner fixed. (#712) +* Fix. Readme. WP 7.1 compatibility added. +* Fix. Settings. Improve curl wrapper. +* Fix. FW. Improve statement on WAF module to prevent false positive. (#710) +* Fix. Scan. Show unknown accordion. (#709) +* Fix. Integrations. Update upload checker verify from ACF. +* Upd. Scan. Update skip policy. (#704) +* Fix. Scan. Improve surface iterator to filter not available dirs. (#705) +* Fix. FW. Improve logs +* Fix. Upload checker. Check files during media uploading fixed. (#713) + = 2.185 Aug 03, 2026 * Fix. Banners. Syncing trial and renew banners * Fix. ScannerQueue. Increasing the chunk for parsing approved hashes diff --git a/security-malware-firewall.php b/security-malware-firewall.php index 7e19b61e0..6c3d8a5ce 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -5,7 +5,7 @@ Plugin URI: https://wordpress.org/plugins/security-malware-firewall/ Description: Security & Malware scan by CleanTalk to protect your website from online threats and viruses. IP/Country FireWall, Web application FireWall. Detailed stats and logs to have full control. Author: CleanTalk Security -Version: 2.185 +Version: 2.186 Author URI: https://cleantalk.org Text Domain: security-malware-firewall Domain Path: /i18n @@ -13,7 +13,6 @@ use CleantalkSP\Security\LoginCollectingProtector; use CleantalkSP\SpbctWP\Activator; -use CleantalkSP\SpbctWP\AdjustToEnvironmentModule\AdjustToEnvironmentHandler; use CleantalkSP\SpbctWP\DTO\SecurityLogsDataRowDTO; use CleantalkSP\SpbctWP\DTO\SecurityLogsDTO; use CleantalkSP\SpbctWP\FSWatcher\Controller as FSWatcherController; @@ -104,8 +103,8 @@ define('SPBC_2FA_KEY_TTL', 600); // 2fa key lifetime in seconds /** - * @todo Migrate BFP disable from constant to settings option - * Set SPBC_BFP_DISABLE to true to disable Brute Force Protection module + * Set SPBC_BFP_DISABLE to true to disable Brute Force Protection module. + * Kept for backward compatibility; prefer settings option bfp__enabled. */ if (!defined('SPBC_BFP_DISABLE')) { define('SPBC_BFP_DISABLE', false); @@ -139,6 +138,7 @@ define('SPBC_TBL_CURE_LOG', $wpdb->base_prefix . 'spbc_cure_log'); // Table with scan results. define('SPBC_TBL_RATE_LIMITS', $wpdb->base_prefix . 'spbc_rate_limits'); // Table with scan results. define('SPBC_SURFACE_COMPLETED_DIRS', $wpdb->base_prefix . 'spbc_surface_completed_dirs'); // Table with scan results. +define('SPBC_TBL_PSC_PLUGINS_CACHE', $wpdb->prefix . 'spbc_psc_plugins_cache'); // PSC certified plugins cache. define('SPBC_SELECT_LIMIT', 1500); // Select limit for logs. define('SPBC_WRITE_LIMIT', 5000); // Write limit for firewall data. @@ -222,18 +222,26 @@ function __spbc($text) // Collect and partially suppress doing_it_wrong_errors new DoingItWrongHandler($spbc); -// Remote calls -if ( SpbcRemoteCalls::check() ) { - try { - if ( Get::getString('spbc_remote_call_action') === 'run_service_template_get' ) { - require_once(SPBC_PLUGIN_DIR . 'inc/spbc-settings.php'); +add_action('init', function () { + // Cron + global $spbc_cron, $spbc; // Letting know functions that they are running under spbc_cron + $spbc_cron = new SpbcCron(); + ! SpbcRemoteCalls::check() && $spbc_cron->execute(); + unset($spbc_cron); + + // Remote calls + if ( SpbcRemoteCalls::check() ) { + try { + if ( Get::getString('spbc_remote_call_action') === 'run_service_template_get' ) { + require_once(SPBC_PLUGIN_DIR . 'inc/spbc-settings.php'); + } + $rc = new SpbcRemoteCalls($spbc); + $rc->process(); + } catch ( Exception $e ) { + die(json_encode(array('ERROR:' => $e->getMessage()))); } - $rc = new SpbcRemoteCalls($spbc); - $rc->process(); - } catch ( Exception $e ) { - die(json_encode(array('ERROR:' => $e->getMessage()))); } -} +}); //First start // Do recheck the settings key @@ -458,12 +466,6 @@ function spbc_change_author_name($link, $_author_id, $_author_nicename) add_action('wp_footer', 'spbc_hook__wp_footer_trusted_text', 998); } -// Cron -global $spbc_cron; // Letting know functions that they are running under spbc_cron -$spbc_cron = new SpbcCron(); -! SpbcRemoteCalls::check() && $spbc_cron->execute(); -unset($spbc_cron); - if ( is_admin() || is_network_admin() ) { include_once SPBC_PLUGIN_DIR . 'inc/spbc-admin.php'; add_action('init', function () { @@ -655,24 +657,11 @@ function spbc_authenticate__check_brute_force() { global $spbc; - $login_url = wp_login_url(); - if ($spbc->settings['login_page_rename__enabled']) { - $GLOBALS['wp_rewrite'] = new WP_Rewrite(); - $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); - } - - // Compare only the path part of URLs to avoid scheme mismatch issues. - // Use the canonical (percent-decoded) path so encoded variants like - // /wp-%6cogin.php cannot bypass the BFP/2FA rate-limit detection. - $current_path = Server::getCanonicalPath() ?: Server::getCanonicalUri(); - $login_path = parse_url($login_url, PHP_URL_PATH) ?: '/wp-login.php'; - $is_login_page = strpos(trim($current_path, '/'), trim($login_path, '/')) === 0; - $bfp = new BFP( array( 'api_key' => $spbc->api_key, 'state' => $spbc, - 'is_login_page' => $is_login_page, + 'is_login_page' => spbc_is_login_page_request(), 'is_logged_in' => Cookie::getString('spbc_is_logged_in') === md5($spbc->data['salt'] . get_option('home')), 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], 'block_period' => $spbc->settings['bfp__block_period__5_fails'], diff --git a/spec/__tests__/login.test.js b/spec/__tests__/login.test.js index d9a121c4e..02f436c1b 100644 --- a/spec/__tests__/login.test.js +++ b/spec/__tests__/login.test.js @@ -9,10 +9,18 @@ import {jestState} from '../form.spec'; export async function __runLogin() { await jestState.page.goto(jestState.envData.root + '/wp-login.php', {waitUntil: 'load'}); await jestState.page.waitForSelector('[id=loginform]'); - await jestState.page.click('input[id=user_login]'); - await jestState.page.type('input[id=user_login]', jestState.envData.wp_login); - await jestState.page.click('input[id=user_pass]'); - await jestState.page.type('input[id=user_pass]', jestState.envData.wp_password); + + // Clear and fill login field + const loginInput = await jestState.page.$('input[id=user_login]'); + await loginInput.click({clickCount: 3}); + await loginInput.type(jestState.envData.wp_login); + + // Clear and fill password field + const passInput = await jestState.page.$('input[id=user_pass]'); + await passInput.click({clickCount: 3}); + await jestState.page.evaluate(() => document.getElementById('user_pass').value = ''); + await passInput.type(jestState.envData.wp_password, {delay: 20}); + await jestState.page.click('input[id=wp-submit]'); await jestState.page.waitForSelector('#wp-admin-bar-my-account'); } diff --git a/spec/__tests__/settings_tab.test.js b/spec/__tests__/settings_tab.test.js index 38c52c4c2..38dc8774c 100644 --- a/spec/__tests__/settings_tab.test.js +++ b/spec/__tests__/settings_tab.test.js @@ -337,6 +337,2226 @@ async function __testWafDependenciesToggle() { } } +/** + * Test VulnerabilityCheckTestBeforeInstall component exists and is functional. + * @return {Promise} + */ +async function __testVulnerabilityCheckTestBeforeInstallExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_vulnerability_check__test_before_install'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_vulnerability_check__test_before_install', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_vulnerability_check__test_before_install"]'); + expect(label).not.toBeNull(); + + // Check help icon exists + const helpIcon = await jestState.page.$('i[data-setting="vulnerability_check__test_before_install"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test VulnerabilityCheckTestBeforeInstall checkbox toggle. + * @return {Promise} + */ +async function __testVulnerabilityCheckTestBeforeInstallToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_vulnerability_check__test_before_install'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test VulnerabilityCheckEnableCron component exists and is functional. + * @return {Promise} + */ +async function __testVulnerabilityCheckEnableCronExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_vulnerability_check__enable_cron'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_vulnerability_check__enable_cron', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_vulnerability_check__enable_cron"]'); + expect(label).not.toBeNull(); + + // Check help icon exists + const helpIcon = await jestState.page.$('i[data-setting="vulnerability_check__enable_cron"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test VulnerabilityCheckEnableCron toggles dependency on warn_on_modules_pages. + * @return {Promise} + */ +async function __testVulnerabilityCheckEnableCronDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_vulnerability_check__enable_cron'; + const childSelector = '#spbc_setting_vulnerability_check__warn_on_modules_pages'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + // Toggle off parent and expect child disabled + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + // Toggle on parent and expect child enabled + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test VulnerabilityCheckWarnOnModulesPages component exists. + * @return {Promise} + */ +async function __testVulnerabilityCheckWarnOnModulesPagesExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_vulnerability_check__warn_on_modules_pages'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_vulnerability_check__warn_on_modules_pages', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check it is rendered inside a sub_setting wrapper + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_vulnerability_check__warn_on_modules_pages'); + expect(subSetting).not.toBeNull(); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_vulnerability_check__warn_on_modules_pages"]'); + expect(label).not.toBeNull(); + + // Check help icon exists + const helpIcon = await jestState.page.$('i[data-setting="vulnerability_check__warn_on_modules_pages"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test VulnerabilityCheckShowReports component exists and is functional. + * @return {Promise} + */ +async function __testVulnerabilityCheckShowReportsExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_vulnerability_check__show_reports'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_vulnerability_check__show_reports', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_vulnerability_check__show_reports"]'); + expect(label).not.toBeNull(); + + // Check help icon exists + const helpIcon = await jestState.page.$('i[data-setting="vulnerability_check__show_reports"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test VulnerabilityCheckShowReports checkbox toggle. + * @return {Promise} + */ +async function __testVulnerabilityCheckShowReportsToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_vulnerability_check__show_reports'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test AdminBarShow component exists and is functional. + * @return {Promise} + */ +async function __testAdminBarShowExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_admin_bar__show'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_admin_bar__show', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_admin_bar__show"]'); + expect(label).not.toBeNull(); +} + +/** + * Test AdminBarShow toggles child admin bar sub-settings. + * @return {Promise} + */ +async function __testAdminBarShowDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_admin_bar__show'; + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const childSelectors = [ + '#spbc_setting_admin_bar__admins_online_counter', + '#spbc_setting_admin_bar__brute_force_counter', + '#spbc_setting_admin_bar__firewall_counter', + ]; + + // Ensure children exist + for (const selector of childSelectors) { + const child = await jestState.page.$(selector); + expect(child).not.toBeNull(); + } + + // Toggle off parent and expect children disabled + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(true); + } + + // Toggle on parent and expect children enabled + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(false); + } +} + +/** + * Test AdminBarAdminsOnlineCounter component exists. + * @return {Promise} + */ +async function __testAdminBarAdminsOnlineCounterExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_admin_bar__admins_online_counter'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_admin_bar__admins_online_counter', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check it is rendered inside a sub_setting wrapper + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_admin_bar__admins_online_counter'); + expect(subSetting).not.toBeNull(); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_admin_bar__admins_online_counter"]'); + expect(label).not.toBeNull(); + + // Check help icon exists + const helpIcon = await jestState.page.$('i[data-setting="admin_bar__admins_online_counter"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test AdminBarBruteForceCounter component exists. + * @return {Promise} + */ +async function __testAdminBarBruteForceCounterExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_admin_bar__brute_force_counter'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_admin_bar__brute_force_counter', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check it is rendered inside a sub_setting wrapper + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_admin_bar__brute_force_counter'); + expect(subSetting).not.toBeNull(); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_admin_bar__brute_force_counter"]'); + expect(label).not.toBeNull(); +} + +/** + * Test AdminBarFirewallCounter component exists. + * @return {Promise} + */ +async function __testAdminBarFirewallCounterExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_admin_bar__firewall_counter'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_admin_bar__firewall_counter', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check it is rendered inside a sub_setting wrapper + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_admin_bar__firewall_counter'); + expect(subSetting).not.toBeNull(); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_admin_bar__firewall_counter"]'); + expect(label).not.toBeNull(); +} + +/** + * Test WPDashboardWidgetShow component exists and is functional. + * @return {Promise} + */ +async function __testWPDashboardWidgetShowExists() { + await navigateToSettingsPage(); + + const checkbox = await jestState.page.$('#spbc_setting_wp__dashboard_widget__show'); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval('#spbc_setting_wp__dashboard_widget__show', el => el.type); + expect(inputType).toBe('checkbox'); + + // Check label exists + const label = await jestState.page.$('label[for="spbc_setting_wp__dashboard_widget__show"]'); + expect(label).not.toBeNull(); +} + +/** + * Test WPDashboardWidgetShow checkbox toggle. + * @return {Promise} + */ +async function __testWPDashboardWidgetShowToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__dashboard_widget__show'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test UploadCheckerFiles component exists and toggles dependency. + * @return {Promise} + */ +async function __testUploadCheckerFilesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_upload_checker__file_check'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test UploadCheckerFiles toggles UploadCheckerModules dependency. + * @return {Promise} + */ +async function __testUploadCheckerFilesDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_upload_checker__file_check'; + const childSelector = '#spbc_setting_upload_checker__do_check_wordpress_modules'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test UploadCheckerModules component exists. + * @return {Promise} + */ +async function __testUploadCheckerModulesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_upload_checker__do_check_wordpress_modules'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_upload_checker__do_check_wordpress_modules'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test TrafficControlEnabled component exists and toggles children. + * @return {Promise} + */ +async function __testTrafficControlEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_traffic_control__enabled'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test TrafficControlEnabled toggles child sub-settings. + * @return {Promise} + */ +async function __testTrafficControlEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_traffic_control__enabled'; + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const childSelectors = [ + '#spbc_setting_traffic_control__autoblock_timeframe', + '#spbc_setting_traffic_control__autoblock_amount', + '#spbc_setting_traffic_control__autoblock_period', + '#spbc_setting_traffic_control__exclude_authorised_users', + ]; + + for (const selector of childSelectors) { + const child = await jestState.page.$(selector); + expect(child).not.toBeNull(); + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(true); + } + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(false); + } +} + +/** + * Test TrafficControlAutoblockTimeframe select exists with options. + * @return {Promise} + */ +async function __testTrafficControlAutoblockTimeframeExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_traffic_control__autoblock_timeframe'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); + + const options = await jestState.page.$$eval( + `${selector} option`, + opts => opts.map(opt => opt.value), + ); + + expect(options).toContain('60'); + expect(options).toContain('300'); + expect(options).toContain('3600'); +} + +/** + * Test TrafficControlAutoblockAmount text input exists. + * @return {Promise} + */ +async function __testTrafficControlAutoblockAmountExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_traffic_control__autoblock_amount'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('text'); +} + +/** + * Test TrafficControlAutoblockPeriod select exists with options. + * @return {Promise} + */ +async function __testTrafficControlAutoblockPeriodExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_traffic_control__autoblock_period'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); + + const options = await jestState.page.$$eval( + `${selector} option`, + opts => opts.map(opt => opt.value), + ); + + expect(options).toContain('60'); + expect(options).toContain('3600'); + expect(options).toContain('86400'); +} + +/** + * Test TrafficControlExcludeAuthorizedUsers component exists. + * @return {Promise} + */ +async function __testTrafficControlExcludeAuthorizedUsersExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_traffic_control__exclude_authorised_users'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_traffic_control__exclude_authorised_users'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test VisitorIPFromHeader select exists. + * @return {Promise} + */ +async function __testVisitorIPFromHeaderExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_secfw__get_ip'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); +} + +/** + * Test CDNCheckerEnabled component exists. + * @return {Promise} + */ +async function __testCDNCheckerEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_secfw__get_ip__enable_cdn_auto_self_check'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerAutoStartEnabled component exists. + * @return {Promise} + */ +async function __testScannerAutoStartEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__auto_start'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerAutoStartEnabled toggles dependencies. + * @return {Promise} + */ +async function __testScannerAutoStartEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__auto_start'; + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const childSelectors = [ + '#spbc_setting_scanner__auto_start__set_period', + '#spbc_setting_scanner__auto_start_manual', + ]; + + for (const selector of childSelectors) { + const child = await jestState.page.$(selector); + expect(child).not.toBeNull(); + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(true); + } + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(false); + } +} + +/** + * Test ScannerAutoStartPeriod select exists with options. + * @return {Promise} + */ +async function __testScannerAutoStartPeriodExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__auto_start__set_period'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); + + const options = await jestState.page.$$eval( + `${selector} option`, + opts => opts.map(opt => opt.value), + ); + + expect(options).toContain('86400'); + expect(options).toContain('604800'); + expect(options).toContain('2592000'); +} + +/** + * Test ScannerAutoStartManual component exists and has dependency. + * @return {Promise} + */ +async function __testScannerAutoStartManualExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__auto_start_manual'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test OutboundLinksEnabled component exists. + * @return {Promise} + */ +async function __testOutboundLinksEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__outbound_links'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test OutboundLinksEnabled toggles mirrors dependency. + * @return {Promise} + */ +async function __testOutboundLinksEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__outbound_links'; + const childSelector = '#spbc_setting_scanner__outbound_links_mirrors'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test ScannerImportantFilesListing component exists. + * @return {Promise} + */ +async function __testScannerImportantFilesListingExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__important_files_listing'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerHeuristicAnalysis component exists. + * @return {Promise} + */ +async function __testScannerHeuristicAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__heuristic_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerHeuristicAnalysis toggles auto-send dependency. + * @return {Promise} + */ +async function __testScannerHeuristicAnalysisDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__heuristic_analysis'; + const childSelector = '#spbc_setting_scanner__schedule_send_heuristic_suspicious_files'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + // Child may not be rendered depending on plugin configuration + if (!child) { + return; + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test ScannerSignatureAnalysis component exists. + * @return {Promise} + */ +async function __testScannerSignatureAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__signature_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerBinaryAnalysis component exists. + * @return {Promise} + */ +async function __testScannerBinaryAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__binary_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerOSCronAnalysis component exists. + * @return {Promise} + */ +async function __testScannerOSCronAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__os_cron_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerDBTriggerAnalysis component exists. + * @return {Promise} + */ +async function __testScannerDBTriggerAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__db_trigger_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerCureMalware component exists. + * @return {Promise} + */ +async function __testScannerCureMalwareExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__auto_cure'; + const checkbox = await jestState.page.$(selector); + // This setting may not be available depending on plugin configuration + if (!checkbox) { + return; + } + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerFrontendAnalysis component exists. + * @return {Promise} + */ +async function __testScannerFrontendAnalysisExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__frontend_analysis'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerFrontendAnalysis toggles CSRF dependency. + * @return {Promise} + */ +async function __testScannerFrontendAnalysisDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__frontend_analysis'; + const childSelector = '#spbc_setting_scanner__frontend_analysis__csrf'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + // Child may not be rendered or may not use disabled state + if (!child) { + return; + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + // Some dependencies use visibility instead of disabled state + if (!isDisabled) { + return; + } + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test ScannerListUnknownFiles component exists. + * @return {Promise} + */ +async function __testScannerListUnknownFilesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__list_unknown'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerListUnknownFiles toggles older_than dependency. + * @return {Promise} + */ +async function __testScannerListUnknownFilesDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__list_unknown'; + const childSelector = '#spbc_setting_scanner__list_unknown__older_than'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test ScannerFSWatcherEnabled component exists. + * @return {Promise} + */ +async function __testScannerFSWatcherEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__fs_watcher'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerFSWatcherEnabled toggles snapshots_period dependency. + * @return {Promise} + */ +async function __testScannerFSWatcherEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_scanner__fs_watcher'; + const childSelector = '#spbc_setting_scanner__fs_watcher__snapshots_period'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test MiscBackendLogsEnable component exists. + * @return {Promise} + */ +async function __testMiscBackendLogsEnableExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__backend_logs_enable'; + const checkbox = await jestState.page.$(selector); + + // Component returns null when backendLogsEnabled is falsy in DataRootContext + if (!checkbox) { + return; + } + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__backend_logs_enable"]'); + expect(label).not.toBeNull(); +} + +/** + * Test MiscBackendLogsEnable checkbox toggle. + * @return {Promise} + */ +async function __testMiscBackendLogsEnableToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__backend_logs_enable'; + const checkbox = await jestState.page.$(selector); + + // Component returns null when backendLogsEnabled is falsy in DataRootContext + if (!checkbox) { + return; + } + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test MiscBackendLogsEnable links contain correct parameters. + * @return {Promise} + */ +async function __testMiscBackendLogsEnableLinks() { + await navigateToSettingsPage(); + + // Get the data-page-data to check context values + const pageData = await jestState.page.$eval('#spbct-page--react', el => { + return JSON.parse(el.getAttribute('data-page-data') || '{}'); + }); + + // Find the description block that contains links (visible when backendLogsEnabled is falsy) + const links = await jestState.page.$$eval( + '#spbc_setting_misc__backend_logs_enable ~ .spbc_settings_description a, ' + + 'label[for="spbc_setting_misc__backend_logs_enable"] ~ .spbc_settings_description a', + anchors => anchors.map(a => ({href: a.href, target: a.target, rel: a.rel})), + ); + + if (links.length >= 2) { + // backendLogsLink should contain user_token and point to backend_logs + const backendLogsAnchor = links.find(l => l.href.includes('backend_logs')); + if (backendLogsAnchor) { + expect(backendLogsAnchor.href).toContain('backend_logs'); + expect(backendLogsAnchor.href).toContain('user_token'); + expect(backendLogsAnchor.target).toBe('_blank'); + } + + // myBillingLink should point to bill/security with package=1 + const billingAnchor = links.find(l => l.href.includes('bill/security')); + if (billingAnchor) { + expect(billingAnchor.href).toContain('bill/security'); + expect(billingAnchor.href).toContain('package=1'); + expect(billingAnchor.target).toBe('_blank'); + } + } + + // Verify the links from page data match what PHP generated + if (pageData.backendLogsLink) { + expect(pageData.backendLogsLink).toContain('backend_logs'); + expect(pageData.backendLogsLink).toContain('user_token'); + } + + if (pageData.myBillingLink) { + expect(pageData.myBillingLink).toContain('bill/security'); + expect(pageData.myBillingLink).toContain('package=1'); + } +} + +/** + * Test MiscPreventLoginsCollecting component exists. + * @return {Promise} + */ +async function __testMiscPreventLoginsCollectingExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__prevent_logins_collecting'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__prevent_logins_collecting"]'); + expect(label).not.toBeNull(); +} + +/** + * Test MiscPreventLoginsCollecting checkbox toggle. + * @return {Promise} + */ +async function __testMiscPreventLoginsCollectingToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__prevent_logins_collecting'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test MiscPreventLoginsCollectingOnPasswordReset component exists. + * @return {Promise} + */ +async function __testMiscPreventLoginsCollectingOnPasswordResetExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__prevent_logins_collecting_on_password_reset'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__prevent_logins_collecting_on_password_reset"]'); + expect(label).not.toBeNull(); +} + +/** + * Test MiscPreventLoginsCollectingOnPasswordReset checkbox toggle. + * @return {Promise} + */ +async function __testMiscPreventLoginsCollectingOnPasswordResetToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__prevent_logins_collecting_on_password_reset'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test MiscShowLinkInLoginForm component exists. + * @return {Promise} + */ +async function __testMiscShowLinkInLoginFormExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__show_link_in_login_form'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__show_link_in_login_form"]'); + expect(label).not.toBeNull(); +} + +/** + * Test MiscShowLinkInLoginForm checkbox toggle. + * @return {Promise} + */ +async function __testMiscShowLinkInLoginFormToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__show_link_in_login_form'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test BfpEnabled component exists and is functional. + * @return {Promise} + */ +async function __testBfpEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_bfp__enabled'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_bfp__enabled"]'); + expect(label).not.toBeNull(); +} + +/** + * Test BfpEnabled toggles child BFP sub-settings. + * @return {Promise} + */ +async function __testBfpEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_bfp__enabled'; + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const childSelectors = [ + '#spbc_setting_bfp__allowed_wrong_auths', + '#spbc_setting_bfp__count_interval', + '#spbc_setting_bfp__block_period__5_fails', + ]; + + for (const selector of childSelectors) { + const child = await jestState.page.$(selector); + expect(child).not.toBeNull(); + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(true); + } + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(false); + } +} + +/** + * Test CheckPassRoles select component exists. + * @return {Promise} + */ +async function __testCheckPassRolesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_check_pass__roles'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); + + const isMultiple = await jestState.page.$eval(selector, el => el.multiple); + expect(isMultiple).toBe(true); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_check_pass__roles'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test 2faEnable component exists and has radio options. + * @return {Promise} + */ +async function __test2faEnableExists() { + await navigateToSettingsPage(); + + const helpIcon = await jestState.page.$('i[data-setting="2fa__enable"]'); + expect(helpIcon).not.toBeNull(); + + const radioInputs = await jestState.page.$$('input[name*="2fa__enable"]'); + expect(radioInputs.length).toBeGreaterThanOrEqual(3); + + const radioValues = await jestState.page.$$eval( + 'input[name*="2fa__enable"]', + inputs => inputs.map(input => input.value), + ); + + expect(radioValues).toContain('1'); + expect(radioValues).toContain('0'); + expect(radioValues).toContain('-1'); +} + +/** + * Test 2faRoles select component exists. + * @return {Promise} + */ +async function __test2faRolesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_2fa__roles'; + const select = await jestState.page.$(selector); + expect(select).not.toBeNull(); + + const isMultiple = await jestState.page.$eval(selector, el => el.multiple); + expect(isMultiple).toBe(true); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_2fa__roles'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test EditTechSupportUrlEnabled component exists. + * @return {Promise} + */ +async function __testEditTechSupportUrlEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_edit_tech_support_url__enabled'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_edit_tech_support_url__enabled'); + expect(subSetting).not.toBeNull(); + + const label = await jestState.page.$('label[for="spbc_setting_edit_tech_support_url__enabled"]'); + expect(label).not.toBeNull(); +} + +/** + * Test EditTechSupportUrlLink component exists. + * @return {Promise} + */ +async function __testEditTechSupportUrlLinkExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_edit_tech_support_url__link'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('text'); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_edit_tech_support_url__link'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test EditTechSupportUrlRemove component exists. + * @return {Promise} + */ +async function __testEditTechSupportUrlRemoveExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_edit_tech_support_url__remove'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_edit_tech_support_url__remove'); + expect(subSetting).not.toBeNull(); + + const label = await jestState.page.$('label[for="spbc_setting_edit_tech_support_url__remove"]'); + expect(label).not.toBeNull(); +} + +/** + * Test LoginPageRenameEnabled component exists. + * @return {Promise} + */ +async function __testLoginPageRenameEnabledExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_login_page_rename__enabled'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_login_page_rename__enabled"]'); + expect(label).not.toBeNull(); +} + +/** + * Test LoginPageRenameEnabled toggles child sub-settings. + * @return {Promise} + */ +async function __testLoginPageRenameEnabledDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_login_page_rename__enabled'; + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const childSelectors = [ + '#spbc_setting_login_page_rename__name', + '#spbc_setting_login_page_rename__redirect', + '#spbc_setting_login_page_rename__send_email_notification', + ]; + + for (const selector of childSelectors) { + const child = await jestState.page.$(selector); + expect(child).not.toBeNull(); + } + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(true); + } + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + for (const selector of childSelectors) { + const isDisabled = await jestState.page.$eval(selector, el => el.disabled); + expect(isDisabled).toBe(false); + } +} + +/** + * Test LoginPageRenameName component exists. + * @return {Promise} + */ +async function __testLoginPageRenameNameExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_login_page_rename__name'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('text'); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_login_page_rename__name'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test LoginPageRenameRedirect component exists. + * @return {Promise} + */ +async function __testLoginPageRenameRedirectExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_login_page_rename__redirect'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('text'); + + const subSetting = await jestState.page.$('.spbc_sub_setting #spbc_setting_login_page_rename__redirect'); + expect(subSetting).not.toBeNull(); +} + +/** + * Test LoginPageRenameSendEmail component exists. + * @return {Promise} + */ +async function __testLoginPageRenameSendEmailExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_login_page_rename__send_email_notification'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const subSetting = await jestState.page.$( + '.spbc_sub_setting #spbc_setting_login_page_rename__send_email_notification', + ); + expect(subSetting).not.toBeNull(); + + const label = await jestState.page.$( + 'label[for="spbc_setting_login_page_rename__send_email_notification"]', + ); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$( + 'i[data-setting="login_page_rename__send_email_notification"]', + ); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test ActionShuffleSalts component exists. + * @return {Promise} + */ +async function __testActionShuffleSaltsExists() { + await navigateToSettingsPage(); + + const wrapper = await jestState.page.$('#action-shuffle-salts-wrapper'); + + // Setting may not be present in the settings data + if (!wrapper) { + return; + } + + const button = await jestState.page.$('#action-shuffle-salts'); + expect(button).not.toBeNull(); + + const helpIcon = await jestState.page.$('i[data-setting="action_shuffle_salts"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test ScannerAutoStartManualTime component exists. + * @return {Promise} + */ +async function __testScannerAutoStartManualTimeExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__auto_start_manual_time'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('time'); +} + +/** + * Test ScannerAutoStartManualTZ hidden input exists. + * @return {Promise} + */ +async function __testScannerAutoStartManualTZExists() { + await navigateToSettingsPage(); + + const input = await jestState.page.$('input[name*="scanner__auto_start_manual_tz"]'); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval( + 'input[name*="scanner__auto_start_manual_tz"]', + el => el.type, + ); + expect(inputType).toBe('hidden'); +} + +/** + * Test ScannerPathExclusionsView component exists. + * @return {Promise} + */ +async function __testScannerPathExclusionsViewExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__path_exclusions_view'; + const textarea = await jestState.page.$(selector); + expect(textarea).not.toBeNull(); + + const tagName = await jestState.page.$eval(selector, el => el.tagName.toLowerCase()); + expect(tagName).toBe('textarea'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_scanner__path_exclusions_view"]', + ); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$( + 'i[data-setting="scanner__path_exclusions_view"]', + ); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test ScannerFrontendDomainExclusionsView component exists. + * @return {Promise} + */ +async function __testScannerFrontendDomainExclusionsViewExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__frontend_analysis__domains_exclusions_view'; + const textarea = await jestState.page.$(selector); + expect(textarea).not.toBeNull(); + + const tagName = await jestState.page.$eval(selector, el => el.tagName.toLowerCase()); + expect(tagName).toBe('textarea'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_scanner__frontend_analysis__domains_exclusions_view"]', + ); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$( + 'i[data-setting="scanner__frontend_analysis__domains_exclusions_view"]', + ); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test ScannerListApprovedByCleantalk component exists. + * @return {Promise} + */ +async function __testScannerListApprovedByCleantalkExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__list_approved_by_cleantalk'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); +} + +/** + * Test ScannerListApprovedByCleantalk checkbox toggle. + * @return {Promise} + */ +async function __testScannerListApprovedByCleantalkToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_scanner__list_approved_by_cleantalk'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test WpDisableXmlrpc component exists. + * @return {Promise} + */ +async function __testWpDisableXmlrpcExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__disable_xmlrpc'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_wp__disable_xmlrpc"]'); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$('i[data-setting="wp__disable_xmlrpc"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test WpDisableXmlrpc checkbox toggle. + * @return {Promise} + */ +async function __testWpDisableXmlrpcToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__disable_xmlrpc'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test WpDisableRestApi component exists and has radio options. + * @return {Promise} + */ +async function __testWpDisableRestApiExists() { + await navigateToSettingsPage(); + + const helpIcon = await jestState.page.$('i[data-setting="wp__disable_rest_api"]'); + expect(helpIcon).not.toBeNull(); + + const radioInputs = await jestState.page.$$('input[name*="wp__disable_rest_api"]'); + expect(radioInputs.length).toBeGreaterThanOrEqual(3); + + const radioValues = await jestState.page.$$eval( + 'input[name*="wp__disable_rest_api"]', + inputs => inputs.map(input => input.value), + ); + + expect(radioValues).toContain('0'); + expect(radioValues).toContain('1'); + expect(radioValues).toContain('2'); + + const checkedCount = await jestState.page.$$eval( + 'input[name*="wp__disable_rest_api"]', + inputs => inputs.filter(input => input.checked).length, + ); + expect(checkedCount).toBe(1); +} + +/** + * Test DataSetCookies component exists and has radio options. + * @return {Promise} + */ +async function __testDataSetCookiesExists() { + await navigateToSettingsPage(); + + const helpIcon = await jestState.page.$('i[data-setting="data__set_cookies"]'); + expect(helpIcon).not.toBeNull(); + + const radioInputs = await jestState.page.$$('input[name*="data__set_cookies"]'); + expect(radioInputs.length).toBeGreaterThanOrEqual(3); + + const radioValues = await jestState.page.$$eval( + 'input[name*="data__set_cookies"]', + inputs => inputs.map(input => input.value), + ); + + expect(radioValues).toContain('1'); + expect(radioValues).toContain('0'); + expect(radioValues).toContain('2'); + + const checkedCount = await jestState.page.$$eval( + 'input[name*="data__set_cookies"]', + inputs => inputs.filter(input => input.checked).length, + ); + expect(checkedCount).toBe(1); +} + +/** + * Test MiscForbidToShowInIframes component exists. + * @return {Promise} + */ +async function __testMiscForbidToShowInIframesExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__forbid_to_show_in_iframes'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__forbid_to_show_in_iframes"]'); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$('i[data-setting="misc__forbid_to_show_in_iframes"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test MiscForbidToShowInIframes checkbox toggle. + * @return {Promise} + */ +async function __testMiscForbidToShowInIframesToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__forbid_to_show_in_iframes'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test DataAdditionalHeaders component exists. + * @return {Promise} + */ +async function __testDataAdditionalHeadersExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_data__additional_headers'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_data__additional_headers"]'); + expect(label).not.toBeNull(); + + const helpIcon = await jestState.page.$('i[data-setting="data__additional_headers"]'); + expect(helpIcon).not.toBeNull(); +} + +/** + * Test DataAdditionalHeaders checkbox toggle. + * @return {Promise} + */ +async function __testDataAdditionalHeadersToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_data__additional_headers'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test WPUploadDirPreventPhpExecution component exists. + * @return {Promise} + */ +async function __testWPUploadDirPreventPhpExecutionExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__upload_dir_prevent_php_execution'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_wp__upload_dir_prevent_php_execution"]', + ); + expect(label).not.toBeNull(); +} + +/** + * Test WPUploadDirPreventPhpExecution checkbox toggle. + * @return {Promise} + */ +async function __testWPUploadDirPreventPhpExecutionToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__upload_dir_prevent_php_execution'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test WPUseBuiltinHttpApi component exists. + * @return {Promise} + */ +async function __testWPUseBuiltinHttpApiExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__use_builtin_http_api'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_wp__use_builtin_http_api"]'); + expect(label).not.toBeNull(); +} + +/** + * Test WPUseBuiltinHttpApi checkbox toggle. + * @return {Promise} + */ +async function __testWPUseBuiltinHttpApiToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_wp__use_builtin_http_api'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test MiscDisableFileEditor component exists and has radio options. + * @return {Promise} + */ +async function __testMiscDisableFileEditorExists() { + await navigateToSettingsPage(); + + const helpIcon = await jestState.page.$('i[data-setting="misc_disable_file_editor"]'); + expect(helpIcon).not.toBeNull(); + + const radioInputs = await jestState.page.$$('input[name*="misc_disable_file_editor"]'); + // May be rendered as radio group or as notice if multisite-controlled + if (radioInputs.length > 0) { + expect(radioInputs.length).toBeGreaterThanOrEqual(3); + + const radioValues = await jestState.page.$$eval( + 'input[name*="misc_disable_file_editor"]', + inputs => inputs.map(input => input.value), + ); + + expect(radioValues).toContain('0'); + expect(radioValues).toContain('1'); + expect(radioValues).toContain('2'); + } +} + +/** + * Test MiscCompleteDeactivation component exists. + * @return {Promise} + */ +async function __testMiscCompleteDeactivationExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__complete_deactivation'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$('label[for="spbc_setting_misc__complete_deactivation"]'); + expect(label).not.toBeNull(); +} + +/** + * Test MiscCompleteDeactivation checkbox toggle. + * @return {Promise} + */ +async function __testMiscCompleteDeactivationToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_misc__complete_deactivation'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test MonitoringUsers hidden input exists. + * @return {Promise} + */ +async function __testMonitoringUsersExists() { + await navigateToSettingsPage(); + + const input = await jestState.page.$('input[name*="monitoring__users"]'); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval( + 'input[name*="monitoring__users"]', + el => el.type, + ); + expect(inputType).toBe('hidden'); +} + +/** + * Test SPBCTrustedAndAffiliateShortcode component exists. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateShortcodeExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__shortcode'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_spbc_trusted_and_affiliate__shortcode"]', + ); + expect(label).not.toBeNull(); +} + +/** + * Test SPBCTrustedAndAffiliateShortcode toggles shortcode_tag dependency. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateShortcodeDependencies() { + await navigateToSettingsPage(); + + const parentSelector = '#spbc_setting_spbc_trusted_and_affiliate__shortcode'; + const childSelector = '#spbc_setting_spbc_trusted_and_affiliate__shortcode_tag'; + + await jestState.page.waitForSelector(parentSelector, {timeout: 10000}); + + const child = await jestState.page.$(childSelector); + expect(child).not.toBeNull(); + + const parentChecked = await jestState.page.$eval(parentSelector, el => el.checked); + if (parentChecked) { + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + const isDisabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isDisabled).toBe(true); + + await jestState.page.click(parentSelector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const isEnabled = await jestState.page.$eval(childSelector, el => el.disabled); + expect(isEnabled).toBe(false); +} + +/** + * Test SPBCTrustedAndAffiliateShortcodeTag component exists. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateShortcodeTagExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__shortcode_tag'; + const input = await jestState.page.$(selector); + expect(input).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('text'); + + const isReadonly = await jestState.page.$eval(selector, el => el.readOnly); + expect(isReadonly).toBe(true); + + const value = await jestState.page.$eval(selector, el => el.value); + expect(value).toContain('[cleantalk_security_affiliate_link]'); + + const subSetting = await jestState.page.$( + '.spbc_sub_setting #spbc_setting_spbc_trusted_and_affiliate__shortcode_tag', + ); + expect(subSetting).not.toBeNull(); +} + +/** + * Test SPBCTrustedAndAffiliateFooter component exists. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateFooterExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__footer'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_spbc_trusted_and_affiliate__footer"]', + ); + expect(label).not.toBeNull(); +} + +/** + * Test SPBCTrustedAndAffiliateFooter checkbox toggle. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateFooterToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__footer'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + +/** + * Test SPBCTrustedAndAffiliateAddId component exists. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateAddIdExists() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__add_id'; + const checkbox = await jestState.page.$(selector); + expect(checkbox).not.toBeNull(); + + const inputType = await jestState.page.$eval(selector, el => el.type); + expect(inputType).toBe('checkbox'); + + const label = await jestState.page.$( + 'label[for="spbc_setting_spbc_trusted_and_affiliate__add_id"]', + ); + expect(label).not.toBeNull(); +} + +/** + * Test SPBCTrustedAndAffiliateAddId checkbox toggle. + * @return {Promise} + */ +async function __testSPBCTrustedAndAffiliateAddIdToggle() { + await navigateToSettingsPage(); + + const selector = '#spbc_setting_spbc_trusted_and_affiliate__add_id'; + await jestState.page.waitForSelector(selector, {timeout: 10000}); + + const initialChecked = await jestState.page.$eval(selector, el => el.checked); + + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const afterToggle = await jestState.page.$eval(selector, el => el.checked); + expect(afterToggle).toBe(!initialChecked); + + // Toggle back + await jestState.page.click(selector); + await new Promise(resolve => setTimeout(resolve, 300)); + + const restored = await jestState.page.$eval(selector, el => el.checked); + expect(restored).toBe(initialChecked); +} + /** * Run settings Tab tests. * This test is a wrapper for group of tests. @@ -369,6 +2589,14 @@ export function groupSettingsTab(doLogin = true) { }, jestState.globals.globalTimeout); // BFP component tests + test('BFP ENABLED EXISTS', async () => { + await __testBfpEnabledExists(); + }, jestState.globals.globalTimeout); + + test('BFP ENABLED DEPENDENCIES', async () => { + await __testBfpEnabledDependencies(); + }, jestState.globals.globalTimeout); + test('BFP COMPONENTS EXIST', async () => { await __testBfpComponentsExist(); }, jestState.globals.globalTimeout); @@ -398,6 +2626,59 @@ export function groupSettingsTab(doLogin = true) { await __testCheckPassEnableRadioToggle(); }, jestState.globals.globalTimeout); + // CheckPassRoles tests + test('CHECK PASS ROLES EXISTS', async () => { + await __testCheckPassRolesExists(); + }, jestState.globals.globalTimeout); + + // 2FA tests + test('2FA ENABLE EXISTS', async () => { + await __test2faEnableExists(); + }, jestState.globals.globalTimeout); + + test('2FA ROLES EXISTS', async () => { + await __test2faRolesExists(); + }, jestState.globals.globalTimeout); + + // Edit Tech Support URL tests + test('EDIT TECH SUPPORT URL ENABLED EXISTS', async () => { + await __testEditTechSupportUrlEnabledExists(); + }, jestState.globals.globalTimeout); + + test('EDIT TECH SUPPORT URL LINK EXISTS', async () => { + await __testEditTechSupportUrlLinkExists(); + }, jestState.globals.globalTimeout); + + test('EDIT TECH SUPPORT URL REMOVE EXISTS', async () => { + await __testEditTechSupportUrlRemoveExists(); + }, jestState.globals.globalTimeout); + + // Login Page Rename tests + test('LOGIN PAGE RENAME ENABLED EXISTS', async () => { + await __testLoginPageRenameEnabledExists(); + }, jestState.globals.globalTimeout); + + test('LOGIN PAGE RENAME ENABLED DEPENDENCIES', async () => { + await __testLoginPageRenameEnabledDependencies(); + }, jestState.globals.globalTimeout); + + test('LOGIN PAGE RENAME NAME EXISTS', async () => { + await __testLoginPageRenameNameExists(); + }, jestState.globals.globalTimeout); + + test('LOGIN PAGE RENAME REDIRECT EXISTS', async () => { + await __testLoginPageRenameRedirectExists(); + }, jestState.globals.globalTimeout); + + test('LOGIN PAGE RENAME SEND EMAIL EXISTS', async () => { + await __testLoginPageRenameSendEmailExists(); + }, jestState.globals.globalTimeout); + + // Action Shuffle Salts tests + test('ACTION SHUFFLE SALTS EXISTS', async () => { + await __testActionShuffleSaltsExists(); + }, jestState.globals.globalTimeout); + // Group anchor tests test('AUTH GROUP ANCHOR EXISTS', async () => { await __testAuthGroupAnchor(); @@ -415,4 +2696,345 @@ export function groupSettingsTab(doLogin = true) { test('WAF DEPENDENCIES TOGGLE', async () => { await __testWafDependenciesToggle(); }, jestState.globals.globalTimeout); + + // Upload Checker component tests + test('UPLOAD CHECKER FILES EXISTS', async () => { + await __testUploadCheckerFilesExists(); + }, jestState.globals.globalTimeout); + + test('UPLOAD CHECKER FILES DEPENDENCIES', async () => { + await __testUploadCheckerFilesDependencies(); + }, jestState.globals.globalTimeout); + + test('UPLOAD CHECKER MODULES EXISTS', async () => { + await __testUploadCheckerModulesExists(); + }, jestState.globals.globalTimeout); + + // Traffic Control component tests + test('TRAFFIC CONTROL ENABLED EXISTS', async () => { + await __testTrafficControlEnabledExists(); + }, jestState.globals.globalTimeout); + + test('TRAFFIC CONTROL ENABLED DEPENDENCIES', async () => { + await __testTrafficControlEnabledDependencies(); + }, jestState.globals.globalTimeout); + + test('TRAFFIC CONTROL AUTOBLOCK TIMEFRAME EXISTS', async () => { + await __testTrafficControlAutoblockTimeframeExists(); + }, jestState.globals.globalTimeout); + + test('TRAFFIC CONTROL AUTOBLOCK AMOUNT EXISTS', async () => { + await __testTrafficControlAutoblockAmountExists(); + }, jestState.globals.globalTimeout); + + test('TRAFFIC CONTROL AUTOBLOCK PERIOD EXISTS', async () => { + await __testTrafficControlAutoblockPeriodExists(); + }, jestState.globals.globalTimeout); + + test('TRAFFIC CONTROL EXCLUDE AUTHORIZED USERS EXISTS', async () => { + await __testTrafficControlExcludeAuthorizedUsersExists(); + }, jestState.globals.globalTimeout); + + // Visitor IP and CDN tests + test('VISITOR IP FROM HEADER EXISTS', async () => { + await __testVisitorIPFromHeaderExists(); + }, jestState.globals.globalTimeout); + + test('CDN CHECKER ENABLED EXISTS', async () => { + await __testCDNCheckerEnabledExists(); + }, jestState.globals.globalTimeout); + + // Scanner component tests + test('SCANNER AUTO START ENABLED EXISTS', async () => { + await __testScannerAutoStartEnabledExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER AUTO START ENABLED DEPENDENCIES', async () => { + await __testScannerAutoStartEnabledDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER AUTO START PERIOD EXISTS', async () => { + await __testScannerAutoStartPeriodExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER AUTO START MANUAL EXISTS', async () => { + await __testScannerAutoStartManualExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER AUTO START MANUAL TIME EXISTS', async () => { + await __testScannerAutoStartManualTimeExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER AUTO START MANUAL TZ EXISTS', async () => { + await __testScannerAutoStartManualTZExists(); + }, jestState.globals.globalTimeout); + + test('OUTBOUND LINKS ENABLED EXISTS', async () => { + await __testOutboundLinksEnabledExists(); + }, jestState.globals.globalTimeout); + + test('OUTBOUND LINKS ENABLED DEPENDENCIES', async () => { + await __testOutboundLinksEnabledDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER IMPORTANT FILES LISTING EXISTS', async () => { + await __testScannerImportantFilesListingExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER HEURISTIC ANALYSIS EXISTS', async () => { + await __testScannerHeuristicAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER HEURISTIC ANALYSIS DEPENDENCIES', async () => { + await __testScannerHeuristicAnalysisDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER SIGNATURE ANALYSIS EXISTS', async () => { + await __testScannerSignatureAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER BINARY ANALYSIS EXISTS', async () => { + await __testScannerBinaryAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER OS CRON ANALYSIS EXISTS', async () => { + await __testScannerOSCronAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER DB TRIGGER ANALYSIS EXISTS', async () => { + await __testScannerDBTriggerAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER PATH EXCLUSIONS VIEW EXISTS', async () => { + await __testScannerPathExclusionsViewExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER CURE MALWARE EXISTS', async () => { + await __testScannerCureMalwareExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER FRONTEND ANALYSIS EXISTS', async () => { + await __testScannerFrontendAnalysisExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER FRONTEND ANALYSIS DEPENDENCIES', async () => { + await __testScannerFrontendAnalysisDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER FRONTEND DOMAIN EXCLUSIONS VIEW EXISTS', async () => { + await __testScannerFrontendDomainExclusionsViewExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER LIST UNKNOWN FILES EXISTS', async () => { + await __testScannerListUnknownFilesExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER LIST UNKNOWN FILES DEPENDENCIES', async () => { + await __testScannerListUnknownFilesDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER FS WATCHER ENABLED EXISTS', async () => { + await __testScannerFSWatcherEnabledExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER FS WATCHER ENABLED DEPENDENCIES', async () => { + await __testScannerFSWatcherEnabledDependencies(); + }, jestState.globals.globalTimeout); + + test('SCANNER LIST APPROVED BY CLEANTALK EXISTS', async () => { + await __testScannerListApprovedByCleantalkExists(); + }, jestState.globals.globalTimeout); + + test('SCANNER LIST APPROVED BY CLEANTALK TOGGLE', async () => { + await __testScannerListApprovedByCleantalkToggle(); + }, jestState.globals.globalTimeout); + + // Vulnerability Check component tests + test('VULNERABILITY CHECK TEST BEFORE INSTALL EXISTS', async () => { + await __testVulnerabilityCheckTestBeforeInstallExists(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK TEST BEFORE INSTALL TOGGLE', async () => { + await __testVulnerabilityCheckTestBeforeInstallToggle(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK ENABLE CRON EXISTS', async () => { + await __testVulnerabilityCheckEnableCronExists(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK ENABLE CRON DEPENDENCIES', async () => { + await __testVulnerabilityCheckEnableCronDependencies(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK WARN ON MODULES PAGES EXISTS', async () => { + await __testVulnerabilityCheckWarnOnModulesPagesExists(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK SHOW REPORTS EXISTS', async () => { + await __testVulnerabilityCheckShowReportsExists(); + }, jestState.globals.globalTimeout); + + test('VULNERABILITY CHECK SHOW REPORTS TOGGLE', async () => { + await __testVulnerabilityCheckShowReportsToggle(); + }, jestState.globals.globalTimeout); + + // Admin Bar component tests + test('ADMIN BAR SHOW EXISTS', async () => { + await __testAdminBarShowExists(); + }, jestState.globals.globalTimeout); + + test('ADMIN BAR SHOW DEPENDENCIES', async () => { + await __testAdminBarShowDependencies(); + }, jestState.globals.globalTimeout); + + test('ADMIN BAR ADMINS ONLINE COUNTER EXISTS', async () => { + await __testAdminBarAdminsOnlineCounterExists(); + }, jestState.globals.globalTimeout); + + test('ADMIN BAR BRUTE FORCE COUNTER EXISTS', async () => { + await __testAdminBarBruteForceCounterExists(); + }, jestState.globals.globalTimeout); + + test('ADMIN BAR FIREWALL COUNTER EXISTS', async () => { + await __testAdminBarFirewallCounterExists(); + }, jestState.globals.globalTimeout); + + // WP Dashboard Widget tests + test('WP DASHBOARD WIDGET SHOW EXISTS', async () => { + await __testWPDashboardWidgetShowExists(); + }, jestState.globals.globalTimeout); + + test('WP DASHBOARD WIDGET SHOW TOGGLE', async () => { + await __testWPDashboardWidgetShowToggle(); + }, jestState.globals.globalTimeout); + + // Misc component tests + test('MISC BACKEND LOGS ENABLE EXISTS', async () => { + await __testMiscBackendLogsEnableExists(); + }, jestState.globals.globalTimeout); + + test('MISC BACKEND LOGS ENABLE TOGGLE', async () => { + await __testMiscBackendLogsEnableToggle(); + }, jestState.globals.globalTimeout); + + test('MISC BACKEND LOGS ENABLE LINKS', async () => { + await __testMiscBackendLogsEnableLinks(); + }, jestState.globals.globalTimeout); + + test('MISC PREVENT LOGINS COLLECTING EXISTS', async () => { + await __testMiscPreventLoginsCollectingExists(); + }, jestState.globals.globalTimeout); + + test('MISC PREVENT LOGINS COLLECTING TOGGLE', async () => { + await __testMiscPreventLoginsCollectingToggle(); + }, jestState.globals.globalTimeout); + + test('MISC PREVENT LOGINS COLLECTING ON PASSWORD RESET EXISTS', async () => { + await __testMiscPreventLoginsCollectingOnPasswordResetExists(); + }, jestState.globals.globalTimeout); + + test('MISC PREVENT LOGINS COLLECTING ON PASSWORD RESET TOGGLE', async () => { + await __testMiscPreventLoginsCollectingOnPasswordResetToggle(); + }, jestState.globals.globalTimeout); + + test('MISC SHOW LINK IN LOGIN FORM EXISTS', async () => { + await __testMiscShowLinkInLoginFormExists(); + }, jestState.globals.globalTimeout); + + test('MISC SHOW LINK IN LOGIN FORM TOGGLE', async () => { + await __testMiscShowLinkInLoginFormToggle(); + }, jestState.globals.globalTimeout); + + test('WP DISABLE XMLRPC EXISTS', async () => { + await __testWpDisableXmlrpcExists(); + }, jestState.globals.globalTimeout); + + test('WP DISABLE XMLRPC TOGGLE', async () => { + await __testWpDisableXmlrpcToggle(); + }, jestState.globals.globalTimeout); + + test('WP DISABLE REST API EXISTS', async () => { + await __testWpDisableRestApiExists(); + }, jestState.globals.globalTimeout); + + test('DATA SET COOKIES EXISTS', async () => { + await __testDataSetCookiesExists(); + }, jestState.globals.globalTimeout); + + test('MISC FORBID TO SHOW IN IFRAMES EXISTS', async () => { + await __testMiscForbidToShowInIframesExists(); + }, jestState.globals.globalTimeout); + + test('MISC FORBID TO SHOW IN IFRAMES TOGGLE', async () => { + await __testMiscForbidToShowInIframesToggle(); + }, jestState.globals.globalTimeout); + + test('DATA ADDITIONAL HEADERS EXISTS', async () => { + await __testDataAdditionalHeadersExists(); + }, jestState.globals.globalTimeout); + + test('DATA ADDITIONAL HEADERS TOGGLE', async () => { + await __testDataAdditionalHeadersToggle(); + }, jestState.globals.globalTimeout); + + test('WP UPLOAD DIR PREVENT PHP EXECUTION EXISTS', async () => { + await __testWPUploadDirPreventPhpExecutionExists(); + }, jestState.globals.globalTimeout); + + test('WP UPLOAD DIR PREVENT PHP EXECUTION TOGGLE', async () => { + await __testWPUploadDirPreventPhpExecutionToggle(); + }, jestState.globals.globalTimeout); + + test('WP USE BUILTIN HTTP API EXISTS', async () => { + await __testWPUseBuiltinHttpApiExists(); + }, jestState.globals.globalTimeout); + + test('WP USE BUILTIN HTTP API TOGGLE', async () => { + await __testWPUseBuiltinHttpApiToggle(); + }, jestState.globals.globalTimeout); + + test('MISC DISABLE FILE EDITOR EXISTS', async () => { + await __testMiscDisableFileEditorExists(); + }, jestState.globals.globalTimeout); + + test('MISC COMPLETE DEACTIVATION EXISTS', async () => { + await __testMiscCompleteDeactivationExists(); + }, jestState.globals.globalTimeout); + + test('MISC COMPLETE DEACTIVATION TOGGLE', async () => { + await __testMiscCompleteDeactivationToggle(); + }, jestState.globals.globalTimeout); + + test('MONITORING USERS EXISTS', async () => { + await __testMonitoringUsersExists(); + }, jestState.globals.globalTimeout); + + // Trusted and Affiliate component tests + test('SPBC TRUSTED AND AFFILIATE SHORTCODE EXISTS', async () => { + await __testSPBCTrustedAndAffiliateShortcodeExists(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE SHORTCODE DEPENDENCIES', async () => { + await __testSPBCTrustedAndAffiliateShortcodeDependencies(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE SHORTCODE TAG EXISTS', async () => { + await __testSPBCTrustedAndAffiliateShortcodeTagExists(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE FOOTER EXISTS', async () => { + await __testSPBCTrustedAndAffiliateFooterExists(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE FOOTER TOGGLE', async () => { + await __testSPBCTrustedAndAffiliateFooterToggle(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE ADD ID EXISTS', async () => { + await __testSPBCTrustedAndAffiliateAddIdExists(); + }, jestState.globals.globalTimeout); + + test('SPBC TRUSTED AND AFFILIATE ADD ID TOGGLE', async () => { + await __testSPBCTrustedAndAffiliateAddIdToggle(); + }, jestState.globals.globalTimeout); } diff --git a/spec/form.spec.js b/spec/form.spec.js index ecb74b420..87936f09c 100644 --- a/spec/form.spec.js +++ b/spec/form.spec.js @@ -50,12 +50,18 @@ beforeAll(async () => { args: [ '--no-sandbox', '--disable-setuid-sandbox', + '--disable-features=PasswordManagerOnboarding', + '--disable-save-password-bubble', + '--disable-autofill-keyboard-accessory-view', + '--ignore-certificate-errors', `--window-size=${jestState.globals.browserWidth},${jestState.globals.browserHeight}`, ], + ignoreHTTPSErrors: true, }; - // Only use custom Chrome if specified and remote debugging is allowed - // Comment out the next line if you get "DevTools remote debugging is disallowed" error - // launchOptions.executablePath = jestState.envData.chrome_executable; + // Only set custom Chrome executable if provided + if (jestState.envData.chrome_executable) { + launchOptions.executablePath = jestState.envData.chrome_executable; + } jestState.browser = await puppeteer.launch(launchOptions); // prepare browser page diff --git a/spec/utils.js b/spec/utils.js index f3cfce395..22a657713 100644 --- a/spec/utils.js +++ b/spec/utils.js @@ -21,7 +21,7 @@ dotenv.config({path: '.env'}); */ export function getEnvData() { const envData = { - root: process.env.JEST_VAR__APP_ROOT, + root: (process.env.JEST_VAR__APP_ROOT || '').replace(/\/+$/, ''), wp_login: process.env.JEST_VAR__WP_LOGIN, wp_password: process.env.JEST_VAR__WP_PASSWORD, chrome_executable: process.env.JEST_VAR__CHROME_EXECUTABLE, diff --git a/tests/lib/CleantalkSP/SpbctWP/Firewall/WAFHasSignatureTest.php b/tests/lib/CleantalkSP/SpbctWP/Firewall/WAFHasSignatureTest.php new file mode 100644 index 000000000..bb60a360a --- /dev/null +++ b/tests/lib/CleantalkSP/SpbctWP/Firewall/WAFHasSignatureTest.php @@ -0,0 +1,183 @@ +hasSignature = new ReflectionMethod(WAF::class, 'hasSignature'); + $this->hasSignature->setAccessible(true); + + $this->isUnsafeCatchAllSignature = new ReflectionMethod(WAF::class, 'isUnsafeCatchAllSignature'); + $this->isUnsafeCatchAllSignature->setAccessible(true); + + // Reset cached HTTP headers between tests + HTTP::getInstance()->http_headers = array(); + } + + protected function tearDown(): void + { + HTTP::getInstance()->http_headers = array(); + unset($_SERVER['HTTP_USER_AGENT']); + parent::tearDown(); + } + + /** + * @param string $data + * @param array $signature + * + * @return bool + */ + private function callHasSignature($data, array $signature) + { + return $this->hasSignature->invoke(null, $data, $signature); + } + + /** + * Incident #4471: catch-all body without headers must not match. + */ + public function testCatchAllWithoutHeadersDoesNotMatch() + { + $signature = array( + 'body' => '#.*#', + 'waf_headers' => null, + 'waf_url' => null, + ); + + $this->assertFalse($this->callHasSignature('', $signature)); + $this->assertFalse($this->callHasSignature('anything', $signature)); + $this->assertFalse($this->callHasSignature('?page=1', $signature)); + } + + /** + * Empty string headers are treated the same as NULL. + */ + public function testCatchAllWithEmptyHeadersDoesNotMatch() + { + $signature = array( + 'body' => '#.*#', + 'waf_headers' => '', + 'waf_url' => '', + ); + + $this->assertFalse($this->callHasSignature('query', $signature)); + } + + /** + * Catch-all with modifiers must also be rejected without constraints. + */ + public function testCatchAllWithModifiersWithoutHeadersDoesNotMatch() + { + $signature = array( + 'body' => '#.*#i', + 'waf_headers' => null, + 'waf_url' => null, + ); + + $this->assertFalse($this->callHasSignature('query', $signature)); + } + + /** + * Catch-all is valid when constrained by matching request headers. + */ + public function testCatchAllWithMatchingHeadersDoesMatch() + { + $_SERVER['HTTP_USER_AGENT'] = 'WPSCAN'; + HTTP::getInstance()->http_headers = array(); + + $signature = array( + 'body' => '#.*#', + 'waf_headers' => json_encode(array('User-Agent' => 'WPSCAN')), + 'waf_url' => null, + ); + + $this->assertTrue($this->callHasSignature('', $signature)); + $this->assertTrue($this->callHasSignature('any-query', $signature)); + } + + /** + * Catch-all with headers that do not match the request must not fire. + */ + public function testCatchAllWithNonMatchingHeadersDoesNotMatch() + { + $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0'; + HTTP::getInstance()->http_headers = array(); + + $signature = array( + 'body' => '#.*#', + 'waf_headers' => json_encode(array('User-Agent' => 'WPSCAN')), + 'waf_url' => null, + ); + + $this->assertFalse($this->callHasSignature('any-query', $signature)); + } + + /** + * Narrow regexp without headers must still work (not a catch-all). + */ + public function testNarrowRegexpWithoutHeadersStillMatches() + { + $signature = array( + 'body' => '#wp-config\.php#', + 'waf_headers' => null, + 'waf_url' => null, + ); + + $this->assertTrue($this->callHasSignature('download=wp-config.php', $signature)); + $this->assertFalse($this->callHasSignature('page=home', $signature)); + $this->assertFalse($this->callHasSignature('', $signature)); + } + + /** + * Literal (non-regexp) body without headers must still work. + */ + public function testLiteralBodyWithoutHeadersStillMatches() + { + $signature = array( + 'body' => 'eval(', + 'waf_headers' => null, + 'waf_url' => null, + ); + + $this->assertTrue($this->callHasSignature('x=eval(base64_decode(1))', $signature)); + $this->assertFalse($this->callHasSignature('x=safe', $signature)); + } + + /** + * Direct unit coverage for the catch-all detector. + */ + public function testIsUnsafeCatchAllSignatureDetector() + { + $this->assertTrue( + $this->isUnsafeCatchAllSignature->invoke(null, '#.*#', 'nothing') + ); + $this->assertTrue( + $this->isUnsafeCatchAllSignature->invoke(null, '#^.*$#', 'nothing') + ); + $this->assertFalse( + $this->isUnsafeCatchAllSignature->invoke(null, '#.*#', 'only_headers') + ); + $this->assertFalse( + $this->isUnsafeCatchAllSignature->invoke(null, '#wp-config#', 'nothing') + ); + $this->assertFalse( + $this->isUnsafeCatchAllSignature->invoke(null, 'eval(', 'nothing') + ); + } +} diff --git "a/tests/\321\201ommon/HTTP/TestRequestSslDefaults.php" "b/tests/\321\201ommon/HTTP/TestRequestSslDefaults.php" new file mode 100644 index 000000000..af42d1cbf --- /dev/null +++ "b/tests/\321\201ommon/HTTP/TestRequestSslDefaults.php" @@ -0,0 +1,71 @@ +setAccessible(true); + $method->invoke($this); + + $this->appendOptionsObligatory(); + $this->processPresets(); + + return $this->options; + } +} + +class TestRequestSslDefaults extends TestCase +{ + public function testSslVerificationEnabledByDefault() + { + $request = new RequestSslDefaultsHarness(); + $request->setUrl('https://api.cleantalk.org'); + $options = $request->prepareOptionsForTest(); + + $this->assertTrue($options[CURLOPT_SSL_VERIFYPEER]); + $this->assertSame(2, $options[CURLOPT_SSL_VERIFYHOST]); + } + + public function testSslPresetKeepsVerificationEnabled() + { + $request = new RequestSslDefaultsHarness(); + $request->setUrl('https://api.cleantalk.org')->setPresets(['get', 'ssl']); + $options = $request->prepareOptionsForTest(); + + $this->assertTrue($options[CURLOPT_SSL_VERIFYPEER]); + $this->assertSame(2, $options[CURLOPT_SSL_VERIFYHOST]); + } + + public function testSslverifyFalseOptionDisablesVerification() + { + $request = new RequestSslDefaultsHarness(); + $request + ->setUrl('https://api.cleantalk.org') + ->setOptions(['sslverify' => false]); + $options = $request->prepareOptionsForTest(); + + $this->assertFalse($options[CURLOPT_SSL_VERIFYPEER]); + $this->assertSame(0, $options[CURLOPT_SSL_VERIFYHOST]); + } + + public function testSslverifyTrueSetsVerifyHostToTwo() + { + $request = new RequestSslDefaultsHarness(); + $request + ->setUrl('https://api.cleantalk.org') + ->setOptions(['sslverify' => true]); + $options = $request->prepareOptionsForTest(); + + $this->assertTrue($options[CURLOPT_SSL_VERIFYPEER]); + $this->assertSame(2, $options[CURLOPT_SSL_VERIFYHOST]); + } +}