Skip to content

Commit a8bfe81

Browse files
sethmlarsondi
andauthored
Skip RECORD checks for RECORD.jws and RECORD.p7s (#18503)
* Skip RECORD checks for RECORD.jws and RECORD.p7s * Linting --------- Co-authored-by: Dustin Ingram <[email protected]>
1 parent a31fb59 commit a8bfe81

File tree

2 files changed

+160
-1
lines changed

2 files changed

+160
-1
lines changed

tests/unit/forklift/test_legacy.py

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3641,6 +3641,157 @@ def test_upload_record_does_not_warn_windows_path_separators(
36413641
assert send_email.calls == []
36423642
assert resp.status_code == 200
36433643

3644+
@pytest.mark.parametrize("exempt_filename", ["RECORD.jws", "RECORD.p7s"])
3645+
def test_upload_record_check_does_not_include_jws_p7s(
3646+
self, monkeypatch, pyramid_config, db_request, exempt_filename
3647+
):
3648+
"""
3649+
Certain filenames are required not to be included in RECORD
3650+
(RECORD.jws, RECORD.p7s) so we can't warn if they aren't included in
3651+
the RECORD.
3652+
"""
3653+
3654+
user = UserFactory.create()
3655+
pyramid_config.testing_securitypolicy(identity=user)
3656+
db_request.user = user
3657+
db_request.user_agent = "warehouse-tests/6.6.6"
3658+
EmailFactory.create(user=user)
3659+
project = ProjectFactory.create()
3660+
release = ReleaseFactory.create(project=project, version="1.0")
3661+
RoleFactory.create(user=user, project=project)
3662+
3663+
temp_f = io.BytesIO()
3664+
project_name = project.normalized_name.replace("-", "_")
3665+
with zipfile.ZipFile(file=temp_f, mode="w") as zfp:
3666+
zfp.mkdir("some-dir/") # Directories!
3667+
zfp.mkdir(f"{project_name}-{release.version}.dist-info/")
3668+
3669+
zfp.writestr(f"{project_name}-{release.version}.dist-info/METADATA", "")
3670+
zfp.writestr(
3671+
f"{project_name}-{release.version}.dist-info/{exempt_filename}", ""
3672+
)
3673+
zfp.writestr(
3674+
f"{project_name}-{release.version}.dist-info/RECORD",
3675+
dedent(
3676+
f"""\
3677+
{project_name}-{release.version}.dist-info/METADATA,
3678+
{project_name}-{release.version}.dist-info/RECORD,
3679+
""",
3680+
),
3681+
)
3682+
3683+
filename = "{}-{}-cp34-none-any.whl".format(
3684+
project.normalized_name.replace("-", "_"),
3685+
release.version,
3686+
)
3687+
filebody = temp_f.getvalue()
3688+
3689+
db_request.POST = MultiDict(
3690+
{
3691+
"metadata_version": "1.2",
3692+
"name": project.name,
3693+
"version": release.version,
3694+
"filetype": "bdist_wheel",
3695+
"pyversion": "cp34",
3696+
"md5_digest": hashlib.md5(filebody).hexdigest(),
3697+
"content": pretend.stub(
3698+
filename=filename,
3699+
file=io.BytesIO(filebody),
3700+
type="application/zip",
3701+
),
3702+
}
3703+
)
3704+
3705+
monkeypatch.setattr(
3706+
legacy, "_is_valid_dist_file", lambda *a, **kw: (True, None)
3707+
)
3708+
3709+
storage_service = pretend.stub(store=lambda path, filepath, meta: None)
3710+
db_request.find_service = lambda svc, name=None, context=None: {
3711+
IFileStorage: storage_service,
3712+
}.get(svc)
3713+
3714+
send_email = pretend.call_recorder(lambda *a, **kw: None)
3715+
monkeypatch.setattr(legacy, "send_wheel_record_mismatch_email", send_email)
3716+
3717+
resp = legacy.file_upload(db_request)
3718+
3719+
assert send_email.calls == []
3720+
assert resp.status_code == 200
3721+
3722+
@pytest.mark.parametrize("exempt_filename", ["RECORD.jws", "RECORD.p7s"])
3723+
def test_upload_record_check_exclusions_only_in_dist_info(
3724+
self,
3725+
monkeypatch,
3726+
pyramid_config,
3727+
db_request,
3728+
exempt_filename,
3729+
):
3730+
user = UserFactory.create()
3731+
pyramid_config.testing_securitypolicy(identity=user)
3732+
db_request.user = user
3733+
db_request.user_agent = "warehouse-tests/6.6.6"
3734+
EmailFactory.create(user=user)
3735+
project = ProjectFactory.create()
3736+
release = ReleaseFactory.create(project=project, version="1.0")
3737+
RoleFactory.create(user=user, project=project)
3738+
3739+
temp_f = io.BytesIO()
3740+
project_name = project.normalized_name.replace("-", "_")
3741+
with zipfile.ZipFile(file=temp_f, mode="w") as zfp:
3742+
zfp.writestr("some_file", "some_data")
3743+
zfp.writestr(f"{project_name}-{release.version}.dist-info/METADATA", "")
3744+
zfp.writestr(f"not-dist-info/{exempt_filename}", "")
3745+
zfp.writestr(
3746+
f"{project_name}-{release.version}.dist-info/RECORD",
3747+
f"{project_name}-{release.version}.dist-info/RECORD,",
3748+
)
3749+
3750+
filename = "{}-{}-cp34-none-any.whl".format(
3751+
project.normalized_name.replace("-", "_"),
3752+
release.version,
3753+
)
3754+
filebody = temp_f.getvalue()
3755+
3756+
db_request.POST = MultiDict(
3757+
{
3758+
"metadata_version": "1.2",
3759+
"name": project.name,
3760+
"version": release.version,
3761+
"filetype": "bdist_wheel",
3762+
"pyversion": "cp34",
3763+
"md5_digest": hashlib.md5(filebody).hexdigest(),
3764+
"content": pretend.stub(
3765+
filename=filename,
3766+
file=io.BytesIO(filebody),
3767+
type="application/zip",
3768+
),
3769+
}
3770+
)
3771+
3772+
monkeypatch.setattr(
3773+
legacy, "_is_valid_dist_file", lambda *a, **kw: (True, None)
3774+
)
3775+
3776+
storage_service = pretend.stub(store=lambda path, filepath, meta: None)
3777+
db_request.find_service = lambda svc, name=None, context=None: {
3778+
IFileStorage: storage_service,
3779+
}.get(svc)
3780+
3781+
send_email = pretend.call_recorder(lambda *a, **kw: None)
3782+
monkeypatch.setattr(legacy, "send_wheel_record_mismatch_email", send_email)
3783+
3784+
resp = legacy.file_upload(db_request)
3785+
assert send_email.calls == [
3786+
pretend.call(
3787+
db_request,
3788+
{user},
3789+
project_name=project.name,
3790+
filename=filename,
3791+
),
3792+
]
3793+
assert resp.status_code == 200
3794+
36443795
def test_upload_fails_with_missing_metadata_wheel(
36453796
self, monkeypatch, pyramid_config, db_request
36463797
):

warehouse/forklift/legacy.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,12 @@ def file_upload(request):
14821482
against the files listed in the RECORD. Mismatches are reported via email.
14831483
"""
14841484
record_filename = f"{name}-{version}.dist-info/RECORD"
1485+
# Files that must be missing from 'RECORD',
1486+
# so we ignore them when cross-checking.
1487+
record_exemptions = {
1488+
f"{name}-{version}.dist-info/RECORD.jws",
1489+
f"{name}-{version}.dist-info/RECORD.p7s",
1490+
}
14851491
try:
14861492
with zipfile.ZipFile(temporary_filename) as zfp:
14871493
wheel_record_contents = zfp.read(record_filename).decode()
@@ -1490,7 +1496,9 @@ def file_upload(request):
14901496
for fn, *_ in csv.reader(wheel_record_contents.splitlines())
14911497
}
14921498
zip_entries = {
1493-
fn for fn in zfp.namelist() if not _zip_filename_is_dir(fn)
1499+
fn
1500+
for fn in zfp.namelist()
1501+
if not _zip_filename_is_dir(fn) and fn not in record_exemptions
14941502
}
14951503
except (UnicodeError, KeyError, csv.Error) as e:
14961504
request.metrics.increment(

0 commit comments

Comments
 (0)