summaryrefslogtreecommitdiff
path: root/dht/src/Network/Tox
diff options
context:
space:
mode:
Diffstat (limited to 'dht/src/Network/Tox')
-rw-r--r--dht/src/Network/Tox/AggregateSession.hs5
-rw-r--r--dht/src/Network/Tox/DHT/Transport.hs31
-rw-r--r--dht/src/Network/Tox/Onion/Routes.hs8
-rw-r--r--dht/src/Network/Tox/Session.hs9
-rw-r--r--dht/src/Network/Tox/TCP.hs34
5 files changed, 48 insertions, 39 deletions
diff --git a/dht/src/Network/Tox/AggregateSession.hs b/dht/src/Network/Tox/AggregateSession.hs
index feb634f0..33b1fafb 100644
--- a/dht/src/Network/Tox/AggregateSession.hs
+++ b/dht/src/Network/Tox/AggregateSession.hs
@@ -196,7 +196,10 @@ forkSession c s setStatus = forkIO $ do
196 onPacket body loop (ParseError e) = inPrint e >> loop 196 onPacket body loop (ParseError e) = inPrint e >> loop
197 onPacket body loop (Arrival _ x) = body loop x 197 onPacket body loop (Arrival _ x) = body loop x
198 198
199 awaitPacket body = fix $ join . atomically . awaitMessage (sTransport s) . onPacket body 199 awaitPacket body = fix $ \loop -> do
200 (m,io) <- atomically $ awaitMessage (sTransport s)
201 io
202 onPacket body loop m
200 203
201 atomically $ setStatus $ InProgress AwaitingSessionPacket 204 atomically $ setStatus $ InProgress AwaitingSessionPacket
202 awaitPacket $ \_ online -> do 205 awaitPacket $ \_ online -> do
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)
diff --git a/dht/src/Network/Tox/Onion/Routes.hs b/dht/src/Network/Tox/Onion/Routes.hs
index 46ded48d..93e9bfcd 100644
--- a/dht/src/Network/Tox/Onion/Routes.hs
+++ b/dht/src/Network/Tox/Onion/Routes.hs
@@ -539,16 +539,16 @@ handleEvent getnodes or e@(BuildRoute (RouteId rid)) = do
539 Nothing -> routeLogger or $ "ONION Failed RouteId " ++ show rid 539 Nothing -> routeLogger or $ "ONION Failed RouteId " ++ show rid
540 540
541 541
542lookupSender :: OnionRouter -> SockAddr -> Nonce8 -> IO (Maybe (OnionDestination RouteId)) 542lookupSender :: OnionRouter -> SockAddr -> Nonce8 -> STM (Maybe (OnionDestination RouteId))
543lookupSender or = lookupSender' (pendingQueries or) (routeLog or) 543lookupSender or saddr n8 = lookupSender' (pendingQueries or) (routeLog or) saddr n8
544 544
545lookupSender' :: TVar (Word64Map PendingQuery) 545lookupSender' :: TVar (Word64Map PendingQuery)
546 -> TChan String 546 -> TChan String
547 -> SockAddr 547 -> SockAddr
548 -> Nonce8 548 -> Nonce8
549 -> IO (Maybe (OnionDestination RouteId)) 549 -> STM (Maybe (OnionDestination RouteId))
550lookupSender' pending log saddr (Nonce8 w8) = do 550lookupSender' pending log saddr (Nonce8 w8) = do
551 result <- atomically $ do 551 result <- do
552 ks <- readTVar pending 552 ks <- readTVar pending
553 let r = W64.lookup w8 ks 553 let r = W64.lookup w8 ks
554 writeTChan log $ "ONION lookupSender " ++ unwords [show w8, "->", show r] 554 writeTChan log $ "ONION lookupSender " ++ unwords [show w8, "->", show r]
diff --git a/dht/src/Network/Tox/Session.hs b/dht/src/Network/Tox/Session.hs
index d34dfc7a..53d63287 100644
--- a/dht/src/Network/Tox/Session.hs
+++ b/dht/src/Network/Tox/Session.hs
@@ -106,14 +106,13 @@ sClose s = do
106-- negotiated. It always returns Nothing which makes it convenient to use with 106-- negotiated. It always returns Nothing which makes it convenient to use with
107-- 'Network.QueryResponse.addHandler'. 107-- 'Network.QueryResponse.addHandler'.
108handshakeH :: SessionParams 108handshakeH :: SessionParams
109 -> Multi.SessionAddress 109 -> Arrival err Multi.SessionAddress (Handshake Encrypted)
110 -> Handshake Encrypted 110 -> STM (Arrival err Multi.SessionAddress (Handshake Encrypted), IO ())
111 -> IO (Maybe a) 111handshakeH sp (Arrival saddr handshake) = return $ (,) Discarded $ do
112handshakeH sp saddr handshake = do
113 decryptHandshake (spCrypto sp) handshake 112 decryptHandshake (spCrypto sp) handshake
114 >>= either (\err -> return ()) 113 >>= either (\err -> return ())
115 (uncurry $ plainHandshakeH sp saddr) 114 (uncurry $ plainHandshakeH sp saddr)
116 return Nothing 115handshakeH _ m = return (m, return ())
117 116
118 117
119plainHandshakeH :: SessionParams 118plainHandshakeH :: SessionParams
diff --git a/dht/src/Network/Tox/TCP.hs b/dht/src/Network/Tox/TCP.hs
index 1da302b6..626d4714 100644
--- a/dht/src/Network/Tox/TCP.hs
+++ b/dht/src/Network/Tox/TCP.hs
@@ -160,22 +160,22 @@ tcpStream crypto mkst = StreamHandshake
160 , streamAddr = nodeAddr 160 , streamAddr = nodeAddr
161 } 161 }
162 162
163newtype SessionData = SessionData (MVar (IntMap.IntMap NodeId)) 163newtype SessionData = SessionData (TMVar (IntMap.IntMap NodeId))
164 164
165newSessionData :: NodeInfo -> IO SessionData 165newSessionData :: NodeInfo -> IO SessionData
166newSessionData _ = SessionData <$> newMVar IntMap.empty 166newSessionData _ = atomically $ SessionData <$> newTMVar IntMap.empty
167 167
168getRelayedRemote :: SessionData -> ConId -> IO NodeId 168getRelayedRemote :: SessionData -> ConId -> STM NodeId
169getRelayedRemote (SessionData keymapVar) (ConId i) = do 169getRelayedRemote (SessionData keymapVar) (ConId i) = do
170 keymap <- takeMVar keymapVar 170 keymap <- takeTMVar keymapVar
171 let k = fromMaybe UDP.zeroID $ IntMap.lookup (fromIntegral i) keymap 171 let k = fromMaybe UDP.zeroID $ IntMap.lookup (fromIntegral i) keymap
172 putMVar keymapVar keymap 172 putTMVar keymapVar keymap
173 return k 173 return k
174 174
175setRelayedRemote :: SessionData -> ConId -> NodeId -> IO () 175setRelayedRemote :: SessionData -> ConId -> NodeId -> STM ()
176setRelayedRemote (SessionData keymapVar) (ConId conid) nid = do 176setRelayedRemote (SessionData keymapVar) (ConId conid) nid = do
177 keymap <- takeMVar keymapVar 177 keymap <- takeTMVar keymapVar
178 putMVar keymapVar $ IntMap.insert (fromIntegral conid) nid keymap 178 putTMVar keymapVar $ IntMap.insert (fromIntegral conid) nid keymap
179 179
180toxTCP :: TransportCrypto -> IO ( TCPCache (SessionProtocol (SessionData,RelayPacket) RelayPacket) 180toxTCP :: TransportCrypto -> IO ( TCPCache (SessionProtocol (SessionData,RelayPacket) RelayPacket)
181 , TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket) ) 181 , TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket) )
@@ -367,7 +367,7 @@ type RelayCache = TCPCache (SessionProtocol (SessionData,RelayPacket) RelayPacke
367newClient :: TransportCrypto 367newClient :: TransportCrypto
368 -> ((Nonce8 -> QR.Result (Bool,RelayPacket) -> IO ()) -> a) -- ^ store mvar for relay query 368 -> ((Nonce8 -> QR.Result (Bool,RelayPacket) -> IO ()) -> a) -- ^ store mvar for relay query
369 -> (a -> Nonce8 -> RelayPacket -> IO void) -- ^ load mvar for relay query 369 -> (a -> Nonce8 -> RelayPacket -> IO void) -- ^ load mvar for relay query
370 -> (SockAddr -> Nonce8 -> IO (Maybe (OnionDestination RouteId))) -- ^ lookup sender of onion query 370 -> (SockAddr -> Nonce8 -> STM (Maybe (OnionDestination RouteId))) -- ^ lookup sender of onion query
371 -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute)) -- ^ lookup OnionRoute by id 371 -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute)) -- ^ lookup OnionRoute by id
372 -> IO ( ( TVar (ChaChaDRG, Data.Word64Map.Word64Map a) 372 -> IO ( ( TVar (ChaChaDRG, Data.Word64Map.Word64Map a)
373 , RelayCache 373 , RelayCache
@@ -375,8 +375,9 @@ newClient :: TransportCrypto
375 , Transport String (OnionDestination RouteId) (OnionMessage Encrypted) ) 375 , Transport String (OnionDestination RouteId) (OnionMessage Encrypted) )
376 , RelayClient ) 376 , RelayClient )
377newClient crypto store load lookupSender getRoute = do 377newClient crypto store load lookupSender getRoute = do
378 let runio io = return () -- TODO: run IO action
378 (tcpcache,net0) <- toxTCP crypto 379 (tcpcache,net0) <- toxTCP crypto
379 (relaynet,net1) <- partitionRelay net0 380 (relaynet,net1) <- partitionRelay runio net0
380 (onionnet,net2) <- partitionOnion crypto lookupSender getRoute net1 381 (onionnet,net2) <- partitionOnion crypto lookupSender getRoute net1
381 let net3 = {- XXX: Client type forces this pointless layering. -} 382 let net3 = {- XXX: Client type forces this pointless layering. -}
382 layerTransport ((Right .) . (,) . (,) False . snd) (,) net2 383 layerTransport ((Right .) . (,) . (,) False . snd) (,) net2
@@ -428,12 +429,13 @@ showViaRelay (ViaRelay mcon nid tcp) =
428 "TCP:" ++ maybe "(oob)" (\(ConId con) -> "(" ++ show con ++ ")") mcon 429 "TCP:" ++ maybe "(oob)" (\(ConId con) -> "(" ++ show con ++ ")") mcon
429 ++ show nid ++ "@@" ++ show (nodeAddr tcp) 430 ++ show nid ++ "@@" ++ show (nodeAddr tcp)
430 431
431partitionRelay :: TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket) 432partitionRelay :: (IO () -> STM ())
433 -> TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket)
432 -> IO ( Transport err ViaRelay ByteString 434 -> IO ( Transport err ViaRelay ByteString
433 , TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket)) 435 , TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket))
434partitionRelay tr = partitionTransportM parse encode tr 436partitionRelay runio tr = partitionTransportM parse encode tr
435 where 437 where
436 parse :: ((SessionData,RelayPacket), NodeInfo) -> IO (Either (ByteString, ViaRelay) ((SessionData,RelayPacket),NodeInfo)) 438 parse :: ((SessionData,RelayPacket), NodeInfo) -> STM (Either (ByteString, ViaRelay) ((SessionData,RelayPacket),NodeInfo))
437 parse ((st,RelayData bs conid), ni) = do 439 parse ((st,RelayData bs conid), ni) = do
438 nid <- getRelayedRemote st conid 440 nid <- getRelayedRemote st conid
439 return $ Left (bs, ViaRelay (Just conid) nid ni) 441 return $ Left (bs, ViaRelay (Just conid) nid ni)
@@ -463,7 +465,7 @@ partitionRelay tr = partitionTransportM parse encode tr
463 465
464 466
465partitionOnion :: TransportCrypto 467partitionOnion :: TransportCrypto
466 -> (SockAddr -> Nonce8 -> IO (Maybe (OnionDestination RouteId))) 468 -> (SockAddr -> Nonce8 -> STM (Maybe (OnionDestination RouteId)))
467 -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute)) 469 -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute))
468 -> TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket) 470 -> TransportA err NodeInfo (SessionData,RelayPacket) (Bool,RelayPacket)
469 -> IO ( Transport err (OnionDestination RouteId) (OnionMessage Encrypted) 471 -> IO ( Transport err (OnionDestination RouteId) (OnionMessage Encrypted)
@@ -471,8 +473,8 @@ partitionOnion :: TransportCrypto
471partitionOnion crypto lookupSender getRoute tr = partitionTransportM parse encode tr 473partitionOnion crypto lookupSender getRoute tr = partitionTransportM parse encode tr
472 where 474 where
473 parse :: ((SessionData,RelayPacket), NodeInfo) 475 parse :: ((SessionData,RelayPacket), NodeInfo)
474 -> IO (Either (OnionMessage Encrypted , OnionDestination RouteId) 476 -> STM (Either (OnionMessage Encrypted , OnionDestination RouteId)
475 ((SessionData,RelayPacket), NodeInfo)) 477 ((SessionData,RelayPacket), NodeInfo))
476 parse pass@((_,OnionPacketResponse msg@(OnionAnnounceResponse n8 _ _)), nodeA) = do 478 parse pass@((_,OnionPacketResponse msg@(OnionAnnounceResponse n8 _ _)), nodeA) = do
477 m <- lookupSender (nodeAddr nodeA) n8 479 m <- lookupSender (nodeAddr nodeA) n8
478 case m of 480 case m of