mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 05:56:46 +08:00
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:
parent
619aa632d0
commit
aee8720a72
@ -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()
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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()
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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(),
|
||||
}
|
||||
}
|
@ -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 // 最小全局超时时间
|
||||
)
|
Loading…
Reference in New Issue
Block a user