aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2015-12-10 13:32:14 +0100
committerDimitri Sokolyuk <demon@dim13.org>2015-12-10 13:32:14 +0100
commit180dda5b51fafcc972ece0f4cfedc25a615e3ecb (patch)
treeb1c2ea633a4f6a792e7ac6d9587a1a983063a4db
parent54f6c23a9670700e8a7d14858173e19221e16550 (diff)
Tweak methods
-rw-r--r--account.go22
-rw-r--r--client.go31
-rw-r--r--cmd/x/main.go21
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))
+
}