diff options
-rw-r--r-- | Roster.hs | 100 | ||||
-rw-r--r-- | dht-client.cabal | 2 | ||||
-rw-r--r-- | examples/dhtd.hs | 14 | ||||
-rw-r--r-- | src/Network/Tox.hs | 23 |
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 #-} | ||
2 | module Roster where | ||
3 | |||
4 | import Control.Concurrent.STM | ||
5 | import Control.Monad | ||
6 | import Crypto.PubKey.Curve25519 | ||
7 | import qualified Data.HashMap.Strict as HashMap | ||
8 | ;import Data.HashMap.Strict (HashMap) | ||
9 | import Data.Maybe | ||
10 | import Network.Tox.DHT.Transport as DHT | ||
11 | import Network.Tox.NodeId | ||
12 | import Network.Tox.Onion.Transport as Onion | ||
13 | import System.IO | ||
14 | |||
15 | newtype Roster = Roster { accounts :: TVar (HashMap NodeId Account) } | ||
16 | |||
17 | data Account = Account | ||
18 | { userSecret :: SecretKey -- local secret key | ||
19 | , contacts :: TVar (HashMap NodeId Contact) -- received contact info | ||
20 | } | ||
21 | |||
22 | data Contact = Contact | ||
23 | { contactKeyPacket :: Maybe (DHT.DHTPublicKey) | ||
24 | , contactFriendRequest :: Maybe (DHT.FriendRequest) | ||
25 | } | ||
26 | |||
27 | mergeContact :: Contact -> Maybe Contact -> Maybe Contact | ||
28 | mergeContact (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 | ||
37 | mergeContact new Nothing = Just new | ||
38 | |||
39 | newRoster :: IO Roster | ||
40 | newRoster = atomically $ Roster <$> newTVar HashMap.empty | ||
41 | |||
42 | newAccount :: SecretKey -> STM Account | ||
43 | newAccount sk = Account sk <$> newTVar HashMap.empty | ||
44 | |||
45 | addRoster :: Roster -> SecretKey -> STM () | ||
46 | addRoster (Roster as) sk = do | ||
47 | a <- newAccount sk | ||
48 | modifyTVar' as $ HashMap.insert (key2id $ toPublic sk) a | ||
49 | |||
50 | delRoster :: Roster -> PublicKey -> STM () | ||
51 | delRoster (Roster as) pk = modifyTVar' as $ HashMap.delete (key2id pk) | ||
52 | |||
53 | updateRoster :: Roster -> Onion.AnnouncedRendezvous -> (PublicKey,Onion.OnionData) -> IO () | ||
54 | updateRoster 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 | |||
63 | updateAccount :: PublicKey -> Onion.OnionData -> Account -> STM () | ||
64 | updateAccount remoteUserKey (Onion.OnionDHTPublicKey dhtpk) acc = do | ||
65 | modifyTVar' (contacts acc) $ HashMap.alter (mergeContact $ Contact (Just dhtpk) Nothing) | ||
66 | (key2id remoteUserKey) | ||
67 | |||
68 | updateAccount remoteUserKey (Onion.OnionFriendRequest fr) acc = do | ||
69 | modifyTVar' (contacts acc) $ HashMap.alter (mergeContact $ Contact Nothing (Just fr)) | ||
70 | (key2id remoteUserKey) | ||
71 | |||
72 | dnsPresentation :: Roster -> STM String | ||
73 | dnsPresentation (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 | |||
84 | dnsPresentation1 :: (NodeId,DHTPublicKey) -> String | ||
85 | dnsPresentation1 (nid,dk) = unlines | ||
86 | [ concat [ show nid, ".tox. IN CNAME ", show (key2id $ dhtpk dk), ".dht." ] | ||
87 | ] | ||
88 | |||
89 | type LocalKey = NodeId | ||
90 | type RemoteKey = NodeId | ||
91 | |||
92 | friendRequests :: Roster -> STM (HashMap LocalKey [(RemoteKey,DHT.FriendRequest)]) | ||
93 | friendRequests (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 | |||
90 | import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage) | 90 | import qualified Network.Tox.Crypto.Transport as Tox (CryptoMessage) |
91 | import qualified Network.Tox.Crypto.Handlers as Tox | 91 | import qualified Network.Tox.Crypto.Handlers as Tox |
92 | import Data.Typeable | 92 | import Data.Typeable |
93 | import Roster | 93 | import Network.Tox.ContactInfo as Tox |
94 | import OnionRouter | 94 | import OnionRouter |
95 | import PingMachine | 95 | import 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 | |||
100 | import qualified Network.Tox.Onion.Transport as Onion | 100 | import qualified Network.Tox.Onion.Transport as Onion |
101 | import Network.Tox.Transport | 101 | import Network.Tox.Transport |
102 | import OnionRouter | 102 | import OnionRouter |
103 | import Roster | 103 | import Network.Tox.ContactInfo |
104 | import Text.XXD | 104 | import Text.XXD |
105 | 105 | ||
106 | newCrypto :: IO TransportCrypto | 106 | newCrypto :: 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 | ||
226 | data ConnectionKey -- TODO | ||
227 | data ConnectionStatus -- TODO | ||
228 | |||
229 | data Tox = Tox | 226 | data 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 |
245 | netCrypto :: Tox -> SecretKey -> PublicKey -> IO NetCryptoSession | 241 | netCrypto :: Tox -> SecretKey -> PublicKey -> IO NetCryptoSession |
246 | netCrypto tox myseckey theirpubkey = do | 242 | netCrypto 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 | ||
383 | onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) | 372 | onionTimeout :: Tox -> DHT.TransactionId -> Onion.OnionDestination RouteId -> STM (Onion.OnionDestination RouteId, Int) |