mirror of https://github.com/gophish/gophish
import cycle error fixed with new package "translations"
parent
62074e9a18
commit
2d26b0e031
|
@ -21,6 +21,7 @@ import (
|
|||
"github.com/jinzhu/gorm"
|
||||
"github.com/jordan-wright/email"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Worker is the worker that processes phishing events and updates campaigns.
|
||||
|
@ -52,9 +53,9 @@ func API_Reset(w http.ResponseWriter, r *http.Request) {
|
|||
u.ApiKey = auth.GenerateSecureKey()
|
||||
err := models.PutUser(&u)
|
||||
if err != nil {
|
||||
http.Error(w, util.T("Error setting API Key"), http.StatusInternalServerError)
|
||||
http.Error(w, translations.T("Error setting API Key"), http.StatusInternalServerError)
|
||||
} else {
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("API Key successfully reset!"), Data: u.ApiKey}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("API Key successfully reset!"), Data: u.ApiKey}, http.StatusOK)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +110,7 @@ func API_Campaigns_Id(w http.ResponseWriter, r *http.Request) {
|
|||
c, err := models.GetCampaign(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
Logger.Println(err)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Campaign not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Campaign not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
switch {
|
||||
|
@ -118,10 +119,10 @@ func API_Campaigns_Id(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "DELETE":
|
||||
err = models.DeleteCampaign(id)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error deleting campaign")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error deleting campaign")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Campaign deleted successfully!")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Campaign deleted successfully!")}, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,7 +134,7 @@ func API_Campaigns_Id_Results(w http.ResponseWriter, r *http.Request) {
|
|||
cr, err := models.GetCampaignResults(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
Logger.Println(err)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Campaign not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Campaign not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
if r.Method == "GET" {
|
||||
|
@ -151,9 +152,9 @@ func API_Campaign_Id_Summary(w http.ResponseWriter, r *http.Request) {
|
|||
cs, err := models.GetCampaignSummary(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Campaign not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Campaign not found")}, http.StatusNotFound)
|
||||
} else {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
}
|
||||
Logger.Println(err)
|
||||
return
|
||||
|
@ -171,10 +172,10 @@ func API_Campaigns_Id_Complete(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "GET":
|
||||
err := models.CompleteCampaign(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error completing campaign")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error completing campaign")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Campaign completed successfully!")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Campaign completed successfully!")}, http.StatusOK)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,7 +186,7 @@ func API_Groups(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "GET":
|
||||
gs, err := models.GetGroups(ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("No groups found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("No groups found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, gs, http.StatusOK)
|
||||
|
@ -195,12 +196,12 @@ func API_Groups(w http.ResponseWriter, r *http.Request) {
|
|||
// Put the request into a group
|
||||
err := json.NewDecoder(r.Body).Decode(&g)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Invalid JSON structure")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Invalid JSON structure")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
_, err = models.GetGroupByName(g.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err != gorm.ErrRecordNotFound {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Group name already in use")}, http.StatusConflict)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Group name already in use")}, http.StatusConflict)
|
||||
return
|
||||
}
|
||||
g.ModifiedDate = time.Now()
|
||||
|
@ -235,7 +236,7 @@ func API_Groups_Id(w http.ResponseWriter, r *http.Request) {
|
|||
id, _ := strconv.ParseInt(vars["id"], 0, 64)
|
||||
g, err := models.GetGroup(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Group not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Group not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
switch {
|
||||
|
@ -244,23 +245,23 @@ func API_Groups_Id(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "DELETE":
|
||||
err = models.DeleteGroup(&g)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error deleting group")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error deleting group")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Group deleted successfully!")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Group deleted successfully!")}, http.StatusOK)
|
||||
case r.Method == "PUT":
|
||||
// Change this to get from URL and uid (don't bother with id in r.Body)
|
||||
g = models.Group{}
|
||||
err = json.NewDecoder(r.Body).Decode(&g)
|
||||
if g.Id != id {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error: /:id and group_id mismatch")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error: /:id and group_id mismatch")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
g.ModifiedDate = time.Now()
|
||||
g.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PutGroup(&g)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, g, http.StatusOK)
|
||||
|
@ -275,7 +276,7 @@ func API_Groups_Id_Summary(w http.ResponseWriter, r *http.Request) {
|
|||
id, _ := strconv.ParseInt(vars["id"], 0, 64)
|
||||
g, err := models.GetGroupSummary(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Group not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Group not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, g, http.StatusOK)
|
||||
|
@ -297,27 +298,27 @@ func API_Templates(w http.ResponseWriter, r *http.Request) {
|
|||
// Put the request into a template
|
||||
err := json.NewDecoder(r.Body).Decode(&t)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Invalid JSON structure")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Invalid JSON structure")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
_, err = models.GetTemplateByName(t.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err != gorm.ErrRecordNotFound {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Template name already in use")}, http.StatusConflict)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Template name already in use")}, http.StatusConflict)
|
||||
return
|
||||
}
|
||||
t.ModifiedDate = time.Now()
|
||||
t.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PostTemplate(&t)
|
||||
if err == models.ErrTemplateNameNotSpecified {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if err == models.ErrTemplateMissingParameter {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error inserting template into database")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error inserting template into database")}, http.StatusInternalServerError)
|
||||
Logger.Println(err)
|
||||
return
|
||||
}
|
||||
|
@ -331,7 +332,7 @@ func API_Templates_Id(w http.ResponseWriter, r *http.Request) {
|
|||
id, _ := strconv.ParseInt(vars["id"], 0, 64)
|
||||
t, err := models.GetTemplate(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Template not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Template not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
switch {
|
||||
|
@ -340,10 +341,10 @@ func API_Templates_Id(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "DELETE":
|
||||
err = models.DeleteTemplate(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error deleting template")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error deleting template")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Template deleted successfully!")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Template deleted successfully!")}, http.StatusOK)
|
||||
case r.Method == "PUT":
|
||||
t = models.Template{}
|
||||
err = json.NewDecoder(r.Body).Decode(&t)
|
||||
|
@ -351,14 +352,14 @@ func API_Templates_Id(w http.ResponseWriter, r *http.Request) {
|
|||
Logger.Println(err)
|
||||
}
|
||||
if t.Id != id {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error: /:id and template_id mismatch")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error: /:id and template_id mismatch")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
t.ModifiedDate = time.Now()
|
||||
t.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PutTemplate(&t)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, t, http.StatusOK)
|
||||
|
@ -380,13 +381,13 @@ func API_Pages(w http.ResponseWriter, r *http.Request) {
|
|||
// Put the request into a page
|
||||
err := json.NewDecoder(r.Body).Decode(&p)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Invalid request")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Invalid request")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Check to make sure the name is unique
|
||||
_, err = models.GetPageByName(p.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err != gorm.ErrRecordNotFound {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Page name already in use")}, http.StatusConflict)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Page name already in use")}, http.StatusConflict)
|
||||
Logger.Println(err)
|
||||
return
|
||||
}
|
||||
|
@ -394,7 +395,7 @@ func API_Pages(w http.ResponseWriter, r *http.Request) {
|
|||
p.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PostPage(&p)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, p, http.StatusCreated)
|
||||
|
@ -408,7 +409,7 @@ func API_Pages_Id(w http.ResponseWriter, r *http.Request) {
|
|||
id, _ := strconv.ParseInt(vars["id"], 0, 64)
|
||||
p, err := models.GetPage(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Page not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Page not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
switch {
|
||||
|
@ -417,10 +418,10 @@ func API_Pages_Id(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "DELETE":
|
||||
err = models.DeletePage(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error deleting page")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error deleting page")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Page Deleted Successfully")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Page Deleted Successfully")}, http.StatusOK)
|
||||
case r.Method == "PUT":
|
||||
p = models.Page{}
|
||||
err = json.NewDecoder(r.Body).Decode(&p)
|
||||
|
@ -428,14 +429,14 @@ func API_Pages_Id(w http.ResponseWriter, r *http.Request) {
|
|||
Logger.Println(err)
|
||||
}
|
||||
if p.Id != id {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("/:id and /:page_id mismatch")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("/:id and /:page_id mismatch")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
p.ModifiedDate = time.Now()
|
||||
p.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PutPage(&p)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error updating page:") + " " + err.Error()}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error updating page:") + " " + err.Error()}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, p, http.StatusOK)
|
||||
|
@ -457,13 +458,13 @@ func API_SMTP(w http.ResponseWriter, r *http.Request) {
|
|||
// Put the request into a page
|
||||
err := json.NewDecoder(r.Body).Decode(&s)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Invalid request")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Invalid request")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Check to make sure the name is unique
|
||||
_, err = models.GetSMTPByName(s.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err != gorm.ErrRecordNotFound {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("SMTP name already in use")}, http.StatusConflict)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("SMTP name already in use")}, http.StatusConflict)
|
||||
Logger.Println(err)
|
||||
return
|
||||
}
|
||||
|
@ -471,7 +472,7 @@ func API_SMTP(w http.ResponseWriter, r *http.Request) {
|
|||
s.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PostSMTP(&s)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, s, http.StatusCreated)
|
||||
|
@ -485,7 +486,7 @@ func API_SMTP_Id(w http.ResponseWriter, r *http.Request) {
|
|||
id, _ := strconv.ParseInt(vars["id"], 0, 64)
|
||||
s, err := models.GetSMTP(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("SMTP not found")}, http.StatusNotFound)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("SMTP not found")}, http.StatusNotFound)
|
||||
return
|
||||
}
|
||||
switch {
|
||||
|
@ -494,10 +495,10 @@ func API_SMTP_Id(w http.ResponseWriter, r *http.Request) {
|
|||
case r.Method == "DELETE":
|
||||
err = models.DeleteSMTP(id, ctx.Get(r, "user_id").(int64))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error deleting SMTP")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error deleting SMTP")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("SMTP Deleted Successfully")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("SMTP Deleted Successfully")}, http.StatusOK)
|
||||
case r.Method == "PUT":
|
||||
s = models.SMTP{}
|
||||
err = json.NewDecoder(r.Body).Decode(&s)
|
||||
|
@ -505,19 +506,19 @@ func API_SMTP_Id(w http.ResponseWriter, r *http.Request) {
|
|||
Logger.Println(err)
|
||||
}
|
||||
if s.Id != id {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("/:id and /:smtp_id mismatch")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("/:id and /:smtp_id mismatch")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
err = s.Validate()
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
s.ModifiedDate = time.Now()
|
||||
s.UserId = ctx.Get(r, "user_id").(int64)
|
||||
err = models.PutSMTP(&s)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error updating page")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error updating page")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, s, http.StatusOK)
|
||||
|
@ -528,7 +529,7 @@ func API_SMTP_Id(w http.ResponseWriter, r *http.Request) {
|
|||
func API_Import_Group(w http.ResponseWriter, r *http.Request) {
|
||||
ts, err := util.ParseCSV(r)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error parsing CSV")}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error parsing CSV")}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, ts, http.StatusOK)
|
||||
|
@ -539,7 +540,7 @@ func API_Import_Group(w http.ResponseWriter, r *http.Request) {
|
|||
// Returns a Message object
|
||||
func API_Import_Email(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Method not allowed")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Method not allowed")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
ir := struct {
|
||||
|
@ -548,7 +549,7 @@ func API_Import_Email(w http.ResponseWriter, r *http.Request) {
|
|||
}{}
|
||||
err := json.NewDecoder(r.Body).Decode(&ir)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
e, err := email.NewEmailFromReader(strings.NewReader(ir.Content))
|
||||
|
@ -561,7 +562,7 @@ func API_Import_Email(w http.ResponseWriter, r *http.Request) {
|
|||
if ir.ConvertLinks {
|
||||
d, err := goquery.NewDocumentFromReader(bytes.NewReader(e.HTML))
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
d.Find("a").Each(func(i int, a *goquery.Selection) {
|
||||
|
@ -569,7 +570,7 @@ func API_Import_Email(w http.ResponseWriter, r *http.Request) {
|
|||
})
|
||||
h, err := d.Html()
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
e.HTML = []byte(h)
|
||||
|
@ -589,16 +590,16 @@ func API_Import_Email(w http.ResponseWriter, r *http.Request) {
|
|||
func API_Import_Site(w http.ResponseWriter, r *http.Request) {
|
||||
cr := cloneRequest{}
|
||||
if r.Method != "POST" {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Method not allowed")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Method not allowed")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
err := json.NewDecoder(r.Body).Decode(&cr)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if err = cr.validate(); err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
tr := &http.Transport{
|
||||
|
@ -609,13 +610,13 @@ func API_Import_Site(w http.ResponseWriter, r *http.Request) {
|
|||
client := &http.Client{Transport: tr}
|
||||
resp, err := client.Get(cr.URL)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Insert the base href tag to better handle relative resources
|
||||
d, err := goquery.NewDocumentFromResponse(resp)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Assuming we don't want to include resources, we'll need a base href
|
||||
|
@ -634,7 +635,7 @@ func API_Import_Site(w http.ResponseWriter, r *http.Request) {
|
|||
})
|
||||
h, err := d.Html()
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
cs := cloneResponse{HTML: h}
|
||||
|
@ -647,17 +648,17 @@ func API_Import_Site(w http.ResponseWriter, r *http.Request) {
|
|||
func API_Send_Test_Email(w http.ResponseWriter, r *http.Request) {
|
||||
s := &models.SendTestEmailRequest{}
|
||||
if r.Method != "POST" {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Method not allowed")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Method not allowed")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
err := json.NewDecoder(r.Body).Decode(s)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T("Error decoding JSON Request")}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
// Validate the given request
|
||||
if err = s.Validate(); err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -682,10 +683,10 @@ func API_Send_Test_Email(w http.ResponseWriter, r *http.Request) {
|
|||
s.Template, err = models.GetTemplateByName(s.Template.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
Logger.Printf("Error - Template %s does not exist", s.Template.Name)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(models.ErrTemplateNotFound.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(models.ErrTemplateNotFound.Error())}, http.StatusBadRequest)
|
||||
} else if err != nil {
|
||||
Logger.Println(err)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -696,10 +697,10 @@ func API_Send_Test_Email(w http.ResponseWriter, r *http.Request) {
|
|||
s.SMTP, err = models.GetSMTPByName(s.SMTP.Name, ctx.Get(r, "user_id").(int64))
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
Logger.Printf("Error - Sending profile %s does not exist", s.SMTP.Name)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(models.ErrSMTPNotFound.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(models.ErrSMTPNotFound.Error())}, http.StatusBadRequest)
|
||||
} else if err != nil {
|
||||
Logger.Println(err)
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusBadRequest)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -707,10 +708,10 @@ func API_Send_Test_Email(w http.ResponseWriter, r *http.Request) {
|
|||
// Send the test email
|
||||
err = worker.SendTestEmail(s)
|
||||
if err != nil {
|
||||
JSONResponse(w, models.Response{Success: false, Message: util.T(err.Error())}, http.StatusInternalServerError)
|
||||
JSONResponse(w, models.Response{Success: false, Message: translations.T(err.Error())}, http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
JSONResponse(w, models.Response{Success: true, Message: util.T("Email Sent")}, http.StatusOK)
|
||||
JSONResponse(w, models.Response{Success: true, Message: translations.T("Email Sent")}, http.StatusOK)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ import (
|
|||
"github.com/gorilla/csrf"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/gorilla/sessions"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Logger is used to send logging messages to stdout.
|
||||
|
@ -243,7 +243,7 @@ func PhishHandler(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
var htmlBuff bytes.Buffer
|
||||
tmpl, err := template.New("html_template").Funcs(template.FuncMap{
|
||||
"T": util.T,
|
||||
"T": translations.T,
|
||||
}).Parse(p.HTML)
|
||||
if err != nil {
|
||||
Logger.Println(err)
|
||||
|
@ -299,7 +299,7 @@ func Register(w http.ResponseWriter, r *http.Request) {
|
|||
params.Flashes = session.Flashes()
|
||||
session.Save(r, w)
|
||||
templates := template.New("template").Funcs(template.FuncMap{
|
||||
"T": util.T,
|
||||
"T": translations.T,
|
||||
})
|
||||
_, err := templates.ParseFiles("templates/register.html", "templates/flashes.html")
|
||||
if err != nil {
|
||||
|
@ -313,7 +313,7 @@ func Register(w http.ResponseWriter, r *http.Request) {
|
|||
if succ {
|
||||
session.AddFlash(models.Flash{
|
||||
Type: "success",
|
||||
Message: util.T("Registration successful!."),
|
||||
Message: translations.T("Registration successful!."),
|
||||
})
|
||||
session.Save(r, w)
|
||||
http.Redirect(w, r, "/login", 302)
|
||||
|
@ -429,9 +429,9 @@ func Settings(w http.ResponseWriter, r *http.Request) {
|
|||
getTemplate(w, "settings").ExecuteTemplate(w, "base", params)
|
||||
case r.Method == "POST":
|
||||
err := auth.ChangePassword(r)
|
||||
msg := models.Response{Success: true, Message: util.T("Settings Updated Successfully")}
|
||||
msg := models.Response{Success: true, Message: translations.T("Settings Updated Successfully")}
|
||||
if err == auth.ErrInvalidPassword {
|
||||
msg.Message = util.T("Invalid Password")
|
||||
msg.Message = translations.T("Invalid Password")
|
||||
msg.Success = false
|
||||
JSONResponse(w, msg, http.StatusBadRequest)
|
||||
return
|
||||
|
@ -461,7 +461,7 @@ func Login(w http.ResponseWriter, r *http.Request) {
|
|||
params.Flashes = session.Flashes()
|
||||
session.Save(r, w)
|
||||
templates := template.New("template").Funcs(template.FuncMap{
|
||||
"T": util.T,
|
||||
"T": translations.T,
|
||||
})
|
||||
_, err := templates.ParseFiles("templates/login.html", "templates/flashes.html")
|
||||
if err != nil {
|
||||
|
@ -480,7 +480,7 @@ func Login(w http.ResponseWriter, r *http.Request) {
|
|||
session.Save(r, w)
|
||||
http.Redirect(w, r, "/", 302)
|
||||
} else {
|
||||
Flash(w, r, "danger", util.T("Invalid Username/Password"))
|
||||
Flash(w, r, "danger", translations.T("Invalid Username/Password"))
|
||||
http.Redirect(w, r, "/login", 302)
|
||||
}
|
||||
}
|
||||
|
@ -492,14 +492,14 @@ func Logout(w http.ResponseWriter, r *http.Request) {
|
|||
// Now that we are all registered, we can log the user in
|
||||
session := ctx.Get(r, "session").(*sessions.Session)
|
||||
delete(session.Values, "id")
|
||||
Flash(w, r, "success", util.T("You have successfully logged out"))
|
||||
Flash(w, r, "success", translations.T("You have successfully logged out"))
|
||||
http.Redirect(w, r, "/login", 302)
|
||||
}
|
||||
|
||||
// Preview allows for the viewing of page html in a separate browser window
|
||||
func Preview(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method != "POST" {
|
||||
http.Error(w, util.T("Method not allowed"), http.StatusBadRequest)
|
||||
http.Error(w, translations.T("Method not allowed"), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(w, "%s", r.FormValue("html"))
|
||||
|
@ -509,18 +509,18 @@ func Preview(w http.ResponseWriter, r *http.Request) {
|
|||
func Clone(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
if r.Method != "POST" {
|
||||
http.Error(w, util.T("Method not allowed"), http.StatusBadRequest)
|
||||
http.Error(w, translations.T("Method not allowed"), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if url, ok := vars["url"]; ok {
|
||||
Logger.Println(url)
|
||||
}
|
||||
http.Error(w, util.T("No URL given."), http.StatusBadRequest)
|
||||
http.Error(w, translations.T("No URL given."), http.StatusBadRequest)
|
||||
}
|
||||
|
||||
func getTemplate(w http.ResponseWriter, tmpl string) *template.Template {
|
||||
templates := template.New("template").Funcs(template.FuncMap{
|
||||
"T": util.T,
|
||||
"T": translations.T,
|
||||
})
|
||||
_, err := templates.ParseFiles("templates/base.html", "templates/"+tmpl+".html", "templates/flashes.html")
|
||||
if err != nil {
|
||||
|
|
|
@ -39,6 +39,7 @@ import (
|
|||
"github.com/gophish/gophish/controllers"
|
||||
"github.com/gophish/gophish/models"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
"github.com/gorilla/handlers"
|
||||
)
|
||||
|
||||
|
@ -53,7 +54,7 @@ func main() {
|
|||
wg := &sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
|
||||
util.ChangeLang(config.Conf.AdminConf.Language)
|
||||
translations.ChangeLang(config.Conf.AdminConf.Language)
|
||||
// Start the web servers
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
ctx "github.com/gophish/gophish/context"
|
||||
"github.com/gophish/gophish/models"
|
||||
"github.com/gorilla/csrf"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
var CSRFExemptPrefixes = []string{
|
||||
|
@ -37,7 +37,7 @@ func GetContext(handler http.Handler) http.HandlerFunc {
|
|||
// Parse the request form
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
http.Error(w, util.T("Error parsing request"), http.StatusInternalServerError)
|
||||
http.Error(w, translations.T("Error parsing request"), http.StatusInternalServerError)
|
||||
}
|
||||
// Set the context appropriately here.
|
||||
// Set the session
|
||||
|
@ -78,7 +78,7 @@ func RequireAPIKey(handler http.Handler) http.HandlerFunc {
|
|||
} else {
|
||||
u, err := models.GetUserByAPIKey(ak)
|
||||
if err != nil {
|
||||
JSONError(w, 400, util.T("Invalid API Key"))
|
||||
JSONError(w, 400, translations.T("Invalid API Key"))
|
||||
return
|
||||
}
|
||||
r = ctx.Set(r, "user_id", u.Id)
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Campaign is a struct representing a created campaign
|
||||
|
@ -66,31 +66,31 @@ type CampaignStats struct {
|
|||
}
|
||||
|
||||
// ErrCampaignNameNotSpecified indicates there was no template given by the user
|
||||
var ErrCampaignNameNotSpecified = errors.New(util.T("Campaign name not specified"))
|
||||
var ErrCampaignNameNotSpecified = errors.New(translations.T("Campaign name not specified"))
|
||||
|
||||
// ErrGroupNotSpecified indicates there was no template given by the user
|
||||
var ErrGroupNotSpecified = errors.New(util.T("No groups specified"))
|
||||
var ErrGroupNotSpecified = errors.New(translations.T("No groups specified"))
|
||||
|
||||
// ErrTemplateNotSpecified indicates there was no template given by the user
|
||||
var ErrTemplateNotSpecified = errors.New(util.T("No email template specified"))
|
||||
var ErrTemplateNotSpecified = errors.New(translations.T("No email template specified"))
|
||||
|
||||
// ErrPageNotSpecified indicates a landing page was not provided for the campaign
|
||||
var ErrPageNotSpecified = errors.New(util.T("No landing page specified"))
|
||||
var ErrPageNotSpecified = errors.New(translations.T("No landing page specified"))
|
||||
|
||||
// ErrSMTPNotSpecified indicates a sending profile was not provided for the campaign
|
||||
var ErrSMTPNotSpecified = errors.New(util.T("No sending profile specified"))
|
||||
var ErrSMTPNotSpecified = errors.New(translations.T("No sending profile specified"))
|
||||
|
||||
// ErrTemplateNotFound indicates the template specified does not exist in the database
|
||||
var ErrTemplateNotFound = errors.New(util.T("Template not found"))
|
||||
var ErrTemplateNotFound = errors.New(translations.T("Template not found"))
|
||||
|
||||
// ErrGroupnNotFound indicates a group specified by the user does not exist in the database
|
||||
var ErrGroupNotFound = errors.New(util.T("Group not found"))
|
||||
var ErrGroupNotFound = errors.New(translations.T("Group not found"))
|
||||
|
||||
// ErrPageNotFound indicates a page specified by the user does not exist in the database
|
||||
var ErrPageNotFound = errors.New(util.T("Page not found"))
|
||||
var ErrPageNotFound = errors.New(translations.T("Page not found"))
|
||||
|
||||
// ErrSMTPNotFound indicates a sending profile specified by the user does not exist in the database
|
||||
var ErrSMTPNotFound = errors.New(util.T("Sending profile not found"))
|
||||
var ErrSMTPNotFound = errors.New(translations.T("Sending profile not found"))
|
||||
|
||||
// Validate checks to make sure there are no invalid fields in a submitted campaign
|
||||
func (c *Campaign) Validate() error {
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Group contains the fields needed for a user -> group mapping
|
||||
|
@ -52,13 +52,13 @@ type Target struct {
|
|||
}
|
||||
|
||||
// ErrNoEmailSpecified is thrown when no email is specified for the Target
|
||||
var ErrEmailNotSpecified = errors.New(util.T("No email address specified"))
|
||||
var ErrEmailNotSpecified = errors.New(translations.T("No email address specified"))
|
||||
|
||||
// ErrGroupNameNotSpecified is thrown when a group name is not specified
|
||||
var ErrGroupNameNotSpecified = errors.New(util.T("Group name not specified"))
|
||||
var ErrGroupNameNotSpecified = errors.New(translations.T("Group name not specified"))
|
||||
|
||||
// ErrNoTargetsSpecified is thrown when no targets are specified by the user
|
||||
var ErrNoTargetsSpecified = errors.New(util.T("No targets specified"))
|
||||
var ErrNoTargetsSpecified = errors.New(translations.T("No targets specified"))
|
||||
|
||||
// Validate performs validation on a group given by the user
|
||||
func (g *Group) Validate() error {
|
||||
|
|
|
@ -14,14 +14,14 @@ import (
|
|||
"github.com/gophish/gophish/config"
|
||||
"github.com/jinzhu/gorm"
|
||||
_ "github.com/mattn/go-sqlite3" // Blank import needed to import sqlite3
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
var db *gorm.DB
|
||||
var err error
|
||||
|
||||
// ErrUsernameTaken is thrown when a user attempts to register a username that is taken.
|
||||
var ErrUsernameTaken = errors.New(util.T("username already taken"))
|
||||
var ErrUsernameTaken = errors.New(translations.T("username already taken"))
|
||||
|
||||
// Logger is a global logger used to show informational, warning, and error messages
|
||||
var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/PuerkitoBio/goquery"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Page contains the fields used for a Page model
|
||||
|
@ -22,7 +22,7 @@ type Page struct {
|
|||
}
|
||||
|
||||
// ErrPageNameNotSpecified is thrown if the name of the landing page is blank.
|
||||
var ErrPageNameNotSpecified = errors.New(util.T("Page Name not specified"))
|
||||
var ErrPageNameNotSpecified = errors.New(translations.T("Page Name not specified"))
|
||||
|
||||
// parseHTML parses the page HTML on save to handle the
|
||||
// capturing (or lack thereof!) of credentials and passwords
|
||||
|
|
|
@ -8,7 +8,6 @@ import (
|
|||
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/oschwald/maxminddb-golang"
|
||||
"github.com/gophish/gophish/util"
|
||||
)
|
||||
|
||||
type mmCity struct {
|
||||
|
|
|
@ -6,7 +6,7 @@ import (
|
|||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// SMTP contains the attributes needed to handle the sending of campaign emails
|
||||
|
@ -25,14 +25,14 @@ type SMTP struct {
|
|||
|
||||
// ErrFromAddressNotSpecified is thrown when there is no "From" address
|
||||
// specified in the SMTP configuration
|
||||
var ErrFromAddressNotSpecified = errors.New(util.T("No From Address specified"))
|
||||
var ErrFromAddressNotSpecified = errors.New(translations.T("No From Address specified"))
|
||||
|
||||
// ErrHostNotSpecified is thrown when there is no Host specified
|
||||
// in the SMTP configuration
|
||||
var ErrHostNotSpecified = errors.New(util.T("No SMTP Host specified"))
|
||||
var ErrHostNotSpecified = errors.New(translations.T("No SMTP Host specified"))
|
||||
|
||||
// ErrInvalidHost indicates that the SMTP server string is invalid
|
||||
var ErrInvalidHost = errors.New(util.T("Invalid SMTP server address"))
|
||||
var ErrInvalidHost = errors.New(translations.T("Invalid SMTP server address"))
|
||||
|
||||
// TableName specifies the database tablename for Gorm to use
|
||||
func (s SMTP) TableName() string {
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/jinzhu/gorm"
|
||||
"github.com/gophish/gophish/util"
|
||||
"github.com/gophish/gophish/translations"
|
||||
)
|
||||
|
||||
// Template models hold the attributes for an email template to be sent to targets
|
||||
|
@ -23,10 +23,10 @@ type Template struct {
|
|||
}
|
||||
|
||||
// ErrTemplateNameNotSpecified is thrown when a template name is not specified
|
||||
var ErrTemplateNameNotSpecified = errors.New(util.T("Template name not specified"))
|
||||
var ErrTemplateNameNotSpecified = errors.New(translations.T("Template name not specified"))
|
||||
|
||||
// ErrTemplateMissingParameter is thrown when a needed parameter is not provided
|
||||
var ErrTemplateMissingParameter = errors.New(util.T("Need to specify at least plaintext or HTML content"))
|
||||
var ErrTemplateMissingParameter = errors.New(translations.T("Need to specify at least plaintext or HTML content"))
|
||||
|
||||
// Validate checks the given template to make sure values are appropriate and complete
|
||||
func (t *Template) Validate() error {
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li class="active"><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li class="active"><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
<li><a href="/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li class="active"><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</li>
|
||||
<li><a href="/campaigns">{{T "Campaigns"}}</a>
|
||||
</li>
|
||||
<li class="active"><a href="#/users">{{T "Users & Groups"}}</a>
|
||||
<li class="active"><a href="#/users">{{T "Users & Groups"}}</a>
|
||||
</li>
|
||||
<li><a href="/templates">{{T "Email Templates"}}</a>
|
||||
</li>
|
||||
|
@ -29,7 +29,7 @@
|
|||
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
|
||||
<div class="row">
|
||||
<h1 class="page-header">
|
||||
{{T "Users & Groups"}}
|
||||
{{T "Users & Groups"}}
|
||||
</h1>
|
||||
</div>
|
||||
<div id="flashes" class="row"></div>
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
package translations
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"github.com/nicksnyder/go-i18n/i18n"
|
||||
)
|
||||
|
||||
var B i18n.TranslateFunc
|
||||
var Lang = "en-US"
|
||||
|
||||
func T(text string) string{
|
||||
if B == nil {
|
||||
i18n.MustLoadTranslationFile("translations/" + strings.ToLower(Lang) + ".all.json")
|
||||
B, _ = i18n.Tfunc(Lang)
|
||||
}
|
||||
|
||||
return B(text)
|
||||
}
|
||||
|
||||
func ChangeLang(lang string) {
|
||||
Lang = lang
|
||||
B = nil
|
||||
}
|
||||
|
18
util/util.go
18
util/util.go
|
@ -18,31 +18,13 @@ import (
|
|||
"net/mail"
|
||||
"os"
|
||||
"time"
|
||||
"strings"
|
||||
|
||||
"github.com/gophish/gophish/models"
|
||||
"github.com/jordan-wright/email"
|
||||
"github.com/nicksnyder/go-i18n/i18n"
|
||||
)
|
||||
|
||||
// Logger is used to send logging messages to stdout.
|
||||
var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
||||
var B i18n.TranslateFunc
|
||||
var Lang = "en-US"
|
||||
|
||||
func T(text string) string{
|
||||
if B == nil {
|
||||
i18n.MustLoadTranslationFile("translations/" + strings.ToLower(Lang) + ".all.json")
|
||||
B, _ = i18n.Tfunc(Lang)
|
||||
}
|
||||
|
||||
return B(text)
|
||||
}
|
||||
|
||||
func ChangeLang(lang string) {
|
||||
Lang = lang
|
||||
B = nil
|
||||
}
|
||||
|
||||
// ParseMail takes in an HTTP Request and returns an Email object
|
||||
// TODO: This function will likely be changed to take in a []byte
|
||||
|
|
Loading…
Reference in New Issue