Add [X]HTML5 DTD to header
[hcoop/portal.git] / mailman / portalsub.sml
1 fun isMember (list, addr) =
2 let
3 val proc = Unix.execute ("/usr/sbin/find_member", ["-l", list, addr])
4 in
5 (case TextIO.inputLine (Unix.textInstreamOf proc) of
6 NONE => false
7 | _ => true)
8 before ignore (Unix.reap proc)
9 end
10
11 fun isIdent ch = Char.isLower ch orelse Char.isDigit ch
12
13 fun validHost s =
14 size s > 0 andalso size s < 20 andalso List.all isIdent (String.explode s)
15
16 fun validDomain s =
17 size s > 0 andalso size s < 100 andalso List.all validHost (String.fields (fn ch => ch = #".") s)
18
19 fun validEmailUser s =
20 size s > 0 andalso size s < 50 andalso List.all
21 (fn ch => Char.isAlphaNum ch orelse ch = #"." orelse ch = #"_" orelse ch = #"-" orelse ch = #"+")
22 (String.explode s)
23
24 fun validEmail s =
25 (case String.fields (fn ch => ch = #"@") s of
26 [user, host] => validEmailUser user andalso validDomain host
27 | _ => false)
28
29 fun main () =
30 case CommandLine.arguments () of
31 [list, cmd, addr] =>
32 if list <> "hcoop-discuss" andalso list <> "hcoop-help" andalso list <> "hcoop-misc"
33 andalso list <> "hcoop-announce" andalso list <> "hcoop-sysadmin" then
34 (print "Bad mailing list name\n";
35 OS.Process.failure)
36 else if not (validEmail addr) then
37 (print "Invalid e-mail address\n";
38 OS.Process.failure)
39 else (case cmd of
40 "check" =>
41 if isMember (list, addr) then
42 OS.Process.success
43 else
44 OS.Process.failure
45 | "add" =>
46 if isMember (list, addr) then
47 OS.Process.success
48 else
49 OS.Process.system (String.concat ["echo ", addr, " | /usr/sbin/add_members -r - ", list])
50 | "rm" =>
51 if list = "hcoop-announce" then
52 (print "You can't remove anyone from hcoop-announce.\n";
53 OS.Process.failure)
54 else if isMember (list, addr) then
55 OS.Process.system (String.concat ["/usr/sbin/remove_members ", list, " ", addr])
56 else
57 OS.Process.success
58 | _ => (print ("Invalid command " ^ cmd ^ "\n");
59 OS.Process.failure))
60 | _ => (print "Bad command-line arguments\n";
61 OS.Process.failure)
62
63 val _ = OS.Process.exit (main ())