login.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. "log"
  7. "net/http"
  8. "time"
  9. "github.com/miniflux/miniflux2/server/core"
  10. "github.com/miniflux/miniflux2/server/ui/form"
  11. "github.com/tomasen/realip"
  12. )
  13. // ShowLoginPage shows the login form.
  14. func (c *Controller) ShowLoginPage(ctx *core.Context, request *core.Request, response *core.Response) {
  15. if ctx.IsAuthenticated() {
  16. response.Redirect(ctx.Route("unread"))
  17. return
  18. }
  19. response.HTML().Render("login", tplParams{
  20. "csrf": ctx.CsrfToken(),
  21. })
  22. }
  23. // CheckLogin validates the username/password and redirects the user to the unread page.
  24. func (c *Controller) CheckLogin(ctx *core.Context, request *core.Request, response *core.Response) {
  25. authForm := form.NewAuthForm(request.Request())
  26. tplParams := tplParams{
  27. "errorMessage": "Invalid username or password.",
  28. "csrf": ctx.CsrfToken(),
  29. }
  30. if err := authForm.Validate(); err != nil {
  31. log.Println(err)
  32. response.HTML().Render("login", tplParams)
  33. return
  34. }
  35. if err := c.store.CheckPassword(authForm.Username, authForm.Password); err != nil {
  36. log.Println(err)
  37. response.HTML().Render("login", tplParams)
  38. return
  39. }
  40. sessionToken, err := c.store.CreateSession(
  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. log.Printf("[UI:CheckLogin] username=%s just logged in\n", authForm.Username)
  50. cookie := &http.Cookie{
  51. Name: "sessionID",
  52. Value: sessionToken,
  53. Path: "/",
  54. Secure: request.IsHTTPS(),
  55. HttpOnly: true,
  56. }
  57. response.SetCookie(cookie)
  58. response.Redirect(ctx.Route("unread"))
  59. }
  60. // Logout destroy the session and redirects the user to the login page.
  61. func (c *Controller) Logout(ctx *core.Context, request *core.Request, response *core.Response) {
  62. user := ctx.LoggedUser()
  63. sessionCookie := request.Cookie("sessionID")
  64. if err := c.store.RemoveSessionByToken(user.ID, sessionCookie); err != nil {
  65. log.Printf("[UI:Logout] %v", err)
  66. }
  67. cookie := &http.Cookie{
  68. Name: "sessionID",
  69. Value: "",
  70. Path: "/",
  71. Secure: request.IsHTTPS(),
  72. HttpOnly: true,
  73. MaxAge: -1,
  74. Expires: time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC),
  75. }
  76. response.SetCookie(cookie)
  77. response.Redirect(ctx.Route("login"))
  78. }