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  }