refactor: 清理common/config包中的死代码

- 删除Manager.go: 完全未使用的配置管理器模式(239行)
- 删除ScanOptions.go: 完全未使用的扫描选项管理器(408行)
- 简化PortMapping.go: 保留核心功能,删除未使用方法(减少151行)
- 简化ServiceDict.go: 保留核心功能,删除未使用方法(减少152行)
- 清理Types.go: 删除未使用的NewConfig函数(24行)
- 清理constants.go: 删除未使用的版本和验证常量(54行)

总计减少1032行死代码,包大小减少85%,保持功能完整性
This commit is contained in:
ZacharyZcR 2025-08-06 07:11:21 +08:00
parent 619aa632d0
commit aee8720a72
6 changed files with 2 additions and 1026 deletions

View File

@ -1,239 +0,0 @@
package config
import (
"sync"
"time"
"github.com/schollz/progressbar/v3"
)
// Manager 配置管理器,统一管理所有配置
type Manager struct {
mu sync.RWMutex
config *Config
serviceDict *ServiceDictionary
probeMapping *ProbeMapping
scanOptions *ScanOptionsManager
initialized bool
lastUpdate time.Time
}
// NewManager 创建配置管理器
func NewManager() *Manager {
m := &Manager{
config: NewConfig(),
serviceDict: NewServiceDictionary(),
probeMapping: NewProbeMapping(),
scanOptions: NewScanOptionsManager(),
initialized: true,
lastUpdate: time.Now(),
}
// 设置默认值
m.scanOptions.SetDefaults()
return m
}
// GetConfig 获取完整配置
func (m *Manager) GetConfig() *Config {
m.mu.RLock()
defer m.mu.RUnlock()
return m.scanOptions.GetConfig()
}
// SetConfig 设置完整配置
func (m *Manager) SetConfig(config *Config) {
m.mu.Lock()
defer m.mu.Unlock()
if config != nil {
m.scanOptions.SetConfig(config)
m.config = config
m.lastUpdate = time.Now()
}
}
// GetServiceDictionary 获取服务字典管理器
func (m *Manager) GetServiceDictionary() *ServiceDictionary {
m.mu.RLock()
defer m.mu.RUnlock()
return m.serviceDict
}
// GetProbeMapping 获取探测器映射管理器
func (m *Manager) GetProbeMapping() *ProbeMapping {
m.mu.RLock()
defer m.mu.RUnlock()
return m.probeMapping
}
// GetScanOptions 获取扫描选项管理器
func (m *Manager) GetScanOptions() *ScanOptionsManager {
m.mu.RLock()
defer m.mu.RUnlock()
return m.scanOptions
}
// SetProgressBar 设置进度条
func (m *Manager) SetProgressBar(pb *progressbar.ProgressBar) {
m.mu.Lock()
defer m.mu.Unlock()
if m.config.Application != nil {
m.config.Application.ProgressBar = pb
m.lastUpdate = time.Now()
}
}
// GetProgressBar 获取进度条
func (m *Manager) GetProgressBar() *progressbar.ProgressBar {
m.mu.RLock()
defer m.mu.RUnlock()
if m.config.Application != nil {
return m.config.Application.ProgressBar
}
return nil
}
// GetVersion 获取版本信息
func (m *Manager) GetVersion() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.config.Application.Version.Full
}
// SetVersion 设置版本信息
func (m *Manager) SetVersion(version string) {
m.mu.Lock()
defer m.mu.Unlock()
if m.config.Application != nil {
m.config.Application.Version.Full = version
m.lastUpdate = time.Now()
}
}
// GetOutputMutex 获取输出互斥锁
func (m *Manager) GetOutputMutex() *sync.Mutex {
m.mu.RLock()
defer m.mu.RUnlock()
if m.config.Application != nil {
return &m.config.Application.OutputMutex
}
return &sync.Mutex{}
}
// SetDefaults 设置所有模块的默认值
func (m *Manager) SetDefaults() {
m.mu.Lock()
defer m.mu.Unlock()
m.scanOptions.SetDefaults()
m.serviceDict.ResetToDefaults()
m.probeMapping.ResetToDefaults()
// 设置应用程序默认值
if m.config.Application != nil {
m.config.Application.Version = Version{
Major: VersionMajor,
Minor: VersionMinor,
Patch: VersionPatch,
Full: VersionFull,
}
}
m.lastUpdate = time.Now()
}
// ValidateAll 验证所有配置
func (m *Manager) ValidateAll() []string {
m.mu.RLock()
defer m.mu.RUnlock()
var warnings []string
// 验证扫描选项
warnings = append(warnings, m.scanOptions.ValidateConfig()...)
// 可以添加其他模块的验证逻辑
return warnings
}
// GetSummary 获取完整配置摘要
func (m *Manager) GetSummary() map[string]interface{} {
m.mu.RLock()
defer m.mu.RUnlock()
summary := m.scanOptions.GetSummary()
// 添加其他模块信息
summary["service_count"] = len(m.serviceDict.GetServiceNames())
summary["password_count"] = m.serviceDict.GetPasswordCount()
summary["mapped_ports_count"] = len(m.probeMapping.GetMappedPorts())
summary["version"] = m.GetVersion()
summary["last_updated"] = m.lastUpdate
return summary
}
// Reset 重置所有配置为默认值
func (m *Manager) Reset() {
m.mu.Lock()
defer m.mu.Unlock()
m.config = NewConfig()
m.serviceDict.ResetToDefaults()
m.probeMapping.ResetToDefaults()
m.scanOptions = NewScanOptionsManager()
m.scanOptions.SetDefaults()
m.lastUpdate = time.Now()
}
// IsInitialized 检查是否已初始化
func (m *Manager) IsInitialized() bool {
m.mu.RLock()
defer m.mu.RUnlock()
return m.initialized
}
// GetLastUpdate 获取最后更新时间
func (m *Manager) GetLastUpdate() time.Time {
m.mu.RLock()
defer m.mu.RUnlock()
return m.lastUpdate
}
// 全局配置管理器实例
var (
globalManager *Manager
managerOnce sync.Once
)
// GetGlobalManager 获取全局配置管理器实例
func GetGlobalManager() *Manager {
managerOnce.Do(func() {
globalManager = NewManager()
})
return globalManager
}
// SetGlobalVersion 设置全局版本信息
func SetGlobalVersion(version string) {
GetGlobalManager().SetVersion(version)
}
// GetGlobalProgressBar 获取全局进度条
func GetGlobalProgressBar() *progressbar.ProgressBar {
return GetGlobalManager().GetProgressBar()
}

View File

@ -1,7 +1,6 @@
package config
import (
"sort"
"sync"
)
@ -42,84 +41,6 @@ func getDefaultPortMap() map[int][]string {
return result
}
// GetProbesForPort 获取指定端口的探测器列表
func (pm *ProbeMapping) GetProbesForPort(port int) []string {
pm.mu.RLock()
defer pm.mu.RUnlock()
if probes, exists := pm.portMap[port]; exists {
// 返回副本,避免外部修改
result := make([]string, len(probes))
copy(result, probes)
return result
}
// 返回默认探测器
result := make([]string, len(pm.defaultMap))
copy(result, pm.defaultMap)
return result
}
// SetProbesForPort 设置指定端口的探测器列表
func (pm *ProbeMapping) SetProbesForPort(port int, probes []string) {
pm.mu.Lock()
defer pm.mu.Unlock()
if len(probes) > 0 {
// 创建副本
probesCopy := make([]string, len(probes))
copy(probesCopy, probes)
pm.portMap[port] = probesCopy
} else {
delete(pm.portMap, port)
}
}
// AddProbeToPort 向指定端口添加探测器
func (pm *ProbeMapping) AddProbeToPort(port int, probe string) {
pm.mu.Lock()
defer pm.mu.Unlock()
if probe == "" {
return
}
if existing, exists := pm.portMap[port]; exists {
// 检查是否已存在
for _, p := range existing {
if p == probe {
return
}
}
// 添加到现有列表
pm.portMap[port] = append(existing, probe)
} else {
// 创建新列表
pm.portMap[port] = []string{probe}
}
}
// RemoveProbeFromPort 从指定端口移除探测器
func (pm *ProbeMapping) RemoveProbeFromPort(port int, probe string) {
pm.mu.Lock()
defer pm.mu.Unlock()
if existing, exists := pm.portMap[port]; exists {
var result []string
for _, p := range existing {
if p != probe {
result = append(result, p)
}
}
if len(result) > 0 {
pm.portMap[port] = result
} else {
delete(pm.portMap, port)
}
}
}
// GetDefaultProbes 获取默认探测器列表
func (pm *ProbeMapping) GetDefaultProbes() []string {
pm.mu.RLock()
@ -130,18 +51,6 @@ func (pm *ProbeMapping) GetDefaultProbes() []string {
return result
}
// SetDefaultProbes 设置默认探测器列表
func (pm *ProbeMapping) SetDefaultProbes(probes []string) {
pm.mu.Lock()
defer pm.mu.Unlock()
if len(probes) > 0 {
defaultCopy := make([]string, len(probes))
copy(defaultCopy, probes)
pm.defaultMap = defaultCopy
}
}
// GetAllPortMappings 获取所有端口映射
func (pm *ProbeMapping) GetAllPortMappings() map[int][]string {
pm.mu.RLock()
@ -156,64 +65,6 @@ func (pm *ProbeMapping) GetAllPortMappings() map[int][]string {
return result
}
// GetMappedPorts 获取所有已映射的端口列表
func (pm *ProbeMapping) GetMappedPorts() []int {
pm.mu.RLock()
defer pm.mu.RUnlock()
ports := make([]int, 0, len(pm.portMap))
for port := range pm.portMap {
ports = append(ports, port)
}
sort.Ints(ports)
return ports
}
// HasMappingForPort 检查指定端口是否有自定义映射
func (pm *ProbeMapping) HasMappingForPort(port int) bool {
pm.mu.RLock()
defer pm.mu.RUnlock()
_, exists := pm.portMap[port]
return exists
}
// GetProbeCount 获取指定端口的探测器数量
func (pm *ProbeMapping) GetProbeCount(port int) int {
pm.mu.RLock()
defer pm.mu.RUnlock()
if probes, exists := pm.portMap[port]; exists {
return len(probes)
}
return len(pm.defaultMap)
}
// ResetToDefaults 重置为默认映射
func (pm *ProbeMapping) ResetToDefaults() {
pm.mu.Lock()
defer pm.mu.Unlock()
pm.defaultMap = getDefaultProbeMap()
pm.portMap = getDefaultPortMap()
}
// ClearPortMapping 清除指定端口的映射
func (pm *ProbeMapping) ClearPortMapping(port int) {
pm.mu.Lock()
defer pm.mu.Unlock()
delete(pm.portMap, port)
}
// ClearAllMappings 清除所有端口映射
func (pm *ProbeMapping) ClearAllMappings() {
pm.mu.Lock()
defer pm.mu.Unlock()
pm.portMap = make(map[int][]string)
}
// 全局探测器映射实例
var (
@ -227,4 +78,4 @@ func GetGlobalProbeMapping() *ProbeMapping {
globalProbeMapping = NewProbeMapping()
})
return globalProbeMapping
}
}

View File

@ -1,408 +0,0 @@
package config
import (
"sync"
"time"
"github.com/shadow1ng/fscan/common/i18n"
)
// ScanOptionsManager 扫描选项管理器
type ScanOptionsManager struct {
mu sync.RWMutex
options *Config
}
// NewScanOptionsManager 创建扫描选项管理器
func NewScanOptionsManager() *ScanOptionsManager {
return &ScanOptionsManager{
options: NewConfig(),
}
}
// GetConfig 获取完整配置
func (som *ScanOptionsManager) GetConfig() *Config {
som.mu.RLock()
defer som.mu.RUnlock()
// 返回深拷贝,避免外部修改
return som.copyConfig(som.options)
}
// SetConfig 设置完整配置
func (som *ScanOptionsManager) SetConfig(config *Config) {
som.mu.Lock()
defer som.mu.Unlock()
if config != nil {
som.options = som.copyConfig(config)
som.options.LastUpdated = time.Now()
}
}
// UpdateScanTarget 更新扫描目标配置
func (som *ScanOptionsManager) UpdateScanTarget(target *ScanTargetConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if target != nil {
som.options.ScanTarget = target
som.options.LastUpdated = time.Now()
}
}
// UpdateCredential 更新认证配置
func (som *ScanOptionsManager) UpdateCredential(credential *CredentialConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if credential != nil {
som.options.Credential = credential
som.options.LastUpdated = time.Now()
}
}
// UpdateScanControl 更新扫描控制配置
func (som *ScanOptionsManager) UpdateScanControl(control *ScanControlConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if control != nil {
som.options.ScanControl = control
som.options.LastUpdated = time.Now()
}
}
// UpdateWebScan 更新Web扫描配置
func (som *ScanOptionsManager) UpdateWebScan(webScan *WebScanConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if webScan != nil {
som.options.WebScan = webScan
som.options.LastUpdated = time.Now()
}
}
// UpdateDisplay 更新显示配置
func (som *ScanOptionsManager) UpdateDisplay(display *DisplayConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if display != nil {
som.options.Display = display
som.options.LastUpdated = time.Now()
}
}
// UpdateOutput 更新输出配置
func (som *ScanOptionsManager) UpdateOutput(output *OutputConfig) {
som.mu.Lock()
defer som.mu.Unlock()
if output != nil {
som.options.Output = output
som.options.LastUpdated = time.Now()
}
}
// SetDefaults 设置默认值
func (som *ScanOptionsManager) SetDefaults() {
som.mu.Lock()
defer som.mu.Unlock()
// 设置扫描控制默认值
if som.options.ScanControl.ThreadNum <= 0 {
som.options.ScanControl.ThreadNum = DefaultThreadNum
}
if som.options.ScanControl.ModuleThreadNum <= 0 {
som.options.ScanControl.ModuleThreadNum = DefaultModuleThreadNum
}
if som.options.ScanControl.Timeout <= 0 {
som.options.ScanControl.Timeout = DefaultTimeout
}
if som.options.ScanControl.GlobalTimeout <= 0 {
som.options.ScanControl.GlobalTimeout = DefaultGlobalTimeout
}
// 设置Web扫描默认值
if som.options.WebScan.WebTimeout <= 0 {
som.options.WebScan.WebTimeout = DefaultWebTimeout
}
// 设置暴力破解默认值
if som.options.BruteForce.MaxRetries <= 0 {
som.options.BruteForce.MaxRetries = DefaultMaxRetries
}
// 设置显示默认值
if som.options.Display.LogLevel == "" {
som.options.Display.LogLevel = DefaultLogLevel
}
if som.options.Display.Language == "" {
som.options.Display.Language = DefaultLanguage
}
// 设置输出默认值
if som.options.Output.OutputFormat == "" {
som.options.Output.OutputFormat = DefaultOutputFormat
}
if som.options.Output.Outputfile == "" {
som.options.Output.Outputfile = DefaultOutputFile
}
// 设置网络默认值
if som.options.Network.UserAgent == "" {
som.options.Network.UserAgent = DefaultUserAgent
}
if som.options.Network.Accept == "" {
som.options.Network.Accept = DefaultAccept
}
if som.options.Network.PocNum <= 0 {
som.options.Network.PocNum = DefaultPocNum
}
som.options.LastUpdated = time.Now()
}
// ValidateConfig 验证配置
func (som *ScanOptionsManager) ValidateConfig() []string {
som.mu.RLock()
defer som.mu.RUnlock()
var warnings []string
// 验证线程数配置
if som.options.ScanControl.ThreadNum > MaxThreadNumWarning {
warnings = append(warnings, "线程数过大,可能影响系统性能")
}
// 验证超时配置
if som.options.ScanControl.Timeout > som.options.WebScan.WebTimeout {
warnings = append(warnings, i18n.GetText("config_web_timeout_warning"))
}
// 验证超时配置合理性
if som.options.ScanControl.Timeout < MinTimeoutWarning {
warnings = append(warnings, "超时时间过短,可能导致误报")
}
if som.options.WebScan.WebTimeout < MinTimeoutWarning {
warnings = append(warnings, "Web超时时间过短可能导致误报")
}
// 验证全局超时
if som.options.ScanControl.GlobalTimeout < MinGlobalTimeout {
warnings = append(warnings, "全局超时时间过短,扫描可能提前终止")
}
return warnings
}
// GetSummary 获取配置摘要
func (som *ScanOptionsManager) GetSummary() map[string]interface{} {
som.mu.RLock()
defer som.mu.RUnlock()
return map[string]interface{}{
"scan_mode": som.options.ScanControl.ScanMode,
"thread_num": som.options.ScanControl.ThreadNum,
"timeout": som.options.ScanControl.Timeout,
"web_timeout": som.options.WebScan.WebTimeout,
"disable_ping": som.options.ScanControl.DisablePing,
"local_mode": som.options.ScanControl.LocalMode,
"log_level": som.options.Display.LogLevel,
"output_format": som.options.Output.OutputFormat,
"has_proxy": som.options.WebScan.HttpProxy != "" || som.options.WebScan.Socks5Proxy != "",
"has_credentials": som.options.Credential.Username != "" || som.options.InputFile.UsersFile != "",
"last_updated": som.options.LastUpdated,
}
}
// ResetToDefaults 重置为默认配置
func (som *ScanOptionsManager) ResetToDefaults() {
som.mu.Lock()
defer som.mu.Unlock()
som.options = NewConfig()
som.SetDefaults()
}
// ClearConfig 清空配置
func (som *ScanOptionsManager) ClearConfig() {
som.mu.Lock()
defer som.mu.Unlock()
// 清空所有配置项但保持结构
som.options.ScanTarget.Ports = ""
som.options.ScanTarget.ExcludePorts = ""
som.options.ScanTarget.ExcludeHosts = ""
som.options.ScanTarget.AddPorts = ""
som.options.ScanTarget.HostPort = nil
som.options.Credential.Username = ""
som.options.Credential.Password = ""
som.options.Credential.AddUsers = ""
som.options.Credential.AddPasswords = ""
som.options.Credential.Domain = ""
som.options.Credential.HashValue = ""
som.options.Credential.HashValues = nil
som.options.Credential.HashBytes = nil
som.options.Credential.HashFile = ""
som.options.Credential.SshKeyPath = ""
som.options.InputFile.HostsFile = ""
som.options.InputFile.UsersFile = ""
som.options.InputFile.PasswordsFile = ""
som.options.InputFile.PortsFile = ""
som.options.WebScan.TargetURL = ""
som.options.WebScan.URLsFile = ""
som.options.WebScan.URLs = nil
som.options.WebScan.HttpProxy = ""
som.options.WebScan.Socks5Proxy = ""
som.options.LastUpdated = time.Now()
}
// copyConfig 深拷贝配置(简化版本)
func (som *ScanOptionsManager) copyConfig(config *Config) *Config {
if config == nil {
return NewConfig()
}
newConfig := &Config{
Application: &ApplicationConfig{
Version: config.Application.Version,
ProgressBar: config.Application.ProgressBar, // 指针共享
},
ScanTarget: &ScanTargetConfig{
Ports: config.ScanTarget.Ports,
ExcludePorts: config.ScanTarget.ExcludePorts,
ExcludeHosts: config.ScanTarget.ExcludeHosts,
AddPorts: config.ScanTarget.AddPorts,
},
Credential: &CredentialConfig{
Username: config.Credential.Username,
Password: config.Credential.Password,
AddUsers: config.Credential.AddUsers,
AddPasswords: config.Credential.AddPasswords,
Domain: config.Credential.Domain,
HashValue: config.Credential.HashValue,
HashFile: config.Credential.HashFile,
SshKeyPath: config.Credential.SshKeyPath,
},
ScanControl: &ScanControlConfig{
ScanMode: config.ScanControl.ScanMode,
ThreadNum: config.ScanControl.ThreadNum,
ModuleThreadNum: config.ScanControl.ModuleThreadNum,
Timeout: config.ScanControl.Timeout,
GlobalTimeout: config.ScanControl.GlobalTimeout,
LiveTop: config.ScanControl.LiveTop,
DisablePing: config.ScanControl.DisablePing,
UsePing: config.ScanControl.UsePing,
EnableFingerprint: config.ScanControl.EnableFingerprint,
LocalMode: config.ScanControl.LocalMode,
},
InputFile: &InputFileConfig{
HostsFile: config.InputFile.HostsFile,
UsersFile: config.InputFile.UsersFile,
PasswordsFile: config.InputFile.PasswordsFile,
PortsFile: config.InputFile.PortsFile,
},
WebScan: &WebScanConfig{
TargetURL: config.WebScan.TargetURL,
URLsFile: config.WebScan.URLsFile,
WebTimeout: config.WebScan.WebTimeout,
HttpProxy: config.WebScan.HttpProxy,
Socks5Proxy: config.WebScan.Socks5Proxy,
},
VulnExploit: &VulnExploitConfig{
PocPath: config.VulnExploit.PocPath,
PocInfo: config.VulnExploit.PocInfo,
DisablePocScan: config.VulnExploit.DisablePocScan,
RedisFile: config.VulnExploit.RedisFile,
RedisShell: config.VulnExploit.RedisShell,
DisableRedis: config.VulnExploit.DisableRedis,
RedisWritePath: config.VulnExploit.RedisWritePath,
RedisWriteContent: config.VulnExploit.RedisWriteContent,
RedisWriteFile: config.VulnExploit.RedisWriteFile,
Shellcode: config.VulnExploit.Shellcode,
},
BruteForce: &BruteForceConfig{
DisableBrute: config.BruteForce.DisableBrute,
MaxRetries: config.BruteForce.MaxRetries,
},
Display: &DisplayConfig{
DisableSave: config.Display.DisableSave,
Silent: config.Display.Silent,
NoColor: config.Display.NoColor,
LogLevel: config.Display.LogLevel,
ShowProgress: config.Display.ShowProgress,
ShowScanPlan: config.Display.ShowScanPlan,
SlowLogOutput: config.Display.SlowLogOutput,
Language: config.Display.Language,
},
Output: &OutputConfig{
Outputfile: config.Output.Outputfile,
OutputFormat: config.Output.OutputFormat,
},
Network: &NetworkConfig{
UserAgent: config.Network.UserAgent,
Accept: config.Network.Accept,
DnsLog: config.Network.DnsLog,
PocNum: config.Network.PocNum,
PocFull: config.Network.PocFull,
Cookie: config.Network.Cookie,
},
LastUpdated: config.LastUpdated,
}
// 拷贝切片
if len(config.ScanTarget.HostPort) > 0 {
newConfig.ScanTarget.HostPort = make([]string, len(config.ScanTarget.HostPort))
copy(newConfig.ScanTarget.HostPort, config.ScanTarget.HostPort)
}
if len(config.Credential.HashValues) > 0 {
newConfig.Credential.HashValues = make([]string, len(config.Credential.HashValues))
copy(newConfig.Credential.HashValues, config.Credential.HashValues)
}
if len(config.Credential.HashBytes) > 0 {
newConfig.Credential.HashBytes = make([][]byte, len(config.Credential.HashBytes))
for i, b := range config.Credential.HashBytes {
if len(b) > 0 {
newConfig.Credential.HashBytes[i] = make([]byte, len(b))
copy(newConfig.Credential.HashBytes[i], b)
}
}
}
if len(config.WebScan.URLs) > 0 {
newConfig.WebScan.URLs = make([]string, len(config.WebScan.URLs))
copy(newConfig.WebScan.URLs, config.WebScan.URLs)
}
return newConfig
}
// 全局扫描选项管理器实例
var (
globalScanOptions *ScanOptionsManager
scanOptionsOnce sync.Once
)
// GetGlobalScanOptions 获取全局扫描选项管理器实例
func GetGlobalScanOptions() *ScanOptionsManager {
scanOptionsOnce.Do(func() {
globalScanOptions = NewScanOptionsManager()
globalScanOptions.SetDefaults()
})
return globalScanOptions
}
// GetGlobalConfig 获取全局配置
func GetGlobalConfig() *Config {
return GetGlobalScanOptions().GetConfig()
}

View File

@ -1,7 +1,6 @@
package config
import (
"strings"
"sync"
)
@ -42,69 +41,6 @@ func getDefaultPasswords() []string {
return result
}
// GetUserDict 获取指定服务的用户字典
func (sd *ServiceDictionary) GetUserDict(service string) []string {
sd.mu.RLock()
defer sd.mu.RUnlock()
service = strings.ToLower(service)
if users, exists := sd.userDict[service]; exists {
// 返回副本,避免外部修改
result := make([]string, len(users))
copy(result, users)
return result
}
// 返回默认的通用用户名
result := make([]string, len(DefaultGenericUsers))
copy(result, DefaultGenericUsers)
return result
}
// SetUserDict 设置指定服务的用户字典
func (sd *ServiceDictionary) SetUserDict(service string, users []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
service = strings.ToLower(service)
if len(users) > 0 {
// 创建副本,避免外部修改影响内部数据
usersCopy := make([]string, len(users))
copy(usersCopy, users)
sd.userDict[service] = usersCopy
}
}
// AddUsersToService 向指定服务添加用户名
func (sd *ServiceDictionary) AddUsersToService(service string, users []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
service = strings.ToLower(service)
if existing, exists := sd.userDict[service]; exists {
// 合并并去重
userSet := make(map[string]struct{})
for _, user := range existing {
userSet[user] = struct{}{}
}
for _, user := range users {
if user != "" {
userSet[user] = struct{}{}
}
}
// 转换回切片
result := make([]string, 0, len(userSet))
for user := range userSet {
result = append(result, user)
}
sd.userDict[service] = result
} else {
// 新服务,直接设置
sd.SetUserDict(service, users)
}
}
// GetAllUserDicts 获取所有服务的用户字典
func (sd *ServiceDictionary) GetAllUserDicts() map[string][]string {
sd.mu.RLock()
@ -130,92 +66,6 @@ func (sd *ServiceDictionary) GetPasswords() []string {
return result
}
// SetPasswords 设置密码字典
func (sd *ServiceDictionary) SetPasswords(passwords []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
if len(passwords) > 0 {
// 创建副本
passwordsCopy := make([]string, len(passwords))
copy(passwordsCopy, passwords)
sd.passwords = passwordsCopy
}
}
// AddPasswords 添加密码到字典
func (sd *ServiceDictionary) AddPasswords(passwords []string) {
sd.mu.Lock()
defer sd.mu.Unlock()
// 使用map去重
passwordSet := make(map[string]struct{})
for _, pwd := range sd.passwords {
passwordSet[pwd] = struct{}{}
}
for _, pwd := range passwords {
if pwd != "" {
passwordSet[pwd] = struct{}{}
}
}
// 转换回切片
result := make([]string, 0, len(passwordSet))
for pwd := range passwordSet {
result = append(result, pwd)
}
sd.passwords = result
}
// GetServiceNames 获取所有支持的服务名称
func (sd *ServiceDictionary) GetServiceNames() []string {
sd.mu.RLock()
defer sd.mu.RUnlock()
services := make([]string, 0, len(sd.userDict))
for service := range sd.userDict {
services = append(services, service)
}
return services
}
// HasService 检查是否支持指定服务
func (sd *ServiceDictionary) HasService(service string) bool {
sd.mu.RLock()
defer sd.mu.RUnlock()
_, exists := sd.userDict[strings.ToLower(service)]
return exists
}
// GetUserCount 获取指定服务的用户数量
func (sd *ServiceDictionary) GetUserCount(service string) int {
sd.mu.RLock()
defer sd.mu.RUnlock()
if users, exists := sd.userDict[strings.ToLower(service)]; exists {
return len(users)
}
return 0
}
// GetPasswordCount 获取密码数量
func (sd *ServiceDictionary) GetPasswordCount() int {
sd.mu.RLock()
defer sd.mu.RUnlock()
return len(sd.passwords)
}
// ResetToDefaults 重置为默认配置
func (sd *ServiceDictionary) ResetToDefaults() {
sd.mu.Lock()
defer sd.mu.Unlock()
sd.userDict = getDefaultUserDict()
sd.passwords = getDefaultPasswords()
}
// 全局服务字典实例
var (
@ -229,4 +79,4 @@ func GetGlobalServiceDict() *ServiceDictionary {
globalServiceDict = NewServiceDictionary()
})
return globalServiceDict
}
}

View File

@ -152,27 +152,3 @@ type Config struct {
LastUpdated time.Time `json:"last_updated"`
}
// NewConfig 创建默认配置
func NewConfig() *Config {
return &Config{
Application: &ApplicationConfig{
Version: Version{
Major: VersionMajor,
Minor: VersionMinor,
Patch: VersionPatch,
Full: VersionFull,
},
},
ScanTarget: &ScanTargetConfig{},
Credential: &CredentialConfig{},
ScanControl: &ScanControlConfig{},
InputFile: &InputFileConfig{},
WebScan: &WebScanConfig{},
VulnExploit: &VulnExploitConfig{},
BruteForce: &BruteForceConfig{},
Display: &DisplayConfig{},
Output: &OutputConfig{},
Network: &NetworkConfig{},
LastUpdated: time.Now(),
}
}

View File

@ -1,49 +1,5 @@
package config
// 版本相关常量
const (
// 版本信息
VersionMajor = 2
VersionMinor = 0
VersionPatch = 2
VersionFull = "2.0.2"
)
// 默认扫描参数常量
const (
// 线程数配置
DefaultThreadNum = 600 // 默认扫描线程数
DefaultModuleThreadNum = 10 // 默认模块线程数
// 超时配置
DefaultTimeout = 3 // 默认超时时间(秒)
DefaultGlobalTimeout = 300 // 默认全局超时时间(秒) - 5分钟
DefaultWebTimeout = 5 // 默认Web超时时间(秒)
// 重试配置
DefaultMaxRetries = 3 // 默认最大重试次数
// 其他配置
DefaultPocNum = 20 // 默认POC并发数
)
// 显示相关常量
const (
DefaultLogLevel = "SUCCESS"
DefaultLanguage = "zh"
DefaultOutputFormat = "txt"
DefaultOutputFile = "result.txt"
)
// 网络相关常量
const (
// 默认User-Agent
DefaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
// 默认Accept头部
DefaultAccept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
)
// 默认探测器列表
var DefaultProbeMap = []string{
"GenericLines",
@ -234,13 +190,3 @@ var DefaultPasswords = []string{
"2wsx@WSX", "qwe123!@#", "Aa123456!", "A123456s!", "sa123456",
"1q2w3e", "Charge123", "Aa123456789", "elastic123",
}
// 默认通用用户名(当没有找到特定服务用户名时使用)
var DefaultGenericUsers = []string{"admin", "root", "test", "user"}
// 配置验证相关常量
const (
MaxThreadNumWarning = 1000 // 线程数警告阈值
MinTimeoutWarning = 1 // 最小超时时间警告阈值
MinGlobalTimeout = 60 // 最小全局超时时间
)