예제 #1
0
    def test_upload_fails_with_unsupported_wheel_plat(self, pyramid_config,
                                                      db_request, plat):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}-cp34-none-{}.whl".format(
            project.name,
            release.version,
            plat,
        )

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "bdist_wheel",
            "pyversion": "cp34",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Binary wheel for an unsupported platform."
예제 #2
0
    def test_upload_fails_without_permission(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1, permissive=False)

        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")

        filename = "{}-{}.tar.wat".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "nope!",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPForbidden):
            pypi.file_upload(db_request)
예제 #3
0
    def test_upload_fails_with_previously_used_filename(self, pyramid_config,
                                                        db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "nope!",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        db_request.db.add(Filename(filename=filename))

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 This filename has previously been used, you should use a "
            "different version."
        )
예제 #4
0
    def test_upload_fails_with_unsafe_filename(self, pyramid_config,
                                               db_request, character):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.wat".format(
            character + project.name,
            release.version,
        )

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "nope!",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == \
            "400 Cannot upload a file with '/' or '\\' in the name."
예제 #5
0
    def test_upload_fails_with_invalid_signature(self, pyramid_config,
                                                 db_request, sig):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
            "gpg_signature": pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(sig),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 PGP signature is not ASCII armored."
예제 #6
0
    def test_upload_fails_with_wrong_filename(self, pyramid_config,
                                              db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "nope-{}.tar.gz".format(release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "nope!",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 The filename for {!r} must start with {!r}.".format(
                project.name,
                pkg_resources.safe_name(project.name).lower(),
            )
        )
예제 #7
0
    def test_upload_fails_with_invalid_hash(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "nope!",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 The MD5 digest supplied does not match a digest calculated "
            "from the uploaded file."
        )
예제 #8
0
    def test_upload_fails_with_too_large_signature(self, pyramid_config,
                                                   db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "0cc175b9c0f1b6a831c399e269772661",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a"),
            ),
            "gpg_signature": pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Signature too large."
예제 #9
0
    def test_fails_without_user(self, pyramid_config, pyramid_request):
        pyramid_config.testing_securitypolicy(userid=None)

        with pytest.raises(HTTPForbidden) as excinfo:
            pypi.file_upload(pyramid_request)

        resp = excinfo.value

        assert resp.status_code == 403
        assert resp.status == (
            "403 Invalid or non-existent authentication information.")
예제 #10
0
    def test_fails_invalid_post_data(self, pyramid_config, db_request,
                                     post_data, message):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict(post_data)

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 {}".format(message)
예제 #11
0
    def test_fails_without_user(self, pyramid_config, pyramid_request):
        pyramid_config.testing_securitypolicy(userid=None)

        with pytest.raises(HTTPForbidden) as excinfo:
            pypi.file_upload(pyramid_request)

        resp = excinfo.value

        assert resp.status_code == 403
        assert resp.status == (
            "403 Invalid or non-existent authentication information."
        )
예제 #12
0
    def test_fails_invalid_post_data(self, pyramid_config, db_request,
                                     post_data, message):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict(post_data)

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 {}".format(message)
예제 #13
0
    def test_fails_invalid_version(self, pyramid_config, pyramid_request,
                                   version):
        pyramid_config.testing_securitypolicy(userid=1)
        pyramid_request.POST["protocol_version"] = version

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(pyramid_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Unknown protocol version."
예제 #14
0
    def test_fails_invalid_version(self, pyramid_config, pyramid_request,
                                   version):
        pyramid_config.testing_securitypolicy(userid=1)
        pyramid_request.POST["protocol_version"] = version

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(pyramid_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Unknown protocol version."
예제 #15
0
    def test_upload_cleans_unknown_values(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": "UNKNOWN",
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest):
            pypi.file_upload(db_request)

        assert "name" not in db_request.POST
예제 #16
0
    def test_upload_cleans_unknown_values(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": "UNKNOWN",
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest):
            pypi.file_upload(db_request)

        assert "name" not in db_request.POST
예제 #17
0
    def test_fails_with_invalid_names(self, pyramid_config, db_request, name):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": name,
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 The name {!r} is not allowed.".format(name)
예제 #18
0
    def test_upload_fails_without_file(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": "example",
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Upload payload does not have a file."
예제 #19
0
    def test_upload_fails_without_file(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": "example",
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Upload payload does not have a file."
예제 #20
0
    def test_fails_with_invalid_names(self, pyramid_config, db_request, name):
        pyramid_config.testing_securitypolicy(userid=1)
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": name,
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "a fake md5 digest",
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 The name {!r} is not allowed.".format(name)
예제 #21
0
    def test_upload_succeeds_creates_project(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()

        filename = "{}-{}.tar.gz".format("example", "1.0")

        db_request.user = user
        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": "example",
            "version": "1.0",
            "filetype": "sdist",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        storage_service = pretend.stub(store=lambda path, content: None)
        db_request.find_service = lambda svc: storage_service

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200

        # Ensure that a Project object has been created.
        project = (
            db_request.db.query(Project)
                         .filter(Project.name == "example")
                         .one()
        )

        # Ensure that a Role with the user as owner has been created.
        role = db_request.db.query(Role) \
                            .filter((Role.user == user) &
                                    (Role.project == project)) \
                            .one()
        assert role.role_name == "Owner"

        # Ensure that a Release object has been created.
        release = (
            db_request.db.query(Release)
                         .filter((Release.project == project) &
                                 (Release.version == "1.0"))
                         .one()
        )

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #22
0
    def test_upload_succeeds_creates_project(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()

        filename = "{}-{}.tar.gz".format("example", "1.0")

        db_request.user = user
        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            "example",
            "version":
            "1.0",
            "filetype":
            "sdist",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        storage_service = pretend.stub(store=lambda path, content: None)
        db_request.find_service = lambda svc: storage_service

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200

        # Ensure that a Project object has been created.
        project = (db_request.db.query(Project).filter(
            Project.name == "example").one())

        # Ensure that a Role with the user as owner has been created.
        role = db_request.db.query(Role) \
                            .filter((Role.user == user) &
                                    (Role.project == project)) \
                            .one()
        assert role.role_name == "Owner"

        # Ensure that a Release object has been created.
        release = (db_request.db.query(Release).filter(
            (Release.project == project) & (Release.version == "1.0")).one())

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #23
0
    def test_upload_fails_with_unsupported_wheel_plat(self, pyramid_config,
                                                      db_request, plat):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}-cp34-none-{}.whl".format(
            project.name,
            release.version,
            plat,
        )

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "bdist_wheel",
            "pyversion":
            "cp34",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Binary wheel for an unsupported platform."
예제 #24
0
    def test_upload_fails_with_invalid_classifier(self, pyramid_config,
                                                  db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
        ])

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 classifiers: 'Environment :: Other Environment' is not a "
            "valid choice for this field")
예제 #25
0
    def test_upload_fails_with_invalid_signature(self, pyramid_config,
                                                 db_request, sig):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
            "gpg_signature":
            pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(sig),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 PGP signature is not ASCII armored."
예제 #26
0
    def test_upload_fails_with_too_large_signature(self, pyramid_config,
                                                   db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "0cc175b9c0f1b6a831c399e269772661",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a"),
            ),
            "gpg_signature":
            pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == "400 Signature too large."
예제 #27
0
    def test_upload_fails_with_previously_used_filename(
            self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "nope!",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        db_request.db.add(Filename(filename=filename))

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 This filename has previously been used, you should use a "
            "different version.")
예제 #28
0
    def test_upload_fails_with_wrong_filename(self, pyramid_config,
                                              db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "nope-{}.tar.gz".format(release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "nope!",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 The filename for {!r} must start with {!r}.".format(
                project.name,
                pkg_resources.safe_name(project.name).lower(),
            ))
예제 #29
0
    def test_upload_fails_with_unsafe_filename(self, pyramid_config,
                                               db_request, character):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.wat".format(
            character + project.name,
            release.version,
        )

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "nope!",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == \
            "400 Cannot upload a file with '/' or '\\' in the name."
예제 #30
0
    def test_upload_fails_without_permission(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1, permissive=False)

        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")

        filename = "{}-{}.tar.wat".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "nope!",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)),
            ),
        })

        with pytest.raises(HTTPForbidden):
            pypi.file_upload(db_request)
예제 #31
0
    def test_upload_fails_with_invalid_hash(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "md5_digest":
            "nope!",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 The MD5 digest supplied does not match a digest calculated "
            "from the uploaded file.")
예제 #32
0
    def test_upload_fails_with_invalid_classifier(self, pyramid_config,
                                                  db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
        ])

        with pytest.raises(HTTPBadRequest) as excinfo:
            pypi.file_upload(db_request)

        resp = excinfo.value

        assert resp.status_code == 400
        assert resp.status == (
            "400 classifiers: 'Environment :: Other Environment' is not a "
            "valid choice for this field"
        )
예제 #33
0
    def test_upload_succeeds_with_wheel(self, tmpdir, monkeypatch,
                                        pyramid_config, db_request, plat):
        monkeypatch.setattr(tempfile, "tempdir", str(tmpdir))

        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}-cp34-none-{}.whl".format(
            project.name,
            release.version,
            plat,
        )

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "bdist_wheel",
            "pyversion":
            "cp34",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        @pretend.call_recorder
        def storage_service_store(path, file_path):
            with open(file_path, "rb") as fp:
                assert fp.read() == b"A fake file."

        storage_service = pretend.stub(store=storage_service_store)
        db_request.find_service = pretend.call_recorder(
            lambda svc: storage_service)

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200
        assert db_request.find_service.calls == [pretend.call(IFileStorage)]
        assert storage_service.store.calls == [
            pretend.call(
                os.path.join(
                    "cp34",
                    project.name[0],
                    project.name,
                    filename,
                ),
                mock.ANY,
            ),
        ]

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #34
0
    def test_successful_upload(self, tmpdir, monkeypatch, pyramid_config,
                               db_request, has_signature):
        monkeypatch.setattr(tempfile, "tempdir", str(tmpdir))

        pyramid_config.testing_securitypolicy(userid=1)
        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        db_request.db.add(
            Classifier(classifier="Environment :: Other Environment"), )

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            release.version,
            "filetype":
            "sdist",
            "pyversion":
            "source",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
        ])

        if has_signature:
            db_request.POST["gpg_signature"] = pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(b"-----BEGIN PGP SIGNATURE-----\n"
                                b" This is a Fake Signature"),
            )

        @pretend.call_recorder
        def storage_service_store(path, file_path):
            if file_path.endswith(".asc"):
                expected = (b"-----BEGIN PGP SIGNATURE-----\n"
                            b" This is a Fake Signature")
            else:
                expected = b"A fake file."

            with open(file_path, "rb") as fp:
                assert fp.read() == expected

        storage_service = pretend.stub(store=storage_service_store)
        db_request.find_service = pretend.call_recorder(
            lambda svc: storage_service)

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200
        assert db_request.find_service.calls == [pretend.call(IFileStorage)]
        assert len(storage_service.store.calls) == 2 if has_signature else 1
        assert storage_service.store.calls[0] == pretend.call(
            os.path.join(
                "source",
                project.name[0],
                project.name,
                filename,
            ),
            mock.ANY,
        )

        if has_signature:
            assert storage_service.store.calls[1] == pretend.call(
                os.path.join(
                    "source",
                    project.name[0],
                    project.name,
                    filename + ".asc",
                ),
                mock.ANY,
            )

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #35
0
    def test_successful_upload(self, tmpdir, monkeypatch, pyramid_config,
                               db_request, has_signature):
        monkeypatch.setattr(tempfile, "tempdir", str(tmpdir))

        pyramid_config.testing_securitypolicy(userid=1)
        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        db_request.db.add(
            Classifier(classifier="Environment :: Other Environment"),
        )

        filename = "{}-{}.tar.gz".format(project.name, release.version)

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "sdist",
            "pyversion": "source",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
        ])

        if has_signature:
            db_request.POST["gpg_signature"] = pretend.stub(
                filename=filename + ".asc",
                file=io.BytesIO(
                    b"-----BEGIN PGP SIGNATURE-----\n"
                    b" This is a Fake Signature"
                ),
            )

        @pretend.call_recorder
        def storage_service_store(path, file_path):
            if file_path.endswith(".asc"):
                expected = (
                    b"-----BEGIN PGP SIGNATURE-----\n"
                    b" This is a Fake Signature"
                )
            else:
                expected = b"A fake file."

            with open(file_path, "rb") as fp:
                assert fp.read() == expected

        storage_service = pretend.stub(store=storage_service_store)
        db_request.find_service = pretend.call_recorder(
            lambda svc: storage_service
        )

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200
        assert db_request.find_service.calls == [pretend.call(IFileStorage)]
        assert len(storage_service.store.calls) == 2 if has_signature else 1
        assert storage_service.store.calls[0] == pretend.call(
            os.path.join(
                "source",
                project.name[0],
                project.name,
                filename,
            ),
            mock.ANY,
        )

        if has_signature:
            assert storage_service.store.calls[1] == pretend.call(
                os.path.join(
                    "source",
                    project.name[0],
                    project.name,
                    filename + ".asc",
                ),
                mock.ANY,
            )

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #36
0
    def test_upload_succeeds_creates_release(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        RoleFactory.create(user=user, project=project)

        db_request.db.add(
            Classifier(classifier="Environment :: Other Environment"), )
        db_request.db.add(
            Classifier(classifier="Programming Language :: Python"), )

        filename = "{}-{}.tar.gz".format(project.name, "1.0")

        db_request.POST = MultiDict({
            "metadata_version":
            "1.2",
            "name":
            project.name,
            "version":
            "1.0",
            "summary":
            "This is my summary!",
            "filetype":
            "sdist",
            "md5_digest":
            "335c476dc930b959dda9ec82bd65ef19",
            "content":
            pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
            ("classifiers", "Programming Language :: Python"),
            ("requires_dist", "foo"),
            ("requires_dist", "bar (>1.0)"),
            ("project_urls", "Test, https://example.com/"),
            ("requires_external", "Cheese (>1.0)"),
            ("provides", "testing"),
        ])

        storage_service = pretend.stub(store=lambda path, content: None)
        db_request.find_service = lambda svc: storage_service

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200

        # Ensure that a Release object has been created.
        release = (db_request.db.query(Release).filter(
            (Release.project == project) & (Release.version == "1.0")).one())
        assert release.summary == "This is my summary!"
        assert release.classifiers == [
            "Environment :: Other Environment",
            "Programming Language :: Python",
        ]
        assert set(release.requires_dist) == {"foo", "bar (>1.0)"}
        assert set(release.project_urls) == {"Test, https://example.com/"}
        assert set(release.requires_external) == {"Cheese (>1.0)"}
        assert set(release.provides) == {"testing"}

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #37
0
    def test_upload_succeeds_with_wheel(self, tmpdir, monkeypatch,
                                        pyramid_config, db_request, plat):
        monkeypatch.setattr(tempfile, "tempdir", str(tmpdir))

        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        release = ReleaseFactory.create(project=project, version="1.0")
        RoleFactory.create(user=user, project=project)

        filename = "{}-{}-cp34-none-{}.whl".format(
            project.name,
            release.version,
            plat,
        )

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": release.version,
            "filetype": "bdist_wheel",
            "pyversion": "cp34",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })

        @pretend.call_recorder
        def storage_service_store(path, file_path):
            with open(file_path, "rb") as fp:
                assert fp.read() == b"A fake file."

        storage_service = pretend.stub(store=storage_service_store)
        db_request.find_service = pretend.call_recorder(
            lambda svc: storage_service
        )

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200
        assert db_request.find_service.calls == [pretend.call(IFileStorage)]
        assert storage_service.store.calls == [
            pretend.call(
                os.path.join(
                    "cp34",
                    project.name[0],
                    project.name,
                    filename,
                ),
                mock.ANY,
            ),
        ]

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()
예제 #38
0
    def test_upload_succeeds_creates_release(self, pyramid_config, db_request):
        pyramid_config.testing_securitypolicy(userid=1)

        user = UserFactory.create()
        project = ProjectFactory.create()
        RoleFactory.create(user=user, project=project)

        db_request.db.add(
            Classifier(classifier="Environment :: Other Environment"),
        )
        db_request.db.add(
            Classifier(classifier="Programming Language :: Python"),
        )

        filename = "{}-{}.tar.gz".format(project.name, "1.0")

        db_request.POST = MultiDict({
            "metadata_version": "1.2",
            "name": project.name,
            "version": "1.0",
            "summary": "This is my summary!",
            "filetype": "sdist",
            "md5_digest": "335c476dc930b959dda9ec82bd65ef19",
            "content": pretend.stub(
                filename=filename,
                file=io.BytesIO(b"A fake file."),
            ),
        })
        db_request.POST.extend([
            ("classifiers", "Environment :: Other Environment"),
            ("classifiers", "Programming Language :: Python"),
            ("requires_dist", "foo"),
            ("requires_dist", "bar (>1.0)"),
            ("project_urls", "Test, https://example.com/"),
            ("requires_external", "Cheese (>1.0)"),
            ("provides", "testing"),
        ])

        storage_service = pretend.stub(store=lambda path, content: None)
        db_request.find_service = lambda svc: storage_service

        resp = pypi.file_upload(db_request)

        assert resp.status_code == 200

        # Ensure that a Release object has been created.
        release = (
            db_request.db.query(Release)
                         .filter((Release.project == project) &
                                 (Release.version == "1.0"))
                         .one()
        )
        assert release.summary == "This is my summary!"
        assert release.classifiers == [
            "Environment :: Other Environment",
            "Programming Language :: Python",
        ]
        assert set(release.requires_dist) == {"foo", "bar (>1.0)"}
        assert set(release.project_urls) == {"Test, https://example.com/"}
        assert set(release.requires_external) == {"Cheese (>1.0)"}
        assert set(release.provides) == {"testing"}

        # Ensure that a File object has been created.
        db_request.db.query(File) \
                     .filter((File.release == release) &
                             (File.filename == filename)) \
                     .one()

        # Ensure that a Filename object has been created.
        db_request.db.query(Filename) \
                     .filter(Filename.filename == filename).one()