aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-08 18:19:02 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-08 18:19:02 +0100
commit57a7772122b6a87ba67a534ba7346f1472e72cc4 (patch)
tree3f535b9cabde176eb1e8716bfe438ea351e4ae4e
parent88611642648c047f54632a98619e865d0081b6dd (diff)
Move solver into client part, broken for now
-rw-r--r--challange_http.go2
-rw-r--r--challenge.go32
-rw-r--r--cmd/acme/main.go9
-rw-r--r--cmd/acme/solve_http.go7
-rw-r--r--cmd/acme/solve_webroot.go2
-rw-r--r--provider.go83
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
}