"""
Tool 2: search_cves_by_keyword
Busca CVEs relacionados con un producto, vendor o palabra clave.
"""
import logging
from typing import Optional
from ..api.circl_client import get_client
from ..utils.formatters import format_cve_list
logger = logging.getLogger(__name__)
async def search_cves_by_keyword(
keyword: str,
vendor: Optional[str] = None,
limit: int = 10
) -> str:
"""
Busca CVEs por keyword/producto.
Args:
keyword: Término de búsqueda (ej. "apache", "wordpress")
vendor: Nombre del vendor (opcional, por defecto usa keyword)
limit: Número máximo de resultados (default: 10)
Returns:
String formateado con la lista de CVEs encontrados
Raises:
ValueError: Si los parámetros son inválidos
Exception: Para otros errores
"""
logger.info(f"Tool search_cves_by_keyword called with keyword: {keyword}, limit: {limit}")
# Validaciones
if not keyword or not isinstance(keyword, str):
raise ValueError("Keyword debe ser un string no vacío")
keyword = keyword.strip().lower()
if not vendor:
vendor = keyword
if not isinstance(limit, int) or limit < 1 or limit > 100:
raise ValueError("Limit debe ser un entero entre 1 y 100")
try:
# Obtener cliente y consultar API
client = get_client()
results = await client.search_by_vendor_product(vendor, keyword, limit)
if not results:
return f"""## Búsqueda de Vulnerabilidades
**Término de búsqueda**: {keyword}
**Vendor**: {vendor}
No se encontraron vulnerabilidades para esta búsqueda.
**Sugerencias**:
- Verifica la ortografía del producto/vendor
- Intenta con términos más genéricos (ej. "apache" en lugar de "apache http server")
- Algunos productos pueden tener nombres alternativos en la base de datos
"""
# Formatear resultados
formatted_result = format_cve_list(
results,
title=f"Vulnerabilidades de {keyword.capitalize()}"
)
logger.info(f"Found {len(results)} CVEs for {keyword}")
return formatted_result
except Exception as e:
logger.error(f"Error searching CVEs for {keyword}: {e}")
raise Exception(f"Error al buscar vulnerabilidades para '{keyword}': {str(e)}")