Russian Qt Forum
Ноябрь 23, 2024, 07:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] DBus - права доступа к системной шине.  (Прочитано 3785 раз)
Linux0ID
Гость
« : Февраль 03, 2013, 20:43 »

Доброго времени суток!
Пишу проект клиент-сервер. Предполагается, что сервер должен работать с правами суперпользователя и общаться с клиентом по средствам DBus. Поскольку документации мало, а ещё меньше внятной документации, начал с малого - создал архитектуру сервера и клиента и повесил на сервер 1 слот. Для sessionBus() это работало.

При попытке зарегистрировать сервис для systemBus, получил ошибку. Её решил поместив в "/etc/dbus-1/system.d/com.wifi.hostapd.ap.server.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 user="root">
    <allow own="com.wifi.hostapd.ap.server"/>
  </policy>
 
  <policy context="default">
    <allow send_interface="com.wifi.hostapd.ap.server"/>
    <allow receive_sender="com.wifi.hostapd.ap.server"/>
    <allow receive_interface="com.wifi.hostapd.ap.server"/>
  </policy>
 
</busconfig>

Сервис создан, но клиент не может вызвать ни один метод. А вот qdbusviewer может.

Код сервера и создание сервиса:

Код:
#include <QtCore/QCoreApplication>
#include <QtDBus/QtDBus>
#include "apserver.h"
#include <QDebug>
#define _NameObject_ "com.wifi.hostapd.ap.server"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    APServer ServerAP;

    QDBusConnection connection = QDBusConnection::systemBus();
    if(!connection.isConnected())
    {
        qDebug() << "Unconnected. Exit.";
        return -2;
    }

    bool ret = connection.registerService(_NameObject_);
    if(ret)
        qDebug()  << "Registred 1";
    else {
        qDebug() << "Unregistred 1. Exit.";
        return -1;
    }
    ret = connection.registerObject("/", &ServerAP, QDBusConnection::ExportAllSlots);
    if(ret)
        qDebug()  << "Registred 2";
    
    return a.exec();
}

apserver.h
Код:
#ifndef APSERVER_H
#define APSERVER_H
#include "traffic.h"

class APServer : public Traffic
{
    Q_OBJECT
public:
    APServer();
    
signals:
    
public slots:
    Q_INVOKABLE void test(QString a);
    
};

#endif // APSERVER_H

Клиент:
Код:
#include <QtGui/QApplication>
#include "apclient.h"
#include <QDebug>
#include <QtDBus>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    if(!QDBusConnection::systemBus().isConnected()) {
        qDebug() << "Error connection to DBus";
        return 1;
    }

    QDBusInterface iface("com.wifi.hostapd.ap.server", "/", "", QDBusConnection::systemBus());
    iface.call("test", "test from client");

    //APClient w;
    //w.show();
    
    return a.exec();
}

Что подскажите? Улыбающийся
Заранее спасибо. Улыбающийся
« Последнее редактирование: Февраль 17, 2013, 11:39 от Linux0ID » Записан
Linux0ID
Гость
« Ответ #1 : Февраль 17, 2013, 11:38 »

Решение:

Код:
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <!-- ../system.conf have denied everything, so we just punch some holes -->

  <policy context="default">
    <allow own="com.wifi.hostapd.ap.server"/>

    <allow send_destination="com.wifi.hostapd.ap.server"/>
    <allow receive_sender="com.wifi.hostapd.ap.server"/>

    <allow send_path="/com/wifi/hostapd/ap/server"/>
  </policy>

</busconfig>

Путь должен быть таким:
Код:
<allow send_path="/com/wifi/hostapd/ap/server"/>
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 20.