diff --git a/libnymea-app/connection/cloudtransport.cpp b/libnymea-app/connection/cloudtransport.cpp index 59fb9eb5..7820a2bf 100644 --- a/libnymea-app/connection/cloudtransport.cpp +++ b/libnymea-app/connection/cloudtransport.cpp @@ -66,7 +66,7 @@ CloudTransport::CloudTransport(AWSClient *awsClient, QObject *parent): QObject::connect(m_remoteproxyConnection, &RemoteProxyConnection::dataReady, this, [this](const QByteArray &data) { emit dataReady(data); }); - QObject::connect(m_remoteproxyConnection, &RemoteProxyConnection::errorOccured, this, [] (QAbstractSocket::SocketError error) { + QObject::connect(m_remoteproxyConnection, &RemoteProxyConnection::errorOccurred, this, [] (QAbstractSocket::SocketError error) { qDebug() << "Remote proxy Error:" << error; // emit NymeaTransportInterface::error(QAbstractSocket::ConnectionRefusedError); }); diff --git a/libnymea-app/connection/tunnelproxytransport.cpp b/libnymea-app/connection/tunnelproxytransport.cpp new file mode 100644 index 00000000..ba078e92 --- /dev/null +++ b/libnymea-app/connection/tunnelproxytransport.cpp @@ -0,0 +1,133 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2021, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU General Public License as published by the Free Software +* Foundation, GNU version 3. This project is distributed in the hope that it +* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +* Public License for more details. +* +* You should have received a copy of the GNU General Public License along with +* this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "tunnelproxytransport.h" + +#include + +TunnelProxyTransport::TunnelProxyTransport(QObject *parent) : + NymeaTransportInterface(parent) +{ + m_remoteConnection = new TunnelProxyRemoteConnection(QUuid::createUuid(), qApp->applicationName(), this); + QObject::connect(m_remoteConnection, &TunnelProxyRemoteConnection::stateChanged, this, &TunnelProxyTransport::onRemoteConnectionStateChanged); + QObject::connect(m_remoteConnection, &TunnelProxyRemoteConnection::remoteConnectedChanged, this, &TunnelProxyTransport::onRemoteConnectedChanged); + QObject::connect(m_remoteConnection, &TunnelProxyRemoteConnection::dataReady, this, &TunnelProxyTransport::dataReady); + QObject::connect(m_remoteConnection, &TunnelProxyRemoteConnection::errorOccurred, this, &TunnelProxyTransport::onRemoteConnectionErrorOccurred); + QObject::connect(m_remoteConnection, &TunnelProxyRemoteConnection::sslErrors, this, [=](const QList &errors){ + qWarning() << "Remote tunnel proxy server SSL errors occurred:"; + foreach (const QSslError &sslError, errors) { + qWarning() << " --> " << sslError.errorString(); + } + }); + +} + +bool TunnelProxyTransport::connect(const QUrl &url) +{ + + m_url = url; + + // FIXME: get nymea uuid from URL somehow... + + //QUrl("ssl://dev-remoteproxy.nymea.io:2213"); + + //m_remoteConnection->connectServer() + + return false; +} + +QUrl TunnelProxyTransport::url() const +{ + return m_url; +} + +NymeaTransportInterface::ConnectionState TunnelProxyTransport::connectionState() const +{ + switch (m_remoteConnection->state()) { + case TunnelProxyRemoteConnection::StateRemoteConnected: + return NymeaTransportInterface::ConnectionStateConnected; + case TunnelProxyRemoteConnection::StateConnecting: + case TunnelProxyRemoteConnection::StateHostLookup: + case TunnelProxyRemoteConnection::StateConnected: + case TunnelProxyRemoteConnection::StateInitializing: + case TunnelProxyRemoteConnection::StateRegister: + return NymeaTransportInterface::ConnectionStateConnecting; + case TunnelProxyRemoteConnection::StateDiconnecting: + case TunnelProxyRemoteConnection::StateDisconnected: + return NymeaTransportInterface::ConnectionStateDisconnected; + } +} + +void TunnelProxyTransport::disconnect() +{ + m_remoteConnection->disconnectServer(); +} + +void TunnelProxyTransport::sendData(const QByteArray &data) +{ + m_remoteConnection->sendData(data); +} + +void TunnelProxyTransport::ignoreSslErrors(const QList &errors) +{ + // FIXME: once the tunnel connection implements SSL connection trought the tunnel proxy, we need to implement this + Q_UNUSED(errors) +} + +bool TunnelProxyTransport::isEncrypted() const +{ + return false; +} + +QSslCertificate TunnelProxyTransport::serverCertificate() const +{ + // FIXME: once the tunnel connection implements SSL connection trought the tunnel proxy, we need to implement this + return QSslCertificate(); +} + +void TunnelProxyTransport::onRemoteConnectedChanged(bool remoteConnected) +{ + qDebug() << "Tunnel proxy remote connection" << (remoteConnected ? "connected" : "disconnected"); +} + +void TunnelProxyTransport::onRemoteConnectionErrorOccurred(QAbstractSocket::SocketError error) +{ + qWarning() << "Tunnel proxy socket error occurred" << error; +} + +NymeaTransportInterface *TunnelProxyTransportFactory::createTransport(QObject *parent) const +{ + return new TunnelProxyTransport(parent); +} + +QStringList TunnelProxyTransportFactory::supportedSchemes() const +{ + return { "tunnel" }; +} diff --git a/libnymea-app/connection/tunnelproxytransport.h b/libnymea-app/connection/tunnelproxytransport.h new file mode 100644 index 00000000..10c2cfcc --- /dev/null +++ b/libnymea-app/connection/tunnelproxytransport.h @@ -0,0 +1,76 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2021, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU General Public License as published by the Free Software +* Foundation, GNU version 3. This project is distributed in the hope that it +* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +* Public License for more details. +* +* You should have received a copy of the GNU General Public License along with +* this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef TUNNELPROXYTRANSPORT_H +#define TUNNELPROXYTRANSPORT_H + +#include +#include + +#include "nymeatransportinterface.h" +#include "tunnelproxy/tunnelproxyremoteconnection.h" + +class TunnelProxyTransportFactory: public NymeaTransportInterfaceFactory +{ +public: + NymeaTransportInterface* createTransport(QObject *parent = nullptr) const override; + QStringList supportedSchemes() const override; +}; + +using namespace remoteproxyclient; + +class TunnelProxyTransport : public NymeaTransportInterface +{ + Q_OBJECT +public: + explicit TunnelProxyTransport(QObject *parent = nullptr); + + bool connect(const QUrl &url) override; + QUrl url() const override; + ConnectionState connectionState() const override; + void disconnect() override; + void sendData(const QByteArray &data) override; + void ignoreSslErrors(const QList &errors) override; + + bool isEncrypted() const override; + QSslCertificate serverCertificate() const override; + +private slots: + void onRemoteConnectionStateChanged(TunnelProxyRemoteConnection::State state); + void onRemoteConnectedChanged(bool remoteConnected); + void onRemoteConnectionErrorOccurred(QAbstractSocket::SocketError error); + +private: + QUrl m_url; + TunnelProxyRemoteConnection *m_remoteConnection = nullptr; + +}; + +#endif // TUNNELPROXYTRANSPORT_H diff --git a/libnymea-app/libnymea-app.pri b/libnymea-app/libnymea-app.pri index 94567d94..6328a745 100644 --- a/libnymea-app/libnymea-app.pri +++ b/libnymea-app/libnymea-app.pri @@ -25,6 +25,7 @@ SOURCES += \ $$PWD/energy/energymanager.cpp \ $$PWD/energy/powerbalancelogs.cpp \ $$PWD/energy/thingpowerlogs.cpp \ + $$PWD/connection/tunnelproxytransport.cpp \ $$PWD/models/scriptsproxymodel.cpp \ $$PWD/tagwatcher.cpp \ $$PWD/zigbee/zigbeenode.cpp \ @@ -185,6 +186,7 @@ HEADERS += \ $$PWD/energy/energymanager.h \ $$PWD/energy/powerbalancelogs.h \ $$PWD/energy/thingpowerlogs.h \ + $$PWD/connection/tunnelproxytransport.h \ $$PWD/models/scriptsproxymodel.h \ $$PWD/tagwatcher.h \ $$PWD/zigbee/zigbeenode.h \ diff --git a/nymea-remoteproxy b/nymea-remoteproxy index 9c707519..99bf6349 160000 --- a/nymea-remoteproxy +++ b/nymea-remoteproxy @@ -1 +1 @@ -Subproject commit 9c7075192b2b799feb302b48618eb4ef4d942172 +Subproject commit 99bf634990dcd2231e6a265581a35aeffaf30037