@@ -458,6 +458,7 @@ min = \a b -> if a < b then a else b
458458max = \a b -> if a > b then a else b
459459clamp = \lo hi x -> max lo (min hi x)
460460mod = \n m -> n - n / m * m
461+abs = \x -> if x < 0 then 0 - x else x
461462
462463-- Dedup: keeps first occurrence (O(n^2)).
463464unique = \items -> fold (\acc x -> if elem acc x then acc else union acc [x]) [] items
@@ -690,7 +691,7 @@ withFederationAuth = \authorization t respond fromServer scope requestTimestamp
690691 if elem blocked fromServer then "blocked"
691692 else if count allowed > 0 && not (elem allowed fromServer) then "not_allowed"
692693 else if not precondition then "invalid_request"
693− else if requestTimestamp > 0 && (requestTimestamp > t + clockSkewTolerance || requestTimestamp < t - clockSkewTolerance) then "clock_skew"
694+ else if requestTimestamp > 0 && abs (requestTimestamp - t) > clockSkewTolerance then "clock_skew"
694695 else ""
695696 if preErr != "" then yield (respond {ok: False {}, error: preErr, retryAfterMs: 0})
696697 else do
@@ -969,8 +970,7 @@ pruneAndRetry = \t -> do
969970 when federationEnabled (do
970971 fork retryPendingForwards
971972 aids <- *ackedIds
972− let pendingAcks = filter aids (\a -> not (isLocalServer a.originServer))
973− fork (sendAcksAndClean pendingAcks))
973+ fork (sendAcksAndClean (filter aids (\a -> not (isLocalServer a.originServer)))))
974974 -- Refresh local presence for active sessions every ~5 minutes
975975 lastRefresh <- *lastPresenceRefresh
976976 when (federationEnabled && t - lastRefresh >= presenceRefreshInterval) (do
@@ -1038,8 +1038,7 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp respond ->
10381038 let afterPerKey = capPerKey kept (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt)
10391039 set *sessions = capList (union afterPerKey [{token: token, pubkey: pubkey, expiresAt: expiry, ip: clientIp, createdAt: t}]) maxSessions (\s -> s.expiresAt)
10401040 pres <- *presence
1041− let withoutLocal = removeWhere pres (\p -> p.pubkey == pubkey && isLocalServer p.server)
1042− let newPres = capList (union withoutLocal [{pubkey: pubkey, server: serverHostN, expiresAt: expiry, timestamp: t}]) maxPresenceEntries (\p -> p.expiresAt)
1041+ let newPres = capList (union (removeWhere pres (\p -> p.pubkey == pubkey && isLocalServer p.server)) [{pubkey: pubkey, server: serverHostN, expiresAt: expiry, timestamp: t}]) maxPresenceEntries (\p -> p.expiresAt)
10431042 set *presence = newPres
10441043 yield {valid: True {}, peers: knownPeerServersFromPresence newPres}
10451044 if not result.valid then yield (respond {token: "", expiresAt: 0, error: "invalid"})