aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-16 03:39:51 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-16 03:39:51 +0100
commite7174c090a23fe437d717d01fce44196305dea5f (patch)
treed6e2cf2d80e3ea7cad2cc55bc902af2beea3ecaa
parent5af20841fa5c341ea4d18c4c1e99946d12fffb08 (diff)
Experimantal
-rw-r--r--account.go1
-rw-r--r--client.go44
-rw-r--r--provider.go19
3 files changed, 58 insertions, 6 deletions
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
}