From fe1914fd894dd4f3c80fc4fc71102454da74a455 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Mon, 24 Jul 2023 17:59:18 +0200 Subject: [PATCH] Move Markdown parsing to i18n service --- internal/handlers/login.go | 25 +++++++------------------ internal/services/i18n.go | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/internal/handlers/login.go b/internal/handlers/login.go index 232ba7e..b9ed8a0 100644 --- a/internal/handlers/login.go +++ b/internal/handlers/login.go @@ -32,7 +32,6 @@ import ( "github.com/ory/hydra-client-go/client/admin" "github.com/ory/hydra-client-go/models" log "github.com/sirupsen/logrus" - "github.com/yuin/goldmark" "code.cacert.org/cacert/oidc_idp/ui" @@ -330,23 +329,13 @@ func (h *LoginHandler) renderNoEmailsInClientCertificate(w http.ResponseWriter, } func (h *LoginHandler) renderNoChallengeInRequest(w http.ResponseWriter, localizer *i18n.Localizer) { - trans := func(label string) string { - return h.messageCatalog.LookupMessage(label, nil, localizer) - } - - buf := &bytes.Buffer{} - - err := goldmark.Convert([]byte(trans("NoChallengeInRequestExplanation")), buf) - if err != nil { - h.logger.WithError(err).Error("markdown conversion failed") - http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) - - return - } - - err = h.templates[NoChallengeInRequest].Lookup("base").Execute(w, map[string]interface{}{ - "Title": trans("NoChallengeInRequestTitle"), - "Explanation": template.HTML(buf.String()), //nolint:gosec + err := h.templates[NoChallengeInRequest].Lookup("base").Execute(w, map[string]interface{}{ + "Title": h.messageCatalog.LookupMessage("NoChallengeInRequestTitle", nil, localizer), + "Explanation": template.HTML(h.messageCatalog.LookupMarkdownMessage( //nolint:gosec + "NoChallengeInRequestExplanation", + nil, + localizer, + )), }) if err != nil { h.logger.WithError(err).Error("template rendering failed") diff --git a/internal/services/i18n.go b/internal/services/i18n.go index 8c33cf2..c3d2a3d 100644 --- a/internal/services/i18n.go +++ b/internal/services/i18n.go @@ -18,10 +18,12 @@ limitations under the License. package services import ( + "bytes" "errors" "fmt" log "github.com/sirupsen/logrus" + "github.com/yuin/goldmark" "code.cacert.org/cacert/oidc_idp/translations" @@ -195,6 +197,35 @@ func (m *MessageCatalog) LookupMessage( return id } +func (m *MessageCatalog) LookupMarkdownMessage( + id string, + templateData map[string]interface{}, + localizer *i18n.Localizer, +) string { + if message, ok := m.messages[id]; ok { + translation, err := localizer.Localize(&i18n.LocalizeConfig{ + DefaultMessage: message, + TemplateData: templateData, + }) + if err != nil { + return m.handleLocalizeError(id, translation, err) + } + + buf := &bytes.Buffer{} + + err = goldmark.Convert([]byte(translation), buf) + if err != nil { + return m.handleLocalizeError(id, translation, fmt.Errorf("markdown conversion error: %w", err)) + } + + return buf.String() + } + + m.logger.Warnf("no translation found for %s", id) + + return id +} + func (m *MessageCatalog) LookupMessagePlural( id string, templateData map[string]interface{}, @@ -223,13 +254,13 @@ func (m *MessageCatalog) handleLocalizeError(id string, translation string, err var messageNotFound *i18n.MessageNotFoundErr if errors.As(err, &messageNotFound) { - m.logger.Warnf("message %s not found: %v", id, err) + m.logger.WithError(err).WithField("message", id).Warn("message not found") if translation != "" { return translation } } else { - m.logger.Error(err) + m.logger.WithError(err).WithField("message", id).Error("translation error") } return id