diff --git a/cmd/hydroxide/main.go b/cmd/hydroxide/main.go index d1dd841..92d6060 100644 --- a/cmd/hydroxide/main.go +++ b/cmd/hydroxide/main.go @@ -340,13 +340,14 @@ func main() { log.Fatal(err) } case "export-messages": - var convID string + // TODO: allow specifying multiple IDs + var convID, msgID string exportMessagesCmd.StringVar(&convID, "conversation-id", "", "conversation ID") + exportMessagesCmd.StringVar(&msgID, "message-id", "", "message ID") exportMessagesCmd.Parse(flag.Args()[1:]) username := exportMessagesCmd.Arg(0) - log.Println(convID, username) - if convID == "" || username == "" { - log.Fatal("usage: hydroxide export-messages -conversation-id ") + if (convID == "" && msgID == "") || username == "" { + log.Fatal("usage: hydroxide export-messages [-conversation-id ] [-message-id ] ") } var bridgePassword string @@ -364,8 +365,15 @@ func main() { mboxWriter := mbox.NewWriter(os.Stdout) - if err := exports.ExportConversation(c, privateKeys, mboxWriter, convID); err != nil { - log.Fatal(err) + if convID != "" { + if err := exports.ExportConversationMbox(c, privateKeys, mboxWriter, convID); err != nil { + log.Fatal(err) + } + } + if msgID != "" { + if err := exports.ExportMessageMbox(c, privateKeys, mboxWriter, msgID); err != nil { + log.Fatal(err) + } } if err := mboxWriter.Close(); err != nil { diff --git a/exports/messages.go b/exports/messages.go index 6b0f086..6e50d43 100644 --- a/exports/messages.go +++ b/exports/messages.go @@ -15,12 +15,7 @@ import ( "github.com/emersion/hydroxide/protonmail" ) -func ExportMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Writer, id string) error { - msg, err := c.GetMessage(id) - if err != nil { - return fmt.Errorf("failed to fetch message: %v", err) - } - +func writeMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Writer, msg *protonmail.Message) error { mimeType := msg.MIMEType if mimeType == "" { mimeType = "text/html" @@ -55,19 +50,37 @@ func ExportMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Write return mw.Close() } -func ExportConversation(c *protonmail.Client, privateKeys openpgp.KeyRing, mbox *mbox.Writer, id string) error { +func ExportMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Writer, id string) error { + msg, err := c.GetMessage(id) + if err != nil { + return fmt.Errorf("failed to fetch message: %v", err) + } + + return writeMessage(c, privateKeys, w, msg) +} + +func ExportMessageMbox(c *protonmail.Client, privateKeys openpgp.KeyRing, mbox *mbox.Writer, id string) error { + msg, err := c.GetMessage(id) + if err != nil { + return fmt.Errorf("failed to fetch message: %v", err) + } + + w, err := mbox.CreateMessage(msg.Sender.Address, msg.Time.Time()) + if err != nil { + return fmt.Errorf("failed to create mbox message: %v", err) + } + + return writeMessage(c, privateKeys, w, msg) +} + +func ExportConversationMbox(c *protonmail.Client, privateKeys openpgp.KeyRing, mbox *mbox.Writer, id string) error { _, msgs, err := c.GetConversation(id, "") if err != nil { return fmt.Errorf("failed to fetch conversation: %v", err) } for _, msg := range msgs { - w, err := mbox.CreateMessage(msg.Sender.Address, msg.Time.Time()) - if err != nil { - return fmt.Errorf("failed to create mbox message: %v", err) - } - - if err := ExportMessage(c, privateKeys, w, msg.ID); err != nil { + if err := ExportMessageMbox(c, privateKeys, mbox, msg.ID); err != nil { return fmt.Errorf("failed to export conversation message: %v", err) } }