github.com/merlinepedra/gopphish-attack@v0.9.0/controllers/api/server.go (about)

     1  package api
     2  
     3  import (
     4  	"net/http"
     5  
     6  	mid "github.com/gophish/gophish/middleware"
     7  	"github.com/gophish/gophish/models"
     8  	"github.com/gophish/gophish/worker"
     9  	"github.com/gorilla/mux"
    10  )
    11  
    12  // ServerOption is an option to apply to the API server.
    13  type ServerOption func(*Server)
    14  
    15  // Server represents the routes and functionality of the Gophish API.
    16  // It's not a server in the traditional sense, in that it isn't started and
    17  // stopped. Rather, it's meant to be used as an http.Handler in the
    18  // AdminServer.
    19  type Server struct {
    20  	handler http.Handler
    21  	worker  worker.Worker
    22  }
    23  
    24  // NewServer returns a new instance of the API handler with the provided
    25  // options applied.
    26  func NewServer(options ...ServerOption) *Server {
    27  	defaultWorker, _ := worker.New()
    28  	as := &Server{
    29  		worker: defaultWorker,
    30  	}
    31  	for _, opt := range options {
    32  		opt(as)
    33  	}
    34  	as.registerRoutes()
    35  	return as
    36  }
    37  
    38  // WithWorker is an option that sets the background worker.
    39  func WithWorker(w worker.Worker) ServerOption {
    40  	return func(as *Server) {
    41  		as.worker = w
    42  	}
    43  }
    44  
    45  func (as *Server) registerRoutes() {
    46  	root := mux.NewRouter()
    47  	root = root.StrictSlash(true)
    48  	router := root.PathPrefix("/api/").Subrouter()
    49  	router.Use(mid.RequireAPIKey)
    50  	router.Use(mid.EnforceViewOnly)
    51  	router.HandleFunc("/imap/", as.IMAPServer)
    52  	router.HandleFunc("/imap/validate", as.IMAPServerValidate)
    53  	router.HandleFunc("/reset", as.Reset)
    54  	router.HandleFunc("/campaigns/", as.Campaigns)
    55  	router.HandleFunc("/campaigns/summary", as.CampaignsSummary)
    56  	router.HandleFunc("/campaigns/{id:[0-9]+}", as.Campaign)
    57  	router.HandleFunc("/campaigns/{id:[0-9]+}/results", as.CampaignResults)
    58  	router.HandleFunc("/campaigns/{id:[0-9]+}/summary", as.CampaignSummary)
    59  	router.HandleFunc("/campaigns/{id:[0-9]+}/complete", as.CampaignComplete)
    60  	router.HandleFunc("/groups/", as.Groups)
    61  	router.HandleFunc("/groups/summary", as.GroupsSummary)
    62  	router.HandleFunc("/groups/{id:[0-9]+}", as.Group)
    63  	router.HandleFunc("/groups/{id:[0-9]+}/summary", as.GroupSummary)
    64  	router.HandleFunc("/templates/", as.Templates)
    65  	router.HandleFunc("/templates/{id:[0-9]+}", as.Template)
    66  	router.HandleFunc("/pages/", as.Pages)
    67  	router.HandleFunc("/pages/{id:[0-9]+}", as.Page)
    68  	router.HandleFunc("/smtp/", as.SendingProfiles)
    69  	router.HandleFunc("/smtp/{id:[0-9]+}", as.SendingProfile)
    70  	router.HandleFunc("/users/", mid.Use(as.Users, mid.RequirePermission(models.PermissionModifySystem)))
    71  	router.HandleFunc("/users/{id:[0-9]+}", mid.Use(as.User))
    72  	router.HandleFunc("/util/send_test_email", as.SendTestEmail)
    73  	router.HandleFunc("/import/group", as.ImportGroup)
    74  	router.HandleFunc("/import/email", as.ImportEmail)
    75  	router.HandleFunc("/import/site", as.ImportSite)
    76  	router.HandleFunc("/webhooks/", mid.Use(as.Webhooks, mid.RequirePermission(models.PermissionModifySystem)))
    77  	router.HandleFunc("/webhooks/{id:[0-9]+}/validate", mid.Use(as.ValidateWebhook, mid.RequirePermission(models.PermissionModifySystem)))
    78  	router.HandleFunc("/webhooks/{id:[0-9]+}", mid.Use(as.Webhook, mid.RequirePermission(models.PermissionModifySystem)))
    79  	as.handler = router
    80  }
    81  
    82  func (as *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    83  	as.handler.ServeHTTP(w, r)
    84  }