Implemented POST /api/campaigns

Renamed "apikey" table to "api_key" for consistency
Bug fix in checkError()
pull/24/head
Jordan 2014-01-31 16:25:02 -06:00
parent 6802fe6800
commit c4c57639e2
4 changed files with 57 additions and 23 deletions

View File

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"time"
ctx "github.com/gorilla/context" ctx "github.com/gorilla/context"
"github.com/gorilla/mux" "github.com/gorilla/mux"
@ -11,6 +12,13 @@ import (
"github.com/jordan-wright/gophish/models" "github.com/jordan-wright/gophish/models"
) )
const (
IN_PROGRESS string = "In progress"
WAITING string = "Waiting"
COMPLETE string = "Completed"
ERROR string = "Error"
)
func API(w http.ResponseWriter, r *http.Request) { func API(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" { if r.Method == "GET" {
@ -32,19 +40,39 @@ func API_Campaigns(w http.ResponseWriter, r *http.Request) {
switch { switch {
case r.Method == "GET": case r.Method == "GET":
cs := []models.Campaign{} cs := []models.Campaign{}
_, err := db.Conn.Select(&cs, "SELECT name, created_date, completed_date, status, template FROM campaigns, users WHERE campaigns.uid=users.id AND users.apikey=?", ctx.Get(r, "api_key")) _, err := db.Conn.Select(&cs, "SELECT campaigns.id, name, created_date, completed_date, status, template FROM campaigns, users WHERE campaigns.uid=users.id AND users.api_key=?", ctx.Get(r, "api_key"))
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} }
d, err := json.MarshalIndent(cs, "", " ") cj, err := json.MarshalIndent(cs, "", " ")
if err != nil { if checkError(err, w, "Error looking up campaigns") {
fmt.Println(err) return
} }
writeJSON(w, d) writeJSON(w, cj)
case r.Method == "POST": case r.Method == "POST":
fmt.Fprintf(w, "Hello POST!") c := models.Campaign{}
// Put the request into a campaign
err := json.NewDecoder(r.Body).Decode(&c)
checkError(err, w, "Invalid Request")
// Fill in the details
c.CreatedDate = time.Now()
c.CompletedDate = time.Time{}
c.Status = IN_PROGRESS
c.Uid, err = db.Conn.SelectInt("SELECT id FROM users WHERE api_key=?", ctx.Get(r, "api_key"))
if checkError(err, w, "Invalid API Key") {
return
}
// Insert into the DB
err = db.Conn.Insert(&c)
if checkError(err, w, "Cannot insert campaign into database") {
return
}
cj, err := json.MarshalIndent(c, "", " ")
if checkError(err, w, "Error creating JSON response") {
return
}
writeJSON(w, cj)
} }
//fmt.Fprintf(w, "Hello api")
} }
//API_Campaigns_Id returns details about the requested campaign. If the campaign is not //API_Campaigns_Id returns details about the requested campaign. If the campaign is not

View File

@ -122,9 +122,13 @@ func Login(w http.ResponseWriter, r *http.Request) {
case r.Method == "POST": case r.Method == "POST":
//Attempt to login //Attempt to login
err := r.ParseForm() err := r.ParseForm()
checkError(err, w, "Error parsing request") if checkError(err, w, "Error parsing request") {
return
}
succ, err := auth.Login(r) succ, err := auth.Login(r)
checkError(err, w, "Error logging in") if checkError(err, w, "Error logging in") {
return
}
//If we've logged in, save the session and redirect to the dashboard //If we've logged in, save the session and redirect to the dashboard
if succ { if succ {
session.Save(r, w) session.Save(r, w)
@ -144,9 +148,11 @@ func getTemplate(w http.ResponseWriter, tmpl string) *template.Template {
return template.Must(template.New("template").ParseFiles("templates/base.html", "templates/nav.html", "templates/"+tmpl+".html", "templates/flashes.html")) return template.Must(template.New("template").ParseFiles("templates/base.html", "templates/nav.html", "templates/"+tmpl+".html", "templates/flashes.html"))
} }
func checkError(e error, w http.ResponseWriter, m string) { func checkError(e error, w http.ResponseWriter, m string) bool {
if e != nil { if e != nil {
fmt.Println(e) fmt.Println(e)
http.Error(w, m, http.StatusInternalServerError) http.Error(w, "Error: "+m, http.StatusInternalServerError)
return true
} }
return false
} }

View File

@ -29,7 +29,7 @@ func Setup() error {
fmt.Println("Database not found, recreating...") fmt.Println("Database not found, recreating...")
createTablesSQL := []string{ createTablesSQL := []string{
//Create tables //Create tables
`CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, hash VARCHAR(60) NOT NULL, apikey VARCHAR(32));`, `CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, hash VARCHAR(60) NOT NULL, api_key VARCHAR(32));`,
`CREATE TABLE campaigns (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, created_date TIMESTAMP NOT NULL, completed_date TIMESTAMP, template TEXT, status TEXT NOT NULL, uid INTEGER, FOREIGN KEY (uid) REFERENCES Users(id));`, `CREATE TABLE campaigns (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, created_date TIMESTAMP NOT NULL, completed_date TIMESTAMP, template TEXT, status TEXT NOT NULL, uid INTEGER, FOREIGN KEY (uid) REFERENCES Users(id));`,
} }
fmt.Println("Creating db at " + config.Conf.DBPath) fmt.Println("Creating db at " + config.Conf.DBPath)

View File

@ -22,10 +22,10 @@ type Config struct {
// User represents the user model for gophish. // User represents the user model for gophish.
type User struct { type User struct {
Id int `json:"id"` Id int64 `json:"id"`
Username string `json:"username"` Username string `json:"username"`
Hash string `json:"-"` Hash string `json:"-"`
APIKey string `json:"apikey"` APIKey string `json:"api_key" db:"api_key"`
} }
// Flash is used to hold flash information for use in templates. // Flash is used to hold flash information for use in templates.
@ -36,32 +36,32 @@ type Flash struct {
//Campaign is a struct representing a created campaign //Campaign is a struct representing a created campaign
type Campaign struct { type Campaign struct {
Id int `json:"id"` Id int64 `json:"id"`
Name string `json:"name"` Name string `json:"name"`
CreatedDate time.Time `json:"created_date" db:"created_date"` CreatedDate time.Time `json:"created_date" db:"created_date"`
CompletedDate time.Time `json:"completed_date" db:"completed_date"` CompletedDate time.Time `json:"completed_date" db:"completed_date"`
Template string `json:"template"` //This may change Template string `json:"template"` //This may change
Status string `json:"status"` Status string `json:"status"`
Uid int `json:"-"` Uid int64 `json:"-"`
} }
type UserCampaigns struct { type UserCampaigns struct {
CampaignId int CampaignId int64
UserId int UserId int64
} }
type Result struct { type Result struct {
Id int Id int64
TargetId int TargetId int64
Status string `json:"status"` Status string `json:"status"`
} }
type CampaignResults struct { type CampaignResults struct {
CampaignId int CampaignId int64
TargetId int TargetId int64
} }
type Target struct { type Target struct {
Id int `json:"-"` Id int64 `json:"-"`
Email mail.Address `json:"email"` Email mail.Address `json:"email"`
} }