@@ -287,13 +287,7 @@ type Timestamp = Int<Ms>
287287-- Outstanding nonce issued by /auth/challenge; consumed by /auth/verify.
288288type Challenge = {pubkey: PubkeyHex, challenge: Text, expiresAt: Timestamp, ip: Text}
289289-- An issued bearer token bound to (pubkey, ip, expiry).
290−type Session = {
291− token: Text,
292− pubkey: PubkeyHex,
293− expiresAt: Timestamp,
294− ip: Text,
295− createdAt: Timestamp
296−}
290+type Session = {token: Text, pubkey: PubkeyHex, expiresAt: Timestamp, ip: Text}
297291-- Mailbox row: a stored message awaiting recipient pickup or federation forward.
298292-- Identity is `messageIdOf encryptedBlob` (BLAKE3 of the ciphertext); we don't
299293-- persist it because it's deterministically derivable. Storage TTL is fixed
@@ -423,7 +417,7 @@ route MaintenanceApi where
423417 POST {server: ServerName} /maintenance/unblock headers {authorization: Text} -> {ok: Bool, unblocked: Bool} = UnblockPeer
424418 GET /maintenance/blocked headers {authorization: Text} -> {peers: [Text], ok: Bool} = ListBlocked
425419 POST {server: ServerName} /maintenance/ping headers {authorization: Text} -> {ok: Bool, latencyMs: Int, error: Text} = PingPeer
426− GET /maintenance/sessions/{pubkey: PubkeyHex} headers {authorization: Text} -> {sessions: [{token: Text, expiresAt: Timestamp, ip: Text, createdAt: Timestamp}], count: Int, ok: Bool} = AdminListSessions
420+ GET /maintenance/sessions/{pubkey: PubkeyHex} headers {authorization: Text} -> {sessions: [{token: Text, expiresAt: Timestamp, ip: Text}], count: Int, ok: Bool} = AdminListSessions
427421 POST {pubkey: PubkeyHex} /maintenance/sessions/revoke-all headers {authorization: Text} -> {ok: Bool, revokedCount: Int} = AdminRevokeSessions
428422 POST {pubkey: PubkeyHex} /maintenance/messages/purge headers {authorization: Text} -> {ok: Bool, purgedCount: Int} = AdminPurgeMessages
429423 POST {ip: Text} /maintenance/sessions/revoke-ip headers {authorization: Text} -> {ok: Bool, revokedCount: Int, affectedKeys: Int} = AdminRevokeIp
@@ -1219,7 +1213,7 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp respond ->
12191213 let pruned = if revokeOthers
12201214 then removeWhere ses mine
12211215 else capPerKey ses mine maxSessionsPerKey (\s -> s.expiresAt)
1222− let newSession = {token, pubkey, expiresAt: expiry, ip: clientIp, createdAt: t}
1216+ let newSession = {token, pubkey, expiresAt: expiry, ip: clientIp}
12231217 *sessions = capList (union pruned [newSession]) maxSessions (\s -> s.expiresAt)
12241218 pres <- *presence
12251219 let prunedPres = removeWhere pres (\p -> p.pubkey == pubkey && isLocalServer p.server)
@@ -1931,13 +1925,13 @@ else do
19311925 Ok {value: r} -> yield (respond {r.ok, latencyMs: endTime - startTime, r.error}))
19321926
19331927-- GET /maintenance/sessions/{pubkey}: list a single user's active sessions.
1934−-- Token values are masked ("***") — operators see expiry, ip, createdAt only.
1935−handleAdminListSessions : PubkeyHex -> Text -> ({count: Int, ok: Bool, sessions: [{createdAt: Int<Ms>, expiresAt: Int<Ms>, ip: Text, token: Text}]} -> a) -> IO {r *runtimeMaintenanceSecret, r *sessions} a
1928+-- Token values are masked ("***") — operators see expiry and ip only.
1929+handleAdminListSessions : PubkeyHex -> Text -> ({count: Int, ok: Bool, sessions: [{expiresAt: Int<Ms>, ip: Text, token: Text}]} -> a) -> IO {r *runtimeMaintenanceSecret, r *sessions} a
19361930handleAdminListSessions = \pubkey authorization respond -> do
19371931 ok <- verifyMaintenanceAuth authorization
19381932 ses <- *sessions
19391933 let mine = if ok
1940− then mapWhere ses (\s -> s.pubkey == pubkey) (\s -> {token: "***", s.expiresAt, s.ip, s.createdAt})
1934+ then mapWhere ses (\s -> s.pubkey == pubkey) (\s -> {token: "***", s.expiresAt, s.ip})
19411935 else []
19421936 yield (respond {sessions: mine, count: count mine, ok})
19431937