+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 =
+ let
+ val (pref, suf) = Substring.splitl (fn ch => ch <> #".") (Substring.full s)
+ in
+ print ("pref[" ^ Substring.string pref ^ "] suf[" ^ Substring.string suf ^ "]\n");
+ Substring.size suf > 0
+ andalso validHost (Substring.string pref)
+ andalso yourDomain (Substring.string
+ (Substring.slice (suf, 1, NONE)))
+ end
+
+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"))
+