Add per-subsystem config validation for wireguard, authelia, nftables, tunnel

- wireguard: ValidateConfig checks ListenPort range, Address/LanCIDR CIDR
  format. SaveConfig now validates before writing.
- authelia: ValidateConfigOpts checks required fields (Domain, JWTSecret,
  SessionSecret) and StorageEncKey minimum length (20 chars). GenerateConfig
  now validates before generating.
- nftables: ValidateWANInterface checks interface exists via net.InterfaceByName
  before generating rules that reference it.
- tunnel: ValidateConfig checks TunnelID, PublicDomain, GatewayDomain are set
  and credentials file exists. WriteConfig now validates before generating.
This commit is contained in:
2026-07-14 11:54:58 +00:00
parent a0ab8faa1c
commit 2bb162a794
5 changed files with 97 additions and 14 deletions

View File

@@ -103,8 +103,29 @@ func (m *Manager) GetConfig() (*Config, error) {
return &cfg, nil
}
// SaveConfig writes the server interface config.
// ValidateConfig checks a WireGuard config for common errors before saving.
func ValidateConfig(cfg *Config) error {
if cfg.ListenPort < 1 || cfg.ListenPort > 65535 {
return fmt.Errorf("listenPort must be 1-65535, got %d", cfg.ListenPort)
}
if cfg.Address != "" {
if _, _, err := net.ParseCIDR(cfg.Address); err != nil {
return fmt.Errorf("invalid server address CIDR %q: %w", cfg.Address, err)
}
}
if cfg.LanCIDR != "" {
if _, _, err := net.ParseCIDR(cfg.LanCIDR); err != nil {
return fmt.Errorf("invalid LAN CIDR %q: %w", cfg.LanCIDR, err)
}
}
return nil
}
// SaveConfig validates and writes the server interface config.
func (m *Manager) SaveConfig(cfg *Config) error {
if err := ValidateConfig(cfg); err != nil {
return err
}
if err := os.MkdirAll(m.vpnDir(), 0755); err != nil {
return fmt.Errorf("create vpn dir: %w", err)
}