Skip to content

Commit 69dffd0

Browse files
committed
Add manifest and input arg validation to pm.release_package()
1 parent c4de474 commit 69dffd0

File tree

4 files changed

+65
-20
lines changed

4 files changed

+65
-20
lines changed

tests/core/pm-module/test_ens_integration.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ def test_web3_ens(ens):
137137
actual_addr = ens.address('tester.eth')
138138
w3.pm.set_registry('tester.eth')
139139
assert w3.pm.registry.address == to_canonical_address(actual_addr)
140-
w3.pm.release_package('pkg', 'v1', 'website.com')
141-
pkg_name, version, manifest_uri = w3.pm.get_release_data('pkg', 'v1')
142-
assert pkg_name == 'pkg'
143-
assert version == 'v1'
144-
assert manifest_uri == 'website.com'
140+
w3.pm.release_package('owned', '1.0.0', 'ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW')
141+
pkg_name, version, manifest_uri = w3.pm.get_release_data('owned', '1.0.0')
142+
assert pkg_name == 'owned'
143+
assert version == '1.0.0'
144+
assert manifest_uri == 'ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW'

tests/core/pm-module/test_registry_integration.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def test_pm_set_solidity_registry(empty_sol_registry, fresh_w3):
6262
def test_pm_must_set_registry_before_all_registry_interaction_functions(fresh_w3):
6363
with pytest.raises(PMError):
6464
fresh_w3.pm.release_package(
65-
"package", "1.0.0", "ipfs://Qme4otpS88NV8yQi8TfTP89EsQC5bko3F5N1yhRoi6cwGe"
65+
"package", "1.0.0", "ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW"
6666
)
6767
with pytest.raises(PMError):
6868
fresh_w3.pm.get_release_id_data(b"invalid_release_id")
@@ -88,21 +88,21 @@ def test_pm_must_set_registry_before_all_registry_interaction_functions(fresh_w3
8888
def test_pm_release_package(registry_getter, w3):
8989
w3.pm.registry = registry_getter
9090
w3.pm.release_package(
91-
"package123", "1.0.0", "ipfs://Qme4otpS88NV8yQi8TfTP89EsQC5bko3F5N1yhRoi6cwGE"
91+
"escrow", "1.0.0", "ipfs://QmPDwMHk8e1aMEZg3iKsUiPSkhHkywpGB3KHKM52RtGrkv"
9292
)
9393
w3.pm.release_package(
94-
"package456", "1.0.0", "ipfs://Qme4otpS88NV8yQi8TfTP89EsQC5bko3F5N1yhRoi6cwGI"
94+
"owned", "1.0.0", "ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW"
9595
)
96-
release_id_1 = w3.pm.get_release_id("package123", "1.0.0")
97-
release_id_2 = w3.pm.get_release_id("package456", "1.0.0")
96+
release_id_1 = w3.pm.get_release_id("escrow", "1.0.0")
97+
release_id_2 = w3.pm.get_release_id("owned", "1.0.0")
9898
package_data_1 = w3.pm.get_release_id_data(release_id_1)
9999
package_data_2 = w3.pm.get_release_id_data(release_id_2)
100-
assert package_data_1[0] == "package123"
100+
assert package_data_1[0] == "escrow"
101101
assert package_data_1[1] == "1.0.0"
102-
assert package_data_1[2] == "ipfs://Qme4otpS88NV8yQi8TfTP89EsQC5bko3F5N1yhRoi6cwGE"
103-
assert package_data_2[0] == "package456"
102+
assert package_data_1[2] == "ipfs://QmPDwMHk8e1aMEZg3iKsUiPSkhHkywpGB3KHKM52RtGrkv"
103+
assert package_data_2[0] == "owned"
104104
assert package_data_2[1] == "1.0.0"
105-
assert package_data_2[2] == "ipfs://Qme4otpS88NV8yQi8TfTP89EsQC5bko3F5N1yhRoi6cwGI"
105+
assert package_data_2[2] == "ipfs://QmbeVyFLSuEUxiXKwSsEjef6icpdTdA4kGG9BcrJXKNKUW"
106106

107107

108108
@pytest.mark.parametrize(

web3/exceptions.py

+7
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,10 @@ class PMError(Exception):
114114
Raised when an error occurs in the PM module.
115115
"""
116116
pass
117+
118+
119+
class ManifestValidationError(PMError):
120+
"""
121+
Raised when a provided manifest cannot be published, since it's invalid.
122+
"""
123+
pass

web3/pm.py

+44-6
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@
3333
Address,
3434
Manifest,
3535
)
36+
from ethpm.utils.backend import (
37+
resolve_uri_contents,
38+
)
39+
from ethpm.utils.ipfs import (
40+
is_ipfs_uri,
41+
)
42+
from ethpm.utils.manifest_validation import (
43+
validate_manifest_against_schema,
44+
validate_raw_manifest_format,
45+
)
46+
from ethpm.utils.uri import (
47+
is_valid_content_addressed_github_uri,
48+
)
3649
from ethpm.validation import (
3750
validate_package_name,
3851
validate_package_version,
@@ -44,6 +57,7 @@
4457
)
4558
from web3.exceptions import (
4659
InvalidAddress,
60+
ManifestValidationError,
4761
NameNotFound,
4862
PMError,
4963
)
@@ -463,12 +477,28 @@ def release_package(
463477
to be the registry owner.
464478
465479
* Parameters:
466-
* ``package_name``: Must be a valid package name.
467-
* ``version``: Must be a valid package version.
468-
* ``manifest_uri``: Must be a valid manifest URI.
469-
"""
470-
validate_package_name(package_name)
471-
validate_package_version(version)
480+
* ``package_name``: Must be a valid package name, matching the given manifest.
481+
* ``version``: Must be a valid package version, matching the given manifest.
482+
* ``manifest_uri``: Must be a valid content-addressed URI. Currently, only IPFS
483+
and Github content-addressed URIs are supported.
484+
"""
485+
validate_is_supported_manifest_uri(manifest_uri)
486+
raw_manifest = to_text(resolve_uri_contents(manifest_uri))
487+
validate_raw_manifest_format(raw_manifest)
488+
manifest = json.loads(raw_manifest)
489+
validate_manifest_against_schema(manifest)
490+
if package_name != manifest['package_name']:
491+
raise ManifestValidationError(
492+
f"Provided package name: {package_name} does not match the package name "
493+
f"found in the manifest: {manifest['package_name']}."
494+
)
495+
496+
if version != manifest['version']:
497+
raise ManifestValidationError(
498+
f"Provided package version: {version} does not match the package version "
499+
f"found in the manifest: {manifest['version']}."
500+
)
501+
472502
self._validate_set_registry()
473503
return self.registry._release(package_name, version, manifest_uri)
474504

@@ -597,6 +627,14 @@ def get_solidity_registry_manifest() -> Dict[str, Any]:
597627
return json.loads((ASSETS_DIR / "registry" / "1.0.0.json").read_text())
598628

599629

630+
def validate_is_supported_manifest_uri(uri):
631+
if not is_ipfs_uri(uri) and not is_valid_content_addressed_github_uri(uri):
632+
raise ManifestValidationError(
633+
f"URI: {uri} is not a valid content-addressed URI. "
634+
"Currently only IPFS and Github content-addressed URIs are supported."
635+
)
636+
637+
600638
@to_tuple
601639
def process_vyper_args(*args: List[str]) -> Iterable[bytes]:
602640
for arg in args:

0 commit comments

Comments
 (0)