PageSourceSearch

https://mainwp.com/wp-content/plugins/wordfence-login-security/js/login.1736959993.js?ver=1.1.16

js mainwp.com collected 2026-09-24 08:29:02 UTC 19,792 bytes, 487 lines download raw bytes

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("&times;").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.