summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/dhtd.hs2
-rw-r--r--examples/testTox.hs80
-rw-r--r--src/Network/Tox.hs34
3 files changed, 105 insertions, 11 deletions
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 2bb4ca88..e4b10b8d 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -1750,7 +1750,7 @@ main = do
1750 addrTox 1750 addrTox
1751 (Just _netCryptoSessionsState) 1751 (Just _netCryptoSessionsState)
1752 (dhtkey opts) 1752 (dhtkey opts)
1753 (quitTox, toxStrap4, toxStrap6) <- Tox.forkTox tox 1753 (quitTox, toxStrap4, toxStrap6) <- Tox.forkTox tox True
1754 1754
1755 toxSearches <- atomically $ newTVar Map.empty 1755 toxSearches <- atomically $ newTVar Map.empty
1756 1756
diff --git a/examples/testTox.hs b/examples/testTox.hs
new file mode 100644
index 00000000..45bc661e
--- /dev/null
+++ b/examples/testTox.hs
@@ -0,0 +1,80 @@
1{-# LANGUAGE NamedFieldPuns #-}
2import Control.Concurrent.STM.TChan
3import Control.Concurrent.STM.TMChan
4import Control.Concurrent.STM.TVar
5import Control.Concurrent.Supply
6import Control.Monad.STM
7import Crypto.Tox
8import qualified Data.IntMap.Strict as IntMap
9import Network.QueryResponse
10import Network.Socket
11import Network.Tox
12import Network.Tox.ContactInfo
13import qualified Network.Tox.Crypto.Handlers as CH
14import Network.Tox.Crypto.Transport
15import Network.Tox.DHT.Handlers as DHT
16import Network.Tox.Onion.Transport (UDPTransport)
17import DPut
18
19
20makeToxNode :: UDPTransport -> Maybe SecretKey -> IO (Tox extra)
21makeToxNode udp sec = do
22 keysdb <- newKeysDatabase
23 newToxOverTransport keysdb
24 (SockAddrInet 0 0)
25 Nothing
26 sec
27 udp
28
29
30setToxID :: Tox () -> Maybe SecretKey -> IO ()
31setToxID tox (Just sec) = atomically $ addContactInfo (toxContactInfo tox) sec ()
32
33sessionChan :: Tox extra -> IO (TChan (TMChan CryptoMessage))
34sessionChan Tox{toxCryptoSessions} = do
35 tchan <- atomically newTChan
36 atomically $ CH.addNewSessionHook toxCryptoSessions $ \_ nc -> do
37 atomically $ do
38 session_chan <- newTMChan
39 writeTChan tchan session_chan
40 (n,supply) <- freshId <$> readTVar (CH.listenerIDSupply toxCryptoSessions)
41 writeTVar (CH.listenerIDSupply toxCryptoSessions) supply
42 modifyTVar' (CH.ncListeners nc) $ IntMap.insert n (0,session_chan)
43 return Nothing
44 return tchan
45
46
47main :: IO ()
48main = do
49 mapM_ setVerbose [ minBound .. maxBound ]
50 setQuiet XRoutes
51
52 (udpA,udpB) <- testPairTransport
53
54 a_Ct7g5azVcJ8KnvxzbXs9GqeqcjrP7VdZXIC'uHeTlRf
55 <- makeToxNode udpA $ decodeSecret "YrJQFG7Xppg4WAyhooONNGSCRVQbrRF9L4VoQQsetF"
56 a_Ct7g5azVcJ8KnvxzbXs9GqeqcjrP7VdZXIC'uHeTlRf
57 `setToxID` -- BDDj3maMmK8hR3mTpju29wmtE2YJ5cf8NlNEWi1dXlI
58 decodeSecret "UdZUB9Mf1RD3pVGh02OsRJM6YpmGqJiVxYGVIVHkAG"
59
60 a_sessions <- sessionChan a_Ct7g5azVcJ8KnvxzbXs9GqeqcjrP7VdZXIC'uHeTlRf
61
62 let b = read "OM7znaPMYkTbm.9GcZJAdnDATXmZxZ9fnaSTP3qNCZk@2.0.0.0:2"
63 b_OM7znaPMYkTbm'9GcZJAdnDATXmZxZ9fnaSTP3qNCZk
64 <- makeToxNode udpB $ decodeSecret "Lm2pnsu1+80I8h9txMoZyGgcNwfaoqBlIfg5TwWUXL"
65 b_OM7znaPMYkTbm'9GcZJAdnDATXmZxZ9fnaSTP3qNCZk
66 `setToxID` -- AvETKhO-YqnNRopZrj8K3xUpGtGbX0sLhZZjh2VufJB
67 decodeSecret "L7WNtNIbm0ajNlPrkWvSRpn0nypTUZxlHBckZPlTje"
68
69 b_sessions <- sessionChan b_OM7znaPMYkTbm'9GcZJAdnDATXmZxZ9fnaSTP3qNCZk
70
71 (a_quit,_,_) <- forkTox a_Ct7g5azVcJ8KnvxzbXs9GqeqcjrP7VdZXIC'uHeTlRf False
72 (b_quit,_,_) <- forkTox b_OM7znaPMYkTbm'9GcZJAdnDATXmZxZ9fnaSTP3qNCZk False
73
74
75 DHT.ping (toxDHT a_Ct7g5azVcJ8KnvxzbXs9GqeqcjrP7VdZXIC'uHeTlRf) b
76
77 putStrLn "Type Enter to quit..."
78 getLine
79
80 return ()
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index 00dfcf9f..d81ed1e3 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -389,6 +389,17 @@ newTox :: TVar Onion.AnnouncedKeys -- ^ Store of announced keys we are a rende
389 -> IO (Tox extra) 389 -> IO (Tox extra)
390newTox keydb addr mbSessionsState suppliedDHTKey = do 390newTox keydb addr mbSessionsState suppliedDHTKey = do
391 (udp,sock) <- {- addVerbosity <$> -} udpTransport' addr 391 (udp,sock) <- {- addVerbosity <$> -} udpTransport' addr
392 tox <- newToxOverTransport keydb addr mbSessionsState suppliedDHTKey udp
393 return tox { toxAnnounceToLan = announceToLan sock (key2id $ transportPublic $ toxCryptoKeys tox) }
394
395-- | This version of 'newTox' is useful for automated tests using 'testPairTransport'.
396newToxOverTransport :: TVar Onion.AnnouncedKeys
397 -> SockAddr
398 -> Maybe NetCryptoSessions
399 -> Maybe SecretKey
400 -> Onion.UDPTransport
401 -> IO (Tox extra)
402newToxOverTransport keydb addr mbSessionsState suppliedDHTKey udp = do
392 roster <- newContactInfo 403 roster <- newContactInfo
393 (crypto0,sessionsState0) <- case mbSessionsState of 404 (crypto0,sessionsState0) <- case mbSessionsState of
394 Nothing -> do 405 Nothing -> do
@@ -475,7 +486,7 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do
475 , toxAnnouncedKeys = keydb 486 , toxAnnouncedKeys = keydb
476 , toxOnionRoutes = orouter 487 , toxOnionRoutes = orouter
477 , toxContactInfo = roster 488 , toxContactInfo = roster
478 , toxAnnounceToLan = announceToLan sock (key2id $ transportPublic crypto) 489 , toxAnnounceToLan = return ()
479 , toxMgr = mgr 490 , toxMgr = mgr
480 } 491 }
481 492
@@ -501,21 +512,24 @@ dnssdDiscover tox ni toxid = do
501 512
502 void $ DHT.ping (toxDHT tox) ni 513 void $ DHT.ping (toxDHT tox) ni
503 514
504forkTox :: Tox extra -> IO (IO (), [NodeInfo] -> [NodeInfo] -> IO (), [NodeInfo] -> [NodeInfo] -> IO ()) 515forkTox :: Tox extra -> Bool -> IO (IO (), [NodeInfo] -> [NodeInfo] -> IO (), [NodeInfo] -> [NodeInfo] -> IO ())
505forkTox tox = do 516forkTox tox with_avahi = do
506 _ <- forkListener "toxHandshakes" (toxHandshakes tox) 517 _ <- forkListener "toxHandshakes" (toxHandshakes tox)
507 _ <- forkListener "toxToRoute" (toxToRoute tox) 518 _ <- forkListener "toxToRoute" (toxToRoute tox)
508 _ <- forkListener "toxOnion" (clientNet $ toxOnion tox) 519 _ <- forkListener "toxOnion" (clientNet $ toxOnion tox)
509 _ <- forkListener "toxDHT" (clientNet $ toxDHT tox) 520 _ <- forkListener "toxDHT" (clientNet $ toxDHT tox)
510 quit <- forkListener "toxCrypto" (toxCrypto tox) 521 quit <- forkListener "toxCrypto" (toxCrypto tox)
511 forkPollForRefresh (DHT.refresher4 $ toxRouting tox) 522 quitAvahi <- if with_avahi then do
512 forkPollForRefresh (DHT.refresher6 $ toxRouting tox) 523 forkPollForRefresh (DHT.refresher4 $ toxRouting tox)
513 dnssdIn <- forkIO $ queryToxService (dnssdDiscover tox) 524 forkPollForRefresh (DHT.refresher6 $ toxRouting tox)
514 dnssdOut <- forkIO $ dnssdAnnounce tox 525 dnssdIn <- forkIO $ queryToxService (dnssdDiscover tox)
515 labelThread dnssdIn "tox-avahi-monitor" 526 dnssdOut <- forkIO $ dnssdAnnounce tox
516 labelThread dnssdOut "tox-avahi-publish" 527 labelThread dnssdIn "tox-avahi-monitor"
528 labelThread dnssdOut "tox-avahi-publish"
529 return $ forM_ [dnssdIn,dnssdOut] killThread
530 else return $ return ()
517 keygc <- Onion.forkAnnouncedKeysGC (toxAnnouncedKeys tox) 531 keygc <- Onion.forkAnnouncedKeysGC (toxAnnouncedKeys tox)
518 return ( forM_ [dnssdIn, dnssdOut, keygc] killThread >> quit 532 return ( quitAvahi >> killThread keygc >> quit
519 , bootstrap (DHT.refresher4 $ toxRouting tox) 533 , bootstrap (DHT.refresher4 $ toxRouting tox)
520 , bootstrap (DHT.refresher6 $ toxRouting tox) 534 , bootstrap (DHT.refresher6 $ toxRouting tox)
521 ) 535 )