github.com/topsteplocal/gophish@v0.6.0/controllers/phish_test.go (about)

     1  package controllers
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  
     9  	"github.com/gophish/gophish/models"
    10  )
    11  
    12  func (s *ControllersSuite) getFirstCampaign() models.Campaign {
    13  	campaigns, err := models.GetCampaigns(1)
    14  	s.Nil(err)
    15  	return campaigns[0]
    16  }
    17  
    18  func (s *ControllersSuite) openEmail(rid string) {
    19  	resp, err := http.Get(fmt.Sprintf("%s/track?%s=%s", ps.URL, models.RecipientParameter, rid))
    20  	s.Nil(err)
    21  	defer resp.Body.Close()
    22  	body, err := ioutil.ReadAll(resp.Body)
    23  	s.Nil(err)
    24  	expected, err := ioutil.ReadFile("static/images/pixel.png")
    25  	s.Nil(err)
    26  	s.Equal(bytes.Compare(body, expected), 0)
    27  }
    28  
    29  func (s *ControllersSuite) reportedEmail(rid string) {
    30  	resp, err := http.Get(fmt.Sprintf("%s/report?%s=%s", ps.URL, models.RecipientParameter, rid))
    31  	s.Nil(err)
    32  	s.Equal(resp.StatusCode, http.StatusNoContent)
    33  }
    34  
    35  func (s *ControllersSuite) openEmail404(rid string) {
    36  	resp, err := http.Get(fmt.Sprintf("%s/track?%s=%s", ps.URL, models.RecipientParameter, rid))
    37  	s.Nil(err)
    38  	defer resp.Body.Close()
    39  	s.Nil(err)
    40  	s.Equal(resp.StatusCode, http.StatusNotFound)
    41  }
    42  
    43  func (s *ControllersSuite) clickLink(rid string, campaign models.Campaign) {
    44  	resp, err := http.Get(fmt.Sprintf("%s/?%s=%s", ps.URL, models.RecipientParameter, rid))
    45  	s.Nil(err)
    46  	defer resp.Body.Close()
    47  	body, err := ioutil.ReadAll(resp.Body)
    48  	s.Nil(err)
    49  	s.Equal(bytes.Compare(body, []byte(campaign.Page.HTML)), 0)
    50  }
    51  
    52  func (s *ControllersSuite) clickLink404(rid string) {
    53  	resp, err := http.Get(fmt.Sprintf("%s/?%s=%s", ps.URL, models.RecipientParameter, rid))
    54  	s.Nil(err)
    55  	defer resp.Body.Close()
    56  	s.Nil(err)
    57  	s.Equal(resp.StatusCode, http.StatusNotFound)
    58  }
    59  
    60  func (s *ControllersSuite) TestOpenedPhishingEmail() {
    61  	campaign := s.getFirstCampaign()
    62  	result := campaign.Results[0]
    63  	s.Equal(result.Status, models.STATUS_SENDING)
    64  
    65  	s.openEmail(result.RId)
    66  
    67  	campaign = s.getFirstCampaign()
    68  	result = campaign.Results[0]
    69  	s.Equal(result.Status, models.EVENT_OPENED)
    70  }
    71  
    72  func (s *ControllersSuite) TestReportedPhishingEmail() {
    73  	campaign := s.getFirstCampaign()
    74  	result := campaign.Results[0]
    75  	s.Equal(result.Status, models.STATUS_SENDING)
    76  
    77  	s.reportedEmail(result.RId)
    78  
    79  	campaign = s.getFirstCampaign()
    80  	result = campaign.Results[0]
    81  	s.Equal(result.Reported, true)
    82  	s.Equal(campaign.Events[len(campaign.Events)-1].Message, models.EVENT_REPORTED)
    83  }
    84  
    85  func (s *ControllersSuite) TestClickedPhishingLinkAfterOpen() {
    86  	campaign := s.getFirstCampaign()
    87  	result := campaign.Results[0]
    88  	s.Equal(result.Status, models.STATUS_SENDING)
    89  
    90  	s.openEmail(result.RId)
    91  	s.clickLink(result.RId, campaign)
    92  
    93  	campaign = s.getFirstCampaign()
    94  	result = campaign.Results[0]
    95  	s.Equal(result.Status, models.EVENT_CLICKED)
    96  }
    97  
    98  func (s *ControllersSuite) TestNoRecipientID() {
    99  	resp, err := http.Get(fmt.Sprintf("%s/track", ps.URL))
   100  	s.Nil(err)
   101  	s.Equal(resp.StatusCode, http.StatusNotFound)
   102  
   103  	resp, err = http.Get(ps.URL)
   104  	s.Nil(err)
   105  	s.Equal(resp.StatusCode, http.StatusNotFound)
   106  }
   107  
   108  func (s *ControllersSuite) TestInvalidRecipientID() {
   109  	rid := "XXXXXXXXXX"
   110  	resp, err := http.Get(fmt.Sprintf("%s/track?%s=%s", ps.URL, models.RecipientParameter, rid))
   111  	s.Nil(err)
   112  	s.Equal(resp.StatusCode, http.StatusNotFound)
   113  
   114  	resp, err = http.Get(fmt.Sprintf("%s/?%s=%s", ps.URL, models.RecipientParameter, rid))
   115  	s.Nil(err)
   116  	s.Equal(resp.StatusCode, http.StatusNotFound)
   117  }
   118  
   119  func (s *ControllersSuite) TestCompletedCampaignClick() {
   120  	campaign := s.getFirstCampaign()
   121  	result := campaign.Results[0]
   122  	s.Equal(result.Status, models.STATUS_SENDING)
   123  	s.openEmail(result.RId)
   124  
   125  	campaign = s.getFirstCampaign()
   126  	result = campaign.Results[0]
   127  	s.Equal(result.Status, models.EVENT_OPENED)
   128  
   129  	models.CompleteCampaign(campaign.Id, 1)
   130  	s.openEmail404(result.RId)
   131  	s.clickLink404(result.RId)
   132  
   133  	campaign = s.getFirstCampaign()
   134  	result = campaign.Results[0]
   135  	s.Equal(result.Status, models.EVENT_OPENED)
   136  }
   137  
   138  func (s *ControllersSuite) TestRobotsHandler() {
   139  	expected := []byte("User-agent: *\nDisallow: /\n")
   140  	resp, err := http.Get(fmt.Sprintf("%s/robots.txt", ps.URL))
   141  	s.Nil(err)
   142  	s.Equal(resp.StatusCode, http.StatusOK)
   143  	defer resp.Body.Close()
   144  	body, err := ioutil.ReadAll(resp.Body)
   145  	s.Nil(err)
   146  	s.Equal(bytes.Compare(body, expected), 0)
   147  }