From 2796544307cc1010650c62b85d6be2b298e28c54 Mon Sep 17 00:00:00 2001 From: Igor Olszewski Date: Mon, 25 May 2026 11:45:31 +0200 Subject: [PATCH] fix: improve description handling in scanners and PDF generator --- scanner/docker_scout_scanner.py | 4 ++-- scanner/grype_scanner.py | 4 ++-- static/app.js | 5 ++--- static/pdf_generator.js | 12 ++++++------ 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/scanner/docker_scout_scanner.py b/scanner/docker_scout_scanner.py index 1a5f4e1..ee69382 100644 --- a/scanner/docker_scout_scanner.py +++ b/scanner/docker_scout_scanner.py @@ -171,7 +171,7 @@ def create_finding_dict( Returns: Finding dictionary in internal format """ - short_desc = f"{description[:200]}..." if len(description) > 200 else description + # Build base remediation for package update base_remediation = ( @@ -193,7 +193,7 @@ def create_finding_dict( 'rule_id': rule_id, 'rule_name': f"Vulnerability in {package_name}", 'severity': severity, - 'description': short_desc, + 'description': description, 'full_description': description, 'remediation': remediation, 'estimated_savings': f"Security risk mitigation ({severity})", diff --git a/scanner/grype_scanner.py b/scanner/grype_scanner.py index 40c46c9..c156137 100644 --- a/scanner/grype_scanner.py +++ b/scanner/grype_scanner.py @@ -276,8 +276,8 @@ def normalize_grype_finding(vuln: Dict[str, Any], artifact: Dict[str, Any], imag 'rule_id': vuln_id, 'rule_name': f"Vulnerability in {package_name}", 'severity': normalized_severity, - 'description': f"{description[:200]}..." if len(description) > 200 else description, - 'full_description': description, # Store full description for tooltips + 'description': description, + 'full_description': description, 'remediation': f"Update {package_name} from {package_version} to {fix_version}" if fix_available == 'Yes' else f"Review {package_name}@{package_version} - no fix available", 'estimated_savings': f"Security risk mitigation ({severity})", 'line': 0, diff --git a/static/app.js b/static/app.js index 98c85e3..08ec42f 100644 --- a/static/app.js +++ b/static/app.js @@ -1250,9 +1250,8 @@ function initApp() { const urlPattern = /(https?:\/\/[^\s<]+)/g; escaped = escaped.replace(urlPattern, (fullUrl) => { // Keep full URL for href - const displayUrl = maxLength && fullUrl.length > maxLength - ? fullUrl.substring(0, maxLength) + '...' - : fullUrl; + // Show full URL text (allow CSS to line-break long URLs) + const displayUrl = fullUrl; return `${displayUrl}`; }); diff --git a/static/pdf_generator.js b/static/pdf_generator.js index ba92110..f78b8fc 100644 --- a/static/pdf_generator.js +++ b/static/pdf_generator.js @@ -120,11 +120,11 @@ function buildPdfDocument(results, summary, metadata, gradeReport) { `
${esc(trunc(fi.file,50))}${fi.line?':'+fi.line:''}
`).join('') + (findings.length>3 ? `
+${findings.length-3} more…
` : ''); return ` -
${esc(f.rule_name)}
${esc(trunc(f.description))}
+
${esc(f.rule_name)}
${esc(f.description || '')}
${sevBadge(f.severity)} ${findings.length} ${esc(f.estimated_savings||'—')} -
${esc(trunc(f.remediation,140))}
${files} +
${esc(f.remediation || '')}
${files} `; }).join(''); @@ -161,11 +161,11 @@ function buildPdfDocument(results, summary, metadata, gradeReport) { }).join('') + (findings.length>4?`
+${findings.length-4} more…
`:''); return ` ${esc(ruleId)} -
${esc(f.rule_name)}
${esc(trunc(f.description))}
+
${esc(f.rule_name)}
${esc(f.description || '')}
${sevBadge(f.severity)} ${findings.length} ${resources} -
${esc(trunc(f.remediation,130))}
+
${esc(f.remediation || '')}
`; }).join(''); @@ -213,7 +213,7 @@ function buildPdfDocument(results, summary, metadata, gradeReport) {
${esc(v.package)}
v${esc(v.package_version)}
${sevBadge(v.severity)} ${v.fix_version && v.fix_version!=='N/A' ? `→ ${esc(v.fix_version)}` : 'No fix yet'} -
${esc(trunc(v.description,100))}
+
${esc(v.description || '')}
`).join(''); return [imgRow, cveRows]; }).join(''); @@ -317,7 +317,7 @@ function buildPdfDocument(results, summary, metadata, gradeReport) { .data-table tbody tr:last-child { border-bottom: none; } .td { padding: 6px 8px; vertical-align: top; } .rule-name { font-weight: 600; color: #1E293B; margin-bottom: 2px; } - .cell-small { font-size: 0.7rem; color: #475569; line-height: 1.4; } + .cell-small { font-size: 0.7rem; color: #475569; line-height: 1.4; overflow-wrap: anywhere; word-break: break-word; } .muted { color: #94A3B8 !important; } .img-cell { border-top: 2px solid #BFDBFE; }