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 --- provider.go | 83 ++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 40 deletions(-) (limited to 'provider.go') 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