Stop the native portal with the graphical session

This commit is contained in:
Samuel Onoja committed 2026-09-28 11:33:56 +01:00
1 parent 7d73510086
commit 9754326f1d
5 files changed
+80 -2

No files matched your search

+3 -1
View File
@@ -17,7 +17,9 @@ Settings, command-line tools, locker, polkit agent, and ScreenCast portal togeth
packages or enable background services at boot. On systemd systems, the installed packages or enable background services at boot. On systemd systems, the installed
session helper activates `ferese-session.target` after exporting the compositor's session helper activates `ferese-session.target` after exporting the compositor's
Wayland display, and stops it when the shell exits. This keeps Wayland display, and stops it when the shell exits. This keeps
`graphical-session.target` active so desktop portals can start. Nested previews `graphical-session.target` active so desktop portals can start. The native portal
is D-Bus activated and supervised by systemd; it stops with the session so a
previous release cannot remain running after logout. Nested previews
do not alter the host's activation environment or session targets. do not alter the host's activation environment or session targets.
### Fedora ### Fedora
@@ -1,3 +1,4 @@
[D-BUS Service] [D-BUS Service]
Name=org.freedesktop.impl.portal.desktop.ferese Name=org.freedesktop.impl.portal.desktop.ferese
Exec=/usr/local/lib/ferese/current/xdg-desktop-portal-ferese Exec=/usr/local/lib/ferese/current/xdg-desktop-portal-ferese
SystemdService=xdg-desktop-portal-ferese.service
@@ -0,0 +1,9 @@
[Unit]
Description=Ferese desktop portal
PartOf=ferese-session.target graphical-session.target
After=ferese-session.target
[Service]
Type=dbus
BusName=org.freedesktop.impl.portal.desktop.ferese
ExecStart=/usr/local/lib/ferese/current/xdg-desktop-portal-ferese
+12 -1
View File
@@ -70,7 +70,17 @@ for entry in \
done done
service=/usr/local/share/dbus-1/services/org.freedesktop.impl.portal.desktop.ferese.service service=/usr/local/share/dbus-1/services/org.freedesktop.impl.portal.desktop.ferese.service
if [[ -e $service ]] && ! cmp -s "$repo_dir/packaging/portal/$(basename "$service")" "$service"; then if [[ -e $service ]] && ! cmp -s "$repo_dir/packaging/portal/$(basename "$service")" "$service"; then
echo "Unmanaged portal service exists: $service" >&2; exit 1 # Upgrade the exact activation file shipped before systemd supervision.
if ! cmp -s <(printf '%s\n' '[D-BUS Service]' \
'Name=org.freedesktop.impl.portal.desktop.ferese' \
'Exec=/usr/local/lib/ferese/current/xdg-desktop-portal-ferese') "$service"; then
echo "Unmanaged portal service exists: $service" >&2; exit 1
fi
fi
portal_unit=/usr/local/lib/systemd/user/xdg-desktop-portal-ferese.service
if [[ -e $portal_unit ]] && ! cmp -s "$repo_dir/packaging/systemd/xdg-desktop-portal-ferese.service" "$portal_unit"; then
echo "Unmanaged portal unit exists: $portal_unit" >&2; exit 1
fi fi
session_target=/usr/local/lib/systemd/user/ferese-session.target session_target=/usr/local/lib/systemd/user/ferese-session.target
@@ -91,6 +101,7 @@ done
install -m 0755 -- "$repo_dir/packaging/ferese-session" "$release_dir/ferese-session" install -m 0755 -- "$repo_dir/packaging/ferese-session" "$release_dir/ferese-session"
install -m 0755 -- "$repo_dir/packaging/ferese-session-shell" "$release_dir/ferese-session-shell" install -m 0755 -- "$repo_dir/packaging/ferese-session-shell" "$release_dir/ferese-session-shell"
install -D -m 0644 -- "$repo_dir/packaging/systemd/ferese-session.target" "$session_target" install -D -m 0644 -- "$repo_dir/packaging/systemd/ferese-session.target" "$session_target"
install -D -m 0644 -- "$repo_dir/packaging/systemd/xdg-desktop-portal-ferese.service" "$portal_unit"
install -m 0755 -- "$repo_dir/packaging/ferese-screenshot" "$release_dir/ferese-screenshot" install -m 0755 -- "$repo_dir/packaging/ferese-screenshot" "$release_dir/ferese-screenshot"
install -m 0644 -- "$repo_dir/packaging/config.kdl" "$release_dir/config.example.kdl" install -m 0644 -- "$repo_dir/packaging/config.kdl" "$release_dir/config.example.kdl"
install -D -m 0644 -- "$repo_dir/assets/fonts/Comfortaa-LICENSE.txt" "$release_dir/licenses/Comfortaa-LICENSE.txt" install -D -m 0644 -- "$repo_dir/assets/fonts/Comfortaa-LICENSE.txt" "$release_dir/licenses/Comfortaa-LICENSE.txt"
+55
View File
@@ -0,0 +1,55 @@
"""Exercise portal upgrade preflight against temporary installation files."""
from pathlib import Path
import subprocess
import tempfile
import unittest
REPO = Path(__file__).resolve().parents[2]
LEGACY = ('[D-BUS Service]\n'
'Name=org.freedesktop.impl.portal.desktop.ferese\n'
'Exec=/usr/local/lib/ferese/current/xdg-desktop-portal-ferese\n')
class PortalInstallTest(unittest.TestCase):
def preflight(self, service=None, unit=None):
script = (REPO / 'scripts/install-session.sh').read_text()
start = script.index('service=/usr/local/share/dbus-1/services/')
script = script[start:script.index('session_target=', start)]
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
if service is not None:
(root / 'activation.service').write_text(service)
if unit is not None:
(root / 'portal.service').write_text(unit)
script = script.replace(
'service=/usr/local/share/dbus-1/services/org.freedesktop.impl.portal.desktop.ferese.service',
'service="$TEST_ROOT/activation.service"')
script = script.replace('$(basename "$service")',
'org.freedesktop.impl.portal.desktop.ferese.service')
script = script.replace(
'portal_unit=/usr/local/lib/systemd/user/xdg-desktop-portal-ferese.service',
'portal_unit="$TEST_ROOT/portal.service"')
return subprocess.run(['bash', '-eu', '-c', script],
env={'repo_dir': str(REPO), 'TEST_ROOT': directory},
capture_output=True, text=True)
def test_accepts_fresh_install_and_previous_activation_file(self):
self.assertEqual(self.preflight().returncode, 0)
self.assertEqual(self.preflight(LEGACY).returncode, 0)
def test_accepts_current_managed_files(self):
service = (REPO / 'packaging/portal/org.freedesktop.impl.portal.desktop.ferese.service').read_text()
unit = (REPO / 'packaging/systemd/xdg-desktop-portal-ferese.service').read_text()
self.assertEqual(self.preflight(service, unit).returncode, 0)
def test_preserves_modified_activation_and_systemd_files(self):
result = self.preflight(LEGACY.replace('/usr/local/lib/ferese/current/', '/custom/'))
self.assertNotEqual(result.returncode, 0)
self.assertIn('Unmanaged portal service', result.stderr)
result = self.preflight(LEGACY, '[Service]\nExecStart=/custom/portal\n')
self.assertNotEqual(result.returncode, 0)
self.assertIn('Unmanaged portal unit', result.stderr)
if __name__ == '__main__':
unittest.main()