github.com/glennzw/gophish@v0.8.1-0.20190824020715-24fe998a3aa0/controllers/api/smtp.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"strconv"
     7  	"time"
     8  
     9  	ctx "github.com/gophish/gophish/context"
    10  	log "github.com/gophish/gophish/logger"
    11  	"github.com/gophish/gophish/models"
    12  	"github.com/gorilla/mux"
    13  	"github.com/jinzhu/gorm"
    14  )
    15  
    16  // SendingProfiles handles requests for the /api/smtp/ endpoint
    17  func (as *Server) SendingProfiles(w http.ResponseWriter, r *http.Request) {
    18  	switch {
    19  	case r.Method == "GET":
    20  		ss, err := models.GetSMTPs(ctx.Get(r, "user_id").(int64))
    21  		if err != nil {
    22  			log.Error(err)
    23  		}
    24  		JSONResponse(w, ss, http.StatusOK)
    25  	//POST: Create a new SMTP and return it as JSON
    26  	case r.Method == "POST":
    27  		s := models.SMTP{}
    28  		// Put the request into a page
    29  		err := json.NewDecoder(r.Body).Decode(&s)
    30  		if err != nil {
    31  			JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
    32  			return
    33  		}
    34  		// Check to make sure the name is unique
    35  		_, err = models.GetSMTPByName(s.Name, ctx.Get(r, "user_id").(int64))
    36  		if err != gorm.ErrRecordNotFound {
    37  			JSONResponse(w, models.Response{Success: false, Message: "SMTP name already in use"}, http.StatusConflict)
    38  			log.Error(err)
    39  			return
    40  		}
    41  		s.ModifiedDate = time.Now().UTC()
    42  		s.UserId = ctx.Get(r, "user_id").(int64)
    43  		err = models.PostSMTP(&s)
    44  		if err != nil {
    45  			JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
    46  			return
    47  		}
    48  		JSONResponse(w, s, http.StatusCreated)
    49  	}
    50  }
    51  
    52  // SendingProfile contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
    53  // of a SMTP object
    54  func (as *Server) SendingProfile(w http.ResponseWriter, r *http.Request) {
    55  	vars := mux.Vars(r)
    56  	id, _ := strconv.ParseInt(vars["id"], 0, 64)
    57  	s, err := models.GetSMTP(id, ctx.Get(r, "user_id").(int64))
    58  	if err != nil {
    59  		JSONResponse(w, models.Response{Success: false, Message: "SMTP not found"}, http.StatusNotFound)
    60  		return
    61  	}
    62  	switch {
    63  	case r.Method == "GET":
    64  		JSONResponse(w, s, http.StatusOK)
    65  	case r.Method == "DELETE":
    66  		err = models.DeleteSMTP(id, ctx.Get(r, "user_id").(int64))
    67  		if err != nil {
    68  			JSONResponse(w, models.Response{Success: false, Message: "Error deleting SMTP"}, http.StatusInternalServerError)
    69  			return
    70  		}
    71  		JSONResponse(w, models.Response{Success: true, Message: "SMTP Deleted Successfully"}, http.StatusOK)
    72  	case r.Method == "PUT":
    73  		s = models.SMTP{}
    74  		err = json.NewDecoder(r.Body).Decode(&s)
    75  		if err != nil {
    76  			log.Error(err)
    77  		}
    78  		if s.Id != id {
    79  			JSONResponse(w, models.Response{Success: false, Message: "/:id and /:smtp_id mismatch"}, http.StatusBadRequest)
    80  			return
    81  		}
    82  		err = s.Validate()
    83  		if err != nil {
    84  			JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusBadRequest)
    85  			return
    86  		}
    87  		s.ModifiedDate = time.Now().UTC()
    88  		s.UserId = ctx.Get(r, "user_id").(int64)
    89  		err = models.PutSMTP(&s)
    90  		if err != nil {
    91  			JSONResponse(w, models.Response{Success: false, Message: "Error updating page"}, http.StatusInternalServerError)
    92  			return
    93  		}
    94  		JSONResponse(w, s, http.StatusOK)
    95  	}
    96  }