diff --git a/codecov_cli/commands/get_report_results.py b/codecov_cli/commands/get_report_results.py index bff03eab4..8f95b606d 100644 --- a/codecov_cli/commands/get_report_results.py +++ b/codecov_cli/commands/get_report_results.py @@ -4,7 +4,7 @@ import sentry_sdk from codecov_cli.helpers.args import get_cli_args -from codecov_cli.helpers.encoder import encode_slug +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.options import global_options from codecov_cli.services.report import send_reports_result_get_request from codecov_cli.types import CommandContext @@ -38,7 +38,9 @@ def get_report_results( extra_log_attributes=args, ), ) - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") send_reports_result_get_request( commit_sha=commit_sha, report_code=code, diff --git a/codecov_cli/helpers/encoder.py b/codecov_cli/helpers/encoder.py index 167a817e0..6fbce1d19 100644 --- a/codecov_cli/helpers/encoder.py +++ b/codecov_cli/helpers/encoder.py @@ -1,5 +1,8 @@ +import logging import re +logger = logging.getLogger("codecovcli") + slug_without_subgroups_regex = re.compile(r"[^/\s]+\/[^/\s]+$") slug_with_subgroups_regex = re.compile(r"[^/\s]+(\/[^/\s]+)+$") encoded_slug_regex = re.compile(r"[^:\s]+(:::[^:\s]+)*(::::[^:\s]+){1}$") @@ -14,6 +17,16 @@ def encode_slug(slug: str): return encoded_slug +def safe_encode_slug(slug): + try: + return encode_slug(slug) + except ValueError: + logger.error( + "The provided slug is invalid. Please provide a valid slug in the form owner/repo." + ) + return None + + def decode_slug(slug: str): if slug_encoded_incorrectly(slug): raise ValueError("The slug is not encoded correctly") diff --git a/codecov_cli/services/commit/__init__.py b/codecov_cli/services/commit/__init__.py index 23177b034..b9748ebaf 100644 --- a/codecov_cli/services/commit/__init__.py +++ b/codecov_cli/services/commit/__init__.py @@ -2,9 +2,11 @@ import os import typing +import click + from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers.config import CODECOV_INGEST_URL -from codecov_cli.helpers.encoder import encode_slug +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.request import ( get_token_header, log_warnings_and_errors_if_any, @@ -26,7 +28,9 @@ def create_commit_logic( fail_on_error: bool = False, args: dict = None, ): - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") sending_result = send_commit_data( commit_sha=commit_sha, parent_sha=parent_sha, diff --git a/codecov_cli/services/empty_upload/__init__.py b/codecov_cli/services/empty_upload/__init__.py index 73c73bad5..20a4bd8af 100644 --- a/codecov_cli/services/empty_upload/__init__.py +++ b/codecov_cli/services/empty_upload/__init__.py @@ -3,7 +3,9 @@ from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers.config import CODECOV_API_URL -from codecov_cli.helpers.encoder import encode_slug +import click + +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.upload_url_validation import validate_upload_service from codecov_cli.helpers.request import ( @@ -25,7 +27,9 @@ def empty_upload_logic( should_force, args, ): - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") headers = get_token_header(token) upload_url = enterprise_url or CODECOV_API_URL service_part = (git_service or "").strip() diff --git a/codecov_cli/services/report/__init__.py b/codecov_cli/services/report/__init__.py index dd51b4f8c..2fd370eb7 100644 --- a/codecov_cli/services/report/__init__.py +++ b/codecov_cli/services/report/__init__.py @@ -6,7 +6,9 @@ from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers import request from codecov_cli.helpers.config import CODECOV_API_URL, CODECOV_INGEST_URL -from codecov_cli.helpers.encoder import encode_slug +import click + +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.request import ( get_token_header, log_warnings_and_errors_if_any, @@ -30,7 +32,9 @@ def create_report_logic( fail_on_error: bool = False, args: typing.Union[dict, None] = None, ): - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") sending_result = send_create_report_request( commit_sha, code, @@ -78,7 +82,9 @@ def create_report_results_logic( fail_on_error: bool = False, args: typing.Union[dict, None] = None, ): - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") sending_result = send_reports_result_request( commit_sha=commit_sha, report_code=code, diff --git a/codecov_cli/services/upload/upload_sender.py b/codecov_cli/services/upload/upload_sender.py index db8658d3c..06c649177 100644 --- a/codecov_cli/services/upload/upload_sender.py +++ b/codecov_cli/services/upload/upload_sender.py @@ -5,11 +5,12 @@ import zlib from typing import Any, Dict +import click import sentry_sdk from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers.config import CODECOV_INGEST_URL -from codecov_cli.helpers.encoder import encode_slug +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.upload_type import ReportType from codecov_cli.helpers.upload_url_validation import validate_upload_service from codecov_cli.helpers.request import ( @@ -80,7 +81,9 @@ def send_upload_data( data["parent_commit_id"] = parent_sha data["pullid"] = pull_request_number headers = get_token_header(token) - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") upload_url = enterprise_url or CODECOV_INGEST_URL url, data = self.get_url_and_possibly_update_data( data, diff --git a/codecov_cli/services/upload_completion/__init__.py b/codecov_cli/services/upload_completion/__init__.py index a3f790719..ad6eb3ffc 100644 --- a/codecov_cli/services/upload_completion/__init__.py +++ b/codecov_cli/services/upload_completion/__init__.py @@ -3,7 +3,9 @@ from codecov_cli import __version__ as codecov_cli_version from codecov_cli.helpers.config import CODECOV_API_URL -from codecov_cli.helpers.encoder import encode_slug +import click + +from codecov_cli.helpers.encoder import safe_encode_slug from codecov_cli.helpers.upload_url_validation import validate_upload_service from codecov_cli.helpers.request import ( get_token_header, @@ -23,7 +25,9 @@ def upload_completion_logic( fail_on_error=False, args=None, ): - encoded_slug = encode_slug(slug) + encoded_slug = safe_encode_slug(slug) + if encoded_slug is None: + raise click.UsageError("The provided slug is invalid") headers = get_token_header(token) upload_url = enterprise_url or CODECOV_API_URL service_part = (git_service or "").strip()