From 4a18ae2b6d3ae3347881fdd7187201a9746acfd7 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 24 Dec 2015 01:41:55 +0100 Subject: wip --- client.go | 89 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 37 deletions(-) (limited to 'client.go') diff --git a/client.go b/client.go index f10537f..1c21b7b 100644 --- a/client.go +++ b/client.go @@ -200,6 +200,15 @@ func (c *Client) Register(a *Account) error { return err } +func pickChallenge(c []Challenge) (int, Challenge) { + for i, ch := range c { + if canSolve[ch.Type] { + return i, ch + } + } + return -1, Challenge{} +} + func (c *Client) Authorize(a *Account, domain []string) error { ident := Identifier{ Type: IdentDNS, @@ -213,58 +222,64 @@ func (c *Client) Authorize(a *Account, domain []string) error { if err != nil { return err } - ns := parseHeader(resp) switch resp.StatusCode { case http.StatusCreated: - for _, ch := range r.Challenges { - if canSolve[ch.Type] { - ka, _ := Thumb(ch.Token, a.PrivKey.Public()) - ans := &Challenge{ - Resource: ResChallenge, - Type: ch.Type, - KeyAuthorization: ka, - } - _, err = c.post(ch.URI, a, ans) - switch ch.Type { - case ChallengeHTTP: - c := &httpChallenge{Addr: ":8080", Challenge: *ans} - if err := Solve(c); err != nil { - return err - } - } - } + n, ch := pickChallenge(r.Challenges) + if n < 0 { + return errors.New("can't solve any challenges") } - for { - az, ra, err := c.Status(ns.Location.String()) - if err != nil { - return err - } - log.Println(az) - log.Println(ra) - for _, ch := range az { - switch ch.Status { - case StatusPending, StatusProcessing: - default: - return nil - } - } - time.Sleep(ra) + + ka, _ := Thumb(ch.Token, a.PrivKey.Public()) + ans := &Challenge{ + Resource: ResChallenge, + Type: ch.Type, + KeyAuthorization: ka, + } + _, err = c.post(ch.URI, a, ans) + + var s Solver + + switch ch.Type { + case ChallengeHTTP: + s = &httpChallenge{Addr: "localhost:8080", Challenge: *ans} } + + if err := Solve(s); err != nil { + return err + } + + ns := parseHeader(resp) + done := make(chan bool) + go func() { + for { + c.Status(ns.Location.String(), n, done) + time.Sleep(time.Second) + } + }() + <-done } return err } -func (c *Client) Status(url string) ([]Challenge, time.Duration, error) { +func (c *Client) Status(url string, n int, done chan bool) error { r := &Authorization{} resp, err := http.Get(url) if err != nil { - return nil, time.Second, err + return err } defer resp.Body.Close() defer c.replyNonce(resp) - ns := parseHeader(resp) err = json.NewDecoder(resp.Body).Decode(r) - return r.Challenges, ns.RetryAfter, err + if err != nil { + return err + } + if r.Challenges[n].Status == StatusValid { + log.Println(ansi.Color("DONE", "red:white")) + done <- true + } + ns := parseHeader(resp) + log.Println(ansi.Color("NEXT", "black:yellow"), ns) + return nil } //////////////////////////////////////////////////////////////////////// -- cgit v1.2.3