From cf6c77192ccb4d55cd1a65c990f6d7ae19bf6706 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Wed, 28 May 2025 23:26:11 +0200 Subject: [PATCH 1/8] CM-48559 - Add commit history scan and pre-commit hook for SAST --- cycode/cli/apps/scan/aggregation_report.py | 42 + cycode/cli/apps/scan/code_scanner.py | 833 +----------------- .../commit_history/commit_history_command.py | 2 +- cycode/cli/apps/scan/commit_range_scanner.py | 280 ++++++ cycode/cli/apps/scan/detection_excluder.py | 153 ++++ .../scan/pre_commit/pre_commit_command.py | 32 +- .../scan/pre_receive/pre_receive_command.py | 28 +- cycode/cli/apps/scan/remote_url_resolver.py | 115 +++ .../scan/repository/repository_command.py | 5 +- .../cli/apps/scan/scan_ci/scan_ci_command.py | 2 +- cycode/cli/apps/scan/scan_command.py | 2 +- cycode/cli/apps/scan/scan_parameters.py | 46 + cycode/cli/apps/scan/scan_result.py | 181 ++++ cycode/cli/consts.py | 4 +- .../files_collector/commit_range_documents.py | 69 ++ .../{excluder.py => file_excluder.py} | 0 cycode/cli/files_collector/path_documents.py | 2 +- .../files_collector/repository_documents.py | 50 +- cycode/cli/files_collector/zip_documents.py | 6 +- .../cli/printers/tables/sca_table_printer.py | 2 +- cycode/cli/printers/tables/table_printer.py | 2 +- cycode/cli/printers/utils/__init__.py | 7 +- .../cli/printers/utils/code_snippet_syntax.py | 2 +- cycode/cli/utils/path_utils.py | 8 + cycode/cli/utils/scan_utils.py | 18 + cycode/cyclient/scan_client.py | 38 +- tests/cli/commands/scan/test_code_scanner.py | 24 +- .../commands/scan/test_detection_excluder.py | 22 + ..._scanner.py => test_aggregation_report.py} | 12 +- 29 files changed, 1087 insertions(+), 900 deletions(-) create mode 100644 cycode/cli/apps/scan/aggregation_report.py create mode 100644 cycode/cli/apps/scan/commit_range_scanner.py create mode 100644 cycode/cli/apps/scan/detection_excluder.py create mode 100644 cycode/cli/apps/scan/remote_url_resolver.py create mode 100644 cycode/cli/apps/scan/scan_parameters.py create mode 100644 cycode/cli/apps/scan/scan_result.py create mode 100644 cycode/cli/files_collector/commit_range_documents.py rename cycode/cli/files_collector/{excluder.py => file_excluder.py} (100%) create mode 100644 tests/cli/commands/scan/test_detection_excluder.py rename tests/{test_code_scanner.py => test_aggregation_report.py} (81%) diff --git a/cycode/cli/apps/scan/aggregation_report.py b/cycode/cli/apps/scan/aggregation_report.py new file mode 100644 index 00000000..45b891ed --- /dev/null +++ b/cycode/cli/apps/scan/aggregation_report.py @@ -0,0 +1,42 @@ +from typing import TYPE_CHECKING, Optional + +import typer + +from cycode.logger import get_logger + +if TYPE_CHECKING: + from cycode.cyclient.scan_client import ScanClient + +logger = get_logger('Aggregation Report URL') + + +def _set_aggregation_report_url(ctx: typer.Context, aggregation_report_url: Optional[str] = None) -> None: + ctx.obj['aggregation_report_url'] = aggregation_report_url + + +def try_get_aggregation_report_url_if_needed( + scan_parameters: dict, cycode_client: 'ScanClient', scan_type: str +) -> Optional[str]: + if not scan_parameters.get('report', False): + return None + + aggregation_id = scan_parameters.get('aggregation_id') + if aggregation_id is None: + return None + + try: + report_url_response = cycode_client.get_scan_aggregation_report_url(aggregation_id, scan_type) + return report_url_response.report_url + except Exception as e: + logger.debug('Failed to get aggregation report url: %s', str(e)) + + +def try_set_aggregation_report_url_if_needed( + ctx: typer.Context, scan_parameters: dict, cycode_client: 'ScanClient', scan_type: str +) -> None: + aggregation_report_url = try_get_aggregation_report_url_if_needed(scan_parameters, cycode_client, scan_type) + if aggregation_report_url: + _set_aggregation_report_url(ctx, aggregation_report_url) + logger.debug('Aggregation report URL set successfully', {'aggregation_report_url': aggregation_report_url}) + else: + logger.debug('No aggregation report URL found or report generation is disabled') diff --git a/cycode/cli/apps/scan/code_scanner.py b/cycode/cli/apps/scan/code_scanner.py index 21b5959e..45341f11 100644 --- a/cycode/cli/apps/scan/code_scanner.py +++ b/cycode/cli/apps/scan/code_scanner.py @@ -1,45 +1,33 @@ -import logging -import os -import sys import time from platform import platform from typing import TYPE_CHECKING, Callable, Optional -from uuid import UUID, uuid4 -import click import typer from cycode.cli import consts -from cycode.cli.cli_types import SeverityOption +from cycode.cli.apps.scan.aggregation_report import try_set_aggregation_report_url_if_needed +from cycode.cli.apps.scan.scan_parameters import get_scan_parameters +from cycode.cli.apps.scan.scan_result import ( + create_local_scan_result, + get_scan_result, + get_sync_scan_result, + print_local_scan_results, +) from cycode.cli.config import configuration_manager -from cycode.cli.console import console from cycode.cli.exceptions import custom_exceptions from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception -from cycode.cli.files_collector.excluder import excluder -from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip from cycode.cli.files_collector.path_documents import get_relevant_documents -from cycode.cli.files_collector.repository_documents import ( - get_commit_range_modified_documents, - get_diff_file_path, - get_pre_commit_modified_documents, - parse_commit_range, -) -from cycode.cli.files_collector.sca import sca_code_scanner from cycode.cli.files_collector.sca.sca_code_scanner import perform_pre_scan_documents_actions from cycode.cli.files_collector.zip_documents import zip_documents -from cycode.cli.models import CliError, Document, DocumentDetections, LocalScanResult -from cycode.cli.utils import scan_utils -from cycode.cli.utils.git_proxy import git_proxy -from cycode.cli.utils.path_utils import get_path_by_os +from cycode.cli.models import CliError, Document, LocalScanResult from cycode.cli.utils.progress_bar import ScanProgressBarSection from cycode.cli.utils.scan_batch import run_parallel_batched_scan -from cycode.cli.utils.scan_utils import set_issue_detected -from cycode.cli.utils.shell_executor import shell -from cycode.cyclient.models import Detection, DetectionSchema, DetectionsPerFile, ZippedFileScanResult -from cycode.logger import get_logger, set_logging_level +from cycode.cli.utils.scan_utils import generate_unique_scan_id, set_issue_detected_by_scan_results +from cycode.cyclient.models import ZippedFileScanResult +from cycode.logger import get_logger if TYPE_CHECKING: - from cycode.cyclient.models import ScanDetailsResponse + from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip from cycode.cyclient.scan_client import ScanClient start_scan_time = time.time() @@ -48,44 +36,6 @@ logger = get_logger('Code Scanner') -def scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: - scan_type = ctx.obj['scan_type'] - scan_parameters = get_scan_parameters(ctx) - git_head_documents, pre_committed_documents = get_pre_commit_modified_documents( - progress_bar=ctx.obj['progress_bar'], - progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES, - repo_path=repo_path, - ) - git_head_documents = excluder.exclude_irrelevant_documents_to_scan(scan_type, git_head_documents) - pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan(scan_type, pre_committed_documents) - sca_code_scanner.perform_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) - scan_commit_range_documents( - ctx, - git_head_documents, - pre_committed_documents, - scan_parameters, - configuration_manager.get_sca_pre_commit_timeout_in_seconds(), - ) - - -def scan_sca_commit_range(ctx: typer.Context, path: str, commit_range: str) -> None: - scan_type = ctx.obj['scan_type'] - progress_bar = ctx.obj['progress_bar'] - - scan_parameters = get_scan_parameters(ctx, (path,)) - from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) - from_commit_documents, to_commit_documents = get_commit_range_modified_documents( - progress_bar, ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev - ) - from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(scan_type, from_commit_documents) - to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(scan_type, to_commit_documents) - sca_code_scanner.perform_pre_commit_range_scan_actions( - path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev - ) - - scan_commit_range_documents(ctx, from_commit_documents, to_commit_documents, scan_parameters=scan_parameters) - - def scan_disk_files(ctx: typer.Context, paths: tuple[str, ...]) -> None: scan_type = ctx.obj['scan_type'] progress_bar = ctx.obj['progress_bar'] @@ -98,10 +48,6 @@ def scan_disk_files(ctx: typer.Context, paths: tuple[str, ...]) -> None: handle_scan_exception(ctx, e) -def set_issue_detected_by_scan_results(ctx: typer.Context, scan_results: list[LocalScanResult]) -> None: - set_issue_detected(ctx, any(scan_result.issue_detected for scan_result in scan_results)) - - def _should_use_sync_flow(command_scan_type: str, scan_type: str, sync_option: bool) -> bool: """Decide whether to use sync flow or async flow for the scan. @@ -175,7 +121,7 @@ def _scan_batch_thread_func(batch: list[Document]) -> tuple[str, CliError, Local local_scan_result = error = error_message = None detections_count = relevant_detections_count = zip_file_size = 0 - scan_id = str(_generate_unique_id()) + scan_id = str(generate_unique_scan_id()) scan_completed = False should_use_sync_flow = _should_use_sync_flow(command_scan_type, scan_type, sync_option) @@ -184,7 +130,7 @@ def _scan_batch_thread_func(batch: list[Document]) -> tuple[str, CliError, Local logger.debug('Preparing local files, %s', {'batch_files_count': len(batch)}) zipped_documents = zip_documents(scan_type, batch) zip_file_size = zipped_documents.size - scan_result = perform_scan( + scan_result = _perform_scan( cycode_client, zipped_documents, scan_type, @@ -219,7 +165,7 @@ def _scan_batch_thread_func(batch: list[Document]) -> tuple[str, CliError, Local 'zip_file_size': zip_file_size, }, ) - _report_scan_status( + report_scan_status( cycode_client, scan_type, scan_id, @@ -237,66 +183,6 @@ def _scan_batch_thread_func(batch: list[Document]) -> tuple[str, CliError, Local return _scan_batch_thread_func -def scan_commit_range( - ctx: typer.Context, path: str, commit_range: str, max_commits_count: Optional[int] = None -) -> None: - scan_type = ctx.obj['scan_type'] - - progress_bar = ctx.obj['progress_bar'] - progress_bar.start() - - if scan_type not in consts.COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES: - raise click.ClickException(f'Commit range scanning for {str.upper(scan_type)} is not supported') - - if scan_type == consts.SCA_SCAN_TYPE: - return scan_sca_commit_range(ctx, path, commit_range) - - documents_to_scan = [] - commit_ids_to_scan = [] - - repo = git_proxy.get_repo(path) - total_commits_count = int(repo.git.rev_list('--count', commit_range)) - logger.debug('Calculating diffs for %s commits in the commit range %s', total_commits_count, commit_range) - - progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, total_commits_count) - - for scanned_commits_count, commit in enumerate(repo.iter_commits(rev=commit_range)): - if _does_reach_to_max_commits_to_scan_limit(commit_ids_to_scan, max_commits_count): - logger.debug('Reached to max commits to scan count. Going to scan only %s last commits', max_commits_count) - progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES, total_commits_count - scanned_commits_count) - break - - progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES) - - commit_id = commit.hexsha - commit_ids_to_scan.append(commit_id) - parent = commit.parents[0] if commit.parents else git_proxy.get_null_tree() - diff_index = commit.diff(parent, create_patch=True, R=True) - commit_documents_to_scan = [] - for diff in diff_index: - commit_documents_to_scan.append( - Document( - path=get_path_by_os(get_diff_file_path(diff)), - content=diff.diff.decode('UTF-8', errors='replace'), - is_git_diff_format=True, - unique_id=commit_id, - ) - ) - - logger.debug( - 'Found all relevant files in commit %s', - {'path': path, 'commit_range': commit_range, 'commit_id': commit_id}, - ) - - documents_to_scan.extend(excluder.exclude_irrelevant_documents_to_scan(scan_type, commit_documents_to_scan)) - - logger.debug('List of commit ids to scan, %s', {'commit_ids': commit_ids_to_scan}) - logger.debug('Starting to scan commit range (it may take a few minutes)') - - scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx, (path,)), is_git_diff=True, is_commit_range=True) - return None - - def scan_documents( ctx: typer.Context, documents_to_scan: list[Document], @@ -324,155 +210,17 @@ def scan_documents( scan_batch_thread_func, scan_type, documents_to_scan, progress_bar=progress_bar ) - aggregation_report_url = _try_get_aggregation_report_url_if_needed(scan_parameters, ctx.obj['client'], scan_type) - _set_aggregation_report_url(ctx, aggregation_report_url) + try_set_aggregation_report_url_if_needed(ctx, scan_parameters, ctx.obj['client'], scan_type) progress_bar.set_section_length(ScanProgressBarSection.GENERATE_REPORT, 1) progress_bar.update(ScanProgressBarSection.GENERATE_REPORT) progress_bar.stop() set_issue_detected_by_scan_results(ctx, local_scan_results) - print_results(ctx, local_scan_results, errors) - - -def scan_commit_range_documents( - ctx: typer.Context, - from_documents_to_scan: list[Document], - to_documents_to_scan: list[Document], - scan_parameters: Optional[dict] = None, - timeout: Optional[int] = None, -) -> None: - """In use by SCA only.""" - cycode_client = ctx.obj['client'] - scan_type = ctx.obj['scan_type'] - severity_threshold = ctx.obj['severity_threshold'] - scan_command_type = ctx.info_name - progress_bar = ctx.obj['progress_bar'] - - local_scan_result = error_message = None - scan_completed = False - scan_id = str(_generate_unique_id()) - from_commit_zipped_documents = InMemoryZip() - to_commit_zipped_documents = InMemoryZip() - - try: - progress_bar.set_section_length(ScanProgressBarSection.SCAN, 1) - - scan_result = init_default_scan_result(scan_id) - if should_scan_documents(from_documents_to_scan, to_documents_to_scan): - logger.debug('Preparing from-commit zip') - from_commit_zipped_documents = zip_documents(scan_type, from_documents_to_scan) - - logger.debug('Preparing to-commit zip') - to_commit_zipped_documents = zip_documents(scan_type, to_documents_to_scan) + print_local_scan_results(ctx, local_scan_results, errors) - scan_result = perform_commit_range_scan_async( - cycode_client, - from_commit_zipped_documents, - to_commit_zipped_documents, - scan_type, - scan_parameters, - timeout, - ) - - progress_bar.update(ScanProgressBarSection.SCAN) - progress_bar.set_section_length(ScanProgressBarSection.GENERATE_REPORT, 1) - - local_scan_result = create_local_scan_result( - scan_result, to_documents_to_scan, scan_command_type, scan_type, severity_threshold - ) - set_issue_detected_by_scan_results(ctx, [local_scan_result]) - - progress_bar.update(ScanProgressBarSection.GENERATE_REPORT) - progress_bar.stop() - # errors will be handled with try-except block; printing will not occur on errors - print_results(ctx, [local_scan_result]) - - scan_completed = True - except Exception as e: - handle_scan_exception(ctx, e) - error_message = str(e) - - zip_file_size = from_commit_zipped_documents.size + to_commit_zipped_documents.size - - detections_count = relevant_detections_count = 0 - if local_scan_result: - detections_count = local_scan_result.detections_count - relevant_detections_count = local_scan_result.relevant_detections_count - scan_id = local_scan_result.scan_id - - logger.debug( - 'Processing commit range scan results, %s', - { - 'all_violations_count': detections_count, - 'relevant_violations_count': relevant_detections_count, - 'scan_id': scan_id, - 'zip_file_size': zip_file_size, - }, - ) - _report_scan_status( - cycode_client, - scan_type, - scan_id, - scan_completed, - relevant_detections_count, - detections_count, - len(to_documents_to_scan), - zip_file_size, - scan_command_type, - error_message, - ) - - -def should_scan_documents(from_documents_to_scan: list[Document], to_documents_to_scan: list[Document]) -> bool: - return len(from_documents_to_scan) > 0 or len(to_documents_to_scan) > 0 - - -def create_local_scan_result( - scan_result: ZippedFileScanResult, - documents_to_scan: list[Document], - command_scan_type: str, - scan_type: str, - severity_threshold: str, -) -> LocalScanResult: - document_detections = get_document_detections(scan_result, documents_to_scan) - relevant_document_detections_list = exclude_irrelevant_document_detections( - document_detections, scan_type, command_scan_type, severity_threshold - ) - - detections_count = sum([len(document_detection.detections) for document_detection in document_detections]) - relevant_detections_count = sum( - [len(document_detections.detections) for document_detections in relevant_document_detections_list] - ) - - return LocalScanResult( - scan_id=scan_result.scan_id, - report_url=scan_result.report_url, - document_detections=relevant_document_detections_list, - issue_detected=len(relevant_document_detections_list) > 0, - detections_count=detections_count, - relevant_detections_count=relevant_detections_count, - ) - - -def perform_scan( - cycode_client: 'ScanClient', - zipped_documents: 'InMemoryZip', - scan_type: str, - is_git_diff: bool, - is_commit_range: bool, - scan_parameters: dict, - should_use_sync_flow: bool = False, -) -> ZippedFileScanResult: - if should_use_sync_flow: - # it does not support commit range scans; should_use_sync_flow handles it - return perform_scan_sync(cycode_client, zipped_documents, scan_type, scan_parameters, is_git_diff) - - return perform_scan_async(cycode_client, zipped_documents, scan_type, scan_parameters, is_commit_range) - - -def perform_scan_async( +def _perform_scan_async( cycode_client: 'ScanClient', zipped_documents: 'InMemoryZip', scan_type: str, @@ -492,38 +240,32 @@ def perform_scan_async( ) -def perform_scan_sync( +def _perform_scan_sync( cycode_client: 'ScanClient', zipped_documents: 'InMemoryZip', scan_type: str, scan_parameters: dict, is_git_diff: bool = False, -) -> ZippedFileScanResult: +) -> 'ZippedFileScanResult': scan_results = cycode_client.zipped_file_scan_sync(zipped_documents, scan_type, scan_parameters, is_git_diff) logger.debug('Sync scan request has been triggered successfully, %s', {'scan_id': scan_results.id}) - return ZippedFileScanResult( - did_detect=True, - detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_results.detection_messages), - scan_id=scan_results.id, - ) + return get_sync_scan_result(scan_type, scan_results) -def perform_commit_range_scan_async( +def _perform_scan( cycode_client: 'ScanClient', - from_commit_zipped_documents: 'InMemoryZip', - to_commit_zipped_documents: 'InMemoryZip', + zipped_documents: 'InMemoryZip', scan_type: str, + is_git_diff: bool, + is_commit_range: bool, scan_parameters: dict, - timeout: Optional[int] = None, + should_use_sync_flow: bool = False, ) -> ZippedFileScanResult: - scan_async_result = cycode_client.multiple_zipped_file_scan_async( - from_commit_zipped_documents, to_commit_zipped_documents, scan_type, scan_parameters - ) + if should_use_sync_flow: + # it does not support commit range scans; should_use_sync_flow handles it + return _perform_scan_sync(cycode_client, zipped_documents, scan_type, scan_parameters, is_git_diff) - logger.debug( - 'Async commit range scan request has been triggered successfully, %s', {'scan_id': scan_async_result.scan_id} - ) - return poll_scan_results(cycode_client, scan_async_result.scan_id, scan_type, scan_parameters, timeout) + return _perform_scan_async(cycode_client, zipped_documents, scan_type, scan_parameters, is_commit_range) def poll_scan_results( @@ -532,7 +274,7 @@ def poll_scan_results( scan_type: str, scan_parameters: dict, polling_timeout: Optional[int] = None, -) -> ZippedFileScanResult: +) -> 'ZippedFileScanResult': if polling_timeout is None: polling_timeout = configuration_manager.get_scan_polling_timeout_in_seconds() @@ -544,10 +286,13 @@ def poll_scan_results( if scan_details.scan_update_at is not None and scan_details.scan_update_at != last_scan_update_at: last_scan_update_at = scan_details.scan_update_at - print_debug_scan_details(scan_details) + logger.debug('Scan update, %s', {'scan_id': scan_details.id, 'scan_status': scan_details.scan_status}) + + if scan_details.message: + logger.debug('Scan message: %s', scan_details.message) if scan_details.scan_status == consts.SCAN_STATUS_COMPLETED: - return _get_scan_result(cycode_client, scan_type, scan_id, scan_details, scan_parameters) + return get_scan_result(cycode_client, scan_type, scan_id, scan_details, scan_parameters) if scan_details.scan_status == consts.SCAN_STATUS_ERROR: raise custom_exceptions.ScanAsyncError( @@ -559,350 +304,7 @@ def poll_scan_results( raise custom_exceptions.ScanAsyncError(f'Failed to complete scan after {polling_timeout} seconds') -def print_debug_scan_details(scan_details_response: 'ScanDetailsResponse') -> None: - logger.debug( - 'Scan update, %s', {'scan_id': scan_details_response.id, 'scan_status': scan_details_response.scan_status} - ) - - if scan_details_response.message: - logger.debug('Scan message: %s', scan_details_response.message) - - -def print_results( - ctx: typer.Context, local_scan_results: list[LocalScanResult], errors: Optional[dict[str, 'CliError']] = None -) -> None: - printer = ctx.obj.get('console_printer') - printer.update_ctx(ctx) - printer.print_scan_results(local_scan_results, errors) - - -def get_document_detections( - scan_result: ZippedFileScanResult, documents_to_scan: list[Document] -) -> list[DocumentDetections]: - logger.debug('Getting document detections') - - document_detections = [] - for detections_per_file in scan_result.detections_per_file: - file_name = get_path_by_os(detections_per_file.file_name) - commit_id = detections_per_file.commit_id - - logger.debug( - 'Going to find the document of the violated file, %s', {'file_name': file_name, 'commit_id': commit_id} - ) - - document = _get_document_by_file_name(documents_to_scan, file_name, commit_id) - document_detections.append(DocumentDetections(document=document, detections=detections_per_file.detections)) - - return document_detections - - -def exclude_irrelevant_document_detections( - document_detections_list: list[DocumentDetections], - scan_type: str, - command_scan_type: str, - severity_threshold: str, -) -> list[DocumentDetections]: - relevant_document_detections_list = [] - for document_detections in document_detections_list: - relevant_detections = exclude_irrelevant_detections( - document_detections.detections, scan_type, command_scan_type, severity_threshold - ) - if relevant_detections: - relevant_document_detections_list.append( - DocumentDetections(document=document_detections.document, detections=relevant_detections) - ) - - return relevant_document_detections_list - - -def parse_pre_receive_input() -> str: - """Parse input to pushed branch update details. - - Example input: - old_value new_value refname - ----------------------------------------------- - 0000000000000000000000000000000000000000 9cf90954ef26e7c58284f8ebf7dcd0fcf711152a refs/heads/main - 973a96d3e925b65941f7c47fa16129f1577d499f 0000000000000000000000000000000000000000 refs/heads/feature-branch - 59564ef68745bca38c42fc57a7822efd519a6bd9 3378e52dcfa47fb11ce3a4a520bea5f85d5d0bf3 refs/heads/develop - - :return: First branch update details (input's first line) - """ - # FIXME(MarshalX): this blocks main thread forever if called outside of pre-receive hook - pre_receive_input = sys.stdin.read().strip() - if not pre_receive_input: - raise ValueError( - 'Pre receive input was not found. Make sure that you are using this command only in pre-receive hook' - ) - - # each line represents a branch update request, handle the first one only - # TODO(MichalBor): support case of multiple update branch requests - return pre_receive_input.splitlines()[0] - - -def _get_default_scan_parameters(ctx: typer.Context) -> dict: - return { - 'monitor': ctx.obj.get('monitor'), - 'report': ctx.obj.get('report'), - 'package_vulnerabilities': ctx.obj.get('package-vulnerabilities'), - 'license_compliance': ctx.obj.get('license-compliance'), - 'command_type': ctx.info_name.replace('-', '_'), # save backward compatibility - 'aggregation_id': str(_generate_unique_id()), - } - - -def get_scan_parameters(ctx: typer.Context, paths: Optional[tuple[str, ...]] = None) -> dict: - scan_parameters = _get_default_scan_parameters(ctx) - - if not paths: - return scan_parameters - - scan_parameters['paths'] = paths - - if len(paths) != 1: - logger.debug('Multiple paths provided, going to ignore remote url') - return scan_parameters - - if not os.path.isdir(paths[0]): - logger.debug('Path is not a directory, going to ignore remote url') - return scan_parameters - - remote_url = try_get_git_remote_url(paths[0]) - if not remote_url: - remote_url = try_to_get_plastic_remote_url(paths[0]) - - if remote_url: - # TODO(MarshalX): remove hardcode in context - ctx.obj['remote_url'] = remote_url - scan_parameters['remote_url'] = remote_url - - return scan_parameters - - -def try_get_git_remote_url(path: str) -> Optional[str]: - try: - remote_url = git_proxy.get_repo(path).remotes[0].config_reader.get('url') - logger.debug('Found Git remote URL, %s', {'remote_url': remote_url, 'path': path}) - return remote_url - except Exception: - logger.debug('Failed to get Git remote URL. Probably not a Git repository') - return None - - -def _get_plastic_repository_name(path: str) -> Optional[str]: - """Get the name of the Plastic repository from the current working directory. - - The command to execute is: - cm status --header --machinereadable --fieldseparator=":::" - - Example of status header in machine-readable format: - STATUS:::0:::Project/RepoName:::OrgName@ServerInfo - """ - try: - command = [ - 'cm', - 'status', - '--header', - '--machinereadable', - f'--fieldseparator={consts.PLASTIC_VCS_DATA_SEPARATOR}', - ] - - status = shell( - command=command, timeout=consts.PLASTIC_VSC_CLI_TIMEOUT, working_directory=path, silent_exc_info=True - ) - if not status: - logger.debug('Failed to get Plastic repository name (command failed)') - return None - - status_parts = status.split(consts.PLASTIC_VCS_DATA_SEPARATOR) - if len(status_parts) < 2: - logger.debug('Failed to parse Plastic repository name (command returned unexpected format)') - return None - - return status_parts[2].strip() - except Exception: - logger.debug('Failed to get Plastic repository name. Probably not a Plastic repository') - return None - - -def _get_plastic_repository_list(working_dir: Optional[str] = None) -> dict[str, str]: - """Get the list of Plastic repositories and their GUIDs. - - The command to execute is: - cm repo list --format="{repname}:::{repguid}" - - Example line with data: - Project/RepoName:::tapo1zqt-wn99-4752-h61m-7d9k79d40r4v - - Each line represents an individual repository. - """ - repo_name_to_guid = {} - - try: - command = ['cm', 'repo', 'ls', f'--format={{repname}}{consts.PLASTIC_VCS_DATA_SEPARATOR}{{repguid}}'] - - status = shell( - command=command, timeout=consts.PLASTIC_VSC_CLI_TIMEOUT, working_directory=working_dir, silent_exc_info=True - ) - if not status: - logger.debug('Failed to get Plastic repository list (command failed)') - return repo_name_to_guid - - status_lines = status.splitlines() - for line in status_lines: - data_parts = line.split(consts.PLASTIC_VCS_DATA_SEPARATOR) - if len(data_parts) < 2: - logger.debug('Failed to parse Plastic repository list line (unexpected format), %s', {'line': line}) - continue - - repo_name, repo_guid = data_parts - repo_name_to_guid[repo_name.strip()] = repo_guid.strip() - - return repo_name_to_guid - except Exception as e: - logger.debug('Failed to get Plastic repository list', exc_info=e) - return repo_name_to_guid - - -def try_to_get_plastic_remote_url(path: str) -> Optional[str]: - repository_name = _get_plastic_repository_name(path) - if not repository_name: - return None - - repository_map = _get_plastic_repository_list(path) - if repository_name not in repository_map: - logger.debug('Failed to get Plastic repository GUID (repository not found in the list)') - return None - - repository_guid = repository_map[repository_name] - return f'{consts.PLASTIC_VCS_REMOTE_URI_PREFIX}{repository_guid}' - - -def exclude_irrelevant_detections( - detections: list[Detection], scan_type: str, command_scan_type: str, severity_threshold: str -) -> list[Detection]: - relevant_detections = _exclude_detections_by_exclusions_configuration(detections, scan_type) - relevant_detections = _exclude_detections_by_scan_type(relevant_detections, scan_type, command_scan_type) - return _exclude_detections_by_severity(relevant_detections, severity_threshold) - - -def _exclude_detections_by_severity(detections: list[Detection], severity_threshold: str) -> list[Detection]: - relevant_detections = [] - for detection in detections: - severity = detection.severity - - if _does_severity_match_severity_threshold(severity, severity_threshold): - relevant_detections.append(detection) - else: - logger.debug( - 'Going to ignore violations because they are below the severity threshold, %s', - {'severity': severity, 'severity_threshold': severity_threshold}, - ) - - return relevant_detections - - -def _exclude_detections_by_scan_type( - detections: list[Detection], scan_type: str, command_scan_type: str -) -> list[Detection]: - if command_scan_type == consts.PRE_COMMIT_COMMAND_SCAN_TYPE: - return exclude_detections_in_deleted_lines(detections) - - exclude_in_deleted_lines = configuration_manager.get_should_exclude_detections_in_deleted_lines(command_scan_type) - if ( - command_scan_type in consts.COMMIT_RANGE_BASED_COMMAND_SCAN_TYPES - and scan_type == consts.SECRET_SCAN_TYPE - and exclude_in_deleted_lines - ): - return exclude_detections_in_deleted_lines(detections) - - return detections - - -def exclude_detections_in_deleted_lines(detections: list[Detection]) -> list[Detection]: - return [detection for detection in detections if detection.detection_details.get('line_type') != 'Removed'] - - -def _exclude_detections_by_exclusions_configuration(detections: list[Detection], scan_type: str) -> list[Detection]: - exclusions = configuration_manager.get_exclusions_by_scan_type(scan_type) - return [detection for detection in detections if not _should_exclude_detection(detection, exclusions)] - - -def _should_exclude_detection(detection: Detection, exclusions: dict) -> bool: - # FIXME(MarshalX): what the difference between by_value and by_sha? - exclusions_by_value = exclusions.get(consts.EXCLUSIONS_BY_VALUE_SECTION_NAME, []) - if _is_detection_sha_configured_in_exclusions(detection, exclusions_by_value): - logger.debug( - 'Ignoring violation because its value is on the ignore list, %s', - {'value_sha': detection.detection_details.get('sha512')}, - ) - return True - - exclusions_by_sha = exclusions.get(consts.EXCLUSIONS_BY_SHA_SECTION_NAME, []) - if _is_detection_sha_configured_in_exclusions(detection, exclusions_by_sha): - logger.debug( - 'Ignoring violation because its SHA value is on the ignore list, %s', - {'sha': detection.detection_details.get('sha512')}, - ) - return True - - exclusions_by_rule = exclusions.get(consts.EXCLUSIONS_BY_RULE_SECTION_NAME, []) - detection_rule_id = detection.detection_rule_id - if detection_rule_id in exclusions_by_rule: - logger.debug( - 'Ignoring violation because its Detection Rule ID is on the ignore list, %s', - {'detection_rule_id': detection_rule_id}, - ) - return True - - exclusions_by_package = exclusions.get(consts.EXCLUSIONS_BY_PACKAGE_SECTION_NAME, []) - package = _get_package_name(detection) - if package and package in exclusions_by_package: - logger.debug('Ignoring violation because its package@version is on the ignore list, %s', {'package': package}) - return True - - exclusions_by_cve = exclusions.get(consts.EXCLUSIONS_BY_CVE_SECTION_NAME, []) - cve = _get_cve_identifier(detection) - if cve and cve in exclusions_by_cve: - logger.debug('Ignoring violation because its CVE is on the ignore list, %s', {'cve': cve}) - return True - - return False - - -def _is_detection_sha_configured_in_exclusions(detection: Detection, exclusions: list[str]) -> bool: - detection_sha = detection.detection_details.get('sha512') - return detection_sha in exclusions - - -def _get_package_name(detection: Detection) -> Optional[str]: - package_name = detection.detection_details.get('vulnerable_component') - package_version = detection.detection_details.get('vulnerable_component_version') - - if package_name is None: - package_name = detection.detection_details.get('package_name') - package_version = detection.detection_details.get('package_version') - - if package_name and package_version: - return f'{package_name}@{package_version}' - - return None - - -def _get_cve_identifier(detection: Detection) -> Optional[str]: - return detection.detection_details.get('alert', {}).get('cve_identifier') - - -def _get_document_by_file_name( - documents: list[Document], file_name: str, unique_id: Optional[str] = None -) -> Optional[Document]: - for document in documents: - if _normalize_file_path(document.path) == _normalize_file_path(file_name) and document.unique_id == unique_id: - return document - - return None - - -def _report_scan_status( +def report_scan_status( cycode_client: 'ScanClient', scan_type: str, scan_id: str, @@ -932,162 +334,3 @@ def _report_scan_status( cycode_client.report_scan_status(scan_type, scan_id, scan_status) except Exception as e: logger.debug('Failed to report scan status', exc_info=e) - - -def _generate_unique_id() -> UUID: - if 'PYTEST_TEST_UNIQUE_ID' in os.environ: - return UUID(os.environ['PYTEST_TEST_UNIQUE_ID']) - - return uuid4() - - -def _does_severity_match_severity_threshold(severity: str, severity_threshold: str) -> bool: - detection_severity_value = SeverityOption.get_member_weight(severity) - severity_threshold_value = SeverityOption.get_member_weight(severity_threshold) - if detection_severity_value < 0 or severity_threshold_value < 0: - return True - - return detection_severity_value >= severity_threshold_value - - -def _get_scan_result( - cycode_client: 'ScanClient', - scan_type: str, - scan_id: str, - scan_details: 'ScanDetailsResponse', - scan_parameters: dict, -) -> ZippedFileScanResult: - if not scan_details.detections_count: - return init_default_scan_result(scan_id) - - scan_raw_detections = cycode_client.get_scan_raw_detections(scan_id) - - return ZippedFileScanResult( - did_detect=True, - detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_raw_detections), - scan_id=scan_id, - report_url=_try_get_aggregation_report_url_if_needed(scan_parameters, cycode_client, scan_type), - ) - - -def init_default_scan_result(scan_id: str) -> ZippedFileScanResult: - return ZippedFileScanResult( - did_detect=False, - detections_per_file=[], - scan_id=scan_id, - ) - - -def _set_aggregation_report_url(ctx: typer.Context, aggregation_report_url: Optional[str] = None) -> None: - ctx.obj['aggregation_report_url'] = aggregation_report_url - - -def _try_get_aggregation_report_url_if_needed( - scan_parameters: dict, cycode_client: 'ScanClient', scan_type: str -) -> Optional[str]: - if not scan_parameters.get('report', False): - return None - - aggregation_id = scan_parameters.get('aggregation_id') - if aggregation_id is None: - return None - - try: - report_url_response = cycode_client.get_scan_aggregation_report_url(aggregation_id, scan_type) - return report_url_response.report_url - except Exception as e: - logger.debug('Failed to get aggregation report url: %s', str(e)) - - -def _map_detections_per_file_and_commit_id(scan_type: str, raw_detections: list[dict]) -> list[DetectionsPerFile]: - """Convert a list of detections (async flow) to list of DetectionsPerFile objects (sync flow). - - Args: - scan_type: Type of the scan. - raw_detections: List of detections as is returned from the server. - - Note: - This method fakes server response structure - to be able to use the same logic for both async and sync scans. - - Note: - Aggregation is performed by file name and commit ID (if available) - - """ - detections_per_files = {} - for raw_detection in raw_detections: - try: - # FIXME(MarshalX): investigate this field mapping - raw_detection['message'] = raw_detection['correlation_message'] - - file_name = _get_file_name_from_detection(scan_type, raw_detection) - detection: Detection = DetectionSchema().load(raw_detection) - commit_id: Optional[str] = detection.detection_details.get('commit_id') # could be None - group_by_key = (file_name, commit_id) - - if group_by_key in detections_per_files: - detections_per_files[group_by_key].append(detection) - else: - detections_per_files[group_by_key] = [detection] - except Exception as e: - logger.debug('Failed to parse detection', exc_info=e) - continue - - return [ - DetectionsPerFile(file_name=file_name, detections=file_detections, commit_id=commit_id) - for (file_name, commit_id), file_detections in detections_per_files.items() - ] - - -def _get_file_name_from_detection(scan_type: str, raw_detection: dict) -> str: - if scan_type == consts.SAST_SCAN_TYPE: - return raw_detection['detection_details']['file_path'] - if scan_type == consts.SECRET_SCAN_TYPE: - return _get_secret_file_name_from_detection(raw_detection) - - return raw_detection['detection_details']['file_name'] - - -def _get_secret_file_name_from_detection(raw_detection: dict) -> str: - file_path: str = raw_detection['detection_details']['file_path'] - file_name: str = raw_detection['detection_details']['file_name'] - return os.path.join(file_path, file_name) - - -def _does_reach_to_max_commits_to_scan_limit(commit_ids: list[str], max_commits_count: Optional[int]) -> bool: - if max_commits_count is None: - return False - - return len(commit_ids) >= max_commits_count - - -def _normalize_file_path(path: str) -> str: - if path.startswith('/'): - return path[1:] - if path.startswith('./'): - return path[2:] - return path - - -def perform_post_pre_receive_scan_actions(ctx: typer.Context) -> None: - if scan_utils.is_scan_failed(ctx): - console.print(consts.PRE_RECEIVE_REMEDIATION_MESSAGE) - - -def enable_verbose_mode(ctx: typer.Context) -> None: - ctx.obj['verbose'] = True - set_logging_level(logging.DEBUG) - - -def is_verbose_mode_requested_in_pre_receive_scan() -> bool: - return does_git_push_option_have_value(consts.VERBOSE_SCAN_FLAG) - - -def should_skip_pre_receive_scan() -> bool: - return does_git_push_option_have_value(consts.SKIP_SCAN_FLAG) - - -def does_git_push_option_have_value(value: str) -> bool: - option_count_env_value = os.getenv(consts.GIT_PUSH_OPTION_COUNT_ENV_VAR_NAME, '') - option_count = int(option_count_env_value) if option_count_env_value.isdigit() else 0 - return any(os.getenv(f'{consts.GIT_PUSH_OPTION_ENV_VAR_PREFIX}{i}') == value for i in range(option_count)) diff --git a/cycode/cli/apps/scan/commit_history/commit_history_command.py b/cycode/cli/apps/scan/commit_history/commit_history_command.py index fc1ef23f..fbc88cb6 100644 --- a/cycode/cli/apps/scan/commit_history/commit_history_command.py +++ b/cycode/cli/apps/scan/commit_history/commit_history_command.py @@ -3,7 +3,7 @@ import typer -from cycode.cli.apps.scan.code_scanner import scan_commit_range +from cycode.cli.apps.scan.commit_range_scanner import scan_commit_range from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception from cycode.cli.logger import logger from cycode.cli.utils.sentry import add_breadcrumb diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py new file mode 100644 index 00000000..fa1c81b8 --- /dev/null +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -0,0 +1,280 @@ +import os +from typing import TYPE_CHECKING, Optional + +import click +import typer + +from cycode.cli import consts +from cycode.cli.apps.scan.code_scanner import ( + poll_scan_results, + report_scan_status, + scan_documents, +) +from cycode.cli.apps.scan.scan_parameters import get_scan_parameters +from cycode.cli.apps.scan.scan_result import ( + create_local_scan_result, + init_default_scan_result, + print_local_scan_results, +) +from cycode.cli.config import configuration_manager +from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception +from cycode.cli.files_collector.commit_range_documents import collect_commit_range_diff_documents +from cycode.cli.files_collector.file_excluder import excluder +from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip +from cycode.cli.files_collector.repository_documents import ( + get_commit_range_modified_documents, + get_diff_file_content, + get_diff_file_path, + get_pre_commit_modified_documents, + parse_commit_range, +) +from cycode.cli.files_collector.sca import sca_code_scanner +from cycode.cli.files_collector.zip_documents import zip_documents +from cycode.cli.models import Document +from cycode.cli.utils.git_proxy import git_proxy +from cycode.cli.utils.path_utils import get_path_by_os +from cycode.cli.utils.progress_bar import ScanProgressBarSection +from cycode.cli.utils.scan_utils import generate_unique_scan_id, set_issue_detected_by_scan_results +from cycode.cyclient.models import ZippedFileScanResult +from cycode.logger import get_logger + +if TYPE_CHECKING: + from cycode.cyclient.scan_client import ScanClient + +logger = get_logger('Commit Range Scanner') + + +def _does_git_push_option_have_value(value: str) -> bool: + option_count_env_value = os.getenv(consts.GIT_PUSH_OPTION_COUNT_ENV_VAR_NAME, '') + option_count = int(option_count_env_value) if option_count_env_value.isdigit() else 0 + return any(os.getenv(f'{consts.GIT_PUSH_OPTION_ENV_VAR_PREFIX}{i}') == value for i in range(option_count)) + + +def is_verbose_mode_requested_in_pre_receive_scan() -> bool: + return _does_git_push_option_have_value(consts.VERBOSE_SCAN_FLAG) + + +def should_skip_pre_receive_scan() -> bool: + return _does_git_push_option_have_value(consts.SKIP_SCAN_FLAG) + + +def _perform_commit_range_scan_async( + cycode_client: 'ScanClient', + from_commit_zipped_documents: 'InMemoryZip', + to_commit_zipped_documents: 'InMemoryZip', + scan_type: str, + scan_parameters: dict, + timeout: Optional[int] = None, +) -> ZippedFileScanResult: + scan_async_result = cycode_client.commit_range_scan_async( + from_commit_zipped_documents, to_commit_zipped_documents, scan_type, scan_parameters + ) + + logger.debug( + 'Async commit range scan request has been triggered successfully, %s', {'scan_id': scan_async_result.scan_id} + ) + return poll_scan_results(cycode_client, scan_async_result.scan_id, scan_type, scan_parameters, timeout) + + +def _scan_commit_range_documents( + ctx: typer.Context, + from_documents_to_scan: list[Document], + to_documents_to_scan: list[Document], + scan_parameters: Optional[dict] = None, + timeout: Optional[int] = None, +) -> None: + cycode_client = ctx.obj['client'] + scan_type = ctx.obj['scan_type'] + severity_threshold = ctx.obj['severity_threshold'] + scan_command_type = ctx.info_name + progress_bar = ctx.obj['progress_bar'] + + local_scan_result = error_message = None + scan_completed = False + scan_id = str(generate_unique_scan_id()) + from_commit_zipped_documents = InMemoryZip() + to_commit_zipped_documents = InMemoryZip() + + try: + progress_bar.set_section_length(ScanProgressBarSection.SCAN, 1) + + scan_result = init_default_scan_result(scan_id) + if len(from_documents_to_scan) > 0 or len(to_documents_to_scan) > 0: + logger.debug('Preparing from-commit zip') + # for SAST it is files from to_commit with actual content to scan + from_commit_zipped_documents = zip_documents(scan_type, from_documents_to_scan) + + logger.debug('Preparing to-commit zip') + # for SAST it is files with diff between from_commit and to_commit + to_commit_zipped_documents = zip_documents(scan_type, to_documents_to_scan) + + scan_result = _perform_commit_range_scan_async( + cycode_client, + from_commit_zipped_documents, + to_commit_zipped_documents, + scan_type, + scan_parameters, + timeout, + ) + + progress_bar.update(ScanProgressBarSection.SCAN) + progress_bar.set_section_length(ScanProgressBarSection.GENERATE_REPORT, 1) + + local_scan_result = create_local_scan_result( + scan_result, to_documents_to_scan, scan_command_type, scan_type, severity_threshold + ) + set_issue_detected_by_scan_results(ctx, [local_scan_result]) + + progress_bar.update(ScanProgressBarSection.GENERATE_REPORT) + progress_bar.stop() + + # errors will be handled with try-except block; printing will not occur on errors + print_local_scan_results(ctx, [local_scan_result]) + + scan_completed = True + except Exception as e: + handle_scan_exception(ctx, e) + error_message = str(e) + + zip_file_size = from_commit_zipped_documents.size + to_commit_zipped_documents.size + + detections_count = relevant_detections_count = 0 + if local_scan_result: + detections_count = local_scan_result.detections_count + relevant_detections_count = local_scan_result.relevant_detections_count + scan_id = local_scan_result.scan_id + + logger.debug( + 'Processing commit range scan results, %s', + { + 'all_violations_count': detections_count, + 'relevant_violations_count': relevant_detections_count, + 'scan_id': scan_id, + 'zip_file_size': zip_file_size, + }, + ) + report_scan_status( + cycode_client, + scan_type, + scan_id, + scan_completed, + relevant_detections_count, + detections_count, + len(to_documents_to_scan), + zip_file_size, + scan_command_type, + error_message, + ) + + +def _scan_sca_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: + scan_parameters = get_scan_parameters(ctx, (path,)) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) + from_commit_documents, to_commit_documents, _ = get_commit_range_modified_documents( + ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev + ) + from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, from_commit_documents) + to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, to_commit_documents) + sca_code_scanner.perform_pre_commit_range_scan_actions( + path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev + ) + + _scan_commit_range_documents(ctx, from_commit_documents, to_commit_documents, scan_parameters=scan_parameters) + + +def _scan_secret_commit_range( + ctx: typer.Context, path: str, commit_range: str, max_commits_count: Optional[int] = None +) -> None: + commit_diff_documents_to_scan = collect_commit_range_diff_documents(ctx, path, commit_range, max_commits_count) + diff_documents_to_scan = excluder.exclude_irrelevant_documents_to_scan( + consts.SECRET_SCAN_TYPE, commit_diff_documents_to_scan + ) + + scan_documents( + ctx, diff_documents_to_scan, get_scan_parameters(ctx, (path,)), is_git_diff=True, is_commit_range=True + ) + + +def _scan_sast_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: + scan_parameters = get_scan_parameters(ctx, (path,)) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) + _, commit_documents, diff_documents = get_commit_range_modified_documents( + ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev + ) + + _scan_commit_range_documents(ctx, commit_documents, diff_documents, scan_parameters=scan_parameters) + + +_SCAN_TYPE_TO_COMMIT_RANGE_HANDLER = { + consts.SCA_SCAN_TYPE: _scan_sca_commit_range, + consts.SECRET_SCAN_TYPE: _scan_secret_commit_range, + consts.SAST_SCAN_TYPE: _scan_sast_commit_range, +} + + +def scan_commit_range(ctx: typer.Context, path: str, commit_range: str, **kwargs) -> None: + scan_type = ctx.obj['scan_type'] + + progress_bar = ctx.obj['progress_bar'] + progress_bar.start() + + if scan_type not in _SCAN_TYPE_TO_COMMIT_RANGE_HANDLER: + raise click.ClickException(f'Commit range scanning for {scan_type.upper()} is not supported') + + _SCAN_TYPE_TO_COMMIT_RANGE_HANDLER[scan_type](ctx, path, commit_range, **kwargs) + + +def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: + scan_parameters = get_scan_parameters(ctx) + git_head_documents, pre_committed_documents = get_pre_commit_modified_documents( + progress_bar=ctx.obj['progress_bar'], + progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES, + repo_path=repo_path, + ) + git_head_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, git_head_documents) + pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan( + consts.SCA_SCAN_TYPE, pre_committed_documents + ) + sca_code_scanner.perform_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) + _scan_commit_range_documents( + ctx, + git_head_documents, + pre_committed_documents, + scan_parameters, + configuration_manager.get_sca_pre_commit_timeout_in_seconds(), + ) + + +def _scan_secret_pre_commit(ctx: typer.Context, repo_path: str) -> None: + progress_bar = ctx.obj['progress_bar'] + diff_files = git_proxy.get_repo(repo_path).index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) + + progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, len(diff_files)) + + documents_to_scan = [] + for file in diff_files: + progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES) + documents_to_scan.append(Document(get_path_by_os(get_diff_file_path(file)), get_diff_file_content(file))) + + documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(consts.SECRET_SCAN_TYPE, documents_to_scan) + scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx), is_git_diff=True) + + +def _scan_sast_pre_commit(ctx: typer.Context, repo_path: str) -> None: + raise NotImplementedError('Pre-commit scanning for SAST is not implemented yet') + + +_SCAN_TYPE_TO_PRE_COMMIT_HANDLER = { + consts.SCA_SCAN_TYPE: _scan_sca_pre_commit, + consts.SECRET_SCAN_TYPE: _scan_secret_pre_commit, + consts.SAST_SCAN_TYPE: _scan_sast_commit_range, +} + + +def scan_pre_commit(ctx: typer.Context, repo_path: str) -> None: + scan_type = ctx.obj['scan_type'] + if scan_type not in _SCAN_TYPE_TO_PRE_COMMIT_HANDLER: + raise click.ClickException(f'Pre-commit scanning for {scan_type.upper()} is not supported') + + _SCAN_TYPE_TO_PRE_COMMIT_HANDLER[scan_type](ctx, repo_path) + logger.debug('Pre-commit scan completed successfully') diff --git a/cycode/cli/apps/scan/detection_excluder.py b/cycode/cli/apps/scan/detection_excluder.py new file mode 100644 index 00000000..3697bcaf --- /dev/null +++ b/cycode/cli/apps/scan/detection_excluder.py @@ -0,0 +1,153 @@ +from typing import Optional + +from cycode.cli import consts +from cycode.cli.cli_types import SeverityOption +from cycode.cli.config import configuration_manager +from cycode.cli.models import DocumentDetections +from cycode.cyclient.models import Detection +from cycode.logger import get_logger + +logger = get_logger('Detection Excluder') + + +def _does_severity_match_severity_threshold(severity: str, severity_threshold: str) -> bool: + detection_severity_value = SeverityOption.get_member_weight(severity) + severity_threshold_value = SeverityOption.get_member_weight(severity_threshold) + if detection_severity_value < 0 or severity_threshold_value < 0: + return True + + return detection_severity_value >= severity_threshold_value + + +def _exclude_irrelevant_detections( + detections: list[Detection], scan_type: str, command_scan_type: str, severity_threshold: str +) -> list[Detection]: + relevant_detections = _exclude_detections_by_exclusions_configuration(detections, scan_type) + relevant_detections = _exclude_detections_by_scan_type(relevant_detections, scan_type, command_scan_type) + return _exclude_detections_by_severity(relevant_detections, severity_threshold) + + +def _exclude_detections_by_severity(detections: list[Detection], severity_threshold: str) -> list[Detection]: + relevant_detections = [] + for detection in detections: + severity = detection.severity + + if _does_severity_match_severity_threshold(severity, severity_threshold): + relevant_detections.append(detection) + else: + logger.debug( + 'Going to ignore violations because they are below the severity threshold, %s', + {'severity': severity, 'severity_threshold': severity_threshold}, + ) + + return relevant_detections + + +def _exclude_detections_by_scan_type( + detections: list[Detection], scan_type: str, command_scan_type: str +) -> list[Detection]: + if command_scan_type == consts.PRE_COMMIT_COMMAND_SCAN_TYPE: + return _exclude_detections_in_deleted_lines(detections) + + exclude_in_deleted_lines = configuration_manager.get_should_exclude_detections_in_deleted_lines(command_scan_type) + if ( + command_scan_type in consts.COMMIT_RANGE_BASED_COMMAND_SCAN_TYPES + and scan_type == consts.SECRET_SCAN_TYPE + and exclude_in_deleted_lines + ): + return _exclude_detections_in_deleted_lines(detections) + + return detections + + +def _exclude_detections_in_deleted_lines(detections: list[Detection]) -> list[Detection]: + return [detection for detection in detections if detection.detection_details.get('line_type') != 'Removed'] + + +def _exclude_detections_by_exclusions_configuration(detections: list[Detection], scan_type: str) -> list[Detection]: + exclusions = configuration_manager.get_exclusions_by_scan_type(scan_type) + return [detection for detection in detections if not _should_exclude_detection(detection, exclusions)] + + +def _should_exclude_detection(detection: Detection, exclusions: dict) -> bool: + # FIXME(MarshalX): what the difference between by_value and by_sha? + exclusions_by_value = exclusions.get(consts.EXCLUSIONS_BY_VALUE_SECTION_NAME, []) + if _is_detection_sha_configured_in_exclusions(detection, exclusions_by_value): + logger.debug( + 'Ignoring violation because its value is on the ignore list, %s', + {'value_sha': detection.detection_details.get('sha512')}, + ) + return True + + exclusions_by_sha = exclusions.get(consts.EXCLUSIONS_BY_SHA_SECTION_NAME, []) + if _is_detection_sha_configured_in_exclusions(detection, exclusions_by_sha): + logger.debug( + 'Ignoring violation because its SHA value is on the ignore list, %s', + {'sha': detection.detection_details.get('sha512')}, + ) + return True + + exclusions_by_rule = exclusions.get(consts.EXCLUSIONS_BY_RULE_SECTION_NAME, []) + detection_rule_id = detection.detection_rule_id + if detection_rule_id in exclusions_by_rule: + logger.debug( + 'Ignoring violation because its Detection Rule ID is on the ignore list, %s', + {'detection_rule_id': detection_rule_id}, + ) + return True + + exclusions_by_package = exclusions.get(consts.EXCLUSIONS_BY_PACKAGE_SECTION_NAME, []) + package = _get_package_name(detection) + if package and package in exclusions_by_package: + logger.debug('Ignoring violation because its package@version is on the ignore list, %s', {'package': package}) + return True + + exclusions_by_cve = exclusions.get(consts.EXCLUSIONS_BY_CVE_SECTION_NAME, []) + cve = _get_cve_identifier(detection) + if cve and cve in exclusions_by_cve: + logger.debug('Ignoring violation because its CVE is on the ignore list, %s', {'cve': cve}) + return True + + return False + + +def _is_detection_sha_configured_in_exclusions(detection: Detection, exclusions: list[str]) -> bool: + detection_sha = detection.detection_details.get('sha512') + return detection_sha in exclusions + + +def _get_package_name(detection: Detection) -> Optional[str]: + package_name = detection.detection_details.get('vulnerable_component') + package_version = detection.detection_details.get('vulnerable_component_version') + + if package_name is None: + package_name = detection.detection_details.get('package_name') + package_version = detection.detection_details.get('package_version') + + if package_name and package_version: + return f'{package_name}@{package_version}' + + return None + + +def _get_cve_identifier(detection: Detection) -> Optional[str]: + return detection.detection_details.get('alert', {}).get('cve_identifier') + + +def exclude_irrelevant_document_detections( + document_detections_list: list[DocumentDetections], + scan_type: str, + command_scan_type: str, + severity_threshold: str, +) -> list[DocumentDetections]: + relevant_document_detections_list = [] + for document_detections in document_detections_list: + relevant_detections = _exclude_irrelevant_detections( + document_detections.detections, scan_type, command_scan_type, severity_threshold + ) + if relevant_detections: + relevant_document_detections_list.append( + DocumentDetections(document=document_detections.document, detections=relevant_detections) + ) + + return relevant_document_detections_list diff --git a/cycode/cli/apps/scan/pre_commit/pre_commit_command.py b/cycode/cli/apps/scan/pre_commit/pre_commit_command.py index 9242b450..5693412f 100644 --- a/cycode/cli/apps/scan/pre_commit/pre_commit_command.py +++ b/cycode/cli/apps/scan/pre_commit/pre_commit_command.py @@ -3,19 +3,7 @@ import typer -from cycode.cli import consts -from cycode.cli.apps.scan.code_scanner import get_scan_parameters, scan_documents, scan_sca_pre_commit -from cycode.cli.files_collector.excluder import excluder -from cycode.cli.files_collector.repository_documents import ( - get_diff_file_content, - get_diff_file_path, -) -from cycode.cli.models import Document -from cycode.cli.utils.git_proxy import git_proxy -from cycode.cli.utils.path_utils import ( - get_path_by_os, -) -from cycode.cli.utils.progress_bar import ScanProgressBarSection +from cycode.cli.apps.scan.commit_range_scanner import scan_pre_commit from cycode.cli.utils.sentry import add_breadcrumb @@ -25,25 +13,9 @@ def pre_commit_command( ) -> None: add_breadcrumb('pre_commit') - scan_type = ctx.obj['scan_type'] - repo_path = os.getcwd() # change locally for easy testing progress_bar = ctx.obj['progress_bar'] progress_bar.start() - if scan_type == consts.SCA_SCAN_TYPE: - scan_sca_pre_commit(ctx, repo_path) - return - - diff_files = git_proxy.get_repo(repo_path).index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) - - progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, len(diff_files)) - - documents_to_scan = [] - for file in diff_files: - progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES) - documents_to_scan.append(Document(get_path_by_os(get_diff_file_path(file)), get_diff_file_content(file))) - - documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(scan_type, documents_to_scan) - scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx), is_git_diff=True) + scan_pre_commit(ctx, repo_path) diff --git a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py index eb4f1420..12ba744d 100644 --- a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +++ b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py @@ -1,3 +1,4 @@ +import logging import os from typing import Annotated, Optional @@ -5,22 +6,23 @@ import typer from cycode.cli import consts -from cycode.cli.apps.scan.code_scanner import ( - enable_verbose_mode, +from cycode.cli.apps.scan.commit_range_scanner import ( is_verbose_mode_requested_in_pre_receive_scan, - parse_pre_receive_input, - perform_post_pre_receive_scan_actions, scan_commit_range, should_skip_pre_receive_scan, ) from cycode.cli.config import configuration_manager +from cycode.cli.console import console from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception from cycode.cli.files_collector.repository_documents import ( calculate_pre_receive_commit_range, + parse_pre_receive_input, ) from cycode.cli.logger import logger +from cycode.cli.utils import scan_utils from cycode.cli.utils.sentry import add_breadcrumb from cycode.cli.utils.task_timer import TimeoutAfter +from cycode.logger import set_logging_level def pre_receive_command( @@ -42,15 +44,13 @@ def pre_receive_command( return if is_verbose_mode_requested_in_pre_receive_scan(): - enable_verbose_mode(ctx) + ctx.obj['verbose'] = True + set_logging_level(logging.DEBUG) logger.debug('Verbose mode enabled: all log levels will be displayed.') command_scan_type = ctx.info_name timeout = configuration_manager.get_pre_receive_command_timeout(command_scan_type) with TimeoutAfter(timeout): - if scan_type not in consts.COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES: - raise click.ClickException(f'Commit range scanning for {scan_type.upper()} is not supported') - branch_update_details = parse_pre_receive_input() commit_range = calculate_pre_receive_commit_range(branch_update_details) if not commit_range: @@ -60,8 +60,14 @@ def pre_receive_command( ) return - max_commits_to_scan = configuration_manager.get_pre_receive_max_commits_to_scan_count(command_scan_type) - scan_commit_range(ctx, os.getcwd(), commit_range, max_commits_count=max_commits_to_scan) - perform_post_pre_receive_scan_actions(ctx) + scan_commit_range( + ctx=ctx, + path=os.getcwd(), + commit_range=commit_range, + max_commits_count=configuration_manager.get_pre_receive_max_commits_to_scan_count(command_scan_type), + ) + + if scan_utils.is_scan_failed(ctx): + console.print(consts.PRE_RECEIVE_REMEDIATION_MESSAGE) except Exception as e: handle_scan_exception(ctx, e) diff --git a/cycode/cli/apps/scan/remote_url_resolver.py b/cycode/cli/apps/scan/remote_url_resolver.py new file mode 100644 index 00000000..5f96328d --- /dev/null +++ b/cycode/cli/apps/scan/remote_url_resolver.py @@ -0,0 +1,115 @@ +from typing import Optional + +from cycode.cli import consts +from cycode.cli.utils.git_proxy import git_proxy +from cycode.cli.utils.shell_executor import shell +from cycode.logger import get_logger + +logger = get_logger('Remote URL Resolver') + + +def _get_plastic_repository_name(path: str) -> Optional[str]: + """Get the name of the Plastic repository from the current working directory. + + The command to execute is: + cm status --header --machinereadable --fieldseparator=":::" + + Example of status header in machine-readable format: + STATUS:::0:::Project/RepoName:::OrgName@ServerInfo + """ + try: + command = [ + 'cm', + 'status', + '--header', + '--machinereadable', + f'--fieldseparator={consts.PLASTIC_VCS_DATA_SEPARATOR}', + ] + + status = shell( + command=command, timeout=consts.PLASTIC_VSC_CLI_TIMEOUT, working_directory=path, silent_exc_info=True + ) + if not status: + logger.debug('Failed to get Plastic repository name (command failed)') + return None + + status_parts = status.split(consts.PLASTIC_VCS_DATA_SEPARATOR) + if len(status_parts) < 2: + logger.debug('Failed to parse Plastic repository name (command returned unexpected format)') + return None + + return status_parts[2].strip() + except Exception: + logger.debug('Failed to get Plastic repository name. Probably not a Plastic repository') + return None + + +def _get_plastic_repository_list(working_dir: Optional[str] = None) -> dict[str, str]: + """Get the list of Plastic repositories and their GUIDs. + + The command to execute is: + cm repo list --format="{repname}:::{repguid}" + + Example line with data: + Project/RepoName:::tapo1zqt-wn99-4752-h61m-7d9k79d40r4v + + Each line represents an individual repository. + """ + repo_name_to_guid = {} + + try: + command = ['cm', 'repo', 'ls', f'--format={{repname}}{consts.PLASTIC_VCS_DATA_SEPARATOR}{{repguid}}'] + + status = shell( + command=command, timeout=consts.PLASTIC_VSC_CLI_TIMEOUT, working_directory=working_dir, silent_exc_info=True + ) + if not status: + logger.debug('Failed to get Plastic repository list (command failed)') + return repo_name_to_guid + + status_lines = status.splitlines() + for line in status_lines: + data_parts = line.split(consts.PLASTIC_VCS_DATA_SEPARATOR) + if len(data_parts) < 2: + logger.debug('Failed to parse Plastic repository list line (unexpected format), %s', {'line': line}) + continue + + repo_name, repo_guid = data_parts + repo_name_to_guid[repo_name.strip()] = repo_guid.strip() + + return repo_name_to_guid + except Exception as e: + logger.debug('Failed to get Plastic repository list', exc_info=e) + return repo_name_to_guid + + +def _try_to_get_plastic_remote_url(path: str) -> Optional[str]: + repository_name = _get_plastic_repository_name(path) + if not repository_name: + return None + + repository_map = _get_plastic_repository_list(path) + if repository_name not in repository_map: + logger.debug('Failed to get Plastic repository GUID (repository not found in the list)') + return None + + repository_guid = repository_map[repository_name] + return f'{consts.PLASTIC_VCS_REMOTE_URI_PREFIX}{repository_guid}' + + +def _try_get_git_remote_url(path: str) -> Optional[str]: + try: + remote_url = git_proxy.get_repo(path).remotes[0].config_reader.get('url') + logger.debug('Found Git remote URL, %s', {'remote_url': remote_url, 'path': path}) + return remote_url + except Exception: + logger.debug('Failed to get Git remote URL. Probably not a Git repository') + return None + + +def try_get_any_remote_url(path: str) -> Optional[str]: + remote_url = _try_get_git_remote_url(path) + if not remote_url: + remote_url = _try_to_get_plastic_remote_url(path) + + return remote_url diff --git a/cycode/cli/apps/scan/repository/repository_command.py b/cycode/cli/apps/scan/repository/repository_command.py index e9a3f63d..0aefa2ba 100644 --- a/cycode/cli/apps/scan/repository/repository_command.py +++ b/cycode/cli/apps/scan/repository/repository_command.py @@ -5,9 +5,10 @@ import typer from cycode.cli import consts -from cycode.cli.apps.scan.code_scanner import get_scan_parameters, scan_documents +from cycode.cli.apps.scan.code_scanner import scan_documents +from cycode.cli.apps.scan.scan_parameters import get_scan_parameters from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception -from cycode.cli.files_collector.excluder import excluder +from cycode.cli.files_collector.file_excluder import excluder from cycode.cli.files_collector.repository_documents import get_git_repository_tree_file_entries from cycode.cli.files_collector.sca.sca_code_scanner import perform_pre_scan_documents_actions from cycode.cli.logger import logger diff --git a/cycode/cli/apps/scan/scan_ci/scan_ci_command.py b/cycode/cli/apps/scan/scan_ci/scan_ci_command.py index cbfebb72..afa5d827 100644 --- a/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +++ b/cycode/cli/apps/scan/scan_ci/scan_ci_command.py @@ -3,7 +3,7 @@ import click import typer -from cycode.cli.apps.scan.code_scanner import scan_commit_range +from cycode.cli.apps.scan.commit_range_scanner import scan_commit_range from cycode.cli.apps.scan.scan_ci.ci_integrations import get_commit_range from cycode.cli.utils.sentry import add_breadcrumb diff --git a/cycode/cli/apps/scan/scan_command.py b/cycode/cli/apps/scan/scan_command.py index 7c2de1a6..363c409a 100644 --- a/cycode/cli/apps/scan/scan_command.py +++ b/cycode/cli/apps/scan/scan_command.py @@ -9,7 +9,7 @@ ISSUE_DETECTED_STATUS_CODE, NO_ISSUES_STATUS_CODE, ) -from cycode.cli.files_collector.excluder import excluder +from cycode.cli.files_collector.file_excluder import excluder from cycode.cli.utils import scan_utils from cycode.cli.utils.get_api_client import get_scan_cycode_client from cycode.cli.utils.sentry import add_breadcrumb diff --git a/cycode/cli/apps/scan/scan_parameters.py b/cycode/cli/apps/scan/scan_parameters.py new file mode 100644 index 00000000..c3c4ecbe --- /dev/null +++ b/cycode/cli/apps/scan/scan_parameters.py @@ -0,0 +1,46 @@ +import os +from typing import Optional + +import typer + +from cycode.cli.apps.scan.remote_url_resolver import try_get_any_remote_url +from cycode.cli.utils.scan_utils import generate_unique_scan_id +from cycode.logger import get_logger + +logger = get_logger('Scan Parameters') + + +def _get_default_scan_parameters(ctx: typer.Context) -> dict: + return { + 'monitor': ctx.obj.get('monitor'), + 'report': ctx.obj.get('report'), + 'package_vulnerabilities': ctx.obj.get('package-vulnerabilities'), + 'license_compliance': ctx.obj.get('license-compliance'), + 'command_type': ctx.info_name.replace('-', '_'), # save backward compatibility + 'aggregation_id': str(generate_unique_scan_id()), + } + + +def get_scan_parameters(ctx: typer.Context, paths: Optional[tuple[str, ...]] = None) -> dict: + scan_parameters = _get_default_scan_parameters(ctx) + + if not paths: + return scan_parameters + + scan_parameters['paths'] = paths + + if len(paths) != 1: + logger.debug('Multiple paths provided, going to ignore remote url') + return scan_parameters + + if not os.path.isdir(paths[0]): + logger.debug('Path is not a directory, going to ignore remote url') + return scan_parameters + + remote_url = try_get_any_remote_url(paths[0]) + if remote_url: + # TODO(MarshalX): remove hardcode in context + ctx.obj['remote_url'] = remote_url + scan_parameters['remote_url'] = remote_url + + return scan_parameters diff --git a/cycode/cli/apps/scan/scan_result.py b/cycode/cli/apps/scan/scan_result.py new file mode 100644 index 00000000..88bc6320 --- /dev/null +++ b/cycode/cli/apps/scan/scan_result.py @@ -0,0 +1,181 @@ +import os +from typing import TYPE_CHECKING, Optional + +import typer + +from cycode.cli import consts +from cycode.cli.apps.scan.aggregation_report import try_get_aggregation_report_url_if_needed +from cycode.cli.apps.scan.detection_excluder import exclude_irrelevant_document_detections +from cycode.cli.models import Document, DocumentDetections, LocalScanResult +from cycode.cli.utils.path_utils import get_path_by_os, normalize_file_path +from cycode.cyclient.models import ( + Detection, + DetectionSchema, + DetectionsPerFile, + ScanResultsSyncFlow, + ZippedFileScanResult, +) +from cycode.logger import get_logger + +if TYPE_CHECKING: + from cycode.cli.models import CliError + from cycode.cyclient.models import ScanDetailsResponse + from cycode.cyclient.scan_client import ScanClient + +logger = get_logger('Scan Results') + + +def _get_document_by_file_name( + documents: list[Document], file_name: str, unique_id: Optional[str] = None +) -> Optional[Document]: + for document in documents: + if normalize_file_path(document.path) == normalize_file_path(file_name) and document.unique_id == unique_id: + return document + + return None + + +def _get_document_detections( + scan_result: ZippedFileScanResult, documents_to_scan: list[Document] +) -> list[DocumentDetections]: + logger.debug('Getting document detections') + + document_detections = [] + for detections_per_file in scan_result.detections_per_file: + file_name = get_path_by_os(detections_per_file.file_name) + commit_id = detections_per_file.commit_id + + logger.debug( + 'Going to find the document of the violated file, %s', {'file_name': file_name, 'commit_id': commit_id} + ) + + document = _get_document_by_file_name(documents_to_scan, file_name, commit_id) + document_detections.append(DocumentDetections(document=document, detections=detections_per_file.detections)) + + return document_detections + + +def create_local_scan_result( + scan_result: ZippedFileScanResult, + documents_to_scan: list[Document], + command_scan_type: str, + scan_type: str, + severity_threshold: str, +) -> LocalScanResult: + document_detections = _get_document_detections(scan_result, documents_to_scan) + relevant_document_detections_list = exclude_irrelevant_document_detections( + document_detections, scan_type, command_scan_type, severity_threshold + ) + + detections_count = sum([len(document_detection.detections) for document_detection in document_detections]) + relevant_detections_count = sum( + [len(document_detections.detections) for document_detections in relevant_document_detections_list] + ) + + return LocalScanResult( + scan_id=scan_result.scan_id, + report_url=scan_result.report_url, + document_detections=relevant_document_detections_list, + issue_detected=len(relevant_document_detections_list) > 0, + detections_count=detections_count, + relevant_detections_count=relevant_detections_count, + ) + + +def _get_file_name_from_detection(scan_type: str, raw_detection: dict) -> str: + if scan_type == consts.SAST_SCAN_TYPE: + return raw_detection['detection_details']['file_path'] + if scan_type == consts.SECRET_SCAN_TYPE: + return _get_secret_file_name_from_detection(raw_detection) + + return raw_detection['detection_details']['file_name'] + + +def _get_secret_file_name_from_detection(raw_detection: dict) -> str: + file_path: str = raw_detection['detection_details']['file_path'] + file_name: str = raw_detection['detection_details']['file_name'] + return os.path.join(file_path, file_name) + + +def _map_detections_per_file_and_commit_id(scan_type: str, raw_detections: list[dict]) -> list[DetectionsPerFile]: + """Convert a list of detections (async flow) to list of DetectionsPerFile objects (sync flow). + + Args: + scan_type: Type of the scan. + raw_detections: List of detections as is returned from the server. + + Note: + This method fakes server response structure + to be able to use the same logic for both async and sync scans. + + Note: + Aggregation is performed by file name and commit ID (if available) + + """ + detections_per_files = {} + for raw_detection in raw_detections: + try: + # FIXME(MarshalX): investigate this field mapping + raw_detection['message'] = raw_detection['correlation_message'] + + file_name = _get_file_name_from_detection(scan_type, raw_detection) + detection: Detection = DetectionSchema().load(raw_detection) + commit_id: Optional[str] = detection.detection_details.get('commit_id') # could be None + group_by_key = (file_name, commit_id) + + if group_by_key in detections_per_files: + detections_per_files[group_by_key].append(detection) + else: + detections_per_files[group_by_key] = [detection] + except Exception as e: + logger.debug('Failed to parse detection', exc_info=e) + continue + + return [ + DetectionsPerFile(file_name=file_name, detections=file_detections, commit_id=commit_id) + for (file_name, commit_id), file_detections in detections_per_files.items() + ] + + +def init_default_scan_result(scan_id: str) -> ZippedFileScanResult: + return ZippedFileScanResult( + did_detect=False, + detections_per_file=[], + scan_id=scan_id, + ) + + +def get_scan_result( + cycode_client: 'ScanClient', + scan_type: str, + scan_id: str, + scan_details: 'ScanDetailsResponse', + scan_parameters: dict, +) -> ZippedFileScanResult: + if not scan_details.detections_count: + return init_default_scan_result(scan_id) + + scan_raw_detections = cycode_client.get_scan_raw_detections(scan_id) + + return ZippedFileScanResult( + did_detect=True, + detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_raw_detections), + scan_id=scan_id, + report_url=try_get_aggregation_report_url_if_needed(scan_parameters, cycode_client, scan_type), + ) + + +def get_sync_scan_result(scan_type: str, scan_results: 'ScanResultsSyncFlow') -> ZippedFileScanResult: + return ZippedFileScanResult( + did_detect=True, + detections_per_file=_map_detections_per_file_and_commit_id(scan_type, scan_results.detection_messages), + scan_id=scan_results.id, + ) + + +def print_local_scan_results( + ctx: typer.Context, local_scan_results: list[LocalScanResult], errors: Optional[dict[str, 'CliError']] = None +) -> None: + printer = ctx.obj.get('console_printer') + printer.update_ctx(ctx) + printer.print_scan_results(local_scan_results, errors) diff --git a/cycode/cli/consts.py b/cycode/cli/consts.py index c0ed33f0..74a9758c 100644 --- a/cycode/cli/consts.py +++ b/cycode/cli/consts.py @@ -140,9 +140,11 @@ 'conan': ['conanfile.py', 'conanfile.txt', 'conan.lock'], } -COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES = [SECRET_SCAN_TYPE, SCA_SCAN_TYPE] +COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES = [SECRET_SCAN_TYPE, SCA_SCAN_TYPE, SAST_SCAN_TYPE] COMMIT_RANGE_BASED_COMMAND_SCAN_TYPES = [ + PRE_COMMIT_COMMAND_SCAN_TYPE, + PRE_COMMIT_COMMAND_SCAN_TYPE_OLD, PRE_RECEIVE_COMMAND_SCAN_TYPE, PRE_RECEIVE_COMMAND_SCAN_TYPE_OLD, COMMIT_HISTORY_COMMAND_SCAN_TYPE, diff --git a/cycode/cli/files_collector/commit_range_documents.py b/cycode/cli/files_collector/commit_range_documents.py new file mode 100644 index 00000000..5b2cf906 --- /dev/null +++ b/cycode/cli/files_collector/commit_range_documents.py @@ -0,0 +1,69 @@ +from typing import Optional + +import typer + +from cycode.cli.files_collector.repository_documents import get_diff_file_content, get_diff_file_path +from cycode.cli.models import Document +from cycode.cli.utils.git_proxy import git_proxy +from cycode.cli.utils.path_utils import get_path_by_os +from cycode.cli.utils.progress_bar import ScanProgressBarSection +from cycode.logger import get_logger + +logger = get_logger('Commit Range Collector') + + +def _does_reach_to_max_commits_to_scan_limit(commit_ids: list[str], max_commits_count: Optional[int]) -> bool: + if max_commits_count is None: + return False + + return len(commit_ids) >= max_commits_count + + +def collect_commit_range_diff_documents( + ctx: typer.Context, path: str, commit_range: str, max_commits_count: Optional[int] = None +) -> list[Document]: + """Collects documents from a specified commit range in a Git repository. + + Return a list of Document objects containing the diffs of files changed in each commit. + """ + progress_bar = ctx.obj['progress_bar'] + + commit_ids_to_scan = [] + commit_documents_to_scan = [] + + repo = git_proxy.get_repo(path) + total_commits_count = int(repo.git.rev_list('--count', commit_range)) + logger.debug('Calculating diffs for %s commits in the commit range %s', total_commits_count, commit_range) + + progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, total_commits_count) + + for scanned_commits_count, commit in enumerate(repo.iter_commits(rev=commit_range)): + if _does_reach_to_max_commits_to_scan_limit(commit_ids_to_scan, max_commits_count): + logger.debug('Reached to max commits to scan count. Going to scan only %s last commits', max_commits_count) + progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES, total_commits_count - scanned_commits_count) + break + + progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES) + + commit_id = commit.hexsha + commit_ids_to_scan.append(commit_id) + parent = commit.parents[0] if commit.parents else git_proxy.get_null_tree() + diff_index = commit.diff(parent, create_patch=True, R=True) + for diff in diff_index: + commit_documents_to_scan.append( + Document( + path=get_path_by_os(get_diff_file_path(diff)), + content=get_diff_file_content(diff), + is_git_diff_format=True, + unique_id=commit_id, + ) + ) + + logger.debug( + 'Found all relevant files in commit %s', + {'path': path, 'commit_range': commit_range, 'commit_id': commit_id}, + ) + + logger.debug('List of commit ids to scan, %s', {'commit_ids': commit_ids_to_scan}) + + return commit_documents_to_scan diff --git a/cycode/cli/files_collector/excluder.py b/cycode/cli/files_collector/file_excluder.py similarity index 100% rename from cycode/cli/files_collector/excluder.py rename to cycode/cli/files_collector/file_excluder.py diff --git a/cycode/cli/files_collector/path_documents.py b/cycode/cli/files_collector/path_documents.py index 556a8cf8..73cd0768 100644 --- a/cycode/cli/files_collector/path_documents.py +++ b/cycode/cli/files_collector/path_documents.py @@ -1,7 +1,7 @@ import os from typing import TYPE_CHECKING -from cycode.cli.files_collector.excluder import excluder +from cycode.cli.files_collector.file_excluder import excluder from cycode.cli.files_collector.iac.tf_content_generator import ( generate_tf_content_from_tfplan, generate_tfplan_document_name, diff --git a/cycode/cli/files_collector/repository_documents.py b/cycode/cli/files_collector/repository_documents.py index 379346f8..3096d708 100644 --- a/cycode/cli/files_collector/repository_documents.py +++ b/cycode/cli/files_collector/repository_documents.py @@ -1,4 +1,5 @@ import os +import sys from collections.abc import Iterator from typing import TYPE_CHECKING, Optional, Union @@ -38,6 +39,30 @@ def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: return from_commit_rev, to_commit_rev +def parse_pre_receive_input() -> str: + """Parse input to pushed branch update details. + + Example input: + old_value new_value refname + ----------------------------------------------- + 0000000000000000000000000000000000000000 9cf90954ef26e7c58284f8ebf7dcd0fcf711152a refs/heads/main + 973a96d3e925b65941f7c47fa16129f1577d499f 0000000000000000000000000000000000000000 refs/heads/feature-branch + 59564ef68745bca38c42fc57a7822efd519a6bd9 3378e52dcfa47fb11ce3a4a520bea5f85d5d0bf3 refs/heads/develop + + :return: First branch update details (input's first line) + """ + # FIXME(MarshalX): this blocks main thread forever if called outside of pre-receive hook + pre_receive_input = sys.stdin.read().strip() + if not pre_receive_input: + raise ValueError( + 'Pre receive input was not found. Make sure that you are using this command only in pre-receive hook' + ) + + # each line represents a branch update request, handle the first one only + # TODO(MichalBor): support case of multiple update branch requests + return pre_receive_input.splitlines()[0] + + def get_diff_file_path(file: 'Diff', relative: bool = False) -> Optional[str]: if relative: # relative to the repository root @@ -84,31 +109,40 @@ def get_commit_range_modified_documents( path: str, from_commit_rev: str, to_commit_rev: str, -) -> tuple[list[Document], list[Document]]: +) -> tuple[list[Document], list[Document], list[Document]]: from_commit_documents = [] to_commit_documents = [] + diff_documents = [] repo = git_proxy.get_repo(path) - diff = repo.commit(from_commit_rev).diff(to_commit_rev) + diff_index = repo.commit(from_commit_rev).diff(to_commit_rev, create_patch=True, R=True) modified_files_diff = [ - change for change in diff if change.change_type != consts.COMMIT_DIFF_DELETED_FILE_CHANGE_TYPE + diff for diff in diff_index if diff.change_type != consts.COMMIT_DIFF_DELETED_FILE_CHANGE_TYPE ] progress_bar.set_section_length(progress_bar_section, len(modified_files_diff)) - for blob in modified_files_diff: + for diff in modified_files_diff: progress_bar.update(progress_bar_section) - file_path = get_path_by_os(get_diff_file_path(blob)) + file_path = get_path_by_os(get_diff_file_path(diff)) + + diff_documents.append( + Document( + path=file_path, + content=get_diff_file_content(diff), + is_git_diff_format=True, + ) + ) - file_content = get_file_content_from_commit_diff(repo, from_commit_rev, blob) + file_content = get_file_content_from_commit_diff(repo, from_commit_rev, diff) if file_content is not None: from_commit_documents.append(Document(file_path, file_content)) - file_content = get_file_content_from_commit_diff(repo, to_commit_rev, blob) + file_content = get_file_content_from_commit_diff(repo, to_commit_rev, diff) if file_content is not None: to_commit_documents.append(Document(file_path, file_content)) - return from_commit_documents, to_commit_documents + return from_commit_documents, to_commit_documents, diff_documents def calculate_pre_receive_commit_range(branch_update_details: str) -> Optional[str]: diff --git a/cycode/cli/files_collector/zip_documents.py b/cycode/cli/files_collector/zip_documents.py index 770121fa..6f5edd81 100644 --- a/cycode/cli/files_collector/zip_documents.py +++ b/cycode/cli/files_collector/zip_documents.py @@ -27,7 +27,7 @@ def zip_documents(scan_type: str, documents: list[Document], zip_file: Optional[ _validate_zip_file_size(scan_type, zip_file.size) logger.debug( - 'Adding file, %s', + 'Adding file to ZIP, %s', {'index': index, 'filename': document.path, 'unique_id': document.unique_id}, ) zip_file.append(document.path, document.unique_id, document.content) @@ -37,13 +37,13 @@ def zip_documents(scan_type: str, documents: list[Document], zip_file: Optional[ end_zip_creation_time = timeit.default_timer() zip_creation_time = int(end_zip_creation_time - start_zip_creation_time) logger.debug( - 'Finished to create file, %s', + 'Finished to create ZIP file, %s', {'zip_creation_time': zip_creation_time, 'zip_size': zip_file.size, 'documents_count': len(documents)}, ) if zip_file.configuration_manager.get_debug_flag(): zip_file_path = Path.joinpath(Path.cwd(), f'{scan_type}_scan_{end_zip_creation_time}.zip') - logger.debug('Writing file to disk, %s', {'zip_file_path': zip_file_path}) + logger.debug('Writing ZIP file to disk, %s', {'zip_file_path': zip_file_path}) zip_file.write_on_disk(zip_file_path) return zip_file diff --git a/cycode/cli/printers/tables/sca_table_printer.py b/cycode/cli/printers/tables/sca_table_printer.py index 1bf358c8..c0bedcc7 100644 --- a/cycode/cli/printers/tables/sca_table_printer.py +++ b/cycode/cli/printers/tables/sca_table_printer.py @@ -63,7 +63,7 @@ def _get_table(self, policy_id: str) -> Table: elif policy_id == LICENSE_COMPLIANCE_POLICY_ID: table.add_column(LICENSE_COLUMN) - if is_git_diff_based_scan(self.scan_type, self.command_scan_type): + if is_git_diff_based_scan(self.command_scan_type): table.add_column(REPOSITORY_COLUMN) table.add_column(SEVERITY_COLUMN) diff --git a/cycode/cli/printers/tables/table_printer.py b/cycode/cli/printers/tables/table_printer.py index 6fc85a1b..6a5dd198 100644 --- a/cycode/cli/printers/tables/table_printer.py +++ b/cycode/cli/printers/tables/table_printer.py @@ -48,7 +48,7 @@ def _get_table(self) -> Table: table.add_column(LINE_NUMBER_COLUMN) table.add_column(COLUMN_NUMBER_COLUMN) - if is_git_diff_based_scan(self.scan_type, self.command_scan_type): + if is_git_diff_based_scan(self.command_scan_type): table.add_column(COMMIT_SHA_COLUMN) if self.scan_type == SECRET_SCAN_TYPE: diff --git a/cycode/cli/printers/utils/__init__.py b/cycode/cli/printers/utils/__init__.py index e1676c35..d1ee86c0 100644 --- a/cycode/cli/printers/utils/__init__.py +++ b/cycode/cli/printers/utils/__init__.py @@ -1,8 +1,5 @@ from cycode.cli import consts -def is_git_diff_based_scan(scan_type: str, command_scan_type: str) -> bool: - return ( - command_scan_type in consts.COMMIT_RANGE_BASED_COMMAND_SCAN_TYPES - and scan_type in consts.COMMIT_RANGE_SCAN_SUPPORTED_SCAN_TYPES - ) +def is_git_diff_based_scan(command_scan_type: str) -> bool: + return command_scan_type in consts.COMMIT_RANGE_BASED_COMMAND_SCAN_TYPES diff --git a/cycode/cli/printers/utils/code_snippet_syntax.py b/cycode/cli/printers/utils/code_snippet_syntax.py index 12501544..d9ea3af2 100644 --- a/cycode/cli/printers/utils/code_snippet_syntax.py +++ b/cycode/cli/printers/utils/code_snippet_syntax.py @@ -108,7 +108,7 @@ def get_code_snippet_syntax( lines_to_display_after: int = 1, obfuscate: bool = True, ) -> Syntax: - if is_git_diff_based_scan(scan_type, command_scan_type): + if is_git_diff_based_scan(command_scan_type): # it will return syntax with just one line return _get_code_snippet_syntax_from_git_diff(scan_type, detection, document, obfuscate) diff --git a/cycode/cli/utils/path_utils.py b/cycode/cli/utils/path_utils.py index 7d525e56..ce60b0da 100644 --- a/cycode/cli/utils/path_utils.py +++ b/cycode/cli/utils/path_utils.py @@ -111,3 +111,11 @@ def get_path_from_context(ctx: typer.Context) -> Optional[str]: if path is None and 'paths' in ctx.params: path = ctx.params['paths'][0] return path + + +def normalize_file_path(path: str) -> str: + if path.startswith('/'): + return path[1:] + if path.startswith('./'): + return path[2:] + return path diff --git a/cycode/cli/utils/scan_utils.py b/cycode/cli/utils/scan_utils.py index 8c9dcca7..57586b51 100644 --- a/cycode/cli/utils/scan_utils.py +++ b/cycode/cli/utils/scan_utils.py @@ -1,11 +1,29 @@ +import os +from typing import TYPE_CHECKING +from uuid import UUID, uuid4 + import typer +if TYPE_CHECKING: + from cycode.cli.models import LocalScanResult + def set_issue_detected(ctx: typer.Context, issue_detected: bool) -> None: ctx.obj['issue_detected'] = issue_detected +def set_issue_detected_by_scan_results(ctx: typer.Context, scan_results: list['LocalScanResult']) -> None: + set_issue_detected(ctx, any(scan_result.issue_detected for scan_result in scan_results)) + + def is_scan_failed(ctx: typer.Context) -> bool: did_fail = ctx.obj.get('did_fail') issue_detected = ctx.obj.get('issue_detected') return did_fail or issue_detected + + +def generate_unique_scan_id() -> UUID: + if 'PYTEST_TEST_UNIQUE_ID' in os.environ: + return UUID(os.environ['PYTEST_TEST_UNIQUE_ID']) + + return uuid4() diff --git a/cycode/cyclient/scan_client.py b/cycode/cyclient/scan_client.py index b1c697c6..6ddce8d5 100644 --- a/cycode/cyclient/scan_client.py +++ b/cycode/cyclient/scan_client.py @@ -92,6 +92,15 @@ def zipped_file_scan_sync( ) return models.ScanResultsSyncFlowSchema().load(response.json()) + @staticmethod + def _create_compression_manifest_string(zip_file: InMemoryZip) -> str: + return json.dumps( + { + 'file_count_by_extension': zip_file.extension_statistics, + 'file_count': zip_file.files_count, + } + ) + def zipped_file_scan_async( self, zip_file: InMemoryZip, @@ -102,24 +111,19 @@ def zipped_file_scan_async( ) -> models.ScanInitializationResponse: files = {'file': ('multiple_files_scan.zip', zip_file.read())} - compression_manifest = { - 'file_count_by_extension': zip_file.extension_statistics, - 'file_count': zip_file.files_count, - } - response = self.scan_cycode_client.post( url_path=self.get_zipped_file_scan_async_url_path(scan_type), data={ 'is_git_diff': is_git_diff, 'scan_parameters': json.dumps(scan_parameters), 'is_commit_range': is_commit_range, - 'compression_manifest': json.dumps(compression_manifest), + 'compression_manifest': self._create_compression_manifest_string(zip_file), }, files=files, ) return models.ScanInitializationResponseSchema().load(response.json()) - def multiple_zipped_file_scan_async( + def commit_range_scan_async( self, from_commit_zip_file: InMemoryZip, to_commit_zip_file: InMemoryZip, @@ -127,6 +131,20 @@ def multiple_zipped_file_scan_async( scan_parameters: dict, is_git_diff: bool = False, ) -> models.ScanInitializationResponse: + """Commit range scan. + Used by SCA and SAST scans. + + For SCA: + - from_commit_zip_file is file content + - to_commit_zip_file is file content + + For SAST: + - from_commit_zip_file is file content + - to_commit_zip_file is diff content + + Note: + Compression manifest is supported only for SAST scans. + """ url_path = f'{self.get_scan_service_url_path(scan_type)}/{scan_type}/repository/commit-range' files = { 'file_from_commit': ('multiple_files_scan.zip', from_commit_zip_file.read()), @@ -134,7 +152,11 @@ def multiple_zipped_file_scan_async( } response = self.scan_cycode_client.post( url_path=url_path, - data={'is_git_diff': is_git_diff, 'scan_parameters': json.dumps(scan_parameters)}, + data={ + 'is_git_diff': is_git_diff, + 'scan_parameters': json.dumps(scan_parameters), + 'compression_manifest': self._create_compression_manifest_string(from_commit_zip_file), + }, files=files, ) return models.ScanInitializationResponseSchema().load(response.json()) diff --git a/tests/cli/commands/scan/test_code_scanner.py b/tests/cli/commands/scan/test_code_scanner.py index 3151684e..bf4d3574 100644 --- a/tests/cli/commands/scan/test_code_scanner.py +++ b/tests/cli/commands/scan/test_code_scanner.py @@ -1,8 +1,7 @@ import os from cycode.cli import consts -from cycode.cli.apps.scan.code_scanner import _does_severity_match_severity_threshold -from cycode.cli.files_collector.excluder import _is_file_relevant_for_sca_scan +from cycode.cli.files_collector.file_excluder import _is_file_relevant_for_sca_scan from cycode.cli.files_collector.path_documents import _generate_document from cycode.cli.models import Document @@ -73,24 +72,3 @@ def test_generate_document() -> None: assert isinstance(generated_tfplan_document, Document) assert generated_tfplan_document.path.endswith('.tf') assert generated_tfplan_document.is_git_diff_format == is_git_diff - - -def test_does_severity_match_severity_threshold() -> None: - assert _does_severity_match_severity_threshold('INFO', 'LOW') is False - - assert _does_severity_match_severity_threshold('LOW', 'LOW') is True - assert _does_severity_match_severity_threshold('LOW', 'MEDIUM') is False - - assert _does_severity_match_severity_threshold('MEDIUM', 'LOW') is True - assert _does_severity_match_severity_threshold('MEDIUM', 'MEDIUM') is True - assert _does_severity_match_severity_threshold('MEDIUM', 'HIGH') is False - - assert _does_severity_match_severity_threshold('HIGH', 'MEDIUM') is True - assert _does_severity_match_severity_threshold('HIGH', 'HIGH') is True - assert _does_severity_match_severity_threshold('HIGH', 'CRITICAL') is False - - assert _does_severity_match_severity_threshold('CRITICAL', 'HIGH') is True - assert _does_severity_match_severity_threshold('CRITICAL', 'CRITICAL') is True - - assert _does_severity_match_severity_threshold('NON_EXISTENT', 'LOW') is True - assert _does_severity_match_severity_threshold('LOW', 'NON_EXISTENT') is True diff --git a/tests/cli/commands/scan/test_detection_excluder.py b/tests/cli/commands/scan/test_detection_excluder.py new file mode 100644 index 00000000..d35787ab --- /dev/null +++ b/tests/cli/commands/scan/test_detection_excluder.py @@ -0,0 +1,22 @@ +from cycode.cli.apps.scan.detection_excluder import _does_severity_match_severity_threshold + + +def test_does_severity_match_severity_threshold() -> None: + assert _does_severity_match_severity_threshold('INFO', 'LOW') is False + + assert _does_severity_match_severity_threshold('LOW', 'LOW') is True + assert _does_severity_match_severity_threshold('LOW', 'MEDIUM') is False + + assert _does_severity_match_severity_threshold('MEDIUM', 'LOW') is True + assert _does_severity_match_severity_threshold('MEDIUM', 'MEDIUM') is True + assert _does_severity_match_severity_threshold('MEDIUM', 'HIGH') is False + + assert _does_severity_match_severity_threshold('HIGH', 'MEDIUM') is True + assert _does_severity_match_severity_threshold('HIGH', 'HIGH') is True + assert _does_severity_match_severity_threshold('HIGH', 'CRITICAL') is False + + assert _does_severity_match_severity_threshold('CRITICAL', 'HIGH') is True + assert _does_severity_match_severity_threshold('CRITICAL', 'CRITICAL') is True + + assert _does_severity_match_severity_threshold('NON_EXISTENT', 'LOW') is True + assert _does_severity_match_severity_threshold('LOW', 'NON_EXISTENT') is True diff --git a/tests/test_code_scanner.py b/tests/test_aggregation_report.py similarity index 81% rename from tests/test_code_scanner.py rename to tests/test_aggregation_report.py index 01234d1d..b09c4d69 100644 --- a/tests/test_code_scanner.py +++ b/tests/test_aggregation_report.py @@ -5,11 +5,9 @@ import responses from cycode.cli import consts -from cycode.cli.apps.scan.code_scanner import ( - _try_get_aggregation_report_url_if_needed, -) +from cycode.cli.apps.scan.aggregation_report import try_get_aggregation_report_url_if_needed from cycode.cli.cli_types import ScanTypeOption -from cycode.cli.files_collector.excluder import excluder +from cycode.cli.files_collector.file_excluder import excluder from cycode.cyclient.scan_client import ScanClient from tests.conftest import TEST_FILES_PATH from tests.cyclient.mocked_responses.scan_client import ( @@ -29,7 +27,7 @@ def test_try_get_aggregation_report_url_if_no_report_command_needed_return_none( ) -> None: aggregation_id = uuid4().hex scan_parameter = {'aggregation_id': aggregation_id} - result = _try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) + result = try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) assert result is None @@ -38,7 +36,7 @@ def test_try_get_aggregation_report_url_if_no_aggregation_id_needed_return_none( scan_type: ScanTypeOption, scan_client: ScanClient ) -> None: scan_parameter = {'report': True} - result = _try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) + result = try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) assert result is None @@ -55,5 +53,5 @@ def test_try_get_aggregation_report_url_if_needed_return_result( scan_aggregation_report_url_response = scan_client.get_scan_aggregation_report_url(str(aggregation_id), scan_type) - result = _try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) + result = try_get_aggregation_report_url_if_needed(scan_parameter, scan_client, scan_type) assert result == scan_aggregation_report_url_response.report_url From 3897d1d4ff02ae39e54752440af4e8b620385657 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Wed, 28 May 2025 23:53:03 +0200 Subject: [PATCH 2/8] rename SCA deps restore func to clarify --- .../cli/apps/report/sbom/path/path_command.py | 4 +- cycode/cli/apps/scan/code_scanner.py | 4 +- cycode/cli/apps/scan/commit_range_scanner.py | 15 ++- .../scan/repository/repository_command.py | 4 +- .../files_collector/repository_documents.py | 15 ++- ..._code_scanner.py => sca_file_collector.py} | 120 +++++++++--------- 6 files changed, 88 insertions(+), 74 deletions(-) rename cycode/cli/files_collector/sca/{sca_code_scanner.py => sca_file_collector.py} (71%) diff --git a/cycode/cli/apps/report/sbom/path/path_command.py b/cycode/cli/apps/report/sbom/path/path_command.py index 9741aa73..9c839b08 100644 --- a/cycode/cli/apps/report/sbom/path/path_command.py +++ b/cycode/cli/apps/report/sbom/path/path_command.py @@ -8,7 +8,7 @@ from cycode.cli.apps.report.sbom.common import create_sbom_report, send_report_feedback from cycode.cli.exceptions.handle_report_sbom_errors import handle_report_exception from cycode.cli.files_collector.path_documents import get_relevant_documents -from cycode.cli.files_collector.sca.sca_code_scanner import perform_pre_scan_documents_actions +from cycode.cli.files_collector.sca.sca_file_collector import add_sca_dependencies_tree_documents_if_needed from cycode.cli.files_collector.zip_documents import zip_documents from cycode.cli.utils.get_api_client import get_report_cycode_client from cycode.cli.utils.progress_bar import SbomReportProgressBarSection @@ -41,7 +41,7 @@ def path_command( ) # TODO(MarshalX): combine perform_pre_scan_documents_actions with get_relevant_document. # unhardcode usage of context in perform_pre_scan_documents_actions - perform_pre_scan_documents_actions(ctx, consts.SCA_SCAN_TYPE, documents) + add_sca_dependencies_tree_documents_if_needed(ctx, consts.SCA_SCAN_TYPE, documents) zipped_documents = zip_documents(consts.SCA_SCAN_TYPE, documents) report_execution = client.request_sbom_report_execution(report_parameters, zip_file=zipped_documents) diff --git a/cycode/cli/apps/scan/code_scanner.py b/cycode/cli/apps/scan/code_scanner.py index 45341f11..19b43733 100644 --- a/cycode/cli/apps/scan/code_scanner.py +++ b/cycode/cli/apps/scan/code_scanner.py @@ -17,7 +17,7 @@ from cycode.cli.exceptions import custom_exceptions from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception from cycode.cli.files_collector.path_documents import get_relevant_documents -from cycode.cli.files_collector.sca.sca_code_scanner import perform_pre_scan_documents_actions +from cycode.cli.files_collector.sca.sca_file_collector import add_sca_dependencies_tree_documents_if_needed from cycode.cli.files_collector.zip_documents import zip_documents from cycode.cli.models import CliError, Document, LocalScanResult from cycode.cli.utils.progress_bar import ScanProgressBarSection @@ -42,7 +42,7 @@ def scan_disk_files(ctx: typer.Context, paths: tuple[str, ...]) -> None: try: documents = get_relevant_documents(progress_bar, ScanProgressBarSection.PREPARE_LOCAL_FILES, scan_type, paths) - perform_pre_scan_documents_actions(ctx, scan_type, documents) + add_sca_dependencies_tree_documents_if_needed(ctx, scan_type, documents) scan_documents(ctx, documents, get_scan_parameters(ctx, paths)) except Exception as e: handle_scan_exception(ctx, e) diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py index fa1c81b8..091ea6f4 100644 --- a/cycode/cli/apps/scan/commit_range_scanner.py +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -28,7 +28,10 @@ get_pre_commit_modified_documents, parse_commit_range, ) -from cycode.cli.files_collector.sca import sca_code_scanner +from cycode.cli.files_collector.sca.sca_file_collector import ( + perform_pre_commit_range_scan_actions, + perform_pre_hook_range_scan_actions, +) from cycode.cli.files_collector.zip_documents import zip_documents from cycode.cli.models import Document from cycode.cli.utils.git_proxy import git_proxy @@ -169,13 +172,15 @@ def _scan_commit_range_documents( def _scan_sca_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: scan_parameters = get_scan_parameters(ctx, (path,)) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) from_commit_documents, to_commit_documents, _ = get_commit_range_modified_documents( ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev ) from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, from_commit_documents) to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, to_commit_documents) - sca_code_scanner.perform_pre_commit_range_scan_actions( + + perform_pre_commit_range_scan_actions( path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev ) @@ -197,6 +202,7 @@ def _scan_secret_commit_range( def _scan_sast_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: scan_parameters = get_scan_parameters(ctx, (path,)) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) _, commit_documents, diff_documents = get_commit_range_modified_documents( ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev @@ -226,6 +232,7 @@ def scan_commit_range(ctx: typer.Context, path: str, commit_range: str, **kwargs def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: scan_parameters = get_scan_parameters(ctx) + git_head_documents, pre_committed_documents = get_pre_commit_modified_documents( progress_bar=ctx.obj['progress_bar'], progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES, @@ -235,7 +242,9 @@ def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan( consts.SCA_SCAN_TYPE, pre_committed_documents ) - sca_code_scanner.perform_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) + + perform_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) + _scan_commit_range_documents( ctx, git_head_documents, diff --git a/cycode/cli/apps/scan/repository/repository_command.py b/cycode/cli/apps/scan/repository/repository_command.py index 0aefa2ba..6fc77bee 100644 --- a/cycode/cli/apps/scan/repository/repository_command.py +++ b/cycode/cli/apps/scan/repository/repository_command.py @@ -10,7 +10,7 @@ from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception from cycode.cli.files_collector.file_excluder import excluder from cycode.cli.files_collector.repository_documents import get_git_repository_tree_file_entries -from cycode.cli.files_collector.sca.sca_code_scanner import perform_pre_scan_documents_actions +from cycode.cli.files_collector.sca.sca_file_collector import add_sca_dependencies_tree_documents_if_needed from cycode.cli.logger import logger from cycode.cli.models import Document from cycode.cli.utils.path_utils import get_path_by_os @@ -60,7 +60,7 @@ def repository_command( documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(scan_type, documents_to_scan) - perform_pre_scan_documents_actions(ctx, scan_type, documents_to_scan) + add_sca_dependencies_tree_documents_if_needed(ctx, scan_type, documents_to_scan) logger.debug('Found all relevant files for scanning %s', {'path': path, 'branch': branch}) scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx, (str(path),))) diff --git a/cycode/cli/files_collector/repository_documents.py b/cycode/cli/files_collector/repository_documents.py index 3096d708..1817e564 100644 --- a/cycode/cli/files_collector/repository_documents.py +++ b/cycode/cli/files_collector/repository_documents.py @@ -4,13 +4,12 @@ from typing import TYPE_CHECKING, Optional, Union from cycode.cli import consts -from cycode.cli.files_collector.sca.sca_code_scanner import get_file_content_from_commit_diff from cycode.cli.models import Document from cycode.cli.utils.git_proxy import git_proxy from cycode.cli.utils.path_utils import get_file_content, get_path_by_os if TYPE_CHECKING: - from git import Blob, Diff + from git import Blob, Diff, Repo from git.objects.base import IndexObjUnion from git.objects.tree import TraversedTreeTup @@ -103,6 +102,18 @@ def get_pre_commit_modified_documents( return git_head_documents, pre_committed_documents +def get_file_content_from_commit_path(repo: 'Repo', commit: str, file_path: str) -> Optional[str]: + try: + return repo.git.show(f'{commit}:{file_path}') + except git_proxy.get_git_command_error(): + return None + + +def get_file_content_from_commit_diff(repo: 'Repo', commit: str, diff: 'Diff') -> Optional[str]: + file_path = get_diff_file_path(diff, relative=True) + return get_file_content_from_commit_path(repo, commit, file_path) + + def get_commit_range_modified_documents( progress_bar: 'BaseProgressBar', progress_bar_section: 'ProgressBarSection', diff --git a/cycode/cli/files_collector/sca/sca_code_scanner.py b/cycode/cli/files_collector/sca/sca_file_collector.py similarity index 71% rename from cycode/cli/files_collector/sca/sca_code_scanner.py rename to cycode/cli/files_collector/sca/sca_file_collector.py index febd8858..e066739e 100644 --- a/cycode/cli/files_collector/sca/sca_code_scanner.py +++ b/cycode/cli/files_collector/sca/sca_file_collector.py @@ -3,6 +3,7 @@ import typer from cycode.cli import consts +from cycode.cli.files_collector.repository_documents import get_file_content_from_commit_path from cycode.cli.files_collector.sca.base_restore_dependencies import BaseRestoreDependencies from cycode.cli.files_collector.sca.go.restore_go_dependencies import RestoreGoDependencies from cycode.cli.files_collector.sca.maven.restore_gradle_dependencies import RestoreGradleDependencies @@ -17,12 +18,27 @@ from cycode.logger import get_logger if TYPE_CHECKING: - from git import Diff, Repo + from git import Repo BUILD_DEP_TREE_TIMEOUT = 180 -logger = get_logger('SCA Code Scanner') +logger = get_logger('SCA File Collector') + + +def _add_ecosystem_related_files_if_exists( + documents: list[Document], repo: Optional['Repo'] = None, commit_rev: Optional[str] = None +) -> None: + documents_to_add: list[Document] = [] + for doc in documents: + ecosystem = _get_project_file_ecosystem(doc) + if ecosystem is None: + logger.debug('Failed to resolve project file ecosystem: %s', doc.path) + continue + + documents_to_add.extend(_get_doc_ecosystem_related_project_files(doc, documents, ecosystem, commit_rev, repo)) + + documents.extend(documents_to_add) def perform_pre_commit_range_scan_actions( @@ -33,40 +49,25 @@ def perform_pre_commit_range_scan_actions( to_commit_rev: str, ) -> None: repo = git_proxy.get_repo(path) - add_ecosystem_related_files_if_exists(from_commit_documents, repo, from_commit_rev) - add_ecosystem_related_files_if_exists(to_commit_documents, repo, to_commit_rev) + _add_ecosystem_related_files_if_exists(from_commit_documents, repo, from_commit_rev) + _add_ecosystem_related_files_if_exists(to_commit_documents, repo, to_commit_rev) def perform_pre_hook_range_scan_actions( repo_path: str, git_head_documents: list[Document], pre_committed_documents: list[Document] ) -> None: repo = git_proxy.get_repo(repo_path) - add_ecosystem_related_files_if_exists(git_head_documents, repo, consts.GIT_HEAD_COMMIT_REV) - add_ecosystem_related_files_if_exists(pre_committed_documents) - - -def add_ecosystem_related_files_if_exists( - documents: list[Document], repo: Optional['Repo'] = None, commit_rev: Optional[str] = None -) -> None: - documents_to_add: list[Document] = [] - for doc in documents: - ecosystem = get_project_file_ecosystem(doc) - if ecosystem is None: - logger.debug('Failed to resolve project file ecosystem: %s', doc.path) - continue + _add_ecosystem_related_files_if_exists(git_head_documents, repo, consts.GIT_HEAD_COMMIT_REV) + _add_ecosystem_related_files_if_exists(pre_committed_documents) - documents_to_add.extend(get_doc_ecosystem_related_project_files(doc, documents, ecosystem, commit_rev, repo)) - - documents.extend(documents_to_add) - -def get_doc_ecosystem_related_project_files( +def _get_doc_ecosystem_related_project_files( doc: Document, documents: list[Document], ecosystem: str, commit_rev: Optional[str], repo: Optional['Repo'] ) -> list[Document]: documents_to_add: list[Document] = [] for ecosystem_project_file in consts.PROJECT_FILES_BY_ECOSYSTEM_MAP.get(ecosystem): file_to_search = join_paths(get_file_dir(doc.path), ecosystem_project_file) - if not is_project_file_exists_in_documents(documents, file_to_search): + if not _is_project_file_exists_in_documents(documents, file_to_search): if repo: file_content = get_file_content_from_commit_path(repo, commit_rev, file_to_search) else: @@ -78,11 +79,11 @@ def get_doc_ecosystem_related_project_files( return documents_to_add -def is_project_file_exists_in_documents(documents: list[Document], file: str) -> bool: +def _is_project_file_exists_in_documents(documents: list[Document], file: str) -> bool: return any(doc for doc in documents if file == doc.path) -def get_project_file_ecosystem(document: Document) -> Optional[str]: +def _get_project_file_ecosystem(document: Document) -> Optional[str]: for ecosystem, project_files in consts.PROJECT_FILES_BY_ECOSYSTEM_MAP.items(): for project_file in project_files: if document.path.endswith(project_file): @@ -90,7 +91,11 @@ def get_project_file_ecosystem(document: Document) -> Optional[str]: return None -def try_restore_dependencies( +def _get_manifest_file_path(document: Document, is_monitor_action: bool, project_path: str) -> str: + return join_paths(project_path, document.path) if is_monitor_action else document.path + + +def _try_restore_dependencies( ctx: typer.Context, restore_dependencies: 'BaseRestoreDependencies', document: Document, @@ -110,34 +115,13 @@ def try_restore_dependencies( is_monitor_action = ctx.obj.get('monitor', False) project_path = get_path_from_context(ctx) - manifest_file_path = get_manifest_file_path(document, is_monitor_action, project_path) + manifest_file_path = _get_manifest_file_path(document, is_monitor_action, project_path) logger.debug('Succeeded to generate dependencies tree on path: %s', manifest_file_path) return restore_dependencies_document -def add_dependencies_tree_document( - ctx: typer.Context, documents_to_scan: list[Document], is_git_diff: bool = False -) -> None: - documents_to_add: dict[str, Document] = {document.path: document for document in documents_to_scan} - restore_dependencies_list = restore_handlers(ctx, is_git_diff) - - for restore_dependencies in restore_dependencies_list: - for document in documents_to_scan: - restore_dependencies_document = try_restore_dependencies(ctx, restore_dependencies, document) - if restore_dependencies_document is None: - continue - - if restore_dependencies_document.path in documents_to_add: - logger.debug('Duplicate document on restore for path: %s', restore_dependencies_document.path) - else: - documents_to_add[restore_dependencies_document.path] = restore_dependencies_document - - # mutate original list using slice assignment - documents_to_scan[:] = list(documents_to_add.values()) - - -def restore_handlers(ctx: typer.Context, is_git_diff: bool) -> list[BaseRestoreDependencies]: +def _get_restore_handlers(ctx: typer.Context, is_git_diff: bool) -> list[BaseRestoreDependencies]: return [ RestoreGradleDependencies(ctx, is_git_diff, BUILD_DEP_TREE_TIMEOUT), RestoreMavenDependencies(ctx, is_git_diff, BUILD_DEP_TREE_TIMEOUT), @@ -149,28 +133,38 @@ def restore_handlers(ctx: typer.Context, is_git_diff: bool) -> list[BaseRestoreD ] -def get_manifest_file_path(document: Document, is_monitor_action: bool, project_path: str) -> str: - return join_paths(project_path, document.path) if is_monitor_action else document.path +def _add_dependencies_tree_documents( + ctx: typer.Context, documents_to_scan: list[Document], is_git_diff: bool = False +) -> None: + logger.debug( + 'Adding dependencies tree documents, %s', + {'documents_count': len(documents_to_scan), 'is_git_diff': is_git_diff}, + ) + documents_to_add: dict[str, Document] = {document.path: document for document in documents_to_scan} + restore_dependencies_list = _get_restore_handlers(ctx, is_git_diff) -def get_file_content_from_commit_path(repo: 'Repo', commit: str, file_path: str) -> Optional[str]: - try: - return repo.git.show(f'{commit}:{file_path}') - except git_proxy.get_git_command_error(): - return None + for restore_dependencies in restore_dependencies_list: + for document in documents_to_scan: + restore_dependencies_document = _try_restore_dependencies(ctx, restore_dependencies, document) + if restore_dependencies_document is None: + continue + if restore_dependencies_document.path in documents_to_add: + logger.debug('Duplicate document on restore for path: %s', restore_dependencies_document.path) + else: + logger.debug('Adding dependencies tree document, %s', restore_dependencies_document.path) + documents_to_add[restore_dependencies_document.path] = restore_dependencies_document -def get_file_content_from_commit_diff(repo: 'Repo', commit: str, diff: 'Diff') -> Optional[str]: - from cycode.cli.files_collector.repository_documents import get_diff_file_path + logger.debug('Finished adding dependencies tree documents, %s', {'documents_count': len(documents_to_add)}) - file_path = get_diff_file_path(diff, relative=True) - return get_file_content_from_commit_path(repo, commit, file_path) + # mutate original list using slice assignment + documents_to_scan[:] = list(documents_to_add.values()) -def perform_pre_scan_documents_actions( +def add_sca_dependencies_tree_documents_if_needed( ctx: typer.Context, scan_type: str, documents_to_scan: list[Document], is_git_diff: bool = False ) -> None: no_restore = ctx.params.get('no-restore', False) if scan_type == consts.SCA_SCAN_TYPE and not no_restore: - logger.debug('Perform pre-scan document add_dependencies_tree_document action') - add_dependencies_tree_document(ctx, documents_to_scan, is_git_diff) + _add_dependencies_tree_documents(ctx, documents_to_scan, is_git_diff) From 62b4faeb79cb65c9e21a1567b69ae9a0e4ec1560 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Thu, 29 May 2025 10:16:48 +0200 Subject: [PATCH 3/8] fix file filtering for SAST commit range; fix pre-receive availability for SCA --- cycode/cli/apps/scan/commit_range_scanner.py | 30 +-- .../scan/pre_receive/pre_receive_command.py | 7 +- .../files_collector/commit_range_documents.py | 174 +++++++++++++++++- .../files_collector/repository_documents.py | 171 +---------------- .../files_collector/sca/sca_file_collector.py | 4 +- 5 files changed, 194 insertions(+), 192 deletions(-) diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py index 091ea6f4..f0bb714a 100644 --- a/cycode/cli/apps/scan/commit_range_scanner.py +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -18,19 +18,19 @@ ) from cycode.cli.config import configuration_manager from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception -from cycode.cli.files_collector.commit_range_documents import collect_commit_range_diff_documents -from cycode.cli.files_collector.file_excluder import excluder -from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip -from cycode.cli.files_collector.repository_documents import ( +from cycode.cli.files_collector.commit_range_documents import ( + collect_commit_range_diff_documents, get_commit_range_modified_documents, get_diff_file_content, get_diff_file_path, get_pre_commit_modified_documents, parse_commit_range, ) +from cycode.cli.files_collector.file_excluder import excluder +from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip from cycode.cli.files_collector.sca.sca_file_collector import ( - perform_pre_commit_range_scan_actions, - perform_pre_hook_range_scan_actions, + perform_sca_pre_commit_range_scan_actions, + perform_sca_pre_hook_range_scan_actions, ) from cycode.cli.files_collector.zip_documents import zip_documents from cycode.cli.models import Document @@ -180,7 +180,7 @@ def _scan_sca_commit_range(ctx: typer.Context, path: str, commit_range: str, **_ from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, from_commit_documents) to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, to_commit_documents) - perform_pre_commit_range_scan_actions( + perform_sca_pre_commit_range_scan_actions( path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev ) @@ -207,6 +207,8 @@ def _scan_sast_commit_range(ctx: typer.Context, path: str, commit_range: str, ** _, commit_documents, diff_documents = get_commit_range_modified_documents( ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev ) + commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, commit_documents) + diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents) _scan_commit_range_documents(ctx, commit_documents, diff_documents, scan_parameters=scan_parameters) @@ -243,7 +245,7 @@ def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: consts.SCA_SCAN_TYPE, pre_committed_documents ) - perform_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) + perform_sca_pre_hook_range_scan_actions(repo_path, git_head_documents, pre_committed_documents) _scan_commit_range_documents( ctx, @@ -256,16 +258,18 @@ def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: def _scan_secret_pre_commit(ctx: typer.Context, repo_path: str) -> None: progress_bar = ctx.obj['progress_bar'] - diff_files = git_proxy.get_repo(repo_path).index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) + diff_index = git_proxy.get_repo(repo_path).index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) - progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, len(diff_files)) + progress_bar.set_section_length(ScanProgressBarSection.PREPARE_LOCAL_FILES, len(diff_index)) documents_to_scan = [] - for file in diff_files: + for diff in diff_index: progress_bar.update(ScanProgressBarSection.PREPARE_LOCAL_FILES) - documents_to_scan.append(Document(get_path_by_os(get_diff_file_path(file)), get_diff_file_content(file))) - + documents_to_scan.append( + Document(get_path_by_os(get_diff_file_path(diff)), get_diff_file_content(diff), is_git_diff_format=True) + ) documents_to_scan = excluder.exclude_irrelevant_documents_to_scan(consts.SECRET_SCAN_TYPE, documents_to_scan) + scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx), is_git_diff=True) diff --git a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py index 12ba744d..5eaf133c 100644 --- a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +++ b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py @@ -2,7 +2,6 @@ import os from typing import Annotated, Optional -import click import typer from cycode.cli import consts @@ -14,7 +13,7 @@ from cycode.cli.config import configuration_manager from cycode.cli.console import console from cycode.cli.exceptions.handle_scan_errors import handle_scan_exception -from cycode.cli.files_collector.repository_documents import ( +from cycode.cli.files_collector.commit_range_documents import ( calculate_pre_receive_commit_range, parse_pre_receive_input, ) @@ -32,10 +31,6 @@ def pre_receive_command( try: add_breadcrumb('pre_receive') - scan_type = ctx.obj['scan_type'] - if scan_type != consts.SECRET_SCAN_TYPE: - raise click.ClickException(f'Commit range scanning for {scan_type.upper()} is not supported') - if should_skip_pre_receive_scan(): logger.info( 'A scan has been skipped as per your request. ' diff --git a/cycode/cli/files_collector/commit_range_documents.py b/cycode/cli/files_collector/commit_range_documents.py index 5b2cf906..942c4314 100644 --- a/cycode/cli/files_collector/commit_range_documents.py +++ b/cycode/cli/files_collector/commit_range_documents.py @@ -1,14 +1,24 @@ -from typing import Optional +import os +import sys +from typing import TYPE_CHECKING, Optional import typer -from cycode.cli.files_collector.repository_documents import get_diff_file_content, get_diff_file_path +from cycode.cli import consts +from cycode.cli.files_collector.repository_documents import ( + get_file_content_from_commit_path, +) from cycode.cli.models import Document from cycode.cli.utils.git_proxy import git_proxy -from cycode.cli.utils.path_utils import get_path_by_os +from cycode.cli.utils.path_utils import get_file_content, get_path_by_os from cycode.cli.utils.progress_bar import ScanProgressBarSection from cycode.logger import get_logger +if TYPE_CHECKING: + from git import Diff, Repo + + from cycode.cli.utils.progress_bar import BaseProgressBar, ProgressBarSection + logger = get_logger('Commit Range Collector') @@ -67,3 +77,161 @@ def collect_commit_range_diff_documents( logger.debug('List of commit ids to scan, %s', {'commit_ids': commit_ids_to_scan}) return commit_documents_to_scan + + +def calculate_pre_receive_commit_range(branch_update_details: str) -> Optional[str]: + end_commit = _get_end_commit_from_branch_update_details(branch_update_details) + + # branch is deleted, no need to perform scan + if end_commit == consts.EMPTY_COMMIT_SHA: + return None + + start_commit = _get_oldest_unupdated_commit_for_branch(end_commit) + + # no new commit to update found + if not start_commit: + return None + + return f'{start_commit}~1...{end_commit}' + + +def _get_end_commit_from_branch_update_details(update_details: str) -> str: + # update details pattern: + _, end_commit, _ = update_details.split() + return end_commit + + +def _get_oldest_unupdated_commit_for_branch(commit: str) -> Optional[str]: + # get a list of commits by chronological order that are not in the remote repository yet + # more info about rev-list command: https://git-scm.com/docs/git-rev-list + repo = git_proxy.get_repo(os.getcwd()) + not_updated_commits = repo.git.rev_list(commit, '--topo-order', '--reverse', '--not', '--all') + + commits = not_updated_commits.splitlines() + if not commits: + return None + + return commits[0] + + +def _get_file_content_from_commit_diff(repo: 'Repo', commit: str, diff: 'Diff') -> Optional[str]: + file_path = get_diff_file_path(diff, relative=True) + return get_file_content_from_commit_path(repo, commit, file_path) + + +def get_commit_range_modified_documents( + progress_bar: 'BaseProgressBar', + progress_bar_section: 'ProgressBarSection', + path: str, + from_commit_rev: str, + to_commit_rev: str, +) -> tuple[list[Document], list[Document], list[Document]]: + from_commit_documents = [] + to_commit_documents = [] + diff_documents = [] + + repo = git_proxy.get_repo(path) + diff_index = repo.commit(from_commit_rev).diff(to_commit_rev, create_patch=True, R=True) + + modified_files_diff = [ + diff for diff in diff_index if diff.change_type != consts.COMMIT_DIFF_DELETED_FILE_CHANGE_TYPE + ] + progress_bar.set_section_length(progress_bar_section, len(modified_files_diff)) + for diff in modified_files_diff: + progress_bar.update(progress_bar_section) + + file_path = get_path_by_os(get_diff_file_path(diff)) + + diff_documents.append( + Document( + path=file_path, + content=get_diff_file_content(diff), + is_git_diff_format=True, + ) + ) + + file_content = _get_file_content_from_commit_diff(repo, from_commit_rev, diff) + if file_content is not None: + from_commit_documents.append(Document(file_path, file_content)) + + file_content = _get_file_content_from_commit_diff(repo, to_commit_rev, diff) + if file_content is not None: + to_commit_documents.append(Document(file_path, file_content)) + + return from_commit_documents, to_commit_documents, diff_documents + + +def parse_pre_receive_input() -> str: + """Parse input to pushed branch update details. + + Example input: + old_value new_value refname + ----------------------------------------------- + 0000000000000000000000000000000000000000 9cf90954ef26e7c58284f8ebf7dcd0fcf711152a refs/heads/main + 973a96d3e925b65941f7c47fa16129f1577d499f 0000000000000000000000000000000000000000 refs/heads/feature-branch + 59564ef68745bca38c42fc57a7822efd519a6bd9 3378e52dcfa47fb11ce3a4a520bea5f85d5d0bf3 refs/heads/develop + + :return: First branch update details (input's first line) + """ + # FIXME(MarshalX): this blocks main thread forever if called outside of pre-receive hook + pre_receive_input = sys.stdin.read().strip() + if not pre_receive_input: + raise ValueError( + 'Pre receive input was not found. Make sure that you are using this command only in pre-receive hook' + ) + + # each line represents a branch update request, handle the first one only + # TODO(MichalBor): support case of multiple update branch requests + return pre_receive_input.splitlines()[0] + + +def get_diff_file_path(diff: 'Diff', relative: bool = False) -> Optional[str]: + if relative: + # relative to the repository root + return diff.b_path if diff.b_path else diff.a_path + + if diff.b_blob: + return diff.b_blob.abspath + return diff.a_blob.abspath + + +def get_diff_file_content(diff: 'Diff') -> str: + return diff.diff.decode('UTF-8', errors='replace') + + +def get_pre_commit_modified_documents( + progress_bar: 'BaseProgressBar', + progress_bar_section: 'ProgressBarSection', + repo_path: str, +) -> tuple[list[Document], list[Document]]: + git_head_documents = [] + pre_committed_documents = [] + + repo = git_proxy.get_repo(repo_path) + diff_index = repo.index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) + progress_bar.set_section_length(progress_bar_section, len(diff_index)) + for diff in diff_index: + progress_bar.update(progress_bar_section) + + file_path = get_path_by_os(get_diff_file_path(diff)) + file_content = _get_file_content_from_commit_diff(repo, consts.GIT_HEAD_COMMIT_REV, diff) + if file_content is not None: + git_head_documents.append(Document(file_path, file_content)) + + if os.path.exists(file_path): + file_content = get_file_content(file_path) + pre_committed_documents.append(Document(file_path, file_content)) + + return git_head_documents, pre_committed_documents + + +def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: + from_commit_rev = None + to_commit_rev = None + + for commit in git_proxy.get_repo(path).iter_commits(rev=commit_range): + if not to_commit_rev: + to_commit_rev = commit.hexsha + from_commit_rev = commit.hexsha + + return from_commit_rev, to_commit_rev diff --git a/cycode/cli/files_collector/repository_documents.py b/cycode/cli/files_collector/repository_documents.py index 1817e564..935d3db1 100644 --- a/cycode/cli/files_collector/repository_documents.py +++ b/cycode/cli/files_collector/repository_documents.py @@ -1,105 +1,22 @@ -import os -import sys from collections.abc import Iterator from typing import TYPE_CHECKING, Optional, Union -from cycode.cli import consts -from cycode.cli.models import Document from cycode.cli.utils.git_proxy import git_proxy -from cycode.cli.utils.path_utils import get_file_content, get_path_by_os if TYPE_CHECKING: - from git import Blob, Diff, Repo + from git import Blob, Repo from git.objects.base import IndexObjUnion from git.objects.tree import TraversedTreeTup - from cycode.cli.utils.progress_bar import BaseProgressBar, ProgressBarSection - -def should_process_git_object(obj: 'Blob', _: int) -> bool: +def _should_process_git_object(obj: 'Blob', _: int) -> bool: return obj.type == 'blob' and obj.size > 0 def get_git_repository_tree_file_entries( path: str, branch: str ) -> Union[Iterator['IndexObjUnion'], Iterator['TraversedTreeTup']]: - return git_proxy.get_repo(path).tree(branch).traverse(predicate=should_process_git_object) - - -def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: - from_commit_rev = None - to_commit_rev = None - - for commit in git_proxy.get_repo(path).iter_commits(rev=commit_range): - if not to_commit_rev: - to_commit_rev = commit.hexsha - from_commit_rev = commit.hexsha - - return from_commit_rev, to_commit_rev - - -def parse_pre_receive_input() -> str: - """Parse input to pushed branch update details. - - Example input: - old_value new_value refname - ----------------------------------------------- - 0000000000000000000000000000000000000000 9cf90954ef26e7c58284f8ebf7dcd0fcf711152a refs/heads/main - 973a96d3e925b65941f7c47fa16129f1577d499f 0000000000000000000000000000000000000000 refs/heads/feature-branch - 59564ef68745bca38c42fc57a7822efd519a6bd9 3378e52dcfa47fb11ce3a4a520bea5f85d5d0bf3 refs/heads/develop - - :return: First branch update details (input's first line) - """ - # FIXME(MarshalX): this blocks main thread forever if called outside of pre-receive hook - pre_receive_input = sys.stdin.read().strip() - if not pre_receive_input: - raise ValueError( - 'Pre receive input was not found. Make sure that you are using this command only in pre-receive hook' - ) - - # each line represents a branch update request, handle the first one only - # TODO(MichalBor): support case of multiple update branch requests - return pre_receive_input.splitlines()[0] - - -def get_diff_file_path(file: 'Diff', relative: bool = False) -> Optional[str]: - if relative: - # relative to the repository root - return file.b_path if file.b_path else file.a_path - - if file.b_blob: - return file.b_blob.abspath - return file.a_blob.abspath - - -def get_diff_file_content(file: 'Diff') -> str: - return file.diff.decode('UTF-8', errors='replace') - - -def get_pre_commit_modified_documents( - progress_bar: 'BaseProgressBar', - progress_bar_section: 'ProgressBarSection', - repo_path: str, -) -> tuple[list[Document], list[Document]]: - git_head_documents = [] - pre_committed_documents = [] - - repo = git_proxy.get_repo(repo_path) - diff_index = repo.index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) - progress_bar.set_section_length(progress_bar_section, len(diff_index)) - for diff in diff_index: - progress_bar.update(progress_bar_section) - - file_path = get_path_by_os(get_diff_file_path(diff)) - file_content = get_file_content_from_commit_diff(repo, consts.GIT_HEAD_COMMIT_REV, diff) - if file_content is not None: - git_head_documents.append(Document(file_path, file_content)) - - if os.path.exists(file_path): - file_content = get_file_content(file_path) - pre_committed_documents.append(Document(file_path, file_content)) - - return git_head_documents, pre_committed_documents + return git_proxy.get_repo(path).tree(branch).traverse(predicate=_should_process_git_object) def get_file_content_from_commit_path(repo: 'Repo', commit: str, file_path: str) -> Optional[str]: @@ -107,85 +24,3 @@ def get_file_content_from_commit_path(repo: 'Repo', commit: str, file_path: str) return repo.git.show(f'{commit}:{file_path}') except git_proxy.get_git_command_error(): return None - - -def get_file_content_from_commit_diff(repo: 'Repo', commit: str, diff: 'Diff') -> Optional[str]: - file_path = get_diff_file_path(diff, relative=True) - return get_file_content_from_commit_path(repo, commit, file_path) - - -def get_commit_range_modified_documents( - progress_bar: 'BaseProgressBar', - progress_bar_section: 'ProgressBarSection', - path: str, - from_commit_rev: str, - to_commit_rev: str, -) -> tuple[list[Document], list[Document], list[Document]]: - from_commit_documents = [] - to_commit_documents = [] - diff_documents = [] - - repo = git_proxy.get_repo(path) - diff_index = repo.commit(from_commit_rev).diff(to_commit_rev, create_patch=True, R=True) - - modified_files_diff = [ - diff for diff in diff_index if diff.change_type != consts.COMMIT_DIFF_DELETED_FILE_CHANGE_TYPE - ] - progress_bar.set_section_length(progress_bar_section, len(modified_files_diff)) - for diff in modified_files_diff: - progress_bar.update(progress_bar_section) - - file_path = get_path_by_os(get_diff_file_path(diff)) - - diff_documents.append( - Document( - path=file_path, - content=get_diff_file_content(diff), - is_git_diff_format=True, - ) - ) - - file_content = get_file_content_from_commit_diff(repo, from_commit_rev, diff) - if file_content is not None: - from_commit_documents.append(Document(file_path, file_content)) - - file_content = get_file_content_from_commit_diff(repo, to_commit_rev, diff) - if file_content is not None: - to_commit_documents.append(Document(file_path, file_content)) - - return from_commit_documents, to_commit_documents, diff_documents - - -def calculate_pre_receive_commit_range(branch_update_details: str) -> Optional[str]: - end_commit = _get_end_commit_from_branch_update_details(branch_update_details) - - # branch is deleted, no need to perform scan - if end_commit == consts.EMPTY_COMMIT_SHA: - return None - - start_commit = _get_oldest_unupdated_commit_for_branch(end_commit) - - # no new commit to update found - if not start_commit: - return None - - return f'{start_commit}~1...{end_commit}' - - -def _get_end_commit_from_branch_update_details(update_details: str) -> str: - # update details pattern: - _, end_commit, _ = update_details.split() - return end_commit - - -def _get_oldest_unupdated_commit_for_branch(commit: str) -> Optional[str]: - # get a list of commits by chronological order that are not in the remote repository yet - # more info about rev-list command: https://git-scm.com/docs/git-rev-list - repo = git_proxy.get_repo(os.getcwd()) - not_updated_commits = repo.git.rev_list(commit, '--topo-order', '--reverse', '--not', '--all') - - commits = not_updated_commits.splitlines() - if not commits: - return None - - return commits[0] diff --git a/cycode/cli/files_collector/sca/sca_file_collector.py b/cycode/cli/files_collector/sca/sca_file_collector.py index e066739e..e3ed22f8 100644 --- a/cycode/cli/files_collector/sca/sca_file_collector.py +++ b/cycode/cli/files_collector/sca/sca_file_collector.py @@ -41,7 +41,7 @@ def _add_ecosystem_related_files_if_exists( documents.extend(documents_to_add) -def perform_pre_commit_range_scan_actions( +def perform_sca_pre_commit_range_scan_actions( path: str, from_commit_documents: list[Document], from_commit_rev: str, @@ -53,7 +53,7 @@ def perform_pre_commit_range_scan_actions( _add_ecosystem_related_files_if_exists(to_commit_documents, repo, to_commit_rev) -def perform_pre_hook_range_scan_actions( +def perform_sca_pre_hook_range_scan_actions( repo_path: str, git_head_documents: list[Document], pre_committed_documents: list[Document] ) -> None: repo = git_proxy.get_repo(repo_path) From 8fa4345b48eceb1ed08dc5322a44dce9dc3dc37c Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Thu, 29 May 2025 15:32:32 +0200 Subject: [PATCH 4/8] add pre-commit support for SAST; update README --- .pre-commit-hooks.yaml | 6 + README.md | 165 +++++++++++------- cycode/cli/apps/scan/commit_range_scanner.py | 48 +++-- .../files_collector/commit_range_documents.py | 19 +- images/sca_report_url.png | Bin 205022 -> 243756 bytes 5 files changed, 150 insertions(+), 88 deletions(-) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index ab69bf3f..c50e4d73 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -10,3 +10,9 @@ language_version: python3 entry: cycode args: [ '-o', 'text', '--no-progress-meter', 'scan', '-t', 'sca', 'pre-commit' ] +- id: cycode-sast + name: Cycode SAST pre-commit defender + language: python + language_version: python3 + entry: cycode + args: [ '-o', 'text', '--no-progress-meter', 'scan', '-t', 'sast', 'pre-commit' ] diff --git a/README.md b/README.md index 13e23a6f..d9c369b9 100644 --- a/README.md +++ b/README.md @@ -85,9 +85,15 @@ To install the Cycode CLI application on your local machine, perform the followi brew install cycode ``` -3. Navigate to the top directory of the local repository you wish to scan. + - To install from [GitHub Releases](https://github.com/cycodehq/cycode-cli/releases) navigate and download executable for your operating system and architecture, then run the following command: -4. There are three methods to set the Cycode client ID and client secret: + ```bash + cd /path/to/downloaded/cycode-cli + chmod +x cycode + ./cycode + ``` + +3. Authenticate CLI. There are three methods to set the Cycode client ID and client secret: - [cycode auth](#using-the-auth-command) (**Recommended**) - [cycode configure](#using-the-configure-command) @@ -204,7 +210,7 @@ export CYCODE_CLIENT_SECRET={your Cycode Secret Key} Cycode’s pre-commit hook can be set up within your local repository so that the Cycode CLI application will identify any issues with your code automatically before you commit it to your codebase. > [!NOTE] -> pre-commit hook is only available to Secrets and SCA scans. +> pre-commit hook is not available to IaC scans. Perform the following steps to install the pre-commit hook: @@ -221,19 +227,19 @@ Perform the following steps to install the pre-commit hook: ```yaml repos: - repo: https://github.com/cycodehq/cycode-cli - rev: v3.0.0 + rev: v3.2.0 hooks: - id: cycode stages: - pre-commit ``` -4. Modify the created file for your specific needs. Use hook ID `cycode` to enable scan for Secrets. Use hook ID `cycode-sca` to enable SCA scan. If you want to enable both, use this configuration: +4. Modify the created file for your specific needs. Use hook ID `cycode` to enable scan for Secrets. Use hook ID `cycode-sca` to enable SCA scan. Use hook ID `cycode-sast` to enable SAST scan. If you want to enable all scanning types, use this configuration: ```yaml repos: - repo: https://github.com/cycodehq/cycode-cli - rev: v3.0.0 + rev: v3.2.0 hooks: - id: cycode stages: @@ -241,6 +247,9 @@ Perform the following steps to install the pre-commit hook: - id: cycode-sca stages: - pre-commit + - id: cycode-sast + stages: + - pre-commit ``` 5. Install Cycode’s hook: @@ -267,14 +276,17 @@ Perform the following steps to install the pre-commit hook: The following are the options and commands available with the Cycode CLI application: -| Option | Description | -|--------------------------------------|------------------------------------------------------------------------| -| `-v`, `--verbose` | Show detailed logs. | -| `--no-progress-meter` | Do not show the progress meter. | -| `--no-update-notifier` | Do not check CLI for updates. | -| `-o`, `--output [text\|json\|table]` | Specify the output (`text`/`json`/`table`). The default is `text`. | -| `--user-agent TEXT` | Characteristic JSON object that lets servers identify the application. | -| `--help` | Show options for given command. | +| Option | Description | +|-------------------------------------------------------------------|------------------------------------------------------------------------------------| +| `-v`, `--verbose` | Show detailed logs. | +| `--no-progress-meter` | Do not show the progress meter. | +| `--no-update-notifier` | Do not check CLI for updates. | +| `-o`, `--output [rich\|text\|json\|table]` | Specify the output type. The default is `rich`. | +| `--client-id TEXT` | Specify a Cycode client ID for this specific scan execution. | +| `--client-secret TEXT` | Specify a Cycode client secret for this specific scan execution. | +| `--install-completion` | Install completion for the current shell.. | +| `--show-completion [bash\|zsh\|fish\|powershell\|pwsh]` | Show completion for the specified shell, to copy it or customize the installation. | +| `-h`, `--help` | Show options for given command. | | Command | Description | |-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------| @@ -294,8 +306,6 @@ The Cycode CLI application offers several types of scans so that you can choose | Option | Description | |------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `-t, --scan-type [secret\|iac\|sca\|sast]` | Specify the scan you wish to execute (`secret`/`iac`/`sca`/`sast`), the default is `secret`. | -| `--client-secret TEXT` | Specify a Cycode client secret for this specific scan execution. | -| `--client-id TEXT` | Specify a Cycode client ID for this specific scan execution. | | `--show-secret BOOLEAN` | Show secrets in plain text. See [Show/Hide Secrets](#showhide-secrets) section for more details. | | `--soft-fail BOOLEAN` | Run scan without failing, always return a non-error status code. See [Soft Fail](#soft-fail) section for more details. | | `--severity-threshold [INFO\|LOW\|MEDIUM\|HIGH\|CRITICAL]` | Show only violations at the specified level or higher. | @@ -501,15 +511,7 @@ If no issues are found, the scan ends with the following success message: `Good job! No issues were found!!! 👏👏👏` -If an issue is found, a `Found issue of type:` message appears upon completion instead: - -```bash -â›” Found issue of type: generic-password (rule ID: ce3a4de0-9dfc-448b-a004-c538cf8b4710) in file: config/my_config.py -Secret SHA: a44081db3296c84b82d12a35c446a3cba19411dddfa0380134c75f7b3973bff0 â›” -0 | @@ -0,0 +1 @@ -1 | +my_password = 'h3l***********350' -2 | \ No newline at end of file -``` +If an issue is found, a violation card appears upon completion instead. If an issue is found, review the file in question for the specific line highlighted by the result message. Implement any changes required to resolve the issue, then execute the scan again. @@ -525,15 +527,7 @@ In the following example, a Path Scan is executed against the `cli` subdirectory `cycode scan --show-secret path ./cli` -The result would then not be obfuscated: - -```bash -â›” Found issue of type: generic-password (rule ID: ce3a4de0-9dfc-448b-a004-c538cf8b4710) in file: config/my_config.py -Secret SHA: a44081db3296c84b82d12a35c446a3cba19411dddfa0380134c75f7b3973bff0 â›” -0 | @@ -0,0 +1 @@ -1 | +my_password = 'h3110w0r1d!@#$350' -2 | \ No newline at end of file -``` +The result would then not be obfuscated. ### Soft Fail @@ -549,41 +543,92 @@ Scan results are assigned with a value of exit code `1` when issues are found in #### Secrets Result Example ```bash -â›” Found issue of type: generic-password (rule ID: ce3a4de0-9dfc-448b-a004-c538cf8b4710) in file: config/my_config.py -Secret SHA: a44081db3296c84b82d12a35c446a3cba19411dddfa0380134c75f7b3973bff0 â›” -0 | @@ -0,0 +1 @@ -1 | +my_password = 'h3l***********350' -2 | \ No newline at end of file +╭─────────────────────────────────────────────────────────────── Hardcoded generic-password is used ───────────────────────────────────────────────────────────────╮ +│ Violation 12 of 12 │ +│ ╭─ 🔍 Details ───────────────────────────────────────╮ ╭─ đź’» Code Snippet ─────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Severity đźź  MEDIUM │ │ 34 }; │ │ +│ │ In file /Users/cycodemacuser/NodeGoat/test/s │ │ 35 │ │ +│ │ ecurity/profile-test.js │ │ 36 var sutUserName = "user1"; │ │ +│ │ Secret SHA b4ea3116d868b7c982ee6812cce61727856b │ │ âť± 37 var sutUserPassword = "Us*****23"; │ │ +│ │ 802b3063cd5aebe7d796988552e0 │ │ 38 │ │ +│ │ Rule ID 68b6a876-4890-4e62-9531-0e687223579f │ │ 39 chrome.setDefaultService(service); │ │ +│ ╰────────────────────────────────────────────────────╯ │ 40 │ │ +│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ ╭─ 📝 Summary ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ A generic secret or password is an authentication token used to access a computer or application and is assigned to a password variable. │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` #### IaC Result Example ```bash -â›” Found issue of type: Resource should use non-default namespace (rule ID: bdaa88e2-5e7c-46ff-ac2a-29721418c59c) in file: ./k8s/k8s.yaml â›” - -7 | name: secrets-file -8 | namespace: default -9 | resourceVersion: "4228" +╭──────────── Enable Content Encoding through the attribute 'MinimumCompressionSize'. This value should be greater than -1 and smaller than 10485760. ─────────────╮ +│ Violation 45 of 110 │ +│ ╭─ 🔍 Details ───────────────────────────────────────╮ ╭─ đź’» Code Snippet ─────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Severity đźź  MEDIUM │ │ 20 BinaryMediaTypes: │ │ +│ │ In file ...ads-copy/iac/cft/api-gateway/ap │ │ 21 - !Ref binaryMediaType1 │ │ +│ │ i-gateway-rest-api/deploy.yml │ │ 22 - !Ref binaryMediaType2 │ │ +│ │ IaC Provider CloudFormation │ │ âť± 23 MinimumCompressionSize: -1 │ │ +│ │ Rule ID 33c4b90c-3270-4337-a075-d3109c141b │ │ 24 EndpointConfiguration: │ │ +│ │ 53 │ │ 25 Types: │ │ +│ ╰────────────────────────────────────────────────────╯ │ 26 - EDGE │ │ +│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ ╭─ 📝 Summary ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ This policy validates the proper configuration of content encoding in AWS API Gateway. Specifically, the policy checks for the attribute │ │ +│ │ 'minimum_compression_size' in API Gateway REST APIs. Correct configuration of this attribute is important for enabling content encoding of API responses for │ │ +│ │ improved API performance and reduced payload sizes. │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` #### SCA Result Example ```bash -â›” Found issue of type: Security vulnerability in package 'pyyaml' referenced in project 'Users/myuser/my-test-repo': Improper Input Validation in PyYAML (rule ID: d003b23a-a2eb-42f3-83c9-7a84505603e5) in file: Users/myuser/my-test-repo/requirements.txt â›” - -1 | PyYAML~=5.3.1 -2 | vyper==0.3.1 -3 | cleo==1.0.0a5 +╭─────────────────────────────────────────────────────── [CVE-2019-10795] Prototype Pollution in undefsafe ────────────────────────────────────────────────────────╮ +│ Violation 172 of 195 │ +│ ╭─ 🔍 Details ───────────────────────────────────────╮ ╭─ đź’» Code Snippet ─────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Severity đźź  MEDIUM │ │ 26758 "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", │ │ +│ │ In file /Users/cycodemacuser/Node │ │ 26759 "dev": true │ │ +│ │ Goat/package-lock.json │ │ 26760 }, │ │ +│ │ CVEs CVE-2019-10795 │ │ âť± 26761 "undefsafe": { │ │ +│ │ Package undefsafe │ │ 26762 "version": "2.0.2", │ │ +│ │ Version 2.0.2 │ │ 26763 "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz", │ │ +│ │ First patched version Not fixed │ │ 26764 "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=", │ │ +│ │ Dependency path nodemon 1.19.1 -> │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ undefsafe 2.0.2 │ │ +│ │ Rule ID 9c6a8911-e071-4616-86db-4 │ │ +│ │ 943f2e1df81 │ │ +│ ╰────────────────────────────────────────────────────╯ │ +│ ╭─ 📝 Summary ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ undefsafe before 2.0.3 is vulnerable to Prototype Pollution. The 'a' function could be tricked into adding or modifying properties of Object.prototype using │ │ +│ │ a __proto__ payload. │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` #### SAST Result Example ```bash -â›” Found issue of type: Detected a request using 'http://'. This request will be unencrypted, and attackers could listen into traffic on the network and be able to obtain sensitive information. Use 'https://' instead. (rule ID: 3fbbd34b-b00d-4415-b9d9-f861c076b9f2) in file: ./requests.py â›” - -2 | -3 | res = requests.get('http://example.com', timeout=1) -4 | print(res.content) +╭───────────────────────────────────────────── [CWE-208: Observable Timing Discrepancy] Observable Timing Discrepancy ─────────────────────────────────────────────╮ +│ Violation 24 of 49 │ +│ ╭─ 🔍 Details ───────────────────────────────────────╮ ╭─ đź’» Code Snippet ─────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Severity đźź  MEDIUM │ │ 173 " including numbers, lowercase and uppercase letters."; │ │ +│ │ In file /Users/cycodemacuser/NodeGoat/app │ │ 174 return false; │ │ +│ │ /routes/session.js │ │ 175 } │ │ +│ │ CWE CWE-208 │ │ âť± 176 if (password !== verify) { │ │ +│ │ Subcategory Security │ │ 177 errors.verifyError = "Password must match"; │ │ +│ │ Language js │ │ 178 return false; │ │ +│ │ Security Tool Bearer (Powered by Cycode) │ │ 179 } │ │ +│ │ Rule ID 19fbca07-a8e7-4fa6-92ac-a36d15509 │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ fa9 │ │ +│ ╰────────────────────────────────────────────────────╯ │ +│ ╭─ 📝 Summary ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Observable Timing Discrepancy occurs when the time it takes for certain operations to complete can be measured and observed by attackers. This vulnerability │ │ +│ │ is particularly concerning when operations involve sensitive information, such as password checks or secret comparisons. If attackers can analyze how long │ │ +│ │ these operations take, they might be able to deduce confidential details, putting your data at risk. │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ``` ### Company’s Custom Remediation Guidelines @@ -610,18 +655,6 @@ The following are the options available for the `cycode ignore` command: | `-t, --scan-type [secret\|iac\|sca\|sast]` | Specify the scan you wish to execute (`secret`/`iac`/`sca`/`sast`). The default value is `secret`. | | `-g, --global` | Add an ignore rule and update it in the global `.cycode` config file. | -In the following example, a pre-commit scan runs and finds the following: - -```bash -â›” Found issue of type: generic-password (rule ID: ce3a4de0-9dfc-448b-a004-c538cf8b4710) in file: config/my_config.py -Secret SHA: a44081db3296c84b82d12a35c446a3cba19411dddfa0380134c75f7b3973bff0 â›” -0 | @@ -0,0 +1 @@ -1 | +my_password = 'h3l***********350' -2 | \ No newline at end of file -``` - -If this is a value that is not a valid secret, then use the `cycode ignore` command to ignore the secret by its value, SHA value, specific path, or rule ID. If this is an IaC scan, then you can ignore that result by its path or rule ID. - ### Ignoring a Secret Value To ignore a specific secret value, you will need to use the `--by-value` flag. This will ignore the given secret value from all future scans. Use the following command to add a secret value to be ignored: diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py index f0bb714a..8a3ce19b 100644 --- a/cycode/cli/apps/scan/commit_range_scanner.py +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -170,42 +170,42 @@ def _scan_commit_range_documents( ) -def _scan_sca_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: - scan_parameters = get_scan_parameters(ctx, (path,)) +def _scan_sca_commit_range(ctx: typer.Context, repo_path: str, commit_range: str, **_) -> None: + scan_parameters = get_scan_parameters(ctx, (repo_path,)) - from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, repo_path) from_commit_documents, to_commit_documents, _ = get_commit_range_modified_documents( - ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev + ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path, from_commit_rev, to_commit_rev ) from_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, from_commit_documents) to_commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SCA_SCAN_TYPE, to_commit_documents) perform_sca_pre_commit_range_scan_actions( - path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev + repo_path, from_commit_documents, from_commit_rev, to_commit_documents, to_commit_rev ) _scan_commit_range_documents(ctx, from_commit_documents, to_commit_documents, scan_parameters=scan_parameters) def _scan_secret_commit_range( - ctx: typer.Context, path: str, commit_range: str, max_commits_count: Optional[int] = None + ctx: typer.Context, repo_path: str, commit_range: str, max_commits_count: Optional[int] = None ) -> None: - commit_diff_documents_to_scan = collect_commit_range_diff_documents(ctx, path, commit_range, max_commits_count) + commit_diff_documents_to_scan = collect_commit_range_diff_documents(ctx, repo_path, commit_range, max_commits_count) diff_documents_to_scan = excluder.exclude_irrelevant_documents_to_scan( consts.SECRET_SCAN_TYPE, commit_diff_documents_to_scan ) scan_documents( - ctx, diff_documents_to_scan, get_scan_parameters(ctx, (path,)), is_git_diff=True, is_commit_range=True + ctx, diff_documents_to_scan, get_scan_parameters(ctx, (repo_path,)), is_git_diff=True, is_commit_range=True ) -def _scan_sast_commit_range(ctx: typer.Context, path: str, commit_range: str, **_) -> None: - scan_parameters = get_scan_parameters(ctx, (path,)) +def _scan_sast_commit_range(ctx: typer.Context, repo_path: str, commit_range: str, **_) -> None: + scan_parameters = get_scan_parameters(ctx, (repo_path,)) - from_commit_rev, to_commit_rev = parse_commit_range(commit_range, path) + from_commit_rev, to_commit_rev = parse_commit_range(commit_range, repo_path) _, commit_documents, diff_documents = get_commit_range_modified_documents( - ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, path, from_commit_rev, to_commit_rev + ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path, from_commit_rev, to_commit_rev ) commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, commit_documents) diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents) @@ -220,7 +220,7 @@ def _scan_sast_commit_range(ctx: typer.Context, path: str, commit_range: str, ** } -def scan_commit_range(ctx: typer.Context, path: str, commit_range: str, **kwargs) -> None: +def scan_commit_range(ctx: typer.Context, repo_path: str, commit_range: str, **kwargs) -> None: scan_type = ctx.obj['scan_type'] progress_bar = ctx.obj['progress_bar'] @@ -229,13 +229,13 @@ def scan_commit_range(ctx: typer.Context, path: str, commit_range: str, **kwargs if scan_type not in _SCAN_TYPE_TO_COMMIT_RANGE_HANDLER: raise click.ClickException(f'Commit range scanning for {scan_type.upper()} is not supported') - _SCAN_TYPE_TO_COMMIT_RANGE_HANDLER[scan_type](ctx, path, commit_range, **kwargs) + _SCAN_TYPE_TO_COMMIT_RANGE_HANDLER[scan_type](ctx, repo_path, commit_range, **kwargs) def _scan_sca_pre_commit(ctx: typer.Context, repo_path: str) -> None: scan_parameters = get_scan_parameters(ctx) - git_head_documents, pre_committed_documents = get_pre_commit_modified_documents( + git_head_documents, pre_committed_documents, _ = get_pre_commit_modified_documents( progress_bar=ctx.obj['progress_bar'], progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path=repo_path, @@ -273,14 +273,26 @@ def _scan_secret_pre_commit(ctx: typer.Context, repo_path: str) -> None: scan_documents(ctx, documents_to_scan, get_scan_parameters(ctx), is_git_diff=True) -def _scan_sast_pre_commit(ctx: typer.Context, repo_path: str) -> None: - raise NotImplementedError('Pre-commit scanning for SAST is not implemented yet') +def _scan_sast_pre_commit(ctx: typer.Context, repo_path: str, **_) -> None: + scan_parameters = get_scan_parameters(ctx, (repo_path,)) + + _, pre_committed_documents, diff_documents = get_pre_commit_modified_documents( + progress_bar=ctx.obj['progress_bar'], + progress_bar_section=ScanProgressBarSection.PREPARE_LOCAL_FILES, + repo_path=repo_path, + ) + pre_committed_documents = excluder.exclude_irrelevant_documents_to_scan( + consts.SAST_SCAN_TYPE, pre_committed_documents + ) + diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents) + + _scan_commit_range_documents(ctx, pre_committed_documents, diff_documents, scan_parameters=scan_parameters) _SCAN_TYPE_TO_PRE_COMMIT_HANDLER = { consts.SCA_SCAN_TYPE: _scan_sca_pre_commit, consts.SECRET_SCAN_TYPE: _scan_secret_pre_commit, - consts.SAST_SCAN_TYPE: _scan_sast_commit_range, + consts.SAST_SCAN_TYPE: _scan_sast_pre_commit, } diff --git a/cycode/cli/files_collector/commit_range_documents.py b/cycode/cli/files_collector/commit_range_documents.py index 942c4314..62f14d22 100644 --- a/cycode/cli/files_collector/commit_range_documents.py +++ b/cycode/cli/files_collector/commit_range_documents.py @@ -203,9 +203,10 @@ def get_pre_commit_modified_documents( progress_bar: 'BaseProgressBar', progress_bar_section: 'ProgressBarSection', repo_path: str, -) -> tuple[list[Document], list[Document]]: +) -> tuple[list[Document], list[Document], list[Document]]: git_head_documents = [] pre_committed_documents = [] + diff_documents = [] repo = git_proxy.get_repo(repo_path) diff_index = repo.index.diff(consts.GIT_HEAD_COMMIT_REV, create_patch=True, R=True) @@ -214,15 +215,25 @@ def get_pre_commit_modified_documents( progress_bar.update(progress_bar_section) file_path = get_path_by_os(get_diff_file_path(diff)) + + diff_documents.append( + Document( + path=file_path, + content=get_diff_file_content(diff), + is_git_diff_format=True, + ) + ) + file_content = _get_file_content_from_commit_diff(repo, consts.GIT_HEAD_COMMIT_REV, diff) - if file_content is not None: + if file_content: git_head_documents.append(Document(file_path, file_content)) if os.path.exists(file_path): file_content = get_file_content(file_path) - pre_committed_documents.append(Document(file_path, file_content)) + if file_content: + pre_committed_documents.append(Document(file_path, file_content)) - return git_head_documents, pre_committed_documents + return git_head_documents, pre_committed_documents, diff_documents def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: diff --git a/images/sca_report_url.png b/images/sca_report_url.png index f438180ec80aa9f8f44c6588b15d7256467fcf42..6513966ef2987b99ae3baef5b0f940cf1a5a9e71 100644 GIT binary patch literal 243756 zcmdSAcTiJbzyB+uf&xNB=@0=0RC-53BGRRasDLy95s)TLLQ5MZ?6?Z^Dd3ahbK&2P9eaMvKwI-J+-@b4sY+0X5~;;>;e_T4I{KoB zvCf;Ehab-z@6`sK=Qy7*nZA`3{^rI_7UA%77sJmoT={4a-iQ^&NVN=BS#L3c9g<5sshur0jUEJ;{^!|i~(Jn>l;~l4ezHpm=XVE?Lobjx_ zH}-JnQA=PlAzr;Gnf`)FNVSDr>~e~g=gqTGw}Pd|?_Ub|{g$IlT06hH*ZVP2C~Y!i zz5ZA9x@6eFPUct2kV1XPu1UxWMlYaLA3d|#DT6<3?v%mW#GM2E_bWlDeUC)wTSx5H zLXaih*O%w2!{v(`_Mb>0CIW^sFEy0jC1Yo!uYIlEva}0XEidcQ<uc;$88#)*mi$ICWCMESo5 z`QLvm%AdzX{l|s%Q$C`M|Kq~iHLN-w|8ZTBUS|nM&i}sP|M??9TI+uuGVjrl^BgF9 zrTDMuVlhP~GXH+XUQSnY+|E{?X+gSogPI0yk1+7rt)q6mA$<)?r)@Q{$lT4n-o@`- zmmn1U_v6;|EA~$XS;1fVG>qZI%)rgDYwPDW{?pqxgqr1|PGaC6 zO{ROfOA$l%$ogmWp2^_jXs)5(hauh|At4yFewWlXU|Vy+8?on5L(Wg>C3|CS}`(7*Yd)Owp=jk-i`}h!IW(+HuruE49!CLroN$V`CBse#r*qPZJmE`9wW>*7DUYK zgOGnG25&FDTS#?^FQY7^7pP2ymewpQ&U{Mux@AwDAa|3yitsFjcZ!K zpjBV2LU-zYE9ZAh(tY88@d<~`u-LadPjY!9w;Ub>?`o z9x?d!`P#SA?haxlZGYJ!cj={Hx0-m^ZtawD>2G;M=~DZ{C5r*u2XjTWYaR1`8;wlB zcF?$%5#rT=EV$P6ttG4$SJKxPwL3NC`5Ky{L3xz+#WcIDlTGD*ZjE4WR`AuX;bQy! ziO*)`p592R&jadjg+A&lrphZg_34VSJH-uQep5FErOdY&PsLMDl=<=ycdWJdA$31qU0TYztg#Zh@0#PUnXSJ5dr_rkmb}#nvxf_Rw@g|D zIknz(gcbyv?@uWv+Wn7>0xi%1js5wkRjTSrYT?G)6(w7HRZ~N1S1StFt{dN&Yavxm z1}{Ik8`*fkI}`~=h3-xv>7f(03_|#-2G5F-Pk{M)hiy6RuPqk1FtjQU*`@DPEq>Z6 zC@k*Ii5)q0_P5>Wr%UkD=>nu#z+~}dfH(VuJzVv+!bRvm_3dSv(|YewH4`!LIVyFW zyexfj#Tq{Iy3a_VD~Yz5f}J~9|E+-kwl*lDG6{E*&Yq&}R1SRh!tdg*Uo##mwjW*j zTG;#8!tUK;u%d*qJynRd(L7*Vdol$|d9)OO1G&{M7ZvLUsAoy970P789rvI0q}0vq41cT^GLpBPl^}CZnYAw@=rci_C2)53wFRFth zF4>uQA|6Te^UMxes}^4^AF^{RAGmMGBm{pLJeQ#N#AkJ8z{1{`+^z1t--AZnjq4ak z9IRT!ULfwSBk8qVZRP8LGg-_}vFpHQhi?9o+)yXPDr~M3&@gEB*gFfm_du|i%4bs^ zzG#a8>~PCwYOx?YYw&^lcgdYIXh$1&>$<}pJ-3g2CWiJJlsQG(;V!v?EEJ}=z0@cE zJ%H5W8GTm>h)a^m%}x()90~@_C5&*617V1K?ng%F&X{-hvk~W%s2w&hzzSD*(VHWI zQ(=B#DZ-|8v7j{0_deb}uo>gn9|XiPNQozKj9dNoV5jrusy9+Sn~A9Kbo%Fm(M?LG zZ^xDSZwg1|t4)j?mQvjrcIty3tR(8j@x9Y|$UMIXyD<%KIxYT)-5*BzW!lSS?U6w1 ziMGsF^QxXt4n+tcfdJg;`T2K@Ohf8IntM?h5C~1m>ZLY*>QcVduGLhBay02sScM>} zm8PTC)!opmYwxw#H58{xC3i=$z&0`ISJ)*!PWQa;zT9}^ddd#gYKc2K57tOmQELct z`qZPwnYrhvRTdpv=+LE`*9$+V+v$Nb2Wz)_N1-YZdg$m*&2sNmQN2&~G33zCm%1UL zzf;S|Y$}h7o%n5@S?#Z0u$ZHFj&D%?%C`>AFLus$H~a4M_o8wpzS-y5ulE}EwwOZ9 zVqAW8(E_Iu?_;N5W-!^!s$y65kaoI5upwVsS<^gbJIel0W5j_c%)P>GD~Kg}be z!;>nep9@}j)oR$Y7^0gPTjVMw_P;9J@;t#X9;#FOz<)STq(UpY0aWa7GgT~8tN7jC zW-8y*C=?lsSR2_IaxdF2liOUZasWc5Otzq{L)`ODD46h!A-t1YH% zu^Rh32UCg>a-%?$cDA8L8{W{#XNxN-ip2ZO;F~e^GOYTy!uc6Zp{6bMR%=YyCp}ylRlClXX zwioA)U+fh*?s&yy=gXNdX#_0&(EIw_8?7H3E)^q>JKJ>rXx}(-A_HuP>mcqT>AT3q z7h-b9n^cNa!u@6pJQIzTe_@;b1Sxop-SP5e7puEBJ`9a-m+Rpoelp^3(XSQ}a!p~z zU~Y#Na(AalMT`)#uIAuU-9{4&C9O&*JoNeVrxCo5^$jI4+C?tfa18D;v3#@RnrTuS z;A=DtC{G2QKY|T=rGK=GbVUzKSI@nDKzWKcf*o#A5FcouL?4f2QD^Y%FnS8}?TU!x z&PSsWmw|g0nG(noF5{d7hOFq?@tM9JjtEJ-Y0_M zE^MQ>sx%~=3}*(Dyio82_vt#05g&Sa8|OvhZE5h5R0osh$WbmfHg3_d`OaqO`NhPr z6ng~425Tr)es?t^C-Y7=^V~7bv6WJMR%gUc3yGss!>$I)(Ta&HORUXsM-695bYI}G z#z?MRHJ%Tl3}f6X2=SdaFDHlKVumYCG?X+H5ux$+o4*xGpEHAc$Hg;~*29wf>hl+a zWjYs`%CZ`~r&gj^WS-__yZwCb-$%w1_ng*h)VG%=#J87*WMXtcei$Tbc;mkE*mFEN z`(rz@(L6FQvdxs^hwzUyMLMCk%a|Cr4J4dur?|#KcDsX0)_?0DETG$WgJ&`Wdj(#Z z==*VvY0X7WM}?(m>}G5=79{Qr-J>BorL6o_stkDQw9K;euwPZBr}I5O<jMcPg--TU7OHlKh**Z$sol=%;L~wleVYudEQ3@@cfVCKhDO?CbZ0F&Zvp1ch zOos^z>7}S*3k>^geSqO?`$HSE?tV`{k&1~J^0flJOWYZEx6Jx3>XyP9O=?Nqt!AE7(E|7SpA$Qj%)HUc- z@?u$^N#{$^x*wYGktWf>K2unx4uslje*PP#m5-t_Sz;G7|8C_=%#^U>0Rc=;McM~W z1W*FuPt>QMGj6UA-atkCjXW%zDS#ciO)_E5V?l;K2OAX%dcc4qq8 z-GEYCUk&)-HByQTGZ63Y-T#FpCAVw~+Ytgov_0-^z!kNyPCrUSA-v@$vno|5?^)Qs zLlS0Ur~0p5ysP~oa+npwJ6Y8+EsQ<{)tW(%$~{`#ZuJKx(AWpfSG}X|#kQPrKHxV( z=-@oUFr4DZpY@vqIrA$vJJkc-=| z+LRG~;HF)`ok)(?0MU!=t(}%(Jz{O`p0qx-NdlSnerivj8n`V*T!0^}R+7sJztDJnl}GJwsQkt5)U)dz!awrr8>pL|<%d?i=QoV>>h%sUuElO%RdB?iwjyCv z;gI=sfv+MJwf4bRj4ieti#X{1snM%<5lm7wywDZnJv4w;|clB+7rY zcomeuMU1GFw_MJN>D%JW$A;Y82hsyGw9=SAJq*!yZP{k?*xVZ6g0G6e>N02QW0o_Q!#VrN>vf3)kXM)8c)F=l z)bOV77abb1dTsQ9(D$fe#Pjwl)9e+g*yXXUj%#Gf+SsL=)`u@y`dC})FXS|ZhUrjl z3*AsFp^nWgN5NWyOQa#4m5`Y~?( z86i%MhHa^a?JX59Zqca)?YpTf-@o5-7f~+C+|u&fZ*XgV%WYhj2hy{B$_C#&!0(ZQ zM*dh%mZc$b?*#u;pI|-Q&mT+IMka|8k^W{T8{cy#x}S}cs%?+$l8Ras7JfXg6OR7( zQcm%>AQuLsC@NBP;l8DCO#FsXgm?i*z)bz=o(EJK;6HzGNF@8)0Et{*3YI#*1$?qF zCCL`8FQ)B<^4K`>`WSPOPTp-?sgYw|Hc;7>mM{z3qQViR82h=sK{)+zxAe^_kaGQ+ z{JH^cC7p(+?N8BZDalrk->+!0yx^Sv7)?b|I_(#xJfns;CSNm4B$ujxe#v|RZNY`sW{jBccbZuvUv6#YV7TtfR z%BjI{o|?dZUmG7|}2 zIAHho9491QHvH^MSE_vEVmJ;5meBM>?!C`?qhLpaWZik8f`%-hIu$StncpYSoUP0@ z9eEw5sifFQ=ER+rA2m49)bw*@mmIBEn^;O+PtWvw=s+CBli!aor4^bN=b}4u#4Ukx zcxB>R@y7ZZSSSoeR4UcwoP6( z8OK>_q1fKJEfjQjl(f(PLman$o|Hk?rVxAzuh8>-X^c+{wP)Xd%YbE#s$w}be7XV~ zwx-ews?xKO!Z8_^j}zy$te`w-Pv*%{Mv5;DcC{l4g0-RIe`I8H5ltxm_i@P@A1`cQ z*p76O>!k;5{k4I@gAW{i!a}Be4W+?2e_SMwWXy2%KHuhaIFY4O#Jm6|(+$$(y;)HT zMqG-aAYf1KK5)aK>ge4=rj~E{OoIjJq)!Aw<5|s-^%&)Qr$9D(+8zv96M#3l$Z|5q z-SO9-WYm^3h~KaoQTQ1z!^W4?5|o5rFrIHdWZ~3~ukRDlGBw3s-G2h4fcaTdpH;}iE5^y^<}ID8P9>*j1WpFIi%6V+ z3&4^G=HNi+e|}Pu^A^PJ%kyQK6#EPy8EDVG4Awf)x*3NvEkdz@@B)lX3(gmu78`e- z@2V7q9hL1v5f9PVH6PxKnAb?>#0Z~rQoEDfdP3VAIGsaS+vBKz5?p8?$r=9lO{nEd zB}m_lj|}t7lsEEV>`q6NCiUJ0Oc+pf21VUT?!a~O+|@z#tL>Vis%~E56;WO@Tzcz= zcJ{WaAOlW4^XZ%W(|f2^OWzdV2;_|0m!T8Iz6`ruP4Xvl1sP<*=c1;I&ID+`7um`S z^Ielv;=4VBd+jQ%{R|^1G2eD*tezVtJbDQRsWCnctWRBrMAoo$oov{~FY(1%prvGm zR+kQ0xH%r~QkKo-49;rU@NYdAW7+@}*64gb``$elD7FW-fFifAZ8I*nH9k}SQR}&6 z<|+>irptGnv>5e?TKstqjf!(t)zZE{PspL&mjLpRyLGjg z(91W!{X#MSTOl2AfgXt#@ zf7-7tGsvr4{o7+DQTgZ3#~?M!j*m7_CdHsTETFM!VPEOqx~<6&wa_~@AzT3$wkh>F z8C7fGQX5|kU0P*4byp9!^P0evUy$An(~iX!qK3Uf*Q%9uJPgk}_q=5?gnTH!9NnaKinazC9PF-YjYUIFRKmD|fi4brdkqT-iv-v7egmHS9ZHkd>C=F+chkvNP;& z*GJa2i-(TWCi{vV-kn4k&nJR*NYr_8}Dr z3tu`oO(Al0-4hWTQjmAAQ89$$SwB$hrca64NJKn(UKINPj4;nCvyW-TrOjN8bKup) zd3WKtV=DEw2R7Haq=JV-dJE_l~u*(TV4OHugk z{^*s0Jd3nZg&b*Zy<+5sCar5TmATdn>GP6#C$twF=0BQefD3Ow&2ZmvQ47bF)qC?% zML=S^M~{Qcql5=Iu>F=3ZvE+DI55p06X=Cfz+_c${2I`9G^Y3+DxBRLPZV%ePL9!j z$|YaUxsHXgd}vU0z0LK}c4L@eEVoLy5gw(pU+4cMfwm-8ocwbe|8xbj*dUhR0=@5p zP@j@*?Bk_YRw);ethG$s2RZpgl#|cBHUx|vDHvu8rR(5%k{7@bRhjzJKyv-cqIM{K z^E7BotqYX_YMsev^>+5L!Fg@@2|E(@`gWHstiAl;3G8hyR>Sg@7s4PS6-&NZ&-K|s z{B~;(&S56f`gXfIf89R~ykB@A(i<76^mAEAq}`j9_w7kfOx)&-iU@R#zax2*|6qZC zkr`skH9s&O@b75`O7XZ<^e{)d@Dt70fTb@5k7eAcx*O+9wC5aSq>?K|;ZgaV42^ta zBpYRq;Sx!qSrxm=V`w+3*p#`6+U1boS)k<&&L&h2JH}8$n%Pu-AD7WKr=A6kX)+1k zJ&1e$1jt!US)|HtUtcZjdqVuf1*B=u0O2D8W@zAxfalKc0!g%Qr~ue(>@~Mts!k9U z3b=K@P(zUlORpp>wN;&KDAGj|VHyvV;N6uGtOg3Z>)C6P@4`Z=w|Wi9azI!Qn9tW% zD?l9X4?sR)zAa$dgwoepaBj6LKMW`1RiGVAJzy*-`W!{GlXE^v`&*X6z}T5nuw%{w%&3L)LOF?=w-KUqy+i!L;3}3rJT3 z9G8gknzi;@t?12`m{Bu5!FL3e;fJqIiw~W$(WC5*J5hxo@TZ>H-N3Xy_hpl`?)Z_N z#O^74W4e0!CCdUq8mQ?P%f%YcYX{v%0vd%KlnIf@v{FsXD&N0o3c1+ZAhCPYaQw9^ z=ZOtmpDbTpWk?ueWjvKP;oWd$713vGCHb28z0o-5zV>@mZ^hN6lMKV)=-_N@Ri%k% zG`{JZBYi-oMwX4TixsCz@93>Cj>R`f(0x!I9W1oYn^*F;3D?DsYE+Q!WD+7ibIXwwZboO}{9P9(l$@l*OB1cr&dob!GYL*W;>enO4;XUF0Y zAQO&mCa*G>TBA_O51xE6(Dq>7yjjKVP}-$zxUP6wQzG&Sq^Wk}?gf#L8<$l0dTtft zHEd@-N}tf3UuH?L3sF72ZUB_!h@c*wpwrl2uk)or7kzAi;GM61C2_M{=L3`^-MU?> z=%RL3lhY8D?7(|3c}{Y@P2;)jIa4o;R7auYtdmtY&>UCq0{Xq>ha9#Hop0{rrMlOn z#IxFW872uGKK-WfrDk(Jq4Arz9rk3ImF?<+x&%?Z$1j}JG;TtZCp_54ttG!dFu~Vb z@0{N|Qut(m;>7Cb5Qrn8hvryqe)HZVZpRwIz;U0PRn$$O#*s1gXBWK`H}7`^)=?8m zo3rI=@}Y8Mn{=&n1|pnBTkmy##~rLzp(e(1NP}G_#wg+iNry4tC*T*$ol9 z8ofKqDT7rTO`);C(od7#P%Vn)u+I{ZaD;VTJF>>q+uB1>-n7dEQs)1CoS}B z%eMF6C3&anKgqp>ur~)pmyD1vp+}8$McS*=^9p+}n0hl>wvAoEVSdml-s_4JJ^fIf ze@~bA;<$7?o|mx5@g4^!3sOJ-nB&W;*hq@t`8z7cuI1dZXq8-6(=Se$00fv37A{Jn zJ#Y98_zOpHa&Fyxvh|M}R~}wzKGIx5h&6{hW2K)T`%dpkGIgja>rtp1ckXMzwCw>k z!o3D)jP_*)PO6zv8QCFkPMZ33!M_uzPC*9K`x5D!+ZYe`kf01jJj~wuEk^WdmVgS* zhQY33*p4m3oq4+o(V@{%aM|)!vTytrSTQImXWXjwoT-bX+%4*`n5nL_YNaY7!zCk7 z=`J39-F1zss_cXDPC}w2UpQ-9{UHD7lCoCE7>XlLdV(J zs_E6)UW2A4%)M+?S+I8nL^n?rwv;0i>sMD{2 z^Zxyn5Rqg4zi}4{-5>s6B`p4Z9|FY1|M#Jg{~WUGJ=_jJ;N&;HVk(%d4=I3#?e{kw z>5cK%mp(^T@OsygS~-u7kVeDy|K^I1OlHCNuM^@_Cik9Xkj$mCume?D9H!MgM+aIE zV%I|=#Au5GqR307L2ece*=(0aPXUUk_=p#9U?7x+5{;Lg+%u@)hk4Gj z!>Aiygs@YH1LGePa6+wl=u|_Pc$B*-)ge;waVUG73qJ`-KbVSJe@F$8p(k}DHbHkm6=m!Bqp&d-oi#qzAlwEb?2aG5UXi%6J+tst4de!()mgoQe*WcSb*Zp1Z zW!=xc2O2w)OdGbpdmF#~`2TzsaK%+Nmkb}>qZ21YDvALad@;$~dypq3N|GNrpx`=eZHNv-^_07BtdoJxbxY|#1>Q|fz{toLVCr=KeV^7aC$OTJSw zamu3LE^T17)pQKLl;SM+IMpG-1`9L-ZHlILKK-*0tw-I;AgeAw@`esgow@c+wq*&u zySua#91UBmB8ZJZzt3XE0u;0M6&j$kZpb4Ezl*tU^hx17^xar|7uKXY@+o-|9lJr_(nGwW?V=m|tS){iAJ1YDQ)GJ*2D6gU%_y5JIRx zC9|YVn@cq9CY22U>ixrx=;36$;KePVxnEop4_QBNT?F09edE?q9y_3;z+y zq`3U8bb-Wn>YAJ6TEoGbB2Wbp_YVP`z%nk`t24``m>~PU^z!mg9+6Dl{+-ep- zb*_2?dg3=-00Zj3EUFv(+1OVoY^!I$H6bD*ie5zr6-BiZGyHoE%6DGC?`khaHiR9R zSb@gw7)rgHMA8qJqx9`0bMgr)EQZdJ7_va`hbwKRD$B9`5hz4M2poE$e-hy(!f&lWuB3FlxFI>%s zUb>Ww3Oy?{loOT#pN#^JT5J^v=r@ZV4!-_hz*?T!ZQS6ngkzyMfS>sb{=wQQh)9JGp*0^cC>fU@K#6?Cu}~okNMN>(nZTh>l^*1MRHMu#y6+;_C+iD)L^RT9hX+HWZ9iWy0`Gd`)K*HG zpR5M{{qu3)FW>j*;Z`&_8~fZYVBlV#@|Z_1^Ve=TfJXL;rF*fKqk+v5~cw{q4aZ~0=56V3qM1#hls{$$ZG2$%y+K+Ntr%+VKzpls2mNL;5R-gk%?3Q z2rC#w6axUl6aTpT{~Ks1V$S)$ef)pNA09c)Djz~Ga0~B_5Ueu5Uljn^V&T!wJX(~p zRzCN+{jo=h#=QV2U_SA$Xu#QgK#V$$TX#*Ba?1*ivMg)#| zRz4~7_dCLA$^Zq9xIgAzT>rI4ME(LWes|w7Q31r>%)hqB+)Ebe&l*$lFxnn)+gb{t zdmE#N$jx8kz;+2%)QUX&y&Mg=<9oR}dHj9=JJUb9jsl5(?NI{qoH#*sWnjK-zE~97 zxdHn8t>XHf2LarRtw49u$?d4+xV@XX9x7fB7~FvEzXIseO8{;pV%Qu2M9CaC_|PV7 zd!T&Z)~`#cu&1|+SLw;!@3cWHm&_++C?lQJx!9e`7B1_%xxmdYy?w#RG??WLa5(Nq zwzb$-V7f{>3XK2Q77)$y2BB1xUS7j6psu>FRwC)Ne;HO*@X{B>^*Zu`5tpsMnT|(5 zE8v2&7JzVIg9HGE@c+tyzF2z!T-v{a1DjCu1&k6GP}_Q@0g=b=5Fr0*23!{xYyk88 z$JK3DHlE@K2KMNx?^-o+F!ralcYVOWwtyN5$LWq&5rgOipF7;&E}Wn<2|T?4j9Ks1 zQ>oE5pht5LFhwucrWIH0_n^^xxceJGbh)phbRv5AlfZiYu3bRlKOWCW>pVtDIeK`B zAFwRj$fI$(X`ja!m_B|GHOv=)u;DxU$F^Z52POK1IY*Z-^J|!m&rc>T9m*S z+p2BQ0qVkR;(PPcY&oF@0J2otsJ!W-;{guaGLv>ne%Hcv;fN#|N#5wVR@`5qlL_1S z$vCpMHSC0*uaT+rMx^wi6y*g0je<&QtDewF4+8Ga?_jALvODfqZ3;i!9x61Oh<`$X z?oGd1T&Z#*}-KsHx*>-EJq>u^9?v zSCKzvApTuskj)mr8r}{3C0jA!R*<<#-2;NGW!zfD^wT`ZPWm0cZgb8_j2aP$It6@} z1@m%6Dvl;7=OEIhx$LD6*ZQhY=sxvm{|!v=@r~ZFc!$($oWxZxt+;md%!^cT+lR`T zO5zND%e4u(MG8Lq`z&*-JwcSL-M+tEY#(>)hzL3&@{*oSh3!7MYx{>6#DCxgYz#MG zI`NCxjn^`HfC#!PsC-UNSPqE51wav5%{L%?q?+adn?$KgwwYCpIz>MO;L>$OiXE_- zmWnbzc~3P|vmyZ841keOvP-NL1J!9U-{pT?=LKM9oM75Ya)=ueIyavB4Ld~M3tX?T z2_>}zQGY%%5$y%$MmfS8IK3KS00Y3xeDAPjYqvJRzzh-HPwddWi&EwNcSe+Zdq_`B zKPZSOi`^fzbc%a$aOAW~&0?b70WC_Yv2!~BH#$mV9yZW3X;0~}*rfEz z^rVCxj7^ywfsI@r%2PC7oth6m>bi=LcIOSH0GQQQUp7sVC0IwBFD^cMc<(M+rW2OBMCT;qYDqj8w!GWDB5bwyxb`}=s4cG zM*&#w3<<9XPXXGOxSI~_?sC3?tG~zm!bpgg+Cd=YAlKE`ZjMdSlq=WO*Q#>=%R-K* z&T8qLu!kX*N0>g4YppL8nG1MuA7wK_fer`L5Wq90E_nqs0*$kGV=}Wvzh)}NywdZi z7S^8Sl55LF-|BZptMM~hx8BS9SEJZ4=N3QPm^^&%oD85MPX;D#oSXn8rXy_9gE2TT z2Ur2tOL@7ROMpMz|7D7Ji#&RcV8C{)1#r!YeMgaV;PY9`Q5>KiahBAQ*~_n|j^ z_1Dk_z=+iI4R8R?Ai^OlDwK7GXAiquzdj$zpWZj(t!+x3fUT!?1hVX5-GVA9eSkbSJb% zMNLS|oA{#`mg%Yve$%%u&nqUL8o@+6&{e-+t>{Z~Z&JOi%%< z2k0Syr6>An{}eTk0PeR0^d@3ps0x|m_2;(H>N~!@zb95t9v3QOO$=F^h;j`~bT@ZK z_DTU{Ts0MQNa9DonHWfFb-{+gNP)#Fe#W9rd4 z)Yptb$#G1O69)WQb9-OY4~Mf4vw-kMh0PW{m-!1%*ju)zr^PW(yy!*^bAaz4ljLqA zKW}%6C^npFwB{d^6M4rkdsF_pQ|vDwV{xVhr;(XO6~=u#rQ853>kN4HB+xerI92vr zi@d0jWGH|Qcb&0YiuB7pD+9p`HtXD#I0yX{YYjgP)ol!||y@9w0IrSxXVH{P&s!2Xj*Ji2pT)X@nk7Hmz< zYYAr{Txd<9w)pw}jFbv3#{vb>qvAhsb7`5NcAht+tCP2n%APVHj`b(cJskg;hXbOO z?HCdeKq)-2qCDyeS)^Nji^Tv30zshIV`SH45f6XcbSGlioz86jY_{R~TzyviW~@Ev zGzRQ=lD2MQf9~0RTm=xqh9EuDBP`ytJWHh3R`?<10^T;*f&31fq z)X$MB5(3<0+&rYDdgEkR()wq!+}NC$SeoeTiEB7s^KhKUCfPtv(;et2T@ct<(=BWP1tt7xgTw-bl@~|U5!I6 z4pBMgRXgA@0>3dI+L2f&X{E#KC+#U!&nKenk;>5asTk*F61*>^%{Rzd=Ls^ml#vY1`077gaDfT-4(PiB^u@La{ZbkVT5A?(XHI- zuX^o+j5r-Y@-%j{QR7dafi|QYmWyf^Fkte{mA2AZps&$EVrEZ0m=Vmvh=FZ3>R8}( zmm(&1*w$1mwxjbC2?n6PN7ec!If5LccBz#+^iSiNI}p*-xy)V@uDp;wD-eH0%*D0h zjjC37bl|DhvJ=U>EIj54&*n4350AK`$M_*(^z&;>n|avzk6_EA3$@p6P!_2<(Rtb`(X%o6@$xE1Z-* z6~z=}P|za}4wtN;$62+XLaSjp$eFq?W4>0trVo+Rs&PkoR+10LOUV_Ep9hrb##f~# zFGI2qE_twxvy5Y%t@+j`J=BlNvPFYFoBipdr^MPGW!!m9)T7f5$@QB1zH~J0g$oGJ zv<6zU-;(>7-YDI27~A^d0023?yH{Vi*bQ5&a(BP0J8g5#ZuXeEIE52m6@9=is4Z#u zo8tSOMY7}u6uBSyMP3F@+5de+6dzGlm+k1bO>dNGE2mum|{jWcy zBP;sv1dm=>{E`TC(TH;A2%WwMNFe6;VNqCH9Iku!J(!*K45pJ|!hJD~sLd3ex z^MbOZ_Ot5TDL%0~Pls+z`k*(Q9e8g2JvMs^caJs%JQ_d+I3GA~0aah?&}?#QuT@11 z^s-$09}&NIIkCwC^bDk?;zI~(gmmwhS>O}-?Y#bkBErQ=YO zuRELY5RTSl<@DegF=z`QrG(0^v>jg9wWH9|dJU8Rf%p{9nBT;;9$Y8n0FTs&^1l#a z$H~e)M(ys(0ERtcd5lNTG1OehNzU#vJ1e(`69ffH4h%bCmFM!i-SWB2t7h3>q+wWc zRn(S|Y$7zd6{p{X;f0mNh4B>N_86SlaC%y?^{F`VRd(cFGvwL4mi+AA-$)V*CEUfm zRdrRW?Mqh@2j=wz10%=0R*)=%KTwA(gaUjCP4e6vvh}mW-8HRaTzPq`w>qoVVg zAx){=x4RvX)6H6&aruwiv-g`g+7Dx9*bh#4ey`q<>ir9FXb~@<+CNFZKTMqvd%b7O zuannGhZM;6lglB8%ATpt8H_~TB=-4 z3Y)BELPN3onRL*1Qo~QCN}Ir8nIHsNGNb1MBR2ZNW&uV7yCs zV^IEqpCV9f!e`h2Qcb4}==@}@-%&ku`A;Z=Z8%iNULdPCb(p9^c(Wm5l#QE#xrR%`X+H*gQn@y!M=V z6d@K#WlsnKnUA5c?=7F70kHMf<=L zE#AX{dDr$0RW}mhl^e>I0rm{1H#gqNLocH-!phgPCbl%Y^4UFa?3He$+_RpnU2L#7Zol-x)NYSE=sQG45f>r6O#8khyIa1J&ZZ7HzIsK z0AKMVu_U;lQ^x}$!MoLFFwOU-RWMF5mZPqp!E2h*6~(9`izVfq>X9pf=;sj`Vp7@m zI$rF_ir{Dxm(;vjzsmXij1gfBD?%494tHy*U(8Zv6`5;HIm?`T8y@jl`g*zSb@BiN zTR2%$^A^bA;G}5=)NGmB&7kPCq~bfbd&&F+Ncar1lH{p5xEm@W(vl_DnCBzu;thy> zekD^kdcTdQHJnlAk(q`6abZWTUnYmSPZr=wj3gf#Pnas*RaWja?$N2^&<0EGY9pJV z5mT{{j;tkBrkxpnEOBn0Ox0BDq; z@Wq=p;m=QNowYOK$(467nhgEce4xI*9m`312@*Z;C^5?m+kEY0bW1ktVdx8nRE%F8 zUZLCJ+c|rz<3nfq#=ec)Mf$t#D3Rq{C2d)kawsR8{18&&*t@rLo*srMJ%)5IU z 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ⅅ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
Fv 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≥}>pVJ4D2U#0E#t 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 =pGy33r}HQp!t1u*F!3R)r$KBoaFI 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 vO@f-O)wNl7MgPwR{{IJz{}vq(Ft%VR Date: Fri, 30 May 2025 10:51:55 +0200 Subject: [PATCH 5/8] fix typo in README Co-authored-by: elsapet --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9c369b9..f215f831 100644 --- a/README.md +++ b/README.md @@ -210,7 +210,7 @@ export CYCODE_CLIENT_SECRET={your Cycode Secret Key} Cycode’s pre-commit hook can be set up within your local repository so that the Cycode CLI application will identify any issues with your code automatically before you commit it to your codebase. > [!NOTE] -> pre-commit hook is not available to IaC scans. +> pre-commit hook is not available for IaC scans. Perform the following steps to install the pre-commit hook: From 719e37605a592c7c3001e7c0a4f1358955a92540 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Wed, 4 Jun 2025 16:30:01 +0200 Subject: [PATCH 6/8] fix arg name --- cycode/cli/apps/scan/commit_history/commit_history_command.py | 2 +- cycode/cli/apps/scan/pre_receive/pre_receive_command.py | 2 +- cycode/cli/apps/scan/scan_ci/scan_ci_command.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cycode/cli/apps/scan/commit_history/commit_history_command.py b/cycode/cli/apps/scan/commit_history/commit_history_command.py index fbc88cb6..5935cf59 100644 --- a/cycode/cli/apps/scan/commit_history/commit_history_command.py +++ b/cycode/cli/apps/scan/commit_history/commit_history_command.py @@ -28,6 +28,6 @@ def commit_history_command( add_breadcrumb('commit_history') logger.debug('Starting commit history scan process, %s', {'path': path, 'commit_range': commit_range}) - scan_commit_range(ctx, path=str(path), commit_range=commit_range) + scan_commit_range(ctx, repo_path=str(path), commit_range=commit_range) except Exception as e: handle_scan_exception(ctx, e) diff --git a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py index 5eaf133c..ef30ee8f 100644 --- a/cycode/cli/apps/scan/pre_receive/pre_receive_command.py +++ b/cycode/cli/apps/scan/pre_receive/pre_receive_command.py @@ -57,7 +57,7 @@ def pre_receive_command( scan_commit_range( ctx=ctx, - path=os.getcwd(), + repo_path=os.getcwd(), commit_range=commit_range, max_commits_count=configuration_manager.get_pre_receive_max_commits_to_scan_count(command_scan_type), ) diff --git a/cycode/cli/apps/scan/scan_ci/scan_ci_command.py b/cycode/cli/apps/scan/scan_ci/scan_ci_command.py index afa5d827..4303cda2 100644 --- a/cycode/cli/apps/scan/scan_ci/scan_ci_command.py +++ b/cycode/cli/apps/scan/scan_ci/scan_ci_command.py @@ -17,4 +17,4 @@ @click.pass_context def scan_ci_command(ctx: typer.Context) -> None: add_breadcrumb('ci') - scan_commit_range(ctx, path=os.getcwd(), commit_range=get_commit_range()) + scan_commit_range(ctx, repo_path=os.getcwd(), commit_range=get_commit_range()) From ba83554808ee7adb515e856aa61db3e549e83617 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Tue, 10 Jun 2025 14:47:21 +0200 Subject: [PATCH 7/8] fix parsing of commit ranges --- cycode/cli/apps/scan/commit_range_scanner.py | 10 ++-- .../files_collector/commit_range_documents.py | 46 +++++++++++++++++-- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py index 8a3ce19b..0933f998 100644 --- a/cycode/cli/apps/scan/commit_range_scanner.py +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -24,7 +24,8 @@ get_diff_file_content, get_diff_file_path, get_pre_commit_modified_documents, - parse_commit_range, + parse_commit_range_sast, + parse_commit_range_sca, ) from cycode.cli.files_collector.file_excluder import excluder from cycode.cli.files_collector.models.in_memory_zip import InMemoryZip @@ -173,7 +174,7 @@ def _scan_commit_range_documents( def _scan_sca_commit_range(ctx: typer.Context, repo_path: str, commit_range: str, **_) -> None: scan_parameters = get_scan_parameters(ctx, (repo_path,)) - from_commit_rev, to_commit_rev = parse_commit_range(commit_range, repo_path) + from_commit_rev, to_commit_rev = parse_commit_range_sca(commit_range, repo_path) from_commit_documents, to_commit_documents, _ = get_commit_range_modified_documents( ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path, from_commit_rev, to_commit_rev ) @@ -203,8 +204,9 @@ def _scan_secret_commit_range( def _scan_sast_commit_range(ctx: typer.Context, repo_path: str, commit_range: str, **_) -> None: scan_parameters = get_scan_parameters(ctx, (repo_path,)) - from_commit_rev, to_commit_rev = parse_commit_range(commit_range, repo_path) - _, commit_documents, diff_documents = get_commit_range_modified_documents( + from_commit_rev, to_commit_rev = parse_commit_range_sast(commit_range, repo_path) + # we are using from_commit_documents here because of flipped mess with R=True, differences in parsing commit ranges + commit_documents, _, diff_documents = get_commit_range_modified_documents( ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path, from_commit_rev, to_commit_rev ) commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, commit_documents) diff --git a/cycode/cli/files_collector/commit_range_documents.py b/cycode/cli/files_collector/commit_range_documents.py index 62f14d22..2fd8ccc5 100644 --- a/cycode/cli/files_collector/commit_range_documents.py +++ b/cycode/cli/files_collector/commit_range_documents.py @@ -236,9 +236,12 @@ def get_pre_commit_modified_documents( return git_head_documents, pre_committed_documents, diff_documents -def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: - from_commit_rev = None - to_commit_rev = None +def parse_commit_range_sca(commit_range: str, path: str) -> tuple[Optional[str], Optional[str]]: + # FIXME(MarshalX): i truly believe that this function does NOT work as expected + # it does not handle cases like 'A..B' correctly + # i leave it as it for SCA to not break anything + # the more correct approach is implemented for SAST + from_commit_rev = to_commit_rev = None for commit in git_proxy.get_repo(path).iter_commits(rev=commit_range): if not to_commit_rev: @@ -246,3 +249,40 @@ def parse_commit_range(commit_range: str, path: str) -> tuple[str, str]: from_commit_rev = commit.hexsha return from_commit_rev, to_commit_rev + + +def parse_commit_range_sast(commit_range: str, path: str) -> tuple[Optional[str], Optional[str]]: + """Parses a git commit range string and returns the full SHAs for the 'from' and 'to' commits. + + Supports: + - 'from..to' + - 'from...to' + - 'commit' (interpreted as 'commit..HEAD') + - '..to' (interpreted as 'HEAD..to') + - 'from..' (interpreted as 'from..HEAD') + """ + repo = git_proxy.get_repo(path) + + if '...' in commit_range: + from_spec, to_spec = commit_range.split('...', 1) + elif '..' in commit_range: + from_spec, to_spec = commit_range.split('..', 1) + else: + # Git commands like 'git diff ' compare against HEAD. + from_spec = commit_range + to_spec = 'HEAD' + + # If a spec is empty (e.g., from '..master'), default it to 'HEAD' + if not from_spec: + from_spec = 'HEAD' + if not to_spec: + to_spec = 'HEAD' + + try: + # Use rev_parse to resolve each specifier to its full commit SHA + from_commit_rev = repo.rev_parse(from_spec).hexsha + to_commit_rev = repo.rev_parse(to_spec).hexsha + return from_commit_rev, to_commit_rev + except git_proxy.get_git_command_error() as e: + logger.warning("Failed to parse commit range '%s'", commit_range, exc_info=e) + return None, None From 9b6229b99271e719e4fb6a50b616abbcfef625a4 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Tue, 10 Jun 2025 14:58:15 +0200 Subject: [PATCH 8/8] match logic with git cli --- cycode/cli/apps/scan/commit_range_scanner.py | 10 +++++++--- cycode/cli/files_collector/commit_range_documents.py | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/cycode/cli/apps/scan/commit_range_scanner.py b/cycode/cli/apps/scan/commit_range_scanner.py index 0933f998..b191611f 100644 --- a/cycode/cli/apps/scan/commit_range_scanner.py +++ b/cycode/cli/apps/scan/commit_range_scanner.py @@ -205,9 +205,13 @@ def _scan_sast_commit_range(ctx: typer.Context, repo_path: str, commit_range: st scan_parameters = get_scan_parameters(ctx, (repo_path,)) from_commit_rev, to_commit_rev = parse_commit_range_sast(commit_range, repo_path) - # we are using from_commit_documents here because of flipped mess with R=True, differences in parsing commit ranges - commit_documents, _, diff_documents = get_commit_range_modified_documents( - ctx.obj['progress_bar'], ScanProgressBarSection.PREPARE_LOCAL_FILES, repo_path, from_commit_rev, to_commit_rev + _, commit_documents, diff_documents = get_commit_range_modified_documents( + ctx.obj['progress_bar'], + ScanProgressBarSection.PREPARE_LOCAL_FILES, + repo_path, + from_commit_rev, + to_commit_rev, + reverse_diff=False, ) commit_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, commit_documents) diff_documents = excluder.exclude_irrelevant_documents_to_scan(consts.SAST_SCAN_TYPE, diff_documents) diff --git a/cycode/cli/files_collector/commit_range_documents.py b/cycode/cli/files_collector/commit_range_documents.py index 2fd8ccc5..68d18978 100644 --- a/cycode/cli/files_collector/commit_range_documents.py +++ b/cycode/cli/files_collector/commit_range_documents.py @@ -125,13 +125,14 @@ def get_commit_range_modified_documents( path: str, from_commit_rev: str, to_commit_rev: str, + reverse_diff: bool = True, ) -> tuple[list[Document], list[Document], list[Document]]: from_commit_documents = [] to_commit_documents = [] diff_documents = [] repo = git_proxy.get_repo(path) - diff_index = repo.commit(from_commit_rev).diff(to_commit_rev, create_patch=True, R=True) + diff_index = repo.commit(from_commit_rev).diff(to_commit_rev, create_patch=True, R=reverse_diff) modified_files_diff = [ diff for diff in diff_index if diff.change_type != consts.COMMIT_DIFF_DELETED_FILE_CHANGE_TYPE