From baf7f7cec134c057faa61a66f50b9231d643a4f5 Mon Sep 17 00:00:00 2001 From: SimplifiedPrivacy Date: Thu, 16 Jul 2026 06:54:29 -0400 Subject: [PATCH] Rollback bwrap settings_page changes --- gui/v2/ui/pages/settings_page.py | 108 ++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/gui/v2/ui/pages/settings_page.py b/gui/v2/ui/pages/settings_page.py index 82b5a45..a4af5e8 100755 --- a/gui/v2/ui/pages/settings_page.py +++ b/gui/v2/ui/pages/settings_page.py @@ -35,6 +35,7 @@ from core.errors.logger import logger as core_logger from gui.v2.actions import settings_data from gui.v2.actions.key_interpretation import interpret_key_results from gui.v2.actions.profile_order import normalize_profile_order +from gui.v2.infrastructure.page_registry import PAGE_REGISTRY from gui.v2.infrastructure.setup_observers import ticket_observer from gui.v2.ui.pages.Page import Page from gui.v2.ui.popups.confirmation_popup import ConfirmationPopup @@ -102,6 +103,7 @@ class Settings(Page): ("Create/Edit", self.show_registrations_page), ("Verification", self.show_verification_page), ("Legacy-Version", self.show_systemwide_page), + ("Bwrap Permission", self.show_bwrap_page), ("Delete Profile", self.show_delete_page), ("Error Logs", self.show_logs_page), ("Debug Help", self.show_debug_page) @@ -1174,8 +1176,9 @@ class Settings(Page): super().showEvent(event) self._settings_refresh_seq += 1 seq = self._settings_refresh_seq + module_path, class_name = PAGE_REGISTRY["settings"] worker = PageDataWorker( - "settings", settings_data.prepare, self.custom_window.gui_config_file) + "settings", module_path, class_name, self.custom_window) worker.data_ready.connect( lambda name, payload, s=seq: self._on_settings_data_ready(payload, s)) worker.failed.connect( @@ -1223,6 +1226,10 @@ class Settings(Page): self.systemwide_page = self.create_systemwide_page() self.content_layout.addWidget(self.systemwide_page) + self.content_layout.removeWidget(self.bwrap_page) + self.bwrap_page = self.create_bwrap_page() + self.content_layout.addWidget(self.bwrap_page) + self.content_layout.removeWidget(self.delete_page) self.delete_page = self.create_delete_page() self.content_layout.addWidget(self.delete_page) @@ -1436,6 +1443,7 @@ class Settings(Page): self.registrations_page = self.create_registrations_page() self.verification_page = self.create_verification_page() self.systemwide_page = self.create_systemwide_page() + self.bwrap_page = self.create_bwrap_page() self.logs_page = self.create_logs_page() self.delete_page = self.create_delete_page() self.debug_page = self.create_debug_page() @@ -1446,6 +1454,7 @@ class Settings(Page): self.content_layout.addWidget(self.registrations_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.logs_page) self.content_layout.addWidget(self.delete_page) self.content_layout.addWidget(self.debug_page) @@ -1499,6 +1508,11 @@ class Settings(Page): self.content_layout.setCurrentWidget(self.systemwide_page) self._select_menu_button("Legacy-Version") + def show_bwrap_page(self): + core_logger.info("User navigated to Settings -> Bwrap Permission") + self.content_layout.setCurrentWidget(self.bwrap_page) + self._select_menu_button("Bwrap Permission") + def show_logs_page(self): core_logger.info("User navigated to Settings -> Error Logs") self.content_layout.setCurrentWidget(self.logs_page) @@ -1981,6 +1995,59 @@ class Settings(Page): self._prepared_value("systemwide_enabled", settings_data.read_systemwide_enabled)) return page + def create_bwrap_page(self): + page = QWidget() + layout = QVBoxLayout(page) + layout.setSpacing(20) + layout.setContentsMargins(20, 20, 20, 20) + + title = QLabel("BWRAP PERMISSION") + title.setStyleSheet( + f"color: #808080; font-size: 12px; font-weight: bold; {self.font_style}") + layout.addWidget(title) + + description = QLabel( + "Control whether HydraVeil configures a capability policy so bwrap can be used without requiring additional permissions.") + 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.bwrap_status_value = QLabel("") + self.bwrap_status_value.setStyleSheet( + f"color: #e67e22; font-size: 14px; {self.font_style}") + status_layout.addWidget(status_label) + status_layout.addWidget(self.bwrap_status_value) + status_layout.addStretch() + layout.addLayout(status_layout) + + toggle_layout = QHBoxLayout() + self.bwrap_toggle = QCheckBox("Enable capability policy") + self.bwrap_toggle.setStyleSheet(self.get_checkbox_style()) + toggle_layout.addWidget(self.bwrap_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_bwrap_settings) + + button_layout = QHBoxLayout() + button_layout.addWidget(save_button) + button_layout.addStretch() + layout.addLayout(button_layout) + + layout.addStretch() + self.load_bwrap_settings( + self._prepared_value("bwrap_enabled", settings_data.read_bwrap_enabled)) + return page + def load_systemwide_settings(self, enabled=None): if enabled is None: enabled = settings_data.read_systemwide_enabled() @@ -2020,6 +2087,45 @@ class Settings(Page): self.systemwide_status_value.setStyleSheet( f"color: red; font-size: 14px; {self.font_style}") + def load_bwrap_settings(self, enabled=None): + if enabled is None: + enabled = settings_data.read_bwrap_enabled() + self.bwrap_toggle.setChecked(enabled) + if enabled: + self.bwrap_status_value.setText("Enabled") + self.bwrap_status_value.setStyleSheet( + f"color: #2ecc71; font-size: 14px; {self.font_style}") + else: + self.bwrap_status_value.setText("Disabled") + self.bwrap_status_value.setStyleSheet( + f"color: #e67e22; font-size: 14px; {self.font_style}") + + def save_bwrap_settings(self): + enable = self.bwrap_toggle.isChecked() + try: + capability_policy = PolicyController.get('capability') + if capability_policy is not None: + if enable: + PolicyController.instate(capability_policy) + else: + if PolicyController.is_instated(capability_policy): + PolicyController.revoke(capability_policy) + self.load_bwrap_settings() + self.update_status.update_status( + "Capability policy settings updated") + except CommandNotFoundError as e: + self.bwrap_status_value.setText(str(e)) + self.bwrap_status_value.setStyleSheet( + f"color: red; font-size: 14px; {self.font_style}") + except (PolicyAssignmentError, PolicyInstatementError, PolicyRevocationError) as e: + self.bwrap_status_value.setText(str(e)) + self.bwrap_status_value.setStyleSheet( + f"color: red; font-size: 14px; {self.font_style}") + except Exception: + self.bwrap_status_value.setText("Failed to update policy") + self.bwrap_status_value.setStyleSheet( + f"color: red; font-size: 14px; {self.font_style}") + def load_registrations_settings(self) -> None: try: config = self._prepared_value(