Files
PixivFE/pages/settings.go
T
2024-02-08 14:32:42 +07:00

106 lines
2.3 KiB
Go

package pages
import (
"errors"
"io"
"net/http"
"regexp"
session "codeberg.org/vnpower/pixivfe/v2/core/config"
httpc "codeberg.org/vnpower/pixivfe/v2/core/http"
"github.com/gofiber/fiber/v2"
)
func setToken(c *fiber.Ctx) error {
// Parse the value from the form
token := c.FormValue("token")
if token != "" {
_, err := httpc.UnwrapWebAPIRequest(httpc.GetNewestFromFollowingURL("all", "1"), 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, _ := http.NewRequest("GET", "https://www.pixiv.net/en/artworks/115365120", nil)
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 tokens
if err := session.SetSessionValue(c, "Token", token); err != nil {
return err
}
if err := session.SetSessionValue(c, "CSRF", csrf); err != nil {
return err
}
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 != "" {
if err := session.SetSessionValue(c, "ImageProxy", token); err != nil {
return err
}
return nil
}
return errors.New("You submitted an empty/invalid form.")
}
func setLogout(c *fiber.Ctx) error {
session.RemoveSessionValue(c, "Token")
return nil
}
func SettingsPage(c *fiber.Ctx) error {
return c.Render("pages/settings", fiber.Map{})
}
func SettingsPost(c *fiber.Ctx) error {
t := c.Params("type")
var err error
switch t {
case "image_server":
err = setImageServer(c)
case "token":
err = setToken(c)
case "logout":
err = setLogout(c)
default:
err = errors.New("No such methods available.")
}
if err != nil {
return err
}
c.Redirect("/")
return nil
}