aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-07 18:32:30 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-07 18:32:30 +0100
commita52095ab5024fe0e44179ad558f59cdbe389910d (patch)
treedd78d959fdc8b48d2deb98c982d97ef34c8cb27e
parentcbdfe178da985033d15593078cc6b56ae8215a19 (diff)
Refactor client
-rw-r--r--account.go20
-rw-r--r--cmd/acme/config.go40
-rw-r--r--cmd/acme/main.go73
-rw-r--r--desire.go5
4 files changed, 86 insertions, 52 deletions
diff --git a/account.go b/account.go
index 46cc88c..34040d6 100644
--- a/account.go
+++ b/account.go
@@ -2,6 +2,7 @@ package acme
import (
"crypto"
+ "crypto/rand"
"crypto/rsa"
"encoding/base64"
"encoding/json"
@@ -21,8 +22,23 @@ type Account struct {
nonce chan string
}
-// NewAccount ...
-func NewAccount(key *rsa.PrivateKey) (*Account, error) {
+func LoadAccount(fname string) (*Account, error) {
+ key, err := LoadKeyFile(fname)
+ if err != nil {
+ return nil, err
+ }
+ return newAccount(key)
+}
+
+func NewAccount(size int) (*Account, error) {
+ key, err := rsa.GenerateKey(rand.Reader, size)
+ if err != nil {
+ return nil, err
+ }
+ return newAccount(key)
+}
+
+func newAccount(key *rsa.PrivateKey) (*Account, error) {
signer, err := jose.NewSigner(jose.RS256, key)
if err != nil {
return nil, err
diff --git a/cmd/acme/config.go b/cmd/acme/config.go
index e904e96..eca8117 100644
--- a/cmd/acme/config.go
+++ b/cmd/acme/config.go
@@ -1,8 +1,6 @@
package main
import (
- "crypto/rsa"
- "crypto/x509"
"errors"
"os"
"path"
@@ -36,16 +34,16 @@ type defaults struct {
type provider struct {
Directory string
+ *acme.Provider
}
type account struct {
- Mail string
- Phone string
- Size int
- Key string
- key *rsa.PrivateKey
- account *acme.Account
- needsRegister bool
+ Mail string
+ Phone string
+ Size int
+ Key string
+ *acme.Account
+ acme.Contacts
}
type hook struct {
@@ -53,19 +51,17 @@ type hook struct {
}
type desire struct {
- Provider string
- Account string
- Altnames []string
- Size int
- Key string
- Cert string
- Webroot string
- Hooks []string
- provider *provider
- account *account
- key *rsa.PrivateKey
- chain []*x509.Certificate
- needsNewCert bool
+ Provider string
+ Account string
+ Altnames []string
+ Size int
+ Key string
+ Cert string
+ Webroot string
+ Hooks []string
+ provider *provider
+ account *account
+ *acme.Desire
}
var (
diff --git a/cmd/acme/main.go b/cmd/acme/main.go
index 370bbf2..898536e 100644
--- a/cmd/acme/main.go
+++ b/cmd/acme/main.go
@@ -5,6 +5,7 @@ import (
"flag"
"log"
"os"
+ "sync"
"dim13.org/acme"
)
@@ -37,35 +38,59 @@ func main() {
log.Fatal(err)
}
+ var wg sync.WaitGroup
+
for k, acc := range conf.Account {
- acc.key, err = chkKey(acc)
- if err != nil {
- log.Fatal(err)
- }
- conf.Account[k] = acc
+ wg.Add(1)
+ go func(k string, acc *account) {
+ defer wg.Done()
+ log.Println("LoadAccount", k)
+ acc.Account, err = acme.LoadAccount(acc.Key)
+ if err != nil {
+ log.Println(err)
+ log.Println("NewAccount", k)
+ acc.Account, err = acme.NewAccount(acc.Size)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }
+ acc.Contacts.AddMail(acc.Mail)
+ acc.Contacts.AddPhone(acc.Phone)
+ conf.Account[k] = acc
+ }(k, acc)
}
for k, des := range conf.Desire {
- des.key, err = chkKey(des)
- if err != nil {
- log.Fatal(err)
- }
- conf.Desire[k] = des
+ wg.Add(1)
+ go func(k string, des *desire) {
+ defer wg.Done()
+ log.Println("NewDesire", k)
+ des.Desire, err = acme.NewDesire(des.Altnames, des.Size)
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf.Desire[k] = des
+ }(k, des)
}
- for k, des := range conf.Desire {
- a, _ := acme.NewAccount(des.account.key)
- c := acme.Contacts{}
- c.AddMail(des.account.Mail)
- c.AddPhone(des.account.Phone)
- log.Println(k, a)
- p, err := acme.NewProvider(des.provider.Directory)
- if err != nil {
- log.Fatal(err)
- }
- log.Println(k, p)
+ for k, pro := range conf.Provider {
+ wg.Add(1)
+ go func(k string, pro *provider) {
+ defer wg.Done()
+ log.Println("NewProvider", k)
+ pro.Provider, err = acme.NewProvider(pro.Directory)
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf.Provider[k] = pro
+ }(k, pro)
+ }
- err = p.Register(a, c)
+ wg.Wait()
+
+ for k, des := range conf.Desire {
+ log.Println("process", k)
+ err = des.provider.Register(des.account, des.account.Contacts)
if err != nil {
log.Fatal("register", err)
}
@@ -75,12 +100,12 @@ func main() {
log.Fatal("newDesire", err)
}
- err = p.Authorize(a, d)
+ err = des.provider.Authorize(des.account, d)
if err != nil {
log.Fatal("authz", err)
}
- err = p.Cert(a, d)
+ err = des.provider.Cert(des.account, d)
if err != nil {
log.Fatal("cert", err)
}
diff --git a/desire.go b/desire.go
index 38899d4..3a5b741 100644
--- a/desire.go
+++ b/desire.go
@@ -19,10 +19,7 @@ func NewDesire(altnames []string, size int) (*Desire, error) {
if err != nil {
return nil, err
}
- return &Desire{
- key: key,
- altnames: altnames,
- }, nil
+ return &Desire{key: key, altnames: altnames}, nil
}
func (d *Desire) SaveKey(fname string) error {