[SCM] kdeconnect packaging branch, master, updated. debian/0.9g-1-1183-g9d69498

Maximiliano Curia maxy at moszumanska.debian.org
Fri Oct 14 14:29:55 UTC 2016


Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/kdeconnect.git;a=commitdiff;h=ef98fb4

The following commit has been merged in the master branch:
commit ef98fb4587a31d53e03f36bae0f74e058d9ba944
Author: Aleix Pol <aleixpol at kde.org>
Date:   Wed Jun 22 17:49:45 2016 +0200

    Fix file transfer under SSL
    
    Introduces a big fat buffer :(
    Actually test the trasfers :)
    Takes QSslSocket causistic into account, for some reason QNAM refuses to
    mark as finished when the QSslSocket (through QIODevice) closes.
    It would be good to look into dropping the QBuffer, doing so with the test
    in place will help.
---
 core/backends/lan/downloadjob.cpp | 27 ++++++++++++-------
 core/backends/lan/downloadjob.h   |  2 ++
 core/backends/lan/uploadjob.cpp   | 40 ++++++++++++++++++++++------
 core/backends/lan/uploadjob.h     |  8 ++++--
 core/filetransferjob.cpp          |  2 +-
 tests/sendfiletest.cpp            | 56 +++++++++++++++++++++++++++++++++++++++
 6 files changed, 115 insertions(+), 20 deletions(-)

diff --git a/core/backends/lan/downloadjob.cpp b/core/backends/lan/downloadjob.cpp
index 269e7bc..3ddc08a 100644
--- a/core/backends/lan/downloadjob.cpp
+++ b/core/backends/lan/downloadjob.cpp
@@ -37,9 +37,13 @@ DownloadJob::DownloadJob(const QHostAddress &address, const QVariantMap &transfe
     : KJob()
     , mAddress(address)
     , mPort(transferInfo["port"].toInt())
-    , mSocket(new QSslSocket(this))
+    , mSocket(new QSslSocket)
+    , mBuffer(new QBuffer)
 {
     LanLinkProvider::configureSslSocket(mSocket.data(), transferInfo.value("deviceId").toString(), true);
+
+    connect(mSocket.data(), SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketFailed(QAbstractSocket::SocketError)));
+//     connect(mSocket.data(), &QAbstractSocket::stateChanged, [](QAbstractSocket::SocketState state){ qDebug() << "statechange" << state; });
 }
 
 DownloadJob::~DownloadJob()
@@ -50,23 +54,28 @@ DownloadJob::~DownloadJob()
 void DownloadJob::start()
 {
     //TODO: Timeout?
-    connect(mSocket.data(), &QAbstractSocket::disconnected, this, &DownloadJob::emitResult);
-    connect(mSocket.data(), SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketFailed(QAbstractSocket::SocketError)));
-//     connect(mSocket.data(), &QAbstractSocket::stateChanged, [](QAbstractSocket::SocketState state){ qDebug() << "statechange" << state; });
-
     // Cannot use read only, might be due to ssl handshake, getting QIODevice::ReadOnly error and no connection
     mSocket->connectToHostEncrypted(mAddress.toString(), mPort, QIODevice::ReadWrite);
+
+    bool b = mBuffer->open(QBuffer::ReadWrite);
+    Q_ASSERT(b);
 }
 
 void DownloadJob::socketFailed(QAbstractSocket::SocketError error)
 {
-    qWarning(KDECONNECT_CORE) << "error..." << mSocket->errorString();
-    setError(error + 1);
-    setErrorText(mSocket->errorString());
+    if (error != QAbstractSocket::RemoteHostClosedError) { //remote host closes when finishes
+        qWarning(KDECONNECT_CORE) << "error..." << mSocket->errorString();
+        setError(error + 1);
+        setErrorText(mSocket->errorString());
+    } else {
+        auto ba = mSocket->readAll();
+        mBuffer->write(ba);
+        mBuffer->seek(0);
+    }
     emitResult();
 }
 
 QSharedPointer<QIODevice> DownloadJob::getPayload()
 {
-    return mSocket.staticCast<QIODevice>();
+    return mBuffer.staticCast<QIODevice>();
 }
diff --git a/core/backends/lan/downloadjob.h b/core/backends/lan/downloadjob.h
index 6100e41..76a74b7 100644
--- a/core/backends/lan/downloadjob.h
+++ b/core/backends/lan/downloadjob.h
@@ -29,6 +29,7 @@
 #include <QTcpSocket>
 #include <QSharedPointer>
 #include <QSslSocket>
+#include <QBuffer>
 #include <kdeconnectcore_export.h>
 
 
@@ -46,6 +47,7 @@ private:
     QHostAddress mAddress;
     qint16 mPort;
     QSharedPointer<QSslSocket> mSocket;
+    QSharedPointer<QBuffer> mBuffer;
 
 private Q_SLOTS:
     void socketFailed(QAbstractSocket::SocketError error);
diff --git a/core/backends/lan/uploadjob.cpp b/core/backends/lan/uploadjob.cpp
index 85e2035..09fe36f 100644
--- a/core/backends/lan/uploadjob.cpp
+++ b/core/backends/lan/uploadjob.cpp
@@ -27,7 +27,8 @@
 
 #include "core_debug.h"
 
-UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, const QString& deviceId): KJob()
+UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, const QString& deviceId)
+    : KJob()
 {
 //  TODO: initialize in constructor
     mInput = source;
@@ -38,7 +39,7 @@ UploadJob::UploadJob(const QSharedPointer<QIODevice>& source, const QString& dev
     // We will use this info if link is on ssl, to send encrypted payload
     this->mDeviceId = deviceId;
 
-    connect(mInput.data(), SIGNAL(readyRead()), this, SLOT(readyRead()));
+    connect(mInput.data(), SIGNAL(readyRead()), this, SLOT(startUploading()));
     connect(mInput.data(), SIGNAL(aboutToClose()), this, SLOT(aboutToClose()));
 }
 
@@ -50,6 +51,7 @@ void UploadJob::start()
         if (mPort > 1764) { //No ports available?
             qCWarning(KDECONNECT_CORE) << "Error opening a port in range 1739-1764 for file transfer";
             mPort = 0;
+            emitResult();
             return;
         }
     }
@@ -68,17 +70,19 @@ void UploadJob::newConnection()
     disconnect(mServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
 
     mSocket = server->nextPendingConnection();
-    connect(mSocket, SIGNAL(disconnected()), mSocket, SLOT(deleteLater()));
+    mSocket->setParent(this);
+    connect(mSocket, &QSslSocket::disconnected, this, &UploadJob::cleanup);
+    connect(mSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketFailed(QAbstractSocket::SocketError)));
+    connect(mSocket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(sslErrors(QList<QSslError>)));
+    connect(mSocket, &QSslSocket::encrypted, this, &UploadJob::startUploading);
+//     connect(mSocket, &QAbstractSocket::stateChanged, [](QAbstractSocket::SocketState state){ qDebug() << "statechange" << state; });
 
     LanLinkProvider::configureSslSocket(mSocket, mDeviceId, true);
 
     mSocket->startServerEncryption();
-    mSocket->waitForEncrypted();
-
-    readyRead();
 }
 
-void UploadJob::readyRead()
+void UploadJob::startUploading()
 {
     while ( mInput->bytesAvailable() > 0 )
     {
@@ -93,14 +97,19 @@ void UploadJob::readyRead()
             while ( mSocket->flush() );
         }
     }
-
     mInput->close();
 }
 
 void UploadJob::aboutToClose()
 {
+//     qDebug() << "closing...";
     mSocket->disconnectFromHost();
+}
+
+void UploadJob::cleanup()
+{
     mSocket->close();
+//     qDebug() << "closed!";
     emitResult();
 }
 
@@ -110,3 +119,18 @@ QVariantMap UploadJob::transferInfo()
     return {{"port", mPort}};
 }
 
+void UploadJob::socketFailed(QAbstractSocket::SocketError error)
+{
+    qWarning() << "error uploading" << error;
+    setError(2);
+    emitResult();
+    mSocket->close();
+}
+
+void UploadJob::sslErrors(const QList<QSslError>& errors)
+{
+    qWarning() << "ssl errors" << errors;
+    setError(1);
+    emitResult();
+    mSocket->close();
+}
diff --git a/core/backends/lan/uploadjob.h b/core/backends/lan/uploadjob.h
index 0a22182..775fe44 100644
--- a/core/backends/lan/uploadjob.h
+++ b/core/backends/lan/uploadjob.h
@@ -29,7 +29,7 @@
 #include <QSslSocket>
 #include "server.h"
 
-class UploadJob
+class KDECONNECTCORE_EXPORT UploadJob
     : public KJob
 {
     Q_OBJECT
@@ -48,9 +48,13 @@ private:
     QString mDeviceId;
 
 private Q_SLOTS:
-    void readyRead();
+    void startUploading();
     void newConnection();
     void aboutToClose();
+    void cleanup();
+
+    void socketFailed(QAbstractSocket::SocketError);
+    void sslErrors(const QList<QSslError> &errors);
 };
 
 #endif // UPLOADJOB_H
diff --git a/core/filetransferjob.cpp b/core/filetransferjob.cpp
index 0c5dd84..4f63f76 100644
--- a/core/filetransferjob.cpp
+++ b/core/filetransferjob.cpp
@@ -72,7 +72,7 @@ void FileTransferJob::doStart()
         return;
     }
 
-    startTransfer();
+    connect(mOrigin.data(), &QIODevice::readyRead, this, &FileTransferJob::startTransfer);
 }
 
 void FileTransferJob::startTransfer()
diff --git a/tests/sendfiletest.cpp b/tests/sendfiletest.cpp
index a5029cd..4652a72 100644
--- a/tests/sendfiletest.cpp
+++ b/tests/sendfiletest.cpp
@@ -19,6 +19,10 @@
  */
 
 #include <QSocketNotifier>
+#include <backends/lan/downloadjob.h>
+#include <kdeconnectconfig.h>
+#include <backends/lan/uploadjob.h>
+#include <core/filetransferjob.h>
 #include <QApplication>
 #include <QNetworkAccessManager>
 #include <QTest>
@@ -83,6 +87,58 @@ class TestSendFile : public QObject
             QCOMPARE(file.readAll(), content);
         }
 
+        void testSslJobs()
+        {
+            const QString aFile = QFINDTESTDATA("sendfiletest.cpp");
+            const QString destFile = QDir::tempPath() + "/kdeconnect-test-sentfile";
+            QFile(destFile).remove();
+
+            const QString deviceId = KdeConnectConfig::instance()->deviceId()
+                        , deviceName = "testdevice"
+                        , deviceType = KdeConnectConfig::instance()->deviceType();
+
+            KdeConnectConfig* kcc = KdeConnectConfig::instance();
+            kcc->addTrustedDevice(deviceId, deviceName, deviceType);
+            kcc->setDeviceProperty(deviceId, QString("certificate"), QString::fromLatin1(kcc->certificate().toPem())); // Using same certificate from kcc, instead of generating
+
+            QSharedPointer<QFile> f(new QFile(aFile));
+            UploadJob* uj = new UploadJob(f, deviceId);
+            QSignalSpy spyUpload(uj, &KJob::result);
+            uj->start();
+
+            auto info = uj->transferInfo();
+            info.insert("deviceId", deviceId);
+            info.insert("size", aFile.size());
+
+            DownloadJob* dj = new DownloadJob(QHostAddress::LocalHost, info);
+
+            QVERIFY(dj->getPayload()->open(QIODevice::ReadOnly));
+
+            FileTransferJob* ft = new FileTransferJob(dj->getPayload(), uj->transferInfo()["size"].toInt(), QUrl::fromLocalFile(destFile));
+
+            QSignalSpy spyDownload(dj, &KJob::result);
+            QSignalSpy spyTransfer(ft, &KJob::result);
+
+            ft->start();
+            dj->start();
+
+            QVERIFY(spyTransfer.count() || spyTransfer.wait(10000000000000000000));
+
+            if (ft->error()) qWarning() << "fterror" << ft->errorString();
+
+            QCOMPARE(ft->error(), 0);
+            QCOMPARE(spyDownload.count(), 1);
+            QCOMPARE(spyUpload.count(), 1);
+
+            QFile resultFile(destFile), originFile(aFile);
+            QVERIFY(resultFile.open(QIODevice::ReadOnly));
+            QVERIFY(originFile.open(QIODevice::ReadOnly));
+
+            const QByteArray resultContents = resultFile.readAll(), originContents = originFile.readAll();
+            QCOMPARE(resultContents.size(), originContents.size());
+            QCOMPARE(resultFile.readAll(), originFile.readAll());
+        }
+
     private:
         TestDaemon* mDaemon;
 };

-- 
kdeconnect packaging



More information about the pkg-kde-commits mailing list