背景
DBus作为系统间进程通信的一个基础服务,使用方便。但是如何限制DBus服务的调用权限,只允许特定用户或是用户组,或是特定程序调用?下面是一个简单的Demo,获取调用者的相关信息,为DBus服务的鉴权提供有用的数据来源。
DBus服务
#include <QObject>
#include <QDBusVariant>
#include <QDBusContext>
class DBusDemo: public QObject, protected QDBusContext
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.example.QDBusDemo")
public:
explicit DBusDemo(QObject *parent = nullptr);
public slots:
QDBusVariant helloJerry(const QString &name);
};
#include "DBusDemo.h"
#include <QDBusConnection>
#include <QDebug>
#include <QDBusConnectionInterface>
#include <QDBusContext>
DBusDemo::DBusDemo(QObject *parent): QObject(parent), QDBusContext()
{
}
QDBusVariant DBusDemo::helloJerry(const QString &name)
{
QDBusConnection conn = connection();
QDBusMessage msg = message();
qDebug() << "Sender Name" << conn.interface()->serviceOwner(msg.service()).value();
qDebug() << "Sender Uid" << conn.interface()->serviceUid(msg.service()).value();
qDebug() << "Sender Pid " << conn.interface()->servicePid(msg.service()).value();
return QDBusVariant("Hello " + name);
}
DBus调用
#include <QDBusInterface>
#include <QDBusReply>
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDBusInterface *interface = new QDBusInterface("org.example.QDBusDemo",
"/org/example/QDBusDemo",
"org.example.QDBusDemo",
QDBusConnection::sessionBus());
QDBusReply<QVariant> msg = interface->call(QDBus::Block, "helloJerry", "qq");
qDebug() << msg.value();
return a.exec();
}
调用结果
Sender Name “:1.3290”
Sender Uid 1000
Sender Pid 13744