mirror of
https://github.com/gophish/gophish
synced 2024-11-15 00:37:14 +00:00
bb516ef7ab
* Adds the ability to specify an envelope sender in templates (#986) Authored-by: ChessSpider <ChessSpider@users.noreply.github.com> Authored-by: Olivier MEDOC <o_medoc@yahoo.fr> Authored-by: ptitdoc <ptitdoc@free.fr>
134 lines
4.2 KiB
Go
134 lines
4.2 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/mail"
|
|
|
|
ctx "github.com/gophish/gophish/context"
|
|
log "github.com/gophish/gophish/logger"
|
|
"github.com/gophish/gophish/models"
|
|
"github.com/jinzhu/gorm"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// SendTestEmail sends a test email using the template name
|
|
// and Target given.
|
|
func (as *Server) SendTestEmail(w http.ResponseWriter, r *http.Request) {
|
|
s := &models.EmailRequest{
|
|
ErrorChan: make(chan error),
|
|
UserId: ctx.Get(r, "user_id").(int64),
|
|
}
|
|
if r.Method != "POST" {
|
|
JSONResponse(w, models.Response{Success: false, Message: "Method not allowed"}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
err := json.NewDecoder(r.Body).Decode(s)
|
|
if err != nil {
|
|
JSONResponse(w, models.Response{Success: false, Message: "Error decoding JSON Request"}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
storeRequest := false
|
|
|
|
// If a Template is not specified use a default
|
|
if s.Template.Name == "" {
|
|
//default message body
|
|
text := "It works!\n\nThis is an email letting you know that your gophish\nconfiguration was successful.\n" +
|
|
"Here are the details:\n\nWho you sent from: {{.From}}\n\nWho you sent to: \n" +
|
|
"{{if .FirstName}} First Name: {{.FirstName}}\n{{end}}" +
|
|
"{{if .LastName}} Last Name: {{.LastName}}\n{{end}}" +
|
|
"{{if .Position}} Position: {{.Position}}\n{{end}}" +
|
|
"\nNow go send some phish!"
|
|
t := models.Template{
|
|
Subject: "Default Email from Gophish",
|
|
Text: text,
|
|
}
|
|
s.Template = t
|
|
} else {
|
|
// Get the Template requested by name
|
|
s.Template, err = models.GetTemplateByName(s.Template.Name, s.UserId)
|
|
if err == gorm.ErrRecordNotFound {
|
|
log.WithFields(logrus.Fields{
|
|
"template": s.Template.Name,
|
|
}).Error("Template does not exist")
|
|
JSONResponse(w, models.Response{Success: false, Message: models.ErrTemplateNotFound.Error()}, http.StatusBadRequest)
|
|
return
|
|
} else if err != nil {
|
|
log.Error(err)
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
s.TemplateId = s.Template.Id
|
|
// We'll only save the test request to the database if there is a
|
|
// user-specified template to use.
|
|
storeRequest = true
|
|
}
|
|
|
|
if s.Page.Name != "" {
|
|
s.Page, err = models.GetPageByName(s.Page.Name, s.UserId)
|
|
if err == gorm.ErrRecordNotFound {
|
|
log.WithFields(logrus.Fields{
|
|
"page": s.Page.Name,
|
|
}).Error("Page does not exist")
|
|
JSONResponse(w, models.Response{Success: false, Message: models.ErrPageNotFound.Error()}, http.StatusBadRequest)
|
|
return
|
|
} else if err != nil {
|
|
log.Error(err)
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
s.PageId = s.Page.Id
|
|
}
|
|
|
|
// If a complete sending profile is provided use it
|
|
if err := s.SMTP.Validate(); err != nil {
|
|
// Otherwise get the SMTP requested by name
|
|
smtp, lookupErr := models.GetSMTPByName(s.SMTP.Name, s.UserId)
|
|
// If the Sending Profile doesn't exist, let's err on the side
|
|
// of caution and assume that the validation failure was more important.
|
|
if lookupErr != nil {
|
|
log.Error(err)
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
s.SMTP = smtp
|
|
}
|
|
|
|
_, err = mail.ParseAddress(s.Template.EnvelopeSender)
|
|
if err != nil {
|
|
_, err = mail.ParseAddress(s.SMTP.FromAddress)
|
|
if err != nil {
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
|
|
return
|
|
} else {
|
|
s.FromAddress = s.SMTP.FromAddress
|
|
}
|
|
} else {
|
|
s.FromAddress = s.Template.EnvelopeSender
|
|
}
|
|
|
|
// Validate the given request
|
|
if err = s.Validate(); err != nil {
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
// Store the request if this wasn't the default template
|
|
if storeRequest {
|
|
err = models.PostEmailRequest(s)
|
|
if err != nil {
|
|
log.Error(err)
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
// Send the test email
|
|
err = as.worker.SendTestEmail(s)
|
|
if err != nil {
|
|
log.Error(err)
|
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
|
|
return
|
|
}
|
|
JSONResponse(w, models.Response{Success: true, Message: "Email Sent"}, http.StatusOK)
|
|
}
|