diff options
Diffstat (limited to 'dht/src/Network/Tox/DHT/Transport.hs')
-rw-r--r-- | dht/src/Network/Tox/DHT/Transport.hs | 31 |
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)) |
107 | parseDHTAddr pendingCookies nodeInfo (msg,saddr) | 107 | parseDHTAddr 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 | |||
409 | forwardDHTRequests crypto closeLookup dht = dht { awaitMessage = await' } | 411 | forwardDHTRequests 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 | ||
420 | encrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage ((,) Nonce8) -> ni -> IO (DHTMessage Encrypted8, ni) | 425 | encrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage ((,) Nonce8) -> ni -> IO (DHTMessage Encrypted8, ni) |
421 | encrypt crypto nodeId msg ni = do | 426 | encrypt 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 | ||
435 | decrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage Encrypted8 -> ni -> IO (Either String (DHTMessage ((,) Nonce8), ni)) | 440 | decrypt :: TransportCrypto -> (ni -> NodeId) -> DHTMessage Encrypted8 -> ni -> STM (Either String (DHTMessage ((,) Nonce8), ni)) |
436 | decrypt crypto nodeId msg ni = do | 441 | decrypt 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) |
446 | decryptMessage crypto n arg = do | 451 | decryptMessage 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 | ||
452 | sequenceMessage :: Applicative m => DHTMessage (m ∘ f) -> m (DHTMessage f) | 457 | sequenceMessage :: Applicative m => DHTMessage (m ∘ f) -> m (DHTMessage f) |