diff options
-rw-r--r-- | Tox.hs | 62 | ||||
-rw-r--r-- | ToxMessage.hs | 32 | ||||
-rw-r--r-- | examples/dhtd.hs | 16 |
3 files changed, 86 insertions, 24 deletions
@@ -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. | ||
464 | passThroughAssymetric :: Tox.PacketKind -> Tox.PubKey -> Tox.Assymetric -> Either String Msg | ||
465 | passThroughAssymetric 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 | {- |
463 | decryptUnclm :: SecretKey -> Tox.PacketKind -> NodeId -> Tox.Nonce8 -> Tox.UnclaimedAssymetric -> Either String Msg | 474 | decryptUnclm :: SecretKey -> Tox.PacketKind -> NodeId -> Tox.Nonce8 -> Tox.UnclaimedAssymetric -> Either String Msg |
464 | decryptUnclm sk typ sender n8 unclm | 475 | decryptUnclm 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 | ||
570 | data InterediateRep = Assym Tox.Assymetric | 582 | data 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 | ||
574 | asymLayer :: Transport String SockAddr Tox.Packet -> Transport String ToxPath (Tox.PacketKind,InterediateRep) | 588 | asymLayer :: Transport String SockAddr Tox.Packet -> Transport String ToxPath (Tox.PacketKind,InterediateRep) |
575 | asymLayer = layerTransport parse (\p@(typ,_) -> trace ("SERIALIZE "++show typ) $ serialize p) | 589 | asymLayer = 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 | ||
601 | toxLayer :: Transport String SockAddr ByteString -> Transport String SockAddr Tox.Packet | 620 | toxLayer :: 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 | ||
633 | newClient :: SockAddr -> IO (ToxClient, Routing) | 654 | newClient :: SockAddr -> IO (ToxClient, Routing, TVar AnnouncedKeys) |
634 | newClient addr = do | 655 | newClient 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 | ||
769 | toxKademlia :: ToxClient -> TriadCommittee NodeId SockAddr -> TVar (R.BucketList NodeInfo) -> TVar (Int.PSQ POSIXTime) -> Kademlia NodeId NodeInfo | 792 | toxKademlia :: ToxClient -> TriadCommittee NodeId SockAddr -> TVar (R.BucketList NodeInfo) -> TVar (Int.PSQ POSIXTime) -> Kademlia NodeId NodeInfo |
770 | toxKademlia client committee var sched | 793 | toxKademlia 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 | |||
1180 | dataToRouteH :: TVar AnnouncedKeys -> Transport err ToxPath (Tox.PacketKind,InterediateRep) -> addr -> (Tox.PubKey,Assymetric) -> IO () | ||
1181 | dataToRouteH 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 | ||
1333 | data AnnouncedKeys = AnnouncedKeys | 1371 | data 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 | ||
1338 | insertKey :: POSIXTime -> Tox.PubKey -> ToxPath -> NodeDistance -> AnnouncedKeys -> AnnouncedKeys | 1376 | insertKey :: POSIXTime -> Tox.PubKey -> ToxPath -> NodeDistance -> AnnouncedKeys -> AnnouncedKeys |
1339 | insertKey tm pub toxpath d keydb = AnnouncedKeys | 1377 | insertKey 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 | |||
256 | pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2 | 248 | pattern OnionRequest2Type = PacketKind 130 -- 0x82 Onion Request 2 |
257 | pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request | 249 | pattern AnnounceType = PacketKind 131 -- 0x83 Announce Request |
258 | pattern AnnounceResponseType = PacketKind 132 -- 0x84 Announce Response | 250 | pattern 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) | 252 | pattern DataRequestType = PacketKind 133 -- 0x85 Onion Data Request (data to route request packet) |
253 | pattern 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 |
263 | pattern OnionResponse3Type = PacketKind 140 -- 0x8c Onion Response 3 | 256 | pattern 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 | ||
297 | pktKind :: Packet -> PacketKind | 293 | pktKind :: Packet -> PacketKind |
@@ -356,6 +352,7 @@ pktKind OnionResponse3 {} = PacketKind 0x8c | |||
356 | data PacketClass = | 352 | data 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 | ||
384 | pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a) | 381 | pktClass (PacketKind 0x18) = AssymetricClass CookieRequest (\(CookieRequest a) -> a) |
385 | pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a) | 382 | pktClass (PacketKind 0x80) = AssymetricClass OnionRequest0 (\(OnionRequest0 a) -> a) |
386 | -- pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a) | 383 | pktClass (PacketKind 0x86) = AssymetricClass (DataToRouteResponse . Aliased) (\(DataToRouteResponse (Aliased a)) -> a) |
387 | 384 | ||
388 | pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r)) | 385 | pktClass (PacketKind 0x83) = AliasedClass (uncurry Announce) (\(Announce a r)-> (a,r)) |
389 | pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl)) | 386 | pktClass (PacketKind 0x84) = NoncedUnclaimedClass AnnounceResponse (\(AnnounceResponse n8 uncl)-> (n8,uncl)) |
390 | 387 | ||
391 | pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r)) | 388 | pktClass (PacketKind 0x8c) = OnionClass (uncurry OnionResponse3 . swap) (\(OnionResponse3 r a)-> (a,r)) |
392 | 389 | ||
390 | pktClass DataRequestType = ToRouteClass (\(k,(a,r))-> DataToRoute k a r) | ||
391 | (\(DataToRoute k a r) -> (k,(a,r))) | ||
392 | |||
393 | pktClass _ = Unclassified | 393 | pktClass _ = 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 | |||
59 | import qualified Data.Serialize as S | 60 | import qualified Data.Serialize as S |
60 | import Network.BitTorrent.DHT.ContactInfo as Peers | 61 | import Network.BitTorrent.DHT.ContactInfo as Peers |
61 | import qualified Data.MinMaxPSQ as MM | 62 | import qualified Data.MinMaxPSQ as MM |
63 | import Data.Wrapper.PSQ as PSQ (pattern (:->)) | ||
64 | import qualified Data.Wrapper.PSQ as PSQ | ||
65 | import Data.Ord | ||
66 | import Data.Time.Clock.POSIX | ||
62 | 67 | ||
63 | showReport :: [(String,String)] -> String | 68 | showReport :: [(String,String)] -> String |
64 | showReport kvs = showColumns $ map (\(x,y)->[x,y]) kvs | 69 | showReport 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 |