2014-01-09 06:42:05 +00:00
package controllers
import (
2014-01-13 02:00:20 +00:00
"encoding/json"
2014-01-09 06:42:05 +00:00
"fmt"
"net/http"
2014-02-01 02:49:22 +00:00
"strconv"
2014-01-31 22:25:02 +00:00
"time"
2014-01-09 06:42:05 +00:00
2014-01-13 02:00:20 +00:00
ctx "github.com/gorilla/context"
2014-01-09 06:42:05 +00:00
"github.com/gorilla/mux"
2014-01-31 04:46:25 +00:00
"github.com/jordan-wright/gophish/db"
"github.com/jordan-wright/gophish/models"
2014-01-09 06:42:05 +00:00
)
2014-01-31 22:25:02 +00:00
const (
IN_PROGRESS string = "In progress"
WAITING string = "Waiting"
COMPLETE string = "Completed"
ERROR string = "Error"
)
2014-02-01 03:49:35 +00:00
// API (/api) provides access to api documentation
2014-01-09 06:42:05 +00:00
func API ( w http . ResponseWriter , r * http . Request ) {
2014-02-01 03:49:35 +00:00
switch {
case r . Method == "GET" :
getTemplate ( w , "api_doc" ) . ExecuteTemplate ( w , "base" , nil )
2014-01-13 02:00:20 +00:00
}
2014-01-09 06:42:05 +00:00
}
2014-02-01 03:49:35 +00:00
// API_Campaigns returns a list of campaigns if requested via GET.
// If requested via POST, API_Campaigns creates a new campaign and returns a reference to it.
2014-01-09 06:42:05 +00:00
func API_Campaigns ( w http . ResponseWriter , r * http . Request ) {
switch {
case r . Method == "GET" :
2014-01-31 04:46:25 +00:00
cs := [ ] models . Campaign { }
2014-01-31 22:25:02 +00:00
_ , 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" ) )
2014-01-31 04:46:25 +00:00
if err != nil {
fmt . Println ( err )
}
2014-01-31 22:25:02 +00:00
cj , err := json . MarshalIndent ( cs , "" , " " )
if checkError ( err , w , "Error looking up campaigns" ) {
return
2014-01-31 04:46:25 +00:00
}
2014-01-31 22:25:02 +00:00
writeJSON ( w , cj )
2014-01-09 06:42:05 +00:00
case r . Method == "POST" :
2014-01-31 22:25:02 +00:00
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 )
2014-01-09 06:42:05 +00:00
}
}
2014-02-01 03:49:35 +00:00
// API_Campaigns_Id returns details about the requested campaign. If the campaign is not
// valid, API_Campaigns_Id returns null.
2014-01-09 06:42:05 +00:00
func API_Campaigns_Id ( w http . ResponseWriter , r * http . Request ) {
vars := mux . Vars ( r )
2014-02-01 02:49:22 +00:00
id , err := strconv . ParseInt ( vars [ "id" ] , 0 , 64 )
if checkError ( err , w , "Invalid Int" ) {
return
}
switch {
case r . Method == "GET" :
c := models . Campaign { }
err := db . Conn . SelectOne ( & c , "SELECT campaigns.id, name, created_date, completed_date, status, template FROM campaigns, users WHERE campaigns.uid=users.id AND campaigns.id =? AND users.api_key=?" , id , ctx . Get ( r , "api_key" ) )
if checkError ( err , w , "No campaign found" ) {
return
}
fmt . Printf ( "%v\n" , c )
cj , err := json . MarshalIndent ( c , "" , " " )
if checkError ( err , w , "Error creating JSON response" ) {
return
}
writeJSON ( w , cj )
case r . Method == "DELETE" :
//c := models.Campaign{}
}
2014-01-09 06:42:05 +00:00
}
2014-01-13 02:00:20 +00:00
func writeJSON ( w http . ResponseWriter , c [ ] byte ) {
w . Header ( ) . Set ( "Content-Type" , "application/json" )
fmt . Fprintf ( w , "%s" , c )
}