mirror of
https://github.com/gophish/gophish
synced 2024-11-15 00:37:14 +00:00
217 lines
5.3 KiB
Go
217 lines
5.3 KiB
Go
package models
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/gophish/gomail"
|
|
"github.com/jordan-wright/email"
|
|
check "gopkg.in/check.v1"
|
|
)
|
|
|
|
func (s *ModelsSuite) TestEmailNotPresent(ch *check.C) {
|
|
req := &EmailRequest{}
|
|
ch.Assert(req.Validate(), check.Equals, ErrEmailNotSpecified)
|
|
req.Email = "test@example.com"
|
|
ch.Assert(req.Validate(), check.Equals, ErrFromAddressNotSpecified)
|
|
req.FromAddress = "from@example.com"
|
|
ch.Assert(req.Validate(), check.Equals, nil)
|
|
}
|
|
|
|
func (s *ModelsSuite) TestEmailRequestBackoff(ch *check.C) {
|
|
req := &EmailRequest{
|
|
ErrorChan: make(chan error),
|
|
}
|
|
expected := errors.New("Temporary Error")
|
|
go func() {
|
|
err = req.Backoff(expected)
|
|
ch.Assert(err, check.Equals, nil)
|
|
}()
|
|
ch.Assert(<-req.ErrorChan, check.Equals, expected)
|
|
}
|
|
|
|
func (s *ModelsSuite) TestEmailRequestError(ch *check.C) {
|
|
req := &EmailRequest{
|
|
ErrorChan: make(chan error),
|
|
}
|
|
expected := errors.New("Temporary Error")
|
|
go func() {
|
|
err = req.Error(expected)
|
|
ch.Assert(err, check.Equals, nil)
|
|
}()
|
|
ch.Assert(<-req.ErrorChan, check.Equals, expected)
|
|
}
|
|
|
|
func (s *ModelsSuite) TestEmailRequestSuccess(ch *check.C) {
|
|
req := &EmailRequest{
|
|
ErrorChan: make(chan error),
|
|
}
|
|
go func() {
|
|
err = req.Success()
|
|
ch.Assert(err, check.Equals, nil)
|
|
}()
|
|
ch.Assert(<-req.ErrorChan, check.Equals, nil)
|
|
}
|
|
|
|
func (s *ModelsSuite) TestEmailRequestGenerate(ch *check.C) {
|
|
smtp := SMTP{
|
|
FromAddress: "from@example.com",
|
|
}
|
|
template := Template{
|
|
Name: "Test Template",
|
|
Subject: "{{.FirstName}} - Subject",
|
|
Text: "{{.Email}} - Text",
|
|
HTML: "{{.Email}} - HTML",
|
|
}
|
|
req := &EmailRequest{
|
|
SMTP: smtp,
|
|
Template: template,
|
|
BaseRecipient: BaseRecipient{
|
|
FirstName: "First",
|
|
LastName: "Last",
|
|
Email: "firstlast@example.com",
|
|
},
|
|
FromAddress: smtp.FromAddress,
|
|
}
|
|
|
|
msg := gomail.NewMessage()
|
|
err = req.Generate(msg)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
expected := &email.Email{
|
|
Subject: fmt.Sprintf("%s - Subject", req.FirstName),
|
|
Text: []byte(fmt.Sprintf("%s - Text", req.Email)),
|
|
HTML: []byte(fmt.Sprintf("%s - HTML", req.Email)),
|
|
}
|
|
|
|
msgBuff := &bytes.Buffer{}
|
|
_, err = msg.WriteTo(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
got, err := email.NewEmailFromReader(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
ch.Assert(got.Subject, check.Equals, expected.Subject)
|
|
ch.Assert(string(got.Text), check.Equals, string(expected.Text))
|
|
ch.Assert(string(got.HTML), check.Equals, string(expected.HTML))
|
|
}
|
|
|
|
func (s *ModelsSuite) TestEmailRequestURLTemplating(ch *check.C) {
|
|
smtp := SMTP{
|
|
FromAddress: "from@example.com",
|
|
}
|
|
template := Template{
|
|
Name: "Test Template",
|
|
Subject: "{{.URL}}",
|
|
Text: "{{.URL}}",
|
|
HTML: "{{.URL}}",
|
|
}
|
|
req := &EmailRequest{
|
|
SMTP: smtp,
|
|
Template: template,
|
|
URL: "http://127.0.0.1/{{.Email}}",
|
|
BaseRecipient: BaseRecipient{
|
|
FirstName: "First",
|
|
LastName: "Last",
|
|
Email: "firstlast@example.com",
|
|
},
|
|
FromAddress: smtp.FromAddress,
|
|
RId: fmt.Sprintf("%s-foobar", PreviewPrefix),
|
|
}
|
|
|
|
msg := gomail.NewMessage()
|
|
err = req.Generate(msg)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
expectedURL := fmt.Sprintf("http://127.0.0.1/%s?%s=%s", req.Email, RecipientParameter, req.RId)
|
|
|
|
msgBuff := &bytes.Buffer{}
|
|
_, err = msg.WriteTo(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
got, err := email.NewEmailFromReader(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
ch.Assert(got.Subject, check.Equals, expectedURL)
|
|
ch.Assert(string(got.Text), check.Equals, expectedURL)
|
|
ch.Assert(string(got.HTML), check.Equals, expectedURL)
|
|
}
|
|
func (s *ModelsSuite) TestEmailRequestGenerateEmptySubject(ch *check.C) {
|
|
smtp := SMTP{
|
|
FromAddress: "from@example.com",
|
|
}
|
|
template := Template{
|
|
Name: "Test Template",
|
|
Subject: "",
|
|
Text: "{{.Email}} - Text",
|
|
HTML: "{{.Email}} - HTML",
|
|
}
|
|
req := &EmailRequest{
|
|
SMTP: smtp,
|
|
Template: template,
|
|
BaseRecipient: BaseRecipient{
|
|
FirstName: "First",
|
|
LastName: "Last",
|
|
Email: "firstlast@example.com",
|
|
},
|
|
FromAddress: smtp.FromAddress,
|
|
}
|
|
|
|
msg := gomail.NewMessage()
|
|
err = req.Generate(msg)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
expected := &email.Email{
|
|
Subject: "",
|
|
Text: []byte(fmt.Sprintf("%s - Text", req.Email)),
|
|
HTML: []byte(fmt.Sprintf("%s - HTML", req.Email)),
|
|
}
|
|
|
|
msgBuff := &bytes.Buffer{}
|
|
_, err = msg.WriteTo(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
got, err := email.NewEmailFromReader(msgBuff)
|
|
ch.Assert(err, check.Equals, nil)
|
|
ch.Assert(got.Subject, check.Equals, expected.Subject)
|
|
}
|
|
|
|
func (s *ModelsSuite) TestPostSendTestEmailRequest(ch *check.C) {
|
|
smtp := SMTP{
|
|
FromAddress: "from@example.com",
|
|
}
|
|
template := Template{
|
|
Name: "Test Template",
|
|
Subject: "",
|
|
Text: "{{.Email}} - Text",
|
|
HTML: "{{.Email}} - HTML",
|
|
UserId: 1,
|
|
}
|
|
err := PostTemplate(&template)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
page := Page{
|
|
Name: "Test Page",
|
|
HTML: "test",
|
|
UserId: 1,
|
|
}
|
|
err = PostPage(&page)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
req := &EmailRequest{
|
|
SMTP: smtp,
|
|
TemplateId: template.Id,
|
|
PageId: page.Id,
|
|
BaseRecipient: BaseRecipient{
|
|
FirstName: "First",
|
|
LastName: "Last",
|
|
Email: "firstlast@example.com",
|
|
},
|
|
}
|
|
err = PostEmailRequest(req)
|
|
ch.Assert(err, check.Equals, nil)
|
|
|
|
got, err := GetEmailRequestByResultId(req.RId)
|
|
ch.Assert(err, check.Equals, nil)
|
|
ch.Assert(got.RId, check.Equals, req.RId)
|
|
ch.Assert(got.Email, check.Equals, req.Email)
|
|
}
|