@@ -69,10 +69,10 @@ type PresenceEntry = {pubkey: PubkeyHex, server: Text, expiresAt: Timestamp, tim
69type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
69type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
70type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
70type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
71type AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
71type AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
72−type PruneResult = {expiredLocal: [PresenceEntry], peerServers: [Text]}
72+type PruneResult = {expiredLocal: [PresenceEntry], peerServers: [ServerName]}
73type PollResult = PollUnauthorized {} | PollAuthorized {events: [PollEvent], cursor: Timestamp}
73type PollResult = PollUnauthorized {} | PollAuthorized {events: [PollEvent], cursor: Timestamp}
74−type VerifyResult = VerifyFailed {} | VerifyOk {peerServers: [Text]}
74+type VerifyResult = VerifyFailed {} | VerifyOk {peerServers: [ServerName]}
75−type SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: MessageStatus, remoteServers: [Text], fromKey: PubkeyHex}
75+type SendResult = SendUnauthorized {} | SendRejected {} | SendDone {status: MessageStatus, remoteServers: [ServerName], fromKey: PubkeyHex}
76type AckResult = AckUnauthorized {} | AckDone {pendingAcks: [AckedEntry], evictedEntries: [AckedEntry]}
76type AckResult = AckUnauthorized {} | AckDone {pendingAcks: [AckedEntry], evictedEntries: [AckedEntry]}
77type LookupResult = LookupUnauthorized {} | LookupDone {foundServer: OptionalServerName}
77type LookupResult = LookupUnauthorized {} | LookupDone {foundServer: OptionalServerName}
@@ -371,6 +371,9 @@ authenticateSession = \sessions token t ->
371 Nothing {} -> Unauthorized {}
371 Nothing {} -> Unauthorized {}
372 Just {value: s} -> Authorized {pubkey: s.pubkey}
372 Just {value: s} -> Authorized {pubkey: s.pubkey}
374+authenticateRequest = \sessions authorization t ->
375+ authenticateSession sessions (extractToken authorization) t
374extractToken = \authHeader ->
377extractToken = \authHeader ->
375 let token = drop 7 authHeader in
378 let token = drop 7 authHeader in
376 if toLower (take 7 authHeader) == "bearer " && not (tooLong token maxTokenLen)
379 if toLower (take 7 authHeader) == "bearer " && not (tooLong token maxTokenLen)
@@ -771,11 +774,7 @@ serve = \req -> case req of
771 case result.verify of
774 case result.verify of
772 VerifyOk {peerServers} ->
775 VerifyOk {peerServers} ->
773 when federationEnabled
776 when federationEnabled
774− (sendToEach peerServers (\server -> do
775− _ <- fetch (federationScheme ++ server) (RecvGossip {
776− authorization: "Bearer " ++ federationSecret,
777− events: [{eventType: "online", pubkey: pubkey, server: serverHostN, timestamp: t, ttl: onlineGossipTtl}], hopsRemaining: 2, fromServer: serverHostN})
777+ (sendBatchedGossip peerServers [{eventType: "online", pubkey: pubkey, server: serverHostN, timestamp: t, ttl: onlineGossipTtl}] 2)
779 _ -> yield {}
778 _ -> yield {}
780 broadcastOfflineGossip t result.pr.peerServers expiredLocal)
779 broadcastOfflineGossip t result.pr.peerServers expiredLocal)
781 yield (case result.verify of
780 yield (case result.verify of
@@ -797,14 +796,13 @@ serve = \req -> case req of
797 SendMessage {to, encryptedBlob, timestamp, authorization, respond} -> do
796 SendMessage {to, encryptedBlob, timestamp, authorization, respond} -> do
798 let to = normalizeHex to
797 let to = normalizeHex to
799 let encryptedBlob = normalizeHex encryptedBlob
798 let encryptedBlob = normalizeHex encryptedBlob
800− let token = extractToken authorization
802 msgId <- genToken
800 msgId <- genToken
803 let clampedTs = clampTimestamp timestamp t
801 let clampedTs = clampTimestamp timestamp t
804 result <- atomic do
802 result <- atomic do
805 pr <- maybePrune t
803 pr <- maybePrune t
806 sessions <- *sessions
804 sessions <- *sessions
807− let auth = authenticateSession sessions token t
805+ let auth = authenticateRequest sessions authorization t
808 case auth of
806 case auth of
809 Unauthorized {} ->
807 Unauthorized {} ->
810 yield {pr: pr, send: SendUnauthorized {}}
808 yield {pr: pr, send: SendUnauthorized {}}
@@ -853,13 +851,12 @@ serve = \req -> case req of
853 SendDone {status} -> respond {status: status, messageId: msgId})
851 SendDone {status} -> respond {status: status, messageId: msgId})
855 AckMessages {messageIds, authorization, respond} -> do
853 AckMessages {messageIds, authorization, respond} -> do
856− let token = extractToken authorization
858 let dedupedIds = dedupMessageIds messageIds
855 let dedupedIds = dedupMessageIds messageIds
859 result <- atomic do
856 result <- atomic do
860 pr <- maybePrune t
857 pr <- maybePrune t
861 sessions <- *sessions
858 sessions <- *sessions
862− let auth = authenticateSession sessions token t
859+ let auth = authenticateRequest sessions authorization t
863 case auth of
860 case auth of
864 Unauthorized {} ->
861 Unauthorized {} ->
865 yield {pr: pr, ack: AckUnauthorized {}}
862 yield {pr: pr, ack: AckUnauthorized {}}
@@ -921,12 +918,11 @@ serve = \req -> case req of
922 LookupPresence {pubkey, authorization, respond} -> do
919 LookupPresence {pubkey, authorization, respond} -> do
923 let pubkey = normalizeHex pubkey
920 let pubkey = normalizeHex pubkey
924− let token = extractToken authorization
926 result <- atomic do
922 result <- atomic do
927 pr <- maybePrune t
923 pr <- maybePrune t
928 sessions <- *sessions
924 sessions <- *sessions
929− let auth = authenticateSession sessions token t
925+ let auth = authenticateRequest sessions authorization t
930 case auth of
926 case auth of
931 Unauthorized {} ->
927 Unauthorized {} ->
932 yield {pr: pr, lookup: LookupUnauthorized {}}
928 yield {pr: pr, lookup: LookupUnauthorized {}}