From e7174c090a23fe437d717d01fce44196305dea5f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 16 Jan 2016 03:39:51 +0100 Subject: Experimantal --- account.go | 1 - client.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ provider.go | 19 ++++++++++++++----- 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 client.go diff --git a/account.go b/account.go index 14368eb..75a5b1c 100644 --- a/account.go +++ b/account.go @@ -19,7 +19,6 @@ const KeySize = 2048 type Account struct { key *rsa.PrivateKey signer jose.Signer - nonce chan string } func LoadAccount(fname string) (*Account, error) { diff --git a/client.go b/client.go new file mode 100644 index 0000000..45562bc --- /dev/null +++ b/client.go @@ -0,0 +1,44 @@ +package acme + +import "encoding/json" + +type Client struct { + Location string + Link map[string]string + Directory + Signer +} + +func NewClient(p Provider, s Signer) (*Client, error) { + var dir Directory + resp, err := p.Get(p.dir) + if err != nil { + return nil, err + } + p.nonce(resp) // get first nonce + err = json.NewDecoder(resp.Body).Decode(&dir) + if err != nil { + return nil, err + } + return &Client{Directory: dir, Signer: s}, nil +} + +func (c *Client) newReg(p Provider, s Signer, con Contacts) error { + r := &Registration{ + Resource: ResNewReg, + Contact: con, + } + resp, err := p.post(c.NewReg, s, r) + if err != nil { + return err + } + p.nonce(resp) + r = &Registration{ + Resource: ResReg, + Agreement: c.Link["terms-of-service"], + } + if _, err := p.postJson(c.Location, s, r); err != nil { + return err + } + return nil +} diff --git a/provider.go b/provider.go index 79aa959..755e8c6 100644 --- a/provider.go +++ b/provider.go @@ -16,6 +16,7 @@ type Provider struct { Directory nonces chan string http.Client + dir string } var ( @@ -35,6 +36,13 @@ func (p Provider) Nonce() (string, error) { } } +func (p Provider) nonce(resp *http.Response) { + if rn := resp.Header.Get("Replay-Nonce"); rn != "" { + p.nonces <- rn + } + log.Println("# nonces", len(p.nonces)) +} + // NewProvider fetches directory and initializes nonce func NewProvider(directory string) (*Provider, error) { p := &Provider{ @@ -42,6 +50,7 @@ func NewProvider(directory string) (*Provider, error) { Client: http.Client{ Timeout: time.Duration(5 * time.Second), }, + dir: directory, } return p, p.getJson(directory, &p.Directory) } @@ -51,7 +60,9 @@ func (p *Provider) post(uri string, s Signer, v interface{}) (*http.Response, er if err != nil { return nil, err } - return p.Post(uri, "application/jose+json", signed) + resp, err := p.Post(uri, "application/jose+json", signed) + p.nonce(resp) + return resp, err } func (p *Provider) postJson(uri string, s Signer, v interface{}) (nextStep, error) { @@ -78,6 +89,7 @@ func (p *Provider) getJson(uri string, v interface{}) error { if err != nil { return err } + p.nonce(resp) _, err = p.parseJson(resp, v) return err } @@ -87,6 +99,7 @@ func (p *Provider) getCert(uri string) (*x509.Certificate, error) { if err != nil { return nil, err } + p.nonce(resp) log.Println("get len", resp.ContentLength) crt, _, err := p.parseCert(resp) return crt, err @@ -111,10 +124,6 @@ func (p *Provider) parseHeader(resp *http.Response) nextStep { ns.Link[re[2]] = re[1] } } - if rn := resp.Header.Get("Replay-Nonce"); rn != "" { - log.Println("# nonces", len(p.nonces)) - p.nonces <- rn - } return ns } -- cgit v1.2.3