Check openvpn config for scripts

QML refactoring
This commit is contained in:
pokamest 2022-08-29 01:32:42 +03:00
parent 7c749a964c
commit 3a5a7bf674
19 changed files with 367 additions and 121 deletions

View file

@ -79,26 +79,10 @@ void AmneziaApplication::init()
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
m_engine->rootContext()->setContextProperty("Debug", &Debug::Instance()); m_engine->rootContext()->setContextProperty("Debug", &Debug::Instance());
m_uiLogic->registerPagesLogic();
m_engine->rootContext()->setContextProperty("UiLogic", m_uiLogic);
m_engine->rootContext()->setContextProperty("AppSettingsLogic", m_uiLogic->appSettingsLogic());
m_engine->rootContext()->setContextProperty("GeneralSettingsLogic", m_uiLogic->generalSettingsLogic());
m_engine->rootContext()->setContextProperty("NetworkSettingsLogic", m_uiLogic->networkSettingsLogic());
m_engine->rootContext()->setContextProperty("NewServerProtocolsLogic", m_uiLogic->newServerProtocolsLogic());
m_engine->rootContext()->setContextProperty("QrDecoderLogic", m_uiLogic->qrDecoderLogic());
m_engine->rootContext()->setContextProperty("ServerConfiguringProgressLogic", m_uiLogic->serverConfiguringProgressLogic());
m_engine->rootContext()->setContextProperty("ServerListLogic", m_uiLogic->serverListLogic());
m_engine->rootContext()->setContextProperty("ServerSettingsLogic", m_uiLogic->serverSettingsLogic());
m_engine->rootContext()->setContextProperty("ServerContainersLogic", m_uiLogic->serverprotocolsLogic());
m_engine->rootContext()->setContextProperty("ShareConnectionLogic", m_uiLogic->shareConnectionLogic());
m_engine->rootContext()->setContextProperty("SitesLogic", m_uiLogic->sitesLogic());
m_engine->rootContext()->setContextProperty("StartPageLogic", m_uiLogic->startPageLogic());
m_engine->rootContext()->setContextProperty("VpnLogic", m_uiLogic->vpnLogic());
m_engine->rootContext()->setContextProperty("WizardLogic", m_uiLogic->wizardLogic());
#if defined(Q_OS_IOS) #if defined(Q_OS_IOS)
setStartPageLogic(m_uiLogic->startPageLogic()); setStartPageLogic(m_uiLogic->pageLogic<StartPageLogic>());
#endif #endif
m_engine->load(url); m_engine->load(url);
@ -130,6 +114,7 @@ void AmneziaApplication::init()
}); });
} }
#endif #endif
} }
void AmneziaApplication::registerTypes() void AmneziaApplication::registerTypes()
@ -207,3 +192,9 @@ void AmneziaApplication::parseCommands()
exec(); exec();
} }
} }
QQmlApplicationEngine *AmneziaApplication::qmlEngine() const
{
return m_engine;
}

View file

@ -13,6 +13,9 @@
#include "ui/uilogic.h" #include "ui/uilogic.h"
#include "configurators/vpn_configurator.h" #include "configurators/vpn_configurator.h"
#define amnApp (static_cast<AmneziaApplication *>(QCoreApplication::instance()))
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
#define AMNEZIA_BASE_CLASS QApplication #define AMNEZIA_BASE_CLASS QApplication
#else #else
@ -39,6 +42,8 @@ public:
void loadTranslator(); void loadTranslator();
void parseCommands(); void parseCommands();
QQmlApplicationEngine *qmlEngine() const;
private: private:
QQmlApplicationEngine *m_engine; QQmlApplicationEngine *m_engine;
UiLogic *m_uiLogic; UiLogic *m_uiLogic;

View file

@ -64,6 +64,7 @@ HEADERS += \
ui/pages_logic/ShareConnectionLogic.h \ ui/pages_logic/ShareConnectionLogic.h \
ui/pages_logic/SitesLogic.h \ ui/pages_logic/SitesLogic.h \
ui/pages_logic/StartPageLogic.h \ ui/pages_logic/StartPageLogic.h \
ui/pages_logic/ViewConfigLogic.h \
ui/pages_logic/VpnLogic.h \ ui/pages_logic/VpnLogic.h \
ui/pages_logic/WizardLogic.h \ ui/pages_logic/WizardLogic.h \
ui/pages_logic/protocols/CloakLogic.h \ ui/pages_logic/protocols/CloakLogic.h \
@ -124,6 +125,7 @@ SOURCES += \
ui/pages_logic/ShareConnectionLogic.cpp \ ui/pages_logic/ShareConnectionLogic.cpp \
ui/pages_logic/SitesLogic.cpp \ ui/pages_logic/SitesLogic.cpp \
ui/pages_logic/StartPageLogic.cpp \ ui/pages_logic/StartPageLogic.cpp \
ui/pages_logic/ViewConfigLogic.cpp \
ui/pages_logic/VpnLogic.cpp \ ui/pages_logic/VpnLogic.cpp \
ui/pages_logic/WizardLogic.cpp \ ui/pages_logic/WizardLogic.cpp \
ui/pages_logic/protocols/CloakLogic.cpp \ ui/pages_logic/protocols/CloakLogic.cpp \

View file

@ -1,7 +1,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QFileInfo> #include <QFileInfo>
#include <QProcess> #include <QProcess>
#include <QRegularExpression>
#include <QTcpSocket> #include <QTcpSocket>
#include "debug.h" #include "debug.h"

View file

@ -1,7 +1,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QFileInfo> #include <QFileInfo>
#include <QProcess> #include <QProcess>
#include <QRegularExpression>
#include <QTcpSocket> #include <QTcpSocket>
#include <QThread> #include <QThread>

View file

@ -159,5 +159,6 @@
<file>ui/qml/Controls/SvgButtonType.qml</file> <file>ui/qml/Controls/SvgButtonType.qml</file>
<file>ui/qml/Pages/PageQrDecoderIos.qml</file> <file>ui/qml/Pages/PageQrDecoderIos.qml</file>
<file>server_scripts/website_tor/Dockerfile</file> <file>server_scripts/website_tor/Dockerfile</file>
<file>ui/qml/Pages/PageViewConfig.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -24,7 +24,7 @@ enum class Page {Start = 0, NewServer, NewServerProtocols, Vpn,
Wizard, WizardLow, WizardMedium, WizardHigh, WizardVpnMode, ServerConfiguringProgress, Wizard, WizardLow, WizardMedium, WizardHigh, WizardVpnMode, ServerConfiguringProgress,
GeneralSettings, AppSettings, NetworkSettings, ServerSettings, GeneralSettings, AppSettings, NetworkSettings, ServerSettings,
ServerContainers, ServersList, ShareConnection, Sites, ServerContainers, ServersList, ShareConnection, Sites,
ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About}; ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About, ViewConfig};
Q_ENUM_NS(Page) Q_ENUM_NS(Page)
static void declareQmlPageEnum() { static void declareQmlPageEnum() {

View file

@ -34,6 +34,6 @@ void GeneralSettingsLogic::onPushButtonGeneralSettingsShareConnectionClicked()
qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel())->setSelectedServerIndex(uiLogic()->selectedServerIndex); qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel())->setSelectedServerIndex(uiLogic()->selectedServerIndex);
qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel())->setSelectedDockerContainer(uiLogic()->selectedDockerContainer); qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel())->setSelectedDockerContainer(uiLogic()->selectedDockerContainer);
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer); uiLogic()->pageLogic<ShareConnectionLogic>()->updateSharingPage(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
emit uiLogic()->goToPage(Page::ShareConnection); emit uiLogic()->goToPage(Page::ShareConnection);
} }

View file

@ -54,7 +54,7 @@ void QrDecoderLogic::onDetectedQrCode(const QString &code)
data.append(m_chunks.value(i)); data.append(m_chunks.value(i));
} }
bool ok = uiLogic()->startPageLogic()->importConnectionFromQr(data); bool ok = uiLogic()->pageLogic<StartPageLogic>()->importConnectionFromQr(data);
if (ok) { if (ok) {
set_detectingEnabled(false); set_detectingEnabled(false);
emit stopDecode(); emit stopDecode();
@ -67,7 +67,7 @@ void QrDecoderLogic::onDetectedQrCode(const QString &code)
} }
} }
else { else {
bool ok = uiLogic()->startPageLogic()->importConnectionFromQr(ba); bool ok = uiLogic()->pageLogic<StartPageLogic>()->importConnectionFromQr(ba);
if (ok) { if (ok) {
set_detectingEnabled(false); set_detectingEnabled(false);
emit stopDecode(); emit stopDecode();

View file

@ -54,13 +54,13 @@ void ServerContainersLogic::onPushButtonDefaultClicked(DockerContainer c)
if (!uiLogic()->m_vpnConnection) return; if (!uiLogic()->m_vpnConnection) return;
if (!uiLogic()->m_vpnConnection->isConnected()) return; if (!uiLogic()->m_vpnConnection->isConnected()) return;
uiLogic()->vpnLogic()->onDisconnect(); uiLogic()->pageLogic<VpnLogic>()->onDisconnect();
uiLogic()->vpnLogic()->onConnect(); uiLogic()->pageLogic<VpnLogic>()->onConnect();
} }
void ServerContainersLogic::onPushButtonShareClicked(DockerContainer c) void ServerContainersLogic::onPushButtonShareClicked(DockerContainer c)
{ {
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, c); uiLogic()->pageLogic<ShareConnectionLogic>()->updateSharingPage(uiLogic()->selectedServerIndex, c);
emit uiLogic()->goToPage(Page::ShareConnection); emit uiLogic()->goToPage(Page::ShareConnection);
} }
@ -86,7 +86,7 @@ void ServerContainersLogic::onPushButtonContinueClicked(DockerContainer c, int p
emit uiLogic()->goToPage(Page::ServerConfiguringProgress); emit uiLogic()->goToPage(Page::ServerConfiguringProgress);
qApp->processEvents(); qApp->processEvents();
ErrorCode e = uiLogic()->serverConfiguringProgressLogic()->doInstallAction([this, c, &config](){ ErrorCode e = uiLogic()->pageLogic<ServerConfiguringProgressLogic>()->doInstallAction([this, c, &config](){
return m_serverController->setupContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), c, config); return m_serverController->setupContainer(m_settings->serverCredentials(uiLogic()->selectedServerIndex), c, config);
}); });

View file

@ -49,7 +49,7 @@ void ServerSettingsLogic::onPushButtonClearServer()
set_pushButtonClearText(tr("Uninstalling Amnezia software...")); set_pushButtonClearText(tr("Uninstalling Amnezia software..."));
if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex) { if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex) {
uiLogic()->vpnLogic()->onDisconnect(); uiLogic()->pageLogic<VpnLogic>()->onDisconnect();
} }
ErrorCode e = m_serverController->removeAllContainers(m_settings->serverCredentials(uiLogic()->selectedServerIndex)); ErrorCode e = m_serverController->removeAllContainers(m_settings->serverCredentials(uiLogic()->selectedServerIndex));
@ -76,7 +76,7 @@ void ServerSettingsLogic::onPushButtonClearServer()
void ServerSettingsLogic::onPushButtonForgetServer() void ServerSettingsLogic::onPushButtonForgetServer()
{ {
if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex && uiLogic()->m_vpnConnection->isConnected()) { if (m_settings->defaultServerIndex() == uiLogic()->selectedServerIndex && uiLogic()->m_vpnConnection->isConnected()) {
uiLogic()->vpnLogic()->onDisconnect(); uiLogic()->pageLogic<VpnLogic>()->onDisconnect();
} }
m_settings->removeServer(uiLogic()->selectedServerIndex); m_settings->removeServer(uiLogic()->selectedServerIndex);
@ -128,6 +128,6 @@ void ServerSettingsLogic::onLineEditDescriptionEditingFinished()
void ServerSettingsLogic::onPushButtonShareFullClicked() void ServerSettingsLogic::onPushButtonShareFullClicked()
{ {
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, DockerContainer::None); uiLogic()->pageLogic<ShareConnectionLogic>()->updateSharingPage(uiLogic()->selectedServerIndex, DockerContainer::None);
emit uiLogic()->goToShareProtocolPage(Proto::Any); emit uiLogic()->goToShareProtocolPage(Proto::Any);
} }

View file

@ -40,7 +40,7 @@ void SitesLogic::onUpdatePage()
void SitesLogic::onPushButtonAddCustomSitesClicked() void SitesLogic::onPushButtonAddCustomSitesClicked()
{ {
if (uiLogic()->vpnLogic()->radioButtonVpnModeAllSitesChecked()) { if (uiLogic()->pageLogic<VpnLogic>()->radioButtonVpnModeAllSitesChecked()) {
return; return;
} }
Settings::RouteMode mode = m_settings->routeMode(); Settings::RouteMode mode = m_settings->routeMode();

View file

@ -1,4 +1,6 @@
#include "StartPageLogic.h" #include "StartPageLogic.h"
#include "ViewConfigLogic.h"
#include "core/errorstrings.h" #include "core/errorstrings.h"
#include "configurators/ssh_configurator.h" #include "configurators/ssh_configurator.h"
#include "configurators/vpn_configurator.h" #include "configurators/vpn_configurator.h"
@ -17,13 +19,7 @@ StartPageLogic::StartPageLogic(UiLogic *logic, QObject *parent):
m_pushButtonConnectEnabled{true}, m_pushButtonConnectEnabled{true},
m_pushButtonConnectText{tr("Connect")}, m_pushButtonConnectText{tr("Connect")},
m_pushButtonConnectKeyChecked{false}, m_pushButtonConnectKeyChecked{false},
m_lineEditStartExistingCodeText{},
m_textEditSshKeyText{},
m_lineEditIpText{},
m_lineEditPasswordText{},
m_lineEditLoginText{},
m_labelWaitInfoVisible{true}, m_labelWaitInfoVisible{true},
m_labelWaitInfoText{},
m_pushButtonBackFromStartVisible{true}, m_pushButtonBackFromStartVisible{true},
m_ipAddressPortRegex{Utils::ipAddressPortRegExp()} m_ipAddressPortRegex{Utils::ipAddressPortRegExp()}
{ {
@ -150,11 +146,9 @@ bool StartPageLogic::importConnection(const QJsonObject &profile)
credentials.password = profile.value(config_key::password).toString(); credentials.password = profile.value(config_key::password).toString();
if (credentials.isValid() || profile.contains(config_key::containers)) { if (credentials.isValid() || profile.contains(config_key::containers)) {
m_settings->addServer(profile); // check config
m_settings->setDefaultServer(m_settings->serversCount() - 1); uiLogic()->pageLogic<ViewConfigLogic>()->set_configJson(profile);
emit uiLogic()->goToPage(Page::ViewConfig);
emit uiLogic()->goToPage(Page::Vpn);
emit uiLogic()->setStartPage(Page::Vpn);
} }
else { else {
qDebug() << "Failed to import profile"; qDebug() << "Failed to import profile";

View file

@ -0,0 +1,67 @@
#include "ViewConfigLogic.h"
#include "core/errorstrings.h"
#include "../uilogic.h"
ViewConfigLogic::ViewConfigLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent)
{
}
void ViewConfigLogic::onUpdatePage()
{
set_configText(QJsonDocument(configJson()).toJson());
m_openVpnLastConfigs = m_openVpnMalStrings =
"<style> \
div { line-height: 0.5; } \
</style><div>";
m_warningStringNumber = 3;
m_warningActive = false;
const QJsonArray &containers = configJson()[config_key::containers].toArray();
int i = 0;
for (const QJsonValue &v: containers) {
QString cfg_json = v.toObject()[ProtocolProps::protoToString(Proto::OpenVpn)]
.toObject()[config_key::last_config].toString();
QString openvpn_cfg = QJsonDocument::fromJson(cfg_json.toUtf8()).object()[config_key::config]
.toString();
openvpn_cfg.replace("\r", "");
QStringList lines = openvpn_cfg.split("\n");
for (const QString &l: lines) {
i++;
QRegularExpressionMatch match = m_re.match(l);
if (dangerousTags.contains(match.captured(0))) {
QString t = QString("<p><font color=\"red\">%1</font>").arg(l);
m_openVpnLastConfigs.append(t + "\n");
m_openVpnMalStrings.append(t);
if (m_warningStringNumber == 3) m_warningStringNumber = i - 3;
m_warningActive = true;
qDebug() << "ViewConfigLogic : malicious scripts warning:" << l;
}
else {
m_openVpnLastConfigs.append("<p>" + l + "&nbsp;\n");
}
}
}
emit openVpnLastConfigsChanged(m_openVpnLastConfigs);
emit openVpnMalStringsChanged(m_openVpnMalStrings);
emit warningStringNumberChanged(m_warningStringNumber);
emit warningActiveChanged(m_warningActive);
}
void ViewConfigLogic::importConfig()
{
m_settings->addServer(configJson());
m_settings->setDefaultServer(m_settings->serversCount() - 1);
emit uiLogic()->goToPage(Page::Vpn);
emit uiLogic()->setStartPage(Page::Vpn);
}

View file

@ -0,0 +1,47 @@
#ifndef VIEW_CONFIG_LOGIC_H
#define VIEW_CONFIG_LOGIC_H
#include "PageLogicBase.h"
#include <QJsonObject>
class UiLogic;
class ViewConfigLogic : public PageLogicBase
{
Q_OBJECT
AUTO_PROPERTY(QString, configText)
AUTO_PROPERTY(QString, openVpnLastConfigs)
AUTO_PROPERTY(QString, openVpnMalStrings)
AUTO_PROPERTY(QJsonObject, configJson)
AUTO_PROPERTY(int, warningStringNumber)
AUTO_PROPERTY(bool, warningActive)
public:
Q_INVOKABLE void onUpdatePage() override;
Q_INVOKABLE void importConfig();
public:
explicit ViewConfigLogic(UiLogic *uiLogic, QObject *parent = nullptr);
~ViewConfigLogic() = default;
private:
QRegularExpression m_re {"(\\w+-\\w+|\\w+)"};
// https://github.com/OpenVPN/openvpn/blob/master/doc/man-sections/script-options.rst
QStringList dangerousTags {
"up",
"tls-verify",
"ipchange",
"client-connect",
"route-up",
"route-pre-down",
"client-disconnect",
"down",
"learn-address",
"auth-user-pass-verify"
};
};
#endif // VIEW_CONFIG_LOGIC_H

View file

@ -59,7 +59,7 @@ PageBase {
text: qsTr("Share for Amnezia") text: qsTr("Share for Amnezia")
height: 40 height: 40
width: tb_c.width - 10 width: tb_c.width - 10
onClicked: UiLogic.onGotoShareProtocolPage(ProtocolEnum.Any) onClicked: UiLogic.goToShareProtocolPage(ProtocolEnum.Any)
} }
ListView { ListView {
@ -82,7 +82,7 @@ PageBase {
text: qsTr("Share for ") + name_role text: qsTr("Share for ") + name_role
height: 40 height: 40
width: tb_c.width - 10 width: tb_c.width - 10
onClicked: UiLogic.onGotoShareProtocolPage(proxyProtocolsModel.mapToSource(index)) onClicked: UiLogic.goToShareProtocolPage(proxyProtocolsModel.mapToSource(index))
} }
} }
} }

View file

@ -0,0 +1,148 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.15
import PageEnum 1.0
import "./"
import "../Controls"
import "../Config"
PageBase {
id: root
page: PageEnum.ViewConfig
logic: ViewConfigLogic
readonly property double rowHeight: ta_last_config.contentHeight / ta_last_config.textArea.lineCount
BackButton {}
Caption {
id: caption
text: qsTr("Check config")
}
Flickable {
id: fl
width: root.width
anchors.top: caption.bottom
anchors.topMargin: 20
anchors.bottom: root.bottom
anchors.bottomMargin: 20
anchors.left: root.left
anchors.leftMargin: 30
anchors.right: root.right
anchors.rightMargin: 30
contentHeight: content.height
clip: true
ColumnLayout {
id: content
enabled: logic.pageEnabled
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
TextAreaType {
id: ta_config
Layout.topMargin: 5
Layout.bottomMargin: 20
Layout.fillWidth: true
Layout.leftMargin: 1
Layout.rightMargin: 1
Layout.preferredHeight: ViewConfigLogic.warningActive ? 250 : fl.height - 70
flickableDirection: Flickable.AutoFlickIfNeeded
textArea.readOnly: true
textArea.text: logic.configText
}
LabelType {
id: lb_att
visible: ViewConfigLogic.warningActive
text: qsTr("Attention!
The config above contains cached OpenVPN connection profile.
AmneziaVPN detected this profile may contain malicious scripts. Please, carefully review the config and import this config only if you completely trust it.")
Layout.fillWidth: true
}
LabelType {
visible: ViewConfigLogic.warningActive
text: qsTr("Suspicious string:")
Layout.fillWidth: true
}
TextAreaType {
id: ta_mal
visible: ViewConfigLogic.warningActive
Layout.topMargin: 5
Layout.bottomMargin: 20
Layout.fillWidth: true
Layout.leftMargin: 1
Layout.rightMargin: 1
Layout.preferredHeight: 60
flickableDirection: Flickable.AutoFlickIfNeeded
textArea.readOnly: true
textArea.text: logic.openVpnMalStrings
textArea.textFormat: TextEdit.RichText
}
LabelType {
visible: ViewConfigLogic.warningActive
text: qsTr("Cached connection profile:")
Layout.fillWidth: true
}
TextAreaType {
id: ta_last_config
visible: ViewConfigLogic.warningActive
Layout.topMargin: 5
Layout.bottomMargin: 20
Layout.fillWidth: true
Layout.leftMargin: 1
Layout.rightMargin: 1
Layout.preferredHeight: 350
flickableDirection: Flickable.AutoFlickIfNeeded
textArea.readOnly: true
textArea.text: logic.openVpnLastConfigs
textArea.textFormat: TextEdit.RichText
Connections {
target: logic
function onWarningStringNumberChanged(n) {
ta_last_config.contentY = rowHeight * n - ta_last_config.height / 2
}
}
}
RowLayout {
id: btns_row
BasicButtonType {
Layout.preferredWidth: (content.width - parent.spacing) /2
Layout.preferredHeight: 41
font.pixelSize: btn_import.font.pixelSize
text: qsTr("Cancel")
onClicked: {
UiLogic.closePage()
}
}
BlueButtonType {
id: btn_import
Layout.preferredWidth: (content.width - parent.spacing) /2
Layout.preferredHeight: 41
text: qsTr("Import config")
onClicked: {
logic.importConfig()
}
}
}
}
}
}

View file

@ -4,7 +4,6 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QFile> #include <QFile>
#include <QFileDialog> #include <QFileDialog>
#include <QHBoxLayout>
#include <QHostInfo> #include <QHostInfo>
#include <QItemSelectionModel> #include <QItemSelectionModel>
#include <QJsonDocument> #include <QJsonDocument>
@ -16,8 +15,10 @@
#include <QSysInfo> #include <QSysInfo>
#include <QThread> #include <QThread>
#include <QTimer> #include <QTimer>
#include <QRegularExpression>
#include <QQmlFile> #include <QQmlFile>
#include <QMetaObject>
#include "amnezia_application.h"
#include "configurators/cloak_configurator.h" #include "configurators/cloak_configurator.h"
#include "configurators/vpn_configurator.h" #include "configurators/vpn_configurator.h"
@ -62,6 +63,7 @@
#include "pages_logic/ShareConnectionLogic.h" #include "pages_logic/ShareConnectionLogic.h"
#include "pages_logic/SitesLogic.h" #include "pages_logic/SitesLogic.h"
#include "pages_logic/StartPageLogic.h" #include "pages_logic/StartPageLogic.h"
#include "pages_logic/ViewConfigLogic.h"
#include "pages_logic/VpnLogic.h" #include "pages_logic/VpnLogic.h"
#include "pages_logic/WizardLogic.h" #include "pages_logic/WizardLogic.h"
@ -88,20 +90,6 @@ UiLogic::UiLogic(std::shared_ptr<Settings> settings, std::shared_ptr<VpnConfigur
m_vpnConnection->moveToThread(&m_vpnConnectionThread); m_vpnConnection->moveToThread(&m_vpnConnectionThread);
m_vpnConnectionThread.start(); m_vpnConnectionThread.start();
m_appSettingsLogic = new AppSettingsLogic(this);
m_generalSettingsLogic = new GeneralSettingsLogic(this);
m_networkSettingsLogic = new NetworkSettingsLogic(this);
m_newServerProtocolsLogic = new NewServerProtocolsLogic(this);
m_qrDecoderLogic = new QrDecoderLogic(this);
m_serverConfiguringProgressLogic = new ServerConfiguringProgressLogic(this);
m_serverListLogic = new ServerListLogic(this);
m_serverSettingsLogic = new ServerSettingsLogic(this);
m_serverprotocolsLogic = new ServerContainersLogic(this);
m_shareConnectionLogic = new ShareConnectionLogic(this);
m_sitesLogic = new SitesLogic(this);
m_startPageLogic = new StartPageLogic(this);
m_vpnLogic = new VpnLogic(this);
m_wizardLogic = new WizardLogic(this);
m_protocolLogicMap.insert(Proto::OpenVpn, new OpenVpnLogic(this)); m_protocolLogicMap.insert(Proto::OpenVpn, new OpenVpnLogic(this));
m_protocolLogicMap.insert(Proto::ShadowSocks, new ShadowSocksLogic(this)); m_protocolLogicMap.insert(Proto::ShadowSocks, new ShadowSocksLogic(this));
@ -143,7 +131,7 @@ void UiLogic::initalizeUiLogic()
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
connect(AndroidController::instance(), &AndroidController::initialized, [this](bool status, bool connected, const QDateTime& connectionDate) { connect(AndroidController::instance(), &AndroidController::initialized, [this](bool status, bool connected, const QDateTime& connectionDate) {
if (connected) { if (connected) {
vpnLogic()->onConnectionStateChanged(VpnProtocol::Connected); pageLogic<VpnLogic>()->onConnectionStateChanged(VpnProtocol::Connected);
} }
}); });
if (!AndroidController::instance()->initialize()) { if (!AndroidController::instance()->initialize()) {
@ -157,8 +145,8 @@ void UiLogic::initalizeUiLogic()
connect(m_vpnConnection, &VpnConnection::connectionStateChanged, m_notificationHandler, &NotificationHandler::setConnectionState); connect(m_vpnConnection, &VpnConnection::connectionStateChanged, m_notificationHandler, &NotificationHandler::setConnectionState);
connect(m_notificationHandler, &NotificationHandler::raiseRequested, this, &UiLogic::raise); connect(m_notificationHandler, &NotificationHandler::raiseRequested, this, &UiLogic::raise);
connect(m_notificationHandler, &NotificationHandler::connectRequested, vpnLogic(), &VpnLogic::onConnect); connect(m_notificationHandler, &NotificationHandler::connectRequested, pageLogic<VpnLogic>(), &VpnLogic::onConnect);
connect(m_notificationHandler, &NotificationHandler::disconnectRequested, vpnLogic(), &VpnLogic::onDisconnect); connect(m_notificationHandler, &NotificationHandler::disconnectRequested, pageLogic<VpnLogic>(), &VpnLogic::onDisconnect);
if (m_settings->serversCount() > 0) { if (m_settings->serversCount() > 0) {
if (m_settings->defaultServerIndex() < 0) m_settings->setDefaultServer(0); if (m_settings->defaultServerIndex() < 0) m_settings->setDefaultServer(0);
@ -190,21 +178,7 @@ void UiLogic::showOnStartup()
void UiLogic::onUpdateAllPages() void UiLogic::onUpdateAllPages()
{ {
for (PageLogicBase *logic : { for (auto logic : m_logicMap) {
(PageLogicBase *) m_appSettingsLogic,
(PageLogicBase *) m_generalSettingsLogic,
(PageLogicBase *) m_networkSettingsLogic,
(PageLogicBase *) m_serverConfiguringProgressLogic,
(PageLogicBase *) m_newServerProtocolsLogic,
(PageLogicBase *) m_serverListLogic,
(PageLogicBase *) m_serverSettingsLogic,
(PageLogicBase *) m_serverprotocolsLogic,
(PageLogicBase *) m_shareConnectionLogic,
(PageLogicBase *) m_sitesLogic,
(PageLogicBase *) m_startPageLogic,
(PageLogicBase *) m_vpnLogic,
(PageLogicBase *) m_wizardLogic
}) {
logic->onUpdatePage(); logic->onUpdatePage();
} }
} }
@ -332,34 +306,34 @@ void UiLogic::installServer(QMap<DockerContainer, QJsonObject> &containers)
PageFunc page_new_server_configuring; PageFunc page_new_server_configuring;
page_new_server_configuring.setEnabledFunc = [this] (bool enabled) -> void { page_new_server_configuring.setEnabledFunc = [this] (bool enabled) -> void {
serverConfiguringProgressLogic()->set_pageEnabled(enabled); pageLogic<ServerConfiguringProgressLogic>()->set_pageEnabled(enabled);
}; };
ButtonFunc no_button; ButtonFunc no_button;
LabelFunc label_new_server_configuring_wait_info; LabelFunc label_new_server_configuring_wait_info;
label_new_server_configuring_wait_info.setTextFunc = [this] (const QString& text) -> void { label_new_server_configuring_wait_info.setTextFunc = [this] (const QString& text) -> void {
serverConfiguringProgressLogic()->set_labelWaitInfoText(text); pageLogic<ServerConfiguringProgressLogic>()->set_labelWaitInfoText(text);
}; };
label_new_server_configuring_wait_info.setVisibleFunc = [this] (bool visible) ->void { label_new_server_configuring_wait_info.setVisibleFunc = [this] (bool visible) ->void {
serverConfiguringProgressLogic()->set_labelWaitInfoVisible(visible); pageLogic<ServerConfiguringProgressLogic>()->set_labelWaitInfoVisible(visible);
}; };
ProgressFunc progressBar_new_server_configuring; ProgressFunc progressBar_new_server_configuring;
progressBar_new_server_configuring.setVisibleFunc = [this] (bool visible) ->void { progressBar_new_server_configuring.setVisibleFunc = [this] (bool visible) ->void {
serverConfiguringProgressLogic()->set_progressBarVisible(visible); pageLogic<ServerConfiguringProgressLogic>()->set_progressBarVisible(visible);
}; };
progressBar_new_server_configuring.setValueFunc = [this] (int value) ->void { progressBar_new_server_configuring.setValueFunc = [this] (int value) ->void {
serverConfiguringProgressLogic()->set_progressBarValue(value); pageLogic<ServerConfiguringProgressLogic>()->set_progressBarValue(value);
}; };
progressBar_new_server_configuring.getValueFunc = [this] (void) -> int { progressBar_new_server_configuring.getValueFunc = [this] (void) -> int {
return serverConfiguringProgressLogic()->progressBarValue(); return pageLogic<ServerConfiguringProgressLogic>()->progressBarValue();
}; };
progressBar_new_server_configuring.getMaximiumFunc = [this] (void) -> int { progressBar_new_server_configuring.getMaximiumFunc = [this] (void) -> int {
return serverConfiguringProgressLogic()->progressBarMaximium(); return pageLogic<ServerConfiguringProgressLogic>()->progressBarMaximium();
}; };
progressBar_new_server_configuring.setTextVisibleFunc = [this] (bool visible) ->void { progressBar_new_server_configuring.setTextVisibleFunc = [this] (bool visible) ->void {
serverConfiguringProgressLogic()->set_progressBarTextVisible(visible); pageLogic<ServerConfiguringProgressLogic>()->set_progressBarTextVisible(visible);
}; };
progressBar_new_server_configuring.setTextFunc = [this] (const QString& text) ->void { progressBar_new_server_configuring.setTextFunc = [this] (const QString& text) ->void {
serverConfiguringProgressLogic()->set_progressBarText(text); pageLogic<ServerConfiguringProgressLogic>()->set_progressBarText(text);
}; };
bool ok = installContainers(installCredentials, containers, bool ok = installContainers(installCredentials, containers,
page_new_server_configuring, page_new_server_configuring,
@ -595,6 +569,11 @@ NotificationHandler *UiLogic::notificationHandler() const
return m_notificationHandler; return m_notificationHandler;
} }
void UiLogic::setQmlContextProperty(PageLogicBase *logic)
{
amnApp->qmlEngine()->rootContext()->setContextProperty(logic->metaObject()->className(), logic);
}
PageEnumNS::Page UiLogic::currentPage() PageEnumNS::Page UiLogic::currentPage()
{ {
return static_cast<PageEnumNS::Page>(currentPageValue()); return static_cast<PageEnumNS::Page>(currentPageValue());
@ -677,3 +656,24 @@ void UiLogic::shareTempFile(const QString &suggestedName, QString ext, const QSt
filesToSend.append(fileName); filesToSend.append(fileName);
MobileUtils::shareText(filesToSend); MobileUtils::shareText(filesToSend);
} }
void UiLogic::registerPagesLogic()
{
amnApp->qmlEngine()->rootContext()->setContextProperty("UiLogic", this);
registerPageLogic<AppSettingsLogic>();
registerPageLogic<GeneralSettingsLogic>();
registerPageLogic<NetworkSettingsLogic>();
registerPageLogic<NewServerProtocolsLogic>();
registerPageLogic<QrDecoderLogic>();
registerPageLogic<ServerConfiguringProgressLogic>();
registerPageLogic<ServerListLogic>();
registerPageLogic<ServerSettingsLogic>();
registerPageLogic<ServerContainersLogic>();
registerPageLogic<ShareConnectionLogic>();
registerPageLogic<SitesLogic>();
registerPageLogic<StartPageLogic>();
registerPageLogic<ViewConfigLogic>();
registerPageLogic<VpnLogic>();
registerPageLogic<WizardLogic>();
}

View file

@ -7,6 +7,10 @@
#include <QKeyEvent> #include <QKeyEvent>
#include <QThread> #include <QThread>
#include <typeindex>
#include <typeinfo>
#include <unordered_map>
#include "property_helper.h" #include "property_helper.h"
#include "pages.h" #include "pages.h"
#include "protocols/vpnprotocol.h" #include "protocols/vpnprotocol.h"
@ -21,6 +25,8 @@ class Settings;
class VpnConfigurator; class VpnConfigurator;
class ServerController; class ServerController;
class PageLogicBase;
class AppSettingsLogic; class AppSettingsLogic;
class GeneralSettingsLogic; class GeneralSettingsLogic;
class NetworkSettingsLogic; class NetworkSettingsLogic;
@ -33,6 +39,7 @@ class ServerContainersLogic;
class ShareConnectionLogic; class ShareConnectionLogic;
class SitesLogic; class SitesLogic;
class StartPageLogic; class StartPageLogic;
class ViewConfigLogic;
class VpnLogic; class VpnLogic;
class WizardLogic; class WizardLogic;
@ -77,6 +84,7 @@ public:
friend class ShareConnectionLogic; friend class ShareConnectionLogic;
friend class SitesLogic; friend class SitesLogic;
friend class StartPageLogic; friend class StartPageLogic;
friend class ViewConfigLogic;
friend class VpnLogic; friend class VpnLogic;
friend class WizardLogic; friend class WizardLogic;
@ -96,10 +104,6 @@ public:
Q_INVOKABLE QString containerName(int container); Q_INVOKABLE QString containerName(int container);
Q_INVOKABLE QString containerDesc(int container); Q_INVOKABLE QString containerDesc(int container);
Q_INVOKABLE void onGotoPage(PageEnumNS::Page p, bool reset = true, bool slide = true) { emit goToPage(p, reset, slide); }
Q_INVOKABLE void onGotoProtocolPage(Proto p, bool reset = true, bool slide = true) { emit goToProtocolPage(p, reset, slide); }
Q_INVOKABLE void onGotoShareProtocolPage(Proto p, bool reset = true, bool slide = true) { emit goToShareProtocolPage(p, reset, slide); }
Q_INVOKABLE void onGotoCurrentProtocolsPage(); Q_INVOKABLE void onGotoCurrentProtocolsPage();
Q_INVOKABLE void keyPressEvent(Qt::Key key); Q_INVOKABLE void keyPressEvent(Qt::Key key);
@ -166,21 +170,6 @@ private:
public: public:
AppSettingsLogic *appSettingsLogic() { return m_appSettingsLogic; }
GeneralSettingsLogic *generalSettingsLogic() { return m_generalSettingsLogic; }
NetworkSettingsLogic *networkSettingsLogic() { return m_networkSettingsLogic; }
NewServerProtocolsLogic *newServerProtocolsLogic() { return m_newServerProtocolsLogic; }
QrDecoderLogic *qrDecoderLogic() { return m_qrDecoderLogic; }
ServerConfiguringProgressLogic *serverConfiguringProgressLogic() { return m_serverConfiguringProgressLogic; }
ServerListLogic *serverListLogic() { return m_serverListLogic; }
ServerSettingsLogic *serverSettingsLogic() { return m_serverSettingsLogic; }
ServerContainersLogic *serverprotocolsLogic() { return m_serverprotocolsLogic; }
ShareConnectionLogic *shareConnectionLogic() { return m_shareConnectionLogic; }
SitesLogic *sitesLogic() { return m_sitesLogic; }
StartPageLogic *startPageLogic() { return m_startPageLogic; }
VpnLogic *vpnLogic() { return m_vpnLogic; }
WizardLogic *wizardLogic() { return m_wizardLogic; }
Q_INVOKABLE PageProtocolLogicBase *protocolLogic(Proto p); Q_INVOKABLE PageProtocolLogicBase *protocolLogic(Proto p);
QObject *qmlRoot() const; QObject *qmlRoot() const;
@ -188,23 +177,27 @@ public:
NotificationHandler *notificationHandler() const; NotificationHandler *notificationHandler() const;
void setQmlContextProperty(PageLogicBase *logic);
void registerPagesLogic();
template<typename T>
void registerPageLogic()
{
T* logic = new T(this);
m_logicMap[std::type_index(typeid(T))] = logic;
setQmlContextProperty(logic);
}
template<typename T>
T* pageLogic()
{
return static_cast<T *>(m_logicMap.value(std::type_index(typeid(T))));
}
private: private:
QObject *m_qmlRoot{nullptr}; QObject *m_qmlRoot{nullptr};
AppSettingsLogic *m_appSettingsLogic; QMap<std::type_index, PageLogicBase*> m_logicMap;
GeneralSettingsLogic *m_generalSettingsLogic;
NetworkSettingsLogic *m_networkSettingsLogic;
NewServerProtocolsLogic *m_newServerProtocolsLogic;
QrDecoderLogic *m_qrDecoderLogic;
ServerConfiguringProgressLogic *m_serverConfiguringProgressLogic;
ServerListLogic *m_serverListLogic;
ServerSettingsLogic *m_serverSettingsLogic;
ServerContainersLogic *m_serverprotocolsLogic;
ShareConnectionLogic *m_shareConnectionLogic;
SitesLogic *m_sitesLogic;
StartPageLogic *m_startPageLogic;
VpnLogic *m_vpnLogic;
WizardLogic *m_wizardLogic;
QMap<Proto, PageProtocolLogicBase *> m_protocolLogicMap; QMap<Proto, PageProtocolLogicBase *> m_protocolLogicMap;