taldir

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

commit d7f7ecca370fc63572ac0a36bc15d336dd9f5bcd
parent 7662410ce9e08e7a214dd4d93aa8fe5df708b3b2
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Thu,  7 Jul 2022 13:00:23 +0200

add localized terms handling

Diffstat:
Mcmd/taldir-server/taldir.go | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mgo.mod | 1+
Aterms/de-DE.md | 1+
3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/cmd/taldir-server/taldir.go b/cmd/taldir-server/taldir.go @@ -33,6 +33,8 @@ import ( "time" "fmt" "log" + "io/ioutil" + "mime" "net/http" "html/template" "encoding/json" @@ -46,6 +48,7 @@ import ( "gopkg.in/ini.v1" "strings" "github.com/skip2/go-qrcode" + "golang.org/x/text/language" ) type Taldir struct { @@ -222,6 +225,13 @@ type ValidationConfirmation struct { Solution string `json:"solution"` } +// matcher is a language.Matcher configured for all supported languages. +var langMatcher = language.NewMatcher([]language.Tag{ + language.BritishEnglish, + //language.Norwegian, + language.German, +}) + // Primary lookup function. // Allows the caller to query a wallet key using the hash(!) of the // identity, e.g. SHA512(<email address>) @@ -457,12 +467,53 @@ func (t *Taldir) ClearDatabase() { t.Db.Where("1 = 1").Delete(&Validation{}) } +func (t *Taldir) termsResponse(w http.ResponseWriter, r *http.Request) { + acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) + // We ignore the error: the default language will be selected for t == nil. + for _, lang := range acceptLangs { + for _, typ := range r.Header["Accept"] { + extensions, _ := mime.ExtensionsByType(typ) + for _, ext := range extensions { + log.Printf("Trying %s\n", "terms/" + lang.String() + ext) + fileBytes, err := ioutil.ReadFile("terms/" + lang.String() + ext) + if nil == err { + w.Header().Set("Content-Type", typ) + w.Write(fileBytes) + return + } + } + } + } + w.WriteHeader(404) +} + +func (t *Taldir) privacyResponse(w http.ResponseWriter, r *http.Request) { + acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) + // We ignore the error: the default language will be selected for t == nil. + for _, lang := range acceptLangs { + for _, typ := range r.Header["Accept"] { + extensions, _ := mime.ExtensionsByType(typ) + for _, ext := range extensions { + log.Printf("Trying %s\n", "privacy/" + lang.String() + ext) + fileBytes, err := ioutil.ReadFile("privacy/" + lang.String() + ext) + if nil == err { + w.Header().Set("Content-Type", typ) + w.Write(fileBytes) + return + } + } + } + } + w.WriteHeader(404) +} + + func (t *Taldir) setupHandlers() { t.Router = mux.NewRouter().StrictSlash(true) /* ToS API */ - t.Router.HandleFunc("/terms", notImplemented).Methods("GET") - t.Router.HandleFunc("/privacy", notImplemented).Methods("GET") + t.Router.HandleFunc("/terms", t.termsResponse).Methods("GET") + t.Router.HandleFunc("/privacy", t.privacyResponse).Methods("GET") /* Config API */ t.Router.HandleFunc("/config", t.configResponse).Methods("GET") diff --git a/go.mod b/go.mod @@ -9,6 +9,7 @@ require ( github.com/jinzhu/now v1.1.5 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect + golang.org/x/text v0.3.7 // indirect gopkg.in/ini.v1 v1.66.4 gopkg.in/jcmturner/aescts.v1 v1.0.1 // indirect gopkg.in/jcmturner/dnsutils.v1 v1.0.1 // indirect diff --git a/terms/de-DE.md b/terms/de-DE.md @@ -0,0 +1 @@ +# TOS