config.go 3.6 KB

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