1// File: src/Resources/public/js/altcha-handler.js 2 3/** 4 * ALTCHA Event Handler 5 * 6 * Verarbeitet Events vom ALTCHA Widget und schreibt Ergebnis in Hidden Input 7 * 8 * WICHTIG: Dieses Script wird NUR geladen wenn ALTCHA aktiv ist (PageListener prüft das) 9 * 10 * @author con2net webServices 11 */ 12(function() { 13 'use strict'; 14 15 // Warte bis DOM geladen ist 16 if (document.readyState === 'loading') { 17 document.addEventListener('DOMContentLoaded', init); 18 } else { 19 init(); 20 } 21 22 function init() { 23 // Alle ALTCHA Widgets finden 24 const widgets = document.querySelectorAll('altcha-widget[data-widget-id]'); 25 26 if (widgets.length === 0) { 27 // Keine Widgets gefunden - nur im Debug-Modus warnen 28 if (isDebugMode()) { 29 console.warn('ALTCHA handler loaded but no widgets found'); 30 } 31 return; 32 } 33 34 if (isDebugMode()) { 35 console.log('ALTCHA handler initialized for ' + widgets.length + ' widget(s)'); 36 } 37 38 // Event-Handler für jedes Widget einrichten 39 widgets.forEach(function(widget) { 40 const widgetId = widget.getAttribute('data-widget-id'); 41 const hiddenInput = document.getElementById('ctrl_' + widgetId); 42 const debugMode = widget.hasAttribute('data-debug'); 43 44 if (!hiddenInput) { 45 // Fehler IMMER loggen (auch ohne Debug) 46 console.error('ALTCHA: Hidden input not found for widget ' + widgetId); 47 return; 48 } 49 50 // State-Change Event (Challenge-Status ändert sich) 51 widget.addEventListener('statechange', function(ev) { 52 // Nur im Debug-Modus State-Changes loggen 53 if (debugMode) { 54 console.log('ALTCHA State [' + widgetId + ']:', ev.detail.state); 55 } 56 57 if (ev.detail.state === 'verified') { 58 // Challenge erfolgreich gelöst 59 hiddenInput.value = ev.detail.payload; 60 61 if (debugMode) { 62 console.log('ALTCHA verified [' + widgetId + ']', { 63 time: ev.detail.time || 'unknown' 64 }); 65 } 66 } else if (ev.detail.state === 'error') { 67 // Fehler IMMER loggen (auch ohne Debug) 68 console.error('ALTCHA error [' + widgetId + ']:', ev.detail.error); 69 hiddenInput.value = ''; 70 } else if (ev.detail.state === 'verifying') { 71 if (debugMode) { 72 console.log('ALTCHA verifying [' + widgetId + ']...'); 73 } 74 } else if (ev.detail.state === 'unverified') { 75 // Challenge zurückgesetzt 76 hiddenInput.value = ''; 77 } 78 }); 79 80 // Server-Verified Event (optional, wenn Server-Validierung aktiviert) 81 widget.addEventListener('serververified', function(ev) { 82 if (debugMode) { 83 console.log('ALTCHA server-verified [' + widgetId + ']'); 84 } 85 }); 86 87 // Expired Event (Challenge abgelaufen) 88 widget.addEventListener('expired', function(ev) { 89 // Expired IMMER warnen (auch ohne Debug) 90 console.warn('ALTCHA challenge expired [' + widgetId + ']'); 91 hiddenInput.value = ''; 92 }); 93 }); 94 } 95 96 /** 97 * Prüft ob Debug-Modus aktiv ist 98 * @returns {boolean} 99 */ 100 function isDebugMode() { 101 // Prüfe ob irgendein Widget das data-debug Attribut hat 102 const debugWidget = document.querySelector('altcha-widget[data-debug]'); 103 return debugWidget !== null; 104 } 105})();
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.