on master help sign in
Simplify server.knot: extract verifySignature, flatten refreshPeers, drop redundant ::
commit25a32d94c9dfbf85474d0d7187edd71f45422158 authoriko <mail@iko.soy> dateSun 10 May 2026, 18:43 (5 months ago) parentd9f295a
1 file changed+16−16
server.knot+16−16
server.knot+16−16
@@ -376,8 +376,7 @@ isBadServerName = \sn -> sn == "" || sn == "localhost" || not all (\c -> contain
376376 "10.",
377377 "192.168.",
378378 "169.254.",
379− "0.",
380− "::"
379+ "0."
381380] || any (\s -> containsSuffix s sn) [".localhost", ".local", ".internal", ".arpa", ".onion"]
382381
383382-- ============================================
@@ -420,6 +419,15 @@ withSessionAuth = \authorization t clientIp onUnauth onAuth -> do
420419 Just {value: s} -> onAuth s.pubkey
421420 _ -> onUnauth
422421
422+-- True when `signature` is a valid Ed25519 signature by `pubkey` over `challenge`.
423+-- False on any hex-decoding failure.
424+verifySignature : PubkeyHex -> SignatureHex -> Text -> Bool
425+verifySignature = \pubkey signature challenge -> case bytesFromHex pubkey of
426+ Just {value: pk} -> case bytesFromHex signature of
427+ Just {value: sigBytes} -> verify pk (textToBytes challenge) sigBytes
428+ _ -> False {}
429+ _ -> False {}
430+
423431-- ============================================
424432-- Federation failure tracking (simple, no circuit breaker)
425433-- ============================================
@@ -637,14 +645,10 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp -> do
637645 t <- now
638646 let expiry = t + sessionExpiry
639647 token <- genToken
648+ let sigValid = verifySignature pubkey signature challenge
640649 result <- atomic (do
641650 ch <- *challenges
642651 let same = \c -> c.pubkey == pubkey && c.challenge == challenge
643− let sigValid = case bytesFromHex pubkey of
644− Just {value: pk} -> case bytesFromHex signature of
645− Just {value: sigBytes} -> verify pk (textToBytes challenge) sigBytes
646− _ -> False {}
647− _ -> False {}
648652 let valid = any (\c -> same c && c.expiresAt > t && matchIp clientIp c.ip) ch && sigValid
649653 if not valid
650654 then yield (Nothing {})
@@ -687,19 +691,15 @@ handlePoll = \cursor authorization clientIp -> do
687691 let mine = \p -> p.pubkey == pubkey && isLocalServer p.server
688692 let stale = not any (\p -> mine p && p.expiresAt - t >= sessionExpiry / 2) pres
689693 refreshPeers <- if stale
690− then do
691− peers <- refreshLocalPresence pubkey (t + sessionExpiry)
692− yield (Just {value: peers})
693− else yield (Nothing {})
694+ then refreshLocalPresence pubkey (t + sessionExpiry)
695+ else yield []
694696 yield (Just {value: {pubkey, clampedCursor, startWakeup, refreshPeers}}))
695697 case setup of
696698 Nothing {} -> yield (Err {error: {status: 401, message: "unauthorized"}})
697699 Just {value: s} -> do
698− case s.refreshPeers of
699− Just {value: peers} -> when federationEnabled (fork (sendBatchedGossip peers [
700− GossipOnline {s.pubkey}
701− ]))
702− Nothing {} -> yield {}
700+ when (federationEnabled && count s.refreshPeers > 0) (fork (sendBatchedGossip s.refreshPeers [
701+ GossipOnline {s.pubkey}
702+ ]))
703703 pollResult <- doPoll s t
704704 yield (Ok {value: {pollResult.events, pollResult.cursor}})
705705