summaryrefslogtreecommitdiff
path: root/dht/src/Data
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-11-28 21:10:25 -0500
committerJoe Crayne <joe@jerkface.net>2020-01-01 22:50:28 -0500
commit05f443e31b52de18e6e2dd3b7b7bd599f28e4a6f (patch)
treedb434da1f23caab25929c4c137f4af6b00e032fc /dht/src/Data
parent62be467e38b5919baeed90784ac1b62a3e256649 (diff)
Prefer IPv4 when parsing TCP nodes JSON.
Diffstat (limited to 'dht/src/Data')
-rw-r--r--dht/src/Data/Tox/Msg.hs2
-rw-r--r--dht/src/Data/Tox/Relay.hs22
2 files changed, 21 insertions, 3 deletions
diff --git a/dht/src/Data/Tox/Msg.hs b/dht/src/Data/Tox/Msg.hs
index 66ec6eb1..8819faa7 100644
--- a/dht/src/Data/Tox/Msg.hs
+++ b/dht/src/Data/Tox/Msg.hs
@@ -97,6 +97,7 @@ deriving instance (Show (Pkt a))
97 97
98type CryptoMessage = DSum Pkt Identity 98type CryptoMessage = DSum Pkt Identity
99 99
100msgID :: DSum Pkt Identity -> SomeMsg
100msgID (Pkt mid :=> Identity _) = M mid 101msgID (Pkt mid :=> Identity _) = M mid
101 102
102-- TODO 103-- TODO
@@ -227,6 +228,7 @@ fromEnum8 = fromIntegral . fromEnum
227 228
228data LossyOrLossless = Lossless | Lossy deriving (Eq,Ord,Enum,Show,Bounded) 229data LossyOrLossless = Lossless | Lossy deriving (Eq,Ord,Enum,Show,Bounded)
229 230
231someLossyness :: SomeMsg -> LossyOrLossless
230someLossyness (M m) = lossyness m 232someLossyness (M m) = lossyness m
231 233
232lossyness :: KnownNat n => Msg n t -> LossyOrLossless 234lossyness :: KnownNat n => Msg n t -> LossyOrLossless
diff --git a/dht/src/Data/Tox/Relay.hs b/dht/src/Data/Tox/Relay.hs
index c563db8d..f28a1685 100644
--- a/dht/src/Data/Tox/Relay.hs
+++ b/dht/src/Data/Tox/Relay.hs
@@ -16,7 +16,9 @@ import Data.Data
16import Data.Functor.Contravariant 16import Data.Functor.Contravariant
17import Data.Hashable 17import Data.Hashable
18import qualified Data.HashMap.Strict as HashMap 18import qualified Data.HashMap.Strict as HashMap
19import Data.List
19import Data.Monoid 20import Data.Monoid
21import Data.Ord
20import Data.Serialize 22import Data.Serialize
21import qualified Data.Vector as Vector 23import qualified Data.Vector as Vector
22import Data.Word 24import Data.Word
@@ -217,13 +219,27 @@ instance ToJSON NodeInfo where
217 tbl 219 tbl
218 x -> x -- Shouldn't happen. 220 x -> x -- Shouldn't happen.
219 221
222tcpPortScore :: Word16 -> Word16
223tcpPortScore 443 = 0
224tcpPortScore 80 = 0
225tcpPortScore 3389 = 1
226tcpPortScore _ = 2
227
220instance FromJSON NodeInfo where 228instance FromJSON NodeInfo where
221 parseJSON json = do 229 parseJSON json = do
222 udp <- parseJSON json 230 -- Instead of using ordinary parseJSON to parse the udp node,
231 -- we are using a variation that prefers IPv4 over IPv6.
232 -- The rationale is that must lans without UDP will be using
233 -- IPv4.
234 udp <- UDP.nodeInfoFromJSON True json
223 port <- case json of 235 port <- case json of
224 JSON.Object v -> do 236 JSON.Object v -> do
225 portnum:_ <- v JSON..: "tcp_ports" 237 ps <- v JSON..: "tcp_ports"
226 return (fromIntegral (portnum :: Word16)) 238 if Prelude.null (ps :: [Word16])
239 then fail "TCP.NodeInfo: missing tcp port"
240 else do
241 let portnum = minimumBy (comparing tcpPortScore) ps
242 return (fromIntegral portnum)
227 _ -> fail "TCP.NodeInfo: Expected JSON object." 243 _ -> fail "TCP.NodeInfo: Expected JSON object."
228 return $ NodeInfo udp port 244 return $ NodeInfo udp port
229 245