package acme import ( "io" "net/http" "os" "path" ) // WellKnown URL path const WellKnown = `/.well-known/acme-challenge/` // Solver decribes a solving interface type Solver interface { Solve(token, keyAuth string) error Solved() error } type httpSolver struct { http.Server } func NewHTTPSolver(addr string) Solver { var s httpSolver s.Server = http.Server{Addr: addr} go s.ListenAndServe() return &s } func (s *httpSolver) Solve(token, keyAuth string) error { p := path.Join(WellKnown, token) http.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, keyAuth) }) return nil } func (s *httpSolver) Solved() error { return nil } type webRootSolver struct { webroot string file string } func NewWebRootSolver(webroot string) Solver { return &webRootSolver{webroot: webroot} } func (s *webRootSolver) Solve(token, keyAuth string) error { s.file = path.Join(s.webroot, WellKnown, token) fd, err := CreatePubFile(s.file) if err != nil { return err } defer fd.Close() _, err = io.WriteString(fd, keyAuth) return err } func (s *webRootSolver) Solved() error { return os.Remove(s.file) } type tlsSolver struct { http.Server } func (s tlsSolver) Solve(token, keyAuth string) error { return nil }