summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Roster.hs100
-rw-r--r--dht-client.cabal2
-rw-r--r--examples/dhtd.hs14
-rw-r--r--src/Network/Tox.hs23
4 files changed, 14 insertions, 125 deletions
diff --git a/Roster.hs b/Roster.hs
deleted file mode 100644
index 7c40e371..00000000
--- a/Roster.hs
+++ /dev/null
@@ -1,100 +0,0 @@
1{-# LANGUAGE NamedFieldPuns #-}
2module Roster where
3
4import Control.Concurrent.STM
5import Control.Monad
6import Crypto.PubKey.Curve25519
7import qualified Data.HashMap.Strict as HashMap
8 ;import Data.HashMap.Strict (HashMap)
9import Data.Maybe
10import Network.Tox.DHT.Transport as DHT
11import Network.Tox.NodeId
12import Network.Tox.Onion.Transport as Onion
13import System.IO
14
15newtype Roster = Roster { accounts :: TVar (HashMap NodeId Account) }
16
17data Account = Account
18 { userSecret :: SecretKey -- local secret key
19 , contacts :: TVar (HashMap NodeId Contact) -- received contact info
20 }
21
22data Contact = Contact
23 { contactKeyPacket :: Maybe (DHT.DHTPublicKey)
24 , contactFriendRequest :: Maybe (DHT.FriendRequest)
25 }
26
27mergeContact :: Contact -> Maybe Contact -> Maybe Contact
28mergeContact (Contact newk newf) (Just (Contact oldk oldf)) =
29 Just (Contact mergek mergef)
30 where
31 mergek = mplus oldk $ do
32 n <- newk
33 stamp <- fmap DHT.dhtpkNonce oldk `mplus` return minBound
34 guard (stamp <= DHT.dhtpkNonce n)
35 return n
36 mergef = mplus oldf newf
37mergeContact new Nothing = Just new
38
39newRoster :: IO Roster
40newRoster = atomically $ Roster <$> newTVar HashMap.empty
41
42newAccount :: SecretKey -> STM Account
43newAccount sk = Account sk <$> newTVar HashMap.empty
44
45addRoster :: Roster -> SecretKey -> STM ()
46addRoster (Roster as) sk = do
47 a <- newAccount sk
48 modifyTVar' as $ HashMap.insert (key2id $ toPublic sk) a
49
50delRoster :: Roster -> PublicKey -> STM ()
51delRoster (Roster as) pk = modifyTVar' as $ HashMap.delete (key2id pk)
52
53updateRoster :: Roster -> Onion.AnnouncedRendezvous -> (PublicKey,Onion.OnionData) -> IO ()
54updateRoster roster Onion.AnnouncedRendezvous{remoteUserKey} (localUserKey,omsg) = do
55 hPutStrLn stderr "updateRoster!!!"
56 atomically $ do
57 as <- readTVar (accounts roster)
58 maybe (return ())
59 (updateAccount remoteUserKey omsg)
60 $ HashMap.lookup (key2id localUserKey) as
61
62
63updateAccount :: PublicKey -> Onion.OnionData -> Account -> STM ()
64updateAccount remoteUserKey (Onion.OnionDHTPublicKey dhtpk) acc = do
65 modifyTVar' (contacts acc) $ HashMap.alter (mergeContact $ Contact (Just dhtpk) Nothing)
66 (key2id remoteUserKey)
67
68updateAccount remoteUserKey (Onion.OnionFriendRequest fr) acc = do
69 modifyTVar' (contacts acc) $ HashMap.alter (mergeContact $ Contact Nothing (Just fr))
70 (key2id remoteUserKey)
71
72dnsPresentation :: Roster -> STM String
73dnsPresentation (Roster accsvar) = do
74 accs <- readTVar accsvar
75 ms <- forM accs $ \Account { userSecret = sec, contacts = cvar } -> do
76 cs <- readTVar cvar
77 return $
78 "; local key = " ++ show (key2id $ toPublic sec) ++ "\n"
79 ++ concatMap dnsPresentation1
80 (mapMaybe (\(nid,m) -> ((,) nid) <$> contactKeyPacket m)
81 $ HashMap.toList cs)
82 return $ concat ms
83
84dnsPresentation1 :: (NodeId,DHTPublicKey) -> String
85dnsPresentation1 (nid,dk) = unlines
86 [ concat [ show nid, ".tox. IN CNAME ", show (key2id $ dhtpk dk), ".dht." ]
87 ]
88
89type LocalKey = NodeId
90type RemoteKey = NodeId
91
92friendRequests :: Roster -> STM (HashMap LocalKey [(RemoteKey,DHT.FriendRequest)])
93friendRequests (Roster roster) = do
94 accs <- readTVar roster
95 forM accs $ \Account { userSecret = sec, contacts = cvar } -> do
96 cs <- readTVar cvar
97 let remotes = mapMaybe (\(nid,m) -> ((,) nid) <$> contactFriendRequest m)
98 $ HashMap.toList cs
99 return remotes
100
diff --git a/dht-client.cabal b/dht-client.cabal
index 849ebf28..1e0cd1cd 100644
--- a/dht-client.cabal
+++ b/dht-client.cabal
@@ -96,7 +96,7 @@ library
96 Control.TriadCommittee 96 Control.TriadCommittee
97 Crypto.Tox 97 Crypto.Tox
98 Text.XXD 98 Text.XXD
99 Roster 99 Network.Tox.ContactInfo
100 Announcer 100 Announcer
101 InterruptibleDelay 101 InterruptibleDelay
102 ByteStringOperators 102 ByteStringOperators
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index ed7d5e63..73ae5a57 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -90,7 +90,7 @@ import qualified Network.Tox.Onion.Handlers as Tox
90import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage) 90import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage)
91import qualified Network.Tox.Crypto.Handlers as Tox 91import qualified Network.Tox.Crypto.Handlers as Tox
92import Data.Typeable 92import Data.Typeable
93import Roster 93import Network.Tox.ContactInfo as Tox
94import OnionRouter 94import OnionRouter
95import PingMachine 95import PingMachine
96 96
@@ -384,7 +384,7 @@ data Session = Session
384 , cryptosessions :: Tox.NetCryptoSessions 384 , cryptosessions :: Tox.NetCryptoSessions
385 , toxkeys :: TVar Tox.AnnouncedKeys 385 , toxkeys :: TVar Tox.AnnouncedKeys
386 , userkeys :: TVar [(SecretKey,PublicKey)] 386 , userkeys :: TVar [(SecretKey,PublicKey)]
387 , roster :: Roster 387 , roster :: Tox.ContactInfo
388 , connectionManager :: ConnectionManager 388 , connectionManager :: ConnectionManager
389 , onionRouter :: OnionRouter 389 , onionRouter :: OnionRouter
390 , announcer :: Announcer 390 , announcer :: Announcer
@@ -569,7 +569,7 @@ clientSession s@Session{..} sock cnum h = do
569 oldks <- atomically $ do 569 oldks <- atomically $ do
570 ks <- readTVar userkeys 570 ks <- readTVar userkeys
571 modifyTVar userkeys ((secret,pubkey):) 571 modifyTVar userkeys ((secret,pubkey):)
572 addRoster roster secret 572 Tox.addContactInfo roster secret
573 return ks 573 return ks
574 let asString = show . Tox.key2id 574 let asString = show . Tox.key2id
575 hPutClient h $ unlines $ map (mappend " " . show . Tox.key2id . snd) oldks 575 hPutClient h $ unlines $ map (mappend " " . show . Tox.key2id . snd) oldks
@@ -591,7 +591,7 @@ clientSession s@Session{..} sock cnum h = do
591 oldks <- atomically $ do 591 oldks <- atomically $ do
592 oldks <- readTVar userkeys 592 oldks <- readTVar userkeys
593 modifyTVar userkeys (pairs ++) 593 modifyTVar userkeys (pairs ++)
594 forM pairs $ \(sk,_) -> addRoster roster sk 594 forM pairs $ \(sk,_) -> Tox.addContactInfo roster sk
595 return oldks 595 return oldks
596 hPutClient h $ unlines $ map (mappend " " . show . Tox.key2id . snd) oldks 596 hPutClient h $ unlines $ map (mappend " " . show . Tox.key2id . snd) oldks
597 ++ map (mappend " *" . show . Tox.key2id .snd) pairs 597 ++ map (mappend " *" . show . Tox.key2id .snd) pairs
@@ -604,7 +604,7 @@ clientSession s@Session{..} sock cnum h = do
604 pairs = map (toPair . f) mbSecs 604 pairs = map (toPair . f) mbSecs
605 ks <- atomically $ do 605 ks <- atomically $ do
606 modifyTVar userkeys (filter (`notElem` pairs) ) 606 modifyTVar userkeys (filter (`notElem` pairs) )
607 forM pairs $ \(_,pk) -> delRoster roster pk 607 forM pairs $ \(_,pk) -> Tox.delContactInfo roster pk
608 readTVar userkeys 608 readTVar userkeys
609 hPutClient h . showReport $ map mkrow ks 609 hPutClient h . showReport $ map mkrow ks
610 610
@@ -1332,12 +1332,12 @@ main = runResourceT $ liftBaseWith $ \resT -> do
1332 installHandler sigINT (CatchOnce (atomically $ writeTVar signalQuit True)) Nothing 1332 installHandler sigINT (CatchOnce (atomically $ writeTVar signalQuit True)) Nothing
1333 let defaultToxData = do 1333 let defaultToxData = do
1334 toxids <- atomically $ newTVar [] 1334 toxids <- atomically $ newTVar []
1335 rster <- newRoster 1335 rster <- Tox.newContactInfo
1336 orouter <- newOnionRouter (hPutStrLn stderr) 1336 orouter <- newOnionRouter (hPutStrLn stderr)
1337 return (toxids, rster, orouter) 1337 return (toxids, rster, orouter)
1338 (toxids,rstr,orouter) <- fromMaybe defaultToxData $ do 1338 (toxids,rstr,orouter) <- fromMaybe defaultToxData $ do
1339 tox <- mbtox 1339 tox <- mbtox
1340 return $ return ( userKeys (Tox.toxCryptoKeys tox), Tox.toxRoster tox, Tox.toxOnionRoutes tox ) 1340 return $ return ( userKeys (Tox.toxCryptoKeys tox), Tox.toxContactInfo tox, Tox.toxOnionRoutes tox )
1341 let session = clientSession0 $ Session 1341 let session = clientSession0 $ Session
1342 { netname = concat $ take 1 $ Map.keys dhts -- initial default DHT 1342 { netname = concat $ take 1 $ Map.keys dhts -- initial default DHT
1343 , dhts = dhts -- all DHTs 1343 , dhts = dhts -- all DHTs
diff --git a/src/Network/Tox.hs b/src/Network/Tox.hs
index a08f66c6..dfa0ea9e 100644
--- a/src/Network/Tox.hs
+++ b/src/Network/Tox.hs
@@ -100,7 +100,7 @@ import qualified Network.Tox.Onion.Handlers as Onion
100import qualified Network.Tox.Onion.Transport as Onion 100import qualified Network.Tox.Onion.Transport as Onion
101import Network.Tox.Transport 101import Network.Tox.Transport
102import OnionRouter 102import OnionRouter
103import Roster 103import Network.Tox.ContactInfo
104import Text.XXD 104import Text.XXD
105 105
106newCrypto :: IO TransportCrypto 106newCrypto :: IO TransportCrypto
@@ -223,9 +223,6 @@ newClient drg net classify selfAddr handlers modifytbl modifynet = do
223 in client 223 in client
224 return $ either mkclient mkclient tblvar handlers 224 return $ either mkclient mkclient tblvar handlers
225 225
226data ConnectionKey -- TODO
227data ConnectionStatus -- TODO
228
229data Tox = Tox 226data Tox = Tox
230 { toxDHT :: DHT.Client 227 { toxDHT :: DHT.Client
231 , toxOnion :: Onion.Client RouteId 228 , toxOnion :: Onion.Client RouteId
@@ -237,14 +234,13 @@ data Tox = Tox
237 , toxTokens :: TVar SessionTokens 234 , toxTokens :: TVar SessionTokens
238 , toxAnnouncedKeys :: TVar Onion.AnnouncedKeys 235 , toxAnnouncedKeys :: TVar Onion.AnnouncedKeys
239 , toxOnionRoutes :: OnionRouter 236 , toxOnionRoutes :: OnionRouter
240 , toxRoster :: Roster 237 , toxContactInfo :: ContactInfo
241 , toxManager :: Connection.Manager ConnectionStatus ConnectionKey
242 } 238 }
243 239
244-- | initiate a netcrypto session, blocking 240-- | initiate a netcrypto session, blocking
245netCrypto :: Tox -> SecretKey -> PublicKey -> IO NetCryptoSession 241netCrypto :: Tox -> SecretKey -> PublicKey -> IO NetCryptoSession
246netCrypto tox myseckey theirpubkey = do 242netCrypto tox myseckey theirpubkey = do
247-- convert public key to NodeInfo check Roster 243-- convert public key to NodeInfo check ContactInfo
248-- if no session: 244-- if no session:
249-- 1) send dht key, actually maybe send dht-key regardless 245-- 1) send dht key, actually maybe send dht-key regardless
250-- 2) send handshakes to last seen ip's, if any 246-- 2) send handshakes to last seen ip's, if any
@@ -358,11 +354,11 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do
358 (hookQueries orouter DHT.transactionKey) 354 (hookQueries orouter DHT.transactionKey)
359 (const id) 355 (const id)
360 356
361 roster <- newRoster 357 roster <- newContactInfo
362 return Tox 358 return Tox
363 { toxDHT = dhtclient 359 { toxDHT = dhtclient
364 , toxOnion = onionclient 360 , toxOnion = onionclient
365 , toxToRoute = onInbound (updateRoster roster) dtacrypt 361 , toxToRoute = onInbound (updateContactInfo roster) dtacrypt
366 , toxCrypto = addHandler (hPutStrLn stderr) (cryptoNetHandler sessionsState) cryptonet 362 , toxCrypto = addHandler (hPutStrLn stderr) (cryptoNetHandler sessionsState) cryptonet
367 , toxCryptoSessions = sessionsState 363 , toxCryptoSessions = sessionsState
368 , toxCryptoKeys = crypto 364 , toxCryptoKeys = crypto
@@ -370,14 +366,7 @@ newTox keydb addr mbSessionsState suppliedDHTKey = do
370 , toxTokens = toks 366 , toxTokens = toks
371 , toxAnnouncedKeys = keydb 367 , toxAnnouncedKeys = keydb
372 , toxOnionRoutes = orouter 368 , toxOnionRoutes = orouter
373 , toxRoster = roster 369 , toxContactInfo = roster
374 , toxManager = Connection.Manager
375 { setPolicy = _todo -- k -> Policy -> IO ()
376 , connections = _todo -- STM (Map k (Connection status))
377 , stringToKey = _todo -- String -> Maybe k
378 , showProgress = _todo -- status -> String
379 , showKey = _todo -- k -> String
380 }
381 } 370 }
382 371
383onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) 372onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int)