From 57a7772122b6a87ba67a534ba7346f1472e72cc4 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 8 Jan 2016 18:19:02 +0100 Subject: Move solver into client part, broken for now --- challange_http.go | 2 +- challenge.go | 32 +++--------------- cmd/acme/main.go | 9 +++++ cmd/acme/solve_http.go | 7 +++- cmd/acme/solve_webroot.go | 2 +- provider.go | 83 ++++++++++++++++++++++++----------------------- 6 files changed, 65 insertions(+), 70 deletions(-) diff --git a/challange_http.go b/challange_http.go index 4bdcff1..af50d93 100644 --- a/challange_http.go +++ b/challange_http.go @@ -10,7 +10,7 @@ import ( ) func init() { - registerSolver(ChallengeHTTP) + //RegisterSolver(ChallengeHTTP) } type httpChallenge struct { diff --git a/challenge.go b/challenge.go index 8357dc8..dd6d875 100644 --- a/challenge.go +++ b/challenge.go @@ -1,37 +1,15 @@ package acme -import ( - "errors" - "time" -) - // Solver decribes a solving interface type Solver interface { - Solve() error - Abort() error + Solve(token, keyAuth string) error + Finish() error } -var ( - canSolve = make(map[ChallengeType]bool) - errTimeOut = errors.New("time out") -) - const WellKnown = `/.well-known/acme-challenge/` -func registerSolver(c ChallengeType) { - canSolve[c] = true -} +var canSolve = make(map[ChallengeType]Solver) -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 - } +func RegisterSolver(c ChallengeType, s Solver) { + canSolve[c] = s } diff --git a/cmd/acme/main.go b/cmd/acme/main.go index 5567979..4534542 100644 --- a/cmd/acme/main.go +++ b/cmd/acme/main.go @@ -80,6 +80,15 @@ func main() { } } + if des.Webroot != "" { + ws := &webrootChallenge{Webroot: des.Webroot} + acme.RegisterSolver(acme.ChallengeHTTP, ws) + } else { + // TODO des.Register + hs := &httpChallenge{Addr: conf.Defaults.Listen} + acme.RegisterSolver(acme.ChallengeHTTP, hs) + } + wg.Add(1) go func(k string, des *desire) { log.Println("process", k) diff --git a/cmd/acme/solve_http.go b/cmd/acme/solve_http.go index c23e356..7d0572b 100644 --- a/cmd/acme/solve_http.go +++ b/cmd/acme/solve_http.go @@ -1,12 +1,17 @@ package main -import "net/http" +import ( + "log" + "net/http" +) type httpChallenge struct { http.Server + Addr string } func (c *httpChallenge) Solve(token, keyAuth string) error { + log.Println("solver", c) return nil } diff --git a/cmd/acme/solve_webroot.go b/cmd/acme/solve_webroot.go index 4d62f64..13b50e0 100644 --- a/cmd/acme/solve_webroot.go +++ b/cmd/acme/solve_webroot.go @@ -19,7 +19,7 @@ func (c *webrootChallenge) Solve(token, keyAuth string) error { return err } defer fd.Close() - _, err := fd.WriteString(keyAuth) + _, err = fd.Write([]byte(keyAuth)) return err } diff --git a/provider.go b/provider.go index a666204..a865ce8 100644 --- a/provider.go +++ b/provider.go @@ -204,13 +204,22 @@ func (p *Provider) Register(s Signer, c Contacts) error { return err } -func pickChallenge(c []Challenge) (int, Challenge) { - for i, ch := range c { - if canSolve[ch.Type] { - return i, ch +func pickChallanges(com []int, c []Challenge) bool { + for _, n := range com { + if _, ok := canSolve[c[n].Type]; !ok { + return false } } - return -1, Challenge{} + return true +} + +func pickCombination(a *Authorization) ([]int, error) { + for _, com := range a.Combinations { + if pickChallanges(com, a.Challenges) { + return com, nil + } + } + return nil, errors.New("cannot solve any challenges") } func (p *Provider) Authorize(s ThumbSigner, d *Desire) error { @@ -233,54 +242,48 @@ func (p *Provider) Authorize(s ThumbSigner, d *Desire) error { return errStatus } - n, ch := pickChallenge(r.Challenges) - if n < 0 { - return errors.New("can't solve any challenges") - } - - ka, _ := KeyAuthorization(s, ch.Token) - ans := &Challenge{ - Resource: ResChallenge, - Type: ch.Type, - KeyAuthorization: ka, - } - - resp, err = p.post(ch.URI, s, ans) + com, err := pickCombination(r) if err != nil { return err } - ns, err := p.parseJson(resp, ans) - if err != nil { - return err - } + for _, n := range com { + ch := r.Challenges[n] + ka, _ := KeyAuthorization(s, ch.Token) - var sol Solver + ans := &Challenge{ + Resource: ResChallenge, + Type: ch.Type, + KeyAuthorization: ka, + } - switch ch.Type { - case ChallengeHTTP: - sol = &httpChallenge{Addr: "localhost:8080", Challenge: *ans} - default: - return errChallengeType - } + resp, err = p.post(ch.URI, s, ans) + if err != nil { + return err + } - if err := Solve(sol, time.Minute); err != nil { - return err - } + ns, err := p.parseJson(resp, ans) + if err != nil { + return err + } - for { - done, err := p.queryStatus(ns.Location) + sol := canSolve[ch.Type] + err = sol.Solve(ch.Token, ka) if err != nil { return err } - if done { - break + defer sol.Finish() + + for { + done, err := p.queryStatus(ns.Location) + if err != nil { + return err + } + if done { + break + } } } - - if err != nil { - return err - } } return nil } -- cgit v1.2.3