diff --git a/css/spbc-settings.min.css b/css/spbc-settings.min.css
index 544ec78e4..d6f6503f9 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{margin-left:5px;display:inline-block;vertical-align:text-bottom}.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 */}
\ 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}.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 */}
\ No newline at end of file
diff --git a/css/src/spbc-settings.css b/css/src/spbc-settings.css
index 039cd1b36..269b26f37 100644
--- a/css/src/spbc-settings.css
+++ b/css/src/spbc-settings.css
@@ -39,7 +39,8 @@
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{
+#confirmation-code--resend .circle,
+.spbc-2fa-confirmation-resend .circle{
margin-left: 5px;
display: inline-block;
vertical-align: text-bottom;
diff --git a/inc/spbc-settings.php b/inc/spbc-settings.php
index bf6993315..5cae5b8f7 100644
--- a/inc/spbc-settings.php
+++ b/inc/spbc-settings.php
@@ -208,114 +208,7 @@ function spbc_settings__register()
'anchor' => 'auth',
'react_managed' => true, // Header is rendered by React SettingsGroup component. A temporary solution until the entire settings group is switched to React
'fields' => array(
- 'check_pass__roles' => array(
- 'type' => 'field',
- 'callback' => 'spbc_field_check_pass__roles',
- ),
- '2fa__enable' => array(
- 'type' => 'field',
- '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' => - 1,
- 'label' => __('Only for new devices', 'security-malware-firewall'),
- 'children_enable' => 1,
- ),
- ),
- 'title' => __('Two-factor authentication (2FA)', 'security-malware-firewall'),
- 'description' => 'spbc_settings_2fa_description_callback',
- 'children' => array('2fa__roles', 'edit_tech_support_url__enabled', 'edit_tech_support_url__link'),
- 'long_description' => true,
- ),
- '2fa__roles' => array(
- 'type' => 'field',
- 'callback' => 'spbc_field_2fa__roles',
- ),
- 'edit_tech_support_url__enabled' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'type' => 'field',
- 'title' => __('Change the technical support link on the authorization page', 'security-malware-firewall'),
- 'description' => spbc_settings_field__edit_tech_support_url_description(),
- 'parent' => '2fa__enable',
- 'children' => array('edit_tech_support_url__link', 'edit_tech_support_url__remove'),
- ),
- 'edit_tech_support_url__link' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'input_type' => 'text',
- 'type' => 'field',
- 'title_first' => true,
- 'title' => __('Technical support URL: ', 'security-malware-firewall')
- . get_home_url()
- . '/'
- . (get_option('permalink_structure', false) ? '' : '?'),
- 'class' => 'spbc_middle_text_field',
- 'parent' => 'edit_tech_support_url__enabled',
- ),
- 'edit_tech_support_url__remove' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'type' => 'field',
- 'title' => __('Remove the technical support link from the authorization page', 'security-malware-firewall'),
- 'description' => '',
- 'parent' => 'edit_tech_support_url__enabled',
- ),
- 'login_page_rename__enabled' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'type' => 'field',
- 'title' => __('Change address to login script', 'security-malware-firewall'),
- 'description' => __('Please note that this will not hide the links to your registration page on your website.', 'security-malware-firewall'),
- 'children' => array('login_page_rename__name', 'login_page_rename__redirect', 'login_page_rename__send_email_notification'),
- ),
- 'login_page_rename__name' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'input_type' => 'text',
- 'type' => 'field',
- 'title_first' => true,
- 'title' => __('Login URL: ', 'security-malware-firewall')
- . get_home_url()
- . '/'
- . (get_option('permalink_structure', false) ? '' : '?'),
- 'class' => 'spbc_middle_text_field',
- 'parent' => 'login_page_rename__enabled',
- ),
- 'login_page_rename__redirect' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'input_type' => 'text',
- 'type' => 'field',
- 'title_first' => true,
- 'title' => __('Redirect URL: ', 'security-malware-firewall')
- . get_home_url()
- . '/'
- . (get_option('permalink_structure', false) ? '' : '?'),
- 'description' => __('If someone tries to access the default login page they will be redirected to the URL above.', 'security-malware-firewall'),
- 'class' => 'spbc_middle_text_field',
- 'parent' => 'login_page_rename__enabled',
- ),
- 'login_page_rename__send_email_notification' => array(
- 'display' => version_compare($wp_version, '4.0-RC1-src', '>='),
- 'input_type' => 'checkbox',
- 'type' => 'field',
- 'title_first' => true,
- 'title' => __('Send the notification with the new login page URL to the admin email address', 'security-malware-firewall'),
- 'description' => __('The email will be send to', 'security-malware-firewall')
- . ' (' . spbc_get_admin_email() . ')',
- 'long_description' => true,
- 'parent' => 'login_page_rename__enabled',
- 'disabled' => !current_user_can('activate_plugins')
- ),
- 'action_shuffle_salts' => array(
- 'type' => 'field',
- 'callback' => 'spbc_settings_field__action_shuffle_salts',
- ),
+ // Authentication and Logging In fields are rendered by React (see SettingsGeneralReact).
),
),
'firewall' => array(
@@ -861,9 +754,6 @@ function spbc_settings__register()
),
),
'title' => __('Disable File Editor', 'security-malware-firewall'),
- 'children' => array('2fa__roles', 'edit_tech_support_url__enabled', 'edit_tech_support_url__link'),
- 'description' => '',
-
'long_description' => true,
),
'misc__complete_deactivation' => array(
@@ -1203,6 +1093,10 @@ function spbc_settings__draw_elements($elems_to_draw = null, $direct_call = fals
$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 '';
}
- spbc_settings__draw_elements($elem['fields'], true);
+ spbc_settings__draw_elements($fields, true);
echo '
';
break;
case 'section_banner':
@@ -1772,24 +1666,6 @@ function spbc_field_service_utilization()
echo '';
}
-function spbc_settings_2fa_description_callback()
-{
- $user = wp_get_current_user();
- if (isset($user->ID) && $user->ID > 0) {
- $email = $user->user_email;
- } else {
- $email = spbc_get_admin_email();
- }
-
- echo ''
- . sprintf(
- __('Verification code will be sent to the admin email (%s) to enable the feature.', 'security-malware-firewall'),
- $email
- )
- . ' ';
- echo '
';
-}
-
function spbc_field_bfp__heading()
{
global $spbc;
@@ -1816,51 +1692,6 @@ function spbc_field_bfp__heading()
echo $out;
}
-function spbc_field_2fa__roles()
-{
- global $spbc, $wp_roles;
-
- $wp_roles = new WP_Roles();
- $roles = $wp_roles->roles;
-
- echo '';
-
- echo '
'
- . __('Roles that use two-factor authentication (2FA)', 'security-malware-firewall')
- . ' '
- . '
';
-
- echo '
'
- . __('Hold CTRL button to select multiple roles. Users with unselected roles keep log in to your website in a standard way with their logins and passwords.', 'security-malware-firewall')
- . '' . esc_html__('To disable the 2FA Code (One-time passcode) for an account reset the password of that account. Two-factor authentication method will be switched to Email. Or you can disable it directly on the page of the WordPress site profile.', 'security-malware-firewall') . ' '
- . '
';
-
- echo '
settings['2fa__enable'] ? ' disabled="disabled"' : '')
- . ' size="' . (count($roles) - 1 < 6 ? count($roles) - 1 : 5) . '"'
- . '>';
-
- foreach ($roles as $role_slug => $role_details) {
- $role_name = isset($role_details['name']) ? $role_details['name'] : esc_html__('Unknown', 'security-malware-firewall');
- echo 'settings['2fa__roles']) ? ' selected="selected"' : '')
- . ' value="' . $role_slug . '"'
- . '>' . $role_name . ' ';
- }
-
- echo ' ';
-
- echo '
';
-}
-
-function spbc_field_check_pass__roles()
-{
- echo Escape::escKsesPreset(
- UserPassCheckView::getRolesSelect(),
- 'spbc_user_pass_check_roles'
- );
-}
-
function spbc_field_security_logs__prepare_data(&$table)
{
if ($table->items_count) {
@@ -5207,7 +5038,7 @@ function spbc_settings__get_recommendation()
wp_send_json($recomendations[ $setting_id ]);
}
-// Ajax handler of spbctGenerateConfirmationCode() from js
+// Ajax handler: send 2FA confirmation code (React settings UI)
function spbctGenerateAndSendConfirmationCode()
{
global $spbc;
@@ -5261,7 +5092,7 @@ function spbctGenerateAndSendConfirmationCode()
}
}
-// Ajax handler of spbctCheckConfirmationCode() from js
+// Ajax handler: verify 2FA confirmation code (React settings UI)
function spbctCheckConfirmationCode()
{
spbc_check_ajax_referer('spbc_secret_nonce', 'security');
@@ -5393,36 +5224,6 @@ function spbc_cdn_checker__run_check_on_settings_change($settings)
}
}
-/**
- *
- */
-function spbc_settings_field__action_shuffle_salts()
-{
- global $spbc;
-
- $button_disabled = 'disabled';
-
- if ($spbc->settings['there_was_signature_treatment']) {
- $button_disabled = '';
- }
-
- ?>
-
-
- = __('Change unique and secret authentication keys and salts', 'security-malware-firewall'); ?>
-
-
-
- = __('The function updates the secret keys and salts. All users will need to log in again.', 'security-malware-firewall'); ?>
-
-
- = __('Shuffle salts', 'security-malware-firewall'); ?>
-
-
- storage['settings']['login_page_rename__enabled'] &&
- $spbc->storage['settings']['login_page_rename__name']
- ) {
- $login_url = get_site_url() . '/' . $spbc->storage['settings']['login_page_rename__name'];
- }
-
- return sprintf(
- __('The link will change on the authorization page %s', 'security-malware-firewall'),
- '' . $login_url . ' '
- );
-}
-
function spbc_settings_field__secfw__get_ip__get_description()
{
$ip = IP::get();
diff --git a/js/public/spbct-react-bundle.js b/js/public/spbct-react-bundle.js
index a2e6b1874..d8008d540 100644
--- a/js/public/spbct-react-bundle.js
+++ b/js/public/spbct-react-bundle.js
@@ -106,7 +106,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 */ DataRootContext: () => (/* binding */ DataRootContext),\n/* harmony export */ DataTabsContext: () => (/* binding */ DataTabsContext),\n/* harmony export */ \"default\": () => (/* binding */ App)\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 _pageElements_Header_Header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pageElements/Header/Header */ \"./js/src/react/pageElements/Header/Header.js\");\n/* harmony import */ var _pageElements_ServiceButtons_ServiceButtons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pageElements/ServiceButtons/ServiceButtons */ \"./js/src/react/pageElements/ServiceButtons/ServiceButtons.js\");\n/* harmony import */ var _pageElements_HiddenElements_HiddenElements__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../pageElements/HiddenElements/HiddenElements */ \"./js/src/react/pageElements/HiddenElements/HiddenElements.js\");\n/* harmony import */ var _pageElements_Tabs_Tabs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../pageElements/Tabs/Tabs */ \"./js/src/react/pageElements/Tabs/Tabs.js\");\n\n\n\n\n\nvar DataRootContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null);\nvar DataTabsContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null);\nfunction App(_ref) {\n var dataRoot = _ref.dataRoot,\n dataTabs = _ref.dataTabs;\n if (!dataRoot) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Loading...\");\n }\n if (dataRoot.isNetworkAdminDashboard) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"wrap\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: dataRoot.networkAdminDashboardMsg\n }\n }));\n }\n if (!dataTabs) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Loading...\");\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DataRootContext.Provider, {\n value: dataRoot\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DataTabsContext.Provider, {\n value: dataTabs\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_Header_Header__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n data: dataRoot\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_ServiceButtons_ServiceButtons__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_HiddenElements_HiddenElements__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n data: dataRoot\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_Tabs_Tabs__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n data: dataTabs\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/App.js?\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DataRootContext: () => (/* binding */ DataRootContext),\n/* harmony export */ DataTabsContext: () => (/* binding */ DataTabsContext),\n/* harmony export */ \"default\": () => (/* binding */ App)\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 _pageElements_Header_Header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../pageElements/Header/Header */ \"./js/src/react/pageElements/Header/Header.js\");\n/* harmony import */ var _pageElements_ServiceButtons_ServiceButtons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../pageElements/ServiceButtons/ServiceButtons */ \"./js/src/react/pageElements/ServiceButtons/ServiceButtons.js\");\n/* harmony import */ var _pageElements_Tabs_Tabs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../pageElements/Tabs/Tabs */ \"./js/src/react/pageElements/Tabs/Tabs.js\");\n\n\n\n\nvar DataRootContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null);\nvar DataTabsContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(null);\nfunction App(_ref) {\n var dataRoot = _ref.dataRoot,\n dataTabs = _ref.dataTabs;\n if (!dataRoot) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Loading...\");\n }\n if (dataRoot.isNetworkAdminDashboard) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"wrap\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n dangerouslySetInnerHTML: {\n __html: dataRoot.networkAdminDashboardMsg\n }\n }));\n }\n if (!dataTabs) {\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", null, \"Loading...\");\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DataRootContext.Provider, {\n value: dataRoot\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DataTabsContext.Provider, {\n value: dataTabs\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_Header_Header__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n data: dataRoot\n }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_ServiceButtons_ServiceButtons__WEBPACK_IMPORTED_MODULE_2__[\"default\"], null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_pageElements_Tabs_Tabs__WEBPACK_IMPORTED_MODULE_3__[\"default\"], {\n data: dataTabs\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/App.js?\n}");
/***/ }),
@@ -166,7 +166,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 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}");
/***/ }),
@@ -186,7 +186,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\"];\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 props = _objectWithoutProperties(_ref, _excluded);\n var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(initialValue || ''),\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]);\n var handleChange = function handleChange(event) {\n var newValue = 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 }, 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}");
/***/ }),
@@ -696,7 +696,57 @@ 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 var settingKeys = Object.keys(settings || {});\n var SETTINGS_SECTIONS_TITLES = {\n apikey: __('Access Key', 'security-malware-firewall'),\n auth_and_logging_in: __('Authentication and Logging In', 'security-malware-firewall')\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],\n groupId: sectionGroupId,\n settingsSlug: settingsSlug,\n settings: settings[sectionGroupId],\n keyIsOk: keyIsOk\n });\n }\n if (keyIsOk && sectionGroupId === 'auth_and_logging_in') {\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],\n groupId: sectionGroupId,\n settingsSlug: settingsSlug,\n settings: settings[sectionGroupId],\n keyIsOk: keyIsOk\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\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 var settingKeys = Object.keys(settings || {});\n var SETTINGS_SECTIONS_TITLES = {\n apikey: __('Access Key', 'security-malware-firewall'),\n auth_and_logging_in: __('Authentication and Logging In', 'security-malware-firewall')\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],\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 (keyIsOk && sectionGroupId === 'auth_and_logging_in') {\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],\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 return null;\n }));\n}\n;\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.js":
+/*!**********************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.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 */ checkTwoFaConfirmationCode: () => (/* binding */ checkTwoFaConfirmationCode),\n/* harmony export */ generateTwoFaConfirmationCode: () => (/* binding */ generateTwoFaConfirmationCode)\n/* harmony export */ });\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/**\r\n * AJAX helpers for 2FA email confirmation (admin settings).\r\n * @return {Promise}\r\n */\nfunction generateTwoFaConfirmationCode() {\n return _generateTwoFaConfirmationCode.apply(this, arguments);\n}\n\n/**\r\n * @param {string} code\r\n * @return {Promise}\r\n */\nfunction _generateTwoFaConfirmationCode() {\n _generateTwoFaConfirmationCode = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n var s, body, r;\n return _regenerator().w(function (_context) {\n while (1) switch (_context.n) {\n case 0:\n s = window.spbcSettings;\n if (!(!s || !s.ajaxurl || !s.ajax_nonce)) {\n _context.n = 1;\n break;\n }\n return _context.a(2, {\n success: false,\n data: 'spbcSettings is not available'\n });\n case 1:\n body = new URLSearchParams({\n action: 'spbc_generate_confirmation_code',\n security: s.ajax_nonce\n });\n _context.n = 2;\n return fetch(s.ajaxurl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: body,\n credentials: 'same-origin'\n });\n case 2:\n r = _context.v;\n return _context.a(2, r.json());\n }\n }, _callee);\n }));\n return _generateTwoFaConfirmationCode.apply(this, arguments);\n}\nfunction checkTwoFaConfirmationCode(_x) {\n return _checkTwoFaConfirmationCode.apply(this, arguments);\n}\nfunction _checkTwoFaConfirmationCode() {\n _checkTwoFaConfirmationCode = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(code) {\n var s, body, r;\n return _regenerator().w(function (_context2) {\n while (1) switch (_context2.n) {\n case 0:\n s = window.spbcSettings;\n if (!(!s || !s.ajaxurl || !s.ajax_nonce)) {\n _context2.n = 1;\n break;\n }\n return _context2.a(2, {\n success: false,\n data: 'spbcSettings is not available'\n });\n case 1:\n body = new URLSearchParams({\n action: 'spbc_check_confirmation_code',\n security: s.ajax_nonce,\n code: String(code)\n });\n _context2.n = 2;\n return fetch(s.ajaxurl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: body,\n credentials: 'same-origin'\n });\n case 2:\n r = _context2.v;\n return _context2.a(2, r.json());\n }\n }, _callee2);\n }));\n return _checkTwoFaConfirmationCode.apply(this, arguments);\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js":
+/*!*************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.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 */ 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/**\r\n * @param {object} props\r\n * @param {boolean} props.isOpen\r\n * @param {function(): void} props.onCancel\r\n * @param {function(): void} props.onVerified\r\n * @param {string} props.verificationEmail\r\n * @return {JSX.Element|null}\r\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;\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 case 4:\n _context.p = 4;\n setResendBusy(false);\n return _context.f(4);\n case 5:\n return _context.a(2);\n }\n }, _callee, null, [[2,, 4, 5]]);\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;\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 case 4:\n _context2.p = 4;\n setOkBusy(false);\n return _context2.f(4);\n case 5:\n return _context2.a(2);\n }\n }, _callee2, null, [[2,, 4, 5]]);\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(\"p\", null, /*#__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\",\n autoComplete: \"one-time-code\"\n }), \"\\xA0\\xA0\", /*#__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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js":
+/*!*************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.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 */ 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.onAuthSettingChange]\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 onAuthSettingChange = props.onAuthSettingChange,\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('2fa__enable', 0);\n if (typeof window.spbcSettingsDependencies === 'function') {\n window.spbcSettingsDependencies(TWO_FA_CHILDREN, 0);\n }\n }, [onAuthSettingChange]);\n var handleChange = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(event) {\n var v, res, msg;\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 case 5:\n _context.p = 5;\n setBusy(false);\n return _context.f(5);\n case 6:\n return _context.a(2);\n }\n }, _callee, null, [[3,, 5, 6]]);\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('2fa__roles', first);\n setModalOpen(false);\n setPendingValue(null);\n setRadioOverride(null);\n }, [onAuthSettingChange, 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 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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js":
+/*!************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.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 */ Settings2faRoles)\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.__;\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string[]|*} props.value\n * @param {object} props.groupSettings\n * @param {{value: string, label: string}[]} props.wpUserRolesOptions\n * @return {JSX.Element}\n */\nfunction Settings2faRoles(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n wpUserRolesOptions = props.wpUserRolesOptions;\n var enable2fa = groupSettings && groupSettings['2fa__enable'];\n var v = String(enable2fa);\n var isEnabled = v === '1' || v === '-1' || enable2fa === 1 || enable2fa === -1;\n var isDisabled = !isEnabled;\n var options = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ? wpUserRolesOptions : [];\n var selectedRoles = Array.isArray(value) ? value : [];\n var selectSize = options.length < 6 ? Math.max(options.length, 1) : 5;\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(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Roles that use two-factor authentication (2FA)', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__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, __('Hold CTRL button to select multiple roles. Users with unselected roles keep ' + 'log in to your website in a standard way with their logins and passwords.', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"em\", null, __('To disable the 2FA Code (One-time passcode) for an account reset the password ' + 'of that account. Two-factor authentication method will be switched to Email. ' + 'Or you can disable it directly on the page of the WordPress site profile.', 'security-malware-firewall'))), /*#__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: selectedRoles,\n options: options,\n className: \"spbc_setting_field\",\n multiple: true,\n size: selectSize,\n disabled: isDisabled\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js":
+/*!**********************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.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 */ ActionShuffleSalts)\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 ActionShuffleSalts(props) {\n var _props$shuffleSaltsUn = props.shuffleSaltsUnlocked,\n shuffleSaltsUnlocked = _props$shuffleSaltsUn === void 0 ? false : _props$shuffleSaltsUn;\n var buttonClass = 'button button-primary' + (shuffleSaltsUnlocked ? '' : ' disabled');\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_wrapper_field\",\n id: \"action-shuffle-salts-wrapper\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", {\n className: \"spbc_setting-field_title--field\",\n style: {\n margin: '10px 0 5px'\n }\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"span\", null, __('Change unique and secret authentication keys and salts', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\n \"data-setting\": \"action_shuffle_salts\",\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 function updates the secret keys and salts. All users will need to log in again.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"button\", {\n type: \"button\",\n id: \"action-shuffle-salts\",\n className: buttonClass,\n style: {\n margin: '5px 0 0 10px'\n }\n }, __('Shuffle salts', 'security-malware-firewall')));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js?\n}");
/***/ }),
@@ -756,7 +806,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 */ CheckPassEnable)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n\n\n\nvar __ = wp.i18n.__;\nfunction CheckPassEnable(props) {\n var id = props.id,\n name = props.name,\n value = props.value;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var options = [{\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '0',\n label: __('Off', '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 }, __('Checking the user`s password for information leaks', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\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, __('Enable this feature to periodically check all users\\' passwords for leaks.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: id,\n name: name,\n value: value,\n options: options,\n onChange: handleSettingsDependencies('check_pass__roles')\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js?\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CheckPassEnable)\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 _FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../FormElements/InputRadioGroup */ \"./js/src/react/components/FormElements/InputRadioGroup.js\");\n\n\n\nvar __ = wp.i18n.__;\nfunction CheckPassEnable(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n onAuthSettingChange = props.onAuthSettingChange;\n var handleSettingsDependencies = (0,_hooks_useSettingsDependencies__WEBPACK_IMPORTED_MODULE_1__[\"default\"])();\n var options = [{\n value: '1',\n label: __('On', 'security-malware-firewall')\n }, {\n value: '0',\n label: __('Off', '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 }, __('Checking the user`s password for information leaks', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"i\", {\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, __('Enable this feature to periodically check all users\\' passwords for leaks.', 'security-malware-firewall'))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_FormElements_InputRadioGroup__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n id: id,\n name: name,\n value: value,\n options: options,\n onChange: function onChange(e) {\n handleSettingsDependencies('check_pass__roles')(e);\n var parsed = parseInt(e.target.value, 10);\n if (!Number.isNaN(parsed)) {\n onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('check_pass__enable', parsed);\n }\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js":
+/*!******************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.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 */ CheckPassRoles)\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.__;\n\n/**\n * @param {object} props\n * @param {string} props.id\n * @param {string} props.name\n * @param {string[]|*} props.value\n * @param {object} props.groupSettings\n * @param {{value: string, label: string}[]} props.wpUserRolesOptions\n * @return {JSX.Element}\n */\nfunction CheckPassRoles(props) {\n var id = props.id,\n name = props.name,\n value = props.value,\n groupSettings = props.groupSettings,\n wpUserRolesOptions = props.wpUserRolesOptions;\n var options = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ? wpUserRolesOptions : [];\n var selectedRoles = Array.isArray(value) ? value : [];\n var passEnable = groupSettings && groupSettings['check_pass__enable'];\n var isDisabled = passEnable !== undefined && passEnable !== null ? !(passEnable === 1 || passEnable === '1') : !(window.spbcSettings && Number(window.spbcSettings.check_pass__enable) === 1);\n var selectSize = options.length < 6 ? Math.max(options.length, 1) : 5;\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(\"span\", {\n className: \"spbc_settings-field_title spbc_settings-field_title--field\"\n }, __('Roles that use checking the user\\'s password for information leaks', 'security-malware-firewall')), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"br\", null), /*#__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, __('Hold CTRL button to select multiple roles. Users with unselected roles keep ' + 'log in to your website in a standard way with their logins and passwords.', 'security-malware-firewall'))), /*#__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: selectedRoles,\n options: options,\n className: \"spbc_setting_field\",\n multiple: true,\n size: selectSize,\n disabled: isDisabled\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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 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, __('The link will change on the authorization 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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js":
+/*!**************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js":
+/*!****************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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 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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js":
+/*!**************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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(\"div\", {\n className: \"spbc_wrapper_field\"\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 className: \"spbc_setting_field\",\n onChange: function onChange(e) {\n var next = e.target.checked ? 1 : 0;\n setChecked(e.target.checked);\n onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js":
+/*!***********************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('login_page_rename__name', e.target.value);\n }\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js":
+/*!***************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js":
+/*!****************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.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 */ 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 onAuthSettingChange = props.onAuthSettingChange;\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 onAuthSettingChange === null || onAuthSettingChange === void 0 || onAuthSettingChange('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 send to', 'security-malware-firewall'), ' ', \"(\", email, \")\")));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js?\n}");
/***/ }),
@@ -790,13 +920,33 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ }),
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js":
+/*!***************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.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 */ isAuth2faActive: () => (/* binding */ isAuth2faActive),\n/* harmony export */ isEditTechSupportUrlEnabled: () => (/* binding */ isEditTechSupportUrlEnabled)\n/* harmony export */ });\n/**\n * @param {object|undefined} groupSettings\n * @return {boolean}\n */\nfunction isAuth2faActive(groupSettings) {\n if (!groupSettings) {\n return false;\n }\n var x = groupSettings['2fa__enable'];\n return x === 1 || x === '1' || x === -1 || x === '-1';\n}\n\n/**\n * @param {object|undefined} groupSettings\n * @return {boolean}\n */\nfunction isEditTechSupportUrlEnabled(groupSettings) {\n if (!groupSettings) {\n return false;\n }\n var v = groupSettings['edit_tech_support_url__enabled'];\n return v === 1 || v === '1' || v === true;\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js?\n}");
+
+/***/ }),
+
+/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.js":
+/*!************************************************************************************************!*\
+ !*** ./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.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 */ isLoginPageRenameEnabled: () => (/* binding */ isLoginPageRenameEnabled)\n/* harmony export */ });\n/**\n * @param {object|undefined} groupSettings\n * @return {boolean}\n */\nfunction isLoginPageRenameEnabled(groupSettings) {\n if (!groupSettings) {\n return false;\n }\n var v = groupSettings['login_page_rename__enabled'];\n return v === 1 || v === '1' || v === true;\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.js?\n}");
+
+/***/ }),
+
/***/ "./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js":
/*!********************************************************************************!*\
!*** ./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.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 */ 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\n\n\n\n\n\n\n\n\n\nfunction SettingsGroup(props) {\n var groupId = props.groupId,\n groupTitle = props.groupTitle,\n settings = props.settings,\n settingsSlug = props.settingsSlug,\n keyIsOk = props.keyIsOk;\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 // ... other different types\n };\n var settingKeys = Object.keys(settings || {});\n if (settingKeys.length === 0) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className:\n // A temporary solution until the entire settings group is switched to React\n groupId === 'auth_and_logging_in' ? 'spbc_tab_fields_group spbc_tab_fields_group--bottom_gluing' : 'spbc_tab_fields_group'\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))), settingKeys.map(function (settingKey, index) {\n var settingValue = settings[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 }));\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_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\");\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\nfunction SettingsGroup(props) {\n var groupId = props.groupId,\n groupTitle = props.groupTitle,\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 var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(settings),\n _useState2 = _slicedToArray(_useState, 2),\n liveAuthSettings = _useState2[0],\n setLiveAuthSettings = _useState2[1];\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\n if (groupId === 'auth_and_logging_in') {\n setLiveAuthSettings(settings);\n }\n }, [groupId, settings]);\n var patchAuthSetting = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (key, val) {\n setLiveAuthSettings(function (prev) {\n return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, key, val));\n });\n }, []);\n var displaySettings = groupId === 'auth_and_logging_in' ? liveAuthSettings : 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 // ... other different types\n };\n var settingKeys = Object.keys(settings || {});\n if (settingKeys.length === 0) {\n return null;\n }\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className:\n // A temporary solution until the entire settings group is switched to React\n groupId === 'auth_and_logging_in' ? 'spbc_tab_fields_group spbc_tab_fields_group--bottom_gluing' : 'spbc_tab_fields_group'\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))), 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 onAuthSettingChange: groupId === 'auth_and_logging_in' ? patchAuthSetting : undefined\n }));\n }));\n}\n\n//# sourceURL=webpack:///./js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js?\n}");
/***/ }),
@@ -806,7 +956,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;\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 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('#action-shuffle-salts').click(function (e) {\n e.preventDefault();\n if (jQuery(this).hasClass('disabled')) {\n actionShuffleSaltsCountClicks++;\n if (actionShuffleSaltsCountClicks === 3) {\n jQuery(this).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 }), /*#__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;\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 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 }), /*#__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}");
/***/ }),
@@ -960,26 +1110,6 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ }),
-/***/ "./js/src/react/pageElements/HiddenElements/HiddenElements.js":
-/*!********************************************************************!*\
- !*** ./js/src/react/pageElements/HiddenElements/HiddenElements.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 */ HiddenElements)\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/HiddenElements/styles.css\");\n\n\nfunction HiddenElements(props) {\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_hide\"\n }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(\"div\", {\n className: \"spbc_page_header_info__block_row\",\n dangerouslySetInnerHTML: {\n __html: props.data.twoFactorAuth\n }\n })));\n}\n\n//# sourceURL=webpack:///./js/src/react/pageElements/HiddenElements/HiddenElements.js?\n}");
-
-/***/ }),
-
-/***/ "./js/src/react/pageElements/HiddenElements/styles.css":
-/*!*************************************************************!*\
- !*** ./js/src/react/pageElements/HiddenElements/styles.css ***!
- \*************************************************************/
-/***/ ((__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 _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../../../../node_modules/css-loader/dist/cjs.js!./styles.css */ \"./node_modules/css-loader/dist/cjs.js!./js/src/react/pageElements/HiddenElements/styles.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\noptions.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n\n\n//# sourceURL=webpack:///./js/src/react/pageElements/HiddenElements/styles.css?\n}");
-
-/***/ }),
-
/***/ "./js/src/react/pageElements/ServiceButtons/ServiceButtons.js":
/*!********************************************************************!*\
!*** ./js/src/react/pageElements/ServiceButtons/ServiceButtons.js ***!
@@ -1260,16 +1390,6 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ }),
-/***/ "./node_modules/css-loader/dist/cjs.js!./js/src/react/pageElements/HiddenElements/styles.css":
-/*!***************************************************************************************************!*\
- !*** ./node_modules/css-loader/dist/cjs.js!./js/src/react/pageElements/HiddenElements/styles.css ***!
- \***************************************************************************************************/
-/***/ ((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, ``, \"\"]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack:///./js/src/react/pageElements/HiddenElements/styles.css?./node_modules/css-loader/dist/cjs.js\n}");
-
-/***/ }),
-
/***/ "./node_modules/css-loader/dist/cjs.js!./js/src/react/pageElements/ServiceButtons/styles.css":
/*!***************************************************************************************************!*\
!*** ./node_modules/css-loader/dist/cjs.js!./js/src/react/pageElements/ServiceButtons/styles.css ***!
diff --git a/js/spbc-settings.min.js b/js/spbc-settings.min.js
index aeb1ed534..e2700c366 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("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 spbctGenerateConfirmationCode(){var e={};let t={success:!1};return e.security=spbcSettings.ajax_nonce,e.action="spbc_generate_confirmation_code",jQuery.ajax({type:"POST",async:!1,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?t.success=!0:t.text=e.data}}),t}function spbctCheckConfirmationCode(e,t,s){let n=e;e={};e.security=spbcSettings.ajax_nonce,e.action="spbc_check_confirmation_code",e.code=jQuery("#confirmation-code input").val(),jQuery.ajax({type:"POST",async:!1,url:spbcSettings.ajaxurl,data:e,success:function(e){e.success?(jQuery("[name *= 2fa__enable]").attr("checked",""),n.checked=!0,jQuery("#spbc_setting_2fa__roles").removeAttr("disabled"),jQuery("#spbc_setting_2fa__roles > option:first").attr("selected","selected"),clearTimeout(t),s.remove(),jQuery("#confirmation-code").dialog("close")):alert("Code verification failed!")}})}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
');let t=setTimeout(function(){jQuery("#confirmation-code--resend").removeAttr("disabled"),jQuery("#confirmation-code--resend>.circle").remove()},3e4);var s=spbctGenerateConfirmationCode();s.success?(jQuery("#confirmation-code input").val(""),jQuery("#confirmation-code").dialog({modal:!0,title:"Confirmation code",width:310,buttons:{Cancel:function(){jQuery(this).dialog("close"),clearTimeout(t),jQuery("#confirmation-code--resend>.circle").remove()},Ok:function(){spbctCheckConfirmationCode(e.target,t,jQuery("#confirmation-code--resend>.circle"))}},draggable:!1,resizable:!1})):alert(s.text)}),(jQuery("#spbc_renew_notice").length||jQuery("#spbc_trial_notice").length)&&spbcBannerCheck(),spbcSettings.key_changed&&jQuery("#spbc_button__sync").click(),jQuery(document).on("click","#spbc_setting_get_key_auto",function(){spbcSendAJAXRequest({action:"spbc_get_key_auto",ct_admin_timezone:jQuery("#spbc_admin_timezone").val()},{timeout:25e3,button:document.getElementById("spbc_setting_get_key_auto"),spinner:jQuery("#spbc_setting_get_key_auto .spbc_preloader_button"),callback:function(e,t,s,n){jQuery("#spbc_setting_get_key_auto .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_setting_get_key_auto .spbc_success").hide(300)},2e3),e.reload&&document.location.reload(),e.msg&&spbcModal.open().putError(e.msg),e.getTemplates&&(spbcModal.loaded=e.getTemplates,spbcModal.open(),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}))}})}),jQuery(document).on("click","#spbc_settings_templates_import_button",function(){jQuery("#spbc-ajax-result").remove();var e=jQuery("option:selected",jQuery("#spbc_settings_templates_import"));if(jQuery("#spbc_settings_templates_import_name").css("border-color","inherit"),void 0===e.data("id"))console.log('Attribute "data-id" not set for the option.');else{e={template_id:e.data("id"),template_name:e.data("name"),settings:e.data("settings")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_import",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_import_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_import_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_import_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_export_button",function(){jQuery("#spbc-ajax-result").remove();var t=jQuery("option:selected",jQuery("#spbc_settings_templates_export")),s=jQuery("#spbc_settings_templates_export_name");if(s.css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{let e;if("new_template"===t.data("id")){var n=s.val();if(""===n)return void s.css("border-color","red");e={template_name:n}}else e={template_id:t.data("id")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_export",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_export_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_export_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_export_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_reset_button",function(){let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_reset"},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_reset_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_reset_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_reset_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}),jQuery(document).on("change","#spbc_settings_templates_export",function(){"new_template"===jQuery("option:selected",this).data("id")?jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").show():jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").hide()}),jQuery(document).on("click","#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("setting"))}),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("setting"))})});
+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("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"+e.data+"",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_import_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_import_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_export_button",function(){jQuery("#spbc-ajax-result").remove();var t=jQuery("option:selected",jQuery("#spbc_settings_templates_export")),s=jQuery("#spbc_settings_templates_export_name");if(s.css("border-color","inherit"),void 0===t.data("id"))console.log('Attribute "data-id" not set for the option.');else{let e;if("new_template"===t.data("id")){var n=s.val();if(""===n)return void s.css("border-color","red");e={template_name:n}}else e={template_id:t.data("id")};let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_export",data:e},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_export_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_export_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_export_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}}),jQuery(document).on("click","#spbc_settings_templates_reset_button",function(){let a=this;spbcSendAJAXRequest({action:"spbc_settings_templates_reset"},{timeout:25e3,button:a,spinner:jQuery("#spbc_settings_templates_reset_button .spbc_preloader_button"),callback:function(e,t,s,n){let c;e.success?(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)),jQuery("#spbc_settings_templates_reset_button .spbc_success").show(300),setTimeout(function(){jQuery("#spbc_settings_templates_reset_button .spbc_success").hide(300)},2e3),document.addEventListener("spbcModalClosed",function(e){document.location.reload()}),setTimeout(function(){spbcModal.close()},2e3)):(c=""+e.data+"
",jQuery(c).insertAfter(jQuery(a)))}})}),jQuery(document).on("change","#spbc_settings_templates_export",function(){"new_template"===jQuery("option:selected",this).data("id")?jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").show():jQuery(this).parent().parent().find("#spbc_settings_templates_export_name").hide()}),jQuery(document).on("click","#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("setting"))}),jQuery(document).off("click",".spbc_long_recommendation__show"),jQuery(document).on("click",".spbc_long_recommendation__show",function(){spbcSettingsShowRecommendation(self=jQuery(this),self.attr("setting"))})});
//# sourceMappingURL=spbc-settings.min.js.map
diff --git a/js/spbc-settings.min.js.map b/js/spbc-settings.min.js.map
index 17e4c545c..390846c7b 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('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 isRadio = event.target.type === 'radio';\n const radioEnabled = isRadio && event.target.value == '1';\n const targetEnableFlag = (isRadio && !radioEnabled) || +event.target.checked;\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 * Generate and save confirmation code\n *\n * @return {object}\n */\nfunction spbctGenerateConfirmationCode() {\n let data = {};\n let res = {};\n res.success = false;\n data.security = spbcSettings.ajax_nonce;\n data.action = 'spbc_generate_confirmation_code';\n\n jQuery.ajax({\n type: 'POST',\n async: false,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n res.success = true;\n } else {\n res.text = result.data;\n }\n },\n });\n return res;\n}\n\n/**\n * Check confirmation code\n *\n * @param {object} radioButton\n * @param {number} timeout\n * @param {object} timer\n */\nfunction spbctCheckConfirmationCode( radioButton, timeout, timer ) {\n let element = radioButton;\n let data = {};\n data.security = spbcSettings.ajax_nonce;\n data.action = 'spbc_check_confirmation_code';\n data.code = jQuery('#confirmation-code input').val();\n\n jQuery.ajax({\n type: 'POST',\n async: false,\n url: spbcSettings.ajaxurl,\n data: data,\n success: function(result) {\n if (result.success) {\n jQuery('[name *= 2fa__enable]').attr('checked', '');\n element.checked = true;\n jQuery('#spbc_setting_2fa__roles').removeAttr('disabled');\n jQuery('#spbc_setting_2fa__roles > option:first').attr('selected', 'selected');\n clearTimeout( timeout );\n timer.remove();\n jQuery('#confirmation-code').dialog( 'close' );\n } else {\n alert('Code verification failed!');\n }\n },\n });\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 // Checking email receiving possibility for activation 2FA\n jQuery(document).on('click', '[name*=fa__enable]:not([value=0]),#confirmation-code--resend', function(e) {\n e.preventDefault();\n\n let view = '';\n jQuery('#confirmation-code--resend').attr('disabled', 'disabled')\n .append(view);\n let enableResend = setTimeout(function() {\n jQuery('#confirmation-code--resend').removeAttr('disabled');\n jQuery('#confirmation-code--resend>.circle').remove();\n }, 30000);\n\n let res = spbctGenerateConfirmationCode();\n if ( res.success ) {\n jQuery('#confirmation-code input').val('');\n jQuery('#confirmation-code').dialog({\n modal: true,\n title: 'Confirmation code',\n width: 310,\n buttons: {\n Cancel: function() {\n jQuery( this ).dialog( 'close' );\n clearTimeout( enableResend );\n jQuery('#confirmation-code--resend>.circle').remove();\n },\n Ok: function() {\n let selector = '#confirmation-code--resend>.circle';\n spbctCheckConfirmationCode(e.target, enableResend, jQuery(selector));\n },\n },\n draggable: false,\n resizable: false,\n });\n } else {\n alert(res.text);\n }\n });\n\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\n jQuery(document).on('click', '#spbc_setting_get_key_auto', function() {\n spbcSendAJAXRequest(\n {action: 'spbc_get_key_auto', ct_admin_timezone: jQuery('#spbc_admin_timezone').val()},\n {\n timeout: 25000,\n button: document.getElementById('spbc_setting_get_key_auto' ),\n spinner: jQuery('#spbc_setting_get_key_auto .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#spbc_setting_get_key_auto .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_setting_get_key_auto .spbc_success').hide(300);\n }, 2000);\n if (result.reload) {\n document.location.reload();\n }\n if (result.msg) {\n spbcModal.open().putError(result.msg);\n }\n if (result.getTemplates) {\n spbcModal.loaded = result.getTemplates;\n spbcModal.open();\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n }\n },\n },\n );\n });\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('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('setting'));\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 isRadio = event.target.type === 'radio';\n const radioEnabled = isRadio && event.target.value == '1';\n const targetEnableFlag = (isRadio && !radioEnabled) || +event.target.checked;\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\n jQuery(document).on('click', '#spbc_setting_get_key_auto', function() {\n spbcSendAJAXRequest(\n {action: 'spbc_get_key_auto', ct_admin_timezone: jQuery('#spbc_admin_timezone').val()},\n {\n timeout: 25000,\n button: document.getElementById('spbc_setting_get_key_auto' ),\n spinner: jQuery('#spbc_setting_get_key_auto .spbc_preloader_button' ),\n callback: function(result, data, params, obj) {\n jQuery('#spbc_setting_get_key_auto .spbc_success').show(300);\n setTimeout(function() {\n jQuery('#spbc_setting_get_key_auto .spbc_success').hide(300);\n }, 2000);\n if (result.reload) {\n document.location.reload();\n }\n if (result.msg) {\n spbcModal.open().putError(result.msg);\n }\n if (result.getTemplates) {\n spbcModal.loaded = result.getTemplates;\n spbcModal.open();\n document.addEventListener('spbcModalClosed', function( e ) {\n document.location.reload();\n });\n }\n },\n },\n );\n });\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('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('setting'));\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
-
diff --git a/js/src/react/components/FormElements/InputRadioGroup.js b/js/src/react/components/FormElements/InputRadioGroup.js
index 8c49f1d3b..a33cf84a4 100644
--- a/js/src/react/components/FormElements/InputRadioGroup.js
+++ b/js/src/react/components/FormElements/InputRadioGroup.js
@@ -1,4 +1,4 @@
-import React, {useState} from 'react';
+import React, {useState, useEffect} from 'react';
/**
* InputRadioGroup component
@@ -24,6 +24,10 @@ export default function InputRadioGroup({
}) {
const [selectedValue, setSelectedValue] = useState(String(initialValue ?? ''));
+ useEffect(() => {
+ setSelectedValue(String(initialValue ?? ''));
+ }, [initialValue]);
+
const handleChange = (event) => {
const newValue = event.target.value;
setSelectedValue(newValue);
diff --git a/js/src/react/components/FormElements/Select.js b/js/src/react/components/FormElements/Select.js
index ad79cb591..b1a724e18 100644
--- a/js/src/react/components/FormElements/Select.js
+++ b/js/src/react/components/FormElements/Select.js
@@ -9,18 +9,25 @@ export default function Select({
className = '',
disabled = false,
placeholder = '',
+ multiple = false,
...props
}) {
- const [selectedValue, setSelectedValue] = useState(initialValue || '');
+ const [selectedValue, setSelectedValue] = useState(
+ initialValue !== undefined ?
+ initialValue :
+ (multiple ? [] : ''),
+ );
useEffect(() => {
if (initialValue !== undefined) {
setSelectedValue(initialValue);
}
- }, [initialValue]);
+ }, [initialValue, multiple]);
const handleChange = (event) => {
- const newValue = event.target.value;
+ const newValue = multiple ?
+ Array.from(event.target.selectedOptions, (option) => option.value) :
+ event.target.value;
setSelectedValue(newValue);
// Call `onChange` from props, if exists
@@ -37,6 +44,7 @@ export default function Select({
onChange={handleChange}
className={className}
disabled={disabled}
+ multiple={multiple}
{...props}
>
{placeholder && (
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings.js
index 19c60d15a..d6e08b236 100644
--- a/js/src/react/components/TabContent/TabSettingsGeneral/Settings.js
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings.js
@@ -3,7 +3,18 @@ import SettingsGroup from './SettingsGroup';
const {__} = wp.i18n;
export default function Settings(props) {
- const {settingsSlug, settings, keyIsOk} = props;
+ const {
+ settingsSlug,
+ settings,
+ keyIsOk,
+ wpUserRolesOptions,
+ verificationEmail,
+ authLoginPageUrl,
+ techSupportUrlPrefix,
+ loginRenameNotifyAdminEmail,
+ canActivatePlugins,
+ shuffleSaltsUnlocked,
+ } = props;
const settingKeys = Object.keys(settings || {});
@@ -24,6 +35,13 @@ export default function Settings(props) {
settingsSlug={settingsSlug}
settings={settings[sectionGroupId]}
keyIsOk={keyIsOk}
+ wpUserRolesOptions={wpUserRolesOptions}
+ verificationEmail={verificationEmail}
+ authLoginPageUrl={authLoginPageUrl}
+ techSupportUrlPrefix={techSupportUrlPrefix}
+ loginRenameNotifyAdminEmail={loginRenameNotifyAdminEmail}
+ canActivatePlugins={canActivatePlugins}
+ shuffleSaltsUnlocked={shuffleSaltsUnlocked}
/>;
}
if (
@@ -37,6 +55,13 @@ export default function Settings(props) {
settingsSlug={settingsSlug}
settings={settings[sectionGroupId]}
keyIsOk={keyIsOk}
+ wpUserRolesOptions={wpUserRolesOptions}
+ verificationEmail={verificationEmail}
+ authLoginPageUrl={authLoginPageUrl}
+ techSupportUrlPrefix={techSupportUrlPrefix}
+ loginRenameNotifyAdminEmail={loginRenameNotifyAdminEmail}
+ canActivatePlugins={canActivatePlugins}
+ shuffleSaltsUnlocked={shuffleSaltsUnlocked}
/>;
}
return null;
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.js
new file mode 100644
index 000000000..a4b423da7
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationApi.js
@@ -0,0 +1,44 @@
+/**
+ * AJAX helpers for 2FA email confirmation (admin settings).
+ * @return {Promise}
+ */
+export async function generateTwoFaConfirmationCode() {
+ const s = window.spbcSettings;
+ if (!s || !s.ajaxurl || !s.ajax_nonce) {
+ return {success: false, data: 'spbcSettings is not available'};
+ }
+ const body = new URLSearchParams({
+ action: 'spbc_generate_confirmation_code',
+ security: s.ajax_nonce,
+ });
+ const r = await fetch(s.ajaxurl, {
+ method: 'POST',
+ headers: {'Content-Type': 'application/x-www-form-urlencoded'},
+ body,
+ credentials: 'same-origin',
+ });
+ return r.json();
+}
+
+/**
+ * @param {string} code
+ * @return {Promise}
+ */
+export async function checkTwoFaConfirmationCode(code) {
+ const s = window.spbcSettings;
+ if (!s || !s.ajaxurl || !s.ajax_nonce) {
+ return {success: false, data: 'spbcSettings is not available'};
+ }
+ const body = new URLSearchParams({
+ action: 'spbc_check_confirmation_code',
+ security: s.ajax_nonce,
+ code: String(code),
+ });
+ const r = await fetch(s.ajaxurl, {
+ method: 'POST',
+ headers: {'Content-Type': 'application/x-www-form-urlencoded'},
+ body,
+ credentials: 'same-origin',
+ });
+ return r.json();
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js
new file mode 100644
index 000000000..814ca9580
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faConfirmationDialog.js
@@ -0,0 +1,162 @@
+import React, {useState, useEffect, useRef, useCallback} from 'react';
+import ReactFileViewDialog from '../../../ReactFileViewDialog/ReactFileViewDialog';
+import {generateTwoFaConfirmationCode, checkTwoFaConfirmationCode} from './2faConfirmationApi';
+
+const {__, sprintf} = wp.i18n;
+
+/**
+ * @param {object} props
+ * @param {boolean} props.isOpen
+ * @param {function(): void} props.onCancel
+ * @param {function(): void} props.onVerified
+ * @param {string} props.verificationEmail
+ * @return {JSX.Element|null}
+ */
+export default function TwoFaConfirmationDialog(props) {
+ const {isOpen, onCancel, onVerified, verificationEmail} = props;
+ const [code, setCode] = useState('');
+ const [resendBusy, setResendBusy] = useState(false);
+ const [resendCooldown, setResendCooldown] = useState(false);
+ const [okBusy, setOkBusy] = useState(false);
+ const resendTimerRef = useRef(null);
+
+ const clearResendTimer = useCallback(() => {
+ if (resendTimerRef.current) {
+ clearTimeout(resendTimerRef.current);
+ resendTimerRef.current = null;
+ }
+ }, []);
+
+ const startResendCooldown = useCallback(() => {
+ clearResendTimer();
+ setResendCooldown(true);
+ resendTimerRef.current = setTimeout(() => {
+ setResendCooldown(false);
+ resendTimerRef.current = null;
+ }, 30000);
+ }, [clearResendTimer]);
+
+ useEffect(() => {
+ if (!isOpen) {
+ setCode('');
+ setResendBusy(false);
+ setResendCooldown(false);
+ setOkBusy(false);
+ clearResendTimer();
+ return;
+ }
+ startResendCooldown();
+ return () => {
+ clearResendTimer();
+ };
+ }, [isOpen, clearResendTimer, startResendCooldown]);
+
+ const handleResend = async () => {
+ if (resendBusy || resendCooldown) {
+ return;
+ }
+ setResendBusy(true);
+ try {
+ const res = await generateTwoFaConfirmationCode();
+ if (res.success) {
+ setCode('');
+ startResendCooldown();
+ } else {
+ const msg = typeof res.data === 'string' ?
+ res.data :
+ __('Request failed.', 'security-malware-firewall');
+ alert(msg);
+ }
+ } finally {
+ setResendBusy(false);
+ }
+ };
+
+ const handleOk = async () => {
+ if (okBusy) {
+ return;
+ }
+ setOkBusy(true);
+ try {
+ const res = await checkTwoFaConfirmationCode(code.trim());
+ if (res.success) {
+ clearResendTimer();
+ onVerified();
+ } else {
+ const msg = typeof res.data === 'string' ?
+ res.data :
+ __('Code verification failed!', 'security-malware-firewall');
+ alert(msg);
+ }
+ } finally {
+ setOkBusy(false);
+ }
+ };
+
+ const email = verificationEmail || '';
+ const checkInboxMsg = __(
+ 'Check %s inbox for the confirmation code.',
+ 'security-malware-firewall',
+ );
+ /* eslint-disable max-len */
+ const 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',
+ );
+ /* eslint-enable max-len */
+
+ return (
+
+
+ {sprintf(
+ /* translators: %s: email address */
+ checkInboxMsg,
+ email,
+ )}
+
+
+
+ {codeValidityNote}
+
+
+
+ setCode(e.target.value)}
+ className="regular-text"
+ autoComplete="one-time-code"
+ />
+
+
+ {__('Resend', 'security-malware-firewall')}
+ {resendCooldown && (
+
+
+
+ )}
+
+
+
+
+ {__('Cancel', 'security-malware-firewall')}
+
+
+
+ {__('OK', 'security-malware-firewall')}
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js
new file mode 100644
index 000000000..d1ede143c
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faEnable.js
@@ -0,0 +1,137 @@
+import React, {useState, useCallback} from 'react';
+import InputRadioGroup from '../../../FormElements/InputRadioGroup';
+import TwoFaConfirmationDialog from './2faConfirmationDialog';
+import {generateTwoFaConfirmationCode} from './2faConfirmationApi';
+
+const {__, sprintf} = wp.i18n;
+
+const TWO_FA_CHILDREN =
+ '2fa__roles,edit_tech_support_url__enabled,edit_tech_support_url__link,edit_tech_support_url__remove';
+
+/**
+ * @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.onAuthSettingChange]
+ * @param {{value: string, label: string}[]} [props.wpUserRolesOptions]
+ * @return {JSX.Element}
+ */
+export default function Settings2faEnable(props) {
+ const {id, name, value, verificationEmail, onAuthSettingChange, wpUserRolesOptions} = props;
+
+ const [modalOpen, setModalOpen] = useState(false);
+ const [pendingValue, setPendingValue] = useState(null);
+ const [radioOverride, setRadioOverride] = useState(null);
+ const [busy, setBusy] = useState(false);
+
+ const serverVal = String(value ?? '');
+ const effectiveRadio = radioOverride !== null ? radioOverride : serverVal;
+
+ const applyOff = useCallback(() => {
+ setRadioOverride(null);
+ onAuthSettingChange?.('2fa__enable', 0);
+ if (typeof window.spbcSettingsDependencies === 'function') {
+ window.spbcSettingsDependencies(TWO_FA_CHILDREN, 0);
+ }
+ }, [onAuthSettingChange]);
+
+ const handleChange = async (event) => {
+ const v = event.target.value;
+ if (v === '0') {
+ applyOff();
+ return;
+ }
+ if (v !== '1' && v !== '-1') {
+ return;
+ }
+ setPendingValue(parseInt(v, 10));
+ setRadioOverride(v);
+ setBusy(true);
+ try {
+ const res = await generateTwoFaConfirmationCode();
+ if (res.success) {
+ setModalOpen(true);
+ } else {
+ const msg = typeof res.data === 'string' ?
+ res.data :
+ __('Could not send confirmation code.', 'security-malware-firewall');
+ alert(msg);
+ setRadioOverride(null);
+ setPendingValue(null);
+ }
+ } finally {
+ setBusy(false);
+ }
+ };
+
+ const handleModalCancel = useCallback(() => {
+ setModalOpen(false);
+ setPendingValue(null);
+ setRadioOverride(null);
+ }, []);
+
+ const handleVerified = useCallback(() => {
+ if (pendingValue === null) {
+ return;
+ }
+ onAuthSettingChange?.('2fa__enable', pendingValue);
+ if (typeof window.spbcSettingsDependencies === 'function') {
+ window.spbcSettingsDependencies(TWO_FA_CHILDREN, 1);
+ }
+ const first = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ?
+ [String(wpUserRolesOptions[0].value)] :
+ [];
+ onAuthSettingChange?.('2fa__roles', first);
+ setModalOpen(false);
+ setPendingValue(null);
+ setRadioOverride(null);
+ }, [onAuthSettingChange, pendingValue, wpUserRolesOptions]);
+
+ const options = [
+ {value: '1', label: __('On', 'security-malware-firewall')},
+ {value: '0', label: __('Off', 'security-malware-firewall')},
+ {value: '-1', label: __('Only for new devices', 'security-malware-firewall')},
+ ];
+
+ const email = verificationEmail || '';
+ const verifyEmailHint = __(
+ 'Verification code will be sent to the admin email (%s) to enable the feature.',
+ 'security-malware-firewall',
+ );
+
+ return (
+ <>
+
+ {__('Two-factor authentication (2FA)', 'security-malware-firewall')}
+
+ {/* eslint-disable-next-line react/no-unknown-property */}
+
+
+
+ {sprintf(
+ /* translators: %s: email address */
+ verifyEmailHint,
+ email,
+ )}
+
+
+
+
+
+ >
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js
new file mode 100644
index 000000000..29dfc5c6c
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/2faRoles.js
@@ -0,0 +1,65 @@
+import React from 'react';
+import Select from '../../../FormElements/Select';
+const {__} = wp.i18n;
+
+/**
+ * @param {object} props
+ * @param {string} props.id
+ * @param {string} props.name
+ * @param {string[]|*} props.value
+ * @param {object} props.groupSettings
+ * @param {{value: string, label: string}[]} props.wpUserRolesOptions
+ * @return {JSX.Element}
+ */
+export default function Settings2faRoles(props) {
+ const {id, name, value, groupSettings, wpUserRolesOptions} = props;
+
+ const enable2fa = groupSettings && groupSettings['2fa__enable'];
+ const v = String(enable2fa);
+ const isEnabled = v === '1' || v === '-1' || enable2fa === 1 || enable2fa === -1;
+ const isDisabled = !isEnabled;
+
+ const options = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ?
+ wpUserRolesOptions :
+ [];
+
+ const selectedRoles = Array.isArray(value) ? value : [];
+ const selectSize = options.length < 6 ? Math.max(options.length, 1) : 5;
+
+ return (
+
+
+ {__('Roles that use two-factor authentication (2FA)', 'security-malware-firewall')}
+
+
+
+
+ {__(
+ 'Hold CTRL button to select multiple roles. Users with unselected roles keep ' +
+ 'log in to your website in a standard way with their logins and passwords.',
+ 'security-malware-firewall',
+ )}
+
+
+
+ {__(
+ 'To disable the 2FA Code (One-time passcode) for an account reset the password ' +
+ 'of that account. Two-factor authentication method will be switched to Email. ' +
+ 'Or you can disable it directly on the page of the WordPress site profile.',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js
new file mode 100644
index 000000000..038ecdd20
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/ActionShuffleSalts.js
@@ -0,0 +1,42 @@
+import React from 'react';
+const {__} = wp.i18n;
+
+export default function ActionShuffleSalts(props) {
+ const {shuffleSaltsUnlocked = false} = props;
+
+ const buttonClass =
+ 'button button-primary' + (shuffleSaltsUnlocked ? '' : ' disabled');
+
+ return (
+
+
+
+ {__(
+ 'Change unique and secret authentication keys and salts',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+
+ {__(
+ 'The function updates the secret keys and salts. All users will need to log in again.',
+ 'security-malware-firewall',
+ )}
+
+
+
+ {__('Shuffle salts', 'security-malware-firewall')}
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js
index 043147793..da38688c1 100644
--- a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassEnable.js
@@ -1,11 +1,10 @@
-
import React from 'react';
import useSettingsDependencies from '../../../../hooks/useSettingsDependencies';
import InputRadioGroup from '../../../FormElements/InputRadioGroup';
const {__} = wp.i18n;
export default function CheckPassEnable(props) {
- const {id, name, value} = props;
+ const {id, name, value, onAuthSettingChange} = props;
const handleSettingsDependencies = useSettingsDependencies();
const options = [
@@ -32,7 +31,13 @@ export default function CheckPassEnable(props) {
name={name}
value={value}
options={options}
- onChange={handleSettingsDependencies('check_pass__roles')}
+ onChange={(e) => {
+ handleSettingsDependencies('check_pass__roles')(e);
+ const parsed = parseInt(e.target.value, 10);
+ if (!Number.isNaN(parsed)) {
+ onAuthSettingChange?.('check_pass__enable', parsed);
+ }
+ }}
/>
>
);
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js
new file mode 100644
index 000000000..d7b056710
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/CheckPassRoles.js
@@ -0,0 +1,55 @@
+import React from 'react';
+import Select from '../../../FormElements/Select';
+const {__} = wp.i18n;
+
+/**
+ * @param {object} props
+ * @param {string} props.id
+ * @param {string} props.name
+ * @param {string[]|*} props.value
+ * @param {object} props.groupSettings
+ * @param {{value: string, label: string}[]} props.wpUserRolesOptions
+ * @return {JSX.Element}
+ */
+export default function CheckPassRoles(props) {
+ const {id, name, value, groupSettings, wpUserRolesOptions} = props;
+
+ const options = Array.isArray(wpUserRolesOptions) && wpUserRolesOptions.length > 0 ?
+ wpUserRolesOptions :
+ [];
+
+ const selectedRoles = Array.isArray(value) ? value : [];
+ const passEnable = groupSettings && groupSettings['check_pass__enable'];
+ const isDisabled = passEnable !== undefined && passEnable !== null ?
+ !(passEnable === 1 || passEnable === '1') :
+ !(window.spbcSettings && Number(window.spbcSettings.check_pass__enable) === 1);
+ const selectSize = options.length < 6 ? Math.max(options.length, 1) : 5;
+
+ return (
+
+
+ {__('Roles that use checking the user\'s password for information leaks', 'security-malware-firewall')}
+
+
+
+
+ {__(
+ 'Hold CTRL button to select multiple roles. Users with unselected roles keep ' +
+ 'log in to your website in a standard way with their logins and passwords.',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js
new file mode 100644
index 000000000..db80975c0
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlEnabled.js
@@ -0,0 +1,61 @@
+import React, {useState, useEffect} from 'react';
+import useSettingsDependencies from '../../../../hooks/useSettingsDependencies';
+import {isAuth2faActive} from './editTechSupportUrlUtils';
+const {__} = wp.i18n;
+
+export default function EditTechSupportUrlEnabled(props) {
+ const {id, name, value, groupSettings, authLoginPageUrl, onAuthSettingChange} = props;
+ const handleSettingsDependencies = useSettingsDependencies();
+
+ const [checked, setChecked] = useState(
+ value === 1 || value === '1' || value === true,
+ );
+
+ useEffect(() => {
+ setChecked(value === 1 || value === '1' || value === true);
+ }, [value]);
+
+ const twoFaOn = isAuth2faActive(groupSettings);
+ const disabled = !twoFaOn;
+
+ const loginUrl = authLoginPageUrl || '';
+
+ return (
+
+
{
+ const next = e.target.checked ? 1 : 0;
+ setChecked(e.target.checked);
+ onAuthSettingChange?.('edit_tech_support_url__enabled', next);
+ handleSettingsDependencies('edit_tech_support_url__link,edit_tech_support_url__remove')(e);
+ }}
+ />
+
+
+ {__(
+ 'Change the technical support link on the authorization page',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+ {__('The link will change on the authorization page', 'security-malware-firewall')}{' '}
+
+ {loginUrl}
+
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js
new file mode 100644
index 000000000..abfbf26d3
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlLink.js
@@ -0,0 +1,46 @@
+import React, {useState, useEffect} from 'react';
+import {isAuth2faActive, isEditTechSupportUrlEnabled} from './editTechSupportUrlUtils';
+const {__} = wp.i18n;
+
+export default function EditTechSupportUrlLink(props) {
+ const {id, name, value, groupSettings, techSupportUrlPrefix, onAuthSettingChange} = props;
+
+ const [inputValue, setInputValue] = useState(
+ value !== undefined && value !== null ? String(value) : '',
+ );
+
+ useEffect(() => {
+ setInputValue(value !== undefined && value !== null ? String(value) : '');
+ }, [value]);
+
+ const twoFaOn = isAuth2faActive(groupSettings);
+ const techOn = isEditTechSupportUrlEnabled(groupSettings);
+ const disabled = !twoFaOn || !techOn;
+
+ const prefix = techSupportUrlPrefix || '';
+
+ return (
+
+
+ {__('Technical support URL: ', 'security-malware-firewall')}
+ {prefix}
+
+
+ {
+ setInputValue(e.target.value);
+ onAuthSettingChange?.('edit_tech_support_url__link', e.target.value);
+ }}
+ />
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js
new file mode 100644
index 000000000..19e11a71b
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/EditTechSupportUrlRemove.js
@@ -0,0 +1,49 @@
+import React, {useState, useEffect} from 'react';
+import {isAuth2faActive, isEditTechSupportUrlEnabled} from './editTechSupportUrlUtils';
+const {__} = wp.i18n;
+
+export default function EditTechSupportUrlRemove(props) {
+ const {id, name, value, groupSettings, onAuthSettingChange} = props;
+
+ const [checked, setChecked] = useState(
+ value === 1 || value === '1' || value === true,
+ );
+
+ useEffect(() => {
+ setChecked(value === 1 || value === '1' || value === true);
+ }, [value]);
+
+ const twoFaOn = isAuth2faActive(groupSettings);
+ const techOn = isEditTechSupportUrlEnabled(groupSettings);
+ const disabled = !twoFaOn || !techOn;
+
+ return (
+
+
{
+ setChecked(e.target.checked);
+ onAuthSettingChange?.('edit_tech_support_url__remove', e.target.checked ? 1 : 0);
+ }}
+ />
+
+
+ {__(
+ 'Remove the technical support link from the authorization page',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js
new file mode 100644
index 000000000..4133374c7
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameEnabled.js
@@ -0,0 +1,55 @@
+import React, {useState, useEffect} from 'react';
+import useSettingsDependencies from '../../../../hooks/useSettingsDependencies';
+const {__} = wp.i18n;
+
+export default function LoginPageRenameEnabled(props) {
+ const {id, name, value, onAuthSettingChange} = props;
+ const handleSettingsDependencies = useSettingsDependencies();
+
+ const [checked, setChecked] = useState(
+ value === 1 || value === '1' || value === true,
+ );
+
+ useEffect(() => {
+ setChecked(value === 1 || value === '1' || value === true);
+ }, [value]);
+
+ return (
+
+
{
+ const next = e.target.checked ? 1 : 0;
+ setChecked(e.target.checked);
+ onAuthSettingChange?.('login_page_rename__enabled', next);
+ handleSettingsDependencies(
+ 'login_page_rename__name,' +
+ 'login_page_rename__redirect,' +
+ 'login_page_rename__send_email_notification',
+ )(e);
+ }}
+ />
+
+
+ {__('Change address to login script', 'security-malware-firewall')}
+
+
+
+
+ {__(
+ 'Please note that this will not hide the links to your registration page on your website.',
+ 'security-malware-firewall',
+ )}
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js
new file mode 100644
index 000000000..64c893d11
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameName.js
@@ -0,0 +1,43 @@
+import React, {useState, useEffect} from 'react';
+import {isLoginPageRenameEnabled} from './loginPageRenameUtils';
+const {__} = wp.i18n;
+
+export default function LoginPageRenameName(props) {
+ const {id, name, value, groupSettings, techSupportUrlPrefix, onAuthSettingChange} = props;
+
+ const [inputValue, setInputValue] = useState(
+ value !== undefined && value !== null ? String(value) : '',
+ );
+
+ useEffect(() => {
+ setInputValue(value !== undefined && value !== null ? String(value) : '');
+ }, [value]);
+
+ const renameOn = isLoginPageRenameEnabled(groupSettings);
+ const prefix = techSupportUrlPrefix || '';
+
+ return (
+
+
+ {__('Login URL: ', 'security-malware-firewall')}
+ {prefix}
+
+
+ {
+ setInputValue(e.target.value);
+ onAuthSettingChange?.('login_page_rename__name', e.target.value);
+ }}
+ />
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js
new file mode 100644
index 000000000..0a4f5ecf3
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameRedirect.js
@@ -0,0 +1,51 @@
+import React, {useState, useEffect} from 'react';
+import {isLoginPageRenameEnabled} from './loginPageRenameUtils';
+const {__} = wp.i18n;
+
+export default function LoginPageRenameRedirect(props) {
+ const {id, name, value, groupSettings, techSupportUrlPrefix, onAuthSettingChange} = props;
+
+ const [inputValue, setInputValue] = useState(
+ value !== undefined && value !== null ? String(value) : '',
+ );
+
+ useEffect(() => {
+ setInputValue(value !== undefined && value !== null ? String(value) : '');
+ }, [value]);
+
+ const renameOn = isLoginPageRenameEnabled(groupSettings);
+ const prefix = techSupportUrlPrefix || '';
+
+ return (
+
+
+ {__('Redirect URL: ', 'security-malware-firewall')}
+ {prefix}
+
+
+
{
+ setInputValue(e.target.value);
+ onAuthSettingChange?.('login_page_rename__redirect', e.target.value);
+ }}
+ />
+
+
+ {__(
+ 'If someone tries to access the default login page they will be redirected to the URL above.',
+ 'security-malware-firewall',
+ )}
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js
new file mode 100644
index 000000000..cda9e30ab
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/LoginPageRenameSendEmail.js
@@ -0,0 +1,69 @@
+import React, {useState, useEffect} from 'react';
+import {isLoginPageRenameEnabled} from './loginPageRenameUtils';
+const {__} = wp.i18n;
+
+export default function LoginPageRenameSendEmail(props) {
+ const {
+ id,
+ name,
+ value,
+ groupSettings,
+ loginRenameNotifyAdminEmail,
+ canActivatePlugins,
+ onAuthSettingChange,
+ } = props;
+
+ const [checked, setChecked] = useState(
+ value === 1 || value === '1' || value === true,
+ );
+
+ useEffect(() => {
+ setChecked(value === 1 || value === '1' || value === true);
+ }, [value]);
+
+ const renameOn = isLoginPageRenameEnabled(groupSettings);
+ const disabled = !renameOn || !canActivatePlugins;
+ const email = loginRenameNotifyAdminEmail || '';
+
+ return (
+
+
{
+ setChecked(e.target.checked);
+ onAuthSettingChange?.(
+ 'login_page_rename__send_email_notification',
+ e.target.checked ? 1 : 0,
+ );
+ }}
+ />
+
+
+ {__(
+ 'Send the notification with the new login page URL to the admin email address',
+ 'security-malware-firewall',
+ )}
+
+
+
+
+
+ {__('The email will be send to', 'security-malware-firewall')}{' '}
+ ({email})
+
+
+
+ );
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingsAuthAndLoggingIn.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingsAuthAndLoggingIn.js
deleted file mode 100644
index 8b5a674ed..000000000
--- a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/SettingsAuthAndLoggingIn.js
+++ /dev/null
@@ -1,344 +0,0 @@
-import React from 'react';
-const {__} = wp.i18n;
-
-
-// Handler to call global spbcSettingsDependencies with argument string
-// A hook for this has already been implemented.
-function handleSettingsDependencies(argString) {
- return function(event) {
- if (typeof window.spbcSettingsDependencies === 'function') {
- window.spbcSettingsDependencies(argString);
- }
- };
-}
-
-// Deprecated component, not used in the code
-export default function SettingsAuthAndLoggingIn(props) {
- const {value} = props;
-
- return (
-
-
-
-
- {__(
- 'Roles that use checking the user`s password for information leaks',
- 'security-malware-firewall',
- )}
-
-
-
- {__(
- `Hold CTRL button to select multiple roles.
- Users with unselected roles keep log in to your website in a
- standard way with their logins and passwords.`,
- 'security-malware-firewall',
- )}
-
-
- Administrator
- Editor
- Author
- Contributor
- Subscriber
- Tech freelancer
-
-
-
-
-
-
-
- {__('Roles that use two-factor authentication (2FA)', 'security-malware-firewall')}
-
-
-
- {__(
- `Hold CTRL button to select multiple roles.
- Users with unselected roles keep log in to your website in a
- standard way with their logins and passwords.`,
- 'security-malware-firewall',
- )}
-
- {__(
- `To disable the 2FA Code (One-time passcode) for an account reset the password of that account.
- Two-factor authentication method will be switched to Email.
- Or you can disable it directly on the page of the WordPress site profile.`,
- 'security-malware-firewall',
- )}
-
-
- Administrator
- Editor
- Author
- Contributor
- Subscriber
- Tech freelancer
-
-
-
-
-
-
- {__(
- 'Change the technical support link on the authorization page',
- 'security-malware-firewall',
- )}
-
-
-
-
-
-
- {__('Technical support URL:', 'security-malware-firewall')}
- https://nb-wp691.local/?
-
-
-
-
-
-
-
- {__(
- 'Remove the technical support link from the authorization page',
- 'security-malware-firewall',
- )}
-
-
-
-
-
-
-
- {__(
- 'Change address to login script',
- 'security-malware-firewall',
- )}
-
-
- {__(
- `Please note that this will not hide the
- links to your registration page on your website.`,
- 'security-malware-firewall',
- )}
-
-
-
-
-
- {__('Login URL:', 'security-malware-firewall')}
- https://nb-wp691.local/?
-
-
-
-
-
-
- {__('Redirect URL:', 'security-malware-firewall')}
- https://nb-wp691.local/?
-
-
-
- {__(
- 'If someone tries to access the default login page they will be redirected to the URL above.',
- 'security-malware-firewall',
- )}
-
-
-
-
-
-
- ({__(
- 'Send the notification with the new login page URL to the admin email address',
- 'security-malware-firewall',
- )})
-
-
-
- {__('The email will be send to', 'security-malware-firewall')}
- (test@test.test)
-
-
-
-
-
- {__(
- 'Change unique and secret authentication keys and salts',
- 'security-malware-firewall',
- )}
-
-
-
- {__(
- 'The function updates the secret keys and salts. All users will need to log in again.',
- 'security-malware-firewall',
- )}
-
-
- {__('Shuffle salts', 'security-malware-firewall')}
-
-
-
- );
-}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js
new file mode 100644
index 000000000..2acbd2748
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/editTechSupportUrlUtils.js
@@ -0,0 +1,23 @@
+/**
+ * @param {object|undefined} groupSettings
+ * @return {boolean}
+ */
+export function isAuth2faActive(groupSettings) {
+ if (!groupSettings) {
+ return false;
+ }
+ const x = groupSettings['2fa__enable'];
+ return x === 1 || x === '1' || x === -1 || x === '-1';
+}
+
+/**
+ * @param {object|undefined} groupSettings
+ * @return {boolean}
+ */
+export function isEditTechSupportUrlEnabled(groupSettings) {
+ if (!groupSettings) {
+ return false;
+ }
+ const v = groupSettings['edit_tech_support_url__enabled'];
+ return v === 1 || v === '1' || v === true;
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.js b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.js
new file mode 100644
index 000000000..7bf2a909e
--- /dev/null
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/Settings/loginPageRenameUtils.js
@@ -0,0 +1,11 @@
+/**
+ * @param {object|undefined} groupSettings
+ * @return {boolean}
+ */
+export function isLoginPageRenameEnabled(groupSettings) {
+ if (!groupSettings) {
+ return false;
+ }
+ const v = groupSettings['login_page_rename__enabled'];
+ return v === 1 || v === '1' || v === true;
+}
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js b/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js
index a42e7957a..654a022f3 100644
--- a/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/SettingsGroup.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, {useState, useEffect, useCallback} from 'react';
import SettingApiKey from './Settings/SettingApiKey';
import SettingWpmsWorkMode from './Settings/SettingWpmsWorkMode';
import SettingWpmsHosterApiKey from './Settings/SettingWpmsHosterApiKey';
@@ -8,22 +8,72 @@ import BfpAllowedWrongAuths from './Settings/BfpAllowedWrongAuths';
import BfpCountInterval from './Settings/BfpCountInterval';
import BfpBlockPeriod5Fails from './Settings/BfpBlockPeriod5Fails';
import CheckPassEnable from './Settings/CheckPassEnable';
+import CheckPassRoles from './Settings/CheckPassRoles';
+import Settings2faEnable from './Settings/2faEnable';
+import Settings2faRoles from './Settings/2faRoles';
+import EditTechSupportUrlEnabled from './Settings/EditTechSupportUrlEnabled';
+import EditTechSupportUrlLink from './Settings/EditTechSupportUrlLink';
+import EditTechSupportUrlRemove from './Settings/EditTechSupportUrlRemove';
+import LoginPageRenameEnabled from './Settings/LoginPageRenameEnabled';
+import LoginPageRenameName from './Settings/LoginPageRenameName';
+import LoginPageRenameRedirect from './Settings/LoginPageRenameRedirect';
+import LoginPageRenameSendEmail from './Settings/LoginPageRenameSendEmail';
+import ActionShuffleSalts from './Settings/ActionShuffleSalts';
export default function SettingsGroup(props) {
- const {groupId, groupTitle, settings, settingsSlug, keyIsOk} = props;
+ const {
+ groupId,
+ groupTitle,
+ settings,
+ settingsSlug,
+ keyIsOk,
+ wpUserRolesOptions,
+ verificationEmail,
+ authLoginPageUrl,
+ techSupportUrlPrefix,
+ loginRenameNotifyAdminEmail,
+ canActivatePlugins,
+ shuffleSaltsUnlocked,
+ } = props;
+
+ const [liveAuthSettings, setLiveAuthSettings] = useState(settings);
+
+ useEffect(() => {
+ if (groupId === 'auth_and_logging_in') {
+ setLiveAuthSettings(settings);
+ }
+ }, [groupId, settings]);
+
+ const patchAuthSetting = useCallback((key, val) => {
+ setLiveAuthSettings((prev) => ({...prev, [key]: val}));
+ }, []);
+
+ const displaySettings =
+ groupId === 'auth_and_logging_in' ? liveAuthSettings : settings;
const componentMap = {
- spbc_key: SettingApiKey,
- ms__work_mode: SettingWpmsWorkMode,
- ms__hoster_api_key: SettingWpmsHosterApiKey,
+ 'spbc_key': SettingApiKey,
+ 'ms__work_mode': SettingWpmsWorkMode,
+ 'ms__hoster_api_key': SettingWpmsHosterApiKey,
// BFP settings
- bfp__delay__1_fails: BfpDelay1Fails,
- bfp__delay__5_fails: BfpDelay5Fails,
- bfp__allowed_wrong_auths: BfpAllowedWrongAuths,
- bfp__count_interval: BfpCountInterval,
- bfp__block_period__5_fails: BfpBlockPeriod5Fails,
+ 'bfp__delay__1_fails': BfpDelay1Fails,
+ 'bfp__delay__5_fails': BfpDelay5Fails,
+ 'bfp__allowed_wrong_auths': BfpAllowedWrongAuths,
+ 'bfp__count_interval': BfpCountInterval,
+ 'bfp__block_period__5_fails': BfpBlockPeriod5Fails,
// Passleak settings
- check_pass__enable: CheckPassEnable,
+ 'check_pass__enable': CheckPassEnable,
+ 'check_pass__roles': CheckPassRoles,
+ '2fa__enable': Settings2faEnable,
+ '2fa__roles': Settings2faRoles,
+ 'edit_tech_support_url__enabled': EditTechSupportUrlEnabled,
+ 'edit_tech_support_url__link': EditTechSupportUrlLink,
+ 'edit_tech_support_url__remove': EditTechSupportUrlRemove,
+ 'login_page_rename__enabled': LoginPageRenameEnabled,
+ 'login_page_rename__name': LoginPageRenameName,
+ 'login_page_rename__redirect': LoginPageRenameRedirect,
+ 'login_page_rename__send_email_notification': LoginPageRenameSendEmail,
+ 'action_shuffle_salts': ActionShuffleSalts,
// ... other different types
};
@@ -48,7 +98,7 @@ export default function SettingsGroup(props) {
{settingKeys.map((settingKey, index) => {
- const settingValue = settings[settingKey];
+ const settingValue = displaySettings[settingKey];
const settingName = `${settingsSlug}[${settingKey}]`;
const Component = componentMap[settingKey];
@@ -72,6 +122,17 @@ export default function SettingsGroup(props) {
name={settingName}
value={settingValue}
keyIsOk={keyIsOk}
+ groupSettings={displaySettings}
+ wpUserRolesOptions={wpUserRolesOptions}
+ verificationEmail={verificationEmail}
+ authLoginPageUrl={authLoginPageUrl}
+ techSupportUrlPrefix={techSupportUrlPrefix}
+ loginRenameNotifyAdminEmail={loginRenameNotifyAdminEmail}
+ canActivatePlugins={canActivatePlugins}
+ shuffleSaltsUnlocked={shuffleSaltsUnlocked}
+ onAuthSettingChange={
+ groupId === 'auth_and_logging_in' ? patchAuthSetting : undefined
+ }
/>
);
diff --git a/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js b/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
index ad1d489aa..4139ab121 100644
--- a/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
+++ b/js/src/react/components/TabContent/TabSettingsGeneral/TabSettingsGeneral.js
@@ -56,13 +56,14 @@ export default function TabSettingsGeneral({sectionId, sectionData, isActive}) {
// Enabling the salt update button and repeatedly pressing
let actionShuffleSaltsCountClicks = 0;
- jQuery('#action-shuffle-salts').click(function(e) {
+ jQuery(document).on('click', '#action-shuffle-salts', function(e) {
e.preventDefault();
+ const btn = jQuery(this);
- if (jQuery(this).hasClass('disabled')) {
+ if (btn.hasClass('disabled')) {
actionShuffleSaltsCountClicks++;
if (actionShuffleSaltsCountClicks === 3) {
- jQuery(this).removeClass('disabled');
+ btn.removeClass('disabled');
}
} else {
actionShuffleSaltsCountClicks = 0;
@@ -151,6 +152,13 @@ export default function TabSettingsGeneral({sectionId, sectionData, isActive}) {
settingsSlug={settings.strings?.settingsSlug}
settings={settings.objects?.settings}
keyIsOk={keyIsOk}
+ wpUserRolesOptions={settings.objects?.wp_user_roles_options}
+ verificationEmail={settings.strings?.two_fa_verification_email_recipient}
+ authLoginPageUrl={settings.strings?.auth_login_page_url}
+ techSupportUrlPrefix={settings.strings?.tech_support_url_field_prefix}
+ loginRenameNotifyAdminEmail={settings.strings?.login_rename_notify_admin_email}
+ canActivatePlugins={settings.flags?.canActivatePlugins}
+ shuffleSaltsUnlocked={settings.flags?.shuffleSaltsUnlocked}
/>
{/* Legacy way to render settings, step-by-step refactored */}
diff --git a/js/src/react/pageElements/HiddenElements/HiddenElements.js b/js/src/react/pageElements/HiddenElements/HiddenElements.js
deleted file mode 100644
index 8759d2ede..000000000
--- a/js/src/react/pageElements/HiddenElements/HiddenElements.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import React from 'react';
-import './styles.css';
-
-export default function HiddenElements(props) {
- return (
- <>
-
- >
- );
-}
diff --git a/js/src/react/pageElements/HiddenElements/styles.css b/js/src/react/pageElements/HiddenElements/styles.css
deleted file mode 100644
index e69de29bb..000000000
diff --git a/js/src/spbc-settings.js b/js/src/spbc-settings.js
index 1878b334d..25d4a3446 100644
--- a/js/src/spbc-settings.js
+++ b/js/src/spbc-settings.js
@@ -322,69 +322,6 @@ function spbcScannerReloadScanInfo() { // eslint-disable-line no-unused-vars
spbcSendAJAXRequest(data, params);
}
-/**
- * Generate and save confirmation code
- *
- * @return {object}
- */
-function spbctGenerateConfirmationCode() {
- let data = {};
- let res = {};
- res.success = false;
- data.security = spbcSettings.ajax_nonce;
- data.action = 'spbc_generate_confirmation_code';
-
- jQuery.ajax({
- type: 'POST',
- async: false,
- url: spbcSettings.ajaxurl,
- data: data,
- success: function(result) {
- if (result.success) {
- res.success = true;
- } else {
- res.text = result.data;
- }
- },
- });
- return res;
-}
-
-/**
- * Check confirmation code
- *
- * @param {object} radioButton
- * @param {number} timeout
- * @param {object} timer
- */
-function spbctCheckConfirmationCode( radioButton, timeout, timer ) {
- let element = radioButton;
- let data = {};
- data.security = spbcSettings.ajax_nonce;
- data.action = 'spbc_check_confirmation_code';
- data.code = jQuery('#confirmation-code input').val();
-
- jQuery.ajax({
- type: 'POST',
- async: false,
- url: spbcSettings.ajaxurl,
- data: data,
- success: function(result) {
- if (result.success) {
- jQuery('[name *= 2fa__enable]').attr('checked', '');
- element.checked = true;
- jQuery('#spbc_setting_2fa__roles').removeAttr('disabled');
- jQuery('#spbc_setting_2fa__roles > option:first').attr('selected', 'selected');
- clearTimeout( timeout );
- timer.remove();
- jQuery('#confirmation-code').dialog( 'close' );
- } else {
- alert('Code verification failed!');
- }
- },
- });
-}
-
/**
* Checking current account status for renew notice
*/
@@ -410,45 +347,6 @@ function spbcBannerCheck() {
}
jQuery(document).ready(function() {
- // Checking email receiving possibility for activation 2FA
- jQuery(document).on('click', '[name*=fa__enable]:not([value=0]),#confirmation-code--resend', function(e) {
- e.preventDefault();
-
- let view = '';
- jQuery('#confirmation-code--resend').attr('disabled', 'disabled')
- .append(view);
- let enableResend = setTimeout(function() {
- jQuery('#confirmation-code--resend').removeAttr('disabled');
- jQuery('#confirmation-code--resend>.circle').remove();
- }, 30000);
-
- let res = spbctGenerateConfirmationCode();
- if ( res.success ) {
- jQuery('#confirmation-code input').val('');
- jQuery('#confirmation-code').dialog({
- modal: true,
- title: 'Confirmation code',
- width: 310,
- buttons: {
- Cancel: function() {
- jQuery( this ).dialog( 'close' );
- clearTimeout( enableResend );
- jQuery('#confirmation-code--resend>.circle').remove();
- },
- Ok: function() {
- let selector = '#confirmation-code--resend>.circle';
- spbctCheckConfirmationCode(e.target, enableResend, jQuery(selector));
- },
- },
- draggable: false,
- resizable: false,
- });
- } else {
- alert(res.text);
- }
- });
-
if (jQuery('#spbc_renew_notice').length || jQuery('#spbc_trial_notice').length) {
spbcBannerCheck();
}
diff --git a/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php b/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php
index b5727f744..b0c92399d 100644
--- a/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php
+++ b/lib/CleantalkSP/SpbctWP/Settings/SettingsGeneralReact.php
@@ -10,15 +10,37 @@ public static function getReactData()
{
global $spbc;
+ $user = wp_get_current_user();
+ $email = (isset($user->ID) && $user->ID > 0) ? $user->user_email : spbc_get_admin_email();
+
+ $storage_settings = (isset($spbc->storage['settings']) && is_array($spbc->storage['settings'])) ?
+ $spbc->storage['settings'] :
+ (array) $spbc->settings;
+
+ $auth_login_url = wp_login_url();
+ if (
+ ! empty($storage_settings['login_page_rename__enabled']) &&
+ ! empty($storage_settings['login_page_rename__name'])
+ ) {
+ $auth_login_url = get_site_url() . '/' . $storage_settings['login_page_rename__name'];
+ }
+
$data['strings'] = [
'settingsSlug' => SPBC_SETTINGS,
- 'nonce' => wp_create_nonce(SPBC_SETTINGS . '-options')
+ 'nonce' => wp_create_nonce(SPBC_SETTINGS . '-options'),
+ 'two_fa_verification_email_recipient' => $email,
+ 'auth_login_page_url' => $auth_login_url,
+ 'tech_support_url_field_prefix' => get_home_url() . '/' . (get_option('permalink_structure', false) ? '' : '?'),
+ 'login_rename_notify_admin_email' => spbc_get_admin_email(),
];
$data['flags'] = [
- 'keyIsOk' => $spbc->key_is_ok
+ 'keyIsOk' => (bool) $spbc->key_is_ok,
+ 'canActivatePlugins' => (bool) current_user_can('activate_plugins'),
+ 'shuffleSaltsUnlocked' => ! empty($spbc->settings['there_was_signature_treatment']),
];
$data['objects'] = [
- 'settings' => self::groupSettings(array_merge((array)$spbc->network_settings, (array)$spbc->settings))
+ 'settings' => self::groupSettings(array_merge((array)$spbc->network_settings, (array)$spbc->settings)),
+ 'wp_user_roles_options' => self::getWpUserRolesOptionsForReact(),
];
$dto = new ReactDataDTO($data);
@@ -53,8 +75,7 @@ private static function groupSettings($settings)
$key === 'bfp__allowed_wrong_auths' ||
$key === 'bfp__count_interval' ||
$key === 'bfp__block_period__5_fails' ||
- $key === 'check_pass__enable'
- /* Future iterations may include:
+ $key === 'check_pass__enable' ||
$key === 'check_pass__roles' ||
$key === '2fa__enable' ||
$key === '2fa__roles' ||
@@ -64,7 +85,7 @@ private static function groupSettings($settings)
$key === 'login_page_rename__enabled' ||
$key === 'login_page_rename__name' ||
$key === 'login_page_rename__redirect' ||
- $key === 'login_page_rename__send_email_notification' */
+ $key === 'login_page_rename__send_email_notification'
) {
$grouped_settings['auth_and_logging_in'][$key] = $value;
}
@@ -79,7 +100,10 @@ private static function groupSettings($settings)
}
// Reorder auth_and_logging_in settings to ensure correct display order
- if (!empty($grouped_settings['auth_and_logging_in'])) {
+ if (! empty($grouped_settings['auth_and_logging_in'])) {
+ // UI-only field (not a saved option); rendered by React ActionShuffleSalts
+ $grouped_settings['auth_and_logging_in']['action_shuffle_salts'] = true;
+
$auth_settings_order = [
'bfp__heading',
'bfp__delay__1_fails',
@@ -88,6 +112,17 @@ private static function groupSettings($settings)
'bfp__count_interval',
'bfp__block_period__5_fails',
'check_pass__enable',
+ 'check_pass__roles',
+ '2fa__enable',
+ '2fa__roles',
+ 'edit_tech_support_url__enabled',
+ 'edit_tech_support_url__link',
+ 'edit_tech_support_url__remove',
+ 'login_page_rename__enabled',
+ 'login_page_rename__name',
+ 'login_page_rename__redirect',
+ 'login_page_rename__send_email_notification',
+ 'action_shuffle_salts',
];
$ordered = [];
foreach ($auth_settings_order as $key) {
@@ -100,4 +135,25 @@ private static function groupSettings($settings)
return $grouped_settings;
}
+
+ /**
+ * Role slugs and labels for React multiselects (matches PHP settings fields).
+ *
+ * @return array
+ */
+ private static function getWpUserRolesOptionsForReact()
+ {
+ $wp_roles = wp_roles();
+ $out = array();
+
+ foreach ($wp_roles->roles as $slug => $details) {
+ $name = isset($details['name']) ? $details['name'] : (string) $slug;
+ $out[] = array(
+ 'value' => (string) $slug,
+ 'label' => $name,
+ );
+ }
+
+ return $out;
+ }
}
diff --git a/lib/CleantalkSP/SpbctWP/UsersPassCheckModule/UserPassCheckView.php b/lib/CleantalkSP/SpbctWP/UsersPassCheckModule/UserPassCheckView.php
index 34904bf71..6acab735f 100644
--- a/lib/CleantalkSP/SpbctWP/UsersPassCheckModule/UserPassCheckView.php
+++ b/lib/CleantalkSP/SpbctWP/UsersPassCheckModule/UserPassCheckView.php
@@ -33,6 +33,9 @@ class UserPassCheckView
'activate_plugins'
);
+ /**
+ * @psalm-suppress PossiblyUnusedMethod
+ */
public static function getRolesSelect()
{
global $spbc, $wp_roles;
diff --git a/lib/CleantalkSP/SpbctWP/Views/Settings.php b/lib/CleantalkSP/SpbctWP/Views/Settings.php
index 485daaba7..3a8a7f916 100644
--- a/lib/CleantalkSP/SpbctWP/Views/Settings.php
+++ b/lib/CleantalkSP/SpbctWP/Views/Settings.php
@@ -35,7 +35,6 @@ public static function page()
'supportLink' => self::getSupportLink(),
'textSupportLink' => $spbc->data["wl_mode_enabled"] ? $spbc->data["wl_support_url"] : 'wordpress.org',
'homepage' => $spbc->data["wl_url"],
- 'twoFactorAuth' => self::get2FADialog(),
//todo We should not use the brand name to tell this is registered trademark. We are not sure.
'trademark' => $spbc->data["wl_brandname"] . __(' is a registered trademark. All rights reserved.', 'security-malware-firewall'),
'feedback' => self::getFeedbackRequest(),
@@ -143,26 +142,6 @@ private static function getFeedbackRequest()
return $feedback_link;
}
- private static function get2FADialog()
- {
- $user = wp_get_current_user();
- if (isset($user->ID) && $user->ID > 0) {
- $email = $user->user_email;
- } else {
- $email = spbc_get_admin_email();
- }
-
- return ''
- . '
' . sprintf(
- esc_html__('Check %s inbox for the confirmation code.', 'cleantalk'),
- $email
- ) . '
'
- . '
' . esc_html__('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') . ' '
- . '
'
- . '
Resend '
- . '
';
- }
-
private static function goToCleantalkLink()
{
global $spbc;