Skip to content

Commit b116a78

Browse files
committed
chore: adding scope flags to cli [CSENG-68]
chore: update os flow version
1 parent 197ab23 commit b116a78

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+865
-1257
lines changed

cliv2/go.mod

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ require (
1111
github.com/pkg/errors v0.9.1
1212
github.com/rs/zerolog v1.34.0
1313
github.com/snyk/cli-extension-ai-bom v0.0.0-20260115091503-3d0699c466ef
14-
github.com/snyk/cli-extension-dep-graph v0.15.1
14+
github.com/snyk/cli-extension-dep-graph v0.14.3
1515
github.com/snyk/cli-extension-iac v0.0.0-20250829110702-b41ac109dab0
1616
github.com/snyk/cli-extension-iac-rules v0.0.0-20260115114457-a8ac3358ec57
17-
github.com/snyk/cli-extension-mcp-scan v0.0.0-20260120142932-0eea0566625a
18-
github.com/snyk/cli-extension-os-flows v0.0.0-20260115160519-84f621016a34
17+
github.com/snyk/cli-extension-mcp-scan v0.0.0-20251217093101-0705cbe3593b
18+
github.com/snyk/cli-extension-os-flows v0.0.0-20260126114133-44216d2c49f1
1919
github.com/snyk/cli-extension-sbom v0.0.0-20260109124810-cfdd074f8eeb
2020
github.com/snyk/container-cli v0.0.0-20250321132345-1e2e01681dd7
2121
github.com/snyk/error-catalog-golang-public v0.0.0-20260108110943-21ad0c940c14
22-
github.com/snyk/go-application-framework v0.0.0-20260123095953-bb4eb487ccfb
22+
github.com/snyk/go-application-framework v0.0.0-20260126083422-c997413c310e
2323
github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65
2424
github.com/snyk/snyk-iac-capture v0.6.5
25-
github.com/snyk/snyk-ls v0.0.0-20260123134153-c85af1965c75
25+
github.com/snyk/snyk-ls v0.0.0-20260113102244-36303931affc
2626
github.com/snyk/studio-mcp v1.3.0
2727
github.com/spf13/cobra v1.9.1
2828
github.com/spf13/pflag v1.0.10
@@ -206,7 +206,7 @@ require (
206206
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
207207
github.com/sirupsen/logrus v1.9.3 // indirect
208208
github.com/skeema/knownhosts v1.3.1 // indirect
209-
github.com/snyk/code-client-go v1.25.0 // indirect
209+
github.com/snyk/code-client-go v1.24.5 // indirect
210210
github.com/snyk/dep-graph/go v0.0.0-20251219134535-fcb262dc6d25 // indirect
211211
github.com/snyk/policy-engine v1.1.2 // indirect
212212
github.com/sourcegraph/conc v0.3.0 // indirect
@@ -279,5 +279,3 @@ replace github.com/mattn/go-localereader v0.0.1 => github.com/mattn/go-localerea
279279
// replace github.com/snyk/cli-extension-ai-bom => ../../cli-extension-ai-bom
280280

281281
// replace github.com/snyk/studio-mcp => ../../studio-mcp
282-
283-
// replace github.com/snyk/cli-extension-mcp-scan => ../../cli-extension-mcp-scan

cliv2/go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -524,36 +524,36 @@ github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnB
524524
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
525525
github.com/snyk/cli-extension-ai-bom v0.0.0-20260115091503-3d0699c466ef h1:w+PLQGOM3wHGZ89Hhh16AL0OVFfgbZiGs8XYEYxHgks=
526526
github.com/snyk/cli-extension-ai-bom v0.0.0-20260115091503-3d0699c466ef/go.mod h1:vcRqbTJ3oEM4I6q88opeq2erDtdXW9TLKhU63iJXPM4=
527-
github.com/snyk/cli-extension-dep-graph v0.15.1 h1:SK1cMIfIzpmQhcfVnn77FZHQgcXT/3d9ZzTog1uPT3c=
528-
github.com/snyk/cli-extension-dep-graph v0.15.1/go.mod h1:Do/xNThRKSbZcIC2JCCgkBJ2X/h/YbN5i12znPEEvjY=
527+
github.com/snyk/cli-extension-dep-graph v0.14.3 h1:kwIsZhukBVRTOmcyDel2/KCCPyH0pdcq18QEM4QL7Oc=
528+
github.com/snyk/cli-extension-dep-graph v0.14.3/go.mod h1:Do/xNThRKSbZcIC2JCCgkBJ2X/h/YbN5i12znPEEvjY=
529529
github.com/snyk/cli-extension-iac v0.0.0-20250829110702-b41ac109dab0 h1:ecGoMisVTnz5xRnt9yXW2hlRrIyYM123yMt1NeNEo6s=
530530
github.com/snyk/cli-extension-iac v0.0.0-20250829110702-b41ac109dab0/go.mod h1:tLxyhtrRiEvbSLQ6PbCsl29ZXK6s2aunRuL6cSe/8cE=
531531
github.com/snyk/cli-extension-iac-rules v0.0.0-20260115114457-a8ac3358ec57 h1:8A/m+2Kqq7YylEZxAO/Ap6C5Fr+21WRM9BecxzOg098=
532532
github.com/snyk/cli-extension-iac-rules v0.0.0-20260115114457-a8ac3358ec57/go.mod h1:AFto63ozNmCXtKb5oTTD3Qz1jEl/HCqCVwpZCfTpSIE=
533-
github.com/snyk/cli-extension-mcp-scan v0.0.0-20260120142932-0eea0566625a h1:ElZXU6njO7McDQ7u7nAsJ5PCcwvA2+dEsadRM4P41JQ=
534-
github.com/snyk/cli-extension-mcp-scan v0.0.0-20260120142932-0eea0566625a/go.mod h1:i/EDskKxg68MtWaIOWFyataAMtcXOb/DQPLxT5jtLRE=
535-
github.com/snyk/cli-extension-os-flows v0.0.0-20260115160519-84f621016a34 h1:VtbScRQpbpmOE6MqHhMHUhQszSUO83oeVUb7U8td0uE=
536-
github.com/snyk/cli-extension-os-flows v0.0.0-20260115160519-84f621016a34/go.mod h1:s3HX7yjdyP5PYe+ZTMyrJA5wv6hCnmfGdh7Nk5la6tY=
533+
github.com/snyk/cli-extension-mcp-scan v0.0.0-20251217093101-0705cbe3593b h1:d8s+TntutaQlPcB+5I2781ALWEgGfQh2XQjPrt0oRy8=
534+
github.com/snyk/cli-extension-mcp-scan v0.0.0-20251217093101-0705cbe3593b/go.mod h1:dRgGvQssSQ1U//nQ0D+H8JXnjz1ZhG9GWbz8GEaFRMQ=
535+
github.com/snyk/cli-extension-os-flows v0.0.0-20260126114133-44216d2c49f1 h1:xlw3z5a6KrpoLXgoGjzjc3LyxDjZCxylHuiEoQ8U9No=
536+
github.com/snyk/cli-extension-os-flows v0.0.0-20260126114133-44216d2c49f1/go.mod h1:eYla0N+RzCa88JT6v4t/sAQthfJgyOHO1Oj9J72/Exw=
537537
github.com/snyk/cli-extension-sbom v0.0.0-20260109124810-cfdd074f8eeb h1:5cAi3VwdoE4d6kc6D6qSge11e/ALBMmuBatySFd8rfE=
538538
github.com/snyk/cli-extension-sbom v0.0.0-20260109124810-cfdd074f8eeb/go.mod h1:jIACVV10j4pW7LFrlYYtjn9mZm2JnXeFBM6/aTNJgvM=
539-
github.com/snyk/code-client-go v1.25.0 h1:1lcg6asMpMWwpaZLKVDdci3OrAv6rRoCsCcT8Ci/fUI=
540-
github.com/snyk/code-client-go v1.25.0/go.mod h1:YYggK3UbOHl5rg7uBhLzsKZBFNavcwFUse/EWCKWdzw=
539+
github.com/snyk/code-client-go v1.24.5 h1:ySsfTeaNmi3nWSuM3YaVIiSAG+H/ikD2hACxqneIZJw=
540+
github.com/snyk/code-client-go v1.24.5/go.mod h1:YYggK3UbOHl5rg7uBhLzsKZBFNavcwFUse/EWCKWdzw=
541541
github.com/snyk/container-cli v0.0.0-20250321132345-1e2e01681dd7 h1:/2+2piwQtB9fEJCkXEOjboZjY+77lQfnvqBZ/60xNHk=
542542
github.com/snyk/container-cli v0.0.0-20250321132345-1e2e01681dd7/go.mod h1:38w+dcAQp9eG3P5t2eNS9eG0reut10AeJjLv5lJ5lpM=
543543
github.com/snyk/dep-graph/go v0.0.0-20251219134535-fcb262dc6d25 h1:dwJ4Kdp4c5aaWI+waHomarhouWF6BUYzfen0B6aqaNA=
544544
github.com/snyk/dep-graph/go v0.0.0-20251219134535-fcb262dc6d25/go.mod h1:hTr91da/4ze2nk9q6ZW1BmfM2Z8rLUZSEZ3kK+6WGpc=
545545
github.com/snyk/error-catalog-golang-public v0.0.0-20260108110943-21ad0c940c14 h1:R74dgtKtcrIOG/349YDV8arH7D09pob3lAcJc290FqI=
546546
github.com/snyk/error-catalog-golang-public v0.0.0-20260108110943-21ad0c940c14/go.mod h1:Ytttq7Pw4vOCu9NtRQaOeDU2dhBYUyNBe6kX4+nIIQ4=
547-
github.com/snyk/go-application-framework v0.0.0-20260123095953-bb4eb487ccfb h1:UrbwqO33pr/m4Nyx0vugkktvd6c7m+Hf+GhRG9foN1E=
548-
github.com/snyk/go-application-framework v0.0.0-20260123095953-bb4eb487ccfb/go.mod h1:LPR080GrK2jqNN9/hgVwKkXTVS3BlvwqmTN60lX5wdA=
547+
github.com/snyk/go-application-framework v0.0.0-20260126083422-c997413c310e h1:VEtn9Hy4J+QWkxdVIoi73ERjNprvq3QOkWck5PRw1ag=
548+
github.com/snyk/go-application-framework v0.0.0-20260126083422-c997413c310e/go.mod h1:LPR080GrK2jqNN9/hgVwKkXTVS3BlvwqmTN60lX5wdA=
549549
github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65 h1:CEQuYv0Go6MEyRCD3YjLYM2u3Oxkx8GpCpFBd4rUTUk=
550550
github.com/snyk/go-httpauth v0.0.0-20240307114523-1f5ea3f55c65/go.mod h1:88KbbvGYlmLgee4OcQ19yr0bNpXpOr2kciOthaSzCAg=
551551
github.com/snyk/policy-engine v1.1.2 h1:BYWigTxPjiQer4m2jYhO623KmGdmmzA3S60k9AJPT+Q=
552552
github.com/snyk/policy-engine v1.1.2/go.mod h1:WW0eEb6adCEZ8CPGYsq19J6iPsvoeeTet+OWdU5Nrlw=
553553
github.com/snyk/snyk-iac-capture v0.6.5 h1:992DXCAJSN97KtUh8T5ndaWwd/6ZCal2bDkRXqM1u/E=
554554
github.com/snyk/snyk-iac-capture v0.6.5/go.mod h1:e47i55EmM0F69ZxyFHC4sCi7vyaJW6DLoaamJJCzWGk=
555-
github.com/snyk/snyk-ls v0.0.0-20260123134153-c85af1965c75 h1:vESgXzdRk44Gz3Ro1ZAodTD6DyexC4GFGGPbjkO/6CQ=
556-
github.com/snyk/snyk-ls v0.0.0-20260123134153-c85af1965c75/go.mod h1:+DFpqPnUgqNDCa1bhszp+oPh/MP4HGLQCf4lMTBwVVQ=
555+
github.com/snyk/snyk-ls v0.0.0-20260113102244-36303931affc h1:SDrgJvB+1Sqg+RUvywrn3JGvvBNgR1fXBRrtEv0qSxI=
556+
github.com/snyk/snyk-ls v0.0.0-20260113102244-36303931affc/go.mod h1:STDRX94wGUjny7cg2a1gxbsmoXNuHQJISQWQKGOjRZ0=
557557
github.com/snyk/studio-mcp v1.3.0 h1:6eqjiaab9hILdoY4awAF2z+xj03VOB93DbLhlzYyRB4=
558558
github.com/snyk/studio-mcp v1.3.0/go.mod h1:+OuCQy/pOysingGYHNUojmpSVse/q36KODBaJlOvsNQ=
559559
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package interceptor
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"io"
7+
"net/http"
8+
"regexp"
9+
10+
"github.com/elazarl/goproxy"
11+
"github.com/snyk/go-application-framework/pkg/workflow"
12+
)
13+
14+
const FeatureFlagShowMavenBuildScope = "internal_snyk_show_maven_scope_enabled"
15+
const FeatureFlagShowNpmBuildScope = "internal_snyk_show_npm_scope_enabled"
16+
17+
type legacyFeatureFlagInterceptor struct {
18+
requestCondition goproxy.ReqCondition
19+
invocationCtx workflow.InvocationContext
20+
}
21+
22+
type featureFlagResponse struct {
23+
OK bool `json:"ok"`
24+
}
25+
26+
func (ni legacyFeatureFlagInterceptor) GetCondition() goproxy.ReqCondition {
27+
return ni.requestCondition
28+
}
29+
30+
// GetHandler for legacyFeatureFlagInterceptor will re-route all registry requests from the proxy to the configured feature flag values.
31+
// This ensures that we can control feature flag values for the legacy CLI from the CLIv2 configuration.
32+
// Currently, only the "show-maven-build-scope" and "show-npm-scope" feature flags are supported.
33+
func (ni legacyFeatureFlagInterceptor) GetHandler() goproxy.FuncReqHandler {
34+
return func(req *http.Request, proxyCtx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
35+
ni.invocationCtx.GetEnhancedLogger().Printf("legacyFeatureFlagInterceptor handling request for %s", req.URL.Path)
36+
var configKey string
37+
switch req.URL.Path {
38+
case "/v1/cli-config/feature-flags/show-maven-build-scope":
39+
configKey = FeatureFlagShowMavenBuildScope
40+
case "/v1/cli-config/feature-flags/show-npm-scope":
41+
configKey = FeatureFlagShowNpmBuildScope
42+
default:
43+
return req, nil
44+
}
45+
46+
enabled := ni.invocationCtx.
47+
GetConfiguration().
48+
GetBool(configKey)
49+
50+
payload := featureFlagResponse{OK: enabled}
51+
b, err := json.Marshal(payload)
52+
if err != nil {
53+
return req, nil
54+
}
55+
56+
resp := &http.Response{
57+
StatusCode: http.StatusOK,
58+
Status: "200 OK",
59+
Header: make(http.Header),
60+
Body: io.NopCloser(bytes.NewReader(b)),
61+
Request: req,
62+
}
63+
resp.Header.Set("Content-Type", "application/json")
64+
ni.invocationCtx.GetEnhancedLogger().Printf("legacyFeatureFlagInterceptor response for %s is %v", configKey, enabled)
65+
66+
return req, resp
67+
}
68+
}
69+
70+
func NewLegacyFeatureFlagInterceptor(invocationCtx workflow.InvocationContext) Interceptor {
71+
i := legacyFeatureFlagInterceptor{
72+
requestCondition: goproxy.UrlMatches(
73+
regexp.MustCompile(`/cli-config/feature-flags/(show-maven-build-scope|show-npm-scope)/?$`),
74+
),
75+
invocationCtx: invocationCtx,
76+
}
77+
return i
78+
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package interceptor
2+
3+
import (
4+
"encoding/json"
5+
"io"
6+
"net/http"
7+
"net/http/httptest"
8+
"testing"
9+
10+
"github.com/golang/mock/gomock"
11+
"github.com/rs/zerolog"
12+
"github.com/snyk/go-application-framework/pkg/mocks"
13+
14+
"github.com/elazarl/goproxy"
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func TestLegacyFeatureFlagInterceptor_Routing(t *testing.T) {
19+
tests := []struct {
20+
name string
21+
path string
22+
shouldHandle bool
23+
configKey string // only used when shouldHandle == true
24+
}{
25+
{
26+
name: "maven path",
27+
path: "https://example.com/v1/cli-config/feature-flags/show-maven-build-scope?org=abc",
28+
shouldHandle: true,
29+
configKey: FeatureFlagShowMavenBuildScope,
30+
},
31+
{
32+
name: "npm path",
33+
path: "https://example.com/v1/cli-config/feature-flags/show-npm-scope?org=abc",
34+
shouldHandle: true,
35+
configKey: FeatureFlagShowNpmBuildScope,
36+
},
37+
{
38+
name: "other path",
39+
path: "https://example.com/api/v1/other-endpoint",
40+
shouldHandle: false,
41+
},
42+
}
43+
44+
for _, tt := range tests {
45+
t.Run(tt.name, func(t *testing.T) {
46+
ctrl := gomock.NewController(t)
47+
defer ctrl.Finish()
48+
49+
configMock := mocks.NewMockConfiguration(ctrl)
50+
51+
// Only expect config access when the interceptor should handle the path.
52+
if tt.shouldHandle {
53+
configMock.EXPECT().
54+
GetBool(tt.configKey).
55+
Return(true).
56+
AnyTimes()
57+
}
58+
59+
invocationCtxMock := mocks.NewMockInvocationContext(ctrl)
60+
invocationCtxMock.EXPECT().
61+
GetConfiguration().
62+
Return(configMock).
63+
AnyTimes()
64+
65+
interceptor := NewLegacyFeatureFlagInterceptor(invocationCtxMock)
66+
handler := interceptor.GetHandler()
67+
68+
req := httptest.NewRequest(http.MethodGet, tt.path, nil)
69+
proxyCtx := &goproxy.ProxyCtx{}
70+
71+
matched := interceptor.GetCondition().HandleReq(req, proxyCtx)
72+
assert.Equal(t, tt.shouldHandle, matched)
73+
74+
if !tt.shouldHandle {
75+
return
76+
}
77+
78+
logger := zerolog.Nop()
79+
invocationCtxMock.EXPECT().GetEnhancedLogger().Return(&logger).AnyTimes()
80+
81+
_, resp := handler(req, proxyCtx)
82+
assert.NotNil(t, resp)
83+
assert.Equal(t, http.StatusOK, resp.StatusCode)
84+
assert.Equal(t, "application/json", resp.Header.Get("Content-Type"))
85+
86+
bodyBytes, err := io.ReadAll(resp.Body)
87+
assert.NoError(t, err)
88+
89+
var parsed featureFlagResponse
90+
assert.NoError(t, json.Unmarshal(bodyBytes, &parsed))
91+
assert.True(t, parsed.OK)
92+
})
93+
}
94+
}

cliv2/pkg/basic_workflows/legacycli.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ func createInternalProxy(config configuration.Configuration, debugLogger *zerolo
190190
}
191191

192192
wrapperProxy.RegisterInterceptor(interceptor.NewV1AnalyticsInterceptor(invocation))
193+
wrapperProxy.RegisterInterceptor(interceptor.NewLegacyFeatureFlagInterceptor(invocation))
193194
// The networkinjector intercepts all requests from the legacy CLI and re-routes them to the existing networking
194195
// layer. It should therefore be kept as the last interceptor in the chain, as it circuit breaks goproxy's own
195196
// routing. Any interceptor added later will not be called.

0 commit comments

Comments
 (0)