+fun validNode s = List.exists (fn s' => s = s') nodes
+
+fun yourDomain s = SS.member (your_domains (), s)
+fun yourUser s = SS.member (your_users (), s)
+fun yourGroup s = SS.member (your_groups (), s)
+fun yourPath path =
+ List.all (fn s => s <> "..") (String.fields (fn ch => ch = #"/") path)
+ andalso CharVector.all (fn ch => Char.isAlphaNum ch orelse ch = #"." orelse ch = #"/"
+ orelse ch = #"-" orelse ch = #"_") path
+ andalso SS.exists (fn s' => path = s' orelse String.isPrefix (s' ^ "/") path) (your_paths ())
+
+fun yourDomainHost s =
+ yourDomain s
+ orelse let
+ val (pref, suf) = Substring.splitl (fn ch => ch <> #".") (Substring.full s)
+ in
+ Substring.size suf > 0
+ andalso validHost (Substring.string pref)
+ andalso yourDomain (Substring.string
+ (Substring.slice (suf, 1, NONE)))
+ end
+
+fun validUser s = size s > 0 andalso size s < 20
+ andalso CharVector.all Char.isAlphaNum s
+
+val validGroup = validUser
+
+val _ = Env.type_one "no_spaces"
+ Env.string
+ (CharVector.all (fn ch => not (Char.isSpace ch)))
+val _ = Env.type_one "no_newlines"
+ Env.string
+ (CharVector.all (fn ch => ch <> #"\n" andalso ch <> #"\r"))
+