Skip to content

Commit e537a22

Browse files
authored
Merge pull request #227 from docker/hide-scout-hovers-on-settings
Hide Scout hovers if vulnerabilityScanning is false
2 parents c7fbb62 + d695d96 commit e537a22

File tree

3 files changed

+108
-21
lines changed

3 files changed

+108
-21
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ All notable changes to the Docker Language Server will be documented in this fil
77
### Fixed
88

99
- Dockerfile
10+
- textDocument/hover
11+
- hide vulnerability hovers if the top level setting is disabled ([#226](https://github.com/docker/docker-language-server/issues/226))
1012
- textDocument/publishDiagnostics
1113
- consider flag changes when determining whether to scan a file again or not ([#224](https://github.com/docker/docker-language-server/issues/224))
1214

internal/scout/service.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ func NewService() Service {
3131

3232
func (s *ServiceImpl) Hover(ctx context.Context, documentURI protocol.DocumentUri, image string) (*protocol.Hover, error) {
3333
config := configuration.Get(documentURI)
34+
if !config.Experimental.VulnerabilityScanning {
35+
return nil, nil
36+
}
37+
3438
resp, err := s.manager.Get(&ScoutImageKey{Image: image})
3539
if err == nil {
3640
hovers := []string{}

internal/scout/service_test.go

Lines changed: 102 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -318,30 +318,57 @@ func TestCalculateDiagnostics_IgnoresSpecifics(t *testing.T) {
318318

319319
func TestGetHovers(t *testing.T) {
320320
testCases := []struct {
321-
image string
322-
value string
321+
image string
322+
result *protocol.Hover
323323
}{
324324
{
325325
image: "alpine:3.16.1",
326-
value: "Current image vulnerabilities: 1C 3H 9M 0L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
326+
result: &protocol.Hover{
327+
Contents: protocol.MarkupContent{
328+
Kind: protocol.MarkupKindMarkdown,
329+
Value: "Current image vulnerabilities: 1C 3H 9M 0L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
330+
},
331+
},
327332
},
328333
}
329334

335+
u := "file:///tmp/Dockerfile"
330336
s := NewService()
331337
for _, tc := range testCases {
332338
t.Run(tc.image, func(t *testing.T) {
333-
hover, err := s.Hover(context.Background(), "file:///tmp/Dockerfile", tc.image)
339+
hover, err := s.Hover(context.Background(), u, tc.image)
334340
if os.Getenv("DOCKER_NETWORK_NONE") == "true" {
335341
var dns *net.DNSError
336342
require.True(t, errors.As(err, &dns))
337343
return
338344
}
339345

340346
require.Nil(t, err)
341-
markupContent, ok := hover.Contents.(protocol.MarkupContent)
342-
require.True(t, ok)
343-
require.Equal(t, protocol.MarkupKindMarkdown, markupContent.Kind)
344-
require.Equal(t, tc.value, markupContent.Value)
347+
require.Equal(t, tc.result, hover)
348+
})
349+
}
350+
351+
for _, tc := range testCases {
352+
t.Run(tc.image, func(t *testing.T) {
353+
defer configuration.Remove(u)
354+
configuration.Store(u, configuration.Configuration{Experimental: configuration.Experimental{
355+
VulnerabilityScanning: false,
356+
Scout: configuration.Scout{
357+
CriticalHighVulnerabilities: true,
358+
NotPinnedDigest: true,
359+
RecommendedTag: true,
360+
Vulnerabilites: true,
361+
},
362+
}})
363+
hover, err := s.Hover(context.Background(), u, tc.image)
364+
if os.Getenv("DOCKER_NETWORK_NONE") == "true" {
365+
var dns *net.DNSError
366+
require.True(t, errors.As(err, &dns))
367+
return
368+
}
369+
370+
require.Nil(t, err)
371+
require.Nil(t, hover)
345372
})
346373
}
347374
}
@@ -350,83 +377,140 @@ func TestGetHovers_IgnoresSpecifics(t *testing.T) {
350377
testCases := []struct {
351378
name string
352379
image string
353-
value string
354380
config configuration.Scout
381+
result *protocol.Hover
355382
}{
356383
{
357384
name: "alpine:3.16.1 (all)",
358385
image: "alpine:3.16.1",
359-
value: "Current image vulnerabilities: 1C 3H 9M 0L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
360386
config: configuration.Scout{
361387
CriticalHighVulnerabilities: true,
362388
NotPinnedDigest: true,
363389
RecommendedTag: true,
364390
Vulnerabilites: true,
365391
},
392+
result: &protocol.Hover{
393+
Contents: protocol.MarkupContent{
394+
Kind: protocol.MarkupKindMarkdown,
395+
Value: "Current image vulnerabilities: 1C 3H 9M 0L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
396+
},
397+
},
366398
},
367399
{
368400
name: "alpine:3.16.1 (CriticalHighVulnerabilities=false)",
369401
image: "alpine:3.16.1",
370-
value: "Recommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
371402
config: configuration.Scout{
372403
CriticalHighVulnerabilities: false,
373404
NotPinnedDigest: true,
374405
RecommendedTag: true,
375406
Vulnerabilites: true,
376407
},
408+
result: &protocol.Hover{
409+
Contents: protocol.MarkupContent{
410+
Kind: protocol.MarkupKindMarkdown,
411+
Value: "Recommended tags:\n\n<table>\n<tr><td><code>3.21.3</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.20.6</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>3.18.12</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n</table>\n",
412+
},
413+
},
377414
},
378415
{
379416
name: "alpine:3.16.1 (RecommendedTag=false)",
380417
image: "alpine:3.16.1",
381-
value: "Current image vulnerabilities: 1C 3H 9M 0L ",
382418
config: configuration.Scout{
383419
CriticalHighVulnerabilities: true,
384420
NotPinnedDigest: true,
385421
RecommendedTag: false,
386422
Vulnerabilites: true,
387423
},
424+
result: &protocol.Hover{
425+
Contents: protocol.MarkupContent{
426+
Kind: protocol.MarkupKindMarkdown,
427+
Value: "Current image vulnerabilities: 1C 3H 9M 0L ",
428+
},
429+
},
388430
},
389431
{
390432
name: "ubuntu:24.04 (all)",
391433
image: "ubuntu:24.04",
392-
value: "Image vulnerabilities: 0C 0H 2M 6L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>25.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>25.04</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 3M</td><td align=\"right\"> 5L</td><td align=\"right\"></td></tr>\n<tr><td><code>24.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 5M</td><td align=\"right\"> 6L</td><td align=\"right\"></td></tr>\n</table>\n",
393434
config: configuration.Scout{
394435
CriticalHighVulnerabilities: true,
395436
NotPinnedDigest: true,
396437
RecommendedTag: true,
397438
Vulnerabilites: true,
398439
},
440+
result: &protocol.Hover{
441+
Contents: protocol.MarkupContent{
442+
Kind: protocol.MarkupKindMarkdown,
443+
Value: "Image vulnerabilities: 0C 0H 2M 6L \r\n\r\nRecommended tags:\n\n<table>\n<tr><td><code>25.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>25.04</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 3M</td><td align=\"right\"> 5L</td><td align=\"right\"></td></tr>\n<tr><td><code>24.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 5M</td><td align=\"right\"> 6L</td><td align=\"right\"></td></tr>\n</table>\n",
444+
},
445+
},
399446
},
400447
{
401448
name: "ubuntu:24.04 (Vulnerabilites=false)",
402449
image: "ubuntu:24.04",
403-
value: "Recommended tags:\n\n<table>\n<tr><td><code>25.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>25.04</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 3M</td><td align=\"right\"> 5L</td><td align=\"right\"></td></tr>\n<tr><td><code>24.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 5M</td><td align=\"right\"> 6L</td><td align=\"right\"></td></tr>\n</table>\n",
404450
config: configuration.Scout{
405451
CriticalHighVulnerabilities: true,
406452
NotPinnedDigest: true,
407453
RecommendedTag: true,
408454
Vulnerabilites: false,
409455
},
456+
result: &protocol.Hover{
457+
Contents: protocol.MarkupContent{
458+
Kind: protocol.MarkupKindMarkdown,
459+
Value: "Recommended tags:\n\n<table>\n<tr><td><code>25.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 0M</td><td align=\"right\"> 0L</td><td align=\"right\"></td></tr>\n<tr><td><code>25.04</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 3M</td><td align=\"right\"> 5L</td><td align=\"right\"></td></tr>\n<tr><td><code>24.10</code></td><td align=\"right\"> 0C</td><td align=\"right\"> 0H</td><td align=\"right\"> 5M</td><td align=\"right\"> 6L</td><td align=\"right\"></td></tr>\n</table>\n",
460+
},
461+
},
410462
},
411463
{
412464
name: "ubuntu:24.04 (Vulnerabilites=false)",
413465
image: "ubuntu:24.04",
414-
value: "Image vulnerabilities: 0C 0H 2M 6L ",
415466
config: configuration.Scout{
416467
CriticalHighVulnerabilities: true,
417468
NotPinnedDigest: true,
418469
RecommendedTag: false,
419470
Vulnerabilites: true,
420471
},
472+
result: &protocol.Hover{
473+
Contents: protocol.MarkupContent{
474+
Kind: protocol.MarkupKindMarkdown,
475+
Value: "Image vulnerabilities: 0C 0H 2M 6L ",
476+
},
477+
},
421478
},
422479
}
423480

481+
u := "file:///tmp/Dockerfile"
424482
s := NewService()
425483
for _, tc := range testCases {
426484
t.Run(tc.name, func(t *testing.T) {
427-
u := "file:///tmp/Dockerfile"
428485
defer configuration.Remove(u)
429-
configuration.Store(u, configuration.Configuration{Experimental: configuration.Experimental{Scout: tc.config}})
486+
configuration.Store(u, configuration.Configuration{Experimental: configuration.Experimental{
487+
VulnerabilityScanning: true,
488+
Scout: tc.config,
489+
}})
490+
hover, err := s.Hover(context.Background(), u, tc.image)
491+
if os.Getenv("DOCKER_NETWORK_NONE") == "true" {
492+
var dns *net.DNSError
493+
require.True(t, errors.As(err, &dns))
494+
return
495+
}
496+
497+
require.Nil(t, err)
498+
require.Equal(t, tc.result, hover)
499+
})
500+
}
501+
502+
for _, tc := range testCases {
503+
t.Run(tc.image, func(t *testing.T) {
504+
defer configuration.Remove(u)
505+
configuration.Store(u, configuration.Configuration{Experimental: configuration.Experimental{
506+
VulnerabilityScanning: false,
507+
Scout: configuration.Scout{
508+
CriticalHighVulnerabilities: true,
509+
NotPinnedDigest: true,
510+
RecommendedTag: true,
511+
Vulnerabilites: true,
512+
},
513+
}})
430514
hover, err := s.Hover(context.Background(), u, tc.image)
431515
if os.Getenv("DOCKER_NETWORK_NONE") == "true" {
432516
var dns *net.DNSError
@@ -435,10 +519,7 @@ func TestGetHovers_IgnoresSpecifics(t *testing.T) {
435519
}
436520

437521
require.Nil(t, err)
438-
markupContent, ok := hover.Contents.(protocol.MarkupContent)
439-
require.True(t, ok)
440-
require.Equal(t, protocol.MarkupKindMarkdown, markupContent.Kind)
441-
require.Equal(t, tc.value, markupContent.Value)
522+
require.Nil(t, hover)
442523
})
443524
}
444525
}

0 commit comments

Comments
 (0)