https://kronika.civilradio.hu/wp-content/plugins/wordfence/modules…/js/login.1790780879.js?ver=9.0.1
1(function($) { 2 function __(string) { 3 if (window.WFLS_LOGIN_TRANSLATIONS && window.WFLS_LOGIN_TRANSLATIONS[string]) { 4 return window.WFLS_LOGIN_TRANSLATIONS[string]; 5 } 6 if (window.wflsi18n && typeof window.wflsi18n.__ === 'function') { 7 return window.wflsi18n.__(string); 8 } 9 return string; 10 } 11 // Login help is plain text, including localized content; Zebra must not parse it as HTML. 12 !function(Z){"use strict";Z.Zebra_Tooltips=function(t,l){var u,T,b,v,n={animation_speed:250,animation_offset:20,close_on_click:!0,content:!(this.version="2.1.0"),hide_delay:100,keep_visible:!0,max_width:250,opacity:".95",position:"center",prerender:!1,show_delay:100,vertical_alignment:"above",vertical_offset:0,onBeforeHide:null,onHide:null,onBeforeShow:null,onShow:null},r=this,_=function(e){var t,o,i,a,l,n,r,_,s,p,d,h,c,f,w=e.data("Zebra_Tooltip"),m=Z(window);return w.tooltip||(t=Z("<div>",{"class":"Zebra_Tooltip",css:{opacity:0,display:"block"}}),o=Z("<div>",{"class":"Zebra_Tooltip_Message",css:{maxWidth:w.max_width}}).text(w.content).appendTo(t),i=Z("<div>",{"class":"Zebra_Tooltip_Arrow"}).appendTo(t),a=Z("<div>").addClass("Zebra_Tooltip_Arrow_Border").appendTo(i),Z("<div>").appendTo(i),w.keep_visible&&(t.on("mouseleave"+(w.close_on_click?" click":""),function(){y(e)}),t.on("mouseenter",function(){g(e)})),t.appendTo("body"),w.sticky&&o.addClass("Zebra_Tooltip_Has_Close"),l=t.outerWidth(),n=t.outerHeight(),r=a.outerWidth(),_=a.outerHeight(),s=o.outerWidth(),p=o.outerHeight(),w={tooltip:t,tooltip_width:l,tooltip_height:n+_/2,message:o,arrow_container:i,arrow_width:r,arrow_height:_,arrow:a},t.css({width:w.tooltip_width,height:w.tooltip_height}),w.tooltip_width=w.tooltip_width+(o.outerWidth()-s),w.tooltip_height=w.tooltip_height+(o.outerHeight()-p),t.css({width:w.tooltip_width,height:w.tooltip_height,display:"none"}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),w.sticky&&!w.close&&(Z("<a>",{"class":"Zebra_Tooltip_Close",href:"javascript:void(0)"}).html("×").on("click",function(t){t.preventDefault();var o=e.data("Zebra_Tooltip");o.sticky=!1,e.data("Zebra_Tooltip",o),y(e)}).appendTo(w.message),w.close=!0,w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w)),u=m.width(),T=m.height(),d=e.offset(),Z.extend(w,{element_left:d.left,element_top:d.top,element_width:e.outerWidth(),element_height:e.outerHeight()}),v=m.scrollTop(),b=m.scrollLeft(),h="left"===w.position?w.element_left-w.tooltip_width+w.arrow_width:"right"===w.position?w.element_left+w.element_width-w.arrow_width:w.element_left+(w.element_width-w.tooltip_width)/2,c=w.element_top-w.tooltip_height,f="left"===w.position?w.tooltip_width-w.arrow_width-w.arrow_width/2:"right"===w.position?w.arrow_width/2:(w.tooltip_width-w.arrow_width)/2,h+w.tooltip_width>u+b&&(f-=u+b-(h+w.tooltip_width)-6,h=u+b-w.tooltip_width-6,f+w.arrow_width>w.tooltip_width-6&&(f=w.tooltip_width-6-w.arrow_width),h+f+w.arrow_width/2<w.element_left&&(f=-1e4)),h<b&&(f-=b-h,h=b+2,f<0&&(f=w.arrow_width/2),h+f+w.arrow_width/2>w.element_left+w.element_width&&(f=-1e4)),w.message.css("margin-top",""),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Top").addClass("Zebra_Tooltip_Arrow_Bottom"),c<v||"below"===w.vertical_alignment&&w.element_top+w.element_height+w.vertical_offset+w.tooltip_height+w.animation_offset<T+v?(c=w.element_top+w.element_height-w.vertical_offset,w.animation_offset=Math.abs(w.animation_offset),w.message.css("margin-top",w.arrow_height/2),w.arrow_container.removeClass("Zebra_Tooltip_Arrow_Bottom").addClass("Zebra_Tooltip_Arrow_Top")):(w.animation_offset=-Math.abs(w.animation_offset),c+=w.vertical_offset),w.arrow_container.css("left",f),w.tooltip.css({left:h,top:c}),Z.extend(w,{tooltip_left:h,tooltip_top:c,arrow_left:f}),w=Z.extend(e.data("Zebra_Tooltip"),w),e.data("Zebra_Tooltip",w),w},g=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.show_timeout),o.muted||(clearTimeout(o.hide_timeout),o.show_timeout=setTimeout(function(){(o=_(t)).onBeforeShow&&"function"==typeof o.onBeforeShow&&!1===o.onBeforeShow(t,o.tooltip)||("block"!==o.tooltip.css("display")&&o.tooltip.css({top:o.tooltip_top+o.animation_offset}),o.tooltip.css("display","block"),o.tooltip.stop(),o.tooltip.animate({top:o.tooltip_top,opacity:o.opacity},o.animation_speed,function(){o.onShow&&"function"==typeof o.onShow&&o.onShow(t,o.tooltip)}))},o.show_delay))},y=function(t){var o=t.data("Zebra_Tooltip");clearTimeout(o.hide_timeout),o.sticky||(clearTimeout(o.show_timeout),o.hide_timeout=setTimeout(function(){if(o.tooltip){if(o.onBeforeHide&&"function"==typeof o.onBeforeHide&&!1===o.onBeforeHide(t,o.tooltip))return;o.close=!1,o.destroy&&(o.muted=!0),t.data("Zebra_Tooltip",o),Z("a.Zebra_Tooltip_Close",o.tooltip).remove(),o.tooltip.stop(),o.tooltip.animate({opacity:0,top:o.tooltip_top+o.animation_offset},o.animation_speed,function(){Z(this).css("display","none"),o.on
12Hide&&"function"==typeof o.onHide&&o.onHide(t,o.tooltip)})}},o.hide_delay))};r.hide=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),y(t))})},r.show=function(t,e){t.each(function(){var t=Z(this),o=t.data("Zebra_Tooltip");o&&(o.sticky=!0,o.muted=!1,e&&(o.destroy=!0),t.data("Zebra_Tooltip",o),g(t))})},t.each(function(){var t,o=Z(this),e=o.attr("title"),i=o.data(),a={};for(t in i)0===t.indexOf("ztt_")&&(t=t.replace(/^ztt\_/,""),void 0!==n[t]&&(a[t]=i["ztt_"+t]));a=Z.extend(n,r.settings,l,a),e&&(a.content=o.attr("title")),void 0!==a.content&&""!==a.content.trim()&&(o.on({mouseenter:function(){e&&Z(this).attr("title",""),g(o)},mouseleave:function(){y(o),e&&Z(this).attr("title",e)}}),o.data("Zebra_Tooltip",Z.extend({tooltip:null,show_timeout:null,hide_timeout:null,sticky:!1,destroy:!1,muted:!1},a)),a.prerender&&_(o))})}}($); 13 14 function selectorSearch(selectors) { 15 var input = null; 16 return function() { 17 if (input !== null) 18 return input; 19 for (var i = 0; i < selectors.length; i++) { 20 input = $(selectors[i]); 21 if (input.length === 1) 22 return input; 23 } 24 input = null; 25 return input; 26 } 27 }; 28 function FormElementLocator(inputSelectors, extraSelectors) { 29 var self = this; 30 31 if (typeof extraSelectors == 'undefined') 32 extraSelectors = {}; 33 34 var found = false; 35 var input = null, form = null, extra = {}; 36 37 var findInput = selectorSearch(inputSelectors); 38 var search = function() { 39 input = findInput(); 40 if (input === null) 41 return false; 42 form = input.closest('form'); 43 if (form.length !== 1) { 44 form = null; 45 return false; 46 } 47 for (var key in extraSelectors) { 48 var match = form.find(extraSelectors[key]); 49 if (match.length === 1) { 50 extra[key] = match; 51 } 52 else { 53 return false; 54 } 55 } 56 return true; 57 }; 58 this.locate = function() { 59 if (!found) 60 found = search(); 61 return found; 62 }; 63 this.getInput = function() { 64 return found ? input : null; 65 }; 66 this.getForm = function() { 67 return found ? form : null; 68 }; 69 this.getExtra = function(key) { 70 if (key in extra) 71 return extra[key]; 72 return null; 73 } 74 } 75 var loginLocator = new FormElementLocator( 76 [ 77 'input[name=log]', 78 'input[name=username]', 79 'input#username[name=username]', 80 '.woocommerce-form-login input[name=username]', 81 '.login input[name=username]' 82 ], 83 { 84 password: 'input[name="pwd"],input[name=password]' 85 } 86 ); 87 var registrationLocator = new FormElementLocator([ 88 'input[name=user_login]', 89 '#reg_email', 90 '.woocommerce-form-register input[name=email]', 91 '.register input[name=email]' 92 ]); 93 const locators = [ 94 loginLocator, 95 registrationLocator 96 ]; 97 function findLoginSubmit(form) { 98 var selectors = [ 99 'input#wp-submit', 100 'input[name=wp-submit]', 101 'button[type=submit][name=login]', 102 'input[type=submit][name=login]', 103 '.woocommerce-form-login__submit', 104 'input[type=submit]', 105 'button[type=submit]' 106 ]; 107 for (var i = 0; i < selectors.length; i++) { 108 var matches = form.find(selectors[i]); 109 var visible = matches.filter(':visible'); 110 if (visible.length) { 111 return visible.first(); 112 } 113 if (matches.length) { 114 return matches.first(); 115 } 116 } 117 return $(); 118 } 119 function getRelevantInputs() { 120 var inputs = $(); 121 for (var i = 0; i < locators.length; i++) { 122 if (locators[i].locate()) 123 inputs = inputs.add(locators[i].getInput()); 124 } 125 return inputs; 126 } 127 128 var wfls_init_captcha = function(actionCallback, log) { 129 if (typeof log === 'undefined') 130 log = getRelevantInputs(); 131 if (typeof grecaptcha === 'object') { 132 grecaptcha.ready(function() { 133 grecaptcha.execute(WFLSVars.recaptchasitekey, {action: 'login'}).then(function(token) { 134 var tokenField = $('#wfls-captcha-token'); 135 if (tokenField.length) { 136 tokenField.val(token); 137 } 138 else { 139 if (log.length) { 140 tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />'); 141 tokenField.val(token); 142 log.parent().append(tokenField); 143 } 144 } 145 146 typeof actionCallback === 'function' && actionCallback(true); 147 }); 148 }); 149 } 150 else { 151 var tokenField = $('#wfls-captcha-token'); 152 if (tokenField.length) { 153 tokenField.val('grecaptcha-missing'); 154 } 155 else { 156 if (log.length) { 157 tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />'); 158 tokenField.val('grecaptcha-missing'); 159 log.parent().append(tokenField); 160 } 161 } 162 163 typeof actionCallback === 'function' && actionCallback(true); 164 } 165 }; 166 167 function wfls_base64url_to_uint8array(base64url) { 168 var padding = '='.repeat((4 - (base64url.length % 4)) % 4); 169 var base64 = (base64url + padding).replace(/-/g, '+').replace(/_/g, '/'); 170 var raw = window.atob(base64); 171 var bytes = new Uint8Array(raw.length); 172 for (var i = 0; i < raw.length; i++) { 173 bytes[i] = raw.charCodeAt(i); 174 } 175 return bytes; 176 } 177 178 function wfls_arraybuffer_to_base64url(buffer) { 179 var bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); 180 var binary = ''; 181 for (var i = 0; i < bytes.length; i++) { 182 binary += String.fromCharCode(bytes[i]); 183 } 184 return window.btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, ''); 185 } 186 187 function wfls_passkey_request_options_from_json(options) { 188 var parsed = $.extend(true, {}, options); 189 parsed.challenge = wfls_base64url_to_uint8array(parsed.challenge); 190 if (parsed.allowCredentials && parsed.allowCredentials.length) { 191 for (var i = 0; i < parsed.allowCredentials.length; i++) { 192 parsed.allowCredentials[i].id = wfls_base64url_to_uint8array(parsed.allowCredentials[i].id); 193 } 194 } 195 return parsed; 196 } 197 198 function wfls_assertion_to_json(assertion) { 199 return { 200 id: assertion.id, 201 type: assertion.type, 202 rawId: wfls_arraybuffer_to_base64url(assertion.rawId), 203 response: { 204 clientDataJSON: wfls_arraybuffer_to_base64url(assertion.response.clientDataJSON), 205 authenticatorData: wfls_arraybuffer_to_base64url(assertion.response.authenticatorData), 206 signature: wfls_arraybuffer_to_base64url(assertion.response.signature), 207 userHandle: assertion.response.userHandle ? wfls_arraybuffer_to_base64url(assertion.response.userHandle) : null 208 } 209 }; 210 } 211 212 function wfls_passkey_error_message(error, fallback) { 213 if (wfls_passkeys_require_https()) {
214 return __('Passkey login requires HTTPS. Open this site using https:// and try again.'); 215 } 216 if (!error) { 217 return fallback; 218 } 219 if (error.name && error.message) { 220 return error.name + ': ' + error.message; 221 } 222 if (error.message) { 223 return error.message; 224 } 225 return fallback; 226 } 227 228 function wfls_passkeys_require_https() { 229 return window.location && window.location.protocol === 'http:' && window.location.hostname !== 'localhost'; 230 } 231 232 function wfls_passkey_redirect_target(form) { 233 var redirect = form.find('input[name=redirect_to]').first(); 234 if (redirect.length && redirect.val()) { 235 return redirect.val(); 236 } 237 if ($('.woocommerce').length > 0) { 238 return window.location.href; 239 } 240 return ''; 241 } 242 243 function wfls_is_interim_login(form) { 244 var interim = form.find('input[name="interim-login"]').first(); 245 return (interim.length && interim.val()) || window.location.search.indexOf('interim-login=1') >= 0; 246 } 247 248 function wfls_has_same_origin_parent_frame() { 249 if (!window.parent || window.parent === window) { 250 return false; 251 } 252 253 try { 254 return window.parent.location.protocol === window.location.protocol && window.parent.location.host === window.location.host; 255 } 256 catch (e) { 257 return false; 258 } 259 } 260 261 function wfls_allows_same_relying_party_frame_login(form) { 262 return !!wfls_is_interim_login(form) && wfls_has_same_origin_parent_frame(); 263 } 264 265 function wfls_complete_passkey_login(form, redirect) { 266 if (wfls_is_interim_login(form)) { 267 if (window.parent && window.parent !== window) { 268 try { 269 if (window.parent.jQuery) { 270 window.parent.jQuery(window.parent).off('beforeunload.wp-auth-check'); 271 } 272 window.parent.location.reload(); 273 return; 274 } 275 catch (e) {} 276 } 277 278 window.location.reload(); 279 return; 280 } 281 282 window.location.href = redirect || window.location.href; 283 } 284 285 function wfls_begin_passkey_login_request(form, onSuccess, onError) { 286 $.ajax({ 287 type: 'POST', 288 url: WFLSVars.ajaxurl, 289 dataType: 'json', 290 data: { 291 action: 'wordfence_ls_begin_passkey_login', 292 interim_login: wfls_allows_same_relying_party_frame_login(form) ? 1 : 0 293 }, 294 success: function(json) { 295 if (json.hasOwnProperty('error')) { 296 onError(json.error); 297 return; 298 } 299 onSuccess(json); 300 }, 301 error: function() { 302 onError(__('An error was encountered while trying to start passkey login. Please try again.'), true); 303 } 304 }); 305 } 306 307 function wfls_post_finish_passkey_login(button, form, token, assertion) { 308 var remember = false; 309 form.find('input[name=rememberme], input[name=remember]').each(function() { 310 if ($(this).is(':checkbox') && $(this).is(':checked')) { 311 remember = true; 312 } 313 else if (!$(this).is(':checkbox') && $(this).val()) { 314 remember = true; 315 } 316 }); 317 318 $.ajax({ 319 type: 'POST', 320 url: WFLSVars.ajaxurl, 321 dataType: 'json', 322 data: { 323 action: 'wordfence_ls_finish_passkey_login', 324 token: token, 325 credential: wfls_assertion_to_json(assertion), 326 rememberme: remember ? 1 : 0, 327 redirect_to: wfls_passkey_redirect_target(form) 328 }, 329 success: function(json) { 330 button.prop('disabled', false).removeClass('disabled'); 331 if (json.hasOwnProperty('error')) { 332 showLoginMessage(json.error, 'error'); 333 return; 334 } 335 wfls_complete_passkey_login(form, json.redirect || ''); 336 }, 337 error: function() { 338 button.prop('disabled', false).removeClass('disabled'); 339 showLoginMessage(__('An error was encountered while trying to authenticate with a passkey. Please try again.'), 'error', true); 340 } 341 }); 342 } 343 344 function wfls_finish_passkey_login(button, form, token, assertion) { 345 wfls_post_finish_passkey_login(button, form, token, assertion); 346 } 347 348 function wfls_start_passkey_login(button) { 349 if (!loginLocator.locate()) { 350 console.error('Required login elements not found'); 351 return; 352 } 353 354 var form = loginLocator.getForm(); 355 button.prop('disabled', true).addClass('disabled'); 356 357 wfls_begin_passkey_login_request(form, function(json) { 358 navigator.credentials.get({ 359 publicKey: wfls_passkey_request_options_from_json(json.options) 360 }).then(function(assertion) { 361 wfls_finish_passkey_login(button, form, json.token, assertion); 362 }).catch(function(error) { 363 button.prop('disabled', false).removeClass('disabled');
364 if (error && error.name === 'NotAllowedError') { 365 return; 366 } 367 showLoginMessage(wfls_passkey_error_message(error, __('Passkey login could not be completed.')), 'error', true); 368 }); 369 }, function(message, textOnly) { 370 button.prop('disabled', false).removeClass('disabled'); 371 showLoginMessage(message, 'error', textOnly); 372 }); 373 } 374 375 function showLoginMessage(message, type, textOnly) { 376 var contentMethod = textOnly ? 'text' : 'html'; 377 $('.wfls-login-message').remove(); 378 $('#wfls-login-modal').remove(); 379 380 var heading = $('#login > h1'); 381 if (heading.length > 0) { 382 var dom = (type === 'error' ? $('<div id="login_error">') : $('<p class="message">')); 383 dom.addClass('wfls-login-message'); 384 dom.addClass('notice'); 385 if (type === 'error') { 386 dom.addClass('notice-error'); 387 } 388 dom[contentMethod](message); 389 heading.after(dom); 390 dom.get(0).scrollIntoView(); 391 return; 392 } 393 else if ($('.woocommerce').length > 0){ 394 var content = $('<div class="woocommerce wfls-login-message">'); 395 var errorList = $('<ul role="alert">') 396 .addClass(type === 'error' ? 'woocommerce-error' : 'woocommerce-info'); 397 content.append(errorList); 398 errorList.append($('<li>')[contentMethod](message)); 399 var containerSearch = selectorSearch([ 400 '#primary', 401 '.content-area', 402 '#main', 403 '.site-main', 404 'main' 405 ]); 406 var container = containerSearch(); 407 if (container === null) { 408 container = loginLocator.getForm(); 409 } 410 if (container !== null) { 411 container.before(content); 412 content.get(0).scrollIntoView(); 413 return; 414 } 415 } 416 var messageModal = $('<div>') 417 .attr('id', 'wfls-login-modal') 418 .css({ 419 position: 'fixed', 420 top: 0, 421 right: 0, 422 bottom: 0, 423 left: 0, 424 'background-color': 'rgba(0,0,0,0.5)', 425 'z-index': 9999, 426 display: 'flex', 427 'align-items': 'center', 428 'justify-content': 'center', 429 padding: '16px'
430 }) 431 .appendTo($('body')); 432 messageModal.append( 433 $('<div>') 434 .css({ 435 'background-color': '#FFF', 436 'border-radius': '4px', 437 padding: '16px', 438 'text-align': 'center' 439 }) 440 .append( 441 $('<p>')[contentMethod](message) 442 ) 443 .append( 444 $('<button>').text('Dismiss') 445 .on('click', function() { 446 messageModal.remove(); 447 }) 448 ) 449 ); 450 } 451 452 453 var wfls_init_captcha_contact = function() { 454 $('.wfls-registration-captcha-contact').on('click', function(e) { 455 e.preventDefault(); 456 e.stopPropagation(); 457 458 if (registrationLocator.locate()) { 459 $('#wfls-prompt-overlay').remove(); 460 var overlay = $('<div id="wfls-prompt-overlay"></div>'); 461 var wrapper = $('<div id="wfls-prompt-wrapper"></div>'); 462 var field = $('<p><label for="wfls-message"></label><br/><textarea name="wfls-message" id="wfls-message" class="wfls-textarea"></textarea></p>'); 463 field.find('label[for=wfls-message]').text(__('Message to Support')); 464 var nonce = $('<input type="hidden" name="wfls-message-nonce" id="wfls-message-nonce"/>'); 465 var button = $('<p class="submit"><input type="submit" name="wfls-support-submit" id="wfls-support-submit" class="button button-primary button-large"/></p>'); 466 button.find('input[type=submit]').val(__('Send')); 467 wrapper.append(field).append(nonce).append(button); 468 overlay.append(wrapper); 469 registrationLocator.getForm().css('position', 'relative').append(overlay); 470 471 $('#wfls-message-nonce').val($(this).data('token')); 472 473 $('#wfls-support-submit').on('click', function(e) { 474 e.preventDefault(); 475 e.stopPropagation(); 476 477 $('#login_error, p.message').remove(); 478 479 var data = registrationLocator.getForm().serialize(); 480 data += '&action=wordfence_ls_register_support'; 481 482 $.ajax({ 483 type: 'POST', 484 url: WFLSVars.ajaxurl, 485 dataType: 'json', 486 data: data, 487 success: function(json) { 488 if (json.hasOwnProperty('error')) { 489 showLoginMessage(json.error, 'error'); 490 var dom = $('<div id="login_error">' + json.error + '</div>'); 491 $('#login > h1').after(dom); 492 } 493 else if (json.hasOwnProperty('message')) { //Success 494 showLoginMessage(json.message, 'message'); 495 var dom = $('<p class="message">' + json.message + '</p>'); 496 $('#login > h1').after(dom); 497 $('#wfls-support-submit, #wfls-message').attr('disabled', true); 498 } 499 }, 500 error: function(err) { 501 showLoginMessage(__('An error was encountered while trying to send the message. Please try again.'), 'error', true); 502 var dom = $('<div id="login_error"></div>'); 503 dom.html(__('<strong>ERROR</strong>: An error was encountered while trying to send the message. Please try again.')); 504 $('#login > h1').after(dom); 505 } 506 }); 507 }); 508 509 field.find("#wfls-message").focus(); 510 } 511 }); 512 }; 513 514 function FormBlocker(form, buttonSelector, clickOnSubmit) { 515 516 var self = this; 517 var blocked = false; 518 var released = false; 519 clickOnSubmit = clickOnSubmit || false; 520 var clickSubmitInProgress = false; 521 522 this.getButtons = function() { 523 return form.find(buttonSelector); 524 } 525 526 this.block = function() { 527 if (blocked) 528 return false; 529 blocked = true; 530 this.getButtons().addClass('disabled').prop('disabled', true); 531 return true; 532 } 533 534 this.unblock = function() { 535 this.getButtons().removeClass('disabled').prop('disabled', false); 536 blocked = false; 537 } 538 539 this.release = function() { 540 released = true; 541 } 542 543 this.clickSubmit = function() { 544 this.unblock(); 545 var submitButton = this.getButtons().first(); 546 setTimeout(function() { 547 submitButton.trigger('click'); 548 }, 1); 549 } 550 551 this.initialize = function(callback) { 552 form.on('submit', function(event) { 553 if (released && (!clickOnSubmit || clickSubmitInProgress)) { 554 if (clickSubmitInProgress) 555 clickSubmitInProgress = false; 556 return; 557 } 558 event.preventDefault(); 559 event.stopPropagation(); 560 if (released) { 561 clickSubmitInProgress = true; 562 self.clickSubmit(); 563 return; 564 } 565 if (self.block()) { 566 callback(); 567 } 568 }); 569 } 570 571 } 572 573 var wfls_query_ajax = function(blocker) { 574 $('.wfls-login-message').remove(); 575 576 if (!loginLocator.locate()) { 577 console.error('Required login elements not found'); 578 return; 579 } 580 var form = loginLocator.getForm();
581 var log = loginLocator.getInput(); 582 var pwd = loginLocator.getExtra('password'); 583 584 var data = $(form).serialize(); 585 data += '&action=wordfence_ls_authenticate'; 586 587 $.ajax({ 588 type: 'POST', 589 url: WFLSVars.ajaxurl, 590 dataType: 'json', 591 data: data, 592 success: function(json) { 593 if (json.hasOwnProperty('reset') && json.reset) { 594 $('#wfls-prompt-overlay').remove(); 595 } 596 597 if (json.hasOwnProperty('error')) { 598 showLoginMessage(json.error, 'error'); 599 $('#wfls-token').val(''); 600 601 if (parseInt(WFLSVars.useCAPTCHA)) { 602 wfls_init_captcha(); 603 } 604 } 605 else if (json.hasOwnProperty('message')) { 606 showLoginMessage(json.message, 'message'); 607 $('#wfls-token').val(''); 608 609 if (parseInt(WFLSVars.useCAPTCHA)) { 610 wfls_init_captcha(); 611 } 612 } 613 else if (json.hasOwnProperty('login')) { 614 if (json.hasOwnProperty('captcha')) { 615 var captchaField = $('#wfls-captcha-jwt'); 616 if (!captchaField.length) { 617 captchaField = $('<input type="hidden" name="wfls-captcha-jwt" id="wfls-captcha-jwt" value=""/>'); 618 form.append(captchaField); 619 } 620 621 $('#wfls-captcha-jwt').val(json.captcha); 622 } 623 624 blocker.release(); 625 if (json.hasOwnProperty('two_factor_required') && json.two_factor_required) { 626 if ($('#wfls-prompt-overlay').length === 0) { 627 var overlay = $('<div id="wfls-prompt-overlay"></div>'); 628 var wrapper = $('<div id="wfls-prompt-wrapper"></div>'); 629 var label = $('<label for="wfls-token">'); 630 label.text(__('Wordfence 2FA Code') + ' '); 631 label.append($('<a href="javascript:void(0)" class="wfls-2fa-code-help wfls-tooltip-trigger"><i class="dashicons dashicons-editor-help"></i></a>').attr('title', __('The Wordfence 2FA Code can be found within the authenticator app you used when first activating two-factor authentication. You may also use one of your recovery codes.'))); 632 label = $('<p>').append(label); 633 var field = $('<p><input type="text" name="wfls-token" id="wfls-token" aria-describedby="wfls-token-error" class="input" value="" size="6" autocomplete="one-time-code"/></p>'); 634 var remember = $('<p class="wfls-remember-device-wrapper"><label for="wfls-remember-device"><input name="wfls-remember-device" type="checkbox" id="wfls-remember-device" value="1" /> </label></p>'); 635 remember.find('label').append(document.createTextNode(__('Remember for 30 days'))); 636 var button = $('<p class="submit"><input type="submit" name="wfls-token-submit" id="wfls-token-submit" class="button button-primary button-large"/></p>'); 637 button.find('input[type=submit]').val(__('Log In')); 638 wrapper.append(label); 639 wrapper.append(field); 640 if (parseInt(WFLSVars.allowremember)) { 641 wrapper.append(remember); 642 } 643 wrapper.append(button); 644 overlay.append(wrapper); 645 form.css('position', 'relative').append(overlay); 646 form.on('submit', function() { 647 $('#wfls-token-submit').prop('disabled', true).addClass('disabled'); 648 }); 649 $('#wfls-token').focus(); 650 651 new $.Zebra_Tooltips($('.wfls-tooltip-trigger')); 652 } 653 } 654 else { //Unexpected response, skip AJAX and process via the regular login flow 655 blocker.clickSubmit(); 656 } 657 } 658 blocker.unblock(); 659 }, 660 error: function(err) { 661 if (err.status == 503 || err.status == 403) { 662 if ($('.woocommerce').length > 0) { 663 if (err.status == 503) { 664 showLoginMessage(__('<strong>ERROR</strong>: Login failed with status code 503. Please contact the site administrator.'), 'error'); 665 } 666 else if (err.status == 403) { 667 showLoginMessage(__('<strong>ERROR</strong>: Login failed with status code 403. Please contact the site administrator.'), 'error'); 668 } 669 blocker.unblock(); 670 } 671 else { 672 window.location.reload(true); 673 } 674 675 return; 676 } 677 showLoginMessage(__('<strong>ERROR</strong>: An error was encountered while trying to authenticate. Please try again.'), 'error'); 678 blocker.unblock(); 679 } 680 }); 681 }; 682 683 $(function() { 684 //Login 685 if (loginLocator.locate()) { 686 var loginBlocker = new FormBlocker(loginLocator.getForm(), '#wp-submit,[type=submit][name=login]', true); 687 loginBlocker.initialize(function() { 688 if (parseInt(WFLSVars.useCAPTCHA)) { 689 wfls_init_captcha(function() { wfls_query_ajax(loginBlocker); }); 690 } 691 else { 692 wfls_query_ajax(loginBlocker); 693 } 694 }); 695 } 696 697 //Registration 698 if (registrationLocator.locate() && parseInt(WFLSVars.useCAPTCHA)) { 699 var registrationBlocker = new FormBlocker(registrationLocator.getForm(), '[type=submit]'); 700 registrationBlocker.initialize(function() { 701 wfls_init_captcha( 702 function() { 703 registrationBlocker.release(); 704 registrationBlocker.clickSubmit(); 705 },
706 registrationLocator.getInput() 707 ); 708 }); 709 } 710 711 //Passkey 712 if (parseInt(WFLSVars.hasPasskeys) && loginLocator.locate()) { 713 var loginSubmit = findLoginSubmit(loginLocator.getForm()); 714 if (loginSubmit.length && !$('#wfls-passkey-container').length) { 715 var passkeyContainer = $('<div id="wfls-passkey-container" class="wfls-passkey-container">'); 716 var passkeyDivider = $('<div class="wfls-passkey-divider" aria-hidden="true">'); 717 passkeyDivider.append($('<span class="wfls-passkey-divider-label">').text(__('or'))); 718 var passkeyButton = $('<button type="button" id="wfls-passkey-submit" class="wfls-passkey-submit button button-secondary button-large">'); 719 var passkeyIcon = $('<span class="wfls-passkey-icon" aria-hidden="true">'); 720 passkeyIcon.get(0).style.setProperty('--wfls-passkey-icon-url', 'url("' + (WFLSVars.passkeyIconUrl || '') + '")'); 721 passkeyButton.append(passkeyIcon).append($('<span class="wfls-passkey-label">').text(__('Log In with a Passkey'))); 722 passkeyContainer.append(passkeyDivider).append(passkeyButton); 723 var submitContainer = loginSubmit.closest('p.submit'); 724 if (submitContainer.length) { 725 submitContainer.after(passkeyContainer); 726 } 727 else { 728 loginSubmit.after(passkeyContainer); 729 } 730 } 731 732 $('#wfls-passkey-submit').on('click', function(e) { 733 e.preventDefault(); 734 e.stopPropagation(); 735 736 if (!window.PublicKeyCredential || !navigator.credentials || !navigator.credentials.get) { 737 if (wfls_passkeys_require_https()) { 738 showLoginMessage(__('Passkey login requires HTTPS. Open this
738site using https:// and try again.'), 'error', true); 739 return; 740 } 741 showLoginMessage(__('This browser does not support passkey login.'), 'error', true); 742 return; 743 } 744 745 var button = $(this); 746 if (button.prop('disabled')) { 747 return; 748 } 749 750 wfls_start_passkey_login(button); 751 }); 752 } 753 754 var verificationField = $('#wfls-email-verification'); 755 if (verificationField.length) { 756 verificationField.val(WFLSVars.verification || ''); 757 } 758 else { 759 var log = getRelevantInputs(); 760 if (log.length) { 761 verificationField = $('<input type="hidden" name="wfls-email-verification" id="wfls-email-verification" />'); 762 verificationField.val(WFLSVars.verification); 763 log.parent().append(verificationField); 764 } 765 } 766 767 if (parseInt(WFLSVars.useCAPTCHA)) { 768 wfls_init_captcha_contact(); 769 } 770 }); 771})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.