acme-dns/util.go

104 lines
2.4 KiB
Go
Raw Normal View History

2016-11-11 21:48:00 +07:00
package main
import (
2016-11-13 19:50:44 +07:00
"crypto/rand"
2016-11-16 20:31:40 +07:00
"errors"
2016-11-23 22:11:31 +07:00
"fmt"
2016-11-16 20:31:40 +07:00
"github.com/BurntSushi/toml"
2016-11-23 22:11:31 +07:00
"github.com/op/go-logging"
2016-11-13 19:50:44 +07:00
"github.com/satori/go.uuid"
"math/big"
2016-11-23 22:11:31 +07:00
"os"
2016-11-11 21:48:00 +07:00
"regexp"
2016-11-13 19:50:44 +07:00
"strings"
2016-11-11 21:48:00 +07:00
)
2016-11-17 00:15:36 +07:00
func readConfig(fname string) (DNSConfig, error) {
var conf DNSConfig
2016-11-16 20:31:40 +07:00
if _, err := toml.DecodeFile(fname, &conf); err != nil {
2016-11-17 00:15:36 +07:00
return DNSConfig{}, errors.New("Malformed configuration file")
2016-11-16 20:31:40 +07:00
}
return conf, nil
}
2016-11-23 22:11:31 +07:00
func sanitizeString(s string) string {
2016-11-13 19:50:44 +07:00
// URL safe base64 alphabet without padding as defined in ACME
re, err := regexp.Compile("[^A-Za-z\\-\\_0-9]+")
2016-11-11 21:48:00 +07:00
if err != nil {
log.Errorf("%v", err)
return ""
}
2016-11-13 19:50:44 +07:00
return re.ReplaceAllString(s, "")
}
2016-11-23 22:11:31 +07:00
func generatePassword(length int) (string, error) {
2016-11-13 19:50:44 +07:00
ret := make([]byte, length)
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_"
alphalen := big.NewInt(int64(len(alphabet)))
for i := 0; i < length; i++ {
c, err := rand.Int(rand.Reader, alphalen)
if err != nil {
return "", err
}
r := int(c.Int64())
ret[i] = alphabet[r]
}
return string(ret), nil
}
2016-11-23 22:11:31 +07:00
func sanitizeDomainQuestion(d string) string {
2016-11-13 19:50:44 +07:00
var dom string
2016-11-17 00:15:36 +07:00
suffix := DNSConf.General.Domain + "."
if strings.HasSuffix(d, suffix) {
dom = d[0 : len(d)-len(suffix)]
2016-11-13 19:50:44 +07:00
} else {
dom = d
}
return dom
}
2016-11-23 22:11:31 +07:00
func newACMETxt() (ACMETxt, error) {
2016-11-17 00:15:36 +07:00
var a = ACMETxt{}
2016-11-23 22:11:31 +07:00
password, err := generatePassword(40)
2016-11-13 19:50:44 +07:00
if err != nil {
return a, err
2016-11-11 21:48:00 +07:00
}
2016-11-13 19:50:44 +07:00
a.Username = uuid.NewV4()
a.Password = password
a.Subdomain = uuid.NewV4().String()
return a, nil
2016-11-11 21:48:00 +07:00
}
2016-11-23 22:11:31 +07:00
func setupLogging() {
var logformat = logging.MustStringFormatter(DNSConf.Logconfig.Format)
var logBackend *logging.LogBackend
switch DNSConf.Logconfig.Logtype {
default:
// Setup logging - stdout
logBackend = logging.NewLogBackend(os.Stdout, "", 0)
case "file":
// Logging to file
logfh, err := os.OpenFile(DNSConf.Logconfig.File, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Printf("Could not open log file %s\n", DNSConf.Logconfig.File)
os.Exit(1)
}
defer logfh.Close()
logBackend = logging.NewLogBackend(logfh, "", 0)
}
logFormatter := logging.NewBackendFormatter(logBackend, logformat)
logLevel := logging.AddModuleLevel(logFormatter)
switch DNSConf.Logconfig.Level {
default:
logLevel.SetLevel(logging.DEBUG, "")
case "warning":
logLevel.SetLevel(logging.WARNING, "")
case "error":
logLevel.SetLevel(logging.ERROR, "")
case "info":
logLevel.SetLevel(logging.INFO, "")
}
logging.SetBackend(logFormatter)
}