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 }