[Qt]获取DBus方法的调用者信息

背景

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

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值