dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit f919f271bb82e62c3baf63869155d6294d8070c2
parent 77f9aae7420dfb14693240ae7e57571300436cce
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Tue,  6 Jun 2023 20:47:30 -0700

cleanup

Diffstat:
Mpkg/web/handlers/handlers.go | 167++++++++++++++++++++++++++++++++++++++++---------------------------------------
1 file changed, 85 insertions(+), 82 deletions(-)

diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -282,110 +282,111 @@ func LoginAttackHandler(c echo.Context) error { return loginHandler(c) } -func loginHandler(c echo.Context) error { - formName := c.Request().PostFormValue("formName") +func loginFormHandler(c echo.Context) error { db := c.Get("database").(*database.DkfDB) - if formName == "" { - var data loginData - data.Autofocus = 0 - data.HomeUsersList = config.HomeUsersList.Load() + var data loginData + data.Autofocus = 0 + data.HomeUsersList = config.HomeUsersList.Load() + + if data.HomeUsersList { + data.Online = managers.ActiveUsers.GetActiveUsers() + } - if data.HomeUsersList { - data.Online = managers.ActiveUsers.GetActiveUsers() + actualLogin := func(username, password string, sessionDuration time.Duration, captchaSolved bool) error { + username = strings.TrimSpace(username) + user, err := db.GetVerifiedUserByUsername(database.Username(username)) + if err != nil { + time.Sleep(utils.RandMs(50, 200)) + data.Error = "Invalid username/password" + return c.Render(http.StatusOK, "standalone.login", data) } - actualLogin := func(username, password string, sessionDuration time.Duration, captchaSolved bool) error { - username = strings.TrimSpace(username) - user, err := db.GetVerifiedUserByUsername(database.Username(username)) - if err != nil { - time.Sleep(utils.RandMs(50, 200)) - data.Error = "Invalid username/password" - return c.Render(http.StatusOK, "standalone.login", data) - } + user.LoginAttempts++ + user.DoSave(db) - user.LoginAttempts++ - user.DoSave(db) - - if user.LoginAttempts > 4 && !captchaSolved { - data.CaptchaRequired = true - data.Autofocus = 2 - data.Error = "Captcha required" - data.CaptchaID, data.CaptchaImg = captcha.New() - data.Password = password - captchaID := c.Request().PostFormValue("captcha_id") - captchaInput := c.Request().PostFormValue("captcha") - if captchaInput == "" { + if user.LoginAttempts > 4 && !captchaSolved { + data.CaptchaRequired = true + data.Autofocus = 2 + data.Error = "Captcha required" + data.CaptchaID, data.CaptchaImg = captcha.New() + data.Password = password + captchaID := c.Request().PostFormValue("captcha_id") + captchaInput := c.Request().PostFormValue("captcha") + if captchaInput == "" { + return c.Render(http.StatusOK, "standalone.login", data) + } else { + if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { + data.Error = "Invalid captcha" return c.Render(http.StatusOK, "standalone.login", data) - } else { - if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { - data.Error = "Invalid captcha" - return c.Render(http.StatusOK, "standalone.login", data) - } } } + } - if !user.CheckPassword(db, password) { - data.Password = "" - data.Autofocus = 1 - data.Error = "Invalid username/password" - return c.Render(http.StatusOK, "standalone.login", data) - } - - if user.GpgTwoFactorEnabled { - token := utils.GenerateToken32() - if user.GpgTwoFactorMode { - partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, PgpSignStep, sessionDuration)) - return SessionsGpgSignTwoFactorHandler(c, true, token) - } - partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, PgpStep, sessionDuration)) - return SessionsGpgTwoFactorHandler(c, true, token) + if !user.CheckPassword(db, password) { + data.Password = "" + data.Autofocus = 1 + data.Error = "Invalid username/password" + return c.Render(http.StatusOK, "standalone.login", data) + } - } else if string(user.TwoFactorSecret) != "" { - token := utils.GenerateToken32() - partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, TwoFactorStep, sessionDuration)) - return SessionsTwoFactorHandler(c, true, token) + if user.GpgTwoFactorEnabled { + token := utils.GenerateToken32() + if user.GpgTwoFactorMode { + partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, PgpSignStep, sessionDuration)) + return SessionsGpgSignTwoFactorHandler(c, true, token) } + partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, PgpStep, sessionDuration)) + return SessionsGpgTwoFactorHandler(c, true, token) - return completeLogin(c, user, sessionDuration) + } else if string(user.TwoFactorSecret) != "" { + token := utils.GenerateToken32() + partialAuthCache.SetD(token, NewPartialAuthItem(user.ID, TwoFactorStep, sessionDuration)) + return SessionsTwoFactorHandler(c, true, token) } - usernameQuery := c.QueryParam("u") - passwordQuery := c.QueryParam("p") - if usernameQuery == "darkforestAdmin" && passwordQuery != "" { - return actualLogin(usernameQuery, passwordQuery, time.Hour*24, false) - } + return completeLogin(c, user, sessionDuration) + } - if config.ForceLoginCaptcha.IsTrue() { - data.CaptchaID, data.CaptchaImg = captcha.New() - data.CaptchaRequired = true - } + usernameQuery := c.QueryParam("u") + passwordQuery := c.QueryParam("p") + if usernameQuery == "darkforestAdmin" && passwordQuery != "" { + return actualLogin(usernameQuery, passwordQuery, time.Hour*24, false) + } - if c.Request().Method == http.MethodGet { - data.SessionDurationSec = 604800 - return c.Render(http.StatusOK, "standalone.login", data) - } + if config.ForceLoginCaptcha.IsTrue() { + data.CaptchaID, data.CaptchaImg = captcha.New() + data.CaptchaRequired = true + } - captchaSolved := false + if c.Request().Method == http.MethodGet { + data.SessionDurationSec = 604800 + return c.Render(http.StatusOK, "standalone.login", data) + } - data.Username = strings.TrimSpace(c.FormValue("username")) - password := c.FormValue("password") - data.SessionDurationSec = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("session_duration")), 60, utils.OneMonthSecs) - sessionDuration := time.Duration(data.SessionDurationSec) * time.Second + captchaSolved := false - if config.ForceLoginCaptcha.IsTrue() { - data.CaptchaRequired = true - captchaID := c.Request().PostFormValue("captcha_id") - captchaInput := c.Request().PostFormValue("captcha") - if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { - data.ErrCaptcha = err.Error() - return c.Render(http.StatusOK, "standalone.login", data) - } - captchaSolved = true + data.Username = strings.TrimSpace(c.FormValue("username")) + password := c.FormValue("password") + data.SessionDurationSec = utils.Clamp(utils.DoParseInt64(c.Request().PostFormValue("session_duration")), 60, utils.OneMonthSecs) + sessionDuration := time.Duration(data.SessionDurationSec) * time.Second + + if config.ForceLoginCaptcha.IsTrue() { + data.CaptchaRequired = true + captchaID := c.Request().PostFormValue("captcha_id") + captchaInput := c.Request().PostFormValue("captcha") + if err := hutils.CaptchaVerifyString(c, captchaID, captchaInput); err != nil { + data.ErrCaptcha = err.Error() + return c.Render(http.StatusOK, "standalone.login", data) } + captchaSolved = true + } - return actualLogin(data.Username, password, sessionDuration, captchaSolved) + return actualLogin(data.Username, password, sessionDuration, captchaSolved) +} - } else if formName == "pgp_2fa" { +func loginHandler(c echo.Context) error { + formName := c.Request().PostFormValue("formName") + if formName == "pgp_2fa" { token := c.Request().PostFormValue("token") return SessionsGpgTwoFactorHandler(c, false, token) } else if formName == "pgp_sign_2fa" { @@ -397,6 +398,8 @@ func loginHandler(c echo.Context) error { } else if formName == "2fa_recovery" { token := c.Request().PostFormValue("token") return SessionsTwoFactorRecoveryHandler(c, token) + } else if formName == "" { + return loginFormHandler(c) } return c.Redirect(http.StatusFound, "/") }