prevent import loops
authorEugene Crosser <crosser@average.org>
Sun, 13 Apr 2014 16:48:35 +0000 (20:48 +0400)
committerEugene Crosser <crosser@average.org>
Sun, 13 Apr 2014 16:48:35 +0000 (20:48 +0400)
NmcDom.hs
PowerDns.hs
d/extra2

index fe87270c728d31a51064c35c50742ec69e8d3b48..6594b7d3776f76a95ef58b67913f3fdcbbf6010c 100644 (file)
--- a/NmcDom.hs
+++ b/NmcDom.hs
@@ -186,20 +186,22 @@ queryNmcDom queryOp key = do
 --   imported objects are processed recursively until there are none.
 mergeImport ::
   (String -> IO (Either String ByteString)) -- ^ query operation action
+  -> Int                                    -- ^ recursion counter
   -> NmcDom                                 -- ^ base domain
   -> IO (Either String NmcDom)              -- ^ result with merged import
-mergeImport queryOp base = do
+mergeImport queryOp depth base = do
   let
     mbase = mergeSelf base
     base' = mbase {domImport = Nothing}
   -- print base
-  case domImport mbase of
+  if depth <= 0 then return $ Left "Nesting of imports is too deep"
+  else case domImport mbase of
     Nothing  -> return $ Right base'
     Just key -> do
       sub <- queryNmcDom queryOp key
       case sub of
         Left  e    -> return $ Left e
-        Right sub' -> mergeImport queryOp $ sub' `merge` base'
+        Right sub' -> mergeImport queryOp (depth - 1) $ sub' `merge` base'
 
 -- | If there is an element in the map with key "", merge the contents
 --   and remove this element. Do this recursively.
@@ -218,6 +220,7 @@ mergeSelf base =
         case M.lookup "" map' of
           Nothing  -> base'
           Just sub -> (mergeSelf sub) `merge` base'
+        -- recursion depth limited by the size of the record
 
 -- | Presence of some elements require removal of some others
 normalizeDom :: NmcDom -> NmcDom
@@ -239,7 +242,7 @@ descendNmcDom ::
   -> NmcDom                                 -- ^ base domain
   -> IO (Either String NmcDom)              -- ^ fully processed result
 descendNmcDom queryOp subdom base = do
-  base' <- mergeImport queryOp base
+  base' <- mergeImport queryOp 10 base
   case subdom of
     []   -> return $ fmap normalizeDom base'
     d:ds ->
index e225b6229646902758e4d3e2fede5d59c28c85a3..7e2d9cc8d440a5dcdd8adf4708e6b415ab1b76c7 100644 (file)
@@ -71,7 +71,7 @@ pdnsReport err =
 pdnsOut :: Int -> String -> String -> RRType -> Either String NmcDom -> String
 pdnsOut ver id name rrtype edom =
   case edom of
-    Left  err -> pdnsReport err
+    Left  err -> pdnsReport $ err ++ " in a query for " ++ name
     Right dom -> foldr addLine "END\n" $ nmc2pdns name rrtype dom
       where
         addLine (nm, ty, dt) accum =
index c89910506ebaa1c6a5f571d9c861b0506fa77d1c..2978b78e771ee773046f65c09e3995acb9e8b004 100644 (file)
--- a/d/extra2
+++ b/d/extra2
@@ -1 +1 @@
-{"ip":["5.6.7.8"],"alias":"extra2alias","service":[["imap", "tcp", 0, 0, 143, "mail.host.com."]]}
+{"import":"d/extra1","ip":["5.6.7.8"],"alias":"extra2alias","service":[["imap", "tcp", 0, 0, 143, "mail.host.com."]]}