mirror of https://github.com/gophish/gophish
Still working on pages integration. Added skeleton for page HTML previewing in a new browser.
Additional cleanup, documentation Changed return values for /api/templates and /api/pages to return empty array [] if no results (like /api/campaigns was already doing)pull/24/head
parent
c318424ac0
commit
c8be0ddb74
|
@ -188,8 +188,8 @@ func API_Templates(w http.ResponseWriter, r *http.Request) {
|
||||||
switch {
|
switch {
|
||||||
case r.Method == "GET":
|
case r.Method == "GET":
|
||||||
ts, err := models.GetTemplates(ctx.Get(r, "user_id").(int64))
|
ts, err := models.GetTemplates(ctx.Get(r, "user_id").(int64))
|
||||||
if checkError(err, w, "Templates not found", http.StatusNotFound) {
|
if err != nil {
|
||||||
return
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
JSONResponse(w, ts, http.StatusOK)
|
JSONResponse(w, ts, http.StatusOK)
|
||||||
//POST: Create a new template and return it as JSON
|
//POST: Create a new template and return it as JSON
|
||||||
|
@ -261,8 +261,8 @@ func API_Pages(w http.ResponseWriter, r *http.Request) {
|
||||||
switch {
|
switch {
|
||||||
case r.Method == "GET":
|
case r.Method == "GET":
|
||||||
ps, err := models.GetPages(ctx.Get(r, "user_id").(int64))
|
ps, err := models.GetPages(ctx.Get(r, "user_id").(int64))
|
||||||
if checkError(err, w, "Pages not found", http.StatusNotFound) {
|
if err != nil {
|
||||||
return
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
JSONResponse(w, ps, http.StatusOK)
|
JSONResponse(w, ps, http.StatusOK)
|
||||||
//POST: Create a new page and return it as JSON
|
//POST: Create a new page and return it as JSON
|
||||||
|
|
|
@ -16,6 +16,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var templateDelims = []string{"{{%", "%}}"}
|
var templateDelims = []string{"{{%", "%}}"}
|
||||||
|
|
||||||
|
// Logger is used to send logging messages to stdout.
|
||||||
var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
||||||
|
|
||||||
// CreateAdminRouter creates the routes for handling requests to the web interface.
|
// CreateAdminRouter creates the routes for handling requests to the web interface.
|
||||||
|
@ -23,11 +25,12 @@ var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
||||||
func CreateAdminRouter() http.Handler {
|
func CreateAdminRouter() http.Handler {
|
||||||
router := mux.NewRouter()
|
router := mux.NewRouter()
|
||||||
// Base Front-end routes
|
// Base Front-end routes
|
||||||
|
router.HandleFunc("/", Use(Base, mid.RequireLogin))
|
||||||
router.HandleFunc("/login", Login)
|
router.HandleFunc("/login", Login)
|
||||||
router.HandleFunc("/logout", Use(Logout, mid.RequireLogin))
|
router.HandleFunc("/logout", Use(Logout, mid.RequireLogin))
|
||||||
router.HandleFunc("/register", Register)
|
router.HandleFunc("/register", Register)
|
||||||
router.HandleFunc("/", Use(Base, mid.RequireLogin))
|
|
||||||
router.HandleFunc("/settings", Use(Settings, mid.RequireLogin))
|
router.HandleFunc("/settings", Use(Settings, mid.RequireLogin))
|
||||||
|
router.HandleFunc("/preview", Use(Preview, mid.RequireLogin))
|
||||||
// Create the API routes
|
// Create the API routes
|
||||||
api := router.PathPrefix("/api").Subrouter()
|
api := router.PathPrefix("/api").Subrouter()
|
||||||
api = api.StrictSlash(true)
|
api = api.StrictSlash(true)
|
||||||
|
@ -144,16 +147,6 @@ func Register(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logout destroys the current user session
|
|
||||||
func Logout(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// If it is a post request, attempt to register the account
|
|
||||||
// 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", "You have successfully logged out")
|
|
||||||
http.Redirect(w, r, "login", 302)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Base handles the default path and template execution
|
// Base handles the default path and template execution
|
||||||
func Base(w http.ResponseWriter, r *http.Request) {
|
func Base(w http.ResponseWriter, r *http.Request) {
|
||||||
// Example of using session - will be removed.
|
// Example of using session - will be removed.
|
||||||
|
@ -221,6 +214,24 @@ func Login(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Logout destroys the current user session
|
||||||
|
func Logout(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// If it is a post request, attempt to register the account
|
||||||
|
// 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", "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, "Method not allowed", http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
getTemplate(w, "dashboard").ExecuteTemplate(w, "base", struct{}{})
|
||||||
|
}
|
||||||
|
|
||||||
func getTemplate(w http.ResponseWriter, tmpl string) *template.Template {
|
func getTemplate(w http.ResponseWriter, tmpl string) *template.Template {
|
||||||
templates := template.New("template")
|
templates := template.New("template")
|
||||||
templates.Delims(templateDelims[0], templateDelims[1])
|
templates.Delims(templateDelims[0], templateDelims[1])
|
||||||
|
@ -241,6 +252,7 @@ func checkError(e error, w http.ResponseWriter, m string, c int) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flash handles the rendering flash messages
|
||||||
func Flash(w http.ResponseWriter, r *http.Request, t string, m string) {
|
func Flash(w http.ResponseWriter, r *http.Request, t string, m string) {
|
||||||
session := ctx.Get(r, "session").(*sessions.Session)
|
session := ctx.Get(r, "session").(*sessions.Session)
|
||||||
session.AddFlash(models.Flash{
|
session.AddFlash(models.Flash{
|
||||||
|
|
|
@ -15,7 +15,9 @@ type Campaign struct {
|
||||||
CreatedDate time.Time `json:"created_date"`
|
CreatedDate time.Time `json:"created_date"`
|
||||||
CompletedDate time.Time `json:"completed_date"`
|
CompletedDate time.Time `json:"completed_date"`
|
||||||
TemplateId int64 `json:"-"`
|
TemplateId int64 `json:"-"`
|
||||||
Template Template `json:"template"` //This may change
|
Template Template `json:"template"`
|
||||||
|
PageId int64 `json:"-"`
|
||||||
|
Page Page `json:"page"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
EmailsSent string `json:"emails_sent"`
|
EmailsSent string `json:"emails_sent"`
|
||||||
Results []Result `json:"results,omitempty"`
|
Results []Result `json:"results,omitempty"`
|
||||||
|
@ -24,6 +26,7 @@ type Campaign struct {
|
||||||
SMTP SMTP `json:"smtp"`
|
SMTP SMTP `json:"smtp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate checks to make sure there are no invalid fields in a submitted campaign
|
||||||
func (c *Campaign) Validate() (string, bool) {
|
func (c *Campaign) Validate() (string, bool) {
|
||||||
switch {
|
switch {
|
||||||
case c.Name == "":
|
case c.Name == "":
|
||||||
|
@ -36,11 +39,13 @@ func (c *Campaign) Validate() (string, bool) {
|
||||||
return "", true
|
return "", true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateStatus changes the campaign status appropriately
|
||||||
func (c *Campaign) UpdateStatus(s string) error {
|
func (c *Campaign) UpdateStatus(s string) error {
|
||||||
// This could be made simpler, but I think there's a bug in gorm
|
// This could be made simpler, but I think there's a bug in gorm
|
||||||
return db.Table("campaigns").Where("id=?", c.Id).Update("status", s).Error
|
return db.Table("campaigns").Where("id=?", c.Id).Update("status", s).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddEvent creates a new campaign event in the database
|
||||||
func (c *Campaign) AddEvent(e Event) error {
|
func (c *Campaign) AddEvent(e Event) error {
|
||||||
e.CampaignId = c.Id
|
e.CampaignId = c.Id
|
||||||
e.Time = time.Now()
|
e.Time = time.Now()
|
||||||
|
|
|
@ -58,8 +58,12 @@ func GetPageByName(n string, uid int64) (Page, error) {
|
||||||
|
|
||||||
// PostPage creates a new page in the database.
|
// PostPage creates a new page in the database.
|
||||||
func PostPage(p *Page) error {
|
func PostPage(p *Page) error {
|
||||||
|
err := p.Validate()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
// Insert into the DB
|
// Insert into the DB
|
||||||
err := db.Save(p).Error
|
err = db.Save(p).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Logger.Println(err)
|
Logger.Println(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
<div ng-show="!campaigns.length">
|
<div ng-show="!campaigns.length">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
No campaigns yet.
|
No campaigns created yet. Let's create one!
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -33,7 +33,14 @@
|
||||||
<button type="button" class="btn btn-primary" ng-click="editPage('new')" data-toggle="modal" data-target="#newLandingPageModal"><i class="fa fa-plus"></i> New Page</button>
|
<button type="button" class="btn btn-primary" ng-click="editPage('new')" data-toggle="modal" data-target="#newLandingPageModal"><i class="fa fa-plus"></i> New Page</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div ng-show="!pages.length">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<div class="alert alert-info">
|
||||||
|
No pages created yet. Let's create one!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="pages.length" class="row">
|
||||||
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="page in $data" class="editable-row">
|
<tr ng-repeat="page in $data" class="editable-row">
|
||||||
|
|
|
@ -32,5 +32,5 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
|
||||||
<button type="button" class="btn btn-primary" ng-click="ok(template)" data-dismiss="modal">Save Page</button>
|
<button type="button" class="btn btn-primary" ng-click="ok(page)" data-dismiss="modal">Save Page</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -28,7 +28,14 @@
|
||||||
<button type="button" class="btn btn-primary" ng-click="editTemplate('new')"><i class="fa fa-plus"></i> New Template</button>
|
<button type="button" class="btn btn-primary" ng-click="editTemplate('new')"><i class="fa fa-plus"></i> New Template</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div ng-show="!templates.length">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<div class="alert alert-info">
|
||||||
|
No templates created yet. Let's create one!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="templates.length" class="row">
|
||||||
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="template in $data" class="editable-row">
|
<tr ng-repeat="template in $data" class="editable-row">
|
||||||
|
|
|
@ -33,7 +33,14 @@
|
||||||
<button type="button" class="btn btn-primary" ng-click="editGroup('new')" data-toggle="modal" data-target="#newGroupModal"><i class="fa fa-plus"></i> New Group</button>
|
<button type="button" class="btn btn-primary" ng-click="editGroup('new')" data-toggle="modal" data-target="#newGroupModal"><i class="fa fa-plus"></i> New Group</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div ng-show="!groups.length">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<div class="alert alert-info">
|
||||||
|
No groups created yet. Let's create one!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ng-show="groups.length" class="row">
|
||||||
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
<table ng-table="mainTableParams" class="table table-hover table-striped table-bordered">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="group in $data" class="editable-row">
|
<tr ng-repeat="group in $data" class="editable-row">
|
||||||
|
|
Loading…
Reference in New Issue