PageSourceSearch

https://kronika.civilradio.hu/wp-content/plugins/wordfence/modules…/js/login.1790780879.js?ver=9.0.1

js civilradio.hu collected 2026-10-02 11:46:07 UTC 29,073 bytes, 771 lines download raw bytes

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