on master help sign in
Remove source key from server API, derive from encrypted blob
commitadc8b7f08b543d5febdca429a6b253c44d43b5c7 authoriko <mail@iko.soy> dateTue 21 Apr 2026, 21:37 (6 months ago) parentaa30572
1 file changed+16−16
server.knot+16−16
server.knot+16−16
@@ -57,7 +57,7 @@ federationUrl = \server -> federationScheme ++ server
5757-- Types
5858-- ============================================
5959
60−type PollEvent = {id: MessageIdHex, eventType: Text, payload: {encryptedBlob: BlobHex, fromKey: PubkeyHex, timestamp: Timestamp, toKey: PubkeyHex}}
60+type PollEvent = {id: MessageIdHex, eventType: Text, payload: {encryptedBlob: BlobHex, timestamp: Timestamp, toKey: PubkeyHex}}
6161
6262data GossipEventType = GossipOnline {} | GossipOffline {} | GossipUnknown {}
6363
@@ -108,12 +108,12 @@ type Timestamp = Int<Ms>
108108
109109type Challenge = {pubkey: PubkeyHex, challenge: Text, expiresAt: Timestamp}
110110type Session = {token: Text, pubkey: PubkeyHex, expiresAt: Timestamp}
111−type Message = {messageId: MessageIdHex, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp, originServer: Text, receivedAt: Timestamp}
111+type Message = {messageId: MessageIdHex, toKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp, originServer: Text, receivedAt: Timestamp}
112112type PresenceEntry = {pubkey: PubkeyHex, server: AnyServerName, expiresAt: Timestamp, timestamp: Timestamp}
113−type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
113+type ForwardEntry = {messageId: MessageIdHex, toServer: ServerName, createdAt: Timestamp, toKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp}
114114type AckedEntry = {messageId: MessageIdHex, toKey: PubkeyHex, ackedAt: Timestamp, originServer: ServerName}
115115data AuthResult = Authorized {pubkey: PubkeyHex} | Unauthorized {}
116−data SendResult = SendFailed {status: MessageStatus} | SendDone {delivery: DeliveryStatus, remoteServers: [ServerName], forwardServers: [ServerName], fromKey: PubkeyHex}
116+data SendResult = SendFailed {status: MessageStatus} | SendDone {delivery: DeliveryStatus, remoteServers: [ServerName], forwardServers: [ServerName]}
117117data VerifyResult = VerifyFailed {} | VerifyOk {peerServers: [ServerName]}
118118data AckResult = AckUnauthorized {} | AckDone {pendingAcks: [AckedEntry], evictedEntries: [AckedEntry]}
119119data PollResult = PollUnauthorized {} | PollOk {events: [PollEvent], cursor: Timestamp}
@@ -174,7 +174,7 @@ route FederationApi where
174174 POST {events: [GossipEvent], hopsRemaining: Int, fromServer: ServerName} /gossip headers {authorization: Text}
175175 -> {ok: Bool}
176176 = RecvGossip
177− POST {toKey: PubkeyHex, fromKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp, originServer: ServerName, messageId: MessageIdHex} /forward headers {authorization: Text}
177+ POST {toKey: PubkeyHex, encryptedBlob: BlobHex, timestamp: Timestamp, originServer: ServerName, messageId: MessageIdHex} /forward headers {authorization: Text}
178178 -> {ok: Bool}
179179 = ForwardMessage
180180 POST {messageIds: [MessageIdHex], originServer: ServerName, fromServer: ServerName} /ack headers {authorization: Text}
@@ -724,7 +724,7 @@ retryForwardsForServer = \entries remaining ->
724724 Just {value: f} -> do
725725 let rest = do x <- entries; where x.messageId != f.messageId; yield x
726726 result <- fetch (federationUrl f.toServer) (ForwardMessage {
727− toKey: f.toKey, fromKey: f.fromKey, encryptedBlob: f.encryptedBlob,
727+ toKey: f.toKey, encryptedBlob: f.encryptedBlob,
728728 timestamp: f.timestamp, originServer: serverHostN, messageId: f.messageId,
729729 authorization: federationAuth})
730730 whenOk result (removeForward f.messageId f.toServer)
@@ -750,7 +750,7 @@ forwardQueuedMessages = \targets t -> do
750750 where m.toKey == target.pubkey
751751 where none forwards (\f -> f.messageId == m.messageId && f.toServer == target.server)
752752 yield {messageId: m.messageId, toServer: target.server, createdAt: t,
753− toKey: m.toKey, fromKey: m.fromKey, encryptedBlob: m.encryptedBlob, timestamp: m.timestamp}
753+ toKey: m.toKey, encryptedBlob: m.encryptedBlob, timestamp: m.timestamp}
754754 let capped = takeN candidates (maxForwardsEntries - count forwards)
755755 let updatedForwards = union forwards capped
756756 set *forwards = updatedForwards
@@ -842,7 +842,7 @@ pollOnce = \token cursor startWakeup -> do
842842 let evts = do
843843 m <- limitedMsgs
844844 yield {id: m.messageId, eventType: "message",
845− payload: {toKey: m.toKey, fromKey: m.fromKey,
845+ payload: {toKey: m.toKey,
846846 encryptedBlob: m.encryptedBlob,
847847 timestamp: m.timestamp}}
848848 in let lastReceivedAt = fold (\acc m -> max acc m.receivedAt) clampedCursor limitedMsgs
@@ -936,7 +936,7 @@ serve = \req -> case req of
936936 pr <- maybePrune t
937937 withSessionAuth authorization t
938938 (yield {pr: pr, send: SendFailed {status: MsUnauthorized {}}})
939− (\fromKey -> do
939+ (\_ -> do
940940 messages <- *messages
941941 if countMessagesFor messages to t >= maxMessagesPerRecipient
942942 then yield {pr: pr, send: SendFailed {status: MsRejected {}}}
@@ -946,7 +946,7 @@ serve = \req -> case req of
946946 let seqTs = nextSeqTs t seqCounter
947947 set *seqCounter = seqTs
948948 let updatedMessages = union messages
949− [{messageId: msgId, toKey: to, fromKey: fromKey,
949+ [{messageId: msgId, toKey: to,
950950 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: "", receivedAt: seqTs}]
951951 set *messages = updatedMessages
952952 let toPresence = do p <- presence; where p.pubkey == to && p.expiresAt > t; yield p
@@ -959,17 +959,17 @@ serve = \req -> case req of
959959 else if shouldForward then DsFederated {}
960960 else DsQueued {}
961961 let updatedForwards = if shouldForward
962− then union forwards (do s <- forwardServers; yield {messageId: msgId, toServer: s, createdAt: t, toKey: to, fromKey: fromKey, encryptedBlob: encryptedBlob, timestamp: clampedTs})
962+ then union forwards (do s <- forwardServers; yield {messageId: msgId, toServer: s, createdAt: t, toKey: to, encryptedBlob: encryptedBlob, timestamp: clampedTs})
963963 else forwards
964964 set *forwards = updatedForwards
965− yield {pr: pr, send: SendDone {delivery: delivery, remoteServers: remoteServers, forwardServers: forwardServers, fromKey: fromKey}})
965+ yield {pr: pr, send: SendDone {delivery: delivery, remoteServers: remoteServers, forwardServers: forwardServers}})
966966 case result.send of
967− SendDone {delivery, remoteServers, forwardServers, fromKey} ->
967+ SendDone {delivery, remoteServers, forwardServers} ->
968968 fork (do
969969 when (count remoteServers > 0 && federationEnabled) (do
970970 sendToEach remoteServers (\server -> do
971971 fwdResult <- fetch (federationUrl server) (ForwardMessage {
972− toKey: to, fromKey: fromKey, encryptedBlob: encryptedBlob,
972+ toKey: to, encryptedBlob: encryptedBlob,
973973 timestamp: clampedTs, originServer: serverHostN, messageId: msgId,
974974 authorization: federationAuth})
975975 when (any forwardServers (\s -> s == server))
@@ -1075,7 +1075,7 @@ serve = \req -> case req of
10751075 (forwardQueuedMessages newlyOnlineRemote t))
10761076 yield (respond {ok: True {}}))
10771077
1078− ForwardMessage {toKey, fromKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do
1078+ ForwardMessage {toKey, encryptedBlob, timestamp, originServer, messageId, authorization, respond} -> do
10791079 t <- now
10801080 withFederationAuth authorization t respond (not (isLocalServer originServer)) (do
10811081 let clampedTs = clampTimestamp timestamp t
@@ -1092,7 +1092,7 @@ serve = \req -> case req of
10921092 let seqTs = nextSeqTs t seqCounter
10931093 set *seqCounter = seqTs
10941094 let updatedMessages = union messages
1095− [{messageId: messageId, toKey: toKey, fromKey: fromKey,
1095+ [{messageId: messageId, toKey: toKey,
10961096 encryptedBlob: encryptedBlob, timestamp: clampedTs, originServer: originServer, receivedAt: seqTs}]
10971097 set *messages = updatedMessages
10981098 yield {pr: pr, forward: ForwardStored {}}