From 22a6fcd87f62562a9508591fc914d8786571abc2 Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Thu, 18 Feb 2021 17:29:15 +0100 Subject: [PATCH] Other: add debug message dump when sending --- internal/frontend/qt/frontend.go | 2 +- internal/smtp/dump_default.go | 22 ++++++++++++ internal/smtp/dump_qa.go | 60 ++++++++++++++++++++++++++++++++ internal/smtp/user.go | 6 ++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 internal/smtp/dump_default.go create mode 100644 internal/smtp/dump_qa.go diff --git a/internal/frontend/qt/frontend.go b/internal/frontend/qt/frontend.go index 06c77c4f..df5fef07 100644 --- a/internal/frontend/qt/frontend.go +++ b/internal/frontend/qt/frontend.go @@ -733,4 +733,4 @@ func (s *FrontendQt) setKeychain(keychain string) { s.restarter.SetToRestart() s.App.Quit() } -} \ No newline at end of file +} diff --git a/internal/smtp/dump_default.go b/internal/smtp/dump_default.go new file mode 100644 index 00000000..48e318a0 --- /dev/null +++ b/internal/smtp/dump_default.go @@ -0,0 +1,22 @@ +// Copyright (c) 2021 Proton Technologies AG +// +// This file is part of ProtonMail Bridge. +// +// ProtonMail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ProtonMail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with ProtonMail Bridge. If not, see . + +// +build !build_qa + +package smtp + +func dumpMessageData([]byte, string) {} diff --git a/internal/smtp/dump_qa.go b/internal/smtp/dump_qa.go new file mode 100644 index 00000000..7239a845 --- /dev/null +++ b/internal/smtp/dump_qa.go @@ -0,0 +1,60 @@ +// Copyright (c) 2021 Proton Technologies AG +// +// This file is part of ProtonMail Bridge. +// +// ProtonMail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ProtonMail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with ProtonMail Bridge. If not, see . + +// +build build_qa + +package smtp + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "time" + + "github.com/sirupsen/logrus" +) + +func dumpMessageData(b []byte, subject string) { + home, err := os.UserHomeDir() + if err != nil { + logrus.WithError(err).Error("Failed to dump raw message data") + return + } + + path := filepath.Join(home, "bridge-qa") + + if err := os.MkdirAll(path, 0700); err != nil { + logrus.WithError(err).Error("Failed to dump raw message data") + return + } + + if len(subject) > 16 { + subject = subject[:16] + } + + if err := ioutil.WriteFile( + filepath.Join(path, fmt.Sprintf("%v-%v.eml", subject, time.Now().Format(time.RFC3339Nano))), + b, + 0600, + ); err != nil { + logrus.WithError(err).Error("Failed to dump raw message data") + return + } + + logrus.WithField("path", path).Info("Dumped raw message data") +} diff --git a/internal/smtp/user.go b/internal/smtp/user.go index 62d31407..d03ae84b 100644 --- a/internal/smtp/user.go +++ b/internal/smtp/user.go @@ -215,6 +215,10 @@ func (su *smtpUser) Send(returnPath string, to []string, messageReader io.Reader // Called from go-smtp in goroutines - we need to handle panics for each function. defer su.panicHandler.HandlePanic() + b := new(bytes.Buffer) + + messageReader = io.TeeReader(messageReader, b) + mailSettings, err := su.client().GetMailSettings() if err != nil { return err @@ -405,6 +409,8 @@ func (su *smtpUser) Send(returnPath string, to []string, messageReader io.Reader req.PreparePackages() + dumpMessageData(b.Bytes(), message.Subject) + return su.storeUser.SendMessage(message.ID, req) }