|
36 | 36 | errorContainer.className = 'error' |
37 | 37 | errorContainer.style.display = 'none' |
38 | 38 |
|
39 | | - function moduleVersion(/** @type {string} */mod, /** @type {string|undefined} */ver) { |
40 | | - if (ver) { |
41 | | - return `<a href="https://pkg.go.dev/${mod}@${ver}">${mod}@${ver}</a>`; |
| 39 | + function packageVersion(/** @type {string} */mod, /** @type {string} */pkg, /** @type {string|undefined} */ver) { |
| 40 | + if (!ver) { |
| 41 | + return 'N/A'; |
42 | 42 | } |
43 | | - return 'N/A' |
| 43 | + |
| 44 | + if (mod === 'stdlib' && ver.startsWith('v')) { |
| 45 | + ver = `go${ver.slice(1)}`; |
| 46 | + } |
| 47 | + return `<a href="https://pkg.go.dev/${pkg}@${ver}">${pkg}@${ver}</a>`; |
| 48 | + } |
| 49 | + |
| 50 | + function modVersion(/** @type {string} */mod, /** @type {string|undefined} */ver) { |
| 51 | + if (!ver) { |
| 52 | + return 'N/A'; |
| 53 | + } |
| 54 | + |
| 55 | + if (mod === 'stdlib' && ver.startsWith('v')) { |
| 56 | + ver = `go${ver.slice(1)}`; |
| 57 | + } |
| 58 | + return `<a href="https://pkg.go.dev/${mod}@${ver}">${mod}@${ver}</a>`; |
44 | 59 | } |
45 | 60 |
|
46 | 61 | function offerUpgrade(/** @type {string} */dir, /** @type {string} */mod, /** @type {string|undefined} */ver) { |
| 62 | + if (mod === 'stdlib') { |
| 63 | + return ''; |
| 64 | + } |
47 | 65 | if (dir && mod && ver) { |
48 | 66 | return ` [<span class="vuln-fix" data-target="${mod}@${ver}" data-dir="${dir}">go get</span> | <span class="vuln-fix" data-target="${mod}@latest" data-dir="${dir}">go get latest</span>]` |
49 | 67 | } |
|
83 | 101 | const vulns = json.Vuln || []; |
84 | 102 | const affecting = vulns.filter((v) => v.CallStackSummaries?.length); |
85 | 103 | const unaffecting = vulns.filter((v) => !v.CallStackSummaries?.length); |
86 | | - |
| 104 | + |
87 | 105 | runLog.innerHTML = ` |
88 | 106 | <tr><td>Dir:</td><td>${json.Dir || ''}</td></tr> |
89 | 107 | <tr><td>Pattern:</td><td>${json.Pattern || ''}</td></tr> |
90 | 108 | <tr><td>Analyzed at:</td><td>${timeinfo(json.Start, json.Duration)}</td></tr> |
91 | | -<tr><td>Found ${affecting?.length || 0} known vulnerabilities</td></tr>`; |
| 109 | +<tr><td>Found</td><td>${affecting?.length || 0} known vulnerabilities</td></tr>`; |
| 110 | + if (unaffecting?.length > 0) { |
| 111 | + runLog.innerHTML += `<tr><td>Found</td><td>${unaffecting.length} informational vulnerabilities</td></tr>` |
| 112 | + } |
| 113 | + |
92 | 114 | logContainer.appendChild(runLog); |
93 | 115 |
|
94 | 116 | vulnsContainer.innerHTML = ''; |
|
114 | 136 | details.className = 'vuln-details' |
115 | 137 | details.innerHTML = ` |
116 | 138 | <tr><td>Package</td><td>${vuln.PkgPath}</td></tr> |
117 | | - <tr><td>Found in Version</td><td>${moduleVersion(vuln.ModPath, vuln.CurrentVersion)}</td></tr> |
118 | | - <tr><td>Fixed Version</td><td>${moduleVersion(vuln.ModPath, vuln.FixedVersion)} ${offerUpgrade(json.Dir, vuln.ModPath, vuln.FixedVersion)}</td></tr> |
| 139 | + <tr><td>Found in Version</td><td>${packageVersion(vuln.ModPath, vuln.PkgPath, vuln.CurrentVersion)}</td></tr> |
| 140 | + <tr><td>Fixed Version</td><td>${packageVersion(vuln.ModPath, vuln.PkgPath, vuln.FixedVersion)} ${offerUpgrade(json.Dir, vuln.ModPath, vuln.FixedVersion)}</td></tr> |
119 | 141 | <tr><td>Affecting</td><td>${vuln.AffectedPkgs?.join('<br>')}</td></tr> |
120 | 142 | `; |
121 | 143 | element.appendChild(details); |
|
156 | 178 |
|
157 | 179 | unaffectingContainer.innerText = ''; |
158 | 180 | if (unaffecting.length > 0) { |
159 | | - unaffectingContainer.innerHTML = '<hr></hr><p>The vulnerabilities below are in packages that you import, but your code does not appear to call any vulnerable functions. You may not need to take any action. See <a href="https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck">https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck</a> for details.'; |
| 181 | + const notice = document.createElement('div'); |
| 182 | + notice.className = 'info'; |
| 183 | + notice.innerHTML = ` |
| 184 | +<hr></hr>The vulnerabilities below are in packages that you import, |
| 185 | +but your code does not appear to call any vulnerable functions. |
| 186 | +You may not need to take any action. See |
| 187 | +<a href="https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck"> |
| 188 | +https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck</a> |
| 189 | +for details. |
| 190 | +`; |
| 191 | + |
| 192 | + unaffectingContainer.appendChild(notice); |
160 | 193 |
|
161 | | - const details = document.createElement('table'); |
162 | 194 | unaffecting.forEach((vuln) => { |
163 | | - const row = document.createElement('tr'); |
164 | | - row.className = 'vuln-details' |
165 | | - row.innerHTML = `<tr><td>${vuln.ModPath}</td><td><a href="${vuln.URL}">${vuln.ID}</a></td></tr>`; |
166 | | - details.appendChild(row); |
| 195 | + const element = document.createElement('div'); |
| 196 | + element.className = 'vuln'; |
| 197 | + unaffectingContainer.appendChild(element); |
| 198 | + |
| 199 | + // TITLE - Vuln ID |
| 200 | + const title = document.createElement('h2'); |
| 201 | + title.innerHTML = `<a href="${vuln.URL}">${vuln.ID}</a>`; |
| 202 | + title.className = 'vuln-title'; |
| 203 | + element.appendChild(title); |
| 204 | + |
| 205 | + // DESCRIPTION - short text (aliases) |
| 206 | + const desc = document.createElement('p'); |
| 207 | + desc.innerHTML = Array.isArray(vuln.Aliases) && vuln.Aliases.length ? `${vuln.Details} (${vuln.Aliases.join(', ')})` : vuln.Details; |
| 208 | + desc.className = 'vuln-desc'; |
| 209 | + element.appendChild(desc); |
| 210 | + |
| 211 | + // DETAILS - dump of all details |
| 212 | + // TODO(hyangah): |
| 213 | + // - include the current version & package name when gopls provides them. |
| 214 | + // - offer upgrade like affect vulnerabilities. We will need to install another event listener |
| 215 | + // on unaffectingContainer. See vulnsContainer.addEventListener. |
| 216 | + const details = document.createElement('table'); |
| 217 | + details.className = 'vuln-details' |
| 218 | + if (vuln.FixedVersion) { |
| 219 | + details.innerHTML = `<tr><td>Fixed Version</td><td>${modVersion(vuln.ModPath, vuln.FixedVersion)}</td></tr>`; |
| 220 | + } else { |
| 221 | + details.innerHTML = `<tr><td>Fixed Version</td><td>unavailable for ${vuln.ModPath}</td></tr>`; |
| 222 | + } |
| 223 | + element.appendChild(details); |
167 | 224 | }); |
168 | | - unaffectingContainer.appendChild(details); |
169 | 225 | } |
170 | 226 | } |
171 | 227 |
|
|
0 commit comments