Add -message-id flag to export-messages command

This commit is contained in:
Simon Ser 2020-09-15 10:37:01 +02:00
parent bd861cdb00
commit fce7129990
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 40 additions and 19 deletions

View File

@ -340,13 +340,14 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
case "export-messages": case "export-messages":
var convID string // TODO: allow specifying multiple IDs
var convID, msgID string
exportMessagesCmd.StringVar(&convID, "conversation-id", "", "conversation ID") exportMessagesCmd.StringVar(&convID, "conversation-id", "", "conversation ID")
exportMessagesCmd.StringVar(&msgID, "message-id", "", "message ID")
exportMessagesCmd.Parse(flag.Args()[1:]) exportMessagesCmd.Parse(flag.Args()[1:])
username := exportMessagesCmd.Arg(0) username := exportMessagesCmd.Arg(0)
log.Println(convID, username) if (convID == "" && msgID == "") || username == "" {
if convID == "" || username == "" { log.Fatal("usage: hydroxide export-messages [-conversation-id <id>] [-message-id <id>] <username>")
log.Fatal("usage: hydroxide export-messages -conversation-id <id> <username>")
} }
var bridgePassword string var bridgePassword string
@ -364,9 +365,16 @@ func main() {
mboxWriter := mbox.NewWriter(os.Stdout) mboxWriter := mbox.NewWriter(os.Stdout)
if err := exports.ExportConversation(c, privateKeys, mboxWriter, convID); err != nil { if convID != "" {
if err := exports.ExportConversationMbox(c, privateKeys, mboxWriter, convID); err != nil {
log.Fatal(err) log.Fatal(err)
} }
}
if msgID != "" {
if err := exports.ExportMessageMbox(c, privateKeys, mboxWriter, msgID); err != nil {
log.Fatal(err)
}
}
if err := mboxWriter.Close(); err != nil { if err := mboxWriter.Close(); err != nil {
log.Fatal(err) log.Fatal(err)

View File

@ -15,12 +15,7 @@ import (
"github.com/emersion/hydroxide/protonmail" "github.com/emersion/hydroxide/protonmail"
) )
func ExportMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Writer, id string) error { func writeMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Writer, msg *protonmail.Message) error {
msg, err := c.GetMessage(id)
if err != nil {
return fmt.Errorf("failed to fetch message: %v", err)
}
mimeType := msg.MIMEType mimeType := msg.MIMEType
if mimeType == "" { if mimeType == "" {
mimeType = "text/html" mimeType = "text/html"
@ -55,19 +50,37 @@ func ExportMessage(c *protonmail.Client, privateKeys openpgp.KeyRing, w io.Write
return mw.Close() 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, "") _, msgs, err := c.GetConversation(id, "")
if err != nil { if err != nil {
return fmt.Errorf("failed to fetch conversation: %v", err) return fmt.Errorf("failed to fetch conversation: %v", err)
} }
for _, msg := range msgs { for _, msg := range msgs {
w, err := mbox.CreateMessage(msg.Sender.Address, msg.Time.Time()) if err := ExportMessageMbox(c, privateKeys, mbox, msg.ID); err != nil {
if err != nil {
return fmt.Errorf("failed to create mbox message: %v", err)
}
if err := ExportMessage(c, privateKeys, w, msg.ID); err != nil {
return fmt.Errorf("failed to export conversation message: %v", err) return fmt.Errorf("failed to export conversation message: %v", err)
} }
} }