* Increase code coverage in acmedns * More testing of ReadConfig() and its fallback mechanism * Found that if someone put a '"' double quote into the filename that we configure zap to log to, it would cause the the JSON created to be invalid. I have replaced the JSON string with proper config * Better handling of config options for api.TLS - we now error on an invalid value instead of silently failing. added a basic test for api.setupTLS() (to increase test coverage) * testing nameserver isOwnChallenge and isAuthoritative methods * add a unit test for nameserver answerOwnChallenge * fix linting errors * bump go and golangci-lint versions in github actions * Update golangci-lint.yml Bumping github-actions workflow versions to accommodate some changes in upstream golanci-lint * Bump Golang version to 1.23 (currently the oldest supported version) Bump golanglint-ci to 2.0.2 and migrate the config file. This should resolve the math/rand/v2 issue * bump golanglint-ci action version * Fixing up new golanglint-ci warnings and errors --------- Co-authored-by: Joona Hoikkala <5235109+joohoi@users.noreply.github.com>
83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package acmedns
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
const (
|
|
ApiTlsProviderNone = "none"
|
|
ApiTlsProviderLetsEncrypt = "letsencrypt"
|
|
ApiTlsProviderLetsEncryptStaging = "letsencryptstaging"
|
|
ApiTlsProviderCert = "cert"
|
|
)
|
|
|
|
func FileIsAccessible(fname string) bool {
|
|
_, err := os.Stat(fname)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
f, err := os.Open(fname)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
f.Close()
|
|
return true
|
|
}
|
|
|
|
func readTomlConfig(fname string) (AcmeDnsConfig, error) {
|
|
var conf AcmeDnsConfig
|
|
_, err := toml.DecodeFile(fname, &conf)
|
|
if err != nil {
|
|
// Return with config file parsing errors from toml package
|
|
return conf, err
|
|
}
|
|
return prepareConfig(conf)
|
|
}
|
|
|
|
// prepareConfig checks that mandatory values exist, and can be used to set default values in the future
|
|
func prepareConfig(conf AcmeDnsConfig) (AcmeDnsConfig, error) {
|
|
if conf.Database.Engine == "" {
|
|
return conf, errors.New("missing database configuration option \"engine\"")
|
|
}
|
|
if conf.Database.Connection == "" {
|
|
return conf, errors.New("missing database configuration option \"connection\"")
|
|
}
|
|
|
|
// Default values for options added to config to keep backwards compatibility with old config
|
|
if conf.API.ACMECacheDir == "" {
|
|
conf.API.ACMECacheDir = "api-certs"
|
|
}
|
|
|
|
switch conf.API.TLS {
|
|
case ApiTlsProviderCert, ApiTlsProviderLetsEncrypt, ApiTlsProviderLetsEncryptStaging, ApiTlsProviderNone:
|
|
// we have a good value
|
|
default:
|
|
return conf, fmt.Errorf("invalid value for api.tls, expected one of [%s, %s, %s, %s]", ApiTlsProviderCert, ApiTlsProviderLetsEncrypt, ApiTlsProviderLetsEncryptStaging, ApiTlsProviderNone)
|
|
}
|
|
|
|
return conf, nil
|
|
}
|
|
|
|
func ReadConfig(configFile, fallback string) (AcmeDnsConfig, string, error) {
|
|
var usedConfigFile string
|
|
var config AcmeDnsConfig
|
|
var err error
|
|
if FileIsAccessible(configFile) {
|
|
usedConfigFile = configFile
|
|
config, err = readTomlConfig(configFile)
|
|
} else if FileIsAccessible(fallback) {
|
|
usedConfigFile = fallback
|
|
config, err = readTomlConfig(fallback)
|
|
} else {
|
|
err = fmt.Errorf("configuration file not found")
|
|
}
|
|
if err != nil {
|
|
err = fmt.Errorf("encountered an error while trying to read configuration file: %w", err)
|
|
}
|
|
return config, usedConfigFile, err
|
|
}
|