summaryrefslogtreecommitdiffstats
path: root/src/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/qdbus_symbols_p.h3
-rw-r--r--src/dbus/qdbusabstractinterface.cpp54
-rw-r--r--src/dbus/qdbusabstractinterface_p.h2
-rw-r--r--src/dbus/qdbusconnection_p.h2
-rw-r--r--src/dbus/qdbusdemarshaller.cpp4
-rw-r--r--src/dbus/qdbusintegrator.cpp13
-rw-r--r--src/dbus/qdbusinternalfilters.cpp6
-rw-r--r--src/dbus/qdbusserver.cpp27
-rw-r--r--src/dbus/qdbusserver.h3
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> &params);
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);