mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-29 12:16:16 +08:00
98 lines
2.0 KiB
Go
98 lines
2.0 KiB
Go
|
package letsencrypt
|
||
|
|
||
|
import (
|
||
|
"crypto/rand"
|
||
|
"crypto/rsa"
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
|
||
|
"github.com/xenolf/lego/acme"
|
||
|
)
|
||
|
|
||
|
type User struct {
|
||
|
Email string
|
||
|
Registration *acme.RegistrationResource
|
||
|
KeyFile string
|
||
|
key *rsa.PrivateKey
|
||
|
}
|
||
|
|
||
|
func (u User) GetEmail() string {
|
||
|
return u.Email
|
||
|
}
|
||
|
func (u User) GetRegistration() *acme.RegistrationResource {
|
||
|
return u.Registration
|
||
|
}
|
||
|
func (u User) GetPrivateKey() *rsa.PrivateKey {
|
||
|
return u.key
|
||
|
}
|
||
|
|
||
|
// getUser loads the user with the given email from disk.
|
||
|
func getUser(email string) (User, error) {
|
||
|
var user User
|
||
|
|
||
|
// open user file
|
||
|
regFile, err := os.Open(storage.UserRegFile(email))
|
||
|
if err != nil {
|
||
|
if os.IsNotExist(err) {
|
||
|
// create a new user
|
||
|
return newUser(email)
|
||
|
}
|
||
|
return user, err
|
||
|
}
|
||
|
defer regFile.Close()
|
||
|
|
||
|
// load user information
|
||
|
err = json.NewDecoder(regFile).Decode(&user)
|
||
|
if err != nil {
|
||
|
return user, err
|
||
|
}
|
||
|
|
||
|
// load their private key
|
||
|
user.key, err = loadRSAPrivateKey(user.KeyFile)
|
||
|
if err != nil {
|
||
|
return user, err
|
||
|
}
|
||
|
|
||
|
return user, nil
|
||
|
}
|
||
|
|
||
|
// saveUser persists a user's key and account registration
|
||
|
// to the file system.
|
||
|
func saveUser(user User) error {
|
||
|
// make user account folder
|
||
|
err := os.MkdirAll(storage.User(user.Email), 0700)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// save private key file
|
||
|
user.KeyFile = storage.UserKeyFile(user.Email)
|
||
|
err = saveRSAPrivateKey(user.key, user.KeyFile)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// save registration file
|
||
|
jsonBytes, err := json.MarshalIndent(&user, "", "\t")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return ioutil.WriteFile(storage.UserRegFile(user.Email), jsonBytes, 0600)
|
||
|
}
|
||
|
|
||
|
// newUser creates a new User for the given email address
|
||
|
// with a new private key. This function does not register
|
||
|
// the user via ACME.
|
||
|
func newUser(email string) (User, error) {
|
||
|
user := User{Email: email}
|
||
|
privateKey, err := rsa.GenerateKey(rand.Reader, rsaKeySize)
|
||
|
if err != nil {
|
||
|
return user, errors.New("error generating private key: " + err.Error())
|
||
|
}
|
||
|
user.key = privateKey
|
||
|
return user, nil
|
||
|
}
|