taldir

Directory service to resolve wallet mailboxes by messenger addresses
Log | Files | Refs | Submodules | README | LICENSE

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:
Mcmd/taldir-server/main.go | 13++++++-------
Mcmd/taldir-server/main_test.go | 9++++-----
Mcmd/taldir-server/testdata/taldir-test.conf | 8++++----
Mgo.mod | 5+----
Mgo.sum | 17+++--------------
Mpkg/taldir/command_validator.go | 8++++----
Mpkg/taldir/config.go | 4++--
Mpkg/taldir/disseminator_gns.go | 10+++++-----
Mpkg/taldir/oidc_validator.go | 23+++++++++++------------
Mpkg/taldir/taldir.go | 94+++++++++++++++++++++++++++++++++++++++----------------------------------------
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