diff options
author | Roland Winklmeier <[email protected]> | 2014-01-13 21:49:49 +0100 |
---|---|---|
committer | The Qt Project <[email protected]> | 2014-01-15 14:15:22 +0100 |
commit | 419a1f53d527583458da46d1508aab272fdf0280 (patch) | |
tree | 374c0a203d118e76a31f1bde3797c1ec01b76826 | |
parent | 40133df06fea67ab3983b90844cc2a8f47e6e20c (diff) |
Add method to QDBusServer to allow anonymous client connections.
This change adds a new method to QDBusServer to allow anonymous
connections. This is part of the DBus API and was not yet possible
to use with QDBusServer. It is set in the newConnection callback
when a new client tries to connect.
Anonymous connections are enabled by default in DBus but not allowed
by default.
[ChangeLog][QtDBus][QDBusServer] Added method to QDBusServer to allow
anonymous client connections, even if the connecting client is not
authenticated as a user.
Change-Id: I984c9e634101ecd2e67bb25c8d12bb1071836fd3
Reviewed-by: Thiago Macieira <[email protected]>
-rw-r--r-- | src/dbus/qdbus_symbols_p.h | 3 | ||||
-rw-r--r-- | src/dbus/qdbusconnection_p.h | 2 | ||||
-rw-r--r-- | src/dbus/qdbusintegrator.cpp | 7 | ||||
-rw-r--r-- | src/dbus/qdbusserver.cpp | 27 | ||||
-rw-r--r-- | src/dbus/qdbusserver.h | 3 |
5 files changed, 41 insertions, 1 deletions
diff --git a/src/dbus/qdbus_symbols_p.h b/src/dbus/qdbus_symbols_p.h index 9e81bac30e9..96f28ac8211 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 350e49a50d6..f2590f9c54e 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<int> ¶ms); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 7ec19d6fec6..1fef6d4d498 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<QDBusConnectionPrivate *>(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<qulonglong>(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 170e6ff5cf2..a9dd72036cf 100644 --- a/src/dbus/qdbusserver.cpp +++ b/src/dbus/qdbusserver.cpp @@ -150,6 +150,33 @@ QString QDBusServer::address() const } /*! + \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) This signal is emitted when a new client connection \a connection is diff --git a/src/dbus/qdbusserver.h b/src/dbus/qdbusserver.h index d455f8e0ec5..7a7f54b6c13 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); |