Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ Version 1.6.0-dev (development of upcoming release)
* Fixed: Stop waking up monitor when inhibit suspend on backup starts (#714, #1090)
* Fixed: Avoid shutdown confirmation dialog on Budgie and Cinnamon desktop environments (#788)
* Fixed: Crash in "Manage profiles" dialog when using "qt6ct" (#2128)
* Fixed: Allow in BITs root-mode opening URLs in extern browse

Version 1.5.6 (2025-10-05)
* Fixed: Always use 0 as window ID value when inhibiting suspend via D-Bus power manager (#2084, #2268, #2192)
Expand Down
54 changes: 50 additions & 4 deletions qt/qttools.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"""
import os
import sys
import pwd
import re
import json
import textwrap
Expand Down Expand Up @@ -291,14 +292,59 @@ def eventFilter(self, receiver: QObject, event: QEvent):
return super().eventFilter(receiver, event)


def open_url(url: str) -> None:
"""Open an URL or URI"""
QDesktopServices.openUrl(QUrl(url))
def _determine_root_mode_user() -> str:
"""Determine the users name who started BIT in root mode

Usually pkexec is used but some users do use sudo themself.
"""
# Try pkexec
uid = os.getenv('PKEXEC_UID', None)
if uid:
return pwd.getpwuid(int(uid)).pw_name

# Try sudo
sudo_user = os.getenv('SUDO_USER', None)
if sudo_user:
return sudo_user

return None


def open_url(url):
# regular user mode
if not bitbase.IS_IN_ROOT_MODE:
return QDesktopServices.openUrl(QUrl(url))

# root mode
user_name = _determine_root_mode_user()

try:
subprocess.run(
[
'runuser',
'-u',
user_name,
'--',
'xdg-open',
url
],
check=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
except (subprocess.CalledProcessError, FileNotFoundError) as exc:
logger.error(f'Problem while opening "{url}" in as user '
f'"{user_name}" while in root-mode. '
f'Error was: {exc}')
except Exception as exc:
logger.critical(f'Unknown problem while opening "{url}" in as user '
f'"{user_name}" while in root-mode. '
f'Error was: {exc}')


def open_man_page(manpage: str) -> None:
"""Open the manpage in a terminal window."""
env=os.environ.copy()
env = os.environ.copy()
env['MANWIDTH'] = '80'

content = ''
Expand Down