Printing mailbox locations for vmail list
authorAdam Chlipala <adamc@hcoop.net>
Sat, 23 Dec 2006 21:50:40 +0000 (21:50 +0000)
committerAdam Chlipala <adamc@hcoop.net>
Sat, 23 Dec 2006 21:50:40 +0000 (21:50 +0000)
src/mail/vmail.sig
src/mail/vmail.sml
src/main-vmail.sml
src/msg.sml
src/msgTypes.sml

index a70e525..4804911 100644 (file)
@@ -24,7 +24,7 @@ signature VMAIL = sig
 
     datatype listing =
             Error of string
 
     datatype listing =
             Error of string
-          | Listing of string list
+          | Listing of {user : string, mailbox : string} list
 
     val list : string -> listing
 
 
     val list : string -> listing
 
index 5801cb9..39566dd 100644 (file)
@@ -24,7 +24,7 @@ fun rebuild () = Slave.shell [Config.Courier.postReload]
 
 datatype listing =
         Error of string
 
 datatype listing =
         Error of string
-       | Listing of string list
+       | Listing of {user : string, mailbox : string} list
 
 fun list domain =
     let
 
 fun list domain =
     let
@@ -36,9 +36,18 @@ fun list domain =
                NONE => Listing (rev users)
              | SOME line =>
                case String.tokens Char.isSpace line of
                NONE => Listing (rev users)
              | SOME line =>
                case String.tokens Char.isSpace line of
-                   [addr, _] =>
+                   [addr, fields] =>
                    (case String.fields (fn ch => ch = #"@") addr of
                    (case String.fields (fn ch => ch = #"@") addr of
-                        [user, _] => loop (user :: users)
+                        [user, _] =>
+                        let
+                            fun parseFields fields =
+                                case fields of
+                                    "mail" :: mailbox :: _ => loop ({user = user, mailbox = mailbox} :: users)
+                                  | _ :: _ :: rest => parseFields rest
+                                  | _ => Error "Invalid fields in database"
+                        in
+                            parseFields (String.fields (fn ch => ch = #"|" orelse ch = #"=") fields)
+                        end
                       | _ => Error "Invalid e-mail address format in database")
                  | _ => Error "Invalid entry in database"
     in
                       | _ => Error "Invalid e-mail address format in database")
                  | _ => Error "Invalid entry in database"
     in
index 05cb86f..8acb845 100644 (file)
@@ -27,8 +27,10 @@ val _ =
            (case Main.requestListMailboxes domain of
                 Vmail.Error msg => (print msg;
                                     print "\n")
            (case Main.requestListMailboxes domain of
                 Vmail.Error msg => (print msg;
                                     print "\n")
-              | Vmail.Listing users => app (fn user => (print user;
-                                                        print "\n")) users)
+              | Vmail.Listing users => app (fn {user, mailbox} => (print user;
+                                                                   print "\t";
+                                                                   print mailbox;
+                                                                   print "\n")) users)
 
          | ["add", user, mailbox] =>
            (case Client.getpass () of
 
          | ["add", user, mailbox] =>
            (case Client.getpass () of
index 6fdda0a..747572a 100644 (file)
@@ -139,7 +139,10 @@ fun send (bio, m) =
         OpenSSL.writeString (bio, domain))
       | MsgMailboxes users =>
        (OpenSSL.writeInt (bio, 22);
         OpenSSL.writeString (bio, domain))
       | MsgMailboxes users =>
        (OpenSSL.writeInt (bio, 22);
-        sendList OpenSSL.writeString (bio, users))
+        sendList (fn (bio, {user, mailbox}) =>
+                           (OpenSSL.writeString (bio, user);
+                            OpenSSL.writeString (bio, mailbox)))
+        (bio, users))
 
 fun checkIt v =
     case v of
 
 fun checkIt v =
     case v of
@@ -215,7 +218,14 @@ fun recv bio =
                                SOME (MsgRmMailbox {domain = domain, user = user})
                              | _ => NONE)
                   | 21 => Option.map MsgListMailboxes (OpenSSL.readString bio)
                                SOME (MsgRmMailbox {domain = domain, user = user})
                              | _ => NONE)
                   | 21 => Option.map MsgListMailboxes (OpenSSL.readString bio)
-                  | 22 => Option.map MsgMailboxes (recvList OpenSSL.readString bio)
+                  | 22 => Option.map MsgMailboxes (recvList
+                                                       (fn bio =>
+                                                           case (OpenSSL.readString bio,
+                                                                 OpenSSL.readString bio) of
+                                                               (SOME user, SOME mailbox) =>
+                                                               SOME {user = user, mailbox = mailbox}
+                                                             | _ => NONE)
+                                                       bio)
                   | _ => NONE)
         
 end
                   | _ => NONE)
         
 end
index cc792ff..3d5997d 100644 (file)
@@ -67,7 +67,7 @@ datatype msg =
        (* Remove a vmail mapping *)
        | MsgListMailboxes of string
        (* List all mailboxes for a domain *)
        (* Remove a vmail mapping *)
        | MsgListMailboxes of string
        (* List all mailboxes for a domain *)
-       | MsgMailboxes of string list
+       | MsgMailboxes of {user : string, mailbox : string} list
        (* Reply to MsgListMailboxes *)
 
 end
        (* Reply to MsgListMailboxes *)
 
 end