Skip to content

Commit d4aed1f

Browse files
committed
fail if unable to extract metadata file from wheels
1 parent 2af2cdc commit d4aed1f

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

tests/unit/forklift/test_legacy.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3076,6 +3076,55 @@ def test_upload_fails_with_unsupported_wheel_plat(
30763076
"400 Binary wheel .* has an unsupported platform tag .*", resp.status
30773077
)
30783078

3079+
def test_upload_fails_with_missing_metadata_wheel(
3080+
self, monkeypatch, pyramid_config, db_request
3081+
):
3082+
user = UserFactory.create()
3083+
pyramid_config.testing_securitypolicy(identity=user)
3084+
db_request.user = user
3085+
EmailFactory.create(user=user)
3086+
project = ProjectFactory.create()
3087+
release = ReleaseFactory.create(project=project, version="1.0")
3088+
RoleFactory.create(user=user, project=project)
3089+
3090+
temp_f = io.BytesIO()
3091+
with zipfile.ZipFile(file=temp_f, mode="w") as zfp:
3092+
zfp.writestr(
3093+
f"{project.name.lower()}-{release.version}.dist-info/METADATA",
3094+
"Fake metadata",
3095+
)
3096+
3097+
filename = f"{project.name}-{release.version}-cp34-none-any.whl"
3098+
filebody = temp_f.getvalue()
3099+
3100+
db_request.POST = MultiDict(
3101+
{
3102+
"metadata_version": "1.2",
3103+
"name": project.name,
3104+
"version": release.version,
3105+
"filetype": "bdist_wheel",
3106+
"pyversion": "cp34",
3107+
"md5_digest": hashlib.md5(filebody).hexdigest(),
3108+
"content": pretend.stub(
3109+
filename=filename,
3110+
file=io.BytesIO(filebody),
3111+
type="application/zip",
3112+
),
3113+
}
3114+
)
3115+
3116+
monkeypatch.setattr(legacy, "_is_valid_dist_file", lambda *a, **kw: True)
3117+
3118+
with pytest.raises(HTTPBadRequest) as excinfo:
3119+
legacy.file_upload(db_request)
3120+
3121+
resp = excinfo.value
3122+
3123+
assert resp.status_code == 400
3124+
assert re.match(
3125+
"400 Wheel .* does not contain the required METADATA file: .*", resp.status
3126+
)
3127+
30793128
def test_upload_updates_existing_project_name(
30803129
self, pyramid_config, db_request, metrics
30813130
):

warehouse/forklift/legacy.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1336,7 +1336,18 @@ def file_upload(request):
13361336
"platform tag '{plat}'.".format(filename=filename, plat=plat),
13371337
)
13381338

1339-
wheel_metadata_contents = _extract_wheel_metadata(temporary_filename)
1339+
try:
1340+
wheel_metadata_contents = _extract_wheel_metadata(temporary_filename)
1341+
except KeyError:
1342+
namever = wheel_info.group("namever")
1343+
metadata_filename = f"{namever}.dist-info/METADATA"
1344+
raise _exc_with_message(
1345+
HTTPBadRequest,
1346+
"Wheel '{filename}' does not contain the required "
1347+
"METADATA file: {metadata_filename}".format(
1348+
filename=filename, metadata_filename=metadata_filename
1349+
),
1350+
)
13401351
with open(temporary_filename + ".metadata", "wb") as fp:
13411352
fp.write(wheel_metadata_contents)
13421353
metadata_file_hashes = {

0 commit comments

Comments
 (0)