Skip to content

Commit 85abe9e

Browse files
committed
docs: 为解析器和搜索函数添加详细中文注释
1 parent 75285bd commit 85abe9e

File tree

5 files changed

+400
-33
lines changed

5 files changed

+400
-33
lines changed

README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ import (
101101
func main() {
102102
// 解析CPE 2.3字符串
103103
cpeObj, err := cpe.ParseCpe23("cpe:2.3:a:microsoft:windows:10:*:*:*:*:*:*:*")
104-
if err != nil {
104+
if err != nil {
105105
panic(err)
106106
}
107107

@@ -749,7 +749,7 @@ func main() {
749749

750750
log.Println("正在下载NVD数据...")
751751
nvdData, err := cpe.DownloadAllNVDData(options)
752-
if err != nil {
752+
if err != nil {
753753
log.Fatalf("无法获取NVD数据: %v", err)
754754
}
755755
log.Println("NVD数据下载完成")
@@ -857,9 +857,9 @@ type AssetManager struct {
857857

858858
// 创建资产管理器
859859
func NewAssetManager(storageDir string) (*AssetManager, error) {
860-
// 初始化文件存储
860+
// 初始化文件存储
861861
storage, err := cpe.NewFileStorage(storageDir, true)
862-
if err != nil {
862+
if err != nil {
863863
return nil, fmt.Errorf("初始化存储失败: %v", err)
864864
}
865865

@@ -876,7 +876,7 @@ func NewAssetManager(storageDir string) (*AssetManager, error) {
876876
// 添加新资产
877877
func (am *AssetManager) AddAsset(cpeStr, assetType, location, owner, notes string) error {
878878
cpeObj, err := cpe.ParseCpe23(cpeStr)
879-
if err != nil {
879+
if err != nil {
880880
return fmt.Errorf("解析CPE失败: %v", err)
881881
}
882882

@@ -945,7 +945,7 @@ func (am *AssetManager) GenerateReport() {
945945
func main() {
946946
// 创建资产管理器
947947
assetManager, err := NewAssetManager("./asset-data")
948-
if err != nil {
948+
if err != nil {
949949
log.Fatalf("创建资产管理器失败: %v", err)
950950
}
951951

@@ -1032,7 +1032,7 @@ func NewCVEAnalyzer() (*CVEAnalyzer, error) {
10321032

10331033
// 下载NVD数据
10341034
nvdData, err := cpe.DownloadAllNVDData(options)
1035-
if err != nil {
1035+
if err != nil {
10361036
return nil, fmt.Errorf("下载NVD数据失败: %v", err)
10371037
}
10381038

@@ -1163,7 +1163,7 @@ func printAnalysisResult(bulletin SecurityBulletin, result map[string]interface{
11631163
func main() {
11641164
// 初始化CVE分析器
11651165
analyzer, err := NewCVEAnalyzer()
1166-
if err != nil {
1166+
if err != nil {
11671167
log.Fatalf("初始化CVE分析器失败: %v", err)
11681168
}
11691169

@@ -1210,7 +1210,7 @@ func main() {
12101210
### 缓存管理
12111211

12121212
* **合理设置缓存过期时间**:NVD和CPE数据量较大,合理设置缓存可以显著提高性能。
1213-
```go
1213+
```go
12141214
options := cpe.DefaultNVDFeedOptions()
12151215
options.CacheDir = "/app/cache"
12161216
options.MaxAge = 24 * time.Hour // 数据每天更新一次
@@ -1239,15 +1239,15 @@ func main() {
12391239
### 查询优化
12401240

12411241
* **使用精确查询**:在可能的情况下,使用更精确的查询条件减少结果集大小。
1242-
```go
1242+
```go
12431243
// 不推荐
12441244
criteria := &cpe.CPE{Vendor: "microsoft"}
12451245

12461246
// 推荐
1247-
criteria := &cpe.CPE{
1247+
criteria := &cpe.CPE{
12481248
Vendor: "microsoft",
1249-
ProductName: "windows",
1250-
}
1249+
ProductName: "windows",
1250+
}
12511251
```
12521252

12531253
* **批量处理**:处理大量CPE数据时,使用批处理而非单个处理。
@@ -1287,7 +1287,7 @@ func main() {
12871287
```
12881288

12891289
* **流式处理**:对于非常大的数据集,使用流式处理避免一次性加载全部内容。
1290-
```go
1290+
```go
12911291
// 使用回调函数处理大量结果
12921292
searchWithCallback := func(criteria *cpe.CPE, callback func(*cpe.CPE) bool) {
12931293
// 搜索实现
@@ -1309,15 +1309,15 @@ func main() {
13091309
### 数据验证
13101310

13111311
* **验证外部输入**:处理用户输入的CPE或CVE字符串时进行验证。
1312-
```go
1312+
```go
13131313
// 验证CVE ID
13141314
if !cpe.ValidateCVE(userInput) {
13151315
return errors.New("无效的CVE ID")
13161316
}
13171317

13181318
// 验证CPE字符串
13191319
_, err := cpe.ParseCpe23(userInput)
1320-
if err != nil {
1320+
if err != nil {
13211321
return fmt.Errorf("无效的CPE: %v", err)
13221322
}
13231323
```
@@ -1333,8 +1333,8 @@ func main() {
13331333
### 错误处理
13341334

13351335
* **详细记录错误**:记录详细的错误信息便于调试和审计。
1336-
```go
1337-
if err != nil {
1336+
```go
1337+
if err != nil {
13381338
log.Printf("解析CPE失败: %v, 输入: %s", err, input)
13391339
return nil, err
13401340
}
@@ -1371,7 +1371,7 @@ func main() {
13711371
### 与现有系统集成
13721372

13731373
* **使用适配器模式**:创建适配器连接第三方系统。
1374-
```go
1374+
```go
13751375
// CMDB适配器示例
13761376
type CMDBAdapter struct {
13771377
client CMDBClient
@@ -1402,7 +1402,7 @@ func main() {
14021402
### 分布式部署
14031403

14041404
* **无状态设计**:设计组件时避免依赖共享状态。
1405-
```go
1405+
```go
14061406
// 创建独立服务
14071407
type CPEService struct {
14081408
storage cpe.Storage
@@ -1416,7 +1416,7 @@ func main() {
14161416
}
14171417

14181418
cpe2, err := cpe.ParseCpe23(cpeStr2)
1419-
if err != nil {
1419+
if err != nil {
14201420
return false, err
14211421
}
14221422

-4.8 MB
Binary file not shown.

parser_2.2.go

Lines changed: 156 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,50 @@ func ParseCpe22(cpe22 string) (*CPE, error) {
141141
return cpe, nil
142142
}
143143

144-
// FormatCpe22 将CPE对象格式化为CPE 2.2字符串
144+
/**
145+
* FormatCpe22 将CPE对象格式化为CPE 2.2字符串
146+
*
147+
* 根据CPE结构体的内容生成符合CPE 2.2标准格式的字符串表示。
148+
* 支持生成基本格式和扩展格式(带波浪线分隔的附加字段)。
149+
*
150+
* @param cpe *CPE CPE结构体指针,包含要格式化的CPE信息,不能为nil
151+
* @return string 符合CPE 2.2标准的格式化字符串
152+
*
153+
* 注意事项:
154+
* - 如果输入为nil,返回空字符串
155+
* - 线程安全:此函数不修改输入参数,可并发调用
156+
* - 性能考虑:字段值中特殊字符的转义会增加少量处理开销
157+
* - 格式细节:空字段会被替换为"*",特殊字符会被转义
158+
*
159+
* 示例:
160+
* ```go
161+
* // 创建并格式化基本CPE
162+
* cpe := &cpe.CPE{
163+
* Part: *cpe.PartApplication,
164+
* Vendor: cpe.Vendor("apache"),
165+
* ProductName: cpe.Product("tomcat"),
166+
* Version: cpe.Version("8.5.0"),
167+
* }
168+
* cpe22String := cpe.FormatCpe22(cpe)
169+
* fmt.Println(cpe22String)
170+
* // 输出: cpe:/a:apache:tomcat:8.5.0
171+
*
172+
* // 创建并格式化带扩展字段的CPE
173+
* cpe := &cpe.CPE{
174+
* Part: *cpe.PartApplication,
175+
* Vendor: cpe.Vendor("mysql"),
176+
* ProductName: cpe.Product("mysql"),
177+
* Version: cpe.Version("5.7.12"),
178+
* SoftwareEdition: "enterprise",
179+
* }
180+
* cpe22String := cpe.FormatCpe22(cpe)
181+
* fmt.Println(cpe22String)
182+
* // 输出: cpe:/a:mysql:mysql:5.7.12:::~~~enterprise~~~
183+
* ```
184+
*
185+
* @see ParseCpe22 用于解析CPE 2.2字符串为CPE结构体
186+
* @see escapeCpe22Value 用于转义CPE 2.2中的特殊字符
187+
*/
145188
func FormatCpe22(cpe *CPE) string {
146189
if cpe == nil {
147190
return ""
@@ -254,7 +297,41 @@ func FormatCpe22(cpe *CPE) string {
254297
return strings.Join(parts, "")
255298
}
256299

257-
// convertCpe22ToCpe23 将CPE 2.2格式转换为CPE 2.3格式
300+
/**
301+
* convertCpe22ToCpe23 将CPE 2.2格式转换为CPE 2.3格式
302+
*
303+
* 此函数实现了CPE 2.2格式字符串到CPE 2.3格式字符串的转换,按照官方标准进行映射。
304+
* 处理了基本格式和扩展格式(带波浪线的格式)的转换,转义和反转义特殊字符。
305+
*
306+
* @param cpe22 string CPE 2.2格式的字符串,以"cpe:/"开头
307+
* @return string 转换后的CPE 2.3格式字符串,如果输入无效则返回空字符串
308+
*
309+
* 注意事项:
310+
* - 如果输入格式不正确(不以"cpe:/"开头),返回空字符串
311+
* - 函数会自动处理各个字段的转义和反转义
312+
* - 转换遵循官方CPE规范中定义的2.2到2.3的映射规则
313+
*
314+
* 示例:
315+
* ```go
316+
* // 基本格式转换
317+
* cpe23 := cpe.convertCpe22ToCpe23("cpe:/a:apache:tomcat:8.5.0")
318+
* fmt.Println(cpe23)
319+
* // 输出: cpe:2.3:a:apache:tomcat:8.5.0:*:*:*:*:*:*:*
320+
*
321+
* // 扩展格式转换
322+
* cpe23 := cpe.convertCpe22ToCpe23("cpe:/a:mysql:mysql:5.7.12:::~~~enterprise~")
323+
* fmt.Println(cpe23)
324+
* // 输出: cpe:2.3:a:mysql:mysql:5.7.12:*:*:*:enterprise:*:*:*
325+
*
326+
* // 带特殊字符的转换
327+
* cpe23 := cpe.convertCpe22ToCpe23("cpe:/a:some\\.vendor:product\\/name:1\\.0")
328+
* fmt.Println(cpe23)
329+
* // 输出: cpe:2.3:a:some\.vendor:product\/name:1\.0:*:*:*:*:*:*:*
330+
* ```
331+
*
332+
* @see ParseCpe22 用于解析CPE 2.2字符串为CPE结构体
333+
* @see FormatCpe23 用于生成CPE 2.3格式字符串
334+
*/
258335
func convertCpe22ToCpe23(cpe22 string) string {
259336
// 检查输入
260337
if !strings.HasPrefix(cpe22, "cpe:/") {
@@ -404,7 +481,45 @@ func convertCpe22ToCpe23(cpe22 string) string {
404481
return strings.Join(cpe23Parts, ":")
405482
}
406483

407-
// escapeCpe22Value 对CPE 2.2格式的值进行转义
484+
/**
485+
* escapeCpe22Value 对CPE 2.2格式的值进行转义
486+
*
487+
* 将字符串中的特殊字符按照CPE 2.2规范进行转义,以便在CPE 2.2格式字符串中正确表示。
488+
* 特殊字符包括冒号(:)、斜杠(/)、波浪线(~)和点(.),但版本号字段中的点不进行转义。
489+
*
490+
* @param value string 需要转义的原始字符串
491+
* @return string 转义后的字符串
492+
*
493+
* 转义规则:
494+
* - 反斜杠(\)转义为\\
495+
* - 冒号(:)转义为%3a
496+
* - 斜杠(/)转义为%2f
497+
* - 波浪线(~)转义为%7e
498+
* - 点(.)转义为%2e(仅在非版本字段中)
499+
* - "*"和"-"等特殊值不进行转义
500+
*
501+
* 注意事项:
502+
* - 如果value是特殊通配符("*"或"-")或空字符串,则直接返回
503+
* - 对于版本字段,会检测字符串格式判断是否为版本号(如1.2.3格式),版本号中的点不会被转义
504+
* - 线程安全:此函数不修改输入参数,可并发调用
505+
*
506+
* 示例:
507+
* ```go
508+
* // 基本转义
509+
* escaped := cpe.escapeCpe22Value("product:name")
510+
* fmt.Println(escaped) // 输出: product%3aname
511+
*
512+
* // 版本字段中的点不转义
513+
* escaped := cpe.escapeCpe22Value("1.2.3")
514+
* fmt.Println(escaped) // 输出: 1.2.3 (不转义点)
515+
*
516+
* // 多种特殊字符转义
517+
* escaped := cpe.escapeCpe22Value("name/with~special:chars.here")
518+
* fmt.Println(escaped) // 输出: name%2fwith%7especial%3achars%2ehere
519+
* ```
520+
*
521+
* @see unescapeCpe22Value 用于将转义后的CPE 2.2字符串还原
522+
*/
408523
func escapeCpe22Value(value string) string {
409524
if value == "*" || value == "-" || value == "" {
410525
return value
@@ -433,7 +548,44 @@ func escapeCpe22Value(value string) string {
433548
return escaped
434549
}
435550

436-
// unescapeCpe22Value 对CPE 2.2格式的值进行反转义
551+
/**
552+
* unescapeCpe22Value 对CPE 2.2格式的值进行反转义
553+
*
554+
* 将CPE 2.2格式字符串中转义的特殊字符还原为普通字符。
555+
* 处理包括%3a (冒号)、%2f (斜杠)、%7e (波浪线)、%2e (点)等转义序列。
556+
*
557+
* @param value string 包含转义字符的CPE 2.2字符串值
558+
* @return string 反转义后的原始字符串
559+
*
560+
* 反转义规则:
561+
* - %3a 转换为 :
562+
* - %2f 转换为 /
563+
* - %7e 转换为 ~
564+
* - %2e 转换为 .
565+
* - \\\\ 转换为 \\
566+
* - "*"和"-"等特殊值不进行处理
567+
*
568+
* 注意事项:
569+
* - 如果value是特殊通配符("*"或"-")或空字符串,则直接返回
570+
* - 线程安全:此函数不修改输入参数,可并发调用
571+
*
572+
* 示例:
573+
* ```go
574+
* // 基本反转义
575+
* unescaped := cpe.unescapeCpe22Value("product%3aname")
576+
* fmt.Println(unescaped) // 输出: product:name
577+
*
578+
* // 多种特殊字符反转义
579+
* unescaped := cpe.unescapeCpe22Value("name%2fwith%7especial%3achars%2ehere")
580+
* fmt.Println(unescaped) // 输出: name/with~special:chars.here
581+
*
582+
* // 不包含转义字符的值
583+
* unescaped := cpe.unescapeCpe22Value("normal_text")
584+
* fmt.Println(unescaped) // 输出: normal_text (保持不变)
585+
* ```
586+
*
587+
* @see escapeCpe22Value 用于将字符串转义为CPE 2.2格式
588+
*/
437589
func unescapeCpe22Value(value string) string {
438590
if value == "*" || value == "-" || value == "" {
439591
return value

0 commit comments

Comments
 (0)