From 94a230f31aecf6c3b5afcd53fb469f06e43e4c2f Mon Sep 17 00:00:00 2001 From: Bagel Jr <57874654+bageljrkhanofemus@users.noreply.github.com> Date: Thu, 2 Jun 2022 11:47:01 +0530 Subject: [PATCH 01/13] add windows and mac CI --- .github/workflows/main.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e4ee512ba..7f03597f6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -4,12 +4,13 @@ on: [push, pull_request] jobs: test: - name: Test - ${{ matrix.python-version }} - runs-on: ubuntu-latest + name: Test - ${{ matrix.python-version }} - ${{matrix.os}} + runs-on: ${{matrix.os}} strategy: matrix: python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] + os: [ubuntu-latest, windows-latest, macos-latest] fail-fast: false steps: - uses: actions/checkout@v2 From 7c930cc0311e9bc0ff4c8397eca4acd086cb97cc Mon Sep 17 00:00:00 2001 From: Bagel Jr <57874654+bageljrkhanofemus@users.noreply.github.com> Date: Thu, 2 Jun 2022 12:00:08 +0530 Subject: [PATCH 02/13] update checkout and setup to v3 --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7f03597f6..adf41dc32 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,9 +13,9 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] fail-fast: false steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From 46d511998ff5c97205f1054ee046797c10fe32b5 Mon Sep 17 00:00:00 2001 From: bageljr Date: Fri, 3 Jun 2022 23:51:04 +0530 Subject: [PATCH 03/13] fix: update package tuple function --- rope/contrib/autoimport/utils.py | 41 +++++++++++++++--------- ropetest/contrib/autoimport/utilstest.py | 9 +++--- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index bb49b6a49..e91ccc159 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -6,7 +6,8 @@ from rope.base.project import Project -from .defs import ModuleCompiled, ModuleFile, ModuleInfo, Package, PackageType, Source +from .defs import (ModuleCompiled, ModuleFile, ModuleInfo, Package, + PackageType, Source) def get_package_tuple( @@ -19,34 +20,42 @@ def get_package_tuple( Returns None if not a viable package. """ package_name = package_path.name - package_source = get_package_source(package_path, project) + package_type: PackageType if package_name.startswith(".") or package_name == "__pycache__": return None - if package_path.is_file(): - if package_name.endswith(".so"): - name = package_name.split(".")[0] - return Package(name, package_source, package_path, PackageType.COMPILED) - if package_name.endswith(".py"): - stripped_name = package_path.stem - return Package( - stripped_name, package_source, package_path, PackageType.SINGLE_FILE - ) - return None if package_name.endswith((".egg-info", ".dist-info")): return None - return Package(package_name, package_source, package_path, PackageType.STANDARD) + if package_path.is_file(): + if package_name.endswith(".so"): + package_name = package_name.split(".")[0] + package_type = PackageType.COMPILED + elif package_name.endswith(".py"): + package_name = package_path.stem + package_type = PackageType.SINGLE_FILE + else: + return None + else: + package_type = PackageType.STANDARD + package_source: Source = get_package_source(package_path, project, package_name) + return Package(package_name, package_source, package_path, package_type) def get_package_source( - package: pathlib.Path, project: Optional[Project] = None + package: pathlib.Path, project: Optional[Project], name: str ) -> Source: """Detect the source of a given package. Rudimentary implementation.""" + if name in sys.builtin_module_names: + return Source.BUILTIN if project is not None and project.address in str(package): return Source.PROJECT if "site-packages" in package.parts: return Source.SITE_PACKAGE - if package.as_posix().startswith(sys.prefix): - return Source.STANDARD + if sys.version_info < (3, 10, 0): + if str(package).startswith(sys.prefix): + return Source.STANDARD + else: + if name in sys.stdlib_module_names: + return Source.STANDARD return Source.UNKNOWN diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index 423c0e754..345237c5f 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -1,28 +1,27 @@ """Tests for autoimport utility functions, written in pytest""" -import pathlib from rope.contrib.autoimport import utils from rope.contrib.autoimport.defs import Package, PackageType, Source def test_get_package_source(mod1_path, project): - assert utils.get_package_source(mod1_path, project) == Source.PROJECT + assert utils.get_package_source(mod1_path, project, "") == Source.PROJECT def test_get_package_source_not_project(mod1_path): - assert utils.get_package_source(mod1_path) == Source.UNKNOWN + assert utils.get_package_source(mod1_path, None, "") == Source.UNKNOWN def test_get_package_source_pytest(build_path): # pytest is not installed as part of the standard library # but should be installed into site_packages, # so it should return Source.SITE_PACKAGE - assert utils.get_package_source(build_path) == Source.SITE_PACKAGE + assert utils.get_package_source(build_path, None, "build") == Source.SITE_PACKAGE def test_get_package_source_typing(typing_path): - assert utils.get_package_source(typing_path) == Source.STANDARD + assert utils.get_package_source(typing_path, None, "typing") == Source.STANDARD def test_get_modname_project_no_add(mod1_path, project_path): From 1891a0fe14d161dbab2a80871ceb801ac6f38e9a Mon Sep 17 00:00:00 2001 From: bageljr Date: Sat, 4 Jun 2022 23:04:35 +0530 Subject: [PATCH 04/13] blacken --- rope/contrib/autoimport/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index e91ccc159..c54038dbd 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -6,8 +6,7 @@ from rope.base.project import Project -from .defs import (ModuleCompiled, ModuleFile, ModuleInfo, Package, - PackageType, Source) +from .defs import ModuleCompiled, ModuleFile, ModuleInfo, Package, PackageType, Source def get_package_tuple( From c34b4db87a8d63e336fea91c32083b2000ca822e Mon Sep 17 00:00:00 2001 From: bageljr Date: Sun, 5 Jun 2022 11:52:10 -0500 Subject: [PATCH 05/13] skip on windows --- ropetest/contrib/autoimport/utilstest.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index 345237c5f..f9479367a 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -1,9 +1,11 @@ """Tests for autoimport utility functions, written in pytest""" +from pytest import skip + from rope.contrib.autoimport import utils from rope.contrib.autoimport.defs import Package, PackageType, Source - +from sys import platform def test_get_package_source(mod1_path, project): assert utils.get_package_source(mod1_path, project, "") == Source.PROJECT @@ -53,6 +55,8 @@ def test_get_package_tuple_typing(typing_path): def test_get_package_tuple_compiled(zlib_path): + if platform == "windows": + skip() assert Package( "zlib", Source.STANDARD, zlib_path, PackageType.COMPILED ) == utils.get_package_tuple(zlib_path) From 4d40e7218b7a613b0f681e09c0c9c2b9cb9ec2ce Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 8 Jun 2022 22:00:28 +1000 Subject: [PATCH 06/13] Resolve merge conflict --- .github/workflows/main.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 99fefc64b..736329a2b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,12 +9,8 @@ jobs: strategy: matrix: -<<<<<<< patch-1 - python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] - os: [ubuntu-latest, windows-latest, macos-latest] -======= python-version: ['3.7', '3.8', '3.9', '3.10'] ->>>>>>> master + os: [ubuntu-latest, windows-latest, macos-latest] fail-fast: false steps: - uses: actions/checkout@v3 From 4b4f62f02651b93f363eeff0d9883289e891ace5 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Thu, 9 Jun 2022 01:51:50 +1000 Subject: [PATCH 07/13] resolve() path name Fixes temporary folder name issue in MacOS --- ropetest/reprtest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ropetest/reprtest.py b/ropetest/reprtest.py index b5abee04c..7d97f586b 100644 --- a/ropetest/reprtest.py +++ b/ropetest/reprtest.py @@ -1,8 +1,9 @@ +import pathlib import tempfile import pytest -from rope.base import libutils, resources, pyobjectsdef, pynames +from rope.base import libutils, resources, pyobjectsdef from rope.base.project import Project from ropetest import testutils @@ -27,6 +28,7 @@ def mod1(project): def test_repr_project(): with tempfile.TemporaryDirectory() as folder: + folder = pathlib.Path(folder).resolve() obj = testutils.sample_project(folder) assert isinstance(obj, Project) assert repr(obj) == f'' From b820645546aa748c492d0795add46739178c67e3 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 15 Jun 2022 00:44:02 +1000 Subject: [PATCH 08/13] Don't use nested function as this can't be pickled under certain forking configuration --- ropetest/doatest.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ropetest/doatest.py b/ropetest/doatest.py index 5f3c26db2..4731e9b86 100644 --- a/ropetest/doatest.py +++ b/ropetest/doatest.py @@ -18,20 +18,21 @@ from rope.base.oi import doa +def cve_2014_3539_attacker(data_port, payload): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect(("127.0.0.1", data_port)) + s_file = s.makefile("wb") + s_file.write(payload) + s.close() + + class DOATest(unittest.TestCase): def try_CVE_2014_3539_exploit(self, receiver, payload): # Simulated attacker writing to the socket - def attacker(data_port): - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(("127.0.0.1", data_port)) - s_file = s.makefile("wb") - s_file.write(payload) - s.close() - # Assume the attacker guesses the port correctly; 3037 is used by # default if it is available. attacker_proc = multiprocessing.Process( - target=attacker, args=(receiver.data_port,) + target=cve_2014_3539_attacker, args=(receiver.data_port, payload) ) attacker_proc.start() From 29c21c3f80bf7db7fa9d89bc6c5081723bde59f5 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 15 Jun 2022 00:53:35 +1000 Subject: [PATCH 09/13] Remove "Dump event info" section This is supposedly useful for debugging build notification to Freenode IRC, but the IRC notification itself was already removed. --- .github/workflows/main.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e852cc323..18f7e195f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,13 +24,3 @@ jobs: - name: Test with pytest run: | pytest -v - - # === NOTIFICATIONS === - # https://github.com/rectalogic/notify-irc - - name: Dump event info - if: always() - # Usually unnecessary, but insanely useful if IRC notifications fail. - run: | - cat <<"EOF" - ${{ toJSON(github.event) }} - EOF From 647b2dfc71cfe6e313adc85e610e1bf36264135a Mon Sep 17 00:00:00 2001 From: bageljr Date: Tue, 14 Jun 2022 18:53:02 -0500 Subject: [PATCH 10/13] skip fixture on windows --- ropetest/contrib/autoimport/conftest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ropetest/contrib/autoimport/conftest.py b/ropetest/contrib/autoimport/conftest.py index 7e7044032..d09e26772 100644 --- a/ropetest/contrib/autoimport/conftest.py +++ b/ropetest/contrib/autoimport/conftest.py @@ -1,7 +1,7 @@ import pathlib import pytest - +import sys from ropetest import testutils @@ -35,8 +35,6 @@ def typing_path(): yield pathlib.Path(typing.__file__) - - @pytest.fixture def build_env_path(): from build import env @@ -57,4 +55,6 @@ def build_path(): def zlib_path(): import zlib + if sys.platform == "windows": + pytest.skip() yield pathlib.Path(zlib.__file__) From 0717dc791674edbebef773a325a3e4c04e6771c8 Mon Sep 17 00:00:00 2001 From: bageljr Date: Tue, 14 Jun 2022 18:56:50 -0500 Subject: [PATCH 11/13] return None on windows --- ropetest/contrib/autoimport/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ropetest/contrib/autoimport/conftest.py b/ropetest/contrib/autoimport/conftest.py index d09e26772..119cdadf9 100644 --- a/ropetest/contrib/autoimport/conftest.py +++ b/ropetest/contrib/autoimport/conftest.py @@ -56,5 +56,5 @@ def zlib_path(): import zlib if sys.platform == "windows": - pytest.skip() + return None yield pathlib.Path(zlib.__file__) From b9561b0ae415f538f266b51d1778d1a399866416 Mon Sep 17 00:00:00 2001 From: bageljr Date: Tue, 14 Jun 2022 19:00:22 -0500 Subject: [PATCH 12/13] rename windows to win32 --- ropetest/contrib/autoimport/conftest.py | 2 +- ropetest/contrib/autoimport/utilstest.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ropetest/contrib/autoimport/conftest.py b/ropetest/contrib/autoimport/conftest.py index 119cdadf9..3aeab617e 100644 --- a/ropetest/contrib/autoimport/conftest.py +++ b/ropetest/contrib/autoimport/conftest.py @@ -55,6 +55,6 @@ def build_path(): def zlib_path(): import zlib - if sys.platform == "windows": + if sys.platform == "win32": return None yield pathlib.Path(zlib.__file__) diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index f9479367a..a5cf48bc8 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -55,7 +55,7 @@ def test_get_package_tuple_typing(typing_path): def test_get_package_tuple_compiled(zlib_path): - if platform == "windows": + if platform == "win32": skip() assert Package( "zlib", Source.STANDARD, zlib_path, PackageType.COMPILED From be03174864f4c5e131b087e2324446df96b48a18 Mon Sep 17 00:00:00 2001 From: bageljr Date: Tue, 14 Jun 2022 19:07:48 -0500 Subject: [PATCH 13/13] skip properly --- ropetest/contrib/autoimport/conftest.py | 4 +--- ropetest/contrib/autoimport/utilstest.py | 9 +++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/ropetest/contrib/autoimport/conftest.py b/ropetest/contrib/autoimport/conftest.py index 3aeab617e..c151281ea 100644 --- a/ropetest/contrib/autoimport/conftest.py +++ b/ropetest/contrib/autoimport/conftest.py @@ -1,7 +1,7 @@ import pathlib import pytest -import sys + from ropetest import testutils @@ -55,6 +55,4 @@ def build_path(): def zlib_path(): import zlib - if sys.platform == "win32": - return None yield pathlib.Path(zlib.__file__) diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index a5cf48bc8..9ba0f3ba7 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -1,11 +1,13 @@ """Tests for autoimport utility functions, written in pytest""" -from pytest import skip +from sys import platform + +import pytest from rope.contrib.autoimport import utils from rope.contrib.autoimport.defs import Package, PackageType, Source -from sys import platform + def test_get_package_source(mod1_path, project): assert utils.get_package_source(mod1_path, project, "") == Source.PROJECT @@ -54,9 +56,8 @@ def test_get_package_tuple_typing(typing_path): ) == utils.get_package_tuple(typing_path) +@pytest.mark.skipif(platform == "win32", reason="Windows doesn't have compiled modules") def test_get_package_tuple_compiled(zlib_path): - if platform == "win32": - skip() assert Package( "zlib", Source.STANDARD, zlib_path, PackageType.COMPILED ) == utils.get_package_tuple(zlib_path)