diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h index 9e81bac30e..96f28ac821 100644 --- a/src/dbus/qdbus_symbols_p.h +++ b/src/dbus/qdbus_symbols_p.h @@ -183,6 +183,9 @@ DEFINEFUNC(unsigned int , dbus_watch_get_flags, (DBusWatch *watch), DEFINEFUNC(dbus_bool_t , dbus_watch_handle, (DBusWatch *watch, unsigned int flags), (watch, flags), return) +DEFINEFUNC(void , dbus_connection_set_allow_anonymous, (DBusConnection *connection, + dbus_bool_t value), + (connection, value), return) /* dbus-errors.h */ DEFINEFUNC(void , dbus_error_free, (DBusError *error), diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 350e49a50d..f2590f9c54 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -322,6 +322,8 @@ public: QMutex callDeliveryMutex; QDBusCallDeliveryEvent *callDeliveryState; // protected by the callDeliveryMutex mutex + bool anonymousAuthenticationAllowed; + public: // static methods static int findSlot(QObject *obj, const QByteArray &normalizedName, QVector ¶ms); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 7ec19d6fec..1fef6d4d49 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -391,6 +391,10 @@ static void qDBusNewConnection(DBusServer *server, DBusConnection *connection, v q_dbus_connection_ref(connection); QDBusConnectionPrivate *serverConnection = static_cast(data); + // allow anonymous authentication + if (serverConnection->anonymousAuthenticationAllowed) + q_dbus_connection_set_allow_anonymous(connection, true); + QDBusConnectionPrivate *newConnection = new QDBusConnectionPrivate(serverConnection->parent()); QMutexLocker locker(&QDBusConnectionManager::instance()->mutex); QDBusConnectionManager::instance()->setConnection(QLatin1String("QDBusServer-") + QString::number(reinterpret_cast(newConnection)), newConnection); @@ -1014,7 +1018,8 @@ extern bool qDBusInitThreads(); QDBusConnectionPrivate::QDBusConnectionPrivate(QObject *p) : QObject(p), ref(1), capabilities(0), mode(InvalidMode), connection(0), server(0), busService(0), watchAndTimeoutLock(QMutex::Recursive), - rootNode(QString(QLatin1Char('/'))) + rootNode(QString(QLatin1Char('/'))), + anonymousAuthenticationAllowed(false) { static const bool threads = q_dbus_threads_init_default(); static const int debugging = qgetenv("QDBUS_DEBUG").toInt(); diff --git a/src/dbus/qdbusserver.cpp b/src/dbus/qdbusserver.cpp index 170e6ff5cf..a9dd72036c 100644 --- a/src/dbus/qdbusserver.cpp +++ b/src/dbus/qdbusserver.cpp @@ -149,6 +149,33 @@ QString QDBusServer::address() const return addr; } +/*! + \since 5.3 + + If \a value is set to true, an incoming connection can proceed even if the + connecting client is not authenticated as a user. + + By default, this value is false. + + \sa isAnonymousAuthenticationAllowed() +*/ +void QDBusServer::setAnonymousAuthenticationAllowed(bool value) +{ + d->anonymousAuthenticationAllowed = value; +} + +/*! + \since 5.3 + + Returns true if anonymous authentication is allowed. + + \sa setAnonymousAuthenticationAllowed() +*/ +bool QDBusServer::isAnonymousAuthenticationAllowed() const +{ + return d->anonymousAuthenticationAllowed; +} + /*! \fn void QDBusServer::newConnection(const QDBusConnection &connection) diff --git a/src/dbus/qdbusserver.h b/src/dbus/qdbusserver.h index d455f8e0ec..7a7f54b6c1 100644 --- a/src/dbus/qdbusserver.h +++ b/src/dbus/qdbusserver.h @@ -66,6 +66,9 @@ public: QDBusError lastError() const; QString address() const; + void setAnonymousAuthenticationAllowed(bool value); + bool isAnonymousAuthenticationAllowed() const; + Q_SIGNALS: void newConnection(const QDBusConnection &connection);