From 937dd5555aca7276b263a6d628b23ef207e49922 Mon Sep 17 00:00:00 2001 From: Facundo Tuesca Date: Thu, 27 Feb 2025 18:00:51 +0100 Subject: [PATCH] _cli: Support local files in `verify pypi` subcommand Signed-off-by: Facundo Tuesca --- CHANGELOG.md | 5 + README.md | 15 ++- src/pypi_attestations/_cli.py | 96 +++++++++----- test/assets/sigstore-3.6.1.tar.gz | Bin 0 -> 80342 bytes test/assets/sigstore-3.6.1.tar.gz.provenance | 1 + test/test_cli.py | 126 +++++++++++++------ 6 files changed, 168 insertions(+), 75 deletions(-) create mode 100644 test/assets/sigstore-3.6.1.tar.gz create mode 100644 test/assets/sigstore-3.6.1.tar.gz.provenance diff --git a/CHANGELOG.md b/CHANGELOG.md index 830b5c3..a871c33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 specified with a `pypi:` prefix followed by the filename, e.g: `pypi:sampleproject-1.0.0.tar.gz`. The old way (passing the direct URL) is still supported. +- The CLI subcommand `verify pypi` now supports passing the local paths + to the artifact and its provenance file, allowing the user to verify + files already downloaded from PyPI. The artifact path is passed as + usual, whereas the provenance file path is passed using the + `--provenance-file` option. ## [0.0.21] diff --git a/README.md b/README.md index e7bbfc1..6be1216 100644 --- a/README.md +++ b/README.md @@ -142,16 +142,23 @@ pypi-attestations verify attestation \ ### Verifying a PyPI package > [!NOTE] -> The package to verify can be passed either as a `pypi:` prefixed filename (e.g: -> 'pypi:sampleproject-1.0.0-py3-none-any.whl'), or as a direct URL -> to the artifact hosted by PyPI. +> The package to verify can be passed either as a path to a local file, a +> `pypi:` prefixed filename (e.g: 'pypi:sampleproject-1.0.0-py3-none-any.whl'), +> or as a direct URL to the artifact hosted by PyPI. + ```bash +# Download the artifact (and its provenance) from PyPI and verify it pypi-attestations verify pypi --repository https://github.com/sigstore/sigstore-python \ pypi:sigstore-3.6.1-py3-none-any.whl -# or alternatively: +# or alternatively, using the direct URL: pypi-attestations verify pypi --repository https://github.com/sigstore/sigstore-python \ https://files.pythonhosted.org/packages/70/f5/324edb6a802438e97e289992a41f81bb7a58a1cda2e49439e7e48896649e/sigstore-3.6.1-py3-none-any.whl + +# Verify the artifact and its provenance using local files +pypi-attestations verify pypi --repository https://github.com/sigstore/sigstore-python \ + --provenance-file ~/Downloads/sigstore-3.6.1-py3-none-any.whl.provenance \ + ~/Downloads/sigstore-3.6.1-py3-none-any.whl ``` This command downloads the artifact and its provenance from PyPI. The artifact diff --git a/src/pypi_attestations/_cli.py b/src/pypi_attestations/_cli.py index aa79309..0d002e5 100644 --- a/src/pypi_attestations/_cli.py +++ b/src/pypi_attestations/_cli.py @@ -157,6 +157,12 @@ def _parser() -> argparse.ArgumentParser: help="Use the staging environment", ) + verify_pypi_command.add_argument( + "--provenance-file", + type=Path, + help="Provide the provenance file instead of downloading it from PyPI", + ) + inspect_command = subcommands.add_parser( name="inspect", help="Inspect one or more inputs", @@ -233,9 +239,33 @@ def _download_file(url: str, dest: Path) -> None: _die(f"Error downloading file: {e}") -def _get_direct_url_from_arg(arg: str) -> URIReference: +def _get_distribution_from_arg(arg: str) -> Distribution: """Parse the artifact argument for the `verify pypi` subcommand. + The argument can be: + - A pypi: prefixed filename (e.g. pypi:sampleproject-1.0.0.tar.gz) + - A direct URL to a PyPI-hosted artifact + - A path to a local file + """ + if arg.startswith("pypi:") or arg.startswith("https://"): + pypi_url = _get_direct_url_from_arg(arg) + dist_filename = pypi_url.path.split("/")[-1] + with TemporaryDirectory() as temp_dir: + dist_path = Path(temp_dir) / dist_filename + _download_file(url=pypi_url.unsplit(), dest=dist_path) + dist = Distribution.from_file(dist_path) + else: + dist_path = Path(arg) + if not dist_path.exists(): + _die(f"File does not exist: {dist_path}") + dist = Distribution.from_file(dist_path) + + return dist + + +def _get_direct_url_from_arg(arg: str) -> URIReference: + """Get the URL from the artifact argument for the `verify pypi` subcommand. + The argument can be: - A pypi: prefixed filename (e.g. pypi:sampleproject-1.0.0.tar.gz) - A direct URL to a PyPI-hosted artifact @@ -288,17 +318,14 @@ def _get_direct_url_from_arg(arg: str) -> URIReference: return pypi_url -def _get_provenance_from_pypi(filename: str) -> Provenance: +def _get_provenance_from_pypi(dist: Distribution) -> Provenance: """Use PyPI's integrity API to get a distribution's provenance.""" - try: - if filename.endswith(".tar.gz") or filename.endswith(".zip"): - name, version = parse_sdist_filename(filename) - elif filename.endswith(".whl"): - name, version, _, _ = parse_wheel_filename(filename) - else: - _die("URL should point to a wheel (*.whl) or a source distribution (*.zip or *.tar.gz)") - except (InvalidSdistFilename, InvalidWheelFilename) as e: - _die(f"Invalid distribution filename: {e}") + filename = dist.name + # Filename is already validated when creating the Distribution object + if filename.endswith(".tar.gz") or filename.endswith(".zip"): + name, version = parse_sdist_filename(filename) + else: + name, version, _, _ = parse_wheel_filename(filename) provenance_url = f"https://pypi.org/integrity/{name}/{version}/{filename}/provenance" response = requests.get(provenance_url) @@ -480,31 +507,34 @@ def _verify_attestation(args: argparse.Namespace) -> None: def _verify_pypi(args: argparse.Namespace) -> None: """Verify a distribution hosted on PyPI. - The distribution is downloaded and verified. The verification is against - the provenance file hosted on PyPI (if any), and against the repository URL - passed by the user as a CLI argument. + The distribution is downloaded (if needed) and verified. The verification is against + the provenance file (passed using the `--provenance-file` option, or downloaded + from PyPI if not provided), and against the repository URL passed by the user + as a CLI argument. """ - pypi_url = _get_direct_url_from_arg(args.distribution_file) + dist = _get_distribution_from_arg(args.distribution_file) - with TemporaryDirectory() as temp_dir: - dist_filename = pypi_url.path.split("/")[-1] - dist_path = Path(temp_dir) / dist_filename - _download_file(url=pypi_url.unsplit(), dest=dist_path) - provenance = _get_provenance_from_pypi(dist_filename) - dist = Distribution.from_file(dist_path) + if args.provenance_file is None: + provenance = _get_provenance_from_pypi(dist) + else: + if not args.provenance_file.exists(): + _die(f"Provenance file does not exist: {args.provenance_file}") try: - for attestation_bundle in provenance.attestation_bundles: - publisher = attestation_bundle.publisher - _check_repository_identity( - expected_repository_url=args.repository, publisher=publisher - ) - policy = publisher._as_policy() # noqa: SLF001. - for attestation in attestation_bundle.attestations: - attestation.verify(policy, dist, staging=args.staging) - except VerificationError as verification_error: - _die(f"Verification failed for {dist_filename}: {verification_error}") - - _logger.info(f"OK: {dist_filename}") + provenance = Provenance.model_validate_json(args.provenance_file.read_bytes()) + except ValidationError as validation_error: + _die(f"Invalid provenance: {validation_error}") + + try: + for attestation_bundle in provenance.attestation_bundles: + publisher = attestation_bundle.publisher + _check_repository_identity(expected_repository_url=args.repository, publisher=publisher) + policy = publisher._as_policy() # noqa: SLF001. + for attestation in attestation_bundle.attestations: + attestation.verify(policy, dist, staging=args.staging) + except VerificationError as verification_error: + _die(f"Verification failed for {dist.name}: {verification_error}") + + _logger.info(f"OK: {dist.name}") def main() -> None: diff --git a/test/assets/sigstore-3.6.1.tar.gz b/test/assets/sigstore-3.6.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fb36a610e48f6a15a60eabd15fde8157d1b7e7ad GIT binary patch literal 80342 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 z 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 VAP@)y0)g;$@dp}0CEft=1ppP87?uD4 literal 0 HcmV?d00001 diff --git a/test/assets/sigstore-3.6.1.tar.gz.provenance b/test/assets/sigstore-3.6.1.tar.gz.provenance new file mode 100644 index 0000000..673b7f2 --- /dev/null +++ b/test/assets/sigstore-3.6.1.tar.gz.provenance @@ -0,0 +1 @@ +{"attestation_bundles":[{"attestations":[{"envelope":{"signature":"MEUCIQDMIOMtnfp8Sh5OmmuWUjteQueY9w0weYye1542/61bCgIgay9OlFBHW7ykJP7/Cnitk59eNDAPcvK9+unlCaceKwo=","statement":"eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCJzdWJqZWN0IjpbeyJuYW1lIjoic2lnc3RvcmUtMy42LjEudGFyLmd6IiwiZGlnZXN0Ijp7InNoYTI1NiI6ImVlNjBmZGM5MjM2ZmQ2NzA5MjcxYWQ1M2I0NDAyNzQ2MTM2MGMzZmRlMTU1ZDJhZjE1NDgyZTRjNDUxZmY4NjUifX1dLCJwcmVkaWNhdGVUeXBlIjoiaHR0cHM6Ly9kb2NzLnB5cGkub3JnL2F0dGVzdGF0aW9ucy9wdWJsaXNoL3YxIiwicHJlZGljYXRlIjpudWxsfQ=="},"verification_material":{"certificate":"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","transparency_entries":[{"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiZHNzZSIsInNwZWMiOnsiZW52ZWxvcGVIYXNoIjp7ImFsZ29yaXRobSI6InNoYTI1NiIsInZhbHVlIjoiMjM4OWMxOGMxMmY2YmYxOTQyNmM5YTZmNzEwNDUzZjMwNTAyNzNhNTE1MzY0MDVkYTJmOTE2NjUxYzJiZjdmNyJ9LCJwYXlsb2FkSGFzaCI6eyJhbGdvcml0aG0iOiJzaGEyNTYiLCJ2YWx1ZSI6IjdiZDYxODAwNWExNDIxMjViYjk5YzBjYmIwMjgzYjc2ODg1MjI2MmFkOGRiZjYzN2ViZTM4Zjc2MWVmYzRjZWEifSwic2lnbmF0dXJlcyI6W3sic2lnbmF0dXJlIjoiTUVVQ0lRRE1JT010bmZwOFNoNU9tbXVXVWp0ZVF1ZVk5dzB3ZVl5ZTE1NDIvNjFiQ2dJZ2F5OU9sRkJIVzd5a0pQNy9Dbml0azU5ZU5EQVBjdks5K3VubENhY2VLd289IiwidmVyaWZpZXIiOiJMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VjeVZFTkRRbXdyWjBGM1NVSkJaMGxWWldsbGRVdFFUU3QzZEVOa2JFdEZkVTgyYmxJNGN6aExjR3RqZDBObldVbExiMXBKZW1vd1JVRjNUWGNLVG5wRlZrMUNUVWRCTVZWRlEyaE5UV015Ykc1ak0xSjJZMjFWZFZwSFZqSk5ValIzU0VGWlJGWlJVVVJGZUZaNllWZGtlbVJIT1hsYVV6RndZbTVTYkFwamJURnNXa2RzYUdSSFZYZElhR05PVFdwUmVFMXFSVFZOVkdOM1QxUlZlbGRvWTA1TmFsRjRUV3BGTlUxVVkzaFBWRlY2VjJwQlFVMUdhM2RGZDFsSUNrdHZXa2w2YWpCRFFWRlpTVXR2V2tsNmFqQkVRVkZqUkZGblFVVkJTMWR6UkhGNVkyVktjMmwyTVRodlRIcHZaVTFGWm1aMVpXaEZTbEpFU0dSWldFd0tkV2xvVVM5bWNGVTNPVXR6U1VwdWVIaHZXbnBNY3pnMVVEaFZhM0JvTm5kSlVtVnVSRkozY1VJdlpVcExNazg1UzB0UFEwSllOSGRuWjFZMlRVRTBSd3BCTVZWa1JIZEZRaTkzVVVWQmQwbElaMFJCVkVKblRsWklVMVZGUkVSQlMwSm5aM0pDWjBWR1FsRmpSRUY2UVdSQ1owNVdTRkUwUlVablVWVTVNSE5uQ2pKVVNDODVRMlJ1VG5sUlkyOUlRMHBuZVZCaVpqSkJkMGgzV1VSV1VqQnFRa0puZDBadlFWVXpPVkJ3ZWpGWmEwVmFZalZ4VG1wd1MwWlhhWGhwTkZrS1drUTRkMkZCV1VSV1VqQlNRVkZJTDBKR05IZFlTVnBoWVVoU01HTklUVFpNZVRsdVlWaFNiMlJYU1hWWk1qbDBURE5PY0ZvelRqQmlNMHBzVEROT2NBcGFNMDR3WWpOS2JFeFlRalZrUjJoMlltazRkVm95YkRCaFNGWnBURE5rZG1OdGRHMWlSemt6WTNrNWVWcFhlR3haV0U1c1RHNXNkR0pGUW5sYVYxcDZDa3d6VW1oYU0wMTJaR3BOZFU1cE5IaE5SR3RIUTJselIwRlJVVUpuTnpoM1FWRkZSVXN5YURCa1NFSjZUMms0ZG1SSE9YSmFWelIxV1ZkT01HRlhPWFVLWTNrMWJtRllVbTlrVjBveFl6SldlVmt5T1hWa1IxWjFaRU0xYW1JeU1IZEdVVmxMUzNkWlFrSkJSMFIyZWtGQ1FXZFJTR050Vm5OYVYwWjZXbFJCTWdwQ1oyOXlRbWRGUlVGWlR5OU5RVVZFUWtObk5FOVVXbXBhYlZWNFRYcEZkMDVVVVRWT1YxVXlXa2ROTWxwcWFHMVpWMWw1VFRKVmVFMUVRVE5hUjBWNkNrNVhWbXRhVjFacFRVSlZSME5wYzBkQlVWRkNaemM0ZDBGUlVVVkNNVXBzWWtkV2FHTXlWWGRLWjFsTFMzZFpRa0pCUjBSMmVrRkNRbEZSV1dNeWJHNEtZek5TZG1OdFZYWmpNbXh1WXpOU2RtTnRWWFJqU0d3d1lVYzVkVTFDTkVkRGFYTkhRVkZSUW1jM09IZEJVVmxGUlVoS2JGcHVUWFprUjBadVkzazVNZ3BOZVRReVRHcEZkMDkzV1V0TGQxbENRa0ZIUkhaNlFVSkRRVkYwUkVOMGIyUklVbmRqZW05MlRETlNkbUV5Vm5WTWJVWnFaRWRzZG1KdVRYVmFNbXd3Q21GSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFIYjBkRGFYTkhRVkZSUW1jM09IZEJVV3RGV0VGNFlXRklVakJqU0UwMlRIazVibUZZVW04S1pGZEpkVmt5T1hSTU0wNXdXak5PTUdJelNteE1NMDV3V2pOT01HSXpTbXhNV0VJMVpFZG9kbUpwT0hWYU1td3dZVWhXYVV3elpIWmpiWFJ0WWtjNU13cGplVGw1V2xkNGJGbFlUbXhNYm14MFlrVkNlVnBYV25wTU0xSm9Xak5OZG1ScVRYVk9hVFI0VFVSblIwTnBjMGRCVVZGQ1p6YzRkMEZSYjBWTFozZHZDazlFYXpKWk1scHNUVlJOZUUxRVZUQlBWRlpzVG0xU2FrNXRXVFJhYlVadFRXcE9iRTFVUVhkT01sSm9UWHBXYkZwSFZteFpha0ZrUW1kdmNrSm5SVVVLUVZsUEwwMUJSVXhDUVRoTlJGZGtjR1JIYURGWmFURnZZak5PTUZwWFVYZFBkMWxMUzNkWlFrSkJSMFIyZWtGQ1JFRlJkRVJEZEc5a1NGSjNZM3B2ZGdwTU1tUndaRWRvTVZscE5XcGlNakIyWXpKc2JtTXpVblpqYlZWMll6SnNibU16VW5aamJWVjBZMGhzTUdGSE9YVk5SR2RIUTJselIwRlJVVUpuTnpoM0NrRlJNRVZMWjNkdlQwUnJNbGt5V214TlZFMTRUVVJWTUU5VVZteE9iVkpxVG0xWk5GcHRSbTFOYWs1c1RWUkJkMDR5VW1oTmVsWnNXa2RXYkZscVFXY0tRbWR2Y2tKblJVVkJXVTh2VFVGRlQwSkNTVTFGU0Vwc1dtNU5kbVJIUm01amVUa3lUWGswTWt4cVJYZEhVVmxMUzNkWlFrSkJSMFIyZWtGQ1JIZFJUQXBFUVdzd1RrUmpNazlVUlhkUFJGbDNTM2RaUzB0M1dVSkNRVWRFZG5wQlFrVkJVV1JFUW5SdlpFaFNkMk42YjNaTU1tUndaRWRvTVZscE5XcGlNakIyQ21NeWJHNWpNMUoyWTIxVmQwZEJXVXRMZDFsQ1FrRkhSSFo2UVVKRlVWRkxSRUZuTTAxVVFUVk9hazB4VFhwQ2NVSm5iM0pDWjBWRlFWbFBMMDFCUlZNS1FrWjNUVmR0YURCa1NFSjZUMms0ZGxveWJEQmhTRlpwVEcxT2RtSlRPWHBoVjJSNlpFYzVlVnBUT1hwaFYyUjZaRWM1ZVZwVE1YZGxXRkp2WWpJMGRncE1iV1J3WkVkb01WbHBPVE5pTTBweVdtMTRkbVF6VFhaamJWWnpXbGRHZWxwVE5UVmlWM2hCWTIxV2JXTjVPVEJaVjJSNlRETlpla3hxV1hWTlZFRTBDa0puYjNKQ1owVkZRVmxQTDAxQlJWUkNRMjlOUzBSbk5VNXRUbTFhVkVWNlRWUkJNVTVFYXpGYVZGcHJXWHBhYlU5SFdtaGFha2w2V2xSRmQwMUVaR3NLV1ZSTk1WcFhVbXhhVjBsM1JuZFpTMHQzV1VKQ1FVZEVkbnBCUWtaQlVVcEVRV1I1V2xkNGJGbFlUbXhOUmpoSFEybHpSMEZSVVVKbk56aDNRVkpWUlFwVlVYaFFZVWhTTUdOSVRUWk1lVGx1WVZoU2IyUlhTWFZaTWpsMFRETk9jRm96VGpCaU0wcHNURE5PY0ZvelRqQmlNMHBzVEZoQ05XUkhhSFppYVRsb0Nsa3pVbkJpTWpWNlRETktNV0p1VFhaTlZFa3dUVlJqTUUxcVFUVk5SRVYyV1ZoU01GcFhNWGRrU0UxMlRWUkJWMEpuYjNKQ1owVkZRVmxQTDAxQlJWY0tRa0ZuVFVKdVFqRlpiWGh3V1hwRFFtbG5XVXRMZDFsQ1FrRklWMlZSU1VWQloxSTRRa2h2UVdWQlFqSkJUakE1VFVkeVIzaDRSWGxaZUd0bFNFcHNiZ3BPZDB0cFUydzJORE5xZVhRdk5HVkxZMjlCZGt0bE5rOUJRVUZDYXprdmJIUlNkMEZCUVZGRVFVVmpkMUpSU1doQlR6bGhUMGRpVDBaUGVtcGlXVTR6Q2xwUmIzcFFhRTFLTDNSRlVWSkJPVUZ6VERsaGFtNU9WVzFFYURoQmFVSnFabUZPVkRaNFVHODJRWEY0YkZWWWJ6ZHVkMDluVDBsTmJXUkdOVFJ0WnpVS1ZqbEtTbnBHTTBzNFJFRkxRbWRuY1docmFrOVFVVkZFUVhkT2IwRkVRbXhCYWtGemVUbDFPRW96TUdwM1NHSkNiRE5DTXpGa0syOTNNVlJ1WlhWdlJ3cEVlSE5KYUdNelF6RXpaVWxVV1RnNFdVVmlPVWQxUnl0YVRFVk1ObEJrYzNwNk5FTk5VVU00UVRWQ1JtTnZURzVZYm13MWRFRkdWRXBITW5ndllYTnNDa1JNWTJsbmJEWjNObGRaUTJ0TlZHNVVaVWg2Y0hWMFNrbGlVbEJ1ZGtWcVFtcDJhME4xYnowS0xTMHRMUzFGVGtRZ1EwVlNWRWxHU1VOQlZFVXRMUzB0TFFvPSJ9XX19","inclusionPromise":{"signedEntryTimestamp":"MEUCIQDrulw1km4at8ZmBCBTiB1EDhtGdmx8V5hck+FzPYg7jQIgLJ4O8E4Bd9cqn7G3HotsJ+I3NiVG5W+pZv7nQDjX5bY="},"inclusionProof":{"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n34812628\n+ce/n7ywQMI84KqPfAKGKMwdivhMAlf7XwPKYBidxYM=\n\n— rekor.sigstore.dev wNI9ajBFAiAhElSyD1E0nPtdd92eidXkaRcgYtILfOA1cXk1sDbLXAIhAItjpa2bFkL5aovzA1eUjkzZ6TX/PVL4+BNl5A+BHmby\n"},"hashes":["FhoMTHbH8IjfwSy6gvgd+d/IfANzjryvXh4eZSn6AS8=","1QyyxJKYbJBZlc15TbaxmNbEfA1AHmJr70+0qyePuXg=","EN1muAli1O0UWgSvkX6qMmJK1nLTyal0aWpuaHKQ2Y4=","Nl//RhaVeQQQoM17dAQHuAIj6Dkl/vM2NFCmc2mC8/4=","DPDWnECwPD/Wh144RnYVA7yenXvJzFtdLTFt0zs1a1g=","vqBR26dbTo8QhMdNFlg3s+NZOui+7VrzrGbP0fFVOzk=","mQnBdLQrv9x7kuZzlQT93vlvWUy7sfcsVWRId4hBEtg=","naGqS2+y9kMdzxW4CDHPJAJs/s1LMscH0gAbpFEhnkc=","pUm2APk0bAEfOBQX/2qQnXBGU08yCTl7wSgiwbyA1CI=","qw2H3MqjNE1OcI8EE5kjLoaRrucguamat/hjT+fJFS0=","TtWisxkCD12d93zYhBEcavGz5i/0U8SBkxnc2qfCBvw=","vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="],"logIndex":"34812627","rootHash":"+ce/n7ywQMI84KqPfAKGKMwdivhMAlf7XwPKYBidxYM=","treeSize":"34812628"},"integratedTime":"1734628193","kindVersion":{"kind":"dsse","version":"0.0.1"},"logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"logIndex":"156716889"}]},"version":1}],"publisher":{"environment":null,"kind":"GitHub","repository":"sigstore/sigstore-python","workflow":"release.yml"}}],"version":1} diff --git a/test/test_cli.py b/test/test_cli.py index a4e7298..e025786 100644 --- a/test/test_cli.py +++ b/test/test_cli.py @@ -21,7 +21,7 @@ get_identity_token, main, ) -from pypi_attestations._impl import Attestation, AttestationError +from pypi_attestations._impl import Attestation, AttestationError, Distribution ONLINE_TESTS = "CI" in os.environ or "TEST_INTERACTIVE" in os.environ online = pytest.mark.skipif(not ONLINE_TESTS, reason="online tests not enabled") @@ -41,6 +41,8 @@ pypi_sdist_filename = pypi_sdist_url.split("/")[-1] pypi_wheel_abbrev = f"sigstore/{pypi_wheel_filename}" pypi_sdist_abbrev = f"sigstore/{pypi_sdist_filename}" +pypi_sdist_path = _ASSETS / pypi_sdist_filename +pypi_sdist_provenance_path = _ASSETS / f"{pypi_sdist_filename}.provenance" def run_main_with_command(cmd: list[str]) -> None: @@ -386,6 +388,21 @@ def test_verify_pypi_command( assert f"OK: {filename}" in caplog.text +def test_verify_pypi_command_with_local_files(caplog: pytest.LogCaptureFixture) -> None: + run_main_with_command( + [ + "verify", + "pypi", + "--repository", + "https://github.com/sigstore/sigstore-python", + "--provenance-file", + pypi_sdist_provenance_path.as_posix(), + pypi_sdist_path.as_posix(), + ] + ) + assert f"OK: {pypi_sdist_filename}" in caplog.text + + @online def test_verify_pypi_command_env_fail(caplog: pytest.LogCaptureFixture) -> None: with pytest.raises(SystemExit): @@ -461,41 +478,6 @@ def test_verify_pypi_invalid_url( assert "Unsupported/invalid URL" in caplog.text -def test_verify_pypi_invalid_file_name_url( - caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch -) -> None: - # Failure because file is neither a wheer nor a sdist - monkeypatch.setattr(pypi_attestations._cli, "_download_file", lambda url, dest: None) - with pytest.raises(SystemExit): - run_main_with_command( - [ - "verify", - "pypi", - "--repository", - "https://github.com/sigstore/sigstore-python", - pypi_wheel_url + ".invalid_ext", - ] - ) - assert ( - "URL should point to a wheel (*.whl) or a source distribution (*.zip or *.tar.gz)" - in caplog.text - ) - - caplog.clear() - - with pytest.raises(SystemExit): - run_main_with_command( - [ - "verify", - "pypi", - "--repository", - "https://github.com/sigstore/sigstore-python", - pypi_wheel_url + "/invalid-wheel-name-9.9.9-.whl", - ] - ) - assert "Invalid wheel filename" in caplog.text - - def test_verify_pypi_invalid_sdist_filename_pypi( caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch ) -> None: @@ -573,7 +555,11 @@ def test_verify_pypi_error_getting_provenance( expected_error: str, ) -> None: # Failure to get provenance from PyPI - monkeypatch.setattr(pypi_attestations._cli, "_download_file", lambda url, dest: None) + monkeypatch.setattr( + pypi_attestations._cli, + "_get_distribution_from_arg", + lambda arg: Distribution(name=pypi_wheel_filename, digest="a"), + ) response = requests.Response() response.status_code = status_code monkeypatch.setattr(requests, "get", lambda url: response) @@ -633,7 +619,11 @@ def test_verify_pypi_error_validating_provenance( monkeypatch: pytest.MonkeyPatch, ) -> None: # Failure to validate provenance JSON - monkeypatch.setattr(pypi_attestations._cli, "_download_file", lambda url, dest: None) + monkeypatch.setattr( + pypi_attestations._cli, + "_get_distribution_from_arg", + lambda arg: Distribution(name=pypi_wheel_filename, digest="a"), + ) response = stub(status_code=200, raise_for_status=lambda: None, text="not json") response.status_code = 200 monkeypatch.setattr(requests, "get", lambda url: response) @@ -716,3 +706,63 @@ def test_verify_pypi_command_invalid_repository_argument( ) assert expected_error in caplog.text + + +def test_verify_pypi_command_local_nonexistent_artifact(caplog: pytest.LogCaptureFixture) -> None: + with pytest.raises(SystemExit): + run_main_with_command( + [ + "verify", + "pypi", + "--repository", + "https://github.com/sigstore/sigstore-python", + "--provenance-file", + pypi_sdist_provenance_path.as_posix(), + "nonexistent-artifact.whl", + ] + ) + assert "File does not exist: nonexistent-artifact.whl" in caplog.text + + +def test_verify_pypi_command_local_nonexistent_provenance(caplog: pytest.LogCaptureFixture) -> None: + with pytest.raises(SystemExit): + run_main_with_command( + [ + "verify", + "pypi", + "--repository", + "https://github.com/sigstore/sigstore-python", + "--provenance-file", + "nonexistent-provenance.json", + pypi_sdist_path.as_posix(), + ] + ) + assert "Provenance file does not exist: nonexistent-provenance.json" in caplog.text + + +def test_verify_pypi_command_local_invalid_provenance( + caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr( + pypi_attestations._cli, + "_get_distribution_from_arg", + lambda arg: Distribution(name=pypi_sdist_filename, digest="a"), + ) + + with tempfile.NamedTemporaryFile(suffix=".provenance") as f: + f.write(b"not a valid provenance") + f.flush() + with pytest.raises(SystemExit): + run_main_with_command( + [ + "verify", + "pypi", + "--repository", + "https://github.com/sigstore/sigstore-python", + "--provenance-file", + f.name, + pypi_sdist_path.as_posix(), + ] + ) + + assert "Invalid provenance" in caplog.text