routers.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package router
  2. import (
  3. "bufio"
  4. "encoding/base64"
  5. "github.com/0xJacky/Nginx-UI/frontend"
  6. api2 "github.com/0xJacky/Nginx-UI/server/api"
  7. "github.com/0xJacky/Nginx-UI/server/model"
  8. "github.com/gin-contrib/static"
  9. "github.com/gin-gonic/gin"
  10. "io/fs"
  11. "log"
  12. "net/http"
  13. "path/filepath"
  14. "strings"
  15. )
  16. func authRequired() gin.HandlerFunc {
  17. return func(c *gin.Context) {
  18. token := c.GetHeader("Authorization")
  19. if token == "" {
  20. tmp, _ := base64.StdEncoding.DecodeString(c.Query("token"))
  21. token = string(tmp)
  22. if token == "" {
  23. c.JSON(http.StatusForbidden, gin.H{
  24. "message": "auth fail",
  25. })
  26. c.Abort()
  27. return
  28. }
  29. }
  30. n := model.CheckToken(token)
  31. if n < 1 {
  32. c.JSON(http.StatusForbidden, gin.H{
  33. "message": "auth fail",
  34. })
  35. c.Abort()
  36. return
  37. }
  38. c.Next()
  39. }
  40. }
  41. type serverFileSystemType struct {
  42. http.FileSystem
  43. }
  44. func (f serverFileSystemType) Exists(prefix string, path string) bool {
  45. _, err := f.Open(filepath.Join(prefix, path))
  46. return err == nil
  47. }
  48. func mustFS(dir string) (serverFileSystem static.ServeFileSystem) {
  49. sub, err := fs.Sub(frontend.DistFS, filepath.Join("dist", dir))
  50. if err != nil {
  51. log.Println(err)
  52. }
  53. serverFileSystem = serverFileSystemType{
  54. http.FS(sub),
  55. }
  56. return
  57. }
  58. func InitRouter() *gin.Engine {
  59. r := gin.New()
  60. r.Use(gin.Logger())
  61. r.Use(gin.Recovery())
  62. r.Use(static.Serve("/", mustFS("")))
  63. r.NoRoute(func(c *gin.Context) {
  64. accept := c.Request.Header.Get("Accept")
  65. if strings.Contains(accept, "text/html") {
  66. file, _ := mustFS("").Open("index.html")
  67. stat, _ := file.Stat()
  68. c.DataFromReader(http.StatusOK, stat.Size(), "text/html",
  69. bufio.NewReader(file), nil)
  70. }
  71. })
  72. g := r.Group("/api")
  73. {
  74. g.GET("install", api2.InstallLockCheck)
  75. g.POST("install", api2.InstallNginxUI)
  76. g.POST("/login", api2.Login)
  77. g.DELETE("/logout", api2.Logout)
  78. g := g.Group("/", authRequired())
  79. {
  80. g.GET("/analytic", api2.Analytic)
  81. g.GET("/users", api2.GetUsers)
  82. g.GET("/user/:id", api2.GetUser)
  83. g.POST("/user", api2.AddUser)
  84. g.POST("/user/:id", api2.EditUser)
  85. g.DELETE("/user/:id", api2.DeleteUser)
  86. g.GET("domains", api2.GetDomains)
  87. g.GET("domain/:name", api2.GetDomain)
  88. g.POST("domain/:name", api2.EditDomain)
  89. g.POST("domain/:name/enable", api2.EnableDomain)
  90. g.POST("domain/:name/disable", api2.DisableDomain)
  91. g.DELETE("domain/:name", api2.DeleteDomain)
  92. g.GET("configs", api2.GetConfigs)
  93. g.GET("config/:name", api2.GetConfig)
  94. g.POST("config", api2.AddConfig)
  95. g.POST("config/:name", api2.EditConfig)
  96. g.GET("backups", api2.GetFileBackupList)
  97. g.GET("backup/:id", api2.GetFileBackup)
  98. g.GET("template/:name", api2.GetTemplate)
  99. g.GET("cert/issue/:domain", api2.IssueCert)
  100. g.GET("cert/:domain/info", api2.CertInfo)
  101. // 添加域名到自动续期列表
  102. g.POST("cert/:domain", api2.AddDomainToAutoCert)
  103. // 从自动续期列表中删除域名
  104. g.DELETE("cert/:domain", api2.RemoveDomainFromAutoCert)
  105. }
  106. }
  107. return r
  108. }