taler-go

Utility functions in Go language
Log | Files | Refs | LICENSE

commit 82eaa31d0a8e82c0934d8639a6b2e99830b0b293
parent b4025837dad5952e60c31cc16b83498d1e4f33ba
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date:   Tue, 19 Jul 2022 15:52:46 +0200

add tos rest

Diffstat:
Mgo.mod | 7+++++++
Ago.sum | 18++++++++++++++++++
Apkg/rest/tos.go | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/go.mod b/go.mod @@ -1,3 +1,10 @@ module taler.net/taler-go.git go 1.18 + +require ( + golang.org/x/text v0.3.7 + gopkg.in/ini.v1 v1.66.6 +) + +require github.com/stretchr/testify v1.8.0 // indirect diff --git a/go.sum b/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/rest/tos.go b/pkg/rest/tos.go @@ -0,0 +1,98 @@ +package tos + +import ( + "fmt" + "io/ioutil" + "log" + "mime" + "net/http" + "strings" + + "golang.org/x/text/language" + "gopkg.in/ini.v1" +) + +func ServiceTermsResponse(s ini.Section, w http.ResponseWriter, r *http.Request) { + fileType := s.Key("default_doc_filetype").MustString("text/html") + termsLocation := s.Key("default_tos_path").MustString("terms/") + for _, typ := range r.Header["Accept"] { + for _, a := range strings.Split(s.Key("supported_doc_filetypes").String(), " ") { + if typ == a { + fileType = a + } + } + } + + if len(r.Header.Get("Accept-Language")) != 0 { + acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) + for _, lang := range acceptLangs { + extensions, _ := mime.ExtensionsByType(fileType) + for _, ext := range extensions { + docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, lang.String(), ext) + log.Printf("Trying %s\n", docFile) + fileBytes, err := ioutil.ReadFile(docFile) + if nil == err { + w.Header().Set("Content-Type", fileType) + w.Write(fileBytes) + return + } + } + } + } + // Default document in expected/default format + defaultLanguage := s.Key("default_doc_lang").MustString("en") + extensions, _ := mime.ExtensionsByType(fileType) + for _, ext := range extensions { + docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, defaultLanguage, ext) + log.Println("Trying " + docFile) + fileBytes, err := ioutil.ReadFile(docFile) + if nil == err { + w.Header().Set("Content-Type", fileType) + w.Write(fileBytes) + return + } + } + w.WriteHeader(http.StatusNotFound) +} + +func ServicePrivacyPolicyResponse(s *ini.Section, w http.ResponseWriter, r *http.Request) { + fileType := s.Key("default_doc_filetype").MustString("text/html") + termsLocation := s.Key("default_pp_path").MustString("privacy/") + for _, typ := range r.Header["Accept"] { + for _, a := range strings.Split(s.Key("supported_doc_filetypes").String(), " ") { + if typ == a { + fileType = a + } + } + } + + if len(r.Header.Get("Accept-Language")) != 0 { + acceptLangs, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) + for _, lang := range acceptLangs { + extensions, _ := mime.ExtensionsByType(fileType) + for _, ext := range extensions { + docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, lang.String(), ext) + log.Printf("Trying %s\n", docFile) + fileBytes, err := ioutil.ReadFile(docFile) + if nil == err { + w.Header().Set("Content-Type", fileType) + w.Write(fileBytes) + return + } + } + } + } + // Default document in expected/default format + defaultLanguage := s.Key("default_doc_lang").MustString("en") + extensions, _ := mime.ExtensionsByType(fileType) + for _, ext := range extensions { + docFile := fmt.Sprintf("%s/%s/0%s", termsLocation, defaultLanguage, ext) + fileBytes, err := ioutil.ReadFile(docFile) + if nil == err { + w.Header().Set("Content-Type", fileType) + w.Write(fileBytes) + return + } + } + w.WriteHeader(http.StatusNotFound) +}