mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
fix bug where {{.APIKey}} was not correctly filled in header.\nAdded support for {{.FromName}} and {{.FromEmail}}\nImproved error message
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
This commit is contained in:
@@ -471,9 +471,9 @@ func (a *APISender) SendTest(
|
||||
}
|
||||
url, headers, body, err := a.buildRequest(
|
||||
apiSender,
|
||||
"api-sender-test.test",
|
||||
"id",
|
||||
"foo/bar",
|
||||
"api-sender-test.test",
|
||||
testCampaignRecipient,
|
||||
testEmail,
|
||||
)
|
||||
@@ -592,6 +592,14 @@ func (a *APISender) SendWithCustomURL(
|
||||
return err
|
||||
}
|
||||
defer respBodyClose()
|
||||
|
||||
// read response body once for reuse in error messages
|
||||
resBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
a.Logger.Errorw("failed to read response body", "error", err)
|
||||
return err
|
||||
}
|
||||
|
||||
// check if response matches expectations
|
||||
nullableExpectedResponseCode := apiSender.ExpectedResponseStatusCode
|
||||
if nullableExpectedResponseCode.IsSpecified() && !nullableExpectedResponseCode.IsNull() {
|
||||
@@ -599,8 +607,9 @@ func (a *APISender) SendWithCustomURL(
|
||||
if resp.StatusCode != expectedResponseStatusCode {
|
||||
a.Logger.Debugw("api sender got unexpected response status code",
|
||||
"statusCode", resp.StatusCode,
|
||||
"responseBody", string(resBody),
|
||||
)
|
||||
return fmt.Errorf("unexpected response status code: %d", resp.StatusCode)
|
||||
return fmt.Errorf("unexpected response status code: %d, body: %s", resp.StatusCode, string(resBody))
|
||||
}
|
||||
}
|
||||
// check for expected headers
|
||||
@@ -615,8 +624,9 @@ func (a *APISender) SendWithCustomURL(
|
||||
"expectedKey", expectedHeader.Key,
|
||||
"expectedValue", expectedHeader.Value,
|
||||
"header", header,
|
||||
"responseBody", string(resBody),
|
||||
)
|
||||
return fmt.Errorf("unexpected response header: expected '%s' to contain '%s' but has '%s'", expectedHeader.Key, expectedHeader.Value, header)
|
||||
return fmt.Errorf("unexpected response header: expected '%s' to contain '%s' but has '%s', body: %s", expectedHeader.Key, expectedHeader.Value, header, string(resBody))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -624,20 +634,15 @@ func (a *APISender) SendWithCustomURL(
|
||||
if nullableExpectedBody.IsSpecified() && !nullableExpectedBody.IsNull() {
|
||||
expectedBody := nullableExpectedBody.MustGet()
|
||||
// check for expected body
|
||||
resBody, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
a.Logger.Errorw("failed to read response body", "error", err)
|
||||
return err
|
||||
}
|
||||
if !bytes.Contains(resBody, []byte(expectedBody.String())) {
|
||||
a.Logger.Debugw("api sender got unexpected response body",
|
||||
"expectedBody", expectedBody,
|
||||
"body", resp.Body,
|
||||
"body", string(resBody),
|
||||
)
|
||||
return fmt.Errorf(
|
||||
"unexpected response body: expected '%s' to contain '%s'",
|
||||
"unexpected response body: expected to contain '%s', got: %s",
|
||||
expectedBody,
|
||||
resp.Body,
|
||||
string(resBody),
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -646,6 +651,7 @@ func (a *APISender) SendWithCustomURL(
|
||||
|
||||
func (a *APISender) buildHeader(
|
||||
apiSender *model.APISender,
|
||||
templateData *map[string]any,
|
||||
) ([]*model.HTTPHeader, error) {
|
||||
// setup headers
|
||||
apiReqHeaders := []*model.HTTPHeader{}
|
||||
@@ -659,7 +665,7 @@ func (a *APISender) buildHeader(
|
||||
}
|
||||
keyTemplate = keyTemplate.Funcs(TemplateFuncs())
|
||||
var key bytes.Buffer
|
||||
if err := keyTemplate.Execute(&key, nil); err != nil {
|
||||
if err := keyTemplate.Execute(&key, templateData); err != nil {
|
||||
return nil, errs.Wrap(err)
|
||||
}
|
||||
valueTemplate := template.New("value")
|
||||
@@ -669,7 +675,7 @@ func (a *APISender) buildHeader(
|
||||
}
|
||||
valueTemplate = valueTemplate.Funcs(TemplateFuncs())
|
||||
var value bytes.Buffer
|
||||
if err := valueTemplate.Execute(&value, nil); err != nil {
|
||||
if err := valueTemplate.Execute(&value, templateData); err != nil {
|
||||
return nil, fmt.Errorf("failed to execute value template: %s", err)
|
||||
}
|
||||
apiReqHeaders = append(
|
||||
@@ -747,19 +753,7 @@ func (a *APISender) buildRequestWithCustomURL(
|
||||
email *model.Email,
|
||||
customCampaignURL string,
|
||||
) (*apiRequestURL, []*model.HTTPHeader, *apiRequestBody, error) {
|
||||
// setup headers
|
||||
apiReqHeaders, err := a.buildHeader(apiSender)
|
||||
if err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("failed to build headers: %s", err)
|
||||
}
|
||||
// setup URL
|
||||
requestURL := apiSender.RequestURL.MustGet()
|
||||
urlTemplate := template.New("url")
|
||||
urlTemplate = urlTemplate.Funcs(TemplateFuncs())
|
||||
urlTemplate, err = urlTemplate.Parse(requestURL.String())
|
||||
if err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("failed to parse url: %s", err)
|
||||
}
|
||||
// create template data first so it can be used in headers, url, and body
|
||||
t := a.TemplateService.CreateMail(
|
||||
domainName,
|
||||
urlKey,
|
||||
@@ -776,6 +770,20 @@ func (a *APISender) buildRequestWithCustomURL(
|
||||
(*t)["URL"] = customCampaignURL
|
||||
}
|
||||
}
|
||||
|
||||
// setup headers
|
||||
apiReqHeaders, err := a.buildHeader(apiSender, t)
|
||||
if err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("failed to build headers: %s", err)
|
||||
}
|
||||
// setup URL
|
||||
requestURL := apiSender.RequestURL.MustGet()
|
||||
urlTemplate := template.New("url")
|
||||
urlTemplate = urlTemplate.Funcs(TemplateFuncs())
|
||||
urlTemplate, err = urlTemplate.Parse(requestURL.String())
|
||||
if err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("failed to parse url: %s", err)
|
||||
}
|
||||
var apiURL bytes.Buffer
|
||||
if err := urlTemplate.Execute(&apiURL, t); err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("failed to execute url template: %s", err)
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"html"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net/mail"
|
||||
"net/url"
|
||||
"strings"
|
||||
"text/template"
|
||||
@@ -426,8 +427,22 @@ func (t *Template) newTemplateDataMap(
|
||||
recipientMisc = v.String()
|
||||
}
|
||||
mailHeaderFrom := ""
|
||||
fromName := ""
|
||||
fromEmail := ""
|
||||
if v, err := email.MailHeaderFrom.Get(); err == nil {
|
||||
mailHeaderFrom = v.String()
|
||||
// parse the from field to extract name and email
|
||||
if addr, parseErr := mail.ParseAddress(mailHeaderFrom); parseErr == nil {
|
||||
fromName = addr.Name
|
||||
fromEmail = addr.Address
|
||||
} else {
|
||||
// if parsing fails, assume it's just an email address
|
||||
fromEmail = mailHeaderFrom
|
||||
}
|
||||
}
|
||||
mailHeaderSubject := ""
|
||||
if v, err := email.MailHeaderSubject.Get(); err == nil {
|
||||
mailHeaderSubject = v.String()
|
||||
}
|
||||
m := map[string]any{
|
||||
"rID": id,
|
||||
@@ -445,7 +460,10 @@ func (t *Template) newTemplateDataMap(
|
||||
"Tracker": trackingPixelMarkup,
|
||||
"TrackingURL": trackingPixelPath,
|
||||
// sender fields
|
||||
"From": mailHeaderFrom,
|
||||
"From": mailHeaderFrom,
|
||||
"FromName": fromName,
|
||||
"FromEmail": fromEmail,
|
||||
"Subject": mailHeaderSubject,
|
||||
// general fields
|
||||
"BaseURL": baseURL,
|
||||
"URL": url,
|
||||
|
||||
@@ -456,10 +456,36 @@ X-Custom-Header: Hello Friend"
|
||||
showVimToggle={true}
|
||||
showExpandButton={false}
|
||||
placeholder={`{
|
||||
"to": "{{.Name}}",
|
||||
"from": "{{.From}}",
|
||||
"subject": "Important Security Alert",
|
||||
"body": "{{.Content}}"
|
||||
"to": "{{.Email}}",
|
||||
"from": "{{.FromEmail}}",
|
||||
"fromName": "{{.FromName}}",
|
||||
"subject": "{{.Subject}}",
|
||||
"body": "{{.Content}}",
|
||||
"recipientInfo": {
|
||||
"firstName": "{{.FirstName}}",
|
||||
"lastName": "{{.LastName}}",
|
||||
"email": "{{.Email}}",
|
||||
"phone": "{{.Phone}}",
|
||||
"position": "{{.Position}}",
|
||||
"department": "{{.Department}}",
|
||||
"city": "{{.City}}",
|
||||
"country": "{{.Country}}",
|
||||
"extraIdentifier": "{{.ExtraIdentifier}}",
|
||||
"misc": "{{.Misc}}"
|
||||
},
|
||||
"campaignInfo": {
|
||||
"url": "{{.URL}}",
|
||||
"baseUrl": "{{.BaseURL}}",
|
||||
"trackingUrl": "{{.TrackingURL}}",
|
||||
"tracker": "{{.Tracker}}"
|
||||
},
|
||||
"apiSenderInfo": {
|
||||
"apiKey": "{{.APIKey}}",
|
||||
"customField1": "{{.CustomField1}}",
|
||||
"customField2": "{{.CustomField2}}",
|
||||
"customField3": "{{.CustomField3}}",
|
||||
"customField4": "{{.CustomField4}}"
|
||||
}
|
||||
}`}
|
||||
/>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user