2023-05-13 03:34:31 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2023-06-13 14:14:24 +00:00
|
|
|
"net"
|
2023-06-13 13:10:08 +00:00
|
|
|
"pixivfe/configs"
|
|
|
|
"pixivfe/handler"
|
|
|
|
"pixivfe/views"
|
2023-06-13 14:14:24 +00:00
|
|
|
"strings"
|
2023-06-22 09:09:40 +00:00
|
|
|
"time"
|
2023-06-13 13:10:08 +00:00
|
|
|
|
2023-06-12 05:22:26 +00:00
|
|
|
"github.com/goccy/go-json"
|
2023-06-12 04:28:50 +00:00
|
|
|
"github.com/gofiber/fiber/v2"
|
2023-06-12 08:45:21 +00:00
|
|
|
"github.com/gofiber/fiber/v2/middleware/cache"
|
2023-06-22 09:09:40 +00:00
|
|
|
"github.com/gofiber/fiber/v2/middleware/limiter"
|
2023-06-12 05:10:54 +00:00
|
|
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
2023-06-22 09:09:40 +00:00
|
|
|
"github.com/gofiber/fiber/v2/middleware/recover"
|
2023-06-13 13:10:08 +00:00
|
|
|
"github.com/gofiber/fiber/v2/utils"
|
2023-06-12 12:33:26 +00:00
|
|
|
"github.com/gofiber/template/jet/v2"
|
2023-05-13 03:34:31 +00:00
|
|
|
)
|
|
|
|
|
2023-06-23 12:33:46 +00:00
|
|
|
func setup_router() *fiber.App {
|
2023-06-12 04:28:50 +00:00
|
|
|
// HTML templates, automatically loaded
|
2023-06-12 12:33:26 +00:00
|
|
|
engine := jet.New("./template", ".jet.html")
|
2023-06-12 04:28:50 +00:00
|
|
|
|
2023-06-14 10:24:34 +00:00
|
|
|
engine.AddFuncMap(handler.GetTemplateFunctions())
|
2023-05-16 12:35:39 +00:00
|
|
|
|
2023-06-12 04:28:50 +00:00
|
|
|
server := fiber.New(fiber.Config{
|
2023-06-22 09:09:40 +00:00
|
|
|
AppName: "PixivFE",
|
|
|
|
DisableStartupMessage: false,
|
|
|
|
Views: engine,
|
|
|
|
Prefork: false,
|
|
|
|
JSONEncoder: json.Marshal,
|
|
|
|
JSONDecoder: json.Unmarshal,
|
|
|
|
ViewsLayout: "layout",
|
|
|
|
EnableTrustedProxyCheck: true,
|
|
|
|
TrustedProxies: []string{"0.0.0.0/0"},
|
|
|
|
ProxyHeader: fiber.HeaderXForwardedFor,
|
2023-06-24 12:59:18 +00:00
|
|
|
ErrorHandler: func(c *fiber.Ctx, err error) error {
|
|
|
|
// Status code defaults to 500
|
|
|
|
code := fiber.StatusInternalServerError
|
|
|
|
|
|
|
|
// // Retrieve the custom status code if it's a *fiber.Error
|
|
|
|
// var e *fiber.Error
|
|
|
|
// if errors.As(err, &e) {
|
|
|
|
// code = e.Code
|
|
|
|
// }
|
|
|
|
|
|
|
|
// Send custom error page
|
|
|
|
err = c.Status(code).Render("error", fiber.Map{"Title": code, "Error": err})
|
|
|
|
if err != nil {
|
|
|
|
// In case the SendFile fails
|
|
|
|
return c.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return from handler
|
|
|
|
return nil
|
|
|
|
},
|
2023-06-12 04:28:50 +00:00
|
|
|
})
|
2023-05-16 12:35:39 +00:00
|
|
|
|
2023-06-12 05:10:54 +00:00
|
|
|
server.Use(logger.New())
|
2023-06-13 13:10:08 +00:00
|
|
|
server.Use(cache.New(
|
|
|
|
cache.Config{
|
2023-06-24 10:48:57 +00:00
|
|
|
Next: func(c *fiber.Ctx) bool {
|
|
|
|
// Disable cache for settings page
|
|
|
|
return strings.Contains(c.Path(), "/settings")
|
|
|
|
},
|
2023-06-22 09:09:40 +00:00
|
|
|
Expiration: 5 * time.Minute,
|
|
|
|
|
2023-06-13 13:10:08 +00:00
|
|
|
KeyGenerator: func(c *fiber.Ctx) string {
|
|
|
|
return utils.CopyString(c.OriginalURL())
|
|
|
|
},
|
|
|
|
},
|
|
|
|
))
|
2023-06-22 09:09:40 +00:00
|
|
|
server.Use(recover.New())
|
|
|
|
|
|
|
|
server.Use(limiter.New(limiter.Config{
|
|
|
|
Max: 30,
|
|
|
|
Expiration: 5 * time.Minute,
|
|
|
|
LimitReached: func(c *fiber.Ctx) error {
|
|
|
|
return c.SendString("Rate limited")
|
|
|
|
},
|
|
|
|
}))
|
2023-06-12 05:10:54 +00:00
|
|
|
|
2023-06-20 14:27:38 +00:00
|
|
|
// Global headers (from GotHub)
|
|
|
|
server.Use(func(c *fiber.Ctx) error {
|
|
|
|
c.Set("X-Frame-Options", "SAMEORIGIN")
|
|
|
|
c.Set("X-XSS-Protection", "1; mode=block")
|
|
|
|
c.Set("X-Content-Type-Options", "nosniff")
|
|
|
|
c.Set("Referrer-Policy", "no-referrer")
|
|
|
|
c.Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload")
|
|
|
|
|
|
|
|
return c.Next()
|
|
|
|
})
|
2023-06-23 12:33:46 +00:00
|
|
|
// server.Use(func(c *fiber.Ctx) error {
|
|
|
|
// sess, err := configs.Store.Get(c)
|
|
|
|
// if err != nil {
|
|
|
|
// return err
|
|
|
|
// }
|
|
|
|
|
|
|
|
// var token_string, image_string string
|
|
|
|
|
|
|
|
// token := sess.Get("token")
|
|
|
|
// if token != nil {
|
|
|
|
// token_string = token.(string)
|
|
|
|
// } else {
|
|
|
|
// token_string = configs.ProxyServer
|
|
|
|
// }
|
|
|
|
|
|
|
|
// image := sess.Get("image-proxy")
|
|
|
|
// if image != nil {
|
|
|
|
// image_string = image.(string)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// c.Bind(fiber.Map{
|
|
|
|
// "Token": token_string,
|
|
|
|
// "ImageProxy": image_string,
|
|
|
|
// })
|
|
|
|
// return c.Next()
|
|
|
|
// })
|
2023-06-20 14:27:38 +00:00
|
|
|
|
2023-05-16 12:35:39 +00:00
|
|
|
// Static files
|
2023-06-12 04:28:50 +00:00
|
|
|
server.Static("/favicon.ico", "./template/favicon.ico")
|
2023-05-13 10:03:13 +00:00
|
|
|
server.Static("css/", "./template/css")
|
2023-06-02 03:19:27 +00:00
|
|
|
server.Static("assets/", "./template/assets")
|
2023-05-16 12:35:39 +00:00
|
|
|
|
|
|
|
// Routes/Views
|
|
|
|
views.SetupRoutes(server)
|
|
|
|
|
2023-06-05 03:26:05 +00:00
|
|
|
// Disable trusted proxies since we do not use any for now
|
2023-06-12 04:28:50 +00:00
|
|
|
// server.SetTrustedProxies(nil)
|
2023-06-05 03:26:05 +00:00
|
|
|
|
2023-05-16 12:35:39 +00:00
|
|
|
return server
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
2023-06-06 13:09:09 +00:00
|
|
|
err := configs.ParseConfig()
|
2023-06-20 14:21:27 +00:00
|
|
|
configs.SetupStorage()
|
2023-06-06 13:09:09 +00:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2023-05-18 13:18:44 +00:00
|
|
|
|
2023-06-23 12:33:46 +00:00
|
|
|
r := setup_router()
|
2023-05-16 12:35:39 +00:00
|
|
|
|
2023-06-13 14:14:24 +00:00
|
|
|
if strings.Contains(configs.Port, "/") {
|
|
|
|
ln, err := net.Listen("unix", configs.Port)
|
|
|
|
if err != nil {
|
|
|
|
panic("Failed to listen to " + configs.Port)
|
|
|
|
}
|
|
|
|
r.Listener(ln)
|
|
|
|
}
|
2023-06-12 04:28:50 +00:00
|
|
|
r.Listen(":" + configs.Port)
|
2023-05-13 03:34:31 +00:00
|
|
|
}
|