1(function($) { 2 function __(string) { 3 return WFLS_LOGIN_TRANSLATIONS[string] || string; 4 } 5 !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
5Hide&&"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))})}}($); 6 7 function selectorSearch(selectors) { 8 var input = null; 9 return function() { 10 if (input !== null) 11 return input; 12 for (var i = 0; i < selectors.length; i++) { 13 input = $(selectors[i]); 14 if (input.length === 1) 15 return input; 16 } 17 input = null; 18 return input; 19 } 20 }; 21 function FormElementLocator(inputSelectors, extraSelectors) { 22 var self = this; 23 24 if (typeof extraSelectors == 'undefined') 25 extraSelectors = {}; 26 27 var found = false; 28 var input = null, form = null, extra = {}; 29 30 var findInput = selectorSearch(inputSelectors); 31 var search = function() { 32 input = findInput(); 33 if (input === null) 34 return false; 35 form = input.closest('form'); 36 if (form.length !== 1) { 37 form = null; 38 return false; 39 } 40 for (var key in extraSelectors) { 41 var match = form.find(extraSelectors[key]); 42 if (match.length === 1) { 43 extra[key] = match; 44 } 45 else { 46 return false; 47 } 48 } 49 return true; 50 }; 51 this.locate = function() { 52 if (!found) 53 found = search(); 54 return found; 55 }; 56 this.getInput = function() { 57 return found ? input : null; 58 }; 59 this.getForm = function() { 60 return found ? form : null; 61 }; 62 this.getExtra = function(key) { 63 if (key in extra) 64 return extra[key]; 65 return null; 66 } 67 } 68 var loginLocator = new FormElementLocator( 69 [ 70 'input[name=log]', 71 'input[name=username]', 72 'input#username[name=username]', 73 '.woocommerce-form-login input[name=username]', 74 '.login input[name=username]' 75 ], 76 { 77 password: 'input[name="pwd"],input[name=password]' 78 } 79 ); 80 var registrationLocator = new FormElementLocator([ 81 'input[name=user_login]', 82 '#reg_email', 83 '.woocommerce-form-register input[name=email]', 84 '.register input[name=email]' 85 ]); 86 var locators = [ 87 loginLocator, 88 registrationLocator 89 ]; 90 function getRelevantInputs() { 91 var inputs = $(); 92 for (var i = 0; i < locators.length; i++) { 93 if (locators[i].locate()) 94 inputs = inputs.add(locators[i].getInput()); 95 } 96 return inputs; 97 } 98 99 var wfls_init_captcha = function(actionCallback, log) { 100 if (typeof log === 'undefined') 101 log = getRelevantInputs(); 102 if (typeof grecaptcha === 'object') { 103 grecaptcha.ready(function() { 104 grecaptcha.execute(WFLSVars.recaptchasitekey, {action: 'login'}).then(function(token) { 105 var tokenField = $('#wfls-captcha-token'); 106 if (tokenField.length) { 107 tokenField.val(token); 108 } 109 else { 110 if (log.length) { 111 tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />'); 112 tokenField.val(token); 113 log.parent().append(tokenField); 114 } 115 } 116 117 typeof actionCallback === 'function' && actionCallback(true); 118 }); 119 }); 120 } 121 else { 122 var tokenField = $('#wfls-captcha-token'); 123 if (tokenField.length) { 124 tokenField.val('grecaptcha-missing'); 125 } 126 else { 127 if (log.length) { 128 tokenField = $('<input type="hidden" name="wfls-captcha-token" id="wfls-captcha-token" />'); 129 tokenField.val('grecaptcha-missing'); 130 log.parent().append(tokenField); 131 } 132 } 133 134 typeof actionCallback === 'function' && actionCallback(true); 135 } 136 }; 137 138 function showLoginMessage(messageHtml, type) { 139 var heading = $('#login > h1'); 140 if (heading.length > 0) { 141 var dom = (type === 'error' ? $('<div id="login_error">') : $('<p class="message">')); 142 dom.addClass('wfls-login-message'); 143 dom.addClass('notice'); 144 if (type === 'error') { 145 dom.addClass('notice-error'); 146 } 147 dom.html(messageHtml); 148 heading.after(dom); 149 dom.get(0).scrollIntoView(); 150 return; 151 } 152 else if ($('.woocommerce').length > 0){ 153 var content = $('<div class="woocommerce wfls-login-message">'); 154 var errorList = $('<ul role="alert">') 155 .addClass(type === 'error' ? 'woocommerce-error' : 'woocommerce-info'); 156 content.append(errorList);
157 errorList.append($('<li>').html(messageHtml)); 158 var containerSearch = selectorSearch([ 159 '#primary', 160 '.content-area', 161 '#main', 162 '.site-main', 163 'main' 164 ]); 165 var container = containerSearch(); 166 if (container === null) { 167 container = loginLocator.getForm(); 168 } 169 if (container !== null) { 170 container.before(content); 171 content.get(0).scrollIntoView(); 172 return; 173 } 174 } 175 var messageModal = $('<div>') 176 .attr('id', 'wfls-login-modal') 177 .css({ 178 position: 'fixed', 179 top: 0, 180 right: 0, 181 bottom: 0, 182 left: 0, 183 'background-color': 'rgba(0,0,0,0.5)', 184 'z-index': 9999, 185 display: 'flex', 186 'align-items': 'center', 187 'justify-content': 'center', 188 padding: '16px' 189 }) 190 .appendTo($('body')); 191 messageModal.append( 192 $('<div>') 193 .css({ 194 'background-color': '#FFF', 195 'border-radius': '4px', 196 padding: '16px', 197 'text-align': 'center' 198 }) 199 .append( 200 $('<p>').html(messageHtml) 201 ) 202 .append( 203 $('<button>').text('Dismiss') 204 .on('click', function() { 205 messageModal.remove(); 206 }) 207 ) 208 ); 209 } 210 211 212 var wfls_init_captcha_contact = function() { 213 $('.wfls-registration-captcha-contact').on('click', function(e) { 214 e.preventDefault(); 215 e.stopPropagation(); 216 217 if (registrationLocator.locate()) { 218 $('#wfls-prompt-overlay').remove(); 219 var overlay = $('<div id="wfls-prompt-overlay"></div>'); 220 var wrapper = $('<div id="wfls-prompt-wrapper"></div>'); 221 var field = $('<p><label for="wfls-message"></label><br/><textarea name="wfls-message" id="wfls-message" class="wfls-textarea"></textarea></p>'); 222 field.find('label[for=wfls-message]').text(__('Message to Support')); 223 var nonce = $('<input type="hidden" name="wfls-message-nonce" id="wfls-message-nonce"/>'); 224 var button = $('<p class="submit"><input type="submit" name="wfls-support-submit" id="wfls-support-submit" class="button button-primary button-large"/></p>'); 225 button.find('input[type=submit]').val(__('Send')); 226 wrapper.append(field).append(nonce).append(button); 227 overlay.append(wrapper); 228 registrationLocator.getForm().css('position', 'relative').append(overlay); 229 230 $('#wfls-message-nonce').val($(this).data('token')); 231 232 $('#wfls-support-submit').on('click', function(e) { 233 e.preventDefault(); 234 e.stopPropagation(); 235 236 $('#login_error, p.message').remove(); 237 238 var data = registrationLocator.getForm().serialize(); 239 data += '&action=wordfence_ls_register_support'; 240 241 $.ajax({ 242 type: 'POST', 243 url: WFLSVars.ajaxurl, 244 dataType: 'json', 245 data: data, 246 success: function(json) { 247 if (json.hasOwnProperty('error')) { 248 showLoginMessage(json.error, 'error'); 249 var dom = $('<div id="login_error">' + json.error + '</div>'); 250 $('#login > h1').after(dom); 251 } 252 else if (json.hasOwnProperty('message')) { //Success 253 showLoginMessage(json.message, 'message'); 254 var dom = $('<p class="message">' + json.message + '</p>'); 255 $('#login > h1').after(dom); 256 $('#wfls-support-submit, #wfls-message').attr('disabled', true); 257 } 258 }, 259 error: function(err) { 260 showLoginMessage(__('An error was encountered while trying to send the message. Please try again.'), 'error'); 261 var dom = $('<div id="login_error"></div>'); 262 dom.html(__('<strong>ERROR</strong>: An error was encountered while trying to send the message. Please try again.')); 263 $('#login > h1').after(dom); 264 } 265 }); 266 }); 267 268 field.find("#wfls-message").focus(); 269 } 270 }); 271 }; 272 273 function FormBlocker(form, buttonSelector, clickOnSubmit) { 274 275 var self = this; 276 var blocked = false; 277 var released = false; 278 clickOnSubmit = clickOnSubmit || false; 279 var clickSubmitInProgress = false; 280 281 this.getButtons = function() { 282 return form.find(buttonSelector); 283 } 284 285 this.block = function() { 286 if (blocked) 287 return false; 288 blocked = true; 289 this.getButtons().addClass('disabled').prop('disabled', true); 290 return true; 291 } 292 293 this.unblock = function() { 294 this.getButtons().removeClass('disabled').prop('disabled', false); 295 blocked = false;
296 } 297 298 this.release = function() { 299 released = true; 300 } 301 302 this.clickSubmit = function() { 303 this.unblock(); 304 var submitButton = this.getButtons().first(); 305 setTimeout(function() { 306 submitButton.trigger('click'); 307 }, 1); 308 } 309 310 this.initialize = function(callback) { 311 form.on('submit', function(event) { 312 if (released && (!clickOnSubmit || clickSubmitInProgress)) { 313 if (clickSubmitInProgress) 314 clickSubmitInProgress = false; 315 return; 316 } 317 event.preventDefault(); 318 event.stopPropagation(); 319 if (released) { 320 clickSubmitInProgress = true; 321 self.clickSubmit(); 322 return; 323 } 324 if (self.block()) { 325 callback(); 326 } 327 }); 328 } 329 330 } 331 332 var wfls_query_ajax = function(blocker) { 333 $('.wfls-login-message').remove(); 334 335 if (!loginLocator.locate()) { 336 console.error('Required login elements not found'); 337 return; 338 } 339 var form = loginLocator.getForm(); 340 var log = loginLocator.getInput(); 341 var pwd = loginLocator.getExtra('password'); 342 343 var data = $(form).serialize(); 344 data += '&action=wordfence_ls_authenticate'; 345 346 $.ajax({ 347 type: 'POST', 348 url: WFLSVars.ajaxurl, 349 dataType: 'json', 350 data: data, 351 success: function(json) { 352 if (json.hasOwnProperty('reset') && json.reset) { 353 $('#wfls-prompt-overlay').remove(); 354 } 355 356 if (json.hasOwnProperty('error')) { 357 showLoginMessage(json.error, 'error'); 358 $('#wfls-token').val(''); 359 360 if (parseInt(WFLSVars.useCAPTCHA)) { 361 wfls_init_captcha(); 362 } 363 } 364 else if (json.hasOwnProperty('message')) { 365 showLoginMessage(json.message, 'message'); 366 $('#wfls-token').val(''); 367 368 if (parseInt(WFLSVars.useCAPTCHA)) { 369 wfls_init_captcha(); 370 } 371 } 372 else if (json.hasOwnProperty('login')) { 373 if (json.hasOwnProperty('captcha')) { 374 var captchaField = $('#wfls-captcha-jwt'); 375 if (!captchaField.length) { 376 captchaField = $('<input type="hidden" name="wfls-captcha-jwt" id="wfls-captcha-jwt" value=""/>'); 377 form.append(captchaField); 378 } 379 380 $('#wfls-captcha-jwt').val(json.captcha); 381 } 382 383 blocker.release(); 384 if (json.hasOwnProperty('two_factor_required') && json.two_factor_required) { 385 if ($('#wfls-prompt-overlay').length === 0) { 386 var overlay = $('<div id="wfls-prompt-overlay"></div>'); 387 var wrapper = $('<div id="wfls-prompt-wrapper"></div>'); 388 var label = $('<label for="wfls-token">'); 389 label.text(__('Wordfence 2FA Code') + ' '); 390 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.'))); 391 label = $('<p>').append(label); 392 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>'); 393 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>'); 394 remember.find('label').append(__('Remember for 30 days')); 395 var button = $('<p class="submit"><input type="submit" name="wfls-token-submit" id="wfls-token-submit" class="button button-primary button-large"/></p>'); 396 button.find('input[type=submit]').val(__('Log In')); 397 wrapper.append(label); 398 wrapper.append(field); 399 if (parseInt(WFLSVars.allowremember)) { 400 wrapper.append(remember); 401 } 402 wrapper.append(button); 403 overlay.append(wrapper); 404 form.css('position', 'relative').append(overlay); 405 form.on('submit', function() { 406 $('#wfls-token-submit').prop('disabled', true).addClass('disabled'); 407 }); 408 $('#wfls-token').focus(); 409 410 new $.Zebra_Tooltips($('.wfls-tooltip-trigger')); 411 } 412 } 413 else { //Unexpected response, skip AJAX and process via the regular login flow 414 blocker.clickSubmit(); 415 } 416 } 417 blocker.unblock(); 418 }, 419 error: function(err) { 420 if (err.status == 503 || err.status == 403) { 421 if ($('.woocommerce').length > 0) { 422 if (err.status == 503) { 423 showLoginMessage(__('<strong>ERROR</strong>: Login failed with status code 503. Please contact the site administrator.'), 'error'); 424 } 425 else if (err.status == 403) { 426 showLoginMessage(__('<strong>ERROR</strong>: Login failed with status code 403. Please contact the site administrator.'), 'error'); 427 } 428 blocker.unblock(); 429 } 430 else { 431 window.location.reload(true); 432 } 433 434 return; 435 } 436 showLoginMessage(__('<strong>ERROR</strong>: An error was encountered while trying to authenticate. Please try again.'), 'error'); 437 blocker.unblock(); 438 } 439 }); 440 }; 441 442 $(function() { 443 //Login 444 if (loginLocator.locate()) { 445 var loginBlocker = new FormBlocker(loginLocator.getForm(), '#wp-submit,[type=submit][name=login]', true); 446 loginBlocker.initialize(function() { 447 if (parseInt(WFLSVars.useCAPTCHA)) { 448 wfls_init_captcha(function() { wfls_query_ajax(loginBlocker); }); 449 } 450 else { 451 wfls_query_ajax(loginBlocker); 452 } 453 }); 454 } 455 456 //Registration 457 if (registrationLocator.locate() && parseInt(WFLSVars.useCAPTCHA)) { 458 var registrationBlocker = new FormBlocker(registrationLocator.getForm(), '[type=submit]'); 459 registrationBlocker.initialize(function() { 460 wfls_init_captcha( 461 function() { 462 registrationBlocker.release(); 463 registrationBlocker.clickSubmit(); 464 },
465 registrationLocator.getInput() 466 ); 467 }); 468 } 469 470 var verificationField = $('#wfls-email-verification'); 471 if (verificationField.length) { 472 verificationField.val(WFLSVars.verification || ''); 473 } 474 else { 475 var log = getRelevantInputs(); 476 if (log.length) { 477 verificationField = $('<input type="hidden" name="wfls-email-verification" id="wfls-email-verification" />'); 478 verificationField.val(WFLSVars.verification); 479 log.parent().append(verificationField); 480 } 481 } 482 483 if (parseInt(WFLSVars.useCAPTCHA)) { 484 wfls_init_captcha_contact(); 485 } 486 }); 487})(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.