github.com/gophish/gophish@v0.12.2-0.20230915144530-8e7929441393/models/email_request_test.go (about) 1 package models 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 8 "github.com/gophish/gomail" 9 "github.com/gophish/gophish/config" 10 "github.com/jordan-wright/email" 11 check "gopkg.in/check.v1" 12 ) 13 14 func (s *ModelsSuite) TestEmailNotPresent(ch *check.C) { 15 req := &EmailRequest{} 16 ch.Assert(req.Validate(), check.Equals, ErrEmailNotSpecified) 17 req.Email = "test@example.com" 18 ch.Assert(req.Validate(), check.Equals, ErrFromAddressNotSpecified) 19 req.FromAddress = "from@example.com" 20 ch.Assert(req.Validate(), check.Equals, nil) 21 } 22 23 func (s *ModelsSuite) TestEmailRequestBackoff(ch *check.C) { 24 req := &EmailRequest{ 25 ErrorChan: make(chan error), 26 } 27 expected := errors.New("Temporary Error") 28 go func() { 29 err := req.Backoff(expected) 30 ch.Assert(err, check.Equals, nil) 31 }() 32 ch.Assert(<-req.ErrorChan, check.Equals, expected) 33 } 34 35 func (s *ModelsSuite) TestEmailRequestError(ch *check.C) { 36 req := &EmailRequest{ 37 ErrorChan: make(chan error), 38 } 39 expected := errors.New("Temporary Error") 40 go func() { 41 err := req.Error(expected) 42 ch.Assert(err, check.Equals, nil) 43 }() 44 ch.Assert(<-req.ErrorChan, check.Equals, expected) 45 } 46 47 func (s *ModelsSuite) TestEmailRequestSuccess(ch *check.C) { 48 req := &EmailRequest{ 49 ErrorChan: make(chan error), 50 } 51 go func() { 52 err := req.Success() 53 ch.Assert(err, check.Equals, nil) 54 }() 55 ch.Assert(<-req.ErrorChan, check.Equals, nil) 56 } 57 58 func (s *ModelsSuite) TestEmailRequestGenerate(ch *check.C) { 59 smtp := SMTP{ 60 FromAddress: "from@example.com", 61 } 62 template := Template{ 63 Name: "Test Template", 64 Subject: "{{.FirstName}} - Subject", 65 Text: "{{.Email}} - Text", 66 HTML: "{{.Email}} - HTML", 67 } 68 req := &EmailRequest{ 69 SMTP: smtp, 70 Template: template, 71 BaseRecipient: BaseRecipient{ 72 FirstName: "First", 73 LastName: "Last", 74 Email: "firstlast@example.com", 75 }, 76 FromAddress: smtp.FromAddress, 77 } 78 79 s.config.ContactAddress = "test@test.com" 80 expectedHeaders := map[string]string{ 81 "X-Mailer": config.ServerName, 82 "X-Gophish-Contact": s.config.ContactAddress, 83 } 84 85 msg := gomail.NewMessage() 86 err := req.Generate(msg) 87 ch.Assert(err, check.Equals, nil) 88 89 expected := &email.Email{ 90 Subject: fmt.Sprintf("%s - Subject", req.FirstName), 91 Text: []byte(fmt.Sprintf("%s - Text", req.Email)), 92 HTML: []byte(fmt.Sprintf("%s - HTML", req.Email)), 93 } 94 95 msgBuff := &bytes.Buffer{} 96 _, err = msg.WriteTo(msgBuff) 97 ch.Assert(err, check.Equals, nil) 98 99 got, err := email.NewEmailFromReader(msgBuff) 100 ch.Assert(err, check.Equals, nil) 101 ch.Assert(got.Subject, check.Equals, expected.Subject) 102 ch.Assert(string(got.Text), check.Equals, string(expected.Text)) 103 ch.Assert(string(got.HTML), check.Equals, string(expected.HTML)) 104 for k, v := range expectedHeaders { 105 ch.Assert(got.Headers.Get(k), check.Equals, v) 106 } 107 } 108 109 func (s *ModelsSuite) TestGetSmtpFrom(ch *check.C) { 110 smtp := SMTP{ 111 FromAddress: "from@example.com", 112 } 113 template := Template{ 114 Name: "Test Template", 115 Subject: "{{.FirstName}} - Subject", 116 Text: "{{.Email}} - Text", 117 HTML: "{{.Email}} - HTML", 118 } 119 req := &EmailRequest{ 120 SMTP: smtp, 121 Template: template, 122 URL: "http://127.0.0.1/{{.Email}}", 123 BaseRecipient: BaseRecipient{ 124 FirstName: "First", 125 LastName: "Last", 126 Email: "firstlast@example.com", 127 }, 128 FromAddress: smtp.FromAddress, 129 RId: fmt.Sprintf("%s-foobar", PreviewPrefix), 130 } 131 132 msg := gomail.NewMessage() 133 err := req.Generate(msg) 134 smtp_from, err := req.GetSmtpFrom() 135 136 ch.Assert(err, check.Equals, nil) 137 ch.Assert(smtp_from, check.Equals, "from@example.com") 138 } 139 140 func (s *ModelsSuite) TestEmailRequestURLTemplating(ch *check.C) { 141 smtp := SMTP{ 142 FromAddress: "from@example.com", 143 } 144 template := Template{ 145 Name: "Test Template", 146 Subject: "{{.URL}}", 147 Text: "{{.URL}}", 148 HTML: "{{.URL}}", 149 } 150 req := &EmailRequest{ 151 SMTP: smtp, 152 Template: template, 153 URL: "http://127.0.0.1/{{.Email}}", 154 BaseRecipient: BaseRecipient{ 155 FirstName: "First", 156 LastName: "Last", 157 Email: "firstlast@example.com", 158 }, 159 FromAddress: smtp.FromAddress, 160 RId: fmt.Sprintf("%s-foobar", PreviewPrefix), 161 } 162 163 msg := gomail.NewMessage() 164 err := req.Generate(msg) 165 ch.Assert(err, check.Equals, nil) 166 167 expectedURL := fmt.Sprintf("http://127.0.0.1/%s?%s=%s", req.Email, RecipientParameter, req.RId) 168 169 msgBuff := &bytes.Buffer{} 170 _, err = msg.WriteTo(msgBuff) 171 ch.Assert(err, check.Equals, nil) 172 173 got, err := email.NewEmailFromReader(msgBuff) 174 ch.Assert(err, check.Equals, nil) 175 ch.Assert(got.Subject, check.Equals, expectedURL) 176 ch.Assert(string(got.Text), check.Equals, expectedURL) 177 ch.Assert(string(got.HTML), check.Equals, expectedURL) 178 } 179 func (s *ModelsSuite) TestEmailRequestGenerateEmptySubject(ch *check.C) { 180 smtp := SMTP{ 181 FromAddress: "from@example.com", 182 } 183 template := Template{ 184 Name: "Test Template", 185 Subject: "", 186 Text: "{{.Email}} - Text", 187 HTML: "{{.Email}} - HTML", 188 } 189 req := &EmailRequest{ 190 SMTP: smtp, 191 Template: template, 192 BaseRecipient: BaseRecipient{ 193 FirstName: "First", 194 LastName: "Last", 195 Email: "firstlast@example.com", 196 }, 197 FromAddress: smtp.FromAddress, 198 } 199 200 msg := gomail.NewMessage() 201 err := req.Generate(msg) 202 ch.Assert(err, check.Equals, nil) 203 204 expected := &email.Email{ 205 Subject: "", 206 Text: []byte(fmt.Sprintf("%s - Text", req.Email)), 207 HTML: []byte(fmt.Sprintf("%s - HTML", req.Email)), 208 } 209 210 msgBuff := &bytes.Buffer{} 211 _, err = msg.WriteTo(msgBuff) 212 ch.Assert(err, check.Equals, nil) 213 214 got, err := email.NewEmailFromReader(msgBuff) 215 ch.Assert(err, check.Equals, nil) 216 ch.Assert(got.Subject, check.Equals, expected.Subject) 217 } 218 219 func (s *ModelsSuite) TestPostSendTestEmailRequest(ch *check.C) { 220 smtp := SMTP{ 221 FromAddress: "from@example.com", 222 } 223 template := Template{ 224 Name: "Test Template", 225 Subject: "", 226 Text: "{{.Email}} - Text", 227 HTML: "{{.Email}} - HTML", 228 UserId: 1, 229 } 230 err := PostTemplate(&template) 231 ch.Assert(err, check.Equals, nil) 232 233 page := Page{ 234 Name: "Test Page", 235 HTML: "test", 236 UserId: 1, 237 } 238 err = PostPage(&page) 239 ch.Assert(err, check.Equals, nil) 240 241 req := &EmailRequest{ 242 SMTP: smtp, 243 TemplateId: template.Id, 244 PageId: page.Id, 245 BaseRecipient: BaseRecipient{ 246 FirstName: "First", 247 LastName: "Last", 248 Email: "firstlast@example.com", 249 }, 250 } 251 err = PostEmailRequest(req) 252 ch.Assert(err, check.Equals, nil) 253 254 got, err := GetEmailRequestByResultId(req.RId) 255 ch.Assert(err, check.Equals, nil) 256 ch.Assert(got.RId, check.Equals, req.RId) 257 ch.Assert(got.Email, check.Equals, req.Email) 258 }