on master help sign in
Fix orphaned forward records for locally-delivered messages and remove dead code
commitaf348513d1e7efea97d6d37eefdf171c6a39adc5 authoriko <mail@iko.soy> dateMon 30 Mar 2026, 09:53 (7 months ago) parentea729ea
1 file changed+12−9
server.knot+12−9
server.knot+12−9
@@ -150,6 +150,7 @@ containsBadUrlChar = \s ->
150150 if s == "" then False {}
151151 else if take 1 s == "/" || take 1 s == "?" || take 1 s == "#" || take 1 s == " " || take 1 s == "@" || take 1 s == "%" || take 1 s == "\\"
152152 || take 1 (bytesToHex (textToBytes (take 1 s))) == "0" || take 1 (bytesToHex (textToBytes (take 1 s))) == "1" || bytesToHex (textToBytes (take 1 s)) == "7f"
153+ || not (drop 2 (bytesToHex (textToBytes (take 1 s))) == "")
153154 then True {}
154155 else containsBadUrlChar (drop 1 s)
155156
@@ -207,12 +208,6 @@ hasHexPrefixAfterDot = \s ->
207208 else if take 1 s == "." && (take 2 (drop 1 s) == "0x" || take 2 (drop 1 s) == "0X") then True {}
208209 else hasHexPrefixAfterDot (drop 1 s)
209210
210−isAllDigitsUntilColonOrEnd = \s ->
211− if s == "" then True {}
212− else if take 1 s == ":" then True {}
213− else if isDigitChar (take 1 s) then isAllDigitsUntilColonOrEnd (drop 1 s)
214− else False {}
215−
216211isAllDigitsOrDotsUntilColonOrEnd = \s ->
217212 if s == "" then True {}
218213 else if take 1 s == ":" then True {}
@@ -247,7 +242,8 @@ stripTrailingDot = \s ->
247242 else take 1 s ++ stripTrailingDot (drop 1 s)
248243
249244isReservedHighRange = \s ->
250− (take 2 s == "22" && (take 1 (drop 2 s) == "4" || take 1 (drop 2 s) == "5" || take 1 (drop 2 s) == "6" || take 1 (drop 2 s) == "7" || take 1 (drop 2 s) == "8" || take 1 (drop 2 s) == "9") && take 1 (drop 3 s) == ".")
245+ isAllDigitsOrDotsUntilColonOrEnd s
246+ && ((take 2 s == "22" && (take 1 (drop 2 s) == "4" || take 1 (drop 2 s) == "5" || take 1 (drop 2 s) == "6" || take 1 (drop 2 s) == "7" || take 1 (drop 2 s) == "8" || take 1 (drop 2 s) == "9") && take 1 (drop 3 s) == ".")
251247 || (take 2 s == "23" && isDigitChar (take 1 (drop 2 s)) && take 1 (drop 3 s) == ".")
252248 || (take 2 s == "24" && isDigitChar (take 1 (drop 2 s)) && take 1 (drop 3 s) == ".")
253249 || (take 3 s == "250" && take 1 (drop 3 s) == ".")
@@ -255,13 +251,20 @@ isReservedHighRange = \s ->
255251 || (take 3 s == "252" && take 1 (drop 3 s) == ".")
256252 || (take 3 s == "253" && take 1 (drop 3 s) == ".")
257253 || (take 3 s == "254" && take 1 (drop 3 s) == ".")
258− || (take 3 s == "255" && take 1 (drop 3 s) == ".")
254+ || (take 3 s == "255" && take 1 (drop 3 s) == "."))
255+
256+containsLocalhostSuffix = \s ->
257+ if s == "" then False {}
258+ else if take 10 s == ".localhost" && (drop 10 s == "" || take 1 (drop 10 s) == ":") then True {}
259+ else containsLocalhostSuffix (drop 1 s)
259260
260261isBadServerName = \s ->
261262 let sn = toLower (stripTrailingDot s)
262263 sn == ""
263264 || containsBadUrlChar sn
264265 || sn == "localhost" || take 10 sn == "localhost:"
266+ || sn == "localhost.localdomain" || take 22 sn == "localhost.localdomain:"
267+ || containsLocalhostSuffix sn
265268 || take 4 sn == "127." || take 3 sn == "10."
266269 || take 8 sn == "192.168." || take 7 sn == "169.254."
267270 || take 2 sn == "0." || take 1 sn == "["
@@ -635,7 +638,7 @@ serve = \req -> case req of
635638 else "queued"
636639 forwards <- *forwards
637640 let forwardsAtCapacity = count forwards >= maxForwardsEntries
638− set *forwards = if shouldInsert && not forwardsAtCapacity
641+ set *forwards = if shouldInsert && not forwardsAtCapacity && not localOnline
639642 then union forwards (do s <- remoteServers; yield {messageId: msgId, toServer: s, createdAt: t})
640643 else forwards
641644 yield {status: status, remoteServers: remoteServers, fromKey: fromKey, expiredLocal: pr.expiredLocal, peerServers: pr.peerServers, forwardsAtCapacity: forwardsAtCapacity}