From: Janne Koschinski Date: Mon, 28 Aug 2017 02:17:45 +0000 (+0200) Subject: Migrate password change RPC to the new target restriction system X-Git-Tag: travis-deploy-test~222 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=b1b970e71618cb2d2cf372ba55234000c6324d7f Migrate password change RPC to the new target restriction system --- diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index e37986b6..c656e9c0 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -156,10 +156,7 @@ int SignalProxy::SignalRelay::qt_metacall(QMetaObject::Call _c, int _id, void ** params << QVariant(argTypes[i], _a[i+1]); } - if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxy()->proxyMode() == SignalProxy::Server) { - Peer *peer = params[0].value(); - proxy()->dispatch(peer, RpcCall(signal.signature, params)); - } else if (proxy()->_restrictMessageTarget) { + if (proxy()->_restrictMessageTarget) { for (auto peer : proxy()->_restrictedTargets) { if (peer != nullptr) proxy()->dispatch(peer, RpcCall(signal.signature, params)); @@ -673,12 +670,8 @@ bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList qWarning() << "SignalProxy::invokeSlot(): incompatible param types to invoke" << eMeta->methodName(methodId); return false; } - // if first arg is a PeerPtr, replace it by the address of the peer originally receiving the RpcCall - if (peer && i == 0 && args[0] == qMetaTypeId()) { - QVariant v = QVariant::fromValue(peer); - _a[1] = const_cast(v.constData()); - } else - _a[i+1] = const_cast(params[i].constData()); + + _a[i+1] = const_cast(params[i].constData()); } if (returnValue.type() != QVariant::Invalid) @@ -689,9 +682,11 @@ bool SignalProxy::invokeSlot(QObject *receiver, int methodId, const QVariantList : Qt::QueuedConnection; if (type == Qt::DirectConnection) { - return receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0; - } - else { + _sourcePeer = peer; + auto result = receiver->qt_metacall(QMetaObject::InvokeMetaMethod, methodId, _a) < 0; + _sourcePeer = nullptr; + return result; + } else { qWarning() << "Queued Connections are not implemented yet"; // note to self: qmetaobject.cpp:990 ff return false; @@ -770,9 +765,11 @@ void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode params << QVariant(argTypes[i], va_arg(ap, void *)); } - if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxyMode() == SignalProxy::Server) { - Peer *peer = params[0].value(); - dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + if (_restrictMessageTarget) { + for (auto peer : _restrictedTargets) { + if (peer != nullptr) + dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + } } else dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); } @@ -841,11 +838,6 @@ Peer *SignalProxy::peerById(int peerId) { return _peerMap[peerId]; } -/** - * This method allows to send a signal only to a limited set of peers - * @param peerIds A list of peers that should receive it - * @param closure Code you want to execute within of that restricted environment - */ void SignalProxy::restrictTargetPeers(std::initializer_list peers, std::function closure) { auto previousRestrictMessageTarget = _restrictMessageTarget; diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index b0933968..a985d0dc 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -78,6 +78,11 @@ public: void dumpProxyStats(); void dumpSyncMap(SyncableObject *object); + /** + * This method allows to send a signal only to a limited set of peers + * @param peerIds A list of peers that should receive it + * @param closure Code you want to execute within of that restricted environment + */ void restrictTargetPeers(std::initializer_list peerIds, std::function closure); inline int peerCount() const { return _peers.size(); } @@ -85,6 +90,11 @@ public: Peer *peerById(int peerId); + /** + * @return If handling a signal, the Peer from which the current signal originates + */ + Peer *sourcePeer() { return _sourcePeer; } + public slots: void detachObject(QObject *obj); void detachSignals(QObject *sender); @@ -178,6 +188,8 @@ private: QSet _restrictedTargets; bool _restrictMessageTarget = false; + Peer *_sourcePeer; + friend class SignalRelay; friend class SyncableObject; friend class Peer; diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index ea584f9c..518246a9 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -718,19 +718,18 @@ void CoreSession::changePassword(PeerPtr peer, const QString &userName, const QS if (uid.isValid() && uid == user()) success = Core::changeUserPassword(uid, newPassword); - emit passwordChanged(peer, success); + signalProxy()->restrictTargetPeers({signalProxy()->sourcePeer()}, [&]{ + emit passwordChanged(nullptr, success); + }); } void CoreSession::kickClient(int peerId) { - qWarning() << "kickClient(" << peerId << ")"; - auto peer = signalProxy()->peerById(peerId); if (peer == nullptr) { qWarning() << "Invalid peer Id: " << peerId; return; } signalProxy()->restrictTargetPeers({peer}, [&]{ - qWarning() << "executing closure"; emit disconnectFromCore(); }); }