login.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package controller
  5. import (
  6. "github.com/miniflux/miniflux/logger"
  7. "github.com/miniflux/miniflux/server/cookie"
  8. "github.com/miniflux/miniflux/server/core"
  9. "github.com/miniflux/miniflux/server/ui/form"
  10. "github.com/tomasen/realip"
  11. )
  12. // ShowLoginPage shows the login form.
  13. func (c *Controller) ShowLoginPage(ctx *core.Context, request *core.Request, response *core.Response) {
  14. if ctx.IsAuthenticated() {
  15. response.Redirect(ctx.Route("unread"))
  16. return
  17. }
  18. response.HTML().Render("login", tplParams{
  19. "csrf": ctx.CSRF(),
  20. })
  21. }
  22. // CheckLogin validates the username/password and redirects the user to the unread page.
  23. func (c *Controller) CheckLogin(ctx *core.Context, request *core.Request, response *core.Response) {
  24. authForm := form.NewAuthForm(request.Request())
  25. tplParams := tplParams{
  26. "errorMessage": "Invalid username or password.",
  27. "csrf": ctx.CSRF(),
  28. "form": authForm,
  29. }
  30. if err := authForm.Validate(); err != nil {
  31. logger.Error("[Controller:CheckLogin] %v", err)
  32. response.HTML().Render("login", tplParams)
  33. return
  34. }
  35. if err := c.store.CheckPassword(authForm.Username, authForm.Password); err != nil {
  36. logger.Error("[Controller:CheckLogin] %v", err)
  37. response.HTML().Render("login", tplParams)
  38. return
  39. }
  40. sessionToken, err := c.store.CreateUserSession(
  41. authForm.Username,
  42. request.Request().UserAgent(),
  43. realip.RealIP(request.Request()),
  44. )
  45. if err != nil {
  46. response.HTML().ServerError(err)
  47. return
  48. }
  49. logger.Info("[Controller:CheckLogin] username=%s just logged in", authForm.Username)
  50. response.SetCookie(cookie.New(cookie.CookieUserSessionID, sessionToken, c.cfg.IsHTTPS))
  51. response.Redirect(ctx.Route("unread"))
  52. }
  53. // Logout destroy the session and redirects the user to the login page.
  54. func (c *Controller) Logout(ctx *core.Context, request *core.Request, response *core.Response) {
  55. user := ctx.LoggedUser()
  56. if err := c.store.RemoveUserSessionByToken(user.ID, ctx.UserSessionToken()); err != nil {
  57. logger.Error("[Controller:Logout] %v", err)
  58. }
  59. response.SetCookie(cookie.Expired(cookie.CookieUserSessionID, c.cfg.IsHTTPS))
  60. response.Redirect(ctx.Route("login"))
  61. }