/** * @file * Unlock protected forms. * * This works by resetting the form action to the path that It should be as well * as injecting the secret form key, only if the current user is verified to be * human which is done by waiting for a mousemove, swipe, or tab/enter key to be * pressed. */ (function (Drupal, drupalSettings) { "use strict"; Drupal.antibot = {}; Drupal.behaviors.antibot = { attach: function (context) { // Assume the user is not human, despite JS being enabled. drupalSettings.antibot.human = false; // Wait for a mouse to move, indicating they are human. document.body.addEventListener('mousemove', function () { // Unlock the forms. Drupal.antibot.unlockForms(); }); // Wait for a touch move event, indicating that they are human. document.body.addEventListener('touchmove', function () { // Unlock the forms. Drupal.antibot.unlockForms(); }); // A tab or enter key pressed can also indicate they are human. document.body.addEventListener('keydown', function (e) { if ((e.code == 'Tab') || (e.code == 'Enter')) { // Unlock the forms. Drupal.antibot.unlockForms(); } }); } }; /** * Unlock all locked forms. */ Drupal.antibot.unlockForms = function () { // Act only if we haven't yet verified this user as being human. if (!drupalSettings.antibot.human) { // Check if there are forms to unlock. if (drupalSettings.antibot.forms != undefined) { // Iterate all antibot forms that we need to unlock. Object.values(drupalSettings.antibot.forms).forEach(function (config) { // Switch the action. const form = document.getElementById(config.id); if (form) { form.setAttribute('action', form.getAttribute('data-action')); // Set the key. const input = form.querySelector('input[name="antibot_key"]'); if (input) { input.value = config.key; } } }); } // Mark this user as being human. drupalSettings.antibot.human = true; } }; })(Drupal, drupalSettings);