Add length (max 255) checking for domains.
authorMichael Orlitzky <michael@orlitzky.com>
Tue, 7 Jul 2015 23:02:03 +0000 (19:02 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Tue, 7 Jul 2015 23:02:03 +0000 (19:02 -0400)
doc/TODO
src/Domain.hs

index 8493092d358edc3d4bf93f592fb23b40abec8231..0e56c5fe79e789730032c8f1bdfee24fe5c48709 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,2 +1 @@
 1. Add no-equal-brothers restriction for subdomains (RFC1034).
-2. Add 255 max check for domains.
index 446a8a63409a8ca9a7e6f7dd48877f4de40426ab..f19b11115989822dcde6303565708a083bc4d1b7 100644 (file)
@@ -5,6 +5,13 @@
 --
 --     <https://tools.ietf.org/html/rfc1035#section-2.3.1>
 --
+--   We basically work with strings and characters everywhere, even
+--   though this isn't really correct. The length specifications in
+--   the RFCs are all in terms of octets, so really a ByteString.Char8
+--   would be more appropriate. With strings, for example, we could
+--   have a unicode mumbo jumbo character that takes up two bytes
+--   (octets).
+--
 module Domain (
   UserDomain,
   user_domain )
@@ -567,10 +574,34 @@ instance Pretty Domain where
 --   >>> parseTest domain "."
 --   DomainRoot
 --
+--   Anything over 255 characters is an error, so the root will be
+--   parsed:
+--
+--   >>> let big_label = replicate 63 'x'
+--   >>> let big_subdomain = concat $ replicate 5 (big_label ++ ".")
+--   >>> parseTest domain big_subdomain
+--   DomainRoot
+--
+--   But exactly 255 is allowed:
+--
+--   >>> import Data.List ( intercalate )
+--   >>> let big_label = replicate 63 'x'
+--   >>> let big_subdomain = intercalate "." (replicate 4 big_label)
+--   >>> let (Right r) = parse domain "" big_subdomain
+--   >>> length (pretty_show r)
+--   255
+--
 domain :: Parser Domain
 domain = try parse_subdomain <|> parse_empty
   where
-    parse_subdomain = fmap DomainName subdomain
+    parse_subdomain :: Parser Domain
+    parse_subdomain = do
+      s <- subdomain
+      if (length $ pretty_show s) <= 255
+      then return $ DomainName s
+      else fail "subdomains can be at most 255 characters"
+
+    parse_empty :: Parser Domain
     parse_empty = string "" >> return DomainRoot