aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--http/handler/context.go9
-rw-r--r--http/handler/handler.go5
-rw-r--r--http/middleware/context_keys.go3
-rw-r--r--http/middleware/session.go1
-rw-r--r--http/middleware/user_session.go10
-rw-r--r--model/session.go7
-rw-r--r--ui/login.go4
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)
}