mirror of
https://github.com/grafana/grafana.git
synced 2024-12-01 21:19:28 -06:00
d5b9602a79
* Can add allowed custom headers to an email Message. WIP. * adds slug as a custom email header to all outgoing emails * Headers are static - declared as key/value pairs in config. All static headers get added to emails. * updates comment * adds tests for parsing smtp static headers * updates test to assert static headers are included when building email * updates test to use multiple static headers * updates test names * fixes linting issue with error * ignore gocyclo for loading config * updates email headers in tests to be formatted properly * add static headers first * updates tests to assert that regular headers like From cant be overwritten * ensures only the header is in a valid format for smtp and not the value * updates comment and error message wording * adds to docs and ini sample files * updates smtp.static_headers docs examples formatting * removes lines commented with semi colons * prettier:write * renames var
115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
package notifications
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
)
|
|
|
|
func TestBuildMail(t *testing.T) {
|
|
cfg := setting.NewCfg()
|
|
cfg.Smtp.ContentTypes = []string{"text/html", "text/plain"}
|
|
cfg.Smtp.StaticHeaders = map[string]string{"Foo-Header": "foo_value", "From": "malicious_value"}
|
|
|
|
sc, err := NewSmtpClient(cfg.Smtp)
|
|
require.NoError(t, err)
|
|
|
|
message := &Message{
|
|
To: []string{"to@address.com"},
|
|
From: "from@address.com",
|
|
Subject: "Some subject",
|
|
Body: map[string]string{
|
|
"text/html": "Some HTML body",
|
|
"text/plain": "Some plain text body",
|
|
},
|
|
ReplyTo: []string{"from@address.com"},
|
|
}
|
|
|
|
t.Run("Can successfully build mail", func(t *testing.T) {
|
|
email := sc.buildEmail(message)
|
|
staticHeader := email.GetHeader("Foo-Header")[0]
|
|
assert.Equal(t, staticHeader, "foo_value")
|
|
|
|
buf := new(bytes.Buffer)
|
|
_, err := email.WriteTo(buf)
|
|
require.NoError(t, err)
|
|
|
|
assert.Contains(t, buf.String(), "Foo-Header: foo_value")
|
|
assert.Contains(t, buf.String(), "From: from@address.com")
|
|
assert.Contains(t, buf.String(), "Some HTML body")
|
|
assert.Contains(t, buf.String(), "Some plain text body")
|
|
assert.Less(t, strings.Index(buf.String(), "Some plain text body"), strings.Index(buf.String(), "Some HTML body"))
|
|
})
|
|
}
|
|
|
|
func TestSmtpDialer(t *testing.T) {
|
|
t.Run("When SMTP hostname is invalid", func(t *testing.T) {
|
|
cfg := createSmtpConfig()
|
|
cfg.Smtp.Host = "invalid%hostname:123:456"
|
|
client, err := ProvideSmtpService(cfg)
|
|
require.NoError(t, err)
|
|
message := &Message{
|
|
To: []string{"asdf@grafana.com"},
|
|
SingleEmail: true,
|
|
Subject: "subject",
|
|
Body: map[string]string{
|
|
"text/html": "body",
|
|
"text/plain": "body",
|
|
},
|
|
}
|
|
|
|
count, err := client.Send(message)
|
|
|
|
require.Equal(t, 0, count)
|
|
require.EqualError(t, err, "address invalid%hostname:123:456: too many colons in address")
|
|
})
|
|
|
|
t.Run("When SMTP port is invalid", func(t *testing.T) {
|
|
cfg := createSmtpConfig()
|
|
cfg.Smtp.Host = "invalid%hostname:123a"
|
|
client, err := ProvideSmtpService(cfg)
|
|
require.NoError(t, err)
|
|
message := &Message{
|
|
To: []string{"asdf@grafana.com"},
|
|
SingleEmail: true,
|
|
Subject: "subject",
|
|
Body: map[string]string{
|
|
"text/html": "body",
|
|
"text/plain": "body",
|
|
},
|
|
}
|
|
|
|
count, err := client.Send(message)
|
|
|
|
require.Equal(t, 0, count)
|
|
require.EqualError(t, err, "strconv.Atoi: parsing \"123a\": invalid syntax")
|
|
})
|
|
|
|
t.Run("When TLS certificate does not exist", func(t *testing.T) {
|
|
cfg := createSmtpConfig()
|
|
cfg.Smtp.Host = "localhost:1234"
|
|
cfg.Smtp.CertFile = "/var/certs/does-not-exist.pem"
|
|
client, err := ProvideSmtpService(cfg)
|
|
require.NoError(t, err)
|
|
message := &Message{
|
|
To: []string{"asdf@grafana.com"},
|
|
SingleEmail: true,
|
|
Subject: "subject",
|
|
Body: map[string]string{
|
|
"text/html": "body",
|
|
"text/plain": "body",
|
|
},
|
|
}
|
|
|
|
count, err := client.Send(message)
|
|
|
|
require.Equal(t, 0, count)
|
|
require.EqualError(t, err, "could not load cert or key file: open /var/certs/does-not-exist.pem: no such file or directory")
|
|
})
|
|
}
|