diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index b57666e..60d1ae2 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -25,7 +25,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install flake8 pytest pdm pytest-cov + pip install pdm make install - name: Lint with flake8 run: | diff --git a/pdm.lock b/pdm.lock index 4963324..9628ad8 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "test"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:5ed5f5bf71195df61a726a87f75338181ce662c6dc1b3b367c0e4ca6eb46a5a7" +content_hash = "sha256:6fc1ab76778cc34af6d0a37b4a039bbba80dab75c3deb696e8954234d3dd9ea4" [[metadata.targets]] requires_python = "~=3.11" @@ -172,7 +172,7 @@ name = "coverage" version = "7.6.1" requires_python = ">=3.8" summary = "Code coverage measurement for Python" -groups = ["test"] +groups = ["dev", "test"] files = [ {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, @@ -223,7 +223,7 @@ version = "7.6.1" extras = ["toml"] requires_python = ">=3.8" summary = "Code coverage measurement for Python" -groups = ["test"] +groups = ["dev", "test"] dependencies = [ "coverage==7.6.1", "tomli; python_full_version <= \"3.11.0a6\"", @@ -385,7 +385,7 @@ name = "iniconfig" version = "2.0.0" requires_python = ">=3.7" summary = "brain-dead simple config-ini parsing" -groups = ["test"] +groups = ["dev", "test"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -465,7 +465,7 @@ name = "pluggy" version = "1.5.0" requires_python = ">=3.8" summary = "plugin and hook calling mechanisms for python" -groups = ["test"] +groups = ["dev", "test"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -510,7 +510,7 @@ name = "pytest" version = "8.3.2" requires_python = ">=3.8" summary = "pytest: simple powerful testing with Python" -groups = ["test"] +groups = ["dev", "test"] dependencies = [ "colorama; sys_platform == \"win32\"", "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", @@ -529,7 +529,7 @@ name = "pytest-cov" version = "5.0.0" requires_python = ">=3.8" summary = "Pytest plugin for measuring coverage." -groups = ["test"] +groups = ["dev", "test"] dependencies = [ "coverage[toml]>=5.2.1", "pytest>=4.6", diff --git a/pyproject.toml b/pyproject.toml index 64b293f..ad59628 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,12 +20,15 @@ pytest = "^8.2.1" pytest-cov = "^5.0.0" + [tool.pdm] [tool.pdm.dev-dependencies] test = ["pytest<9.0.0,>=8.2.1", "pytest-cov<6.0.0,>=5.0.0"] dev = [ "flake8>=7.1.1", "black>=24.8.0", + "pytest>=8.3.2", + "pytest-cov>=5.0.0", ] [tool.pdm.build] diff --git a/pyrace/gateway/console.py b/pyrace/gateway/console.py index ddcf69c..5c1ec62 100644 --- a/pyrace/gateway/console.py +++ b/pyrace/gateway/console.py @@ -21,12 +21,8 @@ class ConsoleThread(Thread, ServerBase): - - def __init__( - self, - parentThread: ServerBase, - logger = getLogger("console") - ) -> None: + + def __init__(self, parentThread: ServerBase, logger=getLogger("console")) -> None: Thread.__init__(self) self.parentThread = parentThread self.logger = logger @@ -35,12 +31,12 @@ def __init__( pass def run(self) -> None: - + if self.shutdownRequested: return - + reactor = Input() - + self.logger.info("Started console thread") with reactor: @@ -59,4 +55,4 @@ def run(self) -> None: def stop(self) -> None: self.logger.info("Stopping console thread") self.shutdownRequested = True - self.logger.info("Stopped console thread") \ No newline at end of file + self.logger.info("Stopped console thread") diff --git a/pyrace/gateway/gateway.py b/pyrace/gateway/gateway.py index 8eb8e19..108a1bd 100644 --- a/pyrace/gateway/gateway.py +++ b/pyrace/gateway/gateway.py @@ -15,15 +15,12 @@ # along with this program. If not, see . import asyncio -from http.server import BaseHTTPRequestHandler, HTTPServer, ThreadingHTTPServer -from re import T +from http.server import BaseHTTPRequestHandler, HTTPServer from threading import Thread -from webbrowser import get from pyrace.base import ServerBase from pyrace.gateway.console import ConsoleThread from pyrace.gateway.parseQuery import parseQuery -from pyrace.gateway.web import WebServer from pyrace.shared.config import getConfig from pyrace.shared.logging import getLogger from sentry_sdk import capture_exception diff --git a/pyrace/gateway/web.py b/pyrace/gateway/web.py index aa94876..2a421f0 100644 --- a/pyrace/gateway/web.py +++ b/pyrace/gateway/web.py @@ -14,9 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from email.policy import HTTP from http.server import HTTPServer -from unittest.mock import Base class WebServer(HTTPServer): @@ -24,7 +22,8 @@ def __init__(self, *args): self.isRunning = False self.shutdownRequested = False super().__init__(*args) - + + def server_activate(self): self.isRunning = True - super(self).server_activate() \ No newline at end of file + super(self).server_activate() diff --git a/pyrace/gui.py b/pyrace/gui.py index 2757d03..c42f639 100644 --- a/pyrace/gui.py +++ b/pyrace/gui.py @@ -17,6 +17,7 @@ import tkinter from tkinter import StringVar, Tk, ttk, Text + def addLogMessage(message: str): logText.configure(state="normal") logText.insert(tkinter.END, f"{message}\n") diff --git a/pyrace/shared/encryption.py b/pyrace/shared/encryption.py index 3fb690d..dbec798 100644 --- a/pyrace/shared/encryption.py +++ b/pyrace/shared/encryption.py @@ -17,6 +17,7 @@ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes import os + def verifyLegacyCipherSupport(): """ Verifies the support for legacy ciphers. @@ -27,9 +28,12 @@ def verifyLegacyCipherSupport(): Returns: None """ - key = os.urandom(16).hex() - dataCypher = Cipher(algorithms.ARC4(bytes.fromhex(key)), mode=None) - cmdCypher = Cipher(algorithms.TripleDES(bytes.fromhex(key)), modes.CBC(bytes.fromhex("0000000000000000"))) - - - + try: + key = os.urandom(16).hex() + _ = Cipher(algorithms.ARC4(bytes.fromhex(key)), mode=None) + _ = Cipher( + algorithms.TripleDES(bytes.fromhex(key)), + modes.CBC(bytes.fromhex("0000000000000000")), + ) + except Exception as e: + raise Exception("Legacy cipher support is not available") from e diff --git a/pyrace/shared/logging.py b/pyrace/shared/logging.py index 6882521..7beed79 100644 --- a/pyrace/shared/logging.py +++ b/pyrace/shared/logging.py @@ -15,12 +15,12 @@ # along with this program. If not, see . import logging -from tkinter import N def getDefaultLevel(): return logging.INFO + class __Logger: def __init__(self, name: str | None, level: int) -> None: self.name = name @@ -34,7 +34,7 @@ def __init__(self, name: str | None, level: int) -> None: ) self.logger.addHandler(handler) - + def getLogger(self, name: str): level = self.level name = f"{self.name}.{name}" @@ -42,34 +42,35 @@ def getLogger(self, name: str): def debug(self, message: str, *args): self.logger.debug(message, *args) - + def info(self, message: str, *args): self.logger.info(message, *args) - + def warning(self, message: str, *args): self.logger.warning(message, *args) - + def error(self, message: str, *args): self.logger.error(message, *args) - + def critical(self, message: str, *args): self.logger.critical(message, *args) - + def exception(self, message: str, *args): self.logger.exception(message, *args) - + def log(self, level: int, message: str, *args): self.logger.log(level, message, *args) + __logger = None def getLogger(name: str | None, level: int = getDefaultLevel()) -> __Logger: global __logger if __logger is None: - __logger = __Logger('pyrace', level) - - if name != None: + __logger = __Logger("pyrace", level) + + if name is not None: return __logger.getLogger(name) return __logger diff --git a/tests/test_config.py b/tests/test_config.py index 844a92f..8eeee77 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,20 +1,22 @@ import unittest from pyrace.shared.config import getConfig + class TestConfig(unittest.TestCase): def test_getConfig(self): config = getConfig() - + # Check if the configuration instance is not None self.assertIsNotNone(config) - + # Check if the configuration instance has the expected attributes self.assertTrue(hasattr(config, "EXTERNAL_HOST")) self.assertTrue(hasattr(config, "CERTIFICATE_FILE")) self.assertTrue(hasattr(config, "PRIVATE_KEY_FILE")) self.assertTrue(hasattr(config, "PUBLIC_KEY_FILE")) - + # Add more assertions as needed - -if __name__ == '__main__': - unittest.main() \ No newline at end of file + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_encryption.py b/tests/test_encryption.py index f13260b..c79bb4c 100644 --- a/tests/test_encryption.py +++ b/tests/test_encryption.py @@ -1,15 +1,17 @@ import unittest from pyrace.shared import encryption + class TestEncryption(unittest.TestCase): def test_verifyLegacyCipherSupport(self): - + try: encryption.verifyLegacyCipherSupport() except Exception as e: self.fail("verifyLegacyCipherSupport() raised an exception: " + str(e)) - + self.assertTrue(True) -if __name__ == '__main__': - unittest.main() \ No newline at end of file + +if __name__ == "__main__": + unittest.main()