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
47 changes: 29 additions & 18 deletions internal/commands/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ const (
failedGettingBfl = "Failed getting BFL"
notAvailableString = "N/A"
notAvailableNumber = -1
defaultPaddingSize = -14
)

var filterResultsListFlagUsage = fmt.Sprintf(
Expand Down Expand Up @@ -304,6 +305,8 @@ func getScanInfo(scansWrapper wrappers.ScansWrapper, scanID string) (*wrappers.R
KicsIssues: kicsIssues,
ScaIssues: scaIssues,
Tags: scanInfo.Tags,
ProjectName: scanInfo.ProjectName,
BranchName: scanInfo.Branch,
}, nil
}
return nil, err
Expand Down Expand Up @@ -376,37 +379,45 @@ func writeHTMLSummary(targetFile string, summary *wrappers.ResultSummary) error
}

func writeConsoleSummary(summary *wrappers.ResultSummary) error {
fmt.Println("")
fmt.Println(" ******************** Scan Summary ********************")
fmt.Printf(" Created At: %s\n", summary.CreatedAt)
fmt.Printf(" Risk: %s\n", summary.RiskMsg)
fmt.Printf(" Project ID: %s\n", summary.ProjectID)
fmt.Printf(" Scan ID: %s\n", summary.ScanID)
fmt.Printf(" Total Issues: %d\n", summary.TotalIssues)
fmt.Printf(" High Issues: %d\n", summary.HighIssues)
fmt.Printf(" Medium Issues: %d\n", summary.MediumIssues)
fmt.Printf(" Low Issues: %d\n", summary.LowIssues)
fmt.Printf(" Scan Summary: \n")
fmt.Printf(" Created At: %s\n", summary.CreatedAt)
fmt.Printf(" Project Name: %s \n", summary.ProjectName)
fmt.Printf(" Scan ID: %s \n\n", summary.ScanID)
fmt.Printf(" Results Summary: \n")
fmt.Printf(" Risk Level: %s \n", summary.RiskMsg)
fmt.Printf(" ----------------------------------- \n")
fmt.Printf(" Total Results: %d \n", summary.TotalIssues)
fmt.Printf(" ----------------------------------- \n")
fmt.Printf(" | High: %*d| \n", defaultPaddingSize, summary.HighIssues)
fmt.Printf(" | Medium: %*d| \n", defaultPaddingSize, summary.MediumIssues)
fmt.Printf(" | Low: %*d| \n", defaultPaddingSize, summary.LowIssues)
fmt.Printf(" ----------------------------------- \n")

if summary.KicsIssues == notAvailableNumber {
fmt.Printf(" Kics Issues: %s\n", notAvailableString)
fmt.Printf(" | KICS: %*s| \n", defaultPaddingSize, notAvailableString)
} else {
fmt.Printf(" Kics Issues: %d\n", summary.KicsIssues)
fmt.Printf(" | KICS: %*d| \n", defaultPaddingSize, summary.KicsIssues)
}
if summary.SastIssues == notAvailableNumber {
fmt.Printf(" CxSAST Issues: %s\n", notAvailableString)
fmt.Printf(" | SAST: %*s| \n", defaultPaddingSize, notAvailableString)
} else {
fmt.Printf(" CxSAST Issues: %d\n", summary.SastIssues)
fmt.Printf(" | SAST: %*d| \n", defaultPaddingSize, summary.SastIssues)
}
if summary.ScaIssues == notAvailableNumber {
fmt.Printf(" CxSCA Issues: %s\n", notAvailableString)
fmt.Printf(" | SCA: %*s| \n", defaultPaddingSize, notAvailableString)
} else {
fmt.Printf(" CxSCA Issues: %d\n", summary.ScaIssues)
fmt.Printf(" | SCA: %*d| \n", defaultPaddingSize, summary.ScaIssues)
}
fmt.Print(" ******************************************************")
fmt.Println("")
fmt.Printf(" ----------------------------------- \n")
fmt.Printf(" Checkmarx AST - Scan Summary & Details: %s\n", generateScanSummaryURL(summary))
return nil
}

func generateScanSummaryURL(summary *wrappers.ResultSummary) string {
summaryURL := fmt.Sprintf(strings.Replace(summary.BaseURI, "overview", "scans?id=%s&branch=%s", 1), summary.ScanID, summary.BranchName)
return summaryURL
}

func runGetResultCommand(
resultsWrapper wrappers.ResultsWrapper,
scanWrapper wrappers.ScansWrapper,
Expand Down
68 changes: 50 additions & 18 deletions internal/commands/scan.go
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,7 @@ func runCreateScanCommand(
if errorModel != nil {
return errors.Errorf(ErrorCodeFormat, failedCreating, errorModel.Code, errorModel.Message)
} else if scanResponseModel != nil {
scanResponseModel = enrichScanResponseModel(cmd, scanResponseModel)
err = printByScanInfoFormat(cmd, toScanView(scanResponseModel))
if err != nil {
return errors.Wrapf(err, "%s\n", failedCreating)
Expand All @@ -1055,6 +1056,15 @@ func runCreateScanCommand(
}
}

func enrichScanResponseModel(cmd *cobra.Command, scanResponseModel *wrappers.ScanResponseModel) *wrappers.ScanResponseModel {
scanResponseModel.ProjectName, _ = cmd.Flags().GetString(commonParams.ProjectName)
incrementalSast, _ := cmd.Flags().GetBool(commonParams.IncrementalSast)
scanResponseModel.SastIncremental = strconv.FormatBool(incrementalSast)
timeoutVal, _ := cmd.Flags().GetInt(commonParams.ScanTimeoutFlag)
scanResponseModel.Timeout = strconv.Itoa(timeoutVal)
return scanResponseModel
}

func createScanModel(
cmd *cobra.Command,
uploadsWrapper wrappers.UploadsWrapper,
Expand Down Expand Up @@ -1521,15 +1531,18 @@ func runDownloadLogs(logsWrapper wrappers.LogsWrapper) func(*cobra.Command, []st
}

type scanView struct {
ID string `format:"name:Scan ID"`
ProjectID string `format:"name:Project ID"`
Status string
CreatedAt time.Time `format:"name:Created at;time:01-02-06 15:04:05"`
UpdatedAt time.Time `format:"name:Updated at;time:01-02-06 15:04:05"`
Branch string
Tags map[string]string
Initiator string
Origin string
ID string `format:"name:Scan ID"`
ProjectID string `format:"name:Project ID"`
ProjectName string `format:"name:Project Name"`
Status string
CreatedAt time.Time `format:"name:Created at;time:01-02-06 15:04:05"`
UpdatedAt time.Time `format:"name:Updated at;time:01-02-06 15:04:05"`
Branch string
Tags map[string]string
SastIncremental string `format:"name:Type"`
Timeout string
Initiator string
Origin string
}

func toScanViews(scans []wrappers.ScanResponseModel) []*scanView {
Expand All @@ -1542,21 +1555,40 @@ func toScanViews(scans []wrappers.ScanResponseModel) []*scanView {

func toScanView(scan *wrappers.ScanResponseModel) *scanView {
var origin string
var scanType string
var scanTimeOut string
if scan.UserAgent != "" {
ua := user_agent.New(scan.UserAgent)
name, version := ua.Browser()
origin = name + " " + version
}

if strings.EqualFold("true", scan.SastIncremental) {
scanType = "Incremental"
} else {
scanType = "Full"
}

intValForTimeout, err := strconv.Atoi(scan.Timeout)

if err == nil && intValForTimeout > 0 {
scanTimeOut = fmt.Sprintf("%s %s", scan.Timeout, "mins")
} else {
scanTimeOut = "NONE"
}

return &scanView{
ID: scan.ID,
Status: string(scan.Status),
CreatedAt: scan.CreatedAt,
UpdatedAt: scan.UpdatedAt,
ProjectID: scan.ProjectID,
Branch: scan.Branch,
Tags: scan.Tags,
Initiator: scan.Initiator,
Origin: origin,
ID: scan.ID,
Status: string(scan.Status),
CreatedAt: scan.CreatedAt,
UpdatedAt: scan.UpdatedAt,
ProjectName: scan.ProjectName,
ProjectID: scan.ProjectID,
Branch: scan.Branch,
Tags: scan.Tags,
SastIncremental: scanType,
Timeout: scanTimeOut,
Initiator: scan.Initiator,
Origin: origin,
}
}
2 changes: 2 additions & 0 deletions internal/wrappers/results-summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ type ResultSummary struct {
ProjectID string
BaseURI string
Tags map[string]string
ProjectName string
BranchName string
}

const SummaryTemplate = `
Expand Down
2 changes: 2 additions & 0 deletions internal/wrappers/scans.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ type ScanResponseModel struct {
Engines []string `json:"engines"`
SourceType string `json:"sourceType"`
SourceOrigin string `json:"sourceOrigin"`
SastIncremental string `json:"sastIncremental"`
Timeout string `json:"timeout"`
}

type ScansCollectionResponseModel struct {
Expand Down