Пример dbus - on_name_lost промежуточно после on_name_acquired

Я был в состоянии работать с dbus как клиент, но если я скомпилирую https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-server.c on_name_acquired обратный вызов вызывается и промежуточно после обратного вызова on_name_lost называется. Единственное, что я сделал, это то, что я использую G_BUS_TYPE_SYSTEM вместо G_BUS_TYPE_SESSION

Я только думаю, что это какая-то проблема аутентификации.

1 ответ

В отличие от сеансовой шины, системная шина имеет политику безопасности, которая не позволяет произвольным процессам запрашивать произвольные общеизвестные имена на шине. Вам необходимо установить файл конфигурации для системной шины, чтобы позволить вашей службе иметь имя:

Правила с own или же own_prefix Атрибут проверяется, когда соединение пытается владеть известными именами шин. Как особый случай, own="*" соответствует любому известному названию автобуса. Широко известная сеансовая шина обычно позволяет любому соединению иметь любое имя, в то время как общеизвестная системная шина обычно не позволяет любому соединению иметь любое имя, кроме случаев, когда это разрешено дальнейшей конфигурацией. Системные службы, которым будет принадлежать имя, должны установить конфигурацию, которая позволяет им это делать, обычно с помощью правил в форме <policy user="some-system-user"><allow own="…"/></policy>,

Это означает установку файла конфигурации, подобного следующему в /usr/share/dbus-1/system.d/org.mydomain.MyService1.conf:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <!-- Only my-service-user can own the service -->
  <policy user="my-service-user">
    <allow own="org.mydomain.MyService1"/>
  </policy>

  <!-- Anyone can send messages to the service -->
  <policy context="default">
    <allow send_destination="org.mydomain.MyService1"/>
  </policy>
</busconfig>

Затем вы должны запустить процесс вашего сервиса как my-service-user пользователь.

Раздел учебного руководства по разработке API-интерфейса D-Bus, посвященный политикам безопасности, является весьма полезным.

Другие вопросы по тегам