summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Tox.hs62
-rw-r--r--ToxMessage.hs32
-rw-r--r--examples/dhtd.hs16
3 files changed, 86 insertions, 24 deletions
diff --git a/Tox.hs b/Tox.hs
index d8bf11bc..de702f1f 100644
--- a/Tox.hs
+++ b/Tox.hs
@@ -459,6 +459,17 @@ decryptAssymetric sk typ assym
459 . second (either (const (Tox.Nonce8 0)) id . S.decode) 459 . second (either (const (Tox.Nonce8 0)) id . S.decode)
460 $ B.splitAt (B.length bs - 8) bs 460 $ B.splitAt (B.length bs - 8) bs
461 461
462-- TODO: We should not be having to re-serialize this data... :/
463-- There should be a way to pass the Tox.Assymetric value up the layers.
464passThroughAssymetric :: Tox.PacketKind -> Tox.PubKey -> Tox.Assymetric -> Either String Msg
465passThroughAssymetric typ k assym
466 = Right $ Msg
467 { msgNonce = Tox.assymetricNonce . Tox.sent $ assym -- Not used.
468 , msgType = typ
469 , msgData = S.encode (k,assym)
470 , msgSendBack = Nonce8 0 -- Not used.
471 }
472
462{- 473{-
463decryptUnclm :: SecretKey -> Tox.PacketKind -> NodeId -> Tox.Nonce8 -> Tox.UnclaimedAssymetric -> Either String Msg 474decryptUnclm :: SecretKey -> Tox.PacketKind -> NodeId -> Tox.Nonce8 -> Tox.UnclaimedAssymetric -> Either String Msg
464decryptUnclm sk typ sender n8 unclm 475decryptUnclm sk typ sender n8 unclm
@@ -559,8 +570,9 @@ msgLayer sk pk = layerTransport parse serialize
559 parse :: (Tox.PacketKind,InterediateRep) -> ToxPath -> Either String (Msg,ToxPath) 570 parse :: (Tox.PacketKind,InterediateRep) -> ToxPath -> Either String (Msg,ToxPath)
560 parse (typ,Assym x) addr = fmap (,addr) $ decryptAssymetric sk typ x 571 parse (typ,Assym x) addr = fmap (,addr) $ decryptAssymetric sk typ x
561 parse (typ,Assym' x) addr = fmap (,addr) $ decryptAssymetric sk typ x 572 parse (typ,Assym' x) addr = fmap (,addr) $ decryptAssymetric sk typ x
573 parse (typ,ToRoute k x) addr = fmap (,addr) $ passThroughAssymetric typ k x
562 parse (typ,Unclm n x) addr = Right ( Msg typ (Tox.assymetricNonce x) (S.encode (Tox.assymetricData x)) n 574 parse (typ,Unclm n x) addr = Right ( Msg typ (Tox.assymetricNonce x) (S.encode (Tox.assymetricData x)) n
563 , addr) 575 , addr)
564 serialize :: Msg -> ToxPath -> ((Tox.PacketKind,InterediateRep),ToxPath) 576 serialize :: Msg -> ToxPath -> ((Tox.PacketKind,InterediateRep),ToxPath)
565 serialize x addr@(ToxPath ni _) = case Tox.pktClass (msgType x) of 577 serialize x addr@(ToxPath ni _) = case Tox.pktClass (msgType x) of
566 Tox.AssymetricClass {} -> ((msgType x, Assym $ encryptAssymetric sk pk (nodeId ni) x), addr) 578 Tox.AssymetricClass {} -> ((msgType x, Assym $ encryptAssymetric sk pk (nodeId ni) x), addr)
@@ -569,7 +581,9 @@ msgLayer sk pk = layerTransport parse serialize
569 581
570data InterediateRep = Assym Tox.Assymetric 582data InterediateRep = Assym Tox.Assymetric
571 | Assym' Tox.Assymetric 583 | Assym' Tox.Assymetric
584 | ToRoute Tox.PubKey Tox.Assymetric
572 | Unclm Tox.Nonce8 Tox.UnclaimedAssymetric 585 | Unclm Tox.Nonce8 Tox.UnclaimedAssymetric
586 | RouteResponse Tox.Packet
573 587
574asymLayer :: Transport String SockAddr Tox.Packet -> Transport String ToxPath (Tox.PacketKind,InterediateRep) 588asymLayer :: Transport String SockAddr Tox.Packet -> Transport String ToxPath (Tox.PacketKind,InterediateRep)
575asymLayer = layerTransport parse (\p@(typ,_) -> trace ("SERIALIZE "++show typ) $ serialize p) 589asymLayer = layerTransport parse (\p@(typ,_) -> trace ("SERIALIZE "++show typ) $ serialize p)
@@ -577,10 +591,10 @@ asymLayer = layerTransport parse (\p@(typ,_) -> trace ("SERIALIZE "++show typ) $
577 parse :: Tox.Packet -> SockAddr -> Either String ((Tox.PacketKind,InterediateRep),ToxPath) 591 parse :: Tox.Packet -> SockAddr -> Either String ((Tox.PacketKind,InterediateRep),ToxPath)
578 parse x addr = case Tox.pktClass (Tox.pktKind x) of 592 parse x addr = case Tox.pktClass (Tox.pktKind x) of
579 Tox.AssymetricClass top fromp -> go Tox.senderKey fromp Assym 593 Tox.AssymetricClass top fromp -> go Tox.senderKey fromp Assym
580 Tox.AliasedClass top fromp -> let (Tox.Aliased a,rpath) = fromp x 594 Tox.AliasedClass top fromp -> goalias $ fromp x
581 in fmap (\ni -> ( (Tox.pktKind x, Assym' a) 595 Tox.ToRouteClass top fromp -> do let (key,y) = fromp x
582 , ToxPath ni rpath )) 596 ((typ,Assym' a),addr') <- goalias y
583 $ nodeInfo (Tox.senderKey a) addr 597 return ((typ,ToRoute key a),addr')
584 Tox.NoncedUnclaimedClass top fromp -> go (const zeroID) fromp (uncurry Unclm) 598 Tox.NoncedUnclaimedClass top fromp -> go (const zeroID) fromp (uncurry Unclm)
585 -- OnionClass 599 -- OnionClass
586 where go mkaddr fromp c = let y = fromp x 600 where go mkaddr fromp c = let y = fromp x
@@ -588,14 +602,19 @@ asymLayer = layerTransport parse (\p@(typ,_) -> trace ("SERIALIZE "++show typ) $
588 . (\ni -> ToxPath ni Tox.emptyReturnPath) 602 . (\ni -> ToxPath ni Tox.emptyReturnPath)
589 ) 603 )
590 $ nodeInfo (mkaddr y) addr 604 $ nodeInfo (mkaddr y) addr
605 goalias (Tox.Aliased a,rpath) = fmap (\ni -> ( (Tox.pktKind x, Assym' a)
606 , ToxPath ni rpath ))
607 $ nodeInfo (Tox.senderKey a) addr
591 608
592 serialize :: (Tox.PacketKind,InterediateRep) -> ToxPath -> (Tox.Packet,SockAddr) 609 serialize :: (Tox.PacketKind,InterediateRep) -> ToxPath -> (Tox.Packet,SockAddr)
593 serialize (typ,Assym assym) (ToxPath addr rpath) = (x,nodeAddr addr) 610 serialize (typ,Assym assym) (ToxPath addr rpath) = (x,nodeAddr addr)
594 where x = case Tox.pktClass typ of Tox.AssymetricClass top _ -> top assym 611 where x = case Tox.pktClass typ of Tox.AssymetricClass top _ -> top assym
595 serialize (typ,Assym' assym) (ToxPath addr rpath) = (x,nodeAddr addr) -- TODO rpath 612 serialize (typ,Assym' assym) (ToxPath addr rpath) = (x,nodeAddr addr) -- TODO rpath
596 where x = case Tox.pktClass typ of Tox.AliasedClass top _ -> top (Tox.Aliased assym, error "todo: ReturnPath") 613 where x = case Tox.pktClass typ of Tox.AliasedClass top _ -> top (Tox.Aliased assym, error "todo: ReturnPath")
614 -- An unclm sent to a ToxPath is turned into an OnionResponse before being sent out.
597 serialize (typ,Unclm nonce unclm) (ToxPath addr rpath) = (Tox.mkOnion rpath x,nodeAddr addr) 615 serialize (typ,Unclm nonce unclm) (ToxPath addr rpath) = (Tox.mkOnion rpath x,nodeAddr addr)
598 where x = case Tox.pktClass typ of Tox.NoncedUnclaimedClass top _ -> top nonce unclm 616 where x = case Tox.pktClass typ of Tox.NoncedUnclaimedClass top _ -> top nonce unclm
617 serialize (_,RouteResponse x) (ToxPath addr rpath) = (Tox.mkOnion rpath x, nodeAddr addr)
599 -- OnionClass 618 -- OnionClass
600 619
601toxLayer :: Transport String SockAddr ByteString -> Transport String SockAddr Tox.Packet 620toxLayer :: Transport String SockAddr ByteString -> Transport String SockAddr Tox.Packet
@@ -627,10 +646,12 @@ trimPackets addr bs = do
627 GetNodesType -> Just id 646 GetNodesType -> Just id
628 AnnounceType -> Just id 647 AnnounceType -> Just id
629 AnnounceResponseType -> Just id 648 AnnounceResponseType -> Just id
649 DataRequestType -> Just id
650 -- DataResponseType -> Just id
630 OnionResponse3Type -> Just id 651 OnionResponse3Type -> Just id
631 _ -> Nothing 652 _ -> Nothing
632 653
633newClient :: SockAddr -> IO (ToxClient, Routing) 654newClient :: SockAddr -> IO (ToxClient, Routing, TVar AnnouncedKeys)
634newClient addr = do 655newClient addr = do
635 udp <- udpTransport addr 656 udp <- udpTransport addr
636 secret <- generateSecretKey 657 secret <- generateSecretKey
@@ -691,7 +712,8 @@ newClient addr = do
691 $ addVerbosity 712 $ addVerbosity
692 $ msgLayer secret pubkey 713 $ msgLayer secret pubkey
693 $ onInbound (updateRouting client routing) 714 $ onInbound (updateRouting client routing)
694 $ asymLayer 715 $ asymnet
716 asymnet = asymLayer
695 -- $ addHandler (handleMessage aclient) 717 -- $ addHandler (handleMessage aclient)
696 $ toxLayer 718 $ toxLayer
697 $ addVerbosity2 719 $ addVerbosity2
@@ -716,6 +738,7 @@ newClient addr = do
716 handlers PingType = handler PongType pingH 738 handlers PingType = handler PongType pingH
717 handlers GetNodesType = handler SendNodesType $ getNodesH routing 739 handlers GetNodesType = handler SendNodesType $ getNodesH routing
718 handlers AnnounceType = handler' AnnounceResponseType $ announceH routing toks keydb 740 handlers AnnounceType = handler' AnnounceResponseType $ announceH routing toks keydb
741 handlers DataRequestType = Just $ NoReply (S.decode . msgData) $ dataToRouteH keydb asymnet
719 {- 742 {-
720 handlers var OnionRequest0 = noreply OnionRequest0 743 handlers var OnionRequest0 = noreply OnionRequest0
721 $ onionSend0H (symmetricCipher (return symkey) 744 $ onionSend0H (symmetricCipher (return symkey)
@@ -764,7 +787,7 @@ newClient addr = do
764 , clientResponseId = genNonce24 var 787 , clientResponseId = genNonce24 var
765 } 788 }
766 789
767 return (client, routing) 790 return (client, routing, keydb)
768 791
769toxKademlia :: ToxClient -> TriadCommittee NodeId SockAddr -> TVar (R.BucketList NodeInfo) -> TVar (Int.PSQ POSIXTime) -> Kademlia NodeId NodeInfo 792toxKademlia :: ToxClient -> TriadCommittee NodeId SockAddr -> TVar (R.BucketList NodeInfo) -> TVar (Int.PSQ POSIXTime) -> Kademlia NodeId NodeInfo
770toxKademlia client committee var sched 793toxKademlia client committee var sched
@@ -862,6 +885,8 @@ classify (Msg { msgType = typ
862 OnionRequest1Type -> IsQuery typ 885 OnionRequest1Type -> IsQuery typ
863 OnionRequest2Type -> IsQuery typ 886 OnionRequest2Type -> IsQuery typ
864 AnnounceType -> IsQuery typ 887 AnnounceType -> IsQuery typ
888 DataRequestType -> IsQuery typ
889 DataResponseType -> IsResponse
865 _ -> const $ IsUnknown ("Unknown message type: "++show typ) 890 _ -> const $ IsUnknown ("Unknown message type: "++show typ)
866 891
867{- 892{-
@@ -1151,6 +1176,19 @@ getNodesH routing addr (GetNodes nid) = do
1151 1176
1152 k = 4 1177 k = 4
1153 1178
1179
1180dataToRouteH :: TVar AnnouncedKeys -> Transport err ToxPath (Tox.PacketKind,InterediateRep) -> addr -> (Tox.PubKey,Assymetric) -> IO ()
1181dataToRouteH keydb udp _ (k,assym) = do
1182 mb <- atomically $ do
1183 ks <- readTVar keydb
1184 forM (MinMaxPSQ.lookup' k (keyAssoc ks)) $ \(p,(cnt,rpath)) -> do
1185 writeTVar keydb $ ks { keyAssoc = MinMaxPSQ.insert' k (cnt + 1, rpath) p (keyAssoc ks) }
1186 return rpath
1187 forM_ mb $ \rpath -> do
1188 -- forward
1189 sendMessage udp rpath (DataResponseType, RouteResponse $ DataToRouteResponse $ Aliased assym)
1190 hPutStrLn stderr $ "Forwarding data-to-route -->"++show k
1191
1154-- Toxcore generates `ping_id`s by taking a 32 byte sha hash of the current time, 1192-- Toxcore generates `ping_id`s by taking a 32 byte sha hash of the current time,
1155-- some secret bytes generated when the instance is created, the current time 1193-- some secret bytes generated when the instance is created, the current time
1156-- divided by a 20 second timeout, the public key of the requester and the source 1194-- divided by a 20 second timeout, the public key of the requester and the source
@@ -1187,7 +1225,7 @@ announceH routing toks keydb (ToxPath naddr retpath) req = do
1187 (announceSeeking req) 1225 (announceSeeking req)
1188 modifyTVar' keydb (insertKey tm (announceSeeking req) toxpath d) 1226 modifyTVar' keydb (insertKey tm (announceSeeking req) toxpath d)
1189 ks <- readTVar keydb 1227 ks <- readTVar keydb
1190 return $ snd <$> MinMaxPSQ.lookup' (announceSeeking req) (keyAssoc ks) 1228 return $ snd . snd <$> MinMaxPSQ.lookup' (announceSeeking req) (keyAssoc ks)
1191 newtok <- if storing 1229 newtok <- if storing
1192 then Nonce32 . toPaddedByteString 32 <$> grantToken toks naddr 1230 then Nonce32 . toPaddedByteString 32 <$> grantToken toks naddr
1193 else return $ zeros32 1231 else return $ zeros32
@@ -1332,11 +1370,13 @@ type NodeDistance = Tox.PubKey
1332 1370
1333data AnnouncedKeys = AnnouncedKeys 1371data AnnouncedKeys = AnnouncedKeys
1334 { keyByAge :: PSQ NodeId (Down POSIXTime) -- timeout of 300 seconds 1372 { keyByAge :: PSQ NodeId (Down POSIXTime) -- timeout of 300 seconds
1335 , keyAssoc :: MinMaxPSQ' Tox.PubKey NodeDistance ToxPath 1373 , keyAssoc :: MinMaxPSQ' Tox.PubKey NodeDistance (Int,ToxPath)
1336 } 1374 }
1337 1375
1338insertKey :: POSIXTime -> Tox.PubKey -> ToxPath -> NodeDistance -> AnnouncedKeys -> AnnouncedKeys 1376insertKey :: POSIXTime -> Tox.PubKey -> ToxPath -> NodeDistance -> AnnouncedKeys -> AnnouncedKeys
1339insertKey tm pub toxpath d keydb = AnnouncedKeys 1377insertKey tm pub toxpath d keydb = AnnouncedKeys
1340 { keyByAge = PSQ.insert pub (Down tm) (keyByAge keydb) 1378 { keyByAge = PSQ.insert pub (Down tm) (keyByAge keydb)
1341 , keyAssoc = MinMaxPSQ.insert' pub toxpath d (keyAssoc keydb) 1379 , keyAssoc = case MinMaxPSQ.lookup' pub (keyAssoc keydb) of
1380 Just (_,(cnt,_)) -> MinMaxPSQ.insert' pub (cnt,toxpath) d (keyAssoc keydb)
1381 Nothing -> MinMaxPSQ.insert' pub (0 ,toxpath) d (keyAssoc keydb)
1342 } 1382 }
diff --git a/ToxMessage.hs b/ToxMessage.hs
index 56758e48..c77f1ad7 100644
--- a/ToxMessage.hs
+++ b/ToxMessage.hs
@@ -220,14 +220,6 @@ data Packet where
220 220
221 OnionRequest3 :: ByteString -> Symmetric -> Packet -- 0x82 221 OnionRequest3 :: ByteString -> Symmetric -> Packet -- 0x82
222 222
223 -- TODO:
224 -- Announce has a return path appended to it.
225 -- We'll need a type-level natural to indicate how may bytes to
226 -- get in the ImplicitAssymetric data. (Or we could force the size
227 -- of the return path).
228 --
229 -- If the return path is non empty, we should respond with OnionResponse3
230 -- rather than AnnounceResponse directly.
231 Announce :: Aliased Assymetric -> ReturnPath 3 -> Packet --0x83 223 Announce :: Aliased Assymetric -> ReturnPath 3 -> Packet --0x83
232 AnnounceResponse :: Nonce8 -> UnclaimedAssymetric -> Packet -- 0x84 224 AnnounceResponse :: Nonce8 -> UnclaimedAssymetric -> Packet -- 0x84
233 225
@@ -256,8 +248,9 @@ pattern OnionRequest1Type = PacketKind 129 -- 0x81 Onion Request 1
256pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2 248pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2
257pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request 249pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request
258pattern AnnounceResponseType = PacketKind 132 -- 0x84 Announce Response 250pattern AnnounceResponseType = PacketKind 132 -- 0x84 Announce Response
259-- 0x85 Onion Data Request (data to route request packet) 251
260-- 0x86 Onion Data Response (data to route response packet) 252pattern DataRequestType = PacketKind 133 -- 0x85 Onion Data Request (data to route request packet)
253pattern DataResponseType = PacketKind 134 -- 0x86 Onion Data Response (data to route response packet)
261-- 0x8c Onion Response 3 254-- 0x8c Onion Response 3
262-- 0x8d Onion Response 2 255-- 0x8d Onion Response 2
263pattern OnionResponse3Type = PacketKind 140 -- 0x8c Onion Response 3 256pattern OnionResponse3Type = PacketKind 140 -- 0x8c Onion Response 3
@@ -291,7 +284,10 @@ instance Show PacketKind where
291 showsPrec d OnionRequest0Type = mappend "OnionRequest0" 284 showsPrec d OnionRequest0Type = mappend "OnionRequest0"
292 showsPrec d OnionResponse1Type = mappend "OnionResponse1" 285 showsPrec d OnionResponse1Type = mappend "OnionResponse1"
293 showsPrec d OnionResponse3Type = mappend "OnionResponse3" 286 showsPrec d OnionResponse3Type = mappend "OnionResponse3"
294 showsPrec d AnnounceType = mappend "AnnounceType" 287 showsPrec d AnnounceType = mappend "Announce"
288 showsPrec d AnnounceResponseType = mappend "AnnounceResponse"
289 showsPrec d DataRequestType = mappend "DataRequestType"
290 showsPrec d DataResponseType = mappend "DataResponseType"
295 showsPrec d (PacketKind x) = mappend "PacketKind " . showsPrec (d+1) x 291 showsPrec d (PacketKind x) = mappend "PacketKind " . showsPrec (d+1) x
296 292
297pktKind :: Packet -> PacketKind 293pktKind :: Packet -> PacketKind
@@ -356,6 +352,7 @@ pktKind OnionResponse3 {} = PacketKind 0x8c
356data PacketClass = 352data PacketClass =
357 AssymetricClass (Assymetric -> Packet) (Packet -> Assymetric) 353 AssymetricClass (Assymetric -> Packet) (Packet -> Assymetric)
358 | forall n. OnionPacket n => AliasedClass ((Aliased Assymetric,ReturnPath n) -> Packet) (Packet -> (Aliased Assymetric,ReturnPath n)) 354 | forall n. OnionPacket n => AliasedClass ((Aliased Assymetric,ReturnPath n) -> Packet) (Packet -> (Aliased Assymetric,ReturnPath n))
355 | forall n. OnionPacket n => ToRouteClass ((PubKey,(Aliased Assymetric,ReturnPath n)) -> Packet) (Packet -> (PubKey,(Aliased Assymetric,ReturnPath n)))
359 | forall n. OnionPacket n => OnionClass ((Packet,ReturnPath n) -> Packet) (Packet -> (Packet,ReturnPath n)) 356 | forall n. OnionPacket n => OnionClass ((Packet,ReturnPath n) -> Packet) (Packet -> (Packet,ReturnPath n))
360 | NoncedUnclaimedClass (Nonce8 -> UnclaimedAssymetric -> Packet) 357 | NoncedUnclaimedClass (Nonce8 -> UnclaimedAssymetric -> Packet)
361 (Packet -> (Nonce8, UnclaimedAssymetric)) 358 (Packet -> (Nonce8, UnclaimedAssymetric))
@@ -383,13 +380,16 @@ pktClass (PacketKind 4) = AssymetricClass SendNodes (\(SendNodes a) -> a)
383 380
384pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a) 381pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a)
385pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a) 382pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a)
386-- pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a) 383pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a)
387 384
388pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r)) 385pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r))
389pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl)) 386pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl))
390 387
391pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r)) 388pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r))
392 389
390pktClass DataRequestType = ToRouteClass (\(k,(a,r))-> DataToRoute k a r)
391 (\(DataToRoute k a r) -> (k,(a,r)))
392
393pktClass _ = Unclassified 393pktClass _ = Unclassified
394 394
395 395
@@ -408,6 +408,13 @@ getPacket = do
408 r <- get 408 r <- get
409 trace ("PARSED "++show typ) $ return () 409 trace ("PARSED "++show typ) $ return ()
410 return $ toPacket (a,r) 410 return $ toPacket (a,r)
411 ToRouteClass toPacket _ -> do
412 trace ("R-PARSE "++show typ) $ return ()
413 cnt <- remaining
414 (pub,a) <- isolate (cnt - 59*3) get
415 r <- get
416 trace ("R-PARSED "++show typ) $ return ()
417 return $ toPacket (pub,(a,r))
411 OnionClass toPacket _ -> do 418 OnionClass toPacket _ -> do
412 trace ("ONION-PARSE "++show typ) $ return () 419 trace ("ONION-PARSE "++show typ) $ return ()
413 p <- get 420 p <- get
@@ -421,6 +428,7 @@ putPacket p = do
421 case pktClass (pktKind p) of 428 case pktClass (pktKind p) of
422 AssymetricClass _ fromPacket -> put $ fromPacket p 429 AssymetricClass _ fromPacket -> put $ fromPacket p
423 AliasedClass _ fromPacket -> put $ fromPacket p 430 AliasedClass _ fromPacket -> put $ fromPacket p
431 ToRouteClass _ fromPacket -> put $ fromPacket p
424 OnionClass _ fromPacket -> put $ swap $ fromPacket p 432 OnionClass _ fromPacket -> put $ swap $ fromPacket p
425 NoncedUnclaimedClass _ fromPacket -> put $ fromPacket p -- putting a pair. 433 NoncedUnclaimedClass _ fromPacket -> put $ fromPacket p -- putting a pair.
426 Unclassified -> fail $ "todo: serialize packet "++show (pktKind p) 434 Unclassified -> fail $ "todo: serialize packet "++show (pktKind p)
diff --git a/examples/dhtd.hs b/examples/dhtd.hs
index 8e8d47a2..3f6dcaf4 100644
--- a/examples/dhtd.hs
+++ b/examples/dhtd.hs
@@ -8,6 +8,7 @@
8{-# LANGUAGE NondecreasingIndentation #-} 8{-# LANGUAGE NondecreasingIndentation #-}
9{-# LANGUAGE OverloadedStrings #-} 9{-# LANGUAGE OverloadedStrings #-}
10{-# LANGUAGE PartialTypeSignatures #-} 10{-# LANGUAGE PartialTypeSignatures #-}
11{-# LANGUAGE PatternSynonyms #-}
11{-# LANGUAGE RankNTypes #-} 12{-# LANGUAGE RankNTypes #-}
12{-# LANGUAGE RecordWildCards #-} 13{-# LANGUAGE RecordWildCards #-}
13{-# LANGUAGE ScopedTypeVariables #-} 14{-# LANGUAGE ScopedTypeVariables #-}
@@ -59,6 +60,10 @@ import System.IO.Error
59import qualified Data.Serialize as S 60import qualified Data.Serialize as S
60import Network.BitTorrent.DHT.ContactInfo as Peers 61import Network.BitTorrent.DHT.ContactInfo as Peers
61import qualified Data.MinMaxPSQ as MM 62import qualified Data.MinMaxPSQ as MM
63import Data.Wrapper.PSQ as PSQ (pattern (:->))
64import qualified Data.Wrapper.PSQ as PSQ
65import Data.Ord
66import Data.Time.Clock.POSIX
62 67
63showReport :: [(String,String)] -> String 68showReport :: [(String,String)] -> String
64showReport kvs = showColumns $ map (\(x,y)->[x,y]) kvs 69showReport kvs = showColumns $ map (\(x,y)->[x,y]) kvs
@@ -260,6 +265,7 @@ data Session = Session
260 , dhts :: Map.Map String DHT 265 , dhts :: Map.Map String DHT
261 , externalAddresses :: IO [SockAddr] 266 , externalAddresses :: IO [SockAddr]
262 , swarms :: Mainline.SwarmsDatabase 267 , swarms :: Mainline.SwarmsDatabase
268 , toxkeys :: TVar Tox.AnnouncedKeys
263 , signalQuit :: MVar () 269 , signalQuit :: MVar ()
264 } 270 }
265 271
@@ -436,6 +442,13 @@ clientSession s@Session{..} sock cnum h = do
436 ps <- atomically $ Peers.lookup ih <$> readTVar (Mainline.contactInfo swarms) 442 ps <- atomically $ Peers.lookup ih <$> readTVar (Mainline.contactInfo swarms)
437 hPutClient h $ showReport $ map (((,) "") . show . pPrint) ps 443 hPutClient h $ showReport $ map (((,) "") . show . pPrint) ps
438 Left er -> hPutClient h er 444 Left er -> hPutClient h er
445 ("keys", s) -> cmd0 $ do
446 keydb <- atomically $ readTVar toxkeys
447 now <- getPOSIXTime
448 let entries = map mkentry $ PSQ.toList (Tox.keyByAge keydb)
449 mkentry (k :-> Down tm) = [ show cnt, show k, show (now - tm) ]
450 where Just (_,(cnt,_)) = MM.lookup' k (Tox.keyAssoc keydb)
451 hPutClient h $ showColumns entries
439 452
440 (n, _) | n `elem` Map.keys dhts -> switchNetwork n 453 (n, _) | n `elem` Map.keys dhts -> switchNetwork n
441 454
@@ -473,7 +486,7 @@ main = do
473 486
474 let toxport = succ $ fromMaybe 33445 (fromIntegral <$> sockAddrPort addr) 487 let toxport = succ $ fromMaybe 33445 (fromIntegral <$> sockAddrPort addr)
475 addrTox <- getBindAddress (show toxport) True 488 addrTox <- getBindAddress (show toxport) True
476 (tox,toxR) <- Tox.newClient addrTox 489 (tox,toxR,toxkeys) <- Tox.newClient addrTox
477 490
478 quitTox <- forkListener (clientNet tox) 491 quitTox <- forkListener (clientNet tox)
479 492
@@ -529,6 +542,7 @@ main = do
529 , dhts = dhts -- all DHTs 542 , dhts = dhts -- all DHTs
530 , signalQuit = signalQuit 543 , signalQuit = signalQuit
531 , swarms = swarms 544 , swarms = swarms
545 , toxkeys = toxkeys
532 , externalAddresses = readExternals 546 , externalAddresses = readExternals
533 [ Mainline.routing4 btR 547 [ Mainline.routing4 btR
534 , Mainline.routing6 btR 548 , Mainline.routing6 btR