diff --git a/core/user/cookie.go b/core/user/cookie.go index 02c2294..1b7147e 100644 --- a/core/user/cookie.go +++ b/core/user/cookie.go @@ -16,6 +16,9 @@ const ( Cookie_ImageProxy CookieName = "__Host-pixivfe-ImageProxy" ) +// Go can't make this a const... +var AllCookieNames = []CookieName{Cookie_Token, Cookie_CSRF, Cookie_ImageProxy} + func GetCookie(c *fiber.Ctx, name CookieName, defaultValue ...string) string { return c.Cookies(string(name), defaultValue...) } @@ -24,20 +27,24 @@ func SetCookie(c *fiber.Ctx, name CookieName, value string) { cookie := fiber.Cookie{ Name: string(name), Value: value, - Path: "/", + Path: "/", // expires in 30 days from now - Expires: c.Context().Time().Add(30 * (24 * time.Hour)), + Expires: c.Context().Time().Add(30 * (24 * time.Hour)), HTTPOnly: true, - Secure: true, + Secure: true, SameSite: fiber.CookieSameSiteStrictMode, // bye-bye cross site forgery } c.Cookie(&cookie) } func ClearCookie(c *fiber.Ctx, name CookieName) { - c.ClearCookie(string(name)) + // c.ClearCookie(string(name)) // gofiber bug + SetCookie(c, name, "") } func ClearAllCookies(c *fiber.Ctx) { - c.ClearCookie() + // c.ClearCookie() // gofiber bug + for _, name := range AllCookieNames { + SetCookie(c, name, "") + } } diff --git a/doc/dev/general.md b/doc/dev/general.md index f74e937..1a44674 100644 --- a/doc/dev/general.md +++ b/doc/dev/general.md @@ -5,9 +5,7 @@ /settings/ - [x] Merge login page with settings page -- [ ] Persistence -A JSON file to store values. -This way, values set by users won't be lost after restarts. +- [x] Persistence (http-only secure cookies) - [User Settings](user-customization.md) /novel/ diff --git a/pages/settings.go b/pages/settings.go index c399dba..6ef0c5f 100644 --- a/pages/settings.go +++ b/pages/settings.go @@ -71,9 +71,10 @@ func setImageServer(c *fiber.Ctx) error { token := c.FormValue("image-proxy") if token != "" { session.SetCookie(c, session.Cookie_ImageProxy, token) - return nil + } else { + session.ClearCookie(c, session.Cookie_ImageProxy) } - return errors.New("You submitted an empty/invalid form.") + return nil } func setLogout(c *fiber.Ctx) error { @@ -81,8 +82,22 @@ func setLogout(c *fiber.Ctx) error { return nil } +func resetAll(c *fiber.Ctx) error { + session.ClearAllCookies(c) + return nil +} + func SettingsPage(c *fiber.Ctx) error { + cookies := []fiber.Map{} + for _, name := range session.AllCookieNames { + value := session.GetCookie(c, name) + cookies = append(cookies, fiber.Map{ + "Key": name, + "Value": value, + }) + } return c.Render("pages/settings", fiber.Map{ + "CookieList": cookies, "ProxyList": doc.BuiltinProxyList, }) } @@ -98,6 +113,8 @@ func SettingsPost(c *fiber.Ctx) error { err = setToken(c) case "logout": err = setLogout(c) + case "reset-all": + err = resetAll(c) default: err = errors.New("no such setting available") } diff --git a/views/pages/settings.jet.html b/views/pages/settings.jet.html index abdceec..9fb2dc6 100644 --- a/views/pages/settings.jet.html +++ b/views/pages/settings.jet.html @@ -1,4 +1,13 @@
+

Current Settings

+ {{ range CookieList }} +
+ {{.Key}}={{.Value}} +
+ {{ end }} +
+ +

Login

Supported features (for now):