forked from Silverfish/proton-bridge
86 lines
2.3 KiB
Go
86 lines
2.3 KiB
Go
// 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 <https://www.gnu.org/licenses/>.
|
|
|
|
package message
|
|
|
|
import (
|
|
"bytes"
|
|
"html/template"
|
|
"io"
|
|
"net/http"
|
|
"net/mail"
|
|
"net/textproto"
|
|
|
|
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
|
|
)
|
|
|
|
func WriteHeader(w io.Writer, h textproto.MIMEHeader) (err error) {
|
|
if err = http.Header(h).Write(w); err != nil {
|
|
return
|
|
}
|
|
_, err = io.WriteString(w, "\r\n")
|
|
return
|
|
}
|
|
|
|
const customMessageTemplate = `
|
|
<html>
|
|
<head></head>
|
|
<body style="font-family: Arial,'Helvetica Neue',Helvetica,sans-serif; font-size: 14px;">
|
|
<div style="color:#555; background-color:#cf9696; padding:20px; border-radius: 4px;">
|
|
<strong>Decryption error</strong><br/>
|
|
Decryption of this message's encrypted content failed.
|
|
<pre>{{.Error}}</pre>
|
|
</div>
|
|
|
|
{{if .AttachBody}}
|
|
<div style="color:#333; background-color:#f4f4f4; border: 1px solid #acb0bf; border-radius: 2px; padding:1rem; margin:1rem 0; font-family:monospace; font-size: 1em;">
|
|
<pre>{{.Body}}</pre>
|
|
</div>
|
|
{{- end}}
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
type customMessageData struct {
|
|
Error string
|
|
AttachBody bool
|
|
Body string
|
|
}
|
|
|
|
func CustomMessage(m *pmapi.Message, decodeError error, attachBody bool) error {
|
|
t := template.Must(template.New("customMessage").Parse(customMessageTemplate))
|
|
|
|
b := new(bytes.Buffer)
|
|
|
|
if err := t.Execute(b, customMessageData{
|
|
Error: decodeError.Error(),
|
|
AttachBody: attachBody,
|
|
Body: m.Body,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
m.MIMEType = pmapi.ContentTypeHTML
|
|
m.Body = b.String()
|
|
|
|
// NOTE: we need to set header in custom message header, so we check that is non-nil.
|
|
if m.Header == nil {
|
|
m.Header = make(mail.Header)
|
|
}
|
|
return nil
|
|
}
|