Skip to content

Commit 9c355ba

Browse files
authored
Merge branch 'jfrog:main' into feature/ide-setup-clean-v2
2 parents 054f270 + 821c4a6 commit 9c355ba

Some content is hidden

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

50 files changed

+4590
-290
lines changed

cliutils/flagkit/flags.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ var flagsMap = map[string]components.Flag{
902902
propsRecursive: components.NewBoolFlag(Recursive, "[Default: true] When false, artifacts inside sub-folders in Artifactory will not be affected.", components.WithBoolDefaultValueFalse()),
903903
propsProps: components.NewStringFlag(props, "[Optional] List of semicolon-separated(;) properties in the form of \"key1=value1;key2=value2;...\". Only artifacts with these properties are affected.", components.SetMandatoryFalse()),
904904
propsExcludeProps: components.NewStringFlag(excludeProps, "[Optional] List of semicolon-separated(;) properties in the form of \"key1=value1;key2=value2;...\". Only artifacts without the specified properties are affected.", components.SetMandatoryFalse()),
905-
repoOnly: components.NewBoolFlag(repoOnly, "[Default: true] When false, artifacts inside sub-folders in Artifactory will be affected.", components.WithBoolDefaultValueFalse()),
905+
repoOnly: components.NewBoolFlag(repoOnly, "When true, properties will be applicable only on repository level.", components.WithBoolDefaultValueFalse()),
906906

907907
// Build Publish and Append specific commands flags
908908
buildUrl: components.NewStringFlag(buildUrl, "[Optional] Can be used for setting the CI server build URL in the build-info.", components.SetMandatoryFalse()),

evidence/cli/command.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ package cli
44

55
import (
66
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
7-
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
7+
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
88
)
99

1010
type EvidenceCommands interface {
11-
CreateEvidence(ctx *components.Context, serverDetails *coreConfig.ServerDetails) error
11+
CreateEvidence(ctx *components.Context, serverDetails *config.ServerDetails) error
12+
VerifyEvidences(ctx *components.Context, serverDetails *config.ServerDetails) error
1213
}

evidence/cli/command_build.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package cli
22

33
import (
4-
"github.com/jfrog/jfrog-cli-artifactory/evidence"
4+
"github.com/jfrog/jfrog-cli-artifactory/evidence/create"
5+
"github.com/jfrog/jfrog-cli-artifactory/evidence/verify"
56
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
6-
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
7+
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
78
"github.com/jfrog/jfrog-client-go/utils/errorutils"
89
)
910

@@ -19,13 +20,13 @@ func NewEvidenceBuildCommand(ctx *components.Context, execute execCommandFunc) E
1920
}
2021
}
2122

22-
func (ebc *evidenceBuildCommand) CreateEvidence(ctx *components.Context, serverDetails *coreConfig.ServerDetails) error {
23+
func (ebc *evidenceBuildCommand) CreateEvidence(ctx *components.Context, serverDetails *config.ServerDetails) error {
2324
err := ebc.validateEvidenceBuildContext(ctx)
2425
if err != nil {
2526
return err
2627
}
2728

28-
createCmd := evidence.NewCreateEvidenceBuild(
29+
createCmd := create.NewCreateEvidenceBuild(
2930
serverDetails,
3031
ebc.ctx.GetStringFlagValue(predicate),
3132
ebc.ctx.GetStringFlagValue(predicateType),
@@ -38,6 +39,24 @@ func (ebc *evidenceBuildCommand) CreateEvidence(ctx *components.Context, serverD
3839
return ebc.execute(createCmd)
3940
}
4041

42+
func (ebc *evidenceBuildCommand) VerifyEvidences(ctx *components.Context, serverDetails *config.ServerDetails) error {
43+
err := ebc.validateEvidenceBuildContext(ctx)
44+
if err != nil {
45+
return err
46+
}
47+
48+
verifyCmd := verify.NewVerifyEvidencesBuild(
49+
serverDetails,
50+
ebc.ctx.GetStringFlagValue(project),
51+
ebc.ctx.GetStringFlagValue(buildName),
52+
ebc.ctx.GetStringFlagValue(buildNumber),
53+
ebc.ctx.GetStringFlagValue(format),
54+
ebc.ctx.GetStringsArrFlagValue(publicKeys),
55+
ebc.ctx.GetBoolFlagValue(useArtifactoryKeys),
56+
)
57+
return ebc.execute(verifyCmd)
58+
}
59+
4160
func (ebc *evidenceBuildCommand) validateEvidenceBuildContext(ctx *components.Context) error {
4261
if !ctx.IsFlagSet(buildNumber) || assertValueProvided(ctx, buildNumber) != nil {
4362
return errorutils.CheckErrorf("--%s is a mandatory field for creating a Release Bundle evidence", buildNumber)

evidence/cli/command_cli.go

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ package cli
22

33
import (
44
"errors"
5+
"fmt"
56
"github.com/jfrog/jfrog-cli-artifactory/evidence/cli/docs/create"
7+
"github.com/jfrog/jfrog-cli-artifactory/evidence/cli/docs/verify"
68
jfrogArtClient "github.com/jfrog/jfrog-cli-artifactory/evidence/utils"
79
commonCliUtils "github.com/jfrog/jfrog-cli-core/v2/common/cliutils"
810
"github.com/jfrog/jfrog-cli-core/v2/common/commands"
911
pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common"
1012
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
11-
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
13+
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
1214
coreUtils "github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
1315
"github.com/jfrog/jfrog-client-go/utils"
1416
"github.com/jfrog/jfrog-client-go/utils/errorutils"
@@ -27,6 +29,14 @@ func GetCommands() []components.Command {
2729
Arguments: create.GetArguments(),
2830
Action: createEvidence,
2931
},
32+
{
33+
Name: "verify-evidences",
34+
Aliases: []string{"verify"},
35+
Flags: GetCommandFlags(VerifyEvidence),
36+
Description: verify.GetDescription(),
37+
Arguments: verify.GetArguments(),
38+
Action: verifyEvidences,
39+
},
3040
}
3141
}
3242

@@ -66,6 +76,39 @@ func createEvidence(ctx *components.Context) error {
6676
return errors.New("unsupported subject")
6777
}
6878

79+
func verifyEvidences(ctx *components.Context) error {
80+
// validate common context
81+
serverDetails, err := evidenceDetailsByFlags(ctx)
82+
if err != nil {
83+
return err
84+
}
85+
subjectType, err := getAndValidateSubject(ctx)
86+
if err != nil {
87+
return err
88+
}
89+
err = validateKeys(ctx)
90+
if err != nil {
91+
return err
92+
}
93+
evidenceCommands := map[string]func(*components.Context, execCommandFunc) EvidenceCommands{
94+
subjectRepoPath: NewEvidenceCustomCommand,
95+
releaseBundle: NewEvidenceReleaseBundleCommand,
96+
buildName: NewEvidenceBuildCommand,
97+
packageName: NewEvidencePackageCommand,
98+
}
99+
if commandFunc, exists := evidenceCommands[subjectType[0]]; exists {
100+
err = commandFunc(ctx, execFunc).VerifyEvidences(ctx, serverDetails)
101+
if err != nil {
102+
if err.Error() != "" {
103+
return fmt.Errorf("evidence verification failed: %w", err)
104+
}
105+
return err
106+
}
107+
return nil
108+
}
109+
return errors.New("unsupported subject")
110+
}
111+
69112
func validateCreateEvidenceCommonContext(ctx *components.Context) error {
70113
if show, err := pluginsCommon.ShowCmdHelpIfNeeded(ctx, ctx.Arguments); show || err != nil {
71114
return err
@@ -156,6 +199,24 @@ func setBuildValue(ctx *components.Context, flag, envVar string) bool {
156199
return false
157200
}
158201

202+
func validateKeys(ctx *components.Context) error {
203+
signingKeyValue, _ := jfrogArtClient.GetEnvVariable(coreUtils.SigningKey)
204+
providedKeys := ctx.GetStringsArrFlagValue(publicKeys)
205+
if signingKeyValue == "" {
206+
if len(providedKeys) == 0 && !ctx.GetBoolFlagValue(useArtifactoryKeys) {
207+
return errorutils.CheckErrorf("JFROG_CLI_SIGNING_KEY env variable or --public-keys flag or --use-artifactory-publicKeys must be provided when verifying evidence")
208+
}
209+
return nil
210+
}
211+
if len(providedKeys) > 0 {
212+
joinedKeys := strings.Join(append(providedKeys, signingKeyValue), ";")
213+
ctx.SetStringFlagValue(publicKeys, joinedKeys)
214+
} else {
215+
ctx.AddStringFlag(publicKeys, signingKeyValue)
216+
}
217+
return nil
218+
}
219+
159220
func validateFoundSubjects(ctx *components.Context, foundSubjects []string) error {
160221
if slices.Contains(foundSubjects, typeFlag) && slices.Contains(foundSubjects, buildName) {
161222
return nil
@@ -171,7 +232,7 @@ func validateFoundSubjects(ctx *components.Context, foundSubjects []string) erro
171232
return nil
172233
}
173234

174-
func evidenceDetailsByFlags(ctx *components.Context) (*coreConfig.ServerDetails, error) {
235+
func evidenceDetailsByFlags(ctx *components.Context) (*config.ServerDetails, error) {
175236
serverDetails, err := pluginsCommon.CreateServerDetailsWithConfigOffer(ctx, true, commonCliUtils.Platform)
176237
if err != nil {
177238
return nil, err
@@ -188,10 +249,11 @@ func evidenceDetailsByFlags(ctx *components.Context) (*coreConfig.ServerDetails,
188249
return serverDetails, nil
189250
}
190251

191-
func platformToEvidenceUrls(rtDetails *coreConfig.ServerDetails) {
252+
func platformToEvidenceUrls(rtDetails *config.ServerDetails) {
192253
rtDetails.ArtifactoryUrl = utils.AddTrailingSlashIfNeeded(rtDetails.Url) + "artifactory/"
193254
rtDetails.EvidenceUrl = utils.AddTrailingSlashIfNeeded(rtDetails.Url) + "evidence/"
194255
rtDetails.MetadataUrl = utils.AddTrailingSlashIfNeeded(rtDetails.Url) + "metadata/"
256+
rtDetails.OnemodelUrl = utils.AddTrailingSlashIfNeeded(rtDetails.Url) + "onemodel/"
195257
}
196258

197259
func assertValueProvided(c *components.Context, fieldName string) error {

evidence/cli/command_cli_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,146 @@ func TestCreateEvidence_Context(t *testing.T) {
209209
}
210210
}
211211

212+
func TestVerifyEvidence_Context(t *testing.T) {
213+
ctrl := gomock.NewController(t)
214+
defer ctrl.Finish()
215+
216+
assert.NoError(t, os.Setenv(coreUtils.SigningKey, "PGP"), "Failed to set env: "+coreUtils.SigningKey)
217+
assert.NoError(t, os.Setenv(coreUtils.BuildName, buildName), "Failed to set env: JFROG_CLI_BUILD_NAME")
218+
defer os.Unsetenv(coreUtils.SigningKey)
219+
defer os.Unsetenv(coreUtils.BuildName)
220+
221+
app := cli.NewApp()
222+
app.Commands = []cli.Command{
223+
{
224+
Name: "verify",
225+
},
226+
}
227+
set := flag.NewFlagSet(predicate, 0)
228+
ctx := cli.NewContext(app, set, nil)
229+
230+
tests := []struct {
231+
name string
232+
flags []components.Flag
233+
expectErr bool
234+
}{
235+
{
236+
name: "InvalidContext - Missing Subject",
237+
flags: []components.Flag{
238+
setDefaultValue(publicKeys, "PGP"),
239+
setDefaultValue(format, "json"),
240+
},
241+
expectErr: true,
242+
},
243+
{
244+
name: "InvalidContext - Subject Duplication",
245+
flags: []components.Flag{
246+
setDefaultValue(publicKeys, "PGP"),
247+
setDefaultValue(subjectRepoPath, subjectRepoPath),
248+
setDefaultValue(releaseBundle, releaseBundle),
249+
setDefaultValue(releaseBundleVersion, releaseBundleVersion),
250+
},
251+
expectErr: true,
252+
},
253+
{
254+
name: "ValidContext - ReleaseBundle",
255+
flags: []components.Flag{
256+
setDefaultValue(releaseBundle, releaseBundle),
257+
setDefaultValue(releaseBundleVersion, releaseBundleVersion),
258+
setDefaultValue("url", "url"),
259+
},
260+
expectErr: false,
261+
},
262+
{
263+
name: "ValidContext - RepoPath",
264+
flags: []components.Flag{
265+
setDefaultValue(subjectRepoPath, subjectRepoPath),
266+
setDefaultValue("url", "url"),
267+
},
268+
expectErr: false,
269+
},
270+
{
271+
name: "ValidContext - Build",
272+
flags: []components.Flag{
273+
setDefaultValue(publicKeys, "PGP"),
274+
setDefaultValue(format, "full"),
275+
setDefaultValue(buildName, buildName),
276+
setDefaultValue(buildNumber, buildNumber),
277+
setDefaultValue("url", "url"),
278+
},
279+
expectErr: false,
280+
},
281+
{
282+
name: "InvalidContext - Build",
283+
flags: []components.Flag{
284+
setDefaultValue(buildName, buildName),
285+
setDefaultValue("url", "url"),
286+
},
287+
expectErr: true,
288+
},
289+
{
290+
name: "ValidContext - Package",
291+
flags: []components.Flag{
292+
setDefaultValue(packageName, packageName),
293+
setDefaultValue(packageVersion, packageVersion),
294+
setDefaultValue(packageRepoName, packageRepoName),
295+
setDefaultValue("url", "url"),
296+
},
297+
expectErr: false,
298+
},
299+
{
300+
name: "InvalidContext - Missing package version",
301+
flags: []components.Flag{
302+
setDefaultValue(packageName, packageName),
303+
setDefaultValue(packageRepoName, packageRepoName),
304+
setDefaultValue("url", "url"),
305+
},
306+
expectErr: true,
307+
},
308+
{
309+
name: "InvalidContext - Missing package repository key",
310+
flags: []components.Flag{
311+
setDefaultValue(packageName, packageName),
312+
setDefaultValue(packageVersion, packageVersion),
313+
setDefaultValue("url", "url"),
314+
},
315+
expectErr: true,
316+
},
317+
{
318+
name: "InvalidContext - Unsupported Basic Auth",
319+
flags: []components.Flag{
320+
setDefaultValue(releaseBundle, releaseBundle),
321+
setDefaultValue("url", "url"),
322+
setDefaultValue("user", "testUser"),
323+
setDefaultValue("password", "testPassword"),
324+
},
325+
expectErr: true,
326+
},
327+
}
328+
329+
for _, tt := range tests {
330+
t.Run(tt.name, func(t *testing.T) {
331+
context, err1 := components.ConvertContext(ctx, tt.flags...)
332+
if err1 != nil {
333+
return
334+
}
335+
336+
execFunc = func(command commands.Command) error {
337+
return nil
338+
}
339+
// Replace execFunc with the mockExec function
340+
defer func() { execFunc = exec }() // Restore original execFunc after test
341+
342+
err := verifyEvidences(context)
343+
if tt.expectErr {
344+
assert.Error(t, err)
345+
} else {
346+
assert.NoError(t, err)
347+
}
348+
})
349+
}
350+
}
351+
212352
func setDefaultValue(flag string, defaultValue string) components.Flag {
213353
f := components.NewStringFlag(flag, flag)
214354
f.DefaultValue = defaultValue

evidence/cli/command_custom.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package cli
22

33
import (
4-
"github.com/jfrog/jfrog-cli-artifactory/evidence"
4+
"github.com/jfrog/jfrog-cli-artifactory/evidence/create"
5+
"github.com/jfrog/jfrog-cli-artifactory/evidence/verify"
56
"github.com/jfrog/jfrog-cli-core/v2/plugins/components"
6-
coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config"
7+
"github.com/jfrog/jfrog-cli-core/v2/utils/config"
78
)
89

910
type evidenceCustomCommand struct {
@@ -17,8 +18,8 @@ func NewEvidenceCustomCommand(ctx *components.Context, execute execCommandFunc)
1718
execute: execute,
1819
}
1920
}
20-
func (ecc *evidenceCustomCommand) CreateEvidence(_ *components.Context, serverDetails *coreConfig.ServerDetails) error {
21-
createCmd := evidence.NewCreateEvidenceCustom(
21+
func (ecc *evidenceCustomCommand) CreateEvidence(_ *components.Context, serverDetails *config.ServerDetails) error {
22+
createCmd := create.NewCreateEvidenceCustom(
2223
serverDetails,
2324
ecc.ctx.GetStringFlagValue(predicate),
2425
ecc.ctx.GetStringFlagValue(predicateType),
@@ -30,3 +31,14 @@ func (ecc *evidenceCustomCommand) CreateEvidence(_ *components.Context, serverDe
3031
ecc.ctx.GetStringFlagValue(providerId))
3132
return ecc.execute(createCmd)
3233
}
34+
35+
func (ecc *evidenceCustomCommand) VerifyEvidences(_ *components.Context, serverDetails *config.ServerDetails) error {
36+
verifyCmd := verify.NewVerifyEvidenceCustom(
37+
serverDetails,
38+
ecc.ctx.GetStringFlagValue(subjectRepoPath),
39+
ecc.ctx.GetStringFlagValue(format),
40+
ecc.ctx.GetStringsArrFlagValue(publicKeys),
41+
ecc.ctx.GetBoolFlagValue(useArtifactoryKeys),
42+
)
43+
return ecc.execute(verifyCmd)
44+
}

0 commit comments

Comments
 (0)