DBus отклоняет отправку сообщения пользовательской службе на системной шине - PullRequest
0 голосов
/ 10 июля 2020

Я пишу чат-бота, который (помимо других функций) позволяет администратору отправлять пользовательские сообщения в приложения для обмена мгновенными сообщениями через вызов DBus. Чат-бот создает сервис org.cdpa.cdpachan на системной шине, предоставляет интерфейс org.cdpa.bot_send_message и метод send_message. Я могу заставить любого пользователя зарегистрировать имя службы в файле конфигурации /usr/share/dbus-1/system.d/org.cdpa.cdpachan.conf

<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy context="default">
    <allow own="org.cdpa.cdpachan"/>
    <allow send_destination="org.cdpa.bot_send_message"/>
  </policy>
</busconfig>

Но отправка вызовов метода DBus моему чат-боту не выполняется, даже когда каждому пользователю разрешено отправлять ему сообщение . И сообщение об ошибке не очень помогает.

❯ dbus-send --system --print-reply --dest=org.cdpa.cdpachan /org/cdpa/cdpachan org.cdpa.bot_send_message.send_message string:"foobar"

Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.45410" (uid=1000 pid=741940 comm="dbus-send --system --print-reply --dest=org.cdpa.c") interface="org.cdpa.bot_send_message" member="send_message" error name="(unset)" requested_reply="0" destination="org.cdpa.cdpachan" (uid=1000 pid=741936 comm="./main ")

Почему это происходит? Как я могу это решить? Минимальный макет сервиса выглядит так (с использованием sdbus-c++)

#include <string>
#include <iostream>

#include <sdbus-c++/sdbus-c++.h>

sdbus::IObject* g_message_sender{};
bool on_send_message(const std::string& msg)
{
    std::cout << "Someone asked me to send a message!!!" << std::endl;
    g_message_sender->emitSignal("message_sent").onInterface("org.cdpa.bot_send_message").withArguments(true);
    return true;
}
int main()
{
    const std::string service_name = "org.cdpa.cdpachan";
    auto connection = sdbus::createSystemBusConnection(service_name);
    const std::string object_path = "/org/cdpa/cdpachan";
    auto message_sender = sdbus::createObject(*connection, object_path);
    g_message_sender = message_sender.get();
    const std::string interface_name = "org.cdpa.bot_send_message";
    message_sender->registerMethod("send_message").onInterface(interface_name).implementedAs(&on_send_message);
    message_sender->registerSignal("message_sent").onInterface(interface_name).withParameters<bool>();
    message_sender->finishRegistration();

    connection->enterEventLoop();
}

Спасибо

Изменить: Примечание: если я включу своего чат-бота в сессионную шину. Тогда нет никаких проблем. Но это не подходит для моего варианта использования.

1 Ответ

0 голосов
/ 10 июля 2020
<allow send_destination="org.cdpa.bot_send_message"/>

это похоже на имя вашего интерфейса. Вы, вероятно, захотите что-то вроде:

<allow send_destination="org.cdpa.cdpachan"
       send_interface="org.cdpa.bot_send_message"/>
...