X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/d936cf4d0b120b88f99c10dee5556d0ca7320324..06bd821502f57dcb4ef89295b221fc2b9a4f1ae3:/src/domain.sml diff --git a/src/domain.sml b/src/domain.sml index 0b3a0f5..d1046b7 100644 --- a/src/domain.sml +++ b/src/domain.sml @@ -80,14 +80,44 @@ fun validIp s = n1 >= 0 andalso n1 < 256 andalso n2 >= 0 andalso n2 < 256 andalso n3 >= 0 andalso n3 < 256 andalso n4 >= 0 andalso n4 < 256 | _ => false +fun isHexDigit ch = Char.isDigit ch orelse (ord ch >= ord #"a" andalso ord ch <= ord #"f") + +fun validIpv6 s = + let + val fields = String.fields (fn ch => ch = #":") s + + val empties = foldl (fn ("", n) => n + 1 + | (_, n) => n) 0 fields + + fun noIpv4 maxLen = + length fields >= 2 + andalso length fields <= maxLen + andalso empties <= 1 + andalso List.all (fn "" => true + | s => size s <= 4 + andalso CharVector.all isHexDigit s) fields + + fun hasIpv4 () = + length fields > 0 + andalso + let + val maybeIpv4 = List.last fields + val theRest = List.take (fields, length fields - 1) + in + validIp maybeIpv4 andalso noIpv4 6 + end + in + noIpv4 8 orelse hasIpv4 () + end + fun isIdent ch = Char.isLower ch orelse Char.isDigit ch fun validHost s = - size s > 0 andalso size s < 20 + size s > 0 andalso size s < 50 andalso CharVector.all (fn ch => isIdent ch orelse ch = #"-") s fun validDomain s = - size s > 0 andalso size s < 100 + size s > 0 andalso size s < 200 andalso List.all validHost (String.fields (fn ch => ch = #".") s) fun validNode s = List.exists (fn s' => s = s') nodes @@ -137,12 +167,16 @@ val _ = Env.type_one "no_spaces" val _ = Env.type_one "no_newlines" Env.string (CharVector.all (fn ch => Char.isPrint ch andalso ch <> #"\n" andalso ch <> #"\r" - andalso ch <> #"\"" andalso ch <> #"'")) + andalso ch <> #"\"")) val _ = Env.type_one "ip" Env.string validIp +val _ = Env.type_one "ipv6" + Env.string + validIpv6 + val _ = Env.type_one "host" Env.string validHost @@ -202,10 +236,22 @@ val _ = Env.registerFunction ("dns_node_to_node", val _ = Env.registerFunction ("mail_node_to_node", fn [e] => SOME e | _ => NONE) + + open Ast val dl = ErrorMsg.dummyLoc +val _ = Env.registerFunction ("end_in_slash", + fn [(EString "", _)] => SOME (EString "/", dl) + | [(EString s, _)] => + SOME (EString (if String.sub (s, size s - 1) = #"/" then + s + else + s ^ "/"), dl) + | _ => NONE) + + val nsD = (EString Config.defaultNs, dl) val serialD = (EVar "serialAuto", dl) val refD = (EInt Config.defaultRefresh, dl) @@ -599,7 +645,10 @@ val _ = Env.containerV_one "domain" write "\t};\n") | _ => (write "\tmasters { "; write masterIp; - write "; };\n"); + write "; };\n"; + write "// Updated: "; + write (Time.toString (Time.now ())); + write "\n"); write "};\n"; close () end @@ -650,10 +699,10 @@ fun handleSite (site, files) = if site = Config.defaultNode then Slave.handleChanges files else let - val bio = OpenSSL.connect (valOf (!ssl_context), - nodeIp site - ^ ":" - ^ Int.toString Config.slavePort) + val bio = OpenSSL.connect true (valOf (!ssl_context), + nodeIp site + ^ ":" + ^ Int.toString Config.slavePort) in app (fn file => Msg.send (bio, MsgFile file)) files; Msg.send (bio, MsgDoFiles);