summaryrefslogtreecommitdiff
path: root/src/Network/Tox/NodeId.hs
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2018-05-20 22:17:44 -0400
committerjoe <joe@jerkface.net>2018-05-20 22:17:44 -0400
commit1661192a9c84ceaad6d372bd80820a7066fa1e10 (patch)
tree940dadd1b7dde155e4ed861cb00ea046f9ea0d3f /src/Network/Tox/NodeId.hs
parentd1ce5a1dad8faca6cab13ca4c2612c1208d52850 (diff)
Allow non-JID (standard tox hex) input for NoSpamId.
Diffstat (limited to 'src/Network/Tox/NodeId.hs')
-rw-r--r--src/Network/Tox/NodeId.hs16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/Network/Tox/NodeId.hs b/src/Network/Tox/NodeId.hs
index b12487a4..2f3a2bb1 100644
--- a/src/Network/Tox/NodeId.hs
+++ b/src/Network/Tox/NodeId.hs
@@ -493,6 +493,7 @@ instance OnionPacket 3 where mkOnion = OnionResponse3
493data NoSpam = NoSpam !Word32 !(Maybe Word16) 493data NoSpam = NoSpam !Word32 !(Maybe Word16)
494 deriving (Eq,Ord,Show) 494 deriving (Eq,Ord,Show)
495 495
496-- Utilizes Data.Serialize format for Word32 nospam and Word16 checksum.
496instance Read NoSpam where 497instance Read NoSpam where
497 readsPrec d s = case break isSpace s of 498 readsPrec d s = case break isSpace s of
498 ('$':ws ,rs) | (length ws == 8) -> base64decode rs (NoSpam <$> get <*> (Just <$> get)) ws 499 ('$':ws ,rs) | (length ws == 8) -> base64decode rs (NoSpam <$> get <*> (Just <$> get)) ws
@@ -535,16 +536,25 @@ instance Read NoSpamId where
535 nsid <- parseNoSpamId $ Text.pack jid 536 nsid <- parseNoSpamId $ Text.pack jid
536 return [(nsid,xs)] 537 return [(nsid,xs)]
537 538
539parseNoSpamHex hex = Right $ NoSpamId (read $ "0x"++nospamsum) (id2key $ read hkey)
540 where
541 (hkey,nospamsum) = splitAt 64 $ Text.unpack hex
542
538parseNoSpamId :: Text -> Either String NoSpamId 543parseNoSpamId :: Text -> Either String NoSpamId
539parseNoSpamId jid = do 544parseNoSpamId spec | Text.length spec == 76
545 , Text.all isHexDigit spec = parseNoSpamHex spec
546 | otherwise = parseNoSpamJID spec
547
548parseNoSpamJID :: Text -> Either String NoSpamId
549parseNoSpamJID jid = do
540 (Just u,h,_) <- Right $ splitJID jid 550 (Just u,h,_) <- Right $ splitJID jid
541 (base64,".tox") <- Right $ splitAt 43 $ Text.unpack h 551 (base64,".tox") <- Right $ splitAt 43 $ Text.unpack h
542 pub <- id2key <$> readEither base64 552 pub <- id2key <$> readEither base64
543 let ustr = Text.unpack u 553 let ustr = Text.unpack u
544 '$' : b64digits <- Right ustr -- TODO: support 0x prefix also. 554 '$' : b64digits <- Right ustr -- TODO: support 0x prefix also.
545 NoSpam nospam (Just x) <- readEither $ map (\case; '?' -> '0'; c -> c) ustr 555 NoSpam nospam (Just x) <- readEither $ map (\case; '?' -> '0'; c -> c) ustr
546 let nlo = fromIntegral nospam :: Word16 556 let nlo = fromIntegral (0x0FFFF .&. nospam) :: Word16
547 nhi = fromIntegral (nospam `shiftR` 16) :: Word16 557 nhi = fromIntegral (0x0FFFF .&. (nospam `shiftR` 16)) :: Word16
548 sum = x `xor` nlo `xor` nhi `xor` xorsum pub 558 sum = x `xor` nlo `xor` nhi `xor` xorsum pub
549 -- Find any question mark indices. 559 -- Find any question mark indices.
550 qs = catMaybes $ zipWith (\case; '?' -> Just ; _ -> const Nothing) b64digits [0..7] 560 qs = catMaybes $ zipWith (\case; '?' -> Just ; _ -> const Nothing) b64digits [0..7]