list.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package config
  2. import (
  3. "net/http"
  4. "net/url"
  5. "os"
  6. "strings"
  7. "github.com/0xJacky/Nginx-UI/internal/config"
  8. "github.com/0xJacky/Nginx-UI/internal/nginx"
  9. "github.com/gin-gonic/gin"
  10. "github.com/uozi-tech/cosy"
  11. "github.com/uozi-tech/cosy/logger"
  12. )
  13. func GetConfigs(c *gin.Context) {
  14. name := c.Query("name")
  15. sortBy := c.Query("sort_by")
  16. order := c.DefaultQuery("order", "desc")
  17. // Get directory parameter
  18. encodedDir := c.DefaultQuery("dir", "/")
  19. // Handle cases where the path might be encoded multiple times
  20. dir := encodedDir
  21. // Try decoding until the path no longer changes
  22. for {
  23. newDecodedDir, decodeErr := url.QueryUnescape(dir)
  24. if decodeErr != nil {
  25. cosy.ErrHandler(c, decodeErr)
  26. return
  27. }
  28. if newDecodedDir == dir {
  29. break
  30. }
  31. dir = newDecodedDir
  32. }
  33. // Ensure the directory path format is correct
  34. dir = strings.TrimSpace(dir)
  35. if dir != "/" && strings.HasSuffix(dir, "/") {
  36. dir = strings.TrimSuffix(dir, "/")
  37. }
  38. configFiles, err := os.ReadDir(nginx.GetConfPath(dir))
  39. if err != nil {
  40. cosy.ErrHandler(c, err)
  41. return
  42. }
  43. configs := make([]config.Config, 0)
  44. for i := range configFiles {
  45. file := configFiles[i]
  46. fileInfo, _ := file.Info()
  47. if name != "" && !strings.Contains(file.Name(), name) {
  48. continue
  49. }
  50. switch mode := fileInfo.Mode(); {
  51. case mode.IsRegular(): // regular file, not a hidden file
  52. if "." == file.Name()[0:1] {
  53. continue
  54. }
  55. case mode&os.ModeSymlink != 0: // is a symbol
  56. var targetPath string
  57. targetPath, err = os.Readlink(nginx.GetConfPath(dir, file.Name()))
  58. if err != nil {
  59. logger.Error("Read Symlink Error", targetPath, err)
  60. continue
  61. }
  62. var targetInfo os.FileInfo
  63. targetInfo, err = os.Stat(targetPath)
  64. if err != nil {
  65. logger.Error("Stat Error", targetPath, err)
  66. continue
  67. }
  68. // hide the file if it's target file is a directory
  69. if targetInfo.IsDir() {
  70. continue
  71. }
  72. }
  73. configs = append(configs, config.Config{
  74. Name: file.Name(),
  75. ModifiedAt: fileInfo.ModTime(),
  76. Size: fileInfo.Size(),
  77. IsDir: fileInfo.IsDir(),
  78. })
  79. }
  80. configs = config.Sort(sortBy, order, configs)
  81. c.JSON(http.StatusOK, gin.H{
  82. "data": configs,
  83. })
  84. }