From 46e4f83a631af25f0a616c9ffecf3bf715e606e3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 24 Dec 2015 00:49:22 +0100 Subject: Bikeshading --- account.go | 25 ++++++++----------------- client.go | 39 +++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/account.go b/account.go index 68dae50..0ce0643 100644 --- a/account.go +++ b/account.go @@ -2,7 +2,6 @@ package acme import ( "crypto/rsa" - "errors" "io" "net/mail" "strings" @@ -23,7 +22,11 @@ type Account struct { // NewAccount ... func NewAccount(key *rsa.PrivateKey) (*Account, error) { - return &Account{PrivKey: key}, nil + signer, err := jose.NewSigner(jose.RS256, key) + if err != nil { + return nil, err + } + return &Account{PrivKey: key, signer: signer}, nil } func (a *Account) AddMail(email string) error { @@ -44,24 +47,12 @@ func (a *Account) AddPhone(phone string) error { // Signer describes a signing interface type Signer interface { - Init(jose.NonceSource) error - Sign([]byte) (io.Reader, error) + Sign([]byte, jose.NonceSource) (io.Reader, error) } -func (a *Account) Init(n jose.NonceSource) error { - var err error - a.signer, err = jose.NewSigner(jose.RS256, a.PrivKey) - if err != nil { - return err - } +// Sign implements Signer interface +func (a *Account) Sign(msg []byte, n jose.NonceSource) (io.Reader, error) { a.signer.SetNonceSource(n) - return nil -} - -func (a *Account) Sign(msg []byte) (io.Reader, error) { - if a.signer == nil { - return nil, errors.New("init first") - } obj, err := a.signer.Sign(msg) if err != nil { return nil, err diff --git a/client.go b/client.go index 401fcfb..f10537f 100644 --- a/client.go +++ b/client.go @@ -14,18 +14,22 @@ import ( "github.com/mgutz/ansi" ) -type Links map[string]string - // Client ... type Client struct { Directory nonce chan string } -type nextStep struct { - Link Links - Location *url.URL - RetryAfter time.Duration +var errNoNonces = errors.New("out of nonces") + +// Nonce implements jose nonce provider +func (c Client) Nonce() (string, error) { + select { + case nonce := <-c.nonce: + return nonce, nil + default: + return "", errNoNonces + } } func (c Client) replyNonce(r *http.Response) { @@ -47,18 +51,6 @@ func NewClient(directory string) (*Client, error) { return c, json.NewDecoder(resp.Body).Decode(&c.Directory) } -var errNoNonces = errors.New("out of nonces") - -// Nonce implements jose nonce provider -func (c Client) Nonce() (string, error) { - select { - case nonce := <-c.nonce: - return nonce, nil - default: - return "", errNoNonces - } -} - // Important header fields // // Replay-Nonce each response, required for next request @@ -85,8 +77,7 @@ func (c *Client) post(uri string, s Signer, v interface{}) (*http.Response, erro } log.Println(ansi.Color("POST", "red+b"), uri, string(body)) - s.Init(c) - signed, err := s.Sign(body) + signed, err := s.Sign(body, c) if err != nil { return nil, err } @@ -121,6 +112,14 @@ func (c *Client) post(uri string, s Signer, v interface{}) (*http.Response, erro //return json.NewDecoder(resp.Body).Decode(v) } +type Links map[string]string + +type nextStep struct { + Link Links + Location *url.URL + RetryAfter time.Duration +} + var linksRe = regexp.MustCompile(`^<(.*)>;rel="(.*)"`) func parseHeader(r *http.Response) nextStep { -- cgit v1.2.3