Сервис идентификации приложений
Сервис идентификации приложений предоставляет безопасный API для идентификации стороннего процесса, который отправляет D-Bus запрос текущему процессу. Подробнее…
Шина: | сессионная / системная |
Служба: | ru.omp.am |
Объект: | /ru/omp/am |
Интерфейс: | ru.omp.am.Identify |
Методы
- IdentifyByBusName(string name, string exe, string keyid)
Подробное описание
Сервис управления приложениями Application Management предоставляет доступ к сервису идентификации приложений.
Сервис идентификации может работать с изолированными, находящимися в контейнере, и с неизолированными процессами, и поддерживает идентификацию процессов, подключенных только к сессионной или системной шине.
Так как приложения, находящиеся в изоляции, имеют собственные PID namespace
и обрабатывают
все D-Bus запросы через dbus-proxy
, необходимо использовать сервис идентификации, чтобы корректно идентифицировать процесс.
Если приложение получает изолированное сообщение с неопределенного адреса,
сервис идентификации позволяет проверить всю цепочку и определить,
кто был адресатом изначально через dbus-proxy
и предоставить реальные идентификаторы обратившегося процесса в системе.
Для изолированных процессов используется D-Bus интерфейс сервиса ru.omp.am.Identify
,
в частности метод IdentifyByBusName().
Данный сервис имеет широкий спектр предоставляемой информации по процессу, который может быть открыт в API для публичного пользования и получения расширенной информации.
Такой механизм может быть использован, например,
если разработчик предоставляет какой-либо интерфейс,
но не хочет, чтобы другие процессы могли использовать его, в том числе и системные.
В таком случае разработчик сам настраивает фильтрацию того,
какие процессы имеют доступ к данному интерфейсу.
В целом, consumer
может сам распоряжаться полученной информацией.
Сервис лишь подтверждает, что процесс находится в системе легально
и предоставляет минимально необходимую информацию для его идентификации в системе.
Если consumer
разместит свой сервис на сторонней шине, отличной от системной и сессионной,
результат идентификации будет неверным, либо возникнет ошибка идентификации.
Например, процесс решил обратиться к сервису на сторонней шине
и получил в момент подключения к сторонней шине адрес :1.1
.
Если сервис выполнит идентификацию данного процесса при помощи сервиса идентификации на системной/сессионной шине,
он может получить в ответ данные другого процесса,
который ранее был зарегистрирован на системной/сессионной шине с именем :1.1
, либо может получить ошибку,
так как процесс с таким именем на системной/сессионной шине отсутствует.
Разработчику следует использовать шину, на которой зарегистрирован его сервис D-Bus.
В случае, если процесс, находящийся на сессионной шине, обращается к другому процессу, подключенному к системной шине, идентификация будет успешной. Так как процесс на сессионной шине во время запроса на системную шину, автоматически регистрируется на ней.
Описание методов
IdentifyByBusName(string name, string &exe, string &keyid)
Метод идентифицирует процесс по его D-Bus-адресу.
name
— это D-Bus-адрес, с которого была совершена попытка вызова метода.
Адрес может быть указан в формате :x.xxx
либо именованный адрес org.test.service
.
Метод возвращает полный путь до исполняемого файла процесса exe
и keyid
процесса.
Полученный keyid
берётся из расширенного атрибута security.ima
, а именно
из заголовочного файла подписи, что является достаточной и необходимой мерой
для идентификации данного процесса в системе как доверенного.
Пример метода в Qt
может использоваться в обработчике пользовательского метода
для получения D-Bus имени процесса, который вызвал данный метод.
В gdbus
можно использовать метод
g_dbus_method_invocation_get_sender()
.