login.go 2.2 KB

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