diff options
author | Simon Ser <contact@emersion.fr> | 2020-01-10 17:29:37 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-01-10 17:29:37 +0100 |
commit | 24718f1ac4f892b0e304189ddc21825ff59fb28d (patch) | |
tree | 1a8d24f1b4c532f5eca44abc7012bd25980f8bda | |
parent | b014c1898fef294a58178c5d82266d6b24774f8d (diff) | |
download | alps-24718f1ac4f892b0e304189ddc21825ff59fb28d.tar.gz alps-24718f1ac4f892b0e304189ddc21825ff59fb28d.zip |
Redirect to original URL after login
-rw-r--r-- | plugins/base/routes.go | 3 | ||||
-rw-r--r-- | server.go | 27 |
2 files changed, 23 insertions, 7 deletions
diff --git a/plugins/base/routes.go b/plugins/base/routes.go index e83c047..293d313 100644 --- a/plugins/base/routes.go +++ b/plugins/base/routes.go @@ -141,6 +141,9 @@ func handleLogin(ctx *koushin.Context) error { } ctx.SetSession(s) + if path := ctx.QueryParam("next"); path != "" && path[0] == '/' && path != "/login" { + return ctx.Redirect(http.StatusFound, path) + } return ctx.Redirect(http.StatusFound, "/mailbox/INBOX") } @@ -178,6 +178,24 @@ func isPublic(path string) bool { return path == "/login" || strings.HasPrefix(path, "/themes/") } +func redirectToLogin(ctx *Context) error { + path := ctx.Request().URL.Path + to := "/login" + if path != "/" && path != "/login" { + to += "?next=" + url.QueryEscape(ctx.Request().URL.String()) + } + return ctx.Redirect(http.StatusFound, to) +} + +func handleUnauthenticated(next echo.HandlerFunc, ctx *Context) error { + // Require auth for all requests except /login and assets + if isPublic(ctx.Request().URL.Path) { + return next(ctx) + } else { + return redirectToLogin(ctx) + } +} + type Options struct { IMAPURL, SMTPURL string Theme string @@ -228,12 +246,7 @@ func New(e *echo.Echo, options *Options) (*Server, error) { cookie, err := ctx.Cookie(cookieName) if err == http.ErrNoCookie { - // Require auth for all pages except /login - if isPublic(ctx.Path()) { - return next(ctx) - } else { - return ctx.Redirect(http.StatusFound, "/login") - } + return handleUnauthenticated(next, ctx) } else if err != nil { return err } @@ -241,7 +254,7 @@ func New(e *echo.Echo, options *Options) (*Server, error) { ctx.Session, err = ctx.Server.Sessions.get(cookie.Value) if err == errSessionExpired { ctx.SetSession(nil) - return ctx.Redirect(http.StatusFound, "/login") + return handleUnauthenticated(next, ctx) } else if err != nil { return err } |