@@ -516,7 +516,7 @@ validGossipEvents = \events t -> do
516516 where expiresAt > t
517517 yield {eventType: e.eventType, pubkey: normalizeHex e.pubkey, server: server, expiresAt: expiresAt, timestamp: e.timestamp, ttl: ttl}
518518
519−sendToEach : [Text] -> (Text -> (a {})) -> a {}
519+sendToEach : [ServerName] -> (ServerName -> (a {})) -> a {}
520520sendToEach = \servers action ->
521521 case headOf servers of
522522 Nothing {} -> yield {}
@@ -994,7 +994,7 @@ serve = \req -> case req of
994994 let updatesOnlyMerged = mergeByPubkeyServer presence updatesOnly in
995995 let updatesOnlyAfterOffline = removeOffline updatesOnlyMerged offlineOnlyKeys trustedOffline t in
996996 let reclaimSlots = maxPresenceEntries - count updatesOnlyAfterOffline in
997− let newEntries = do e <- trustedDeduped; where none presence (\p -> samePubkeyServer p e); where none updatesOnlyAfterOffline (\p -> samePubkeyServer p e); yield e in
997+ let newEntries = do e <- trustedDeduped; where none presence (\p -> samePubkeyServer p e) && none updatesOnlyAfterOffline (\p -> samePubkeyServer p e); yield e in
998998 let reclaimedEntries = takeN newEntries reclaimSlots in
999999 {finalPresence: union updatesOnlyAfterOffline reclaimedEntries,
10001000 appliedOnline: union
@@ -1029,12 +1029,14 @@ serve = \req -> case req of
10291029 t <- now
10301030 let authorized = verifyFederationAuth authorization
10311031 let validOrigin = isFederatedOrigin originServer
1032− let clampedTs = clampTimestamp timestamp t
1033− result <- atomic do
1034− pr <- maybePrune t
1035− if not (authorized && validOrigin)
1036− then yield {pr: pr, ok: False {}}
1037− else do
1032+ if not (authorized && validOrigin)
1033+ then do
1034+ maybePruneAndBroadcast t
1035+ yield (respond {ok: False {}})
1036+ else do
1037+ let clampedTs = clampTimestamp timestamp t
1038+ result <- atomic do
1039+ pr <- maybePrune t
10381040 messages <- *messages
10391041 ackedIds <- *ackedIds
10401042 if any messages (\m -> m.messageId == messageId && m.toKey == toKey)
@@ -1050,27 +1052,30 @@ serve = \req -> case req of
10501052 [{messageId: messageId, toKey: toKey, fromKey: fromKey,
10511053 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
10521054 yield {pr: pr, ok: True {}}
1053− forkBroadcastOffline t result.pr
1054− yield (respond {ok: result.ok})
1055+ forkBroadcastOffline t result.pr
1056+ yield (respond {ok: result.ok})
10551057
10561058 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
10571059 let fromServer = normalizeServerName fromServer
10581060 let originServer = normalizeServerName originServer
10591061 t <- now
10601062 let authorized = verifyFederationAuth authorization
1061− let validAck = authorized && originServer == serverHostN && not (fromServer == serverHostN)
1062− pruneResult <- atomic do
1063− pr <- maybePrune t
1064− when validAck (do
1063+ if not authorized || not (originServer == serverHostN) || fromServer == serverHostN
1064+ then do
1065+ maybePruneAndBroadcast t
1066+ yield (respond {ok: False {}})
1067+ else do
10651068 let dedupedIds = dedupMessageIds messageIds
1066− forwards <- *forwards
1067− set *forwards = do
1068− f <- forwards
1069− where not (f.toServer == fromServer && any dedupedIds (\mid -> f.messageId == mid))
1070− yield f)
1071− yield pr
1072− forkBroadcastOffline t pruneResult
1073− yield (respond {ok: validAck})
1069+ pruneResult <- atomic do
1070+ pr <- maybePrune t
1071+ forwards <- *forwards
1072+ set *forwards = do
1073+ f <- forwards
1074+ where not (f.toServer == fromServer && any dedupedIds (\mid -> f.messageId == mid))
1075+ yield f
1076+ yield pr
1077+ forkBroadcastOffline t pruneResult
1078+ yield (respond {ok: True {}})
10741079
10751080 Prune {authorization, respond} -> do
10761081 t <- now