fun isTpe uname = inGroup (uname, "only-tpe")
+fun findFirewallRules uname =
+ let
+ val inf = TextIO.openIn "/etc/firewall/users.rules"
+
+ fun loop rules =
+ case TextIO.inputLine inf of
+ NONE => List.rev rules
+ | SOME line =>
+ if String.sub (line, 0) = #"#" then
+ loop rules
+ else case String.tokens Char.isSpace line of
+ uname'::rest =>
+ if uname = uname' then
+ loop (String.concatWith " " rest :: rules)
+ else
+ loop rules
+ | _ => loop rules
+ in
+ loop []
+ before TextIO.closeIn inf
+ end
+
+fun somethingAllowed fname uname =
+ let
+ val inf = TextIO.openIn fname
+ val uname' = uname ^ "\n"
+
+ fun loop () =
+ case TextIO.inputLine inf of
+ NONE => false
+ | SOME line => line = uname' orelse loop ()
+ in
+ loop ()
+ before TextIO.closeIn inf
+ end
+
+val cronAllowed = somethingAllowed "/etc/cron.allow"
+val ftpAllowed = somethingAllowed "/etc/ftpusers"
+
end