diff options
Diffstat (limited to 'src/dbus')
-rw-r--r-- | src/dbus/qdbus_symbols_p.h | 3 | ||||
-rw-r--r-- | src/dbus/qdbusabstractinterface.cpp | 54 | ||||
-rw-r--r-- | src/dbus/qdbusabstractinterface_p.h | 2 | ||||
-rw-r--r-- | src/dbus/qdbusconnection_p.h | 2 | ||||
-rw-r--r-- | src/dbus/qdbusdemarshaller.cpp | 4 | ||||
-rw-r--r-- | src/dbus/qdbusintegrator.cpp | 13 | ||||
-rw-r--r-- | src/dbus/qdbusinternalfilters.cpp | 6 | ||||
-rw-r--r-- | src/dbus/qdbusserver.cpp | 27 | ||||
-rw-r--r-- | src/dbus/qdbusserver.h | 3 |
9 files changed, 84 insertions, 30 deletions
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/qdbusabstractinterface.cpp b/src/dbus/qdbusabstractinterface.cpp index bf92ccb30f..bbcd52294f 100644 --- a/src/dbus/qdbusabstractinterface.cpp +++ b/src/dbus/qdbusabstractinterface.cpp @@ -116,17 +116,16 @@ bool QDBusAbstractInterfacePrivate::canMakeCalls() const return true; } -void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant &where) const +bool QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, void *returnValuePtr) const { - if (!isValid || !canMakeCalls()) { // can't make calls - where.clear(); - return; - } + if (!isValid || !canMakeCalls()) // can't make calls + return false; + const int type = mp.userType(); // is this metatype registered? const char *expectedSignature = ""; if (int(mp.type()) != QMetaType::QVariant) { - expectedSignature = QDBusMetaType::typeToSignature(where.userType()); + expectedSignature = QDBusMetaType::typeToSignature(type); if (expectedSignature == 0) { qWarning("QDBusAbstractInterface: type %s must be registered with Qt D-Bus before it can be " "used to read property %s.%s", @@ -134,8 +133,7 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant & lastError = QDBusError(QDBusError::Failed, QString::fromLatin1("Unregistered type %1 cannot be handled") .arg(QLatin1String(mp.typeName()))); - where.clear(); - return; + return false; } } @@ -149,26 +147,29 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant & if (reply.type() != QDBusMessage::ReplyMessage) { lastError = QDBusError(reply); - where.clear(); - return; + return false; } if (reply.signature() != QLatin1String("v")) { QString errmsg = QLatin1String("Invalid signature `%1' in return from call to " DBUS_INTERFACE_PROPERTIES); lastError = QDBusError(QDBusError::InvalidSignature, errmsg.arg(reply.signature())); - where.clear(); - return; + return false; } QByteArray foundSignature; const char *foundType = 0; QVariant value = qvariant_cast<QDBusVariant>(reply.arguments().at(0)).variant(); - if (value.userType() == where.userType() || mp.userType() == QMetaType::QVariant + if (value.userType() == type || type == QMetaType::QVariant || (expectedSignature[0] == 'v' && expectedSignature[1] == '\0')) { // simple match - where = value; - return; + if (type == QMetaType::QVariant) { + *reinterpret_cast<QVariant*>(returnValuePtr) = value; + } else { + QMetaType::destruct(type, returnValuePtr); + QMetaType::construct(type, returnValuePtr, value.constData()); + } + return true; } if (value.userType() == qMetaTypeId<QDBusArgument>()) { @@ -178,8 +179,7 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant & foundSignature = arg.currentSignature().toLatin1(); if (foundSignature == expectedSignature) { // signatures match, we can demarshall - QDBusMetaType::demarshall(arg, where.userType(), where.data()); - return; + return QDBusMetaType::demarshall(arg, type, returnValuePtr); } } else { foundType = value.typeName(); @@ -196,8 +196,7 @@ void QDBusAbstractInterfacePrivate::property(const QMetaProperty &mp, QVariant & QString::fromUtf8(mp.name()), QString::fromLatin1(mp.typeName()), QString::fromLatin1(expectedSignature))); - where.clear(); - return; + return false; } bool QDBusAbstractInterfacePrivate::setProperty(const QMetaProperty &mp, const QVariant &value) @@ -246,13 +245,22 @@ int QDBusAbstractInterfaceBase::qt_metacall(QMetaObject::Call _c, int _id, void if (_c == QMetaObject::ReadProperty || _c == QMetaObject::WriteProperty) { QMetaProperty mp = metaObject()->property(saved_id); int &status = *reinterpret_cast<int *>(_a[2]); - QVariant &variant = *reinterpret_cast<QVariant *>(_a[1]); if (_c == QMetaObject::WriteProperty) { - status = d_func()->setProperty(mp, variant) ? 1 : 0; + QVariant value; + if (mp.userType() == qMetaTypeId<QDBusVariant>()) + value = reinterpret_cast<const QDBusVariant*>(_a[0])->variant(); + else + value = QVariant(mp.userType(), _a[0]); + status = d_func()->setProperty(mp, value) ? 1 : 0; } else { - d_func()->property(mp, variant); - status = variant.isValid() ? 1 : 0; + bool readStatus = d_func()->property(mp, _a[0]); + // Caller supports QVariant returns? Then we can also report errors + // by storing an invalid variant. + if (!readStatus && _a[1]) { + status = 0; + reinterpret_cast<QVariant*>(_a[1])->clear(); + } } _id = -1; } diff --git a/src/dbus/qdbusabstractinterface_p.h b/src/dbus/qdbusabstractinterface_p.h index 05ca04e3ef..e696781cdc 100644 --- a/src/dbus/qdbusabstractinterface_p.h +++ b/src/dbus/qdbusabstractinterface_p.h @@ -89,7 +89,7 @@ public: bool canMakeCalls() const; // these functions do not check if the property is valid - void property(const QMetaProperty &mp, QVariant &where) const; + bool property(const QMetaProperty &mp, void *returnValuePtr) const; bool setProperty(const QMetaProperty &mp, const QVariant &value); // return conn's d pointer 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<int> ¶ms); diff --git a/src/dbus/qdbusdemarshaller.cpp b/src/dbus/qdbusdemarshaller.cpp index 953b0f3d03..0728192748 100644 --- a/src/dbus/qdbusdemarshaller.cpp +++ b/src/dbus/qdbusdemarshaller.cpp @@ -244,9 +244,9 @@ QVariant QDBusDemarshaller::toVariantInternal() case DBUS_TYPE_BYTE: return QVariant::fromValue(toByte()); case DBUS_TYPE_INT16: - return QVariant::fromValue(toShort()); + return QVariant::fromValue(toShort()); case DBUS_TYPE_UINT16: - return QVariant::fromValue(toUShort()); + return QVariant::fromValue(toUShort()); case DBUS_TYPE_INT32: return toInt(); case DBUS_TYPE_UINT32: diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 77de09d197..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<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); @@ -986,9 +990,9 @@ void QDBusConnectionPrivate::deliverCall(QObject *object, int /*flags*/, const Q fail = object->qt_metacall(QMetaObject::InvokeMetaMethod, slotIdx, params.data()) >= 0; QDBusConnectionPrivate::setSender(0); - // the object might be deleted in the slot - if (!ptr.isNull()) - QDBusContextPrivate::set(object, old); + // the object might be deleted in the slot + if (!ptr.isNull()) + QDBusContextPrivate::set(object, old); } // do we create a reply? Only if the caller is waiting for a reply and one hasn't been sent @@ -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/qdbusinternalfilters.cpp b/src/dbus/qdbusinternalfilters.cpp index e9bfd19060..17e12f1bba 100644 --- a/src/dbus/qdbusinternalfilters.cpp +++ b/src/dbus/qdbusinternalfilters.cpp @@ -92,6 +92,12 @@ static const char propertiesInterfaceXml[] = " <arg name=\"values\" type=\"a{sv}\" direction=\"out\"/>\n" " <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out0\" value=\"QVariantMap\"/>\n" " </method>\n" + " <signal name=\"PropertiesChanged\">\n" + " <arg name=\"interface_name\" type=\"s\" direction=\"out\"/>\n" + " <arg name=\"changed_properties\" type=\"a{sv}\" direction=\"out\"/>\n" + " <annotation name=\"org.qtproject.QtDBus.QtTypeName.Out1\" value=\"QVariantMap\"/>\n" + " <arg name=\"invalidated_properties\" type=\"as\" direction=\"out\"/>\n" + " </signal>\n" " </interface>\n"; static const char peerInterfaceXml[] = 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 @@ -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 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); |