[SCM] kdeconnect packaging branch, master, updated. debian/0.9g-1-1183-g9d69498
Maximiliano Curia
maxy at moszumanska.debian.org
Fri Oct 14 14:28:44 UTC 2016
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/kdeconnect.git;a=commitdiff;h=8b0f06e
The following commit has been merged in the master branch:
commit 8b0f06e484718fbd590f5c8f97a788dbbfd4b4c3
Author: Vineet Garg <grg.vineet at gmail.com>
Date: Wed Jul 8 00:22:10 2015 +0530
Code cleanup, fixed socket deletelater issue
---
core/backends/lan/downloadjob.cpp | 19 +++++-----
core/backends/lan/landevicelink.cpp | 40 ++++++++++-----------
core/backends/lan/landevicelink.h | 2 ++
core/backends/lan/lanlinkprovider.cpp | 65 ++++++++++++++++-------------------
core/backends/lan/lanlinkprovider.h | 2 +-
core/backends/lan/server.cpp | 10 ------
core/backends/lan/server.h | 3 --
core/backends/lan/uploadjob.cpp | 10 +++---
core/backends/lan/uploadjob.h | 2 +-
9 files changed, 68 insertions(+), 85 deletions(-)
diff --git a/core/backends/lan/downloadjob.cpp b/core/backends/lan/downloadjob.cpp
index 96b0b0b..bef28e0 100644
--- a/core/backends/lan/downloadjob.cpp
+++ b/core/backends/lan/downloadjob.cpp
@@ -28,13 +28,16 @@ DownloadJob::DownloadJob(QHostAddress address, QVariantMap transferInfo): KJob()
mSocket = QSharedPointer<QSslSocket>(new QSslSocket);
useSsl = transferInfo.value("useSsl", false).toBool();
- // Setting socket property, but useful only when payload is sent using ssl
- mSocket->setLocalCertificate(KdeConnectConfig::instance()->certificate());
- mSocket->setPrivateKey(KdeConnectConfig::instance()->privateKeyPath());
- mSocket->setProtocol(QSsl::TlsV1_2);
- mSocket->setPeerVerifyName(transferInfo.value("deviceId").toString());
- mSocket->setPeerVerifyMode(QSslSocket::VerifyPeer);
- mSocket->addCaCertificate(QSslCertificate(KdeConnectConfig::instance()->getTrustedDevice(transferInfo.value("deviceId").toString()).certificate.toLatin1()));
+ // Setting ssl related properties for socket when using ssl
+ if (useSsl) {
+ mSocket->setLocalCertificate(KdeConnectConfig::instance()->certificate());
+ mSocket->setPrivateKey(KdeConnectConfig::instance()->privateKeyPath());
+ mSocket->setProtocol(QSsl::TlsV1_2);
+ mSocket->setPeerVerifyName(transferInfo.value("deviceId").toString());
+ mSocket->setPeerVerifyMode(QSslSocket::VerifyPeer);
+ mSocket->addCaCertificate(QSslCertificate(KdeConnectConfig::instance()->getTrustedDevice(
+ transferInfo.value("deviceId").toString()).certificate.toLatin1()));
+ }
}
void DownloadJob::start()
@@ -42,7 +45,7 @@ void DownloadJob::start()
//kDebug(kdeconnect_kded()) << "DownloadJob Start";
if (useSsl) {
qDebug() << "Connecting to host encrypted";
- // Cannot use read only, might be due to ssl handshake
+ // Cannot use read only, might be due to ssl handshake, getting QIODevice::ReadOnly error and no connection
mSocket->connectToHostEncrypted(mAddress.toString(), mPort, QIODevice::ReadWrite);
mSocket->waitForEncrypted();
} else {
diff --git a/core/backends/lan/landevicelink.cpp b/core/backends/lan/landevicelink.cpp
index a1f0544..5a6884d 100644
--- a/core/backends/lan/landevicelink.cpp
+++ b/core/backends/lan/landevicelink.cpp
@@ -57,14 +57,7 @@ void LanDeviceLink::setOnSsl(bool value) {
bool LanDeviceLink::sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np)
{
if (np.hasPayload()) {
- QVariantMap sslInfo;
- if (onSsl) {
- sslInfo.insert("useSsl", true);
- sslInfo.insert("deviceId", deviceId());
- }
- UploadJob* job = new UploadJob(np.payload(), sslInfo);
- job->start();
- np.setPayloadTransferInfo(job->getTransferInfo());
+ np.setPayloadTransferInfo(sendPayload(np)->getTransferInfo());
}
if (!onSsl) {
@@ -82,20 +75,25 @@ bool LanDeviceLink::sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np
bool LanDeviceLink::sendPackage(NetworkPackage& np)
{
if (np.hasPayload()) {
- QVariantMap sslInfo;
- if (onSsl) {
- sslInfo.insert("useSsl", true);
- sslInfo.insert("deviceId", deviceId());
- }
- UploadJob* job = new UploadJob(np.payload(), sslInfo);
- job->start();
- np.setPayloadTransferInfo(job->getTransferInfo());
+ np.setPayloadTransferInfo(sendPayload(np)->getTransferInfo());
}
int written = mSocketLineReader->write(np.serialize());
return (written != -1);
}
+UploadJob* LanDeviceLink::sendPayload(NetworkPackage& np)
+{
+ QVariantMap transferInfo;
+ if (onSsl) {
+ transferInfo.insert("useSsl", true);
+ transferInfo.insert("deviceId", deviceId());
+ }
+ UploadJob* job = new UploadJob(np.payload(), transferInfo);
+ job->start();
+ return job;
+}
+
void LanDeviceLink::dataReceived()
{
@@ -116,15 +114,13 @@ void LanDeviceLink::dataReceived()
if (unserialized.hasPayloadTransferInfo()) {
// qCDebug(KDECONNECT_CORE) << "HasPayloadTransferInfo";
- // FIXME : Directly setting these values to payloadTransferInfo now working
- QVariantMap sslInfo = unserialized.payloadTransferInfo();
+ QVariantMap transferInfo = unserialized.payloadTransferInfo();
if (onSsl) {
- sslInfo.insert("useSsl", true);
- sslInfo.insert("deviceId", deviceId());
+ transferInfo.insert("useSsl", true);
+ transferInfo.insert("deviceId", deviceId());
}
- DownloadJob* job = new DownloadJob(mSocketLineReader->peerAddress(), sslInfo);
+ DownloadJob* job = new DownloadJob(mSocketLineReader->peerAddress(), transferInfo);
job->start();
- qCDebug(KDECONNECT_CORE) << "Checking payload status " << job->getPayload().isNull();
unserialized.setPayload(job->getPayload(), unserialized.payloadSize());
}
diff --git a/core/backends/lan/landevicelink.h b/core/backends/lan/landevicelink.h
index ed40c47..d4507ec 100644
--- a/core/backends/lan/landevicelink.h
+++ b/core/backends/lan/landevicelink.h
@@ -26,6 +26,7 @@
#include <QSslSocket>
#include "../devicelink.h"
+#include "uploadjob.h"
class SocketLineReader;
@@ -40,6 +41,7 @@ public:
void setOnSsl(bool value);
bool sendPackage(NetworkPackage& np);
bool sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np);
+ UploadJob* sendPayload(NetworkPackage&);
private Q_SLOTS:
void dataReceived();
diff --git a/core/backends/lan/lanlinkprovider.cpp b/core/backends/lan/lanlinkprovider.cpp
index 6f0b33e..3ccf680 100644
--- a/core/backends/lan/lanlinkprovider.cpp
+++ b/core/backends/lan/lanlinkprovider.cpp
@@ -121,7 +121,7 @@ void LanLinkProvider::newUdpConnection()
NetworkPackage* receivedPackage = new NetworkPackage("");
bool success = NetworkPackage::unserialize(datagram, receivedPackage);
- qCDebug(KDECONNECT_CORE) << "Datagram " << datagram.data() ;
+ //qCDebug(KDECONNECT_CORE) << "Datagram " << datagram.data() ;
if (!success || receivedPackage->type() != PACKAGE_TYPE_IDENTITY) {
delete receivedPackage;
@@ -182,6 +182,9 @@ void LanLinkProvider::connected()
configureSocket(socket);
+ // If socket disconnects due to any reason after connection, link on ssl faliure
+ connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
+
NetworkPackage* receivedPackage = receivedIdentityPackages[socket].np;
const QString& deviceId = receivedPackage->get<QString>("deviceId");
//qCDebug(KDECONNECT_CORE) << "Connected" << socket->isWritable();
@@ -221,12 +224,9 @@ void LanLinkProvider::connected()
connect(socket, SIGNAL(encrypted()), this, SLOT(encrypted()));
socket->startServerEncryption();
- return; // Return statement prevents from deleting received pacakage, needed in slot "encrypted"
+ return; // Return statement prevents from deleting received package, needed in slot "encrypted"
} else {
- LanDeviceLink* deviceLink = new LanDeviceLink(deviceId, this, socket);
- connect(deviceLink, SIGNAL(destroyed(QObject*)),
- this, SLOT(deviceLinkDestroyed(QObject*)));
- addLink(deviceLink, receivedPackage);
+ addLink(deviceId, socket, receivedPackage);
}
} else {
@@ -246,6 +246,7 @@ void LanLinkProvider::encrypted() {
qCDebug(KDECONNECT_CORE) << "Socket encrypted";
QSslSocket* socket = qobject_cast<QSslSocket*>(sender());
+ if (!socket) return;
disconnect(socket, SIGNAL(encrypted()), this, SLOT(encrypted()));
disconnect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
@@ -255,9 +256,7 @@ void LanLinkProvider::encrypted() {
receivedPackage->set("certificate", socket->peerCertificate().toPem());
- LanDeviceLink* deviceLink = new LanDeviceLink(deviceId, this, socket);
- deviceLink->setOnSsl(true);
- addLink(deviceLink, receivedPackage);
+ addLink(deviceId, socket, receivedPackage);
// Copied from connected slot, now delete received package
delete receivedPackage;
@@ -267,24 +266,19 @@ void LanLinkProvider::encrypted() {
void LanLinkProvider::sslErrors(QList<QSslError> errors)
{
- // This should be called when using verifyPeer, as Host name would not match
- // Ignore that error, if there is any other, close socket and disconnect connection
- // Unpair too ?
-
- // TODO : If certificate mismatch, unpair it
- // TODO : Socket is closed itself when there are errors in ssl, to check if it is deleted of not
-
QSslSocket* socket = qobject_cast<QSslSocket*>(sender());
+ if (!socket) return;
disconnect(socket, SIGNAL(encrypted()), this, SLOT(encrypted()));
disconnect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
+ foreach(QSslError error, errors) {
+ qCDebug(KDECONNECT_CORE) << "SSL Error :" << error.errorString();
+ //TODO: Check for varius error here
+ }
+
delete receivedIdentityPackages[socket].np;
receivedIdentityPackages.remove(socket);
-
-// This delete caused error due to use of delete later slot
-// delete socket;
-
-
+ // Socket disconnects itself on ssl error and will be deleted by deleteLater slot, no need to delete manually
}
@@ -297,7 +291,7 @@ void LanLinkProvider::newConnection(QSslSocket* socket)
configureSocket(socket);
//This socket is still managed by us (and child of the QTcpServer), if
//it disconnects before we manage to pass it to a LanDeviceLink, it's
- //our responsability to delete it. We do so with this connection.
+ //our responsibility to delete it. We do so with this connection.
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
@@ -326,11 +320,8 @@ void LanLinkProvider::dataReceived()
const QString& deviceId = np->get<QString>("deviceId");
//qCDebug(KDECONNECT_CORE) << "Handshaking done (i'm the new device)";
- //This socket will now be owned by the LanDeviceLink, forget about it
- disconnect(socket, SIGNAL(readyRead()),
- this, SLOT(dataReceived()));
- disconnect(socket, SIGNAL(disconnected()),
- socket, SLOT(deleteLater()));
+ //This socket will now be owned by the LanDeviceLink or we don't want more data to be received, forget about it
+ disconnect(socket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
if (NetworkPackage::ProtocolVersion <= np->get<int>("protocolVersion")) {
@@ -339,7 +330,7 @@ void LanLinkProvider::dataReceived()
bool isDeviceTrusted = KdeConnectConfig::instance()->trustedDevices().contains(deviceId);
- socket->setPeerVerifyName(np->get<QString>("deviceId"));
+ socket->setPeerVerifyName(deviceId);
if (isDeviceTrusted) {
qDebug() << "Device trusted";
@@ -358,10 +349,7 @@ void LanLinkProvider::dataReceived()
socket->startClientEncryption();
} else {
- LanDeviceLink* deviceLink = new LanDeviceLink(deviceId, this, socket);
- connect(deviceLink, SIGNAL(destroyed(QObject*)),
- this, SLOT(deviceLinkDestroyed(QObject*)));
- addLink(deviceLink, np);
+ addLink(deviceId, socket, np);
}
}
@@ -408,10 +396,17 @@ void LanLinkProvider::configureSocket(QSslSocket* socket)
}
-void LanLinkProvider::addLink(LanDeviceLink* deviceLink, NetworkPackage* receivedPackage) {
+void LanLinkProvider::addLink(QString deviceId, QSslSocket* socket, NetworkPackage* receivedPackage) {
- connect(deviceLink, SIGNAL(destroyed(QObject*)),
- this, SLOT(deviceLinkDestroyed(QObject*)));
+ LanDeviceLink* deviceLink = new LanDeviceLink(deviceId, this, socket);
+ connect(deviceLink, SIGNAL(destroyed(QObject*)), this, SLOT(deviceLinkDestroyed(QObject*)));
+
+ // Socket disconnection will now be handled by LanDeviceLink
+ disconnect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
+
+ if (socket->isEncrypted()) {
+ deviceLink->setOnSsl(true);
+ }
//We kill any possible link from this same device
QMap< QString, DeviceLink* >::iterator oldLinkIterator = mLinks.find(deviceLink->deviceId());
diff --git a/core/backends/lan/lanlinkprovider.h b/core/backends/lan/lanlinkprovider.h
index 530a3dd..d5dce06 100644
--- a/core/backends/lan/lanlinkprovider.h
+++ b/core/backends/lan/lanlinkprovider.h
@@ -43,7 +43,7 @@ public:
QString name() { return "LanLinkProvider"; }
int priority() { return PRIORITY_HIGH; }
- void addLink(LanDeviceLink* deviceLink, NetworkPackage* receivedPackage);
+ void addLink(QString, QSslSocket*, NetworkPackage*);
public Q_SLOTS:
virtual void onNetworkChange();
diff --git a/core/backends/lan/server.cpp b/core/backends/lan/server.cpp
index ca6c17f..ea59193 100644
--- a/core/backends/lan/server.cpp
+++ b/core/backends/lan/server.cpp
@@ -34,21 +34,11 @@ Server::Server(QObject * parent)
}
void Server::incomingConnection(qintptr socketDescriptor) {
- qDebug() << "Incoming connection";
QSslSocket *serverSocket = new QSslSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
- qDebug() << "Setting socket descriptor";
- connect(serverSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
Q_EMIT newConnection(serverSocket);
- qDebug() << "Signal emiited";
} else {
- qDebug() << "Delete socket";
delete serverSocket;
}
}
-
-void Server::disconnected() {
- QSslSocket* socket = qobject_cast<QSslSocket*>(sender());
- qDebug() << socket->errorString();
-}
diff --git a/core/backends/lan/server.h b/core/backends/lan/server.h
index 2a1a603..f43534f 100644
--- a/core/backends/lan/server.h
+++ b/core/backends/lan/server.h
@@ -38,9 +38,6 @@ public:
protected:
virtual void incomingConnection(qintptr socketDescriptor);
-public Q_SLOTS:
- void disconnected();
-
Q_SIGNALS:
void newConnection(QSslSocket*);
};
diff --git a/core/backends/lan/uploadjob.cpp b/core/backends/lan/uploadjob.cpp
index 6accc7f..a402c25 100644
--- a/core/backends/lan/uploadjob.cpp
+++ b/core/backends/lan/uploadjob.cpp
@@ -25,7 +25,7 @@
#include "uploadjob.h"
#include "core_debug.h"
-UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, QVariantMap sslInfo): KJob()
+UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, QVariantMap transferInfo): KJob()
{
mInput = source;
mServer = new Server(this);
@@ -33,7 +33,7 @@ UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, QVariantMap sslInf
mPort = 0;
// We will use this info if link is on ssl, to send encrypted payload
- this->sslInfo = sslInfo;
+ this->transferInfo = transferInfo;
connect(mInput.data(), SIGNAL(readyRead()), this, SLOT(readyRead()));
connect(mInput.data(), SIGNAL(aboutToClose()), this, SLOT(aboutToClose()));
@@ -62,12 +62,12 @@ void UploadJob::newConnection(QSslSocket* socket)
mSocket = socket;
- if (sslInfo.value("useSsl", false).toBool()) {
+ if (transferInfo.value("useSsl", false).toBool()) {
mSocket->setLocalCertificate(KdeConnectConfig::instance()->certificate());
mSocket->setPrivateKey(KdeConnectConfig::instance()->privateKeyPath());
mSocket->setProtocol(QSsl::TlsV1_2);
- mSocket->setPeerVerifyName(sslInfo.value("deviceId").toString());
- mSocket->addCaCertificate(QSslCertificate(KdeConnectConfig::instance()->getTrustedDevice(sslInfo.value("deviceId").toString()).certificate.toLatin1()));
+ mSocket->setPeerVerifyName(transferInfo.value("deviceId").toString());
+ mSocket->addCaCertificate(QSslCertificate(KdeConnectConfig::instance()->getTrustedDevice(transferInfo.value("deviceId").toString()).certificate.toLatin1()));
mSocket->startServerEncryption();
mSocket->waitForEncrypted();
}
diff --git a/core/backends/lan/uploadjob.h b/core/backends/lan/uploadjob.h
index e7fd833..056e4e2 100644
--- a/core/backends/lan/uploadjob.h
+++ b/core/backends/lan/uploadjob.h
@@ -43,7 +43,7 @@ private:
Server* mServer;
QSslSocket* mSocket;
quint16 mPort;
- QVariantMap sslInfo;
+ QVariantMap transferInfo;
private Q_SLOTS:
void readyRead();
--
kdeconnect packaging
More information about the pkg-kde-commits
mailing list