config.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package config
  2. import (
  3. "encoding/json"
  4. "os"
  5. "sync"
  6. )
  7. // Config represents the application configuration
  8. type Config struct {
  9. mu sync.RWMutex `json:"-"`
  10. FTP FTPConfig `json:"ftp"`
  11. Web WebConfig `json:"web"`
  12. HTTPFile HTTPFileConfig `json:"httpFile"`
  13. Admin AdminConfig `json:"admin"`
  14. FTPUsers []FTPUser `json:"ftpUsers"`
  15. }
  16. // FTPConfig holds FTP server settings
  17. type FTPConfig struct {
  18. Host string `json:"host"`
  19. Port int `json:"port"`
  20. PassiveMin int `json:"passivePortMin"`
  21. PassiveMax int `json:"passivePortMax"`
  22. RootDir string `json:"rootDir"`
  23. }
  24. // WebConfig holds web admin panel settings
  25. type WebConfig struct {
  26. Host string `json:"host"`
  27. Port int `json:"port"`
  28. }
  29. // HTTPFileConfig holds HTTP file server settings
  30. type HTTPFileConfig struct {
  31. Enable bool `json:"enable"`
  32. Host string `json:"host"`
  33. Port int `json:"port"`
  34. RootDir string `json:"rootDir"`
  35. Upload bool `json:"upload"`
  36. }
  37. // AdminConfig holds admin credentials
  38. type AdminConfig struct {
  39. Username string `json:"username"`
  40. Password string `json:"password"`
  41. }
  42. // FTPUser represents an FTP user account
  43. type FTPUser struct {
  44. Username string `json:"username"`
  45. Password string `json:"password"`
  46. HomeDir string `json:"homeDir"`
  47. Write bool `json:"write"`
  48. }
  49. // DefaultConfig returns a default configuration
  50. func DefaultConfig() *Config {
  51. return &Config{
  52. FTP: FTPConfig{
  53. Host: "0.0.0.0",
  54. Port: 2121,
  55. PassiveMin: 50000,
  56. PassiveMax: 50100,
  57. RootDir: "./ftp_root",
  58. },
  59. Web: WebConfig{
  60. Host: "0.0.0.0",
  61. Port: 8080,
  62. },
  63. HTTPFile: HTTPFileConfig{
  64. Enable: true,
  65. Host: "0.0.0.0",
  66. Port: 9090,
  67. RootDir: "./ftp_root",
  68. Upload: true,
  69. },
  70. Admin: AdminConfig{
  71. Username: "admin",
  72. Password: "admin123",
  73. },
  74. FTPUsers: []FTPUser{
  75. {
  76. Username: "ftpuser",
  77. Password: "ftp123",
  78. HomeDir: "./ftp_root",
  79. Write: true,
  80. },
  81. },
  82. }
  83. }
  84. // Load loads configuration from a file
  85. func Load(path string) (*Config, error) {
  86. data, err := os.ReadFile(path)
  87. if err != nil {
  88. if os.IsNotExist(err) {
  89. cfg := DefaultConfig()
  90. if saveErr := cfg.Save(path); saveErr != nil {
  91. return nil, saveErr
  92. }
  93. return cfg, nil
  94. }
  95. return nil, err
  96. }
  97. var cfg Config
  98. if err := json.Unmarshal(data, &cfg); err != nil {
  99. return nil, err
  100. }
  101. return &cfg, nil
  102. }
  103. // Save saves configuration to a file
  104. func (c *Config) Save(path string) error {
  105. c.mu.RLock()
  106. defer c.mu.RUnlock()
  107. data, err := json.MarshalIndent(c, "", " ")
  108. if err != nil {
  109. return err
  110. }
  111. return os.WriteFile(path, data, 0644)
  112. }
  113. // GetFTPUser finds an FTP user by username
  114. func (c *Config) GetFTPUser(username string) *FTPUser {
  115. c.mu.RLock()
  116. defer c.mu.RUnlock()
  117. for i := range c.FTPUsers {
  118. if c.FTPUsers[i].Username == username {
  119. return &c.FTPUsers[i]
  120. }
  121. }
  122. return nil
  123. }
  124. // AddFTPUser adds a new FTP user
  125. func (c *Config) AddFTPUser(user FTPUser) {
  126. c.mu.Lock()
  127. defer c.mu.Unlock()
  128. c.FTPUsers = append(c.FTPUsers, user)
  129. }
  130. // DeleteFTPUser removes an FTP user by username
  131. func (c *Config) DeleteFTPUser(username string) bool {
  132. c.mu.Lock()
  133. defer c.mu.Unlock()
  134. for i, u := range c.FTPUsers {
  135. if u.Username == username {
  136. c.FTPUsers = append(c.FTPUsers[:i], c.FTPUsers[i+1:]...)
  137. return true
  138. }
  139. }
  140. return false
  141. }
  142. // UpdateFTPUser updates an existing FTP user
  143. func (c *Config) UpdateFTPUser(username string, user FTPUser) bool {
  144. c.mu.Lock()
  145. defer c.mu.Unlock()
  146. for i, u := range c.FTPUsers {
  147. if u.Username == username {
  148. c.FTPUsers[i] = user
  149. return true
  150. }
  151. }
  152. return false
  153. }
  154. // AuthenticateAdmin checks admin credentials
  155. func (c *Config) AuthenticateAdmin(username, password string) bool {
  156. c.mu.RLock()
  157. defer c.mu.RUnlock()
  158. return c.Admin.Username == username && c.Admin.Password == password
  159. }
  160. // GetFTPUsers returns a copy of all FTP users
  161. func (c *Config) GetFTPUsers() []FTPUser {
  162. c.mu.RLock()
  163. defer c.mu.RUnlock()
  164. users := make([]FTPUser, len(c.FTPUsers))
  165. copy(users, c.FTPUsers)
  166. return users
  167. }