package core import ( "github.com/gorilla/mux" "net/http" "time" "github.com/kgretzky/evilginx2/log" ) type HttpServer struct { srv *http.Server acmeTokens map[string]string } func NewHttpServer() (*HttpServer, error) { s := &HttpServer{} s.acmeTokens = make(map[string]string) r := mux.NewRouter() s.srv = &http.Server{ Handler: r, Addr: ":80", WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } r.HandleFunc("/.well-known/acme-challenge/{token}", s.handleACMEChallenge).Methods("GET") r.PathPrefix("/").HandlerFunc(s.handleRedirect) return s, nil } func (s *HttpServer) Start() { go s.srv.ListenAndServe() } func (s *HttpServer) AddACMEToken(token string, keyAuth string) { s.acmeTokens[token] = keyAuth } func (s *HttpServer) ClearACMETokens() { s.acmeTokens = make(map[string]string) } func (s *HttpServer) handleACMEChallenge(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) token := vars["token"] key, ok := s.acmeTokens[token] if !ok { w.WriteHeader(http.StatusNotFound) return } log.Debug("http: found ACME verification token for URL: %s", r.URL.Path) w.WriteHeader(http.StatusOK) w.Header().Set("content-type", "text/plain") w.Write([]byte(key)) } func (s *HttpServer) handleRedirect(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "https://"+r.Host+r.URL.String(), http.StatusFound) }