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