mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-08-23 10:52:44 +02:00
Initial open source release
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
"github.com/phishingclub/phishingclub/api"
|
||||
"github.com/phishingclub/phishingclub/database"
|
||||
"github.com/phishingclub/phishingclub/errs"
|
||||
"github.com/phishingclub/phishingclub/model"
|
||||
"github.com/phishingclub/phishingclub/repository"
|
||||
"github.com/phishingclub/phishingclub/service"
|
||||
"github.com/phishingclub/phishingclub/vo"
|
||||
)
|
||||
|
||||
// SMTPConfigurationColumnsMap is a map between the frontend and the backend
|
||||
// so the frontend has user friendly names instead of direct references
|
||||
// to the database schema
|
||||
// this is tied to a slice in the repository package
|
||||
var SMTPConfigurationColumnsMap = map[string]string{
|
||||
"created_at": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "created_at"),
|
||||
"updated_at": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "updated_at"),
|
||||
"name": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "name"),
|
||||
"host": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "host"),
|
||||
"port": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "port"),
|
||||
"username": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "username"),
|
||||
}
|
||||
|
||||
// SMTPConfiguration is a controller
|
||||
type SMTPConfiguration struct {
|
||||
Common
|
||||
SMTPConfigurationService *service.SMTPConfiguration
|
||||
}
|
||||
|
||||
// Create creates a new SMTPConfiguration
|
||||
func (c *SMTPConfiguration) Create(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
var req model.SMTPConfiguration
|
||||
if ok := c.handleParseRequest(g, &req); !ok {
|
||||
return
|
||||
}
|
||||
// save SMTP configuration
|
||||
id, err := c.SMTPConfigurationService.Create(g, session, &req)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(
|
||||
g,
|
||||
gin.H{
|
||||
"id": id.String(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
// GetAll gets SMTP configurations
|
||||
func (c *SMTPConfiguration) GetAll(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
queryArgs, ok := c.handleQueryArgs(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
queryArgs.DefaultSortByUpdatedAt()
|
||||
queryArgs.RemapOrderBy(SMTPConfigurationColumnsMap)
|
||||
companyID := companyIDFromRequestQuery(g)
|
||||
// get
|
||||
smtpConfigs, err := c.SMTPConfigurationService.GetAll(
|
||||
g.Request.Context(),
|
||||
session,
|
||||
companyID,
|
||||
&repository.SMTPConfigurationOption{
|
||||
QueryArgs: queryArgs,
|
||||
WithCompany: true,
|
||||
WithHeaders: true,
|
||||
},
|
||||
)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, smtpConfigs)
|
||||
}
|
||||
|
||||
// GetByID gets a SMTP configuration by an ID
|
||||
func (c *SMTPConfiguration) GetByID(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
id, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// get SMTP configuration
|
||||
smtpConfig, err := c.SMTPConfigurationService.GetByID(
|
||||
g.Request.Context(),
|
||||
session,
|
||||
id,
|
||||
&repository.SMTPConfigurationOption{
|
||||
WithCompany: true,
|
||||
WithHeaders: true,
|
||||
},
|
||||
)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, smtpConfig)
|
||||
}
|
||||
|
||||
type SMTPConfigurationTestEmailRequest struct {
|
||||
Email vo.Email `json:"email" binding:"required,email"`
|
||||
MailFrom vo.Email `json:"mailFrom" binding:"required,mailFrom"`
|
||||
}
|
||||
|
||||
// TestEmail tests the connection to a SMTP configuration
|
||||
func (c *SMTPConfiguration) TestEmail(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
id, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
var req SMTPConfigurationTestEmailRequest
|
||||
if ok := c.handleParseRequest(g, &req); !ok {
|
||||
return
|
||||
}
|
||||
// test dial
|
||||
err := c.SMTPConfigurationService.SendTestEmail(
|
||||
g,
|
||||
session,
|
||||
id,
|
||||
&req.Email,
|
||||
&req.MailFrom,
|
||||
)
|
||||
// handle any error as a validation error
|
||||
if err != nil {
|
||||
err = errs.NewValidationError(err)
|
||||
}
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, gin.H{})
|
||||
}
|
||||
|
||||
// UpdateByID updates a SMTP configuration - but not the headers
|
||||
func (c *SMTPConfiguration) UpdateByID(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
id, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
var req model.SMTPConfiguration
|
||||
if ok := c.handleParseRequest(g, &req); !ok {
|
||||
return
|
||||
}
|
||||
err := c.SMTPConfigurationService.UpdateByID(
|
||||
g.Request.Context(),
|
||||
session,
|
||||
id,
|
||||
&req,
|
||||
)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, gin.H{})
|
||||
}
|
||||
|
||||
// AddHeader adds a header to a SMTP configuration
|
||||
func (c *SMTPConfiguration) AddHeader(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
var req model.SMTPHeader
|
||||
if ok := c.handleParseRequest(g, &req); !ok {
|
||||
return
|
||||
}
|
||||
// save header
|
||||
smtpID, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
createdID, err := c.SMTPConfigurationService.AddHeader(
|
||||
g.Request.Context(),
|
||||
session,
|
||||
smtpID,
|
||||
&req,
|
||||
)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, gin.H{
|
||||
"id": createdID.String(),
|
||||
})
|
||||
}
|
||||
|
||||
// RemoveHeader removes a header from a SMTP configuration
|
||||
func (c *SMTPConfiguration) RemoveHeader(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
id, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
headerID, err := uuid.Parse(g.Param("headerID"))
|
||||
if err != nil {
|
||||
c.Logger.Debugw("invalid header id",
|
||||
"headerID", g.Param("headerID"),
|
||||
"error", err,
|
||||
)
|
||||
c.Response.BadRequestMessage(g, api.InvalidSMTPConfigurationID)
|
||||
return
|
||||
}
|
||||
// remove header
|
||||
err = c.SMTPConfigurationService.RemoveHeader(
|
||||
g.Request.Context(),
|
||||
session,
|
||||
id,
|
||||
&headerID,
|
||||
)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, gin.H{})
|
||||
}
|
||||
|
||||
// DeleteByID deletes a SMTP configuration
|
||||
func (c *SMTPConfiguration) DeleteByID(g *gin.Context) {
|
||||
session, _, ok := c.handleSession(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// parse request
|
||||
id, ok := c.handleParseIDParam(g)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
// delete
|
||||
err := c.SMTPConfigurationService.DeleteByID(g, session, id)
|
||||
// handle response
|
||||
if ok := c.handleErrors(g, err); !ok {
|
||||
return
|
||||
}
|
||||
c.Response.OK(g, gin.H{})
|
||||
}
|
||||
Reference in New Issue
Block a user