From a52095ab5024fe0e44179ad558f59cdbe389910d Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Thu, 7 Jan 2016 18:32:30 +0100 Subject: Refactor client --- account.go | 20 +++++++++++++-- cmd/acme/config.go | 40 ++++++++++++++---------------- cmd/acme/main.go | 73 ++++++++++++++++++++++++++++++++++++------------------ desire.go | 5 +--- 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 { -- cgit v1.2.3