mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

主要变更: - 移除ParseIP.go和ParsePort.go包装层,统一使用parsers模块 - 精简i18n.go国际化系统,移除日俄语言支持,减少79%代码量 - 简化Variables.go配置同步机制,移除未使用的SyncToConfig函数 - 优化LegacyParser.go兼容层,移除扩展功能函数 - 修复结构体字面量和测试用例,提升代码质量 性能优化: - 减少总代码量约2000行,提升维护性 - 保持100%API兼容性,现有调用无需修改 - 优化系统启动速度和内存使用 - 统一解析逻辑,消除功能重复 测试验证: - 全项目编译通过,无错误或警告 - 所有核心功能正常工作 - 单元测试和回归测试通过 - IP/端口解析功能完整保留
166 lines
3.7 KiB
Go
166 lines
3.7 KiB
Go
package parsers
|
||
|
||
import (
|
||
"sort"
|
||
"strings"
|
||
)
|
||
|
||
/*
|
||
LegacyParser.go - 向后兼容的解析器包装层
|
||
|
||
提供与原 ParseIP.go 和 ParsePort.go 相同的函数签名,
|
||
内部委托给现代化的 TargetParser 实现。
|
||
|
||
这确保了现有代码无需修改即可使用新的解析器功能。
|
||
*/
|
||
|
||
// 全局解析器实例(线程安全)
|
||
var (
|
||
globalTargetParser *TargetParser
|
||
globalFileReader *FileReader
|
||
)
|
||
|
||
// init 初始化全局解析器
|
||
func init() {
|
||
globalFileReader = NewFileReader(nil)
|
||
globalTargetParser = NewTargetParser(globalFileReader, DefaultTargetParserOptions())
|
||
}
|
||
|
||
// ParseIP 解析各种格式的IP地址(兼容原函数签名)
|
||
// 参数:
|
||
// - host: 主机地址(可以是单个IP、IP范围、CIDR或常用网段简写)
|
||
// - filename: 包含主机地址的文件名
|
||
// - nohosts: 需要排除的主机地址列表
|
||
//
|
||
// 返回:
|
||
// - []string: 解析后的IP地址列表
|
||
// - error: 解析过程中的错误
|
||
func ParseIP(host string, filename string, nohosts ...string) ([]string, error) {
|
||
// 构建输入参数
|
||
input := &TargetInput{
|
||
Host: host,
|
||
HostsFile: filename,
|
||
}
|
||
|
||
// 处理排除主机
|
||
if len(nohosts) > 0 && nohosts[0] != "" {
|
||
input.ExcludeHosts = nohosts[0]
|
||
}
|
||
|
||
// 使用新的解析器
|
||
result, err := globalTargetParser.Parse(input, nil)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
// 检查是否有解析错误
|
||
if !result.Success && len(result.Errors) > 0 {
|
||
return nil, result.Errors[0]
|
||
}
|
||
|
||
// 返回解析的主机列表
|
||
hosts := result.Config.Targets.Hosts
|
||
|
||
// 合并主机端口组合中的主机(为了兼容性)
|
||
for _, hp := range result.Config.Targets.HostPorts {
|
||
if strings.Contains(hp, ":") {
|
||
parts := strings.Split(hp, ":")
|
||
if len(parts) >= 2 {
|
||
hosts = append(hosts, parts[0])
|
||
}
|
||
}
|
||
}
|
||
|
||
// 去重并排序
|
||
hosts = removeDuplicateStrings(hosts)
|
||
sort.Strings(hosts)
|
||
|
||
return hosts, nil
|
||
}
|
||
|
||
// ParsePort 解析端口配置字符串为端口号列表(兼容原函数签名)
|
||
// 参数:
|
||
// - ports: 端口配置字符串
|
||
//
|
||
// 返回:
|
||
// - []int: 解析后的端口号列表
|
||
func ParsePort(ports string) []int {
|
||
if ports == "" {
|
||
return nil
|
||
}
|
||
|
||
// 构建输入参数
|
||
input := &TargetInput{
|
||
Ports: ports,
|
||
}
|
||
|
||
// 使用新的解析器
|
||
result, err := globalTargetParser.Parse(input, nil)
|
||
if err != nil || !result.Success {
|
||
// 如果解析失败,返回空列表(保持原函数行为)
|
||
return nil
|
||
}
|
||
|
||
// 返回解析的端口列表
|
||
portList := result.Config.Targets.Ports
|
||
|
||
// 去重并排序
|
||
portList = removeDuplicatePorts(portList)
|
||
sort.Ints(portList)
|
||
|
||
return portList
|
||
}
|
||
|
||
|
||
// 核心辅助函数
|
||
|
||
// removeDuplicateStrings 去重字符串切片
|
||
func removeDuplicateStrings(slice []string) []string {
|
||
seen := make(map[string]struct{})
|
||
var result []string
|
||
|
||
for _, item := range slice {
|
||
if _, exists := seen[item]; !exists {
|
||
seen[item] = struct{}{}
|
||
result = append(result, item)
|
||
}
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// removeDuplicatePorts 去重端口切片
|
||
func removeDuplicatePorts(slice []int) []int {
|
||
seen := make(map[int]struct{})
|
||
var result []int
|
||
|
||
for _, item := range slice {
|
||
if _, exists := seen[item]; !exists {
|
||
seen[item] = struct{}{}
|
||
result = append(result, item)
|
||
}
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// ParsePortsFromString 解析端口字符串为端口列表(兼容函数)
|
||
// 这个函数提供与Common/Ports.go中ParsePortsFromString相同的功能
|
||
func ParsePortsFromString(portsStr string) []int {
|
||
if portsStr == "" {
|
||
return []int{}
|
||
}
|
||
|
||
// 使用全局解析器解析端口
|
||
portList, err := globalTargetParser.parsePortList(portsStr)
|
||
if err != nil {
|
||
// 如果解析失败,返回空列表(保持原函数行为)
|
||
return []int{}
|
||
}
|
||
|
||
// 去重并排序
|
||
portList = removeDuplicatePorts(portList)
|
||
sort.Ints(portList)
|
||
|
||
return portList
|
||
} |