PageSourceSearch

https://www.renkum.nl/js/custom/search_request_guardrails.js

js renkum.nl collected 2026-10-02 16:29:11 UTC 3,403 bytes, 137 lines download raw bytes

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.