in cvefeed/stats.go [122:149]
func flattenRule(node *schema.NVDCVEFeedJSON10DefNode, operators *stack) string {
cpePart := ""
operators.push(node.Operator)
switch {
case len(node.Children) > 0:
outputs := []string{}
for _, c := range node.Children {
outputs = append(outputs, flattenRule(c, operators))
}
operator, _ := operators.pop()
return fmt.Sprintf("(%s)", strings.Join(outputs, fmt.Sprintf(" %s ", operator)))
case len(node.CPEMatch) > 0:
for _, cpeMatch := range node.CPEMatch {
cpeItems := strings.Split(cpeMatch.Cpe23Uri, ":")
if len(cpeItems) > 2 {
part := cpeItems[2]
if _, ok := cpeParts[part]; ok && !strings.Contains(cpePart, part) {
cpePart += part
}
}
}
operator, _ := operators.pop()
if len(cpePart) > 1 {
return fmt.Sprintf("(%s)", strings.Join(strings.Split(cpePart, ""), fmt.Sprintf(" %s ", operator)))
}
}
return cpePart
}