@@ -540,13 +540,10 @@ mapEach = \items getKey action -> case headOf items of
540540 yield (union [r] rest)
541541
542542-- Hex tokens: one random hex char per recursive call.
543−hexDigit : Int -> Text
544−hexDigit = \n -> take 1 (drop n "0123456789abcdef")
545−
546543genTokenN = \n -> if n <= 0 then yield "" else do
547544 d <- randomInt 16
548545 rest <- genTokenN (n - 1)
549− yield (hexDigit d ++ rest)
546+ yield (take 1 (drop d "0123456789abcdef") ++ rest)
550547
551548genToken = genTokenN 48
552549
@@ -1034,9 +1031,10 @@ handleVerifyAuth = \pubkey challenge signature revokeOthers clientIp respond ->
10341031 else do
10351032 set *challenges = removeWhere ch (\c -> c.pubkey == pubkey && c.challenge == challenge)
10361033 ses <- *sessions
1037− let kept = if revokeOthers then removeWhere ses (\s -> s.pubkey == pubkey) else ses
1038− let afterPerKey = capPerKey kept (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt)
1039− set *sessions = capList (union afterPerKey [{token: token, pubkey: pubkey, expiresAt: expiry, ip: clientIp, createdAt: t}]) maxSessions (\s -> s.expiresAt)
1034+ let cleaned = if revokeOthers
1035+ then removeWhere ses (\s -> s.pubkey == pubkey)
1036+ else capPerKey ses (\s -> s.pubkey == pubkey) maxSessionsPerKey (\s -> s.expiresAt)
1037+ set *sessions = capList (union cleaned [{token: token, pubkey: pubkey, expiresAt: expiry, ip: clientIp, createdAt: t}]) maxSessions (\s -> s.expiresAt)
10401038 pres <- *presence
10411039 let newPres = capList (union (removeWhere pres (\p -> p.pubkey == pubkey && isLocalServer p.server)) [{pubkey: pubkey, server: serverHostN, expiresAt: expiry, timestamp: t}]) maxPresenceEntries (\p -> p.expiresAt)
10421040 set *presence = newPres
@@ -1348,7 +1346,7 @@ handleCancelMessage = \messageId to authorization clientIp respond -> do
13481346 case findFirst msgs matches of
13491347 Nothing {} -> yield {cancelled: False {}, cancelServers: []}
13501348 Just {value: msg} ->
1351− if msg.originServer != "" || msg.senderKey != senderKey || msg.senderKey == ""
1349+ if msg.originServer != "" || msg.senderKey != senderKey
13521350 then yield {cancelled: False {}, cancelServers: []}
13531351 else do
13541352 fwdServers <- applyCancel msgs matches to messageId t
@@ -1367,8 +1365,7 @@ sendCancelToEach = \messageId to servers ->
13671365 messageId: messageId, toKey: to, fromServer: serverHostN,
13681366 requestTimestamp: t, correlationId: "", authorization: auth,
13691367 protocolVersion: federationProtocolVersion})
1370− let failed = case result of Err _ -> True {}; Ok r -> not r.ok
1371− when failed (atomic
1368+ when (case result of Err _ -> True {}; Ok r -> not r.ok) (atomic
13721369 (appendCapped pendingFederationCancels [{messageId: messageId, toKey: to, toServer: server, createdAt: t, retries: 0}] 10000 (\c -> c.createdAt))))
13731370
13741371handleCancelBatch = \cancels authorization clientIp respond -> do
@@ -1383,7 +1380,7 @@ handleCancelBatch = \cancels authorization clientIp respond -> do
13831380 case findFirst msgs matches of
13841381 Nothing {} -> yield False
13851382 Just {value: msg} ->
1386− if msg.originServer != "" || msg.senderKey != senderKey || msg.senderKey == ""
1383+ if msg.originServer != "" || msg.senderKey != senderKey
13871384 then yield False
13881385 else do
13891386 _ <- applyCancel msgs matches e.to e.messageId t