summaryrefslogtreecommitdiff
path: root/dht/src/Network/Tox/DHT/Transport.hs
diff options
context:
space:
mode:
Diffstat (limited to 'dht/src/Network/Tox/DHT/Transport.hs')
-rw-r--r--dht/src/Network/Tox/DHT/Transport.hs31
1 files changed, 18 insertions, 13 deletions
diff --git a/dht/src/Network/Tox/DHT/Transport.hs b/dht/src/Network/Tox/DHT/Transport.hs
index 5de92916..5f0deea8 100644
--- a/dht/src/Network/Tox/DHT/Transport.hs
+++ b/dht/src/Network/Tox/DHT/Transport.hs
@@ -103,7 +103,7 @@ parseDHTAddr :: (Eq saddr, Show ni) =>
103 (saddr -> STM (Maybe ni)) 103 (saddr -> STM (Maybe ni))
104 -> (NodeId -> saddr -> Either String ni) 104 -> (NodeId -> saddr -> Either String ni)
105 -> (ByteString, saddr) 105 -> (ByteString, saddr)
106 -> IO (Either (DHTMessage Encrypted8,ni) (ByteString,saddr)) 106 -> STM (Either (DHTMessage Encrypted8,ni) (ByteString,saddr))
107parseDHTAddr pendingCookies nodeInfo (msg,saddr) 107parseDHTAddr pendingCookies nodeInfo (msg,saddr)
108 | Just (typ,bs) <- B.uncons msg 108 | Just (typ,bs) <- B.uncons msg
109 , let right = return $ Right (msg,saddr) 109 , let right = return $ Right (msg,saddr)
@@ -115,9 +115,11 @@ parseDHTAddr pendingCookies nodeInfo (msg,saddr)
115 0x04 -> left $ direct nodeInfo bs saddr DHTSendNodes 115 0x04 -> left $ direct nodeInfo bs saddr DHTSendNodes
116 0x18 -> left $ direct nodeInfo bs saddr DHTCookieRequest 116 0x18 -> left $ direct nodeInfo bs saddr DHTCookieRequest
117 0x19 -> do 117 0x19 -> do
118 mni <- atomically $ pendingCookies saddr 118 mni <- pendingCookies saddr
119 let ni = fromMaybe (noReplyAddr nodeInfo saddr) mni 119 let ni = fromMaybe (noReplyAddr nodeInfo saddr) mni
120 dput XMan $ "Got encrypted cookie! mni="++show mni 120 runio :: IO () -> STM ()
121 runio _ = return () -- TODO: run IO action
122 runio $ dput XMan $ "Got encrypted cookie! mni="++show mni
121 left $ fanGet bs getCookie (uncurry DHTCookie) (const $ ni) 123 left $ fanGet bs getCookie (uncurry DHTCookie) (const $ ni)
122 0x20 -> left $ fanGet bs getDHTReqest (uncurry DHTDHTRequest) (asymNodeInfo nodeInfo saddr . snd) 124 0x20 -> left $ fanGet bs getDHTReqest (uncurry DHTDHTRequest) (asymNodeInfo nodeInfo saddr . snd)
123 0x21 -> left $ do 125 0x21 -> left $ do
@@ -409,13 +411,16 @@ forwardDHTRequests :: TransportCrypto -> (PublicKey -> IO (Maybe ni)) -> DHTTran
409forwardDHTRequests crypto closeLookup dht = dht { awaitMessage = await' } 411forwardDHTRequests crypto closeLookup dht = dht { awaitMessage = await' }
410 where 412 where
411 -- await' :: HandleHi ni a -> STM (IO a) 413 -- await' :: HandleHi ni a -> STM (IO a)
412 await' pass = awaitMessage dht $ \case 414 await' = do
413 Arrival src m@(DHTDHTRequest target payload) | target /= transportPublic crypto 415 (m, io) <- awaitMessage dht
414 -> do mni <- closeLookup target 416 return $ case m of
415 -- Forward the message if the target is in our close list. 417 Arrival src m@(DHTDHTRequest target payload) | target /= transportPublic crypto
416 forM_ mni $ \ni -> sendMessage dht ni m 418 -> (,) Discarded $ do
417 join $ atomically (await' pass) 419 io
418 m -> pass m 420 mni <- closeLookup target
421 -- Forward the message if the target is in our close list.
422 forM_ mni $ \ni -> sendMessage dht ni m
423 _ -> (m,io)
419 424
420encrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage ((,) Nonce8) -> ni -> IO (DHTMessage Encrypted8, ni) 425encrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage ((,) Nonce8) -> ni -> IO (DHTMessage Encrypted8, ni)
421encrypt crypto nodeId msg ni = do 426encrypt crypto nodeId msg ni = do
@@ -432,7 +437,7 @@ encryptMessage crypto destKey n arg = do
432 secret <- lookupSharedSecret crypto (transportSecret crypto) destKey n 437 secret <- lookupSharedSecret crypto (transportSecret crypto) destKey n
433 return $ E8 $ ToxCrypto.encrypt secret plain 438 return $ E8 $ ToxCrypto.encrypt secret plain
434 439
435decrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage Encrypted8 -> ni -> IO (Either String (DHTMessage ((,) Nonce8), ni)) 440decrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage Encrypted8 -> ni -> STM (Either String (DHTMessage ((,) Nonce8), ni))
436decrypt crypto nodeId msg ni = do 441decrypt crypto nodeId msg ni = do
437 let decipher n c = Composed $ decryptMessage crypto n . left ((,) $ id2key $ nodeId ni) $ c 442 let decipher n c = Composed $ decryptMessage crypto n . left ((,) $ id2key $ nodeId ni) $ c
438 msg' <- sequenceMessage $ transcode decipher msg 443 msg' <- sequenceMessage $ transcode decipher msg
@@ -442,11 +447,11 @@ decryptMessage :: Serialize x =>
442 TransportCrypto 447 TransportCrypto
443 -> Nonce24 448 -> Nonce24
444 -> Either (PublicKey, Encrypted8 x) (Asymm (Encrypted8 x)) 449 -> Either (PublicKey, Encrypted8 x) (Asymm (Encrypted8 x))
445 -> IO ((Either String ∘ ((,) Nonce8)) x) 450 -> STM ((Either String ∘ ((,) Nonce8)) x)
446decryptMessage crypto n arg = do 451decryptMessage crypto n arg = do
447 let (remotekey,E8 e) = either id (senderKey &&& asymmData) arg 452 let (remotekey,E8 e) = either id (senderKey &&& asymmData) arg
448 plain8 = Composed . fmap swap . (>>= decodePlain) 453 plain8 = Composed . fmap swap . (>>= decodePlain)
449 secret <- lookupSharedSecret crypto (transportSecret crypto) remotekey n 454 secret <- lookupSharedSecretSTM crypto (transportSecret crypto) remotekey n
450 return $ plain8 $ ToxCrypto.decrypt secret e 455 return $ plain8 $ ToxCrypto.decrypt secret e
451 456
452sequenceMessage :: Applicative m => DHTMessage (m ∘ f) -> m (DHTMessage f) 457sequenceMessage :: Applicative m => DHTMessage (m ∘ f) -> m (DHTMessage f)