From 0324c701d9cc8c656e6188b4e102e19e05c98201 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sun, 21 Dec 2008 15:07:40 +0100 Subject: [PATCH 1/1] added SignalProxy::isSecure() to determine if all connections are secure (ssl encrypted, localhost or internal connection) --- src/common/signalproxy.cpp | 39 ++++++++++++++++++- src/common/signalproxy.h | 15 ++++++- src/common/syncableobject.cpp | 1 - .../settingspages/identitiessettingspage.cpp | 5 ++- 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 58b9eda2..a9172fc2 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -212,6 +213,18 @@ void SignalProxy::IODevicePeer::dispatchSignal(const RequestType &requestType, c dispatchPackedFunc(QVariant(packedFunc)); } +bool SignalProxy::IODevicePeer::isSecure() const { + QSslSocket *sslSocket = qobject_cast(_device); + if(sslSocket) + return sslSocket->isEncrypted() || sslSocket->localAddress() == QHostAddress::LocalHost || sslSocket->localAddress() == QHostAddress::LocalHostIPv6; + + QAbstractSocket *socket = qobject_cast(_device); + if(socket) + return socket->localAddress() == QHostAddress::LocalHost || socket->localAddress() == QHostAddress::LocalHostIPv6; + + return false; +} + QString SignalProxy::IODevicePeer::address() const { QAbstractSocket *socket = qobject_cast(_device); if(socket) @@ -291,6 +304,8 @@ void SignalProxy::setProxyMode(ProxyMode mode) { void SignalProxy::init() { connect(&_heartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat())); _heartBeatTimer.start(30 * 1000); + _secure = false; + updateSecureState(); } void SignalProxy::initServer() { @@ -320,6 +335,11 @@ bool SignalProxy::addPeer(QIODevice* iodev) { connect(iodev, SIGNAL(disconnected()), this, SLOT(removePeerBySender())); connect(iodev, SIGNAL(readyRead()), this, SLOT(dataAvailable())); + QSslSocket *sslSocket = qobject_cast(iodev); + if(sslSocket) { + connect(iodev, SIGNAL(encrypted()), this, SLOT(updateSecureState())); + } + if(!iodev->parent()) iodev->setParent(this); @@ -328,6 +348,7 @@ bool SignalProxy::addPeer(QIODevice* iodev) { if(_peers.count() == 1) emit connected(); + updateSecureState(); return true; } @@ -355,6 +376,7 @@ bool SignalProxy::addPeer(SignalProxy* proxy) { if(_peers.count() == 1) emit connected(); + updateSecureState(); return true; } @@ -397,6 +419,8 @@ void SignalProxy::removePeer(QObject* dev) { delete peer; + updateSecureState(); + if(_peers.isEmpty()) emit disconnected(); } @@ -1122,7 +1146,7 @@ bool SignalProxy::methodsMatch(const QMetaMethod &signal, const QMetaMethod &slo signalsuffix = signalsuffix.mid(baseName.count()).toLower(); slotprefix = slotprefix.left(slotprefix.count() - baseName.count()).toLower(); } - + uint sizediff = qAbs(slotprefix.size() - signalsuffix.size()); int ratio = editingDistance(slotprefix, signalsuffix) - sizediff; // if(ratio < 2) { @@ -1287,3 +1311,16 @@ void SignalProxy::dumpSyncMap(SyncableObject *object) { iter++; } } + +void SignalProxy::updateSecureState() { + bool wasSecure = _secure; + + _secure = !_peers.isEmpty(); + PeerHash::const_iterator peerIter; + for(peerIter = _peers.constBegin(); peerIter != _peers.constEnd(); peerIter++) { + _secure &= (*peerIter)->isSecure(); + } + + if(wasSecure != _secure) + emit secureStateChanged(_secure); +} diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 755461e9..129a6a29 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -106,6 +106,8 @@ public: */ static bool readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVariant &item, bool compressed = false); + bool isSecure() const { return _secure; } + static QString methodBaseName(const QMetaMethod &method); const QList &argTypes(QObject *obj, int methodId); @@ -142,14 +144,18 @@ private slots: void sendHeartBeat(); void receiveHeartBeat(AbstractPeer *peer, const QVariantList ¶ms); void receiveHeartBeatReply(AbstractPeer *peer, const QVariantList ¶ms); - + + void updateSecureState(); + signals: void peerRemoved(QIODevice *dev); void connected(); void disconnected(); void objectInitialized(SyncableObject *); void lagUpdated(int lag); - + void securityChanged(bool); + void secureStateChanged(bool); + private: void init(); void initServer(); @@ -205,6 +211,7 @@ private: virtual ~AbstractPeer() {} inline PeerType type() const { return _type; } virtual void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms) = 0; + virtual bool isSecure() const = 0; private: PeerType _type; }; @@ -213,6 +220,7 @@ private: public: IODevicePeer(QIODevice *device, bool compress) : AbstractPeer(AbstractPeer::IODevicePeer), _device(device), byteCount(0), usesCompression(compress), sentHeartBeats(0), lag(0) {} virtual void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms); + virtual bool isSecure() const; inline void dispatchPackedFunc(const QVariant &packedFunc) { SignalProxy::writeDataToDevice(_device, packedFunc, usesCompression); } QString address() const; inline bool isOpen() const { return _device->isOpen(); } @@ -231,6 +239,7 @@ private: public: SignalProxyPeer(SignalProxy *sender, SignalProxy *receiver) : AbstractPeer(AbstractPeer::SignalProxyPeer), sender(sender), receiver(receiver) {} virtual void dispatchSignal(const RequestType &requestType, const QVariantList ¶ms); + virtual inline bool isSecure() const { return true; } private: SignalProxy *sender; SignalProxy *receiver; @@ -259,6 +268,8 @@ private: ProxyMode _proxyMode; QTimer _heartBeatTimer; + + bool _secure; // determines if all connections are in a secured state (using ssl or internal connections) friend class SignalRelay; }; diff --git a/src/common/syncableobject.cpp b/src/common/syncableobject.cpp index 96b159b0..ec34708a 100644 --- a/src/common/syncableobject.cpp +++ b/src/common/syncableobject.cpp @@ -100,7 +100,6 @@ QVariantMap SyncableObject::toVariantMap() { QMetaObject::invokeMethod(this, methodname.toAscii(), genericvalue); properties[SignalProxy::methodBaseName(method)] = value; - // qDebug() << ">>> SYNC:" << methodBaseName(method) << value; } // properties["Payload"] = QByteArray(10000000, 'a'); // for testing purposes return properties; diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index e51fa7aa..4f87c833 100644 --- a/src/qtui/settingspages/identitiessettingspage.cpp +++ b/src/qtui/settingspages/identitiessettingspage.cpp @@ -76,7 +76,10 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) connect(ui.nicknameList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); #ifdef HAVE_SSL - ui.keyAndCertSettings->setCurrentIndex(1); + if(Client::signalProxy()->isSecure()) + ui.keyAndCertSettings->setCurrentIndex(2); + else + ui.keyAndCertSettings->setCurrentIndex(1); #else ui.keyAndCertSettings->setCurrentIndex(0); #endif -- 2.20.1