github.com/merlinepedra/gophish1@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 }