mirror of https://github.com/gophish/gophish
97 lines
2.9 KiB
Go
97 lines
2.9 KiB
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
ctx "github.com/gophish/gophish/context"
|
||
|
log "github.com/gophish/gophish/logger"
|
||
|
"github.com/gophish/gophish/models"
|
||
|
"github.com/gorilla/mux"
|
||
|
"github.com/jinzhu/gorm"
|
||
|
)
|
||
|
|
||
|
// SendingProfiles handles requests for the /api/smtp/ endpoint
|
||
|
func (as *Server) SendingProfiles(w http.ResponseWriter, r *http.Request) {
|
||
|
switch {
|
||
|
case r.Method == "GET":
|
||
|
ss, err := models.GetSMTPs(ctx.Get(r, "user_id").(int64))
|
||
|
if err != nil {
|
||
|
log.Error(err)
|
||
|
}
|
||
|
JSONResponse(w, ss, http.StatusOK)
|
||
|
//POST: Create a new SMTP and return it as JSON
|
||
|
case r.Method == "POST":
|
||
|
s := models.SMTP{}
|
||
|
// Put the request into a page
|
||
|
err := json.NewDecoder(r.Body).Decode(&s)
|
||
|
if err != nil {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: "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: "SMTP name already in use"}, http.StatusConflict)
|
||
|
log.Error(err)
|
||
|
return
|
||
|
}
|
||
|
s.ModifiedDate = time.Now().UTC()
|
||
|
s.UserId = ctx.Get(r, "user_id").(int64)
|
||
|
err = models.PostSMTP(&s)
|
||
|
if err != nil {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
JSONResponse(w, s, http.StatusCreated)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// SendingProfile contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
|
||
|
// of a SMTP object
|
||
|
func (as *Server) SendingProfile(w http.ResponseWriter, r *http.Request) {
|
||
|
vars := mux.Vars(r)
|
||
|
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: "SMTP not found"}, http.StatusNotFound)
|
||
|
return
|
||
|
}
|
||
|
switch {
|
||
|
case r.Method == "GET":
|
||
|
JSONResponse(w, s, http.StatusOK)
|
||
|
case r.Method == "DELETE":
|
||
|
err = models.DeleteSMTP(id, ctx.Get(r, "user_id").(int64))
|
||
|
if err != nil {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: "Error deleting SMTP"}, http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
JSONResponse(w, models.Response{Success: true, Message: "SMTP Deleted Successfully"}, http.StatusOK)
|
||
|
case r.Method == "PUT":
|
||
|
s = models.SMTP{}
|
||
|
err = json.NewDecoder(r.Body).Decode(&s)
|
||
|
if err != nil {
|
||
|
log.Error(err)
|
||
|
}
|
||
|
if s.Id != id {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: "/:id and /:smtp_id mismatch"}, http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
err = s.Validate()
|
||
|
if err != nil {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
|
||
|
return
|
||
|
}
|
||
|
s.ModifiedDate = time.Now().UTC()
|
||
|
s.UserId = ctx.Get(r, "user_id").(int64)
|
||
|
err = models.PutSMTP(&s)
|
||
|
if err != nil {
|
||
|
JSONResponse(w, models.Response{Success: false, Message: "Error updating page"}, http.StatusInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
JSONResponse(w, s, http.StatusOK)
|
||
|
}
|
||
|
}
|