Files
PixivFE/pages/settings.go
T
2024-05-11 12:32:31 +00:00

153 lines
3.3 KiB
Go

package pages
import (
"errors"
"io"
"net/http"
"regexp"
httpc "codeberg.org/vnpower/pixivfe/v2/core/http"
session "codeberg.org/vnpower/pixivfe/v2/core/session"
"codeberg.org/vnpower/pixivfe/v2/doc"
"github.com/gofiber/fiber/v2"
)
// todo: allow clear proxy
// todo: allow clear all settings
func setToken(c *fiber.Ctx) error {
// Parse the value from the form
token := c.FormValue("token")
if token != "" {
URL := httpc.GetNewestFromFollowingURL("all", "1")
_, err := httpc.UnwrapWebAPIRequest(c.Context(), URL, token)
if err != nil {
return errors.New("Cannot authorize with supplied token.")
}
// Make a test request to verify the token.
// THE TEST URL IS NSFW!
req, err := http.NewRequest("GET", "https://www.pixiv.net/en/artworks/115365120", nil)
if err != nil {
return err
}
req = req.WithContext(c.Context())
req.Header.Add("User-Agent", "Mozilla/5.0")
req.AddCookie(&http.Cookie{
Name: "PHPSESSID",
Value: token,
})
resp, err := http.DefaultClient.Do(req)
if err != nil {
return errors.New("Cannot authorize with supplied token.")
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return errors.New("Cannot parse the response from Pixiv. Please report this issue.")
}
// CSRF token
r := regexp.MustCompile(`"token":"([0-9a-f]+)"`)
csrf := r.FindStringSubmatch(string(body))[1]
if csrf == "" {
return errors.New("Cannot authorize with supplied token.")
}
// Set the token
session.SetCookie(c, session.Cookie_Token, token)
session.SetCookie(c, session.Cookie_CSRF, csrf)
return nil
}
return errors.New("You submitted an empty/invalid form.")
}
func setImageServer(c *fiber.Ctx) error {
// Parse the value from the form
token := c.FormValue("image-proxy")
if token != "" {
session.SetCookie(c, session.Cookie_ImageProxy, token)
} else {
session.ClearCookie(c, session.Cookie_ImageProxy)
}
return nil
}
func setNovelFontType(c *fiber.Ctx) error {
fontType := c.FormValue("font-type")
if fontType != "" {
session.SetCookie(c, session.Cookie_NovelFontType, fontType)
}
return nil
}
func setNovelViewMode(c *fiber.Ctx) error {
viewMode := c.FormValue("view-mode")
if viewMode != "" {
session.SetCookie(c, session.Cookie_NovelViewMode, viewMode)
}
return nil
}
func setLogout(c *fiber.Ctx) error {
session.ClearCookie(c, session.Cookie_Token)
session.ClearCookie(c, session.Cookie_CSRF)
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,
})
}
func SettingsPost(c *fiber.Ctx) error {
t := c.Params("type")
var err error
switch t {
case "imageServer":
err = setImageServer(c)
case "token":
err = setToken(c)
case "logout":
err = setLogout(c)
case "reset-all":
err = resetAll(c)
case "novelFontType":
err = setNovelFontType(c)
case "novelViewMode":
err = setNovelViewMode(c)
default:
err = errors.New("No such setting is available.")
}
if err != nil {
return err
}
c.Redirect("/settings", http.StatusSeeOther)
return nil
}