+ OS.Process.isSuccess (Unix.reap proc)
+ end
+
+
+fun checkpassword {domain, user, passwd} =
+ let
+ val proc = Unix.execute (Config.installPrefix ^ "/sbin/domtool-vmailpasswd", [])
+ val outf = Unix.textOutstreamOf proc
+ val db = readUserdb domain
+ in
+ case SM.find (db, user) of
+ SOME fields =>
+ (case SM.find (fields, "systempw") of
+ SOME systempw =>
+ (TextIO.output (outf, systempw ^ "\n");
+ TextIO.output (outf, passwd ^ "\n");
+ TextIO.closeOut outf;
+ OS.Process.isSuccess (Unix.reap proc))
+ | NONE => raise Userdb ("systempw not found for user " ^ user ^ "@" ^ domain))
+ | NONE => raise Userdb ("User " ^ user ^ " not found in vmail userdb for domain " ^ domain)
+ end
+
+fun deluser {domain, user} =
+ Slave.run (Config.Vmail.userdb, ["-f", Config.Vmail.userDatabase ^ "/" ^ domain,
+ user ^ "@" ^ domain, "del"])
+
+fun add {domain, requester, user, passwd, mailbox} =
+ let
+ val udb = Posix.SysDB.getpwnam requester
+ val uid = SysWord.toInt (Posix.ProcEnv.uidToWord (Posix.SysDB.Passwd.uid udb))
+ val gid = SysWord.toInt (Posix.ProcEnv.gidToWord (Posix.SysDB.Passwd.gid udb))
+ val home = Posix.SysDB.Passwd.home udb
+ in
+ if mailboxExists {domain = domain, user = user} then
+ SOME "Mailbox mapping already exists"
+ else if not (Slave.run (Config.Vmail.userdb, ["-f", Config.Vmail.userDatabase ^ "/" ^ domain,
+ user ^ "@" ^ domain,
+ "set", "home=" ^ home, "mail=" ^ mailbox, "uid=" ^ Int.toString uid, "gid=" ^ Int.toString gid])) then
+ SOME "Error running userdb"
+ else if not (setpassword {domain = domain, user = user, passwd = passwd}) then
+ (ignore (deluser {domain = domain, user = user});
+ SOME "Error setting password")