middleware.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package router
  2. import (
  3. "encoding/base64"
  4. "github.com/0xJacky/Nginx-UI/frontend"
  5. "github.com/0xJacky/Nginx-UI/server/model"
  6. "github.com/gin-contrib/static"
  7. "github.com/gin-gonic/gin"
  8. "io/fs"
  9. "log"
  10. "net/http"
  11. "path"
  12. "strings"
  13. )
  14. func authRequired() gin.HandlerFunc {
  15. return func(c *gin.Context) {
  16. token := c.GetHeader("Authorization")
  17. if token == "" {
  18. tmp, _ := base64.StdEncoding.DecodeString(c.Query("token"))
  19. token = string(tmp)
  20. if token == "" {
  21. c.JSON(http.StatusForbidden, gin.H{
  22. "message": "auth fail",
  23. })
  24. c.Abort()
  25. return
  26. }
  27. }
  28. n := model.CheckToken(token)
  29. if n < 1 {
  30. c.JSON(http.StatusForbidden, gin.H{
  31. "message": "auth fail",
  32. })
  33. c.Abort()
  34. return
  35. }
  36. c.Next()
  37. }
  38. }
  39. type serverFileSystemType struct {
  40. http.FileSystem
  41. }
  42. func (f serverFileSystemType) Exists(prefix string, _path string) bool {
  43. _, err := f.Open(path.Join(prefix, _path))
  44. return err == nil
  45. }
  46. func mustFS(dir string) (serverFileSystem static.ServeFileSystem) {
  47. sub, err := fs.Sub(frontend.DistFS, path.Join("dist", dir))
  48. if err != nil {
  49. log.Println(err)
  50. return
  51. }
  52. serverFileSystem = serverFileSystemType{
  53. http.FS(sub),
  54. }
  55. return
  56. }
  57. // tryStatic Static returns a middleware handler that serves static files in the given directory.
  58. func tryStatic(urlPrefix string, fs static.ServeFileSystem) gin.HandlerFunc {
  59. fileserver := http.FileServer(fs)
  60. if urlPrefix != "" {
  61. fileserver = http.StripPrefix(urlPrefix, fileserver)
  62. }
  63. return func(c *gin.Context) {
  64. if fs.Exists(urlPrefix, c.Request.URL.Path) {
  65. fileserver.ServeHTTP(c.Writer, c.Request)
  66. if strings.Contains(c.Request.URL.Path, ".js") {
  67. c.Writer.Header().Set("content-type", "application/javascript")
  68. }
  69. c.Abort()
  70. }
  71. }
  72. }