From 180dda5b51fafcc972ece0f4cfedc25a615e3ecb Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 10 Dec 2015 13:32:14 +0100 Subject: Tweak methods --- account.go | 22 ++-------------------- client.go | 31 ++++++++++--------------------- cmd/x/main.go | 21 +++++++++++++++------ 3 files changed, 27 insertions(+), 47 deletions(-) diff --git a/account.go b/account.go index 38121f6..a74f2d0 100644 --- a/account.go +++ b/account.go @@ -4,7 +4,6 @@ import ( "crypto/rand" "crypto/rsa" "fmt" - "net/http" "net/mail" "github.com/square/go-jose" @@ -32,7 +31,6 @@ func NewAccount(email string, bits int) (*Account, error) { return &Account{ Contact: []string{"mailto:" + m.Address}, PrivKey: key, - nonce: make(chan string, 10), // shall be enough }, nil } @@ -40,14 +38,14 @@ func LoadAccount(email string) (*Account, error) { return nil, nil } -func (a *Account) Sign(msg []byte) ([]byte, error) { +func (a *Account) Sign(msg []byte, n jose.NonceSource) ([]byte, error) { if a.signer == nil { var err error a.signer, err = jose.NewSigner(jose.RS256, a.PrivKey) if err != nil { return nil, err } - a.signer.SetNonceSource(a) + a.signer.SetNonceSource(n) } obj, err := a.signer.Sign(msg) return []byte(obj.FullSerialize()), err @@ -61,19 +59,3 @@ func (a *Account) ParseSigned(msg []byte) ([]byte, error) { } return obj.Verify(&a.PrivKey.PublicKey) } - -// Nonce implements jose nonce provider -func (a Account) Nonce() (string, error) { - select { - case nonce := <-a.nonce: - return nonce, nil - default: - return "", errNoNonces - } -} - -func (a Account) parseNonce(r *http.Response) { - if nonce := replyNonce(r); nonce != "" { - a.nonce <- nonce - } -} diff --git a/client.go b/client.go index 5b178a8..b144e6f 100644 --- a/client.go +++ b/client.go @@ -9,20 +9,21 @@ import ( "net/textproto" "regexp" "time" + + "github.com/square/go-jose" ) type Solver interface { Solve() } -type NonceSigner interface { - Sign([]byte) ([]byte, error) - parseNonce(*http.Response) +type Signer interface { + Sign([]byte, jose.NonceSource) ([]byte, error) } type Client struct { - directory Directory - nonce chan string + Dir Directory + nonce chan string } // NewClient fetches directory and initializes nonce @@ -34,7 +35,7 @@ func NewClient(uri string) (*Client, error) { defer resp.Body.Close() c := &Client{nonce: make(chan string, 10)} c.nonce <- replyNonce(resp) - err = json.NewDecoder(resp.Body).Decode(&c.directory) + err = json.NewDecoder(resp.Body).Decode(&c.Dir) if err != nil { return nil, err } @@ -53,18 +54,6 @@ func (c Client) Nonce() (string, error) { } } -// Get is used for -// directory, authz, cert -func Get(s NonceSigner, uri string, v interface{}) error { - resp, err := http.Get(uri) - if err != nil { - return err - } - defer resp.Body.Close() - s.parseNonce(resp) - return json.NewDecoder(resp.Body).Decode(v) -} - // Important header fields // // Replay-Nonce each response, required for next request @@ -82,13 +71,13 @@ func Get(s NonceSigner, uri string, v interface{}) error { // Post is used for // new-reg, new-authz, challenge, new-cert -func Post(s NonceSigner, uri string, v interface{}) (*http.Response, error) { +func (c Client) Post(s Signer, uri string, v interface{}) (*http.Response, error) { body, err := json.Marshal(v) if err != nil { return nil, err } - signed, err := s.Sign(body) + signed, err := s.Sign(body, c) if err != nil { return nil, err } @@ -99,7 +88,7 @@ func Post(s NonceSigner, uri string, v interface{}) (*http.Response, error) { return nil, err } - s.parseNonce(resp) + c.nonce <- replyNonce(resp) if resp.StatusCode >= http.StatusBadRequest { return nil, handleError(resp) diff --git a/cmd/x/main.go b/cmd/x/main.go index 51ebbc4..a876cec 100644 --- a/cmd/x/main.go +++ b/cmd/x/main.go @@ -1,6 +1,7 @@ package main import ( + "io/ioutil" "log" "dim13.org/acme" @@ -12,11 +13,19 @@ func main() { log.Fatal(err) } log.Printf("%+v\n", c) - for { - n, err := c.Nonce() - if err != nil { - break - } - log.Printf("%+v\n", n) + a, err := acme.NewAccount("another@example.com", acme.KeySize) + if err != nil { + log.Fatal(err) + } + resp, err := c.Post(a, c.Dir.NewReg, acme.NewRegistration(a.Contact, acme.NewReg{})) + if err != nil { + log.Fatal(err) } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + log.Println(string(body)) + } -- cgit v1.2.3