From bdcc4134fa37a071d696afdcaadf21ffa5f3c323 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Thu, 18 Jan 2018 21:53:31 -0800 Subject: Store language in session to show the login page translated --- http/handler/context.go | 9 ++++++--- http/handler/handler.go | 5 +++-- http/middleware/context_keys.go | 3 +++ http/middleware/session.go | 1 + http/middleware/user_session.go | 10 +++++++++- model/session.go | 7 ++++--- ui/login.go | 4 ++++ 7 files changed, 30 insertions(+), 9 deletions(-) diff --git a/http/handler/context.go b/http/handler/context.go index a04a816..35eb1ea 100644 --- a/http/handler/context.go +++ b/http/handler/context.go @@ -80,8 +80,12 @@ func (c *Context) LoggedUser() *model.User { // UserLanguage get the locale used by the current logged user. func (c *Context) UserLanguage() string { - user := c.LoggedUser() - return user.Language + if c.IsAuthenticated() { + user := c.LoggedUser() + return user.Language + } + + return c.getContextStringValue(middleware.UserLanguageContextKey) } // Translate translates a message in the current language. @@ -145,7 +149,6 @@ func (c *Context) getContextStringValue(key *middleware.ContextKey) string { return v.(string) } - logger.Error("[Core:Context] Missing key: %s", key) return "" } diff --git a/http/handler/handler.go b/http/handler/handler.go index 3dd1d1b..882e0bd 100644 --- a/http/handler/handler.go +++ b/http/handler/handler.go @@ -46,9 +46,10 @@ func (h *Handler) Use(f ControllerFunc) http.Handler { ctx := NewContext(r, h.store, h.router, h.translator) request := NewRequest(r) response := NewResponse(w, r, h.template) + language := ctx.UserLanguage() - if ctx.IsAuthenticated() { - h.template.SetLanguage(ctx.UserLanguage()) + if language != "" { + h.template.SetLanguage(language) } else { h.template.SetLanguage("en_US") } diff --git a/http/middleware/context_keys.go b/http/middleware/context_keys.go index 31ad286..887a90e 100644 --- a/http/middleware/context_keys.go +++ b/http/middleware/context_keys.go @@ -29,6 +29,9 @@ var ( // UserSessionTokenContextKey is the context key used to store the user session ID. UserSessionTokenContextKey = &ContextKey{"UserSessionToken"} + // UserLanguageContextKey is the context key to store user language. + UserLanguageContextKey = &ContextKey{"UserLanguageContextKey"} + // SessionIDContextKey is the context key used to store the session ID. SessionIDContextKey = &ContextKey{"SessionID"} diff --git a/http/middleware/session.go b/http/middleware/session.go index a0e9fbd..c3876f6 100644 --- a/http/middleware/session.go +++ b/http/middleware/session.go @@ -59,6 +59,7 @@ func (s *SessionMiddleware) Handler(next http.Handler) http.Handler { ctx = context.WithValue(ctx, OAuth2StateContextKey, session.Data.OAuth2State) ctx = context.WithValue(ctx, FlashMessageContextKey, session.Data.FlashMessage) ctx = context.WithValue(ctx, FlashErrorMessageContextKey, session.Data.FlashErrorMessage) + ctx = context.WithValue(ctx, UserLanguageContextKey, session.Data.Language) next.ServeHTTP(w, r.WithContext(ctx)) }) } diff --git a/http/middleware/user_session.go b/http/middleware/user_session.go index d67445f..820d093 100644 --- a/http/middleware/user_session.go +++ b/http/middleware/user_session.go @@ -50,7 +50,15 @@ func (s *UserSessionMiddleware) Handler(next http.Handler) http.Handler { func (s *UserSessionMiddleware) isPublicRoute(r *http.Request) bool { route := mux.CurrentRoute(r) switch route.GetName() { - case "login", "checkLogin", "stylesheet", "javascript", "oauth2Redirect", "oauth2Callback", "appIcon", "favicon", "webManifest": + case "login", + "checkLogin", + "stylesheet", + "javascript", + "oauth2Redirect", + "oauth2Callback", + "appIcon", + "favicon", + "webManifest": return true default: return false diff --git a/model/session.go b/model/session.go index 2a7430d..25f0388 100644 --- a/model/session.go +++ b/model/session.go @@ -17,11 +17,12 @@ type SessionData struct { OAuth2State string `json:"oauth2_state"` FlashMessage string `json:"flash_message"` FlashErrorMessage string `json:"flash_error_message"` + Language string `json:"language"` } func (s SessionData) String() string { - return fmt.Sprintf(`CSRF="%s", "OAuth2State="%s", FlashMessage="%s", "FlashErrorMessage="%s"`, - s.CSRF, s.OAuth2State, s.FlashMessage, s.FlashErrorMessage) + return fmt.Sprintf(`CSRF="%s", "OAuth2State="%s", FlashMessage="%s", FlashErrorMessage="%s", Lang="%s"`, + s.CSRF, s.OAuth2State, s.FlashMessage, s.FlashErrorMessage, s.Language) } // Value converts the session data to JSON. @@ -52,5 +53,5 @@ type Session struct { } func (s *Session) String() string { - return fmt.Sprintf(`ID="%s", Data="%v"`, s.ID, s.Data) + return fmt.Sprintf(`ID="%s", Data={%v}`, s.ID, s.Data) } diff --git a/ui/login.go b/ui/login.go index daaac58..f44e181 100644 --- a/ui/login.go +++ b/ui/login.go @@ -67,6 +67,10 @@ func (c *Controller) CheckLogin(ctx *handler.Context, request *handler.Request, func (c *Controller) Logout(ctx *handler.Context, request *handler.Request, response *handler.Response) { user := ctx.LoggedUser() + if err := c.store.UpdateSessionField(ctx.SessionID(), "language", user.Language); err != nil { + logger.Error("[Controller:Logout] %v", err) + } + if err := c.store.RemoveUserSessionByToken(user.ID, ctx.UserSessionToken()); err != nil { logger.Error("[Controller:Logout] %v", err) } -- cgit v1.2.3