From 1633562325fa7a8c0d5d6032f32ce4d4093d454e Mon Sep 17 00:00:00 2001 From: SimplifiedPrivacy Date: Tue, 21 Jul 2026 09:45:10 -0400 Subject: [PATCH] Introduced Firewall Feature in the Settings Page --- gui/v2/actions/settings_data.py | 13 ++++ gui/v2/ui/pages/settings_page.py | 106 +++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) diff --git a/gui/v2/actions/settings_data.py b/gui/v2/actions/settings_data.py index e190e2a..f86c03d 100755 --- a/gui/v2/actions/settings_data.py +++ b/gui/v2/actions/settings_data.py @@ -5,12 +5,23 @@ from core.Constants import Constants from core.controllers.ConfigurationController import ConfigurationController from core.controllers.PolicyController import PolicyController from core.controllers.ProfileController import ProfileController +from core.services.networking.systemwide.systemwide_utils import get_firewall_setting from gui.v2.actions.config import load_gui_config from gui.v2.actions.profile_order import normalize_profile_order from gui.v2.actions.ticket_failure import get_ticket_verification_failure + +def read_firewall_setting(): + try: + firewall_setting = get_firewall_setting() + return firewall_setting + except Exception: + pass + return False + + def read_systemwide_enabled(): try: privilege_policy = PolicyController.get('privilege') @@ -45,6 +56,7 @@ def prepare(gui_config_file): "endpoint_verification_enabled": endpoint_verification_enabled, "systemwide_enabled": read_systemwide_enabled(), "bwrap_enabled": read_bwrap_enabled(), + "firewall_setting": read_firewall_setting(), "gui_config": load_gui_config(gui_config_file), "ticket_failure": get_ticket_verification_failure(gui_config_file), } @@ -58,6 +70,7 @@ def empty_payload(): "endpoint_verification_enabled": False, "systemwide_enabled": False, "bwrap_enabled": False, + "firewall_setting": False, "gui_config": None, "ticket_failure": None, } diff --git a/gui/v2/ui/pages/settings_page.py b/gui/v2/ui/pages/settings_page.py index d7b7d76..b5c39e3 100755 --- a/gui/v2/ui/pages/settings_page.py +++ b/gui/v2/ui/pages/settings_page.py @@ -31,6 +31,7 @@ from core.Errors import ( PolicyRevocationError, ) from core.errors.logger import logger as core_logger +from core.services.networking.systemwide.systemwide_utils import get_firewall_setting from gui.v2.actions import settings_data from gui.v2.actions.key_interpretation import interpret_key_results @@ -103,6 +104,7 @@ class Settings(Page): ("Verification", self.show_verification_page), ("Legacy-Version", self.show_systemwide_page), ("Bwrap Permission", self.show_bwrap_page), + ("Connections", self.show_connection_page), ("Delete Profile", self.show_delete_page), ("Error Logs", self.show_logs_page), ("Debug Help", self.show_debug_page) @@ -1228,6 +1230,10 @@ class Settings(Page): self.bwrap_page = self.create_bwrap_page() self.content_layout.addWidget(self.bwrap_page) + self.content_layout.removeWidget(self.connection_page) + self.connection_page = self.create_connection_page() + self.content_layout.addWidget(self.connection_page) + self.content_layout.removeWidget(self.delete_page) self.delete_page = self.create_delete_page() self.content_layout.addWidget(self.delete_page) @@ -1442,6 +1448,7 @@ class Settings(Page): self.verification_page = self.create_verification_page() self.systemwide_page = self.create_systemwide_page() self.bwrap_page = self.create_bwrap_page() + self.connection_page = self.create_connection_page() self.logs_page = self.create_logs_page() self.delete_page = self.create_delete_page() self.debug_page = self.create_debug_page() @@ -1453,6 +1460,7 @@ class Settings(Page): self.content_layout.addWidget(self.verification_page) self.content_layout.addWidget(self.systemwide_page) self.content_layout.addWidget(self.bwrap_page) + self.content_layout.addWidget(self.connection_page) self.content_layout.addWidget(self.logs_page) self.content_layout.addWidget(self.delete_page) self.content_layout.addWidget(self.debug_page) @@ -1511,6 +1519,11 @@ class Settings(Page): self.content_layout.setCurrentWidget(self.bwrap_page) self._select_menu_button("Bwrap Permission") + def show_connection_page(self): + core_logger.info("User navigated to Settings -> Connection") + self.content_layout.setCurrentWidget(self.connection_page) + self._select_menu_button("Connection Page") + def show_logs_page(self): core_logger.info("User navigated to Settings -> Error Logs") self.content_layout.setCurrentWidget(self.logs_page) @@ -2098,6 +2111,21 @@ class Settings(Page): self.bwrap_status_value.setStyleSheet( f"color: #e67e22; font-size: 14px; {self.font_style}") + + def load_firewall_settings(self, enabled=None): + if enabled is None: + enabled = settings_data.load(read_firewall_setting) + self.firewall_toggle.setChecked(enabled) + if enabled: + self.firewall_status_value.setText("Enabled") + self.firewall_status_value.setStyleSheet( + f"color: #2ecc71; font-size: 14px; {self.font_style}") + else: + self.firewall_status_value.setText("Disabled") + self.firewall_status_value.setStyleSheet( + f"color: #e67e22; font-size: 14px; {self.font_style}") + + def save_bwrap_settings(self): enable = self.bwrap_toggle.isChecked() try: @@ -2124,6 +2152,29 @@ class Settings(Page): self.bwrap_status_value.setStyleSheet( f"color: red; font-size: 14px; {self.font_style}") + + def save_firewall_settings(self): + enable = self.firewall_toggle.isChecked() + try: + if enable: + ConfigurationController.change_firewall(True) + self.firewall_status_value.setText("Enabled") + else: + ConfigurationController.change_firewall(False) + self.firewall_status_value.setText("Disabled") + self.update_status.update_status( + "Firewall settings updated") + except CommandNotFoundError as e: + self.firewall_status_value.setText(str(e)) + self.firewall_status_value.setStyleSheet( + f"color: red; font-size: 14px; {self.font_style}") + except Exception as e: + print(e) + self.firewall_status_value.setText(f"Failed to update firewall setting {e}") + self.firewall_status_value.setStyleSheet( + f"color: red; font-size: 14px; {self.font_style}") + + def load_registrations_settings(self) -> None: try: config = self._prepared_value( @@ -2185,3 +2236,58 @@ class Settings(Page): logging.error(f"Error saving registration settings: {str(e)}") self.update_status.update_status( "Error saving registration settings") + + + + def create_connection_page(self): + page = QWidget() + layout = QVBoxLayout(page) + layout.setSpacing(20) + layout.setContentsMargins(20, 20, 20, 20) + + title = QLabel("CONNECTION PAGE") + title.setStyleSheet( + f"color: #808080; font-size: 12px; font-weight: bold; {self.font_style}") + layout.addWidget(title) + + description = QLabel( + "Control connection settings such as the firewall.") + description.setWordWrap(True) + description.setStyleSheet( + f"color: white; font-size: 14px; {self.font_style}") + layout.addWidget(description) + + status_layout = QHBoxLayout() + status_label = QLabel("Current status:") + status_label.setStyleSheet( + f"color: white; font-size: 14px; {self.font_style}") + self.firewall_status_value = QLabel("") + self.firewall_status_value.setStyleSheet( + f"color: #e67e22; font-size: 14px; {self.font_style}") + status_layout.addWidget(status_label) + status_layout.addWidget(self.firewall_status_value) + status_layout.addStretch() + layout.addLayout(status_layout) + + toggle_layout = QHBoxLayout() + self.firewall_toggle = QCheckBox("Enable Firewall Automatically when Systemwide Profiles are Activated") + self.firewall_toggle.setStyleSheet(self.get_checkbox_style()) + toggle_layout.addWidget(self.firewall_toggle) + toggle_layout.addStretch() + layout.addLayout(toggle_layout) + + save_button = QPushButton() + save_button.setFixedSize(75, 46) + save_button.setIcon(QIcon(os.path.join(self.btn_path, "save.png"))) + save_button.setIconSize(QSize(75, 46)) + save_button.clicked.connect(self.save_firewall_settings) + + button_layout = QHBoxLayout() + button_layout.addWidget(save_button) + button_layout.addStretch() + layout.addLayout(button_layout) + + layout.addStretch() + self.load_firewall_settings( + self._prepared_value("firewall_setting", settings_data.read_firewall_setting)) + return page