@@ -516,7 +516,7 @@ validGossipEvents = \events t -> do
516 where expiresAt > t
516 where expiresAt > t
517 yield {eventType: e.eventType, pubkey: normalizeHex e.pubkey, server: server, expiresAt: expiresAt, timestamp: e.timestamp, ttl: ttl}
517 yield {eventType: e.eventType, pubkey: normalizeHex e.pubkey, server: server, expiresAt: expiresAt, timestamp: e.timestamp, ttl: ttl}
519−sendToEach : [Text] -> (Text -> (a {})) -> a {}
519+sendToEach : [ServerName] -> (ServerName -> (a {})) -> a {}
520sendToEach = \servers action ->
520sendToEach = \servers action ->
521 case headOf servers of
521 case headOf servers of
522 Nothing {} -> yield {}
522 Nothing {} -> yield {}
@@ -994,7 +994,7 @@ serve = \req -> case req of
994 let updatesOnlyMerged = mergeByPubkeyServer presence updatesOnly in
994 let updatesOnlyMerged = mergeByPubkeyServer presence updatesOnly in
995 let updatesOnlyAfterOffline = removeOffline updatesOnlyMerged offlineOnlyKeys trustedOffline t in
995 let updatesOnlyAfterOffline = removeOffline updatesOnlyMerged offlineOnlyKeys trustedOffline t in
996 let reclaimSlots = maxPresenceEntries - count updatesOnlyAfterOffline in
996 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
998 let reclaimedEntries = takeN newEntries reclaimSlots in
998 let reclaimedEntries = takeN newEntries reclaimSlots in
999 {finalPresence: union updatesOnlyAfterOffline reclaimedEntries,
999 {finalPresence: union updatesOnlyAfterOffline reclaimedEntries,
1000 appliedOnline: union
1000 appliedOnline: union
@@ -1029,12 +1029,14 @@ serve = \req -> case req of
1029 t <- now
1029 t <- now
1030 let authorized = verifyFederationAuth authorization
1030 let authorized = verifyFederationAuth authorization
1031 let validOrigin = isFederatedOrigin originServer
1031 let validOrigin = isFederatedOrigin originServer
1032− let clampedTs = clampTimestamp timestamp t
1033− result <- atomic do
1035− if not (authorized && validOrigin)
1032+ if not (authorized && validOrigin)
1034+ maybePruneAndBroadcast t
1036− then yield {pr: pr, ok: False {}}
1035+ yield (respond {ok: False {}})
1037− else do
1036+ else do
1037+ let clampedTs = clampTimestamp timestamp t
1038+ result <- atomic do
1038 messages <- *messages
1040 messages <- *messages
1039 ackedIds <- *ackedIds
1041 ackedIds <- *ackedIds
1040 if any messages (\m -> m.messageId == messageId && m.toKey == toKey)
1042 if any messages (\m -> m.messageId == messageId && m.toKey == toKey)
@@ -1050,27 +1052,30 @@ serve = \req -> case req of
1050 [{messageId: messageId, toKey: toKey, fromKey: fromKey,
1052 [{messageId: messageId, toKey: toKey, fromKey: fromKey,
1051 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
1053 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
1052 yield {pr: pr, ok: True {}}
1054 yield {pr: pr, ok: True {}}
1053− forkBroadcastOffline t result.pr
1055+ forkBroadcastOffline t result.pr
1054− yield (respond {ok: result.ok})
1056+ yield (respond {ok: result.ok})
1056 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
1058 FederationAck {messageIds, originServer, fromServer, authorization, respond} -> do
1057 let fromServer = normalizeServerName fromServer
1059 let fromServer = normalizeServerName fromServer
1058 let originServer = normalizeServerName originServer
1060 let originServer = normalizeServerName originServer
1059 t <- now
1061 t <- now
1060 let authorized = verifyFederationAuth authorization
1062 let authorized = verifyFederationAuth authorization
1061− let validAck = authorized && originServer == serverHostN && not (fromServer == serverHostN)
1063+ if not authorized || not (originServer == serverHostN) || fromServer == serverHostN
1062− pruneResult <- atomic do
1064+ then do
1063− pr <- maybePrune t
1065+ maybePruneAndBroadcast t
1064− when validAck (do
1066+ yield (respond {ok: False {}})
1065 let dedupedIds = dedupMessageIds messageIds
1068 let dedupedIds = dedupMessageIds messageIds
1069+ pruneResult <- atomic do
1066− forwards <- *forwards
1071+ forwards <- *forwards
1067− set *forwards = do
1072+ set *forwards = do
1068− f <- forwards
1073+ f <- forwards
1069− where not (f.toServer == fromServer && any dedupedIds (\mid -> f.messageId == mid))
1074+ where not (f.toServer == fromServer && any dedupedIds (\mid -> f.messageId == mid))
1070− yield f)
1075+ yield f
1071− yield pr
1076+ yield pr
1072− forkBroadcastOffline t pruneResult
1077+ forkBroadcastOffline t pruneResult
1073− yield (respond {ok: validAck})
1078+ yield (respond {ok: True {}})
1075 Prune {authorization, respond} -> do
1080 Prune {authorization, respond} -> do
1076 t <- now
1081 t <- now