]> www.average.org Git - pdns-pipe-nmc.git/blobdiff - NmcJson.hs
domain normalization
[pdns-pipe-nmc.git] / NmcJson.hs
index b7449297d3796aca706f78a645b0e49fba28f987..f7733669e33b08f0ac8bd341d7702dee249d3699 100644 (file)
@@ -1,11 +1,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 
 module NmcJson  ( NmcRes(..)
-                , NmcDom
+                , NmcDom(..)
+                , emptyNmcDom
+                , descendNmc
                 ) where
 
 import Data.ByteString.Lazy (ByteString)
-import Data.Map (Map)
+import Data.Map as M (Map, lookup)
 import Control.Applicative ((<$>), (<*>), empty)
 import Data.Aeson
 
@@ -16,7 +18,7 @@ data NmcRRService = NmcRRService -- unused
                         , srvW2         :: Int
                         , srvPort       :: Int
                         , srvHost       :: [String]
-                        } deriving (Show)
+                        } deriving (Show, Eq)
 
 instance FromJSON NmcRRService where
         parseJSON (Object o) = NmcRRService
@@ -28,11 +30,11 @@ instance FromJSON NmcRRService where
                 <*> o .: "host"
         parseJSON _ = empty
 
-data NmcRRI2p = NmcRRI2p -- unused
+data NmcRRI2p = NmcRRI2p
                         { i2pDestination :: String
                         , i2pName        :: String
                         , i2pB32         :: String
-                        } deriving (Show)
+                        } deriving (Show, Eq)
 
 instance FromJSON NmcRRI2p where
         parseJSON (Object o) = NmcRRI2p
@@ -60,7 +62,7 @@ data NmcDom = NmcDom    { domService     :: Maybe [[String]] -- [NmcRRService]
                         , domTls         :: Maybe (Map String
                                                     (Map String [[String]]))
                         , domDs          :: Maybe [[String]]
-                        } deriving (Show)
+                        } deriving (Show, Eq)
 
 instance FromJSON NmcDom where
         parseJSON (Object o) = NmcDom
@@ -84,8 +86,12 @@ instance FromJSON NmcDom where
                 <*> o .:? "ds"
         parseJSON _ = empty
 
+emptyNmcDom = NmcDom Nothing Nothing Nothing Nothing Nothing Nothing
+                     Nothing Nothing Nothing Nothing Nothing Nothing
+                     Nothing Nothing Nothing Nothing Nothing Nothing
+
 data NmcRes = NmcRes    { resName       :: String
-                        , resValue      :: ByteString -- NmcDom
+                        , resValue      :: ByteString -- string with NmcDom
                         , resTxid       :: String
                         , resAddress    :: String
                         , resExpires_in :: Int
@@ -99,13 +105,54 @@ instance FromJSON NmcRes where
                 <*> o .: "expires_in"
         parseJSON _ = empty
 
-main = do
-  let l = "{\"name\":\"d/dot-bit\",\"value\":\"{\\\"info\\\":{\\\"description\\\":\\\"Dot-BIT Project - Official Website\\\",\\\"registrar\\\":\\\"http://register.dot-bit.org\\\"},\\\"fingerprint\\\":[\\\"30:B0:60:94:32:08:EC:F5:BE:DF:F4:BB:EE:52:90:2C:5D:47:62:46\\\"],\\\"ns\\\":[\\\"ns0.web-sweet-web.net\\\",\\\"ns1.web-sweet-web.net\\\"],\\\"map\\\":{\\\"\\\":{\\\"ns\\\":[\\\"ns0.web-sweet-web.net\\\",\\\"ns1.web-sweet-web.net\\\"]}},\\\"email\\\":\\\"register@dot-bit.org\\\"}\",\"txid\":\"7412603f2e6c3459be56accc6e1f3646b603f3d4a4188119a4072f125c1340d5\",\"address\":\"Mw3KCQcqC44nm75w7r79ZifZbEqT8RetWn\",\"expires_in\":18915}"
-  let r = decode l :: Maybe NmcRes
-  case r of
-    Just resp -> do
-      let value = (resValue resp)
-      let dom = decode value :: Maybe NmcDom
-      print dom
-    Nothing   ->
-      print "Unparseable NMC response"
+normalizeDom :: NmcDom -> NmcDom
+normalizeDom dom
+  | domNs        dom /= Nothing = emptyNmcDom { domNs = domNs dom }
+  | domDelegate  dom /= Nothing = emptyNmcDom -- FIXME
+  | domTranslate dom /= Nothing = dom { domMap = Nothing }
+  | otherwise                   = dom
+
+descendNmc :: [String] -> NmcDom -> NmcDom
+descendNmc subdom rawdom =
+  let dom = normalizeDom rawdom
+  in case subdom of
+    []   ->
+      case domMap dom of
+        Nothing  -> dom
+        Just map ->
+          case M.lookup "" map of         -- Stupid, but there are "" in the map
+            Nothing  -> dom               -- Try to merge it with the root data
+            Just sub -> mergeNmc sub dom  -- Or maybe drop it altogether...
+    d:ds ->
+      case domMap dom of
+        Nothing  -> emptyNmcDom
+        Just map ->
+          case M.lookup d map of
+            Nothing  -> emptyNmcDom
+            Just sub -> descendNmc ds sub
+
+-- FIXME -- I hope there exists a better way to merge records!
+mergeNmc :: NmcDom -> NmcDom -> NmcDom
+mergeNmc sub dom = dom  { domService = choose dom domService sub
+                        , domIp = choose dom domIp sub
+                        , domIp6 = choose dom domIp6 sub
+                        , domTor = choose dom domTor sub
+                        , domI2p = choose dom domI2p sub
+                        , domFreenet = choose dom domFreenet sub
+                        , domAlias = choose dom domAlias sub
+                        , domTranslate = choose dom domTranslate sub
+                        , domEmail = choose dom domEmail sub
+                        , domLoc = choose dom domLoc sub
+                        , domInfo = choose dom domInfo sub
+                        , domNs = choose dom domNs sub
+                        , domDelegate = choose dom domDelegate sub
+                        , domImport = choose dom domImport sub
+                        , domFingerprint = choose dom domFingerprint sub
+                        , domTls = choose dom domTls sub
+                        , domDs = choose dom domDs sub
+                        }
+  where
+    choose :: NmcDom -> (NmcDom -> Maybe a) -> NmcDom -> Maybe a
+    choose sub t dom = case t dom of
+      Nothing -> t sub
+      Just x  -> Just x