diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index c8bdcf3b..dbeaac38 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -4,36 +4,15 @@ #include #include #include +#include -#include "core/servercontroller.h" #include "logger.h" #include "defines.h" -#include #include "platforms/ios/QRCodeReaderBase.h" #include "ui/pages.h" -#include "ui/pages_logic/AppSettingsLogic.h" -#include "ui/pages_logic/GeneralSettingsLogic.h" -#include "ui/pages_logic/NetworkSettingsLogic.h" -#include "ui/pages_logic/NewServerProtocolsLogic.h" -#include "ui/pages_logic/QrDecoderLogic.h" -#include "ui/pages_logic/ServerConfiguringProgressLogic.h" -#include "ui/pages_logic/ServerContainersLogic.h" -#include "ui/pages_logic/ServerListLogic.h" -#include "ui/pages_logic/ServerSettingsLogic.h" -#include "ui/pages_logic/ServerContainersLogic.h" -#include "ui/pages_logic/ShareConnectionLogic.h" -#include "ui/pages_logic/SitesLogic.h" -#include "ui/pages_logic/StartPageLogic.h" -#include "ui/pages_logic/VpnLogic.h" -#include "ui/pages_logic/WizardLogic.h" - -#include "ui/pages_logic/protocols/CloakLogic.h" -#include "ui/pages_logic/protocols/OpenVpnLogic.h" -#include "ui/pages_logic/protocols/ShadowSocksLogic.h" - #if defined(Q_OS_IOS) #include "platforms/ios/QtAppDelegate-C-Interface.h" #endif @@ -76,10 +55,6 @@ AmneziaApplication::~AmneziaApplication() QObject::disconnect(m_engine, 0,0,0); delete m_engine; } - if (m_uiLogic) { - QObject::disconnect(m_uiLogic, 0,0,0); - delete m_uiLogic; - } if (m_protocolProps) delete m_protocolProps; if (m_containerProps) delete m_containerProps; @@ -88,7 +63,6 @@ AmneziaApplication::~AmneziaApplication() void AmneziaApplication::init() { m_engine = new QQmlApplicationEngine; - m_uiLogic = new UiLogic(m_settings, m_configurator); const QUrl url(QStringLiteral("qrc:/ui/qml/main2.qml")); QObject::connect(m_engine, &QQmlApplicationEngine::objectCreated, @@ -108,14 +82,8 @@ void AmneziaApplication::init() m_vpnConnection.reset(new VpnConnection(m_settings, m_configurator)); - m_connectionController.reset(new ConnectionController(m_serversModel, m_containersModel)); + m_connectionController.reset(new ConnectionController(m_serversModel, m_containersModel, m_vpnConnection)); - connect(m_vpnConnection.get(), &VpnConnection::connectionStateChanged, - m_connectionController.get(), &ConnectionController::connectionStateChanged); - connect(m_connectionController.get(), &ConnectionController::connectToVpn, - m_vpnConnection.get(), &VpnConnection::connectToVpn, Qt::QueuedConnection); - connect(m_connectionController.get(), &ConnectionController::disconnectFromVpn, - m_vpnConnection.get(), &VpnConnection::disconnectFromVpn, Qt::QueuedConnection); m_engine->rootContext()->setContextProperty("ConnectionController", m_connectionController.get()); m_pageController.reset(new PageController(m_serversModel)); @@ -128,17 +96,12 @@ void AmneziaApplication::init() m_engine->rootContext()->setContextProperty("ImportController", m_importController.get()); // - m_uiLogic->registerPagesLogic(); - -#if defined(Q_OS_IOS) - setStartPageLogic(m_uiLogic->pageLogic()); -#endif m_engine->load(url); - if (m_engine->rootObjects().size() > 0) { - m_uiLogic->setQmlRoot(m_engine->rootObjects().at(0)); - } +// if (m_engine->rootObjects().size() > 0) { +// m_uiLogic->setQmlRoot(m_engine->rootObjects().at(0)); +// } if (m_settings->isSaveLogs()) { if (!Logger::init()) { @@ -146,23 +109,23 @@ void AmneziaApplication::init() } } -#ifdef Q_OS_WIN - if (m_parser.isSet("a")) m_uiLogic->showOnStartup(); - else emit m_uiLogic->show(); -#else - m_uiLogic->showOnStartup(); -#endif +//#ifdef Q_OS_WIN +// if (m_parser.isSet("a")) m_uiLogic->showOnStartup(); +// else emit m_uiLogic->show(); +//#else +// m_uiLogic->showOnStartup(); +//#endif - // TODO - fix -#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) - if (isPrimary()) { - QObject::connect(this, &SingleApplication::instanceStarted, m_uiLogic, [this](){ - qDebug() << "Secondary instance started, showing this window instead"; - emit m_uiLogic->show(); - emit m_uiLogic->raise(); - }); - } -#endif +// // TODO - fix +//#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) +// if (isPrimary()) { +// QObject::connect(this, &SingleApplication::instanceStarted, m_uiLogic, [this](){ +// qDebug() << "Secondary instance started, showing this window instead"; +// emit m_uiLogic->show(); +// emit m_uiLogic->raise(); +// }); +// } +//#endif } @@ -174,16 +137,10 @@ void AmneziaApplication::registerTypes() qRegisterMetaType("TransportProto"); qRegisterMetaType("Proto"); qRegisterMetaType("ServiceType"); - qRegisterMetaType("Page"); - qRegisterMetaType("PageProtocolLogicBase *"); - - -// declareQmlPageEnum(); declareQmlProtocolEnum(); declareQmlContainerEnum(); - qmlRegisterType("PageType", 1, 0, "PageType"); qmlRegisterType("QRCodeReader", 1, 0, "QRCodeReader"); m_containerProps = new ContainerProps; @@ -201,16 +158,6 @@ void AmneziaApplication::loadFonts() { QQuickStyle::setStyle("Basic"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Black.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-BlackItalic.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Bold.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-BoldItalic.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Italic.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Light.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-LightItalic.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Regular.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-Thin.ttf"); - QFontDatabase::addApplicationFont(":/fonts/Lato-ThinItalic.ttf"); QFontDatabase::addApplicationFont(":/fonts/pt-root-ui_vf.ttf"); } diff --git a/client/amnezia_application.h b/client/amnezia_application.h index f4156d15..0fd6842c 100644 --- a/client/amnezia_application.h +++ b/client/amnezia_application.h @@ -11,7 +11,6 @@ #include "settings.h" #include "vpnconnection.h" -#include "ui/uilogic.h" #include "configurators/vpn_configurator.h" #include "ui/models/servers_model.h" @@ -54,7 +53,6 @@ public: private: QQmlApplicationEngine *m_engine {}; - UiLogic *m_uiLogic {}; std::shared_ptr m_settings; std::shared_ptr m_configurator; @@ -67,7 +65,7 @@ private: QSharedPointer m_containersModel; QSharedPointer m_serversModel; - QScopedPointer m_vpnConnection; + QSharedPointer m_vpnConnection; QScopedPointer m_connectionController; QScopedPointer m_pageController; diff --git a/client/ui/controllers/connectionController.cpp b/client/ui/controllers/connectionController.cpp index c4717012..fbbb67d9 100644 --- a/client/ui/controllers/connectionController.cpp +++ b/client/ui/controllers/connectionController.cpp @@ -2,11 +2,31 @@ #include +#include "core/errorstrings.h" + ConnectionController::ConnectionController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, - QObject *parent) : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel) + const QSharedPointer &vpnConnection, + QObject *parent) + : QObject(parent) + , m_serversModel(serversModel) + , m_containersModel(containersModel) + , m_vpnConnection(vpnConnection) { - + connect(m_vpnConnection.get(), + &VpnConnection::connectionStateChanged, + this, + &ConnectionController::connectionStateChanged); + connect(this, + &ConnectionController::connectToVpn, + m_vpnConnection.get(), + &VpnConnection::connectToVpn, + Qt::QueuedConnection); + connect(this, + &ConnectionController::disconnectFromVpn, + m_vpnConnection.get(), + &VpnConnection::disconnectFromVpn, + Qt::QueuedConnection); } void ConnectionController::openConnection() @@ -21,19 +41,11 @@ void ConnectionController::openConnection() const QJsonObject &containerConfig = qvariant_cast(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole)); -// if (m_settings->containers(serverIndex).isEmpty()) { -// set_labelErrorText(tr("VPN Protocols is not installed.\n Please install VPN container at first")); -// set_pushButtonConnectChecked(false); -// return; -// } + if (container == DockerContainer::None) { + emit connectionErrorOccurred(tr("VPN Protocols is not installed.\n Please install VPN container at first")); + return; + } -// if (container == DockerContainer::None) { -// set_labelErrorText(tr("VPN Protocol not chosen")); -// set_pushButtonConnectChecked(false); -// return; -// } - - //todo error handling qApp->processEvents(); emit connectToVpn(serverIndex, credentials, container, containerConfig); } @@ -43,6 +55,11 @@ void ConnectionController::closeConnection() emit disconnectFromVpn(); } +QString ConnectionController::getLastConnectionError() +{ + return errorString(m_vpnConnection->lastError()); +} + bool ConnectionController::isConnected() { return m_isConnected; diff --git a/client/ui/controllers/connectionController.h b/client/ui/controllers/connectionController.h index b1b0ff98..93ee28a7 100644 --- a/client/ui/controllers/connectionController.h +++ b/client/ui/controllers/connectionController.h @@ -4,6 +4,7 @@ #include "ui/models/servers_model.h" #include "ui/models/containers_model.h" #include "protocols/vpnprotocol.h" +#include "vpnconnection.h" class ConnectionController : public QObject { @@ -14,6 +15,7 @@ public: explicit ConnectionController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, + const QSharedPointer &vpnConnection, QObject *parent = nullptr); bool isConnected(); @@ -23,16 +25,22 @@ public slots: void openConnection(); void closeConnection(); + QString getLastConnectionError(); + signals: void connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig); void disconnectFromVpn(); void connectionStateChanged(Vpn::ConnectionState state); void isConnectedChanged(); + void connectionErrorOccurred(QString errorMessage); + private: QSharedPointer m_serversModel; QSharedPointer m_containersModel; + QSharedPointer m_vpnConnection; + bool m_isConnected = false; }; diff --git a/client/ui/controllers/importController.cpp b/client/ui/controllers/importController.cpp index 48e811e0..2724f9cd 100644 --- a/client/ui/controllers/importController.cpp +++ b/client/ui/controllers/importController.cpp @@ -6,33 +6,32 @@ #include "core/errorstrings.h" namespace { - enum class ConfigTypes { - Amnezia, - OpenVpn, - WireGuard - }; +enum class ConfigTypes { Amnezia, OpenVpn, WireGuard }; - ConfigTypes checkConfigFormat(const QString &config) - { - const QString openVpnConfigPatternCli = "client"; - const QString openVpnConfigPatternProto1 = "proto tcp"; - const QString openVpnConfigPatternProto2 = "proto udp"; - const QString openVpnConfigPatternDriver1 = "dev tun"; - const QString openVpnConfigPatternDriver2 = "dev tap"; +ConfigTypes checkConfigFormat(const QString &config) +{ + const QString openVpnConfigPatternCli = "client"; + const QString openVpnConfigPatternProto1 = "proto tcp"; + const QString openVpnConfigPatternProto2 = "proto udp"; + const QString openVpnConfigPatternDriver1 = "dev tun"; + const QString openVpnConfigPatternDriver2 = "dev tap"; - const QString wireguardConfigPatternSectionInterface = "[Interface]"; - const QString wireguardConfigPatternSectionPeer = "[Peer]"; + const QString wireguardConfigPatternSectionInterface = "[Interface]"; + const QString wireguardConfigPatternSectionPeer = "[Peer]"; - if (config.contains(openVpnConfigPatternCli) && - (config.contains(openVpnConfigPatternProto1) || config.contains(openVpnConfigPatternProto2)) && - (config.contains(openVpnConfigPatternDriver1) || config.contains(openVpnConfigPatternDriver2))) { - return ConfigTypes::OpenVpn; - } else if (config.contains(wireguardConfigPatternSectionInterface) && config.contains(wireguardConfigPatternSectionPeer)) { - return ConfigTypes::WireGuard; - } - return ConfigTypes::Amnezia; + if (config.contains(openVpnConfigPatternCli) + && (config.contains(openVpnConfigPatternProto1) + || config.contains(openVpnConfigPatternProto2)) + && (config.contains(openVpnConfigPatternDriver1) + || config.contains(openVpnConfigPatternDriver2))) { + return ConfigTypes::OpenVpn; + } else if (config.contains(wireguardConfigPatternSectionInterface) + && config.contains(wireguardConfigPatternSectionPeer)) { + return ConfigTypes::WireGuard; } + return ConfigTypes::Amnezia; } +} // namespace ImportController::ImportController(const QSharedPointer &serversModel, const QSharedPointer &containersModel, @@ -64,6 +63,7 @@ void ImportController::extractConfigFromFile(const QUrl &fileUrl) void ImportController::extractConfigFromCode(QString code) { m_config = extractAmneziaConfig(code); + m_configFileName = ""; } QString ImportController::getConfig() diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 15a24c31..2fe96962 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -10,7 +10,6 @@ InstallController::InstallController(const QSharedPointer &servers const std::shared_ptr &settings, QObject *parent) : QObject(parent), m_serversModel(serversModel), m_containersModel(containersModel), m_settings(settings) { - } void InstallController::install(DockerContainer container, int port, TransportProto transportProto) diff --git a/client/ui/models/containers_model.cpp b/client/ui/models/containers_model.cpp index b240878d..e65e79d7 100644 --- a/client/ui/models/containers_model.cpp +++ b/client/ui/models/containers_model.cpp @@ -22,17 +22,19 @@ bool ContainersModel::setData(const QModelIndex &index, const QVariant &value, i switch (role) { case NameRole: -// return ContainerProps::containerHumanNames().value(container); + // return ContainerProps::containerHumanNames().value(container); case DescRole: -// return ContainerProps::containerDescriptions().value(container); + // return ContainerProps::containerDescriptions().value(container); case ConfigRole: - m_settings->setContainerConfig(m_currentlyProcessedServerIndex, container, value.toJsonObject()); + m_settings->setContainerConfig(m_currentlyProcessedServerIndex, + container, + value.toJsonObject()); case ServiceTypeRole: -// return ContainerProps::containerService(container); + // return ContainerProps::containerService(container); case DockerContainerRole: -// return container; + // return container; case IsInstalledRole: -// return m_settings->containers(m_currentlyProcessedServerIndex).contains(container); + // return m_settings->containers(m_currentlyProcessedServerIndex).contains(container); case IsDefaultRole: m_settings->setDefaultContainer(m_currentlyProcessedServerIndex, container); emit defaultContainerChanged(); diff --git a/client/ui/qml/Components/ConnectButton.qml b/client/ui/qml/Components/ConnectButton.qml index 06c148f1..3c34a6b0 100644 --- a/client/ui/qml/Components/ConnectButton.qml +++ b/client/ui/qml/Components/ConnectButton.qml @@ -7,27 +7,48 @@ import ConnectionState 1.0 Button { id: root + Connections { + target: ConnectionController + + function onConnectionErrorOccurred(errorMessage) { + PageController.showErrorMessage(errorMessage) + } + } + text: qsTr("Connect") - background: Image { - id: border + background: Item { + clip: true - source: connectionProccess.running ? "/images/connectionProgress.svg" : - ConnectionController.isConnected ? "/images/connectionOff.svg" : "/images/connectionOn.svg" + implicitHeight: border.implicitHeight + implicitWidth: border.implicitWidth - RotationAnimator { - id: connectionProccess + Image { + id: border - target: border - running: false - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1250 + source: connectionProccess.running ? "/images/connectionProgress.svg" : + ConnectionController.isConnected ? "/images/connectionOff.svg" : "/images/connectionOn.svg" + RotationAnimator { + id: connectionProccess + + target: border + running: false + from: 0 + to: 360 + loops: Animation.Infinite + duration: 1250 + } + + Behavior on source { + PropertyAnimation { duration: 200 } + } } - Behavior on source { - PropertyAnimation { duration: 200 } + MouseArea { + anchors.fill: parent + + cursorShape: Qt.PointingHandCursor + enabled: false } } @@ -46,7 +67,7 @@ Button { } onClicked: { - ConnectionController.isConnected ? ConnectionController.closeConnection() : ConnectionController.openConnection() + connectionProccess.running ? ConnectionController.closeConnection() : ConnectionController.openConnection() } Connections { @@ -98,6 +119,8 @@ Button { case ConnectionState.Error: { console.log("Error") connectionProccess.running = false + root.text = qsTr("Connect") + PageController.showErrorMessage(ConnectionController.getLastConnectionError()) break } } diff --git a/client/ui/qml/Pages2/PageHome.qml b/client/ui/qml/Pages2/PageHome.qml index 4f3c4b6a..e5521787 100644 --- a/client/ui/qml/Pages2/PageHome.qml +++ b/client/ui/qml/Pages2/PageHome.qml @@ -262,7 +262,7 @@ PageType { Layout.fillWidth: true text: name - descriptionText: "description" + descriptionText: hostName checked: index === serversMenuContent.currentIndex diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index 39761cee..19f81d09 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -39,8 +39,6 @@ PageType { anchors.left: parent.left anchors.right: parent.right - spacing: 16 - ListView { // todo change id naming id: containers @@ -63,6 +61,8 @@ PageType { anchors.leftMargin: 16 BackButtonType { + id: backButton + Layout.topMargin: 20 } @@ -136,6 +136,7 @@ PageType { id: port Layout.fillWidth: true + Layout.topMargin: 16 headerText: "Port" } @@ -143,7 +144,7 @@ PageType { // todo make it dynamic implicitHeight: root.height - port.implicitHeight - transportProtoBackground.implicitHeight - transportProtoHeader.implicitHeight - - header.implicitHeight - installButton.implicitHeight - 100 + header.implicitHeight - backButton.implicitHeight - installButton.implicitHeight - 116 color: "transparent" } diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index 9bb6aa28..44a85925 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -3,7 +3,6 @@ import QtQuick.Window import QtQuick.Controls import QtQuick.Layouts -import PageType 1.0 import PageEnum 1.0 import "Config"