aboutsummaryrefslogtreecommitdiff
path: root/client.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-12-24 01:41:55 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-12-24 01:41:55 +0100
commit4a18ae2b6d3ae3347881fdd7187201a9746acfd7 (patch)
treeab2716aa365d5597885719e9dba00cb8e50086cc /client.go
parent46e4f83a631af25f0a616c9ffecf3bf715e606e3 (diff)
wip
Diffstat (limited to 'client.go')
-rw-r--r--client.go89
1 files changed, 52 insertions, 37 deletions
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
}
////////////////////////////////////////////////////////////////////////