aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-12-25 16:03:37 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-12-25 16:03:37 +0100
commit1e28cc43c5691f90aae4d2b77e5ecaf52432f2eb (patch)
tree7e1877c324ffd145b84be15d99409647acb7a661
parenta262e55aab59f23ccce5b4ebe3771a1c5e792dc2 (diff)
timeout
-rw-r--r--challange_http.go14
-rw-r--r--challenge.go22
-rw-r--r--client.go14
-rw-r--r--cmd/acme/main.go10
4 files changed, 34 insertions, 26 deletions
diff --git a/challange_http.go b/challange_http.go
index 09f1db1..f971d87 100644
--- a/challange_http.go
+++ b/challange_http.go
@@ -22,8 +22,10 @@ type httpChallenge struct {
}
func (c *httpChallenge) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- io.WriteString(w, c.KeyAuthorization)
- c.done <- true
+ if r.URL.Path == path.Join(wellKnown, c.Token) {
+ io.WriteString(w, c.KeyAuthorization)
+ c.done <- true
+ }
}
func (c *httpChallenge) Solve() error {
@@ -33,14 +35,12 @@ func (c *httpChallenge) Solve() error {
return err
}
defer l.Close()
- s := &http.Server{Handler: c}
- s.SetKeepAlivesEnabled(false)
- go s.Serve(l)
+ go http.Serve(l, c)
<-c.done
return nil
}
-func (c *httpChallenge) Solved() error {
+func (c *httpChallenge) Abort() error {
c.done <- true
return nil
}
@@ -58,7 +58,7 @@ func (c *webRoot) Solve() error {
return ioutil.WriteFile(file, []byte(c.KeyAuthorization), 0644)
}
-func (c *webRoot) Solved() error {
+func (c *webRoot) Abort() error {
file := path.Join(c.Webroot, wellKnown, c.Token)
return os.Remove(file)
}
diff --git a/challenge.go b/challenge.go
index 7fee500..2571012 100644
--- a/challenge.go
+++ b/challenge.go
@@ -1,17 +1,33 @@
package acme
+import (
+ "errors"
+ "time"
+)
+
// Solver decribes a solving interface
type Solver interface {
Solve() error
- Solved() error
+ Abort() error
}
var canSolve = make(map[ChallengeType]bool)
+var errTimeOut = errors.New("time out")
func registerChallenge(c ChallengeType) {
canSolve[c] = true
}
-func Solve(s Solver) error {
- return s.Solve()
+func Solve(s Solver, timeout time.Duration) error {
+ errc := make(chan error)
+ go func() {
+ errc <- s.Solve()
+ }()
+ select {
+ case err := <-errc:
+ return err
+ case <-time.After(timeout):
+ s.Abort()
+ return errTimeOut
+ }
}
diff --git a/client.go b/client.go
index 7a1de7c..c7b4877 100644
--- a/client.go
+++ b/client.go
@@ -246,21 +246,13 @@ func (c *Client) Authorize(a *Account, altnames []string) error {
s = &httpChallenge{Addr: "localhost:8080", Challenge: *ans}
}
- errc := make(chan error)
- go func() {
- if err := Solve(s); err != nil {
- errc <- err
- }
- }()
- select {
- case err = <-errc:
+ if err := Solve(s, time.Minute); err != nil {
return err
- case <-time.After(5 * time.Second):
- return errTimedOut
}
ns := parseHeader(resp)
done := make(chan bool)
+ errc := make(chan error)
log.Println(ansi.Color("NextStep", "green"), ns)
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
@@ -276,7 +268,7 @@ func (c *Client) Authorize(a *Account, altnames []string) error {
select {
case <-done:
case err = <-errc:
- case <-time.After(5 * time.Second):
+ case <-time.After(30 * time.Second):
return errTimedOut
}
diff --git a/cmd/acme/main.go b/cmd/acme/main.go
index 90cfa5d..ab85637 100644
--- a/cmd/acme/main.go
+++ b/cmd/acme/main.go
@@ -94,28 +94,28 @@ func main() {
log.Println(k, a)
c, err := acme.NewClient(des.provider.Directory)
if err != nil {
- log.Println(err)
+ log.Fatal(err)
}
log.Println(k, c)
err = c.Register(a)
if err != nil {
- log.Println("register", err)
+ log.Fatal("register", err)
}
err = c.Authorize(a, des.Altnames)
if err != nil {
- log.Println("authz", err)
+ log.Fatal("authz", err)
}
crt, err := c.Cert(a, des.Altnames, des.key)
if err != nil {
- log.Println("cert", err)
+ log.Fatal("cert", err)
}
err = saveCert(des, crt)
if err != nil {
- log.Println("save cert", err)
+ log.Fatal("save cert", err)
}
}
}