commit 28346d8bb59135db2d2662433e51f4873d744d50
parent d52bed61108642c09ae21d94e6ab7f1490379533
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Sat, 21 Mar 2026 14:11:09 +0100
use new talerutil helpers for configuration
Diffstat:
10 files changed, 86 insertions(+), 105 deletions(-)
diff --git a/cmd/taldir-server/main.go b/cmd/taldir-server/main.go
@@ -39,7 +39,7 @@ import (
_ "github.com/lib/pq"
"github.com/schanzen/taler-go/pkg/merchant"
- "gopkg.in/ini.v1"
+ "github.com/schanzen/taler-go/pkg/util"
"rsc.io/getopt"
taldir "taler.net/taldir/pkg/taldir"
)
@@ -51,7 +51,7 @@ var (
)
func handleRequests(t *taldir.Taldir) {
- log.Fatal(http.ListenAndServe(t.Cfg.Ini.Section("directory").Key("bind_to").MustString("localhost:11000"), t.Router))
+ log.Fatal(http.ListenAndServe(t.Cfg.Ini.GetString("directory", "bind_to", "localhost:11000"), t.Router))
}
func printHelp() {
@@ -97,21 +97,20 @@ func main() {
}
}
t := taldir.Taldir{}
- cfg, err := ini.LooseLoad(cfgfile)
+ cfg, err := util.LoadConfiguration(cfgfile)
if err != nil {
log.Fatalf("Failed to read config: %v", err)
os.Exit(1)
}
- psqlconn := cfg.Section("directory-pq").Key("connection_string").MustString("postgres:///taler-directory")
+ psqlconn := cfg.GetString("directory-pq", "connection_string", "postgres:///taler-directory")
db, err := sql.Open("postgres", psqlconn)
if err != nil {
log.Panic(err)
}
defer db.Close()
- merchURL := cfg.Section("directory").Key("base_url_merchant").MustString("https://backend.demo.taler.net")
- merchToken := cfg.Section("directory").Key("merchant_token").MustString("sandbox")
- cfg.WriteTo(os.Stdout)
+ merchURL := cfg.GetString("directory", "base_url_merchant", "https://backend.demo.taler.net")
+ merchToken := cfg.GetString("directory", "merchant_token", "sandbox")
t.Initialize(taldir.TaldirConfig{
Ini: cfg,
Version: version,
diff --git a/cmd/taldir-server/main_test.go b/cmd/taldir-server/main_test.go
@@ -32,7 +32,6 @@ import (
"github.com/schanzen/taler-go/pkg/merchant"
talerutil "github.com/schanzen/taler-go/pkg/util"
- "gopkg.in/ini.v1"
_ "taler.net/taldir/cmd/taldir-server"
"taler.net/taldir/internal/util"
taldir "taler.net/taldir/pkg/taldir"
@@ -98,11 +97,11 @@ const merchantConfigResponse = `{
}`
func TestMain(m *testing.M) {
- cfg, err := ini.LooseLoad("testdata/taldir-test.conf")
+ cfg, err := talerutil.LoadConfiguration("testdata/taldir-test.conf")
if err != nil {
log.Fatalf("Failed to read config: %v", err)
}
- psqlconn := cfg.Section("directory-pq").Key("connection_string").MustString("postgres:///taler-directory")
+ psqlconn := cfg.GetString("directory-pq", "connection_string", "postgres:///taler-directory")
segments := strings.Split(strings.Split(psqlconn, "?")[0], "/")
dbName := segments[len(segments)-1]
@@ -382,11 +381,11 @@ func TestUnsupportedAliasType(s *testing.T) {
func TestPaymentRequiredMethod(s *testing.T) {
t.ClearDatabase()
- t.MonthlyFee = "KUDOS:5"
+ t.MonthlyFee, _ = talerutil.ParseAmount("KUDOS:5")
req, _ := http.NewRequest("POST", "/register/test-cost", bytes.NewBuffer(validRegisterRequest))
response := executeRequest(req)
- t.MonthlyFee = "KUDOS:0"
+ t.MonthlyFee, _ = talerutil.ParseAmount("KUDOS:0")
if http.StatusPaymentRequired != response.Code {
s.Errorf("Expected response code %d. Got %d\n", http.StatusPaymentRequired, response.Code)
}
diff --git a/cmd/taldir-server/testdata/taldir-test.conf b/cmd/taldir-server/testdata/taldir-test.conf
@@ -1,4 +1,4 @@
-[taldir]
+[directory]
production = false
host = "https://taldir.net"
bind_to = "localhost:11000"
@@ -17,17 +17,17 @@ merchant_baseurl_private = http://merchant.taldir/instances/myInstance
merchant_token = superSecretToken
validation_expiration = 5m
-[taldir-validator-test]
+[directory-validator-test]
challenge_fee = KUDOS:0
command = testdata/taldir-validate-test
type = command
enabled = true
-[taldir-validator-test-cost]
+[directory-validator-test-cost]
challenge_fee = KUDOS:23
command = testdata/taldir-validate-test
type = command
enabled = true
-[taldir-pq]
+[directory-pq]
connection_string = postgres:///taler-directory?host=/var/run/postgresql
diff --git a/go.mod b/go.mod
@@ -7,8 +7,7 @@ require (
github.com/gorilla/mux v1.8.1
github.com/kataras/i18n v0.0.8
github.com/lib/pq v1.11.2
- github.com/mattn/go-sqlite3 v1.14.34
- github.com/schanzen/taler-go v1.2.1
+ github.com/schanzen/taler-go v1.5.2
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
gopkg.in/ini.v1 v1.67.1
rsc.io/getopt v0.0.0-20170811000552-20be20937449
@@ -16,9 +15,7 @@ require (
require (
github.com/BurntSushi/toml v1.6.0 // indirect
- github.com/davecgh/go-spew v1.1.1 // indirect
github.com/kr/pretty v0.3.0 // indirect
- github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
golang.org/x/net v0.50.0 // indirect
golang.org/x/text v0.34.0 // indirect
diff --git a/go.sum b/go.sum
@@ -1,5 +1,3 @@
-github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
-github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -22,17 +20,13 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.11.2 h1:x6gxUeu39V0BHZiugWe8LXZYZ+Utk7hSJGThs8sdzfs=
github.com/lib/pq v1.11.2/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA=
-github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk=
-github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
-github.com/schanzen/taler-go v1.2.0 h1:WGUKxiM/EubADwJQs3yn1irz2gxKcess9iBFkBw/m9w=
-github.com/schanzen/taler-go v1.2.0/go.mod h1:bMpS4SS4jI5DyCbJqcy2J2O81OM5N57mVH+B+yJP1Xg=
-github.com/schanzen/taler-go v1.2.1 h1:K6ANhXb8ThsLs26ToXi7hD3pliqH1jAWI5UImNlr7Io=
-github.com/schanzen/taler-go v1.2.1/go.mod h1:bMpS4SS4jI5DyCbJqcy2J2O81OM5N57mVH+B+yJP1Xg=
+github.com/schanzen/taler-go v1.5.2 h1:Db7jRl+CaJ3ylvxFS/umFOyPxg/qhHj2qKEOzXfNbIM=
+github.com/schanzen/taler-go v1.5.2/go.mod h1:Q6xJcRUjnB15MbceZXF7FPBdqBid2a232VpVFyNY/So=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -41,12 +35,9 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
-github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
-golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
-golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
@@ -56,8 +47,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
-gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=
gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/pkg/taldir/command_validator.go b/pkg/taldir/command_validator.go
@@ -56,7 +56,7 @@ func (t CommandValidator) Name() string {
}
func (t CommandValidator) ChallengeFee() string {
- return t.config.Ini.Section("directory-validator-" + t.name).Key("challenge_fee").MustString("KUDOS:0")
+ return t.config.Ini.GetString("directory-validator-"+t.name, "challenge_fee", "KUDOS:0")
}
func (t CommandValidator) IsAliasValid(alias string) (err error) {
@@ -85,12 +85,12 @@ func (t CommandValidator) RegistrationStart(topic string, link string, message s
}
func makeCommandValidator(cfg *TaldirConfig, name string, landingPageTpl *template.Template) CommandValidator {
- sec := cfg.Ini.Section("directory-validator-" + name)
+ sec := "directory-validator-" + name
return CommandValidator{
name: name,
config: cfg,
landingPageTpl: landingPageTpl,
- validAliasRegex: sec.Key("valid_alias_regex").MustString(""),
- command: sec.Key("command").MustString(""),
+ validAliasRegex: cfg.Ini.GetString(sec, "valid_alias_regex", ""),
+ command: cfg.Ini.GetString(sec, "command", ""),
}
}
diff --git a/pkg/taldir/config.go b/pkg/taldir/config.go
@@ -22,12 +22,12 @@ import (
"database/sql"
"github.com/schanzen/taler-go/pkg/merchant"
- "gopkg.in/ini.v1"
+ "github.com/schanzen/taler-go/pkg/util"
)
type TaldirConfig struct {
// The config to use
- Ini *ini.File
+ Ini util.TalerConfiguration
// The Taldir Version
Version string
diff --git a/pkg/taldir/disseminator_gns.go b/pkg/taldir/disseminator_gns.go
@@ -34,7 +34,7 @@ func (d *GnsDisseminator) gnsCheckIsDisseminated(e *Entry) bool {
if err != nil {
return false
}
- zone := d.config.Ini.Section("directory-disseminator-gns").Key("zone").MustString("taldir")
+ zone := d.config.Ini.GetString("directory-disseminator-gns", "zone", "taldir")
out, err := exec.Command(path, "--lookup", e.HsAlias+"."+zone, "--type", "TXT").Output()
if err != nil {
return false
@@ -50,7 +50,7 @@ func (d *GnsDisseminator) DisseminateStop(e *Entry) error {
if err != nil {
return fmt.Errorf("path of command not found: %w", err)
}
- zone := d.config.Ini.Section("directory-disseminator-gns").Key("zone").MustString("taldir")
+ zone := d.config.Ini.GetString("directory-disseminator-gns", "zone", "taldir")
out, err := exec.Command(path, "--delete", "--public", "--zone", zone, "--type", "TXT", "--name", e.HsAlias, "--value", e.TargetURI).Output()
if err != nil {
return fmt.Errorf("failed to execute disseminator command: `%s', %w", out, err)
@@ -67,8 +67,8 @@ func (d *GnsDisseminator) DisseminateStart(e *Entry) error {
if err != nil {
return fmt.Errorf("path of command not found: %w", err)
}
- expiration := d.config.Ini.Section("directory-disseminator-gns").Key("expiration").MustString("1d")
- zone := d.config.Ini.Section("directory-disseminator-gns").Key("zone").MustString("taldir")
+ expiration := d.config.Ini.GetString("directory-disseminator-gns", "expiration", "1d")
+ zone := d.config.Ini.GetString("directory-disseminator-gns", "zone", "taldir")
out, err := exec.Command(path, "--add", "--public", "--expiration", expiration, "--zone", zone, "--type", "TXT", "--name", e.HsAlias, "--value", e.TargetURI).Output()
if err != nil {
return fmt.Errorf("failed to execute disseminator command: `%s', %w", out, err)
@@ -81,7 +81,7 @@ func (d *GnsDisseminator) Name() string {
}
func (d *GnsDisseminator) IsEnabled() bool {
- return d.config.Ini.Section("directory-disseminator-gns").Key("enabled").MustBool(false)
+ return d.config.Ini.GetBool("directory-disseminator-gns", "enabled", false)
}
func makeGnsDisseminator(cfg *TaldirConfig) GnsDisseminator {
diff --git a/pkg/taldir/oidc_validator.go b/pkg/taldir/oidc_validator.go
@@ -110,7 +110,7 @@ func (t OidcValidator) Name() string {
}
func (t OidcValidator) ChallengeFee() string {
- return t.config.Ini.Section("directory-validator-" + t.name).Key("challenge_fee").MustString("KUDOS:0")
+ return t.config.Ini.GetString("directory-validator-"+t.name, "challenge_fee", "KUDOS:0")
}
func (t OidcValidator) IsAliasValid(alias string) (err error) {
@@ -203,23 +203,22 @@ func (t OidcValidator) RegistrationStart(topic string, link string, message stri
}
func makeOidcValidator(cfg *TaldirConfig, name string, landingPageTpl *template.Template) OidcValidator {
- mainSec := cfg.Ini.Section("directory")
- baseURL := mainSec.Key("base_url").MustString("")
+ baseURL := cfg.Ini.GetString("directory", "base_url", "")
// FIXME escape URI?
redirectURI := fmt.Sprintf("%s/oidc_validator/%s", baseURL, name)
- sec := cfg.Ini.Section("directory-validator-" + name)
+ sec := "directory-validator-" + name
return OidcValidator{
name: name,
config: cfg,
landingPageTpl: landingPageTpl,
- clientID: sec.Key("client_id").MustString(""),
- clientSecret: sec.Key("client_secret").MustString(""),
- scope: sec.Key("scope").MustString("profile"),
- tokenEndpoint: sec.Key("token_endpoint").MustString(""),
- userinfoEndpoint: sec.Key("userinfo_endpoint").MustString(""),
- authorizationEndpoint: sec.Key("authorization_endpoint").MustString(""),
- validAliasRegex: sec.Key("valid_alias_regex").MustString(""),
- aliasClaimName: sec.Key("alias_claim").MustString("sub"),
+ clientID: cfg.Ini.GetString(sec, "client_id", ""),
+ clientSecret: cfg.Ini.GetString(sec, "client_secret", ""),
+ scope: cfg.Ini.GetString(sec, "scope", "profile"),
+ tokenEndpoint: cfg.Ini.GetString(sec, "token_endpoint", ""),
+ userinfoEndpoint: cfg.Ini.GetString(sec, "userinfo_endpoint", ""),
+ authorizationEndpoint: cfg.Ini.GetString(sec, "authorization_endpoint", ""),
+ validAliasRegex: cfg.Ini.GetString(sec, "valid_alias_regex", ""),
+ aliasClaimName: cfg.Ini.GetString(sec, "alias_claim", "sub"),
redirectURI: redirectURI,
authorizationsState: make(map[string]*AuthorizationsState, 0),
}
diff --git a/pkg/taldir/taldir.go b/pkg/taldir/taldir.go
@@ -114,7 +114,7 @@ type Taldir struct {
Merchant merchant.Merchant
// Monthly fee amount
- MonthlyFee string
+ MonthlyFee *talerutil.Amount
// Registrar base URL
BaseURL string
@@ -538,7 +538,7 @@ func (t *Taldir) registerRequest(w http.ResponseWriter, r *http.Request) {
}
sliceDuration := time.Duration(validation.Duration * 1000)
- cost, err := util.CalculateCost(t.MonthlyFee,
+ cost, err := util.CalculateCost(t.MonthlyFee.String(),
validator.ChallengeFee(),
sliceDuration,
monthDuration)
@@ -645,7 +645,7 @@ func (t *Taldir) configResponse(w http.ResponseWriter, r *http.Request) {
cfg := VersionResponse{
Version: "0:0:0",
Name: "taler-directory",
- MonthlyFee: t.Cfg.Ini.Section("directory").Key("monthly_fee").MustString("KUDOS:1"),
+ MonthlyFee: t.Cfg.Ini.GetString("directory", "monthly_fee", "KUDOS:1"),
AliasType: meths,
}
w.Header().Set("Content-Type", "application/json")
@@ -740,22 +740,20 @@ func (t *Taldir) ClearDatabase() {
}
func (t *Taldir) termsResponse(w http.ResponseWriter, r *http.Request) {
- s := t.Cfg.Ini.Section("directory")
- termspath := t.getFileName(s.Key("default_terms_path").MustString("terms/"))
+ termspath := t.Cfg.Ini.GetFilename("directory", "default_terms_path", "terms/", t.Cfg.Datahome)
tos.ServiceTermsResponse(w, r, termspath, tos.TalerTosConfig{
- DefaultFileType: s.Key("default_doc_filetype").MustString("text/html"),
- DefaultLanguage: s.Key("default_doc_lang").MustString("en"),
- SupportedFileTypes: strings.Split(s.Key("supported_doc_filetypes").String(), " "),
+ DefaultFileType: t.Cfg.Ini.GetString("directory", "default_doc_filetype", "text/html"),
+ DefaultLanguage: t.Cfg.Ini.GetString("directory", "default_doc_lang", "en"),
+ SupportedFileTypes: strings.Split(t.Cfg.Ini.GetString("directory", "supported_doc_filetypes", ""), " "),
})
}
func (t *Taldir) privacyResponse(w http.ResponseWriter, r *http.Request) {
- s := t.Cfg.Ini.Section("mailbox")
- pppath := t.getFileName(s.Key("default_pp_path").MustString("privacy/"))
+ pppath := t.Cfg.Ini.GetFilename("directory", "default_pp_path", "privacy/", t.Cfg.Datahome)
tos.PrivacyPolicyResponse(w, r, pppath, tos.TalerTosConfig{
- DefaultFileType: s.Key("default_doc_filetype").MustString("text/html"),
- DefaultLanguage: s.Key("default_doc_lang").MustString("en"),
- SupportedFileTypes: strings.Split(s.Key("supported_doc_filetypes").String(), " "),
+ DefaultFileType: t.Cfg.Ini.GetString("directory", "default_doc_filetype", "text/html"),
+ DefaultLanguage: t.Cfg.Ini.GetString("directory", "default_doc_lang", "en"),
+ SupportedFileTypes: strings.Split(t.Cfg.Ini.GetString("directory", "supported_doc_filetypes", ""), " "),
})
}
@@ -975,31 +973,31 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
}
t.I18n = i18n
- navTplFile := t.getFileName(cfg.Ini.Section("directory").Key("navigation").MustString("web/templates/nav.html"))
- footerTplFile := t.getFileName(cfg.Ini.Section("directory").Key("footer").MustString("web/templates/footer.html"))
- t.BaseURL = cfg.Ini.Section("directory").Key("base_url").MustString("http://localhost:11000")
+ navTplFile := cfg.Ini.GetFilename("directory", "navigation", "web/templates/nav.html", t.Cfg.Datahome)
+ footerTplFile := cfg.Ini.GetFilename("directory", "footer", "web/templates/footer.html", t.Cfg.Datahome)
+ t.BaseURL = cfg.Ini.GetString("directory", "base_url", "http://localhost:11000")
t.Validators = make(map[string]Validator)
- for _, sec := range cfg.Ini.Sections() {
- if !strings.HasPrefix(sec.Name(), "directory-validator-") {
+ for _, sec := range cfg.Ini.IterateSections("directory-validator-") {
+ if !strings.HasPrefix(sec, "directory-validator-") {
continue
}
- vname := strings.TrimPrefix(sec.Name(), "directory-validator-")
- if !sec.Key("enabled").MustBool(false) {
+ vname := strings.TrimPrefix(sec, "directory-validator-")
+ if !cfg.Ini.GetBool(sec, "enabled", false) {
t.Logger.Logf(LogWarning, "`Validator `%s' disabled.\n", vname)
continue
}
- if !sec.HasKey("type") {
- t.Logger.Logf(LogWarning, "`type` key in section `[%s]` not found, disabling validator.\n", sec.Name())
- continue
- }
- vlandingPageTplFile := t.getFileName(sec.Key("registration_page").MustString("web/templates/landing_" + vname + ".html"))
+ vlandingPageTplFile := cfg.Ini.GetFilename(sec, "registration_page", "web/templates/landing_"+vname+".html", t.Cfg.Datahome)
vlandingPageTpl, err := template.ParseFiles(vlandingPageTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.Logf(LogWarning, "`%s` template not found, disabling validator `%s`: `%v`\n", vlandingPageTplFile, vname, err)
continue
}
var v Validator
- vtype := sec.Key("type").MustString("")
+ vtype := cfg.Ini.GetString(sec, "type", "")
+ if len(vtype) == 0 {
+ t.Logger.Logf(LogWarning, "`type` key in section `[%s]` not found, disabling validator.\n", sec)
+ continue
+ }
switch vtype {
case string(ValidatorTypeCommand):
v = Validator(makeCommandValidator(&cfg, vname, vlandingPageTpl))
@@ -1019,28 +1017,30 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
t.Disseminators[gnsdisseminator.Name()] = &gnsdisseminator
t.Logger.Logf(LogInfo, "Disseminator `%s' enabled.\n", gnsdisseminator.Name())
}
- t.ChallengeBytes = cfg.Ini.Section("directory").Key("challenge_bytes").MustInt(16)
- t.ValidationInitiationMax = cfg.Ini.Section("directory").Key("validation_initiation_max").MustInt64(3)
- t.SolutionAttemptsMax = cfg.Ini.Section("directory").Key("solution_attempt_max").MustInt(3)
+ t.ChallengeBytes = cfg.Ini.GetInt("directory", "challenge_bytes", 16)
+ t.ValidationInitiationMax = cfg.Ini.GetInt64("directory", "validation_initiation_max", 3)
+ t.SolutionAttemptsMax = cfg.Ini.GetInt("directory", "solution_attempt_max", 3)
- validationTTLStr := cfg.Ini.Section("directory").Key("validation_timeframe").MustString("5m")
- t.ValidPMSRegex = cfg.Ini.Section("directory").Key("valid_payment_system_address_regex").MustString(".*")
- t.ValidationTimeframe, err = time.ParseDuration(validationTTLStr)
+ t.ValidPMSRegex = cfg.Ini.GetString("directory", "valid_payment_system_address_regex", ".*")
+ t.ValidationTimeframe, err = cfg.Ini.GetDuration("directory", "validation_timeframe", time.Minute*5)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- retryTimeframeStr := cfg.Ini.Section("directory").Key("solution_attempt_timeframe").MustString("1h")
- t.SolutionTimeframe, err = time.ParseDuration(retryTimeframeStr)
+ t.SolutionTimeframe, err = cfg.Ini.GetDuration("directory", "solution_attempt_timeframe", time.Hour)
+ if err != nil {
+ t.Logger.InternalLogger.Fatal(err)
+ os.Exit(1)
+ }
+ t.MonthlyFee, err = cfg.Ini.GetAmount("directory", "monthly_fee", &talerutil.Amount{})
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- t.MonthlyFee = cfg.Ini.Section("directory").Key("monthly_fee").MustString("KUDOS:0")
t.DB = cfg.Db
- if cfg.Ini.Section("directory").Key("purge_mappings_on_startup_dangerous").MustBool(false) {
+ if cfg.Ini.GetBool("directory", "purge_mappings_on_startup_dangerous", false) {
t.Logger.Logf(LogWarning, "DANGER Purging mappings!")
num, err := DeleteAllEntriesFromDatabase(t.DB)
if err != nil {
@@ -1049,8 +1049,7 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
t.Logger.Logf(LogDebug, "Deleted %d entries.\n", num)
}
// Clean up validations
- validationExpStr := cfg.Ini.Section("directory").Key("validation_expiration").MustString("24h")
- validationExp, err := time.ParseDuration(validationExpStr)
+ validationExp, err := cfg.Ini.GetDuration("directory", "validation_expiration", time.Hour*24)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
@@ -1065,31 +1064,31 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
time.Sleep(validationExp)
}
}()
- imprintTplFile := t.getFileName(cfg.Ini.Section("directory").Key("imprint_page").MustString("web/templates/imprint.html"))
+ imprintTplFile := cfg.Ini.GetFilename("directory", "imprint_page", "web/templates/imprint.html", t.Cfg.Datahome)
t.ImprintTpl, err = template.ParseFiles(imprintTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- validationLandingTplFile := t.getFileName(cfg.Ini.Section("directory").Key("validation_landing").MustString("web/templates/validation_landing.html"))
+ validationLandingTplFile := cfg.Ini.GetFilename("directory", "validation_landing", "web/templates/validation_landing.html", t.Cfg.Datahome)
t.ValidationTpl, err = template.ParseFiles(validationLandingTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- landingTplFile := t.getFileName(cfg.Ini.Section("directory").Key("landing_page").MustString("web/templates/landing.html"))
+ landingTplFile := cfg.Ini.GetFilename("directory", "landing_page", "web/templates/landing.html", t.Cfg.Datahome)
t.LandingPageTpl, err = template.ParseFiles(landingTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- lookupResultTplFile := t.getFileName(cfg.Ini.Section("directory").Key("lookup_result_page").MustString("web/templates/lookup_result.html"))
+ lookupResultTplFile := cfg.Ini.GetFilename("directory", "lookup_result_page", "web/templates/lookup_result.html", t.Cfg.Datahome)
t.LookupResultPageTpl, err = template.ParseFiles(lookupResultTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- aboutTplFile := t.getFileName(cfg.Ini.Section("directory").Key("about_page").MustString("web/templates/about.html"))
+ aboutTplFile := cfg.Ini.GetFilename("directory", "about_page", "web/templates/about.html", t.Cfg.Datahome)
t.AboutPageTpl, err = template.ParseFiles(aboutTplFile, navTplFile, footerTplFile)
if err != nil {
t.Logger.InternalLogger.Fatal(err)
@@ -1097,19 +1096,18 @@ func (t *Taldir) Initialize(cfg TaldirConfig) {
}
t.Salt = os.Getenv("TALDIR_SALT")
if t.Salt == "" {
- t.Salt = cfg.Ini.Section("directory").Key("salt").MustString("ChangeMe")
+ t.Salt = cfg.Ini.GetString("directory", "salt", "ChangeMe")
}
- t.Host = cfg.Ini.Section("directory").Key("base_url").MustString("http://localhost")
+ t.Host = cfg.Ini.GetString("directory", "base_url", "http://localhost")
t.Merchant = cfg.Merchant
- registrationCost, _ := talerutil.ParseAmount(t.MonthlyFee)
merchConfig, err := t.Merchant.GetConfig()
if err != nil {
t.Logger.InternalLogger.Fatal(err)
os.Exit(1)
}
- currencySpec, currencySupported := merchConfig.Currencies[registrationCost.Currency]
+ currencySpec, currencySupported := merchConfig.Currencies[t.MonthlyFee.Currency]
for !currencySupported {
- t.Logger.InternalLogger.Fatalf("Currency `%s' not supported by merchant!\n", registrationCost.Currency)
+ t.Logger.InternalLogger.Fatalf("Currency `%s' not supported by merchant!\n", t.MonthlyFee.Currency)
os.Exit(1)
}
t.CurrencySpec = currencySpec