| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- // Copyright 2017 Frédéric Guillot. All rights reserved.
- // Use of this source code is governed by the Apache 2.0
- // license that can be found in the LICENSE file.
- package controller
- import (
- "log"
- "net/http"
- "time"
- "github.com/miniflux/miniflux2/server/core"
- "github.com/miniflux/miniflux2/server/ui/form"
- "github.com/tomasen/realip"
- )
- // ShowLoginPage shows the login form.
- func (c *Controller) ShowLoginPage(ctx *core.Context, request *core.Request, response *core.Response) {
- if ctx.IsAuthenticated() {
- response.Redirect(ctx.Route("unread"))
- return
- }
- response.HTML().Render("login", tplParams{
- "csrf": ctx.CsrfToken(),
- })
- }
- // CheckLogin validates the username/password and redirects the user to the unread page.
- func (c *Controller) CheckLogin(ctx *core.Context, request *core.Request, response *core.Response) {
- authForm := form.NewAuthForm(request.Request())
- tplParams := tplParams{
- "errorMessage": "Invalid username or password.",
- "csrf": ctx.CsrfToken(),
- }
- if err := authForm.Validate(); err != nil {
- log.Println(err)
- response.HTML().Render("login", tplParams)
- return
- }
- if err := c.store.CheckPassword(authForm.Username, authForm.Password); err != nil {
- log.Println(err)
- response.HTML().Render("login", tplParams)
- return
- }
- sessionToken, err := c.store.CreateSession(
- authForm.Username,
- request.Request().UserAgent(),
- realip.RealIP(request.Request()),
- )
- if err != nil {
- response.HTML().ServerError(err)
- return
- }
- log.Printf("[UI:CheckLogin] username=%s just logged in\n", authForm.Username)
- cookie := &http.Cookie{
- Name: "sessionID",
- Value: sessionToken,
- Path: "/",
- Secure: request.IsHTTPS(),
- HttpOnly: true,
- }
- response.SetCookie(cookie)
- response.Redirect(ctx.Route("unread"))
- }
- // Logout destroy the session and redirects the user to the login page.
- func (c *Controller) Logout(ctx *core.Context, request *core.Request, response *core.Response) {
- user := ctx.LoggedUser()
- sessionCookie := request.Cookie("sessionID")
- if err := c.store.RemoveSessionByToken(user.ID, sessionCookie); err != nil {
- log.Printf("[UI:Logout] %v", err)
- }
- cookie := &http.Cookie{
- Name: "sessionID",
- Value: "",
- Path: "/",
- Secure: request.IsHTTPS(),
- HttpOnly: true,
- MaxAge: -1,
- Expires: time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC),
- }
- response.SetCookie(cookie)
- response.Redirect(ctx.Route("login"))
- }
|