From 3bfbbb1961e761ef3a2cdc293d07f6eb101fa742 Mon Sep 17 00:00:00 2001 From: Todd Treece <360020+toddtreece@users.noreply.github.com> Date: Wed, 29 Oct 2025 11:33:43 -0400 Subject: [PATCH] Plugins: Skip angular check for CDN source (#113163) --- .../angularinspector/angularinspector.go | 5 +++ .../angularinspector/angularinspector_test.go | 32 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/pkg/plugins/manager/loader/angular/angularinspector/angularinspector.go b/pkg/plugins/manager/loader/angular/angularinspector/angularinspector.go index e67b04b69f2..98840189389 100644 --- a/pkg/plugins/manager/loader/angular/angularinspector/angularinspector.go +++ b/pkg/plugins/manager/loader/angular/angularinspector/angularinspector.go @@ -35,6 +35,11 @@ func NewPatternListInspector(detectorsProvider angulardetector.DetectorsProvider } func (i *PatternsListInspector) Inspect(ctx context.Context, p *plugins.Plugin) (isAngular bool, err error) { + // CDN plugins are ignored because they should not be using Angular + if p.Class == plugins.ClassCDN { + return false, nil + } + f, err := p.FS.Open("module.js") if err != nil { if errors.Is(err, plugins.ErrFileNotExist) { diff --git a/pkg/plugins/manager/loader/angular/angularinspector/angularinspector_test.go b/pkg/plugins/manager/loader/angular/angularinspector/angularinspector_test.go index f45ae982d09..47c5af990b9 100644 --- a/pkg/plugins/manager/loader/angular/angularinspector/angularinspector_test.go +++ b/pkg/plugins/manager/loader/angular/angularinspector/angularinspector_test.go @@ -27,17 +27,17 @@ func (d *fakeDetector) String() string { } func TestPatternsListInspector(t *testing.T) { - plugin := &plugins.Plugin{ - FS: plugins.NewInMemoryFS(map[string][]byte{"module.js": nil}), - } - for _, tc := range []struct { name string + plugin *plugins.Plugin fakeDetectors []*fakeDetector exp func(t *testing.T, r bool, err error, fakeDetectors []*fakeDetector) }{ { name: "calls the detectors in sequence until true is returned", + plugin: &plugins.Plugin{ + FS: plugins.NewInMemoryFS(map[string][]byte{"module.js": nil}), + }, fakeDetectors: []*fakeDetector{ {returns: false}, {returns: true}, @@ -53,6 +53,9 @@ func TestPatternsListInspector(t *testing.T) { }, { name: "calls the detectors in sequence and returns false as default", + plugin: &plugins.Plugin{ + FS: plugins.NewInMemoryFS(map[string][]byte{"module.js": nil}), + }, fakeDetectors: []*fakeDetector{ {returns: false}, {returns: false}, @@ -65,13 +68,30 @@ func TestPatternsListInspector(t *testing.T) { }, }, { - name: "empty detectors should return false", + name: "empty detectors should return false", + plugin: &plugins.Plugin{ + FS: plugins.NewInMemoryFS(map[string][]byte{"module.js": nil}), + }, fakeDetectors: nil, exp: func(t *testing.T, r bool, err error, fakeDetectors []*fakeDetector) { require.NoError(t, err) require.False(t, r, "inspector should return false") }, }, + { + name: "CDN plugins return false without calling detectors", + plugin: &plugins.Plugin{ + Class: plugins.ClassCDN, + }, + fakeDetectors: []*fakeDetector{ + {returns: true}, + }, + exp: func(t *testing.T, r bool, err error, fakeDetectors []*fakeDetector) { + require.NoError(t, err) + require.False(t, r, "inspector should return false for CDN plugins") + require.Equal(t, 0, fakeDetectors[0].calls, "detectors should not be called for CDN plugins") + }, + }, } { t.Run(tc.name, func(t *testing.T) { detectors := make([]angulardetector.AngularDetector, 0, len(tc.fakeDetectors)) @@ -79,7 +99,7 @@ func TestPatternsListInspector(t *testing.T) { detectors = append(detectors, angulardetector.AngularDetector(d)) } inspector := NewPatternListInspector(&angulardetector.StaticDetectorsProvider{Detectors: detectors}) - r, err := inspector.Inspect(context.Background(), plugin) + r, err := inspector.Inspect(context.Background(), tc.plugin) tc.exp(t, r, err, tc.fakeDetectors) }) }