aboutsummaryrefslogtreecommitdiff
path: root/provider.go
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 /provider.go
parent88611642648c047f54632a98619e865d0081b6dd (diff)
Move solver into client part, broken for now
Diffstat (limited to 'provider.go')
-rw-r--r--provider.go83
1 files changed, 43 insertions, 40 deletions
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
}