16
октябрь
2024
12:03

Для чего нужен пакет xdg-desktop-portal, как его использовать

16 октябрь 2024 12:03

В Linux несколько программных сред - нативная на основе служб Linux SystemD и D-Bus, сторонние FlatPak и Snap.

Наверное, всем известно, что системы распространения приложений FlatPak и Snap используют механизм "песочницы", где приложения запускаются в безопасном окружении.

Чтобы программы, запускаемые внутри "песочницы" могли иметь доступ к ресурсам компьютера, таким как файловая система, камера, звуковой сервер - используется "ответный" компонент (backend) между Snap/Flatpak и операционной системой. Этот компонент называется "XDG Desktop Portal". Из документации Flatpak:

"Порталы — это фреймворки для безопасного доступа к ресурсам из-за пределов изолированной программной среды. Они предоставляют приложениям ряд общих функций, включая: определение состояния сети, открытие файла с помощью средства выбора файлов, открытие URI, создание снимков экрана и скринкастов [...]"

Порталы были разработаны для использования с приложениями, изолированными через Flatpak, но любое приложение может использовать порталы для предоставления единого доступа к функциям, независимым от рабочих столов и наборов инструментов. Это обычно используется, например, для разрешения общего доступа к экрану в Wayland через PipeWire или для использования диалогов открытия и сохранения файлов в Firefox, которые используют тот же набор инструментов, что и ваша текущая среда рабочего стола."

Когда нужен компонент xdg-desktop-portal?

  • Он нужен при использовании flatpak и snap

Как установить xdg-desktop-portal?

sudo apt update
sudo apt install xdg-desktop-portal xdg-desktop-portal-gtk

Как запустить службу xdg-desktop-portal.service?

Данная служба запускается автоматически, в окружении пользователя при обращении к интерфейсам, взаимодействующим с операционной системой. При желании, её можно запустить вручную, чтобы проверить работу (состояние, статус, ошибки), но только в окружении текущего пользователя. Команда:

systemctl --user start xdg-desktop-portal.service

Проверка состояния службы:

systemctl --user status xdg-desktop-portal.service

Каков принцип работы xdg-desktop-portal.service?

Компонент взаимодействует с системой и Flatpak/Snap с помощью протокола DBus.

Как удалить xdg-desktop-portal.service?

Если взаимодействие с ОС от пакетов snap, flatpak не требуется. можно удалить указанные пакеты

sudo apt remove xdg-desktop-portal xdg-desktop-portal-gtk

Где

  • xdg-desktop-portal - основной пакет.
  • xdg-desktop-portal-gtk - пакет расширения по умолчанию для большинства функций, связанных с ОС (запуск приложений, выбор файла, печать, настройки ОС, связка ключей gnome-keyring и т.п.)

В документации на wiki.archlinux.org/title/XDG_Desktop_Portal сказано, что для каждого окружения рабочего стола есть свои пакеты. Например:

  • окружение Gnome -> пакет xdg-desktop-portal-gnome
  • окружение KDE -> пакет xdg-desktop-portal-kde
  • окружение LXQt -> пакет xdg-desktop-portal-lxqt

Как обеспечить работу xdg-desktop-portal.service?

Компоненту xdg-desktop-portal нужны переменные окружения

Проверить текущее окружение рабочего стола и другие переменные XDG:

env | grep XDG

Файлы конфигурации xdg-desktop-portal лежат в папке /usr/share/xdg-desktop-portal/. Изменять их не следует.

Также, компоненту нужны названия папок, перечисленные в файле:
~/.config/user-dirs.dirs

Пример - посмотр списка папок пользователя:

cat ~/.config/user-dirs.dirs

Данный файл создаётся при выполнении команды

xdg-user-dirs-update

С учётом текущих настроек локали (языка). Локаль определяется переменными окружения, которые можно просмотреть при помощи команды locale:

locale

Чтобы установить на русский:

sudo update-locale LANG=ru_RU.UTF-8

Если русский язык выбран при установке ОС, настройка не требуется.

Как обеспечить работу портала, если он не запускается?

С помощью импорта переменной системы в окружение пользователя:

В большинстве ОС достаточно этого:

systemctl --user import-environment XDG_CURRENT_DESKTOP

В Wayland:

systemctl --user import-environment WAYLAND_DISPLAY  XDG_CURRENT_DESKTOP

Повторный запуск и проверка, что портал работает:

systemctl --user start xdg-desktop-portal.service
systemctl --user status xdg-desktop-portal.service

Как проверить работу службы xdg-desktop-portal.service ?

1) Нужно установить приложение FlatPak, в нём установить другое приложение, например, браузер Chromium как написано в предыдущей статье.

2) Вначале проверим, что браузер присутствует в списке установленных приложений FlatPak.

flatpak list

3) запустим

flatpak run org.chromium.Chromium

4) Выбираем пункт "Открыть файл" - нажатием клавиш Ctrl+O. Должен появится системный диалог, в котором отображается содержимое домашней папки.

Отладка

dbus-monitor --session

и запуск приложения в другом окне

flatpak run org.chromium.Chromium

И нажатие Ctrl+O:

В окне dbus-monitor будет выведено много текста:
string "org.freedesktop.impl.portal.Request"
error time=1729069549.930735 sender=:1.49 -> destination=:1.46 error_name=org.freedesktop.DBus.Error.UnknownMethod reply_serial=163
string "Объект по пути «/org/freedesktop/portal/desktop/request/1_88/handle_0» не существует"
method call time=1729069549.931375 sender=:1.46 -> destination=:1.49 serial=164 path=/org/freedesktop/portal/desktop; interface=org.freedesktop.impl.portal.FileChooser; member=OpenFile
object path "/org/freedesktop/portal/desktop/request/1_88/handle_0"
string "org.chromium.Chromium"
string "x11:0x3a00019"
string "Открытие файла"
array [
dict entry(
string "modal"
variant boolean true
)
dict entry(
string "filters"
variant array [
]
)
]

Запуск просмотра URL или документа при помощи xdg-open

Вместо запуска приложения и открытия из него документа, можно использовать простую команду xdg-open "имя файла" или URL.

Например:

xdg-open https://bfm.ru

или

xdg-open 388643rus.pdf

Файл PDF для тестирования - "Послание Генерального директора ЮНЕСКО
Одрэ Азуле по случаю Всемирного дня радио 13 февраля 2024 года": 388643rus.pdf

Утилита xdg-open входит в пакет xdg-utils, установлена в Linux по умолчанию. Процессы, запускаемые ею, работают в пределах контейнера Flatpak. Также, существует пакет flatpak-xdg-utils, в котором есть особая версия xdg-open, и приложение flatpak-spawn, которое позволяет действия в системе за пределами контейнера. Эта спецверсия xdg-open устанавливается по другому пути: /usr/libexec/flatpak-xdg-utils/ вместо /usr/bin/xdg-open. Установка пакета flatpak-xdg-utils, как правило, не требуется.

Для управления правами (разрешениями) контейнерных приложений Flatpak существует графическое приложение Flatseal (com.github.tchx84.Flatseal).

sudo flatpak install com.github.tchx84.Flatseal
flatpak run com.github.tchx84.Flatseal

FlatSeal позволяет ограничивать разрешения приложений, подобно настройкам Android "Приложения и уведомления" - "Разрешения приложений":

Например, разрешения для браузера Chromium из FlatPak:

  • Сеть - Да
  • Межпроцессные коммуникации - Да
  • Оконная система X11 - Да.
  • Звуковой сервер PulseAudio - Да
  • Система печати - Да
  • GPU ускорение (device=dri) - по умолчанию Нет -> можно сменить на Да
  • Все устройства (вебкамера) - Да
  • Все пользовательские файлы (filesystem=home) - Да
  • Фон (может работать в фоне) - Нет
  • Уведомления (может отправлять уведомления) - Нет

Ссылки на документацию:



Похожие публикации