1(function () { 2 "use strict"; 3 4 var DEFAULT_MAX_SP_LENGTH = 4096; 5 var limits = window.searchRequestLimits || {}; 6 var maxSpLength = Number(limits.maxSpLength) || DEFAULT_MAX_SP_LENGTH; 7 8 function getSpValuesFromQuery(queryString) { 9 var values = []; 10 11 if (!queryString) { 12 return values; 13 } 14 15 var query = queryString.charAt(0) === "?" ? queryString.substring(1) : queryString; 16 var pairs = query.split("&"); 17 18 for (var i = 0; i < pairs.length; i++) { 19 var pair = pairs[i]; 20 if (!pair) { 21 continue; 22 } 23 24 var eqIndex = pair.indexOf("="); 25 var key = eqIndex >= 0 ? pair.substring(0, eqIndex) : pair; 26 if (key !== "sp") { 27 continue; 28 } 29 30 var rawValue = eqIndex >= 0 ? pair.substring(eqIndex + 1) : ""; 31 var plusFixed = rawValue.replace(/\+/g, "%20"); 32 33 try { 34 values.push(decodeURIComponent(plusFixed)); 35 } catch (e) { 36 values.push(rawValue); 37 } 38 } 39 40 return values; 41 } 42 43 function isTooLong(value) { 44 return value && value.length > maxSpLength; 45 } 46 47 function warnAndBlock(context, foundLength) { 48 var message = "Zoekparameters zijn te lang (" + foundLength + "). Maximum is " + maxSpLength + "."; 49 if (window.console && window.console.warn) { 50 window.console.warn("[search_request_guardrails] " + context + ": " + message); 51 } 52 window.alert(message); 53 } 54 55 function findAnchor(target) { 56 var current = target; 57 while (current && current !== document) { 58 if (current.tagName && current.tagName.toUpperCase() === "A" && current.getAttribute("href")) { 59 return current; 60 } 61 current = current.parentNode; 62 } 63 return null; 64 } 65 66 document.addEventListener( 67 "click", 68 function (event) { 69 var link = findAnchor(event.target); 70 if (!link) { 71 return; 72 } 73 74 var href = link.getAttribute("href"); 75 if (!href || href.indexOf("sp=") === -1) { 76 return; 77 } 78 79 var queryIndex = href.indexOf("?"); 80 if (queryIndex < 0) { 81 return; 82 } 83 84 var spValues = getSpValuesFromQuery(href.substring(queryIndex + 1)); 85 for (var i = 0; i < spValues.length; i++) { 86 if (isTooLong(spValues[i])) { 87 event.preventDefault(); 88 warnAndBlock("link", spValues[i].length); 89 return; 90 } 91 } 92 }, 93 true 94 ); 95 96 document.addEventListener( 97 "submit", 98 function (event) { 99 var form = event.target; 100 if (!form || !form.querySelectorAll) { 101 return; 102 } 103 104 var fields = form.querySelectorAll("input[name='sp'], textarea[name='sp']"); 105 for (var i = 0; i < fields.length; i++) { 106 var value = fields[i].value || ""; 107 if (isTooLong(value)) { 108 event.preventDefault(); 109 warnAndBlock("form", value.length); 110 return; 111 } 112 } 113 114 var action = form.getAttribute("action") || ""; 115 if (action.indexOf("sp=") === -1) { 116 return; 117 } 118 119 var queryIndex = action.indexOf("?"); 120 if (queryIndex < 0) { 121 return; 122 } 123 124 var spValues = getSpValuesFromQuery(action.substring(queryIndex + 1)); 125 for (var j = 0; j < spValues.length; j++) { 126 if (isTooLong(spValues[j])) { 127 event.preventDefault(); 128 warnAndBlock("form-action", spValues[j].length); 129 return; 130 } 131 } 132 }, 133 true 134 ); 135})(); 136 137
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.