Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions app/controlplane/api/workflowcontract/v1/crafting_schema.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ message CraftingSchema {
GITLAB_SECURITY_REPORT = 16;
ZAP_DAST_ZIP = 17;
BLACKDUCK_SCA_JSON = 18;
// Twistcli scan output in json format: https://www.twistlock.com
TWISTCTL_SCAN_JSON = 19;
// Twistcli scan output in json format: https://docs.prismacloud.io/en/compute-edition/30/admin-guide/tools/twistcli-scan-images
TWISTCLI_SCAN_JSON = 19;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ var CraftingMaterialInValidationOrder = []CraftingSchema_Material_MaterialType{
CraftingSchema_Material_HELM_CHART,
CraftingSchema_Material_SARIF,
CraftingSchema_Material_BLACKDUCK_SCA_JSON,
CraftingSchema_Material_TWISTCTL_SCAN_JSON,
CraftingSchema_Material_TWISTCLI_SCAN_JSON,
CraftingSchema_Material_ATTESTATION,
CraftingSchema_Material_ZAP_DAST_ZIP,
CraftingSchema_Material_CONTAINER_IMAGE,
Expand Down
4 changes: 2 additions & 2 deletions pkg/attestation/crafter/materials/materials.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@ func Craft(ctx context.Context, materialSchema *schemaapi.CraftingSchema_Materia
crafter, err = NewZAPCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_BLACKDUCK_SCA_JSON:
crafter, err = NewBlackduckSCAJSONCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_TWISTCTL_SCAN_JSON:
crafter, err = NewTwistCTLScanCrafter(materialSchema, casBackend, logger)
case schemaapi.CraftingSchema_Material_TWISTCLI_SCAN_JSON:
crafter, err = NewTwistCLIScanCrafter(materialSchema, casBackend, logger)
default:
return nil, fmt.Errorf("material of type %q not supported yet", materialSchema.Type)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,42 +28,42 @@ import (
"github.com/rs/zerolog"
)

type twistCTLScanResult struct {
type twistCLIScanResult struct {
Results any `json:"results"`
ConsoleURL string `json:"consoleURL"`
}

type TwistCTLScanCrafter struct {
type TwistCLIScanCrafter struct {
backend *casclient.CASBackend
*crafterCommon
}

func NewTwistCTLScanCrafter(materialSchema *schemaapi.CraftingSchema_Material, backend *casclient.CASBackend, l *zerolog.Logger) (*TwistCTLScanCrafter, error) {
if materialSchema.Type != schemaapi.CraftingSchema_Material_TWISTCTL_SCAN_JSON {
func NewTwistCLIScanCrafter(materialSchema *schemaapi.CraftingSchema_Material, backend *casclient.CASBackend, l *zerolog.Logger) (*TwistCLIScanCrafter, error) {
if materialSchema.Type != schemaapi.CraftingSchema_Material_TWISTCLI_SCAN_JSON {
return nil, fmt.Errorf("material type is not a twistcli scan")
}

return &TwistCTLScanCrafter{
return &TwistCLIScanCrafter{
backend: backend,
crafterCommon: &crafterCommon{logger: l, input: materialSchema},
}, nil
}

func (i *TwistCTLScanCrafter) Craft(ctx context.Context, filePath string) (*api.Attestation_Material, error) {
func (i *TwistCLIScanCrafter) Craft(ctx context.Context, filePath string) (*api.Attestation_Material, error) {
f, err := os.ReadFile(filePath)
if err != nil {
return nil, fmt.Errorf("can't open the file: %w", err)
}

var v twistCTLScanResult
var v twistCLIScanResult
if err := json.Unmarshal(f, &v); err != nil {
i.logger.Debug().Err(err).Msg("error decoding file")
return nil, fmt.Errorf("invalid twistctl scan file: %w", ErrInvalidMaterialType)
return nil, fmt.Errorf("invalid twistcli scan file: %w", ErrInvalidMaterialType)
}

// Check the unmarshalled JSON contains a results and consoleURL fields
if v.Results == nil || v.ConsoleURL == "" {
return nil, fmt.Errorf("invalid twistctl scan file: %w", ErrInvalidMaterialType)
return nil, fmt.Errorf("invalid twistcli scan file: %w", ErrInvalidMaterialType)
}

return uploadAndCraft(ctx, i.input, i.backend, filePath, i.logger)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import (
"github.com/stretchr/testify/require"
)

func TestTwistCTLScanCrafter(t *testing.T) {
func TestTwistCLIScanCrafter(t *testing.T) {
testCases := []struct {
name string
input *contractAPI.CraftingSchema_Material
Expand All @@ -39,7 +39,7 @@ func TestTwistCTLScanCrafter(t *testing.T) {
{
name: "happy path",
input: &contractAPI.CraftingSchema_Material{
Type: contractAPI.CraftingSchema_Material_TWISTCTL_SCAN_JSON,
Type: contractAPI.CraftingSchema_Material_TWISTCLI_SCAN_JSON,
},
},
{
Expand All @@ -62,7 +62,7 @@ func TestTwistCTLScanCrafter(t *testing.T) {
}
}

func TestTwistCTLScanCraft(t *testing.T) {
func TestTwistCLIScanCraft(t *testing.T) {
testCases := []struct {
name string
filePath string
Expand All @@ -85,14 +85,14 @@ func TestTwistCTLScanCraft(t *testing.T) {
},
{
name: "valid artifact type",
filePath: "./testdata/twistctl_scan.json",
filePath: "./testdata/twistcli_scan.json",
},
}

assert := assert.New(t)
schema := &contractAPI.CraftingSchema_Material{
Name: "test",
Type: contractAPI.CraftingSchema_Material_TWISTCTL_SCAN_JSON,
Type: contractAPI.CraftingSchema_Material_TWISTCLI_SCAN_JSON,
}
l := zerolog.Nop()
for _, tc := range testCases {
Expand All @@ -108,7 +108,7 @@ func TestTwistCTLScanCraft(t *testing.T) {
}

backend := &casclient.CASBackend{Uploader: uploader}
crafter, err := materials.NewTwistCTLScanCrafter(schema, backend, &l)
crafter, err := materials.NewTwistCLIScanCrafter(schema, backend, &l)
require.NoError(t, err)

got, err := crafter.Craft(context.TODO(), tc.filePath)
Expand All @@ -118,12 +118,12 @@ func TestTwistCTLScanCraft(t *testing.T) {
}
require.NoError(t, err)

assert.Equal(contractAPI.CraftingSchema_Material_TWISTCTL_SCAN_JSON.String(), got.MaterialType.String())
assert.Equal(contractAPI.CraftingSchema_Material_TWISTCLI_SCAN_JSON.String(), got.MaterialType.String())
assert.True(got.UploadedToCas)

// // The result includes the digest reference
assert.Equal(got.GetArtifact(), &attestationApi.Attestation_Material_Artifact{
Id: "test", Digest: "sha256:91bae460738dfa58dda12edb54929b39005d415e778ed806477675038513908c", Name: "twistctl_scan.json",
Id: "test", Digest: "sha256:91bae460738dfa58dda12edb54929b39005d415e778ed806477675038513908c", Name: "twistcli_scan.json",
})
})
}
Expand Down