diff --git a/wadas/_version.py b/wadas/_version.py index fab66046..0cb32e65 100644 --- a/wadas/_version.py +++ b/wadas/_version.py @@ -17,5 +17,5 @@ # Date: 2024-08-14 # Description: module to keep track of WADAS version -__version__ = "v1.0.0.a4" +__version__ = "v1.0.0.a5" __dbversion__ = __version__ diff --git a/wadas/domain/utils.py b/wadas/domain/utils.py index eac8b876..4f43e6ac 100644 --- a/wadas/domain/utils.py +++ b/wadas/domain/utils.py @@ -26,6 +26,10 @@ import uuid from logging.handlers import RotatingFileHandler +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import serialization + def get_timestamp(): """Method to prepare timestamp string to apply to images naming""" @@ -120,3 +124,35 @@ def send_data_on_local_socket(port, command): return data finally: client_socket.close() + + +def is_pem_key( + pem_key_file: str, + password: bytes | None = None, +) -> bool: + """Method to validate pem key file content.""" + + try: + with open(pem_key_file, "rb") as f: + serialization.load_pem_private_key( + f.read(), + password=password, + backend=default_backend(), + ) + return True + except Exception: + return False + + +def is_pem_certificate(pem_certificate_file) -> bool: + """Method to validate pem certificate file content.""" + + try: + with open(pem_certificate_file, "rb") as f: + x509.load_pem_x509_certificate( + f.read(), + backend=default_backend(), + ) + return True + except Exception: + return False diff --git a/wadas/icons/icon-actuator-24.png b/wadas/icons/icon-actuator-24.png index 6f61d557..523ac635 100644 Binary files a/wadas/icons/icon-actuator-24.png and b/wadas/icons/icon-actuator-24.png differ diff --git a/wadas/icons/icon-ai-24.png b/wadas/icons/icon-ai-24.png index 15354d96..c8252526 100644 Binary files a/wadas/icons/icon-ai-24.png and b/wadas/icons/icon-ai-24.png differ diff --git a/wadas/ui/configure_actuators_dialog.py b/wadas/ui/configure_actuators_dialog.py index 4c83a9a0..8a120858 100644 --- a/wadas/ui/configure_actuators_dialog.py +++ b/wadas/ui/configure_actuators_dialog.py @@ -26,6 +26,8 @@ from wadas.domain.fastapi_actuator_server import FastAPIActuatorServer, initialize_fastapi_logger from wadas.domain.feeder_actuator import FeederActuator from wadas.domain.roadsign_actuator import RoadSignActuator +from wadas.domain.utils import is_pem_certificate, is_pem_key +from wadas.ui.error_message_dialog import WADASErrorMessage from wadas.ui.qt.ui_configure_actuators import Ui_DialogConfigureActuators from wadas.ui.qtextedit_logger import QTextEditLogger @@ -254,6 +256,12 @@ def select_key_file(self): self, "Open SSL key file", os.getcwd(), "Pem File (*.pem)" ) self.ui.label_key_file.setText(str(file_name[0])) + + # Verify key file + if not is_pem_key(file_name[0]): + WADASErrorMessage("Invalid key file provided", + f"Error while loading key file. Please make sure selected file is a valid one.").exec() + self.validate() def select_certificate_file(self): @@ -263,6 +271,11 @@ def select_certificate_file(self): self, "Open SSL certificate file", os.getcwd(), "Pem File (*.pem)" ) self.ui.label_cert_file.setText(str(file_name[0])) + + if not is_pem_certificate(file_name[0]): + WADASErrorMessage("Invalid certificate file provided", + f"Error while loading certificate file. Please make sure selected file is a valid one").exec() + self.validate() def get_actuator_id(self, row): diff --git a/wadas/ui/configure_camera_actuator_associations_dialog.py b/wadas/ui/configure_camera_actuator_associations_dialog.py index c2a039fb..a4a90cc2 100644 --- a/wadas/ui/configure_camera_actuator_associations_dialog.py +++ b/wadas/ui/configure_camera_actuator_associations_dialog.py @@ -52,6 +52,9 @@ def __init__(self): # Set the model to the QTreeView self.ui.treeView.setModel(self.model) + # Expand all items by default + self.ui.treeView.expandAll() + # Signal self.ui.treeView.doubleClicked.connect(self.handle_double_click) self.ui.pushButton_close.clicked.connect(self.accept_and_close) @@ -72,6 +75,7 @@ def handle_double_click(self, index): dialog.exec() # Refresh the camera item in the tree view after editing actuators self.populate_model() + self.ui.treeView.expandAll() def populate_model(self): diff --git a/wadas/ui/configure_ftp_cameras_dialog.py b/wadas/ui/configure_ftp_cameras_dialog.py index 2aaca7f1..4689d6d4 100644 --- a/wadas/ui/configure_ftp_cameras_dialog.py +++ b/wadas/ui/configure_ftp_cameras_dialog.py @@ -42,6 +42,8 @@ from wadas.domain.database import DataBase from wadas.domain.ftp_camera import FTPCamera from wadas.domain.ftps_server import FTPsServer +from wadas.domain.utils import is_pem_certificate, is_pem_key +from wadas.ui.error_message_dialog import WADASErrorMessage from wadas.ui.qt.ui_configure_ftp_cameras import Ui_DialogFTPCameras from wadas.ui.qtextedit_logger import QTextEditLogger @@ -328,6 +330,12 @@ def select_key_file(self): self, "Open SSL key file", os.getcwd(), "Pem File (*.pem)" ) self.ui.label_key_file_path.setText(str(file_name[0])) + + # Verify key file + if not is_pem_key(file_name[0]): + WADASErrorMessage("Invalid key file provided", + f"Error while loading key file. Please make sure selected file is a valid one.").exec() + self.validate() def select_certificate_file(self): @@ -337,6 +345,11 @@ def select_certificate_file(self): self, "Open SSL certificate file", os.getcwd(), "Pem File (*.pem)" ) self.ui.label_certificate_file_path.setText(str(file_name[0])) + + if not is_pem_certificate(file_name[0]): + WADASErrorMessage("Invalid certificate file provided", + f"Error while loading certificate file. Please make sure selected file is a valid one").exec() + self.validate() def select_ftp_folder(self): diff --git a/wadas/ui/configure_web_interface.py b/wadas/ui/configure_web_interface.py index 8d7219f6..3cb99372 100644 --- a/wadas/ui/configure_web_interface.py +++ b/wadas/ui/configure_web_interface.py @@ -163,8 +163,6 @@ def initialize_dialog(self): role_cb = self.findChild(QComboBox, f"comboBox_role_{i}") role_txt = role if role in self.roles else "Viewer" role_cb.setCurrentText(role_txt) - - self.validate() else: self.findChild(QLineEdit, "lineEdit_user_0").setEnabled(False) self.findChild(QLineEdit, "lineEdit_password_0").setEnabled(False)