@@ -3641,6 +3641,157 @@ def test_upload_record_does_not_warn_windows_path_separators(
3641
3641
assert send_email .calls == []
3642
3642
assert resp .status_code == 200
3643
3643
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
+
3644
3795
def test_upload_fails_with_missing_metadata_wheel (
3645
3796
self , monkeypatch , pyramid_config , db_request
3646
3797
):
0 commit comments