|
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