Skip to content
Snippets Groups Projects
config.go 1.47 KiB
Newer Older
ale's avatar
ale committed
package acmeserver

import (
	"io/ioutil"
	"log"
	"path/filepath"

	"gopkg.in/yaml.v2"

	"git.autistici.org/ai3/go-common/clientutil"
)

// Config holds the configuration for an acmeserver instance.
type Config struct {
	Addr string `yaml:"addr"`

	Email  string                    `yaml:"email"`
	UseRSA bool                      `yaml:"use_rsa"`
	Dir    string                    `yaml:"cert_dir"`
	ReplDS *clientutil.BackendConfig `yaml:"replds"`
}

// Definition of a single certificate: the main CN, and optionally a
// list of subjectAltName entries.
type certConfig struct {
	CN       string   `yaml:"cn"`
	AltNames []string `yaml:"alt_names"`
}

func decodeCertConfig(data []byte) ([][]string, error) {
	var cc []certConfig
	if err := yaml.Unmarshal(data, &cc); err != nil {
		return nil, err
	}

	var domains [][]string
	for _, c := range cc {
		d := []string{c.CN}
		d = append(d, c.AltNames...)
		domains = append(domains, d)
	}
	return domains, nil
}

func readCertConfig(path string) ([][]string, error) {
	data, err := ioutil.ReadFile(path)
	if err != nil {
		return nil, err
	}
	return decodeCertConfig(data)
}

func readCertConfigsFromDir(dir string) ([][]string, error) {
	files, err := filepath.Glob(filepath.Join(dir, "*.yml"))
	if err != nil {
		return nil, err
	}
	var domains [][]string
	for _, f := range files {
		d, err := readCertConfig(f)
		if err != nil {
			log.Printf("error reading %s: %v", f, err)
			continue
		}
		domains = append(domains, d...)
	}
	return domains, nil
}