From 4ae608ed936100fb7d7f8369cc5ecf11fcc45c37 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 13 Sep 2023 16:11:08 +0500 Subject: [PATCH] added import backup file from outside for ios --- client/amnezia_application.cpp | 5 + client/containers/containers_defs.cpp | 4 +- client/platforms/ios/QtAppDelegate.mm | 14 +- client/platforms/ios/ios_controller.h | 50 +++--- client/protocols/protocols_defs.cpp | 149 +++++++++--------- client/ui/controllers/pageController.h | 1 + client/ui/controllers/settingsController.h | 2 + .../qml/Components/ShareConnectionDrawer.qml | 4 +- client/ui/qml/Pages2/PageSettingsBackup.qml | 35 +++- client/ui/qml/main2.qml | 4 + 10 files changed, 157 insertions(+), 111 deletions(-) diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index 1725e1f8..de75db85 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -117,6 +117,11 @@ void AmneziaApplication::init() &ImportController::extractConfigFromData); connect(IosController::Instance(), &IosController::importConfigFromOutside, m_pageController.get(), &PageController::goToPageViewConfig); + + connect(IosController::Instance(), &IosController::importBackupFromOutside, m_pageController.get(), + &PageController::goToPageSettingsBackup); + connect(IosController::Instance(), &IosController::importBackupFromOutside, m_settingsController.get(), + &SettingsController::importBackupFromOutside); #endif m_notificationHandler.reset(NotificationHandler::create(nullptr)); diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index 98b2d0da..766d89da 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -86,7 +86,7 @@ QMap ContainerProps::containerHumanNames() { DockerContainer::WireGuard, "WireGuard" }, { DockerContainer::Ipsec, QObject::tr("IPsec") }, - { DockerContainer::TorWebSite, QObject::tr("Web site in Tor network") }, + { DockerContainer::TorWebSite, QObject::tr("Website in Tor network") }, { DockerContainer::Dns, QObject::tr("Amnezia DNS") }, //{DockerContainer::FileShare, QObject::tr("SMB file sharing service")}, { DockerContainer::Sftp, QObject::tr("Sftp file sharing service") } }; @@ -129,7 +129,7 @@ QMap ContainerProps::containerDetailedDescriptions() { DockerContainer::WireGuard, QObject::tr("WireGuard container") }, { DockerContainer::Ipsec, QObject::tr("IPsec container") }, - { DockerContainer::TorWebSite, QObject::tr("Web site in Tor network") }, + { DockerContainer::TorWebSite, QObject::tr("Website in Tor network") }, { DockerContainer::Dns, QObject::tr("DNS Service") }, //{DockerContainer::FileShare, QObject::tr("SMB file sharing service - is Window file sharing protocol")}, { DockerContainer::Sftp, QObject::tr("Sftp file sharing service - is secure FTP service") } }; diff --git a/client/platforms/ios/QtAppDelegate.mm b/client/platforms/ios/QtAppDelegate.mm index 7528f2ff..48cef914 100644 --- a/client/platforms/ios/QtAppDelegate.mm +++ b/client/platforms/ios/QtAppDelegate.mm @@ -76,11 +76,15 @@ QString filePath(url.path.UTF8String); if (filePath.isEmpty()) return NO; - QFile file(filePath); - bool isOpenFile = file.open(QIODevice::ReadOnly); - QByteArray data = file.readAll(); - - IosController::Instance()->importConfigFromOutside(QString(data)); + if (filePath.contains("backup")) { + IosController::Instance()->importBackupFromOutside(filePath); + } else { + QFile file(filePath); + bool isOpenFile = file.open(QIODevice::ReadOnly); + QByteArray data = file.readAll(); + + IosController::Instance()->importConfigFromOutside(QString(data)); + } return YES; } return NO; diff --git a/client/platforms/ios/ios_controller.h b/client/platforms/ios/ios_controller.h index a81498af..ea8adbc0 100644 --- a/client/platforms/ios/ios_controller.h +++ b/client/platforms/ios/ios_controller.h @@ -4,28 +4,30 @@ #include "protocols/vpnprotocol.h" #ifdef __OBJC__ -#import + #import @class NETunnelProviderManager; #endif using namespace amnezia; -struct Action { - static const char* start; - static const char* restart; - static const char* stop; - static const char* getTunnelId; - static const char* getStatus; +struct Action +{ + static const char *start; + static const char *restart; + static const char *stop; + static const char *getTunnelId; + static const char *getStatus; }; -struct MessageKey { - static const char* action; - static const char* tunnelId; - static const char* config; - static const char* errorCode; - static const char* host; - static const char* port; - static const char* isOnDemand; +struct MessageKey +{ + static const char *action; + static const char *tunnelId; + static const char *config; + static const char *errorCode; + static const char *host; + static const char *port; + static const char *isOnDemand; }; class IosController : public QObject @@ -33,27 +35,27 @@ class IosController : public QObject Q_OBJECT public: - static IosController* Instance(); + static IosController *Instance(); virtual ~IosController() override = default; bool initialize(); - bool connectVpn(amnezia::Proto proto, const QJsonObject& configuration); + bool connectVpn(amnezia::Proto proto, const QJsonObject &configuration); void disconnectVpn(); void vpnStatusDidChange(void *pNotification); void vpnConfigurationDidChange(void *pNotification); - void getBackendLogs(std::function &&callback); + void getBackendLogs(std::function &&callback); void checkStatus(); signals: void connectionStateChanged(Vpn::ConnectionState state); void bytesChanged(quint64 receivedBytes, quint64 sentBytes); void importConfigFromOutside(const QString); + void importBackupFromOutside(const QString); protected slots: - private: explicit IosController(); @@ -67,12 +69,12 @@ private: void startTunnel(); private: - void *m_iosControllerWrapper{}; + void *m_iosControllerWrapper {}; #ifdef __OBJC__ - NETunnelProviderManager *m_currentTunnel{}; - NSString *m_serverAddress{}; - bool isOurManager(NETunnelProviderManager* manager); - void sendVpnExtensionMessage(NSDictionary* message, std::function callback = nullptr); + NETunnelProviderManager *m_currentTunnel {}; + NSString *m_serverAddress {}; + bool isOurManager(NETunnelProviderManager *manager); + void sendVpnExtensionMessage(NSDictionary *message, std::function callback = nullptr); #endif amnezia::Proto m_proto; diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index 63351311..5f8600db 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -10,17 +10,21 @@ QDebug operator<<(QDebug debug, const amnezia::ProtocolEnumNS::Proto &p) return debug; } -amnezia::Proto ProtocolProps::protoFromString(QString proto){ +amnezia::Proto ProtocolProps::protoFromString(QString proto) +{ QMetaEnum metaEnum = QMetaEnum::fromType(); for (int i = 0; i < metaEnum.keyCount(); ++i) { Proto p = static_cast(i); - if (proto == protoToString(p)) return p; + if (proto == protoToString(p)) + return p; } return Proto::Any; } -QString ProtocolProps::protoToString(amnezia::Proto p){ - if (p == Proto::Any) return ""; +QString ProtocolProps::protoToString(amnezia::Proto p) +{ + if (p == Proto::Any) + return ""; QMetaEnum metaEnum = QMetaEnum::fromType(); QString protoKey = metaEnum.valueToKey(static_cast(p)); @@ -43,7 +47,8 @@ TransportProto ProtocolProps::transportProtoFromString(QString p) QMetaEnum metaEnum = QMetaEnum::fromType(); for (int i = 0; i < metaEnum.keyCount(); ++i) { TransportProto tp = static_cast(i); - if (p.toLower() == transportProtoToString(tp).toLower()) return tp; + if (p.toLower() == transportProtoToString(tp).toLower()) + return tp; } return TransportProto::Udp; } @@ -55,22 +60,19 @@ QString ProtocolProps::transportProtoToString(TransportProto proto, Proto p) return protoKey.toLower(); } - QMap ProtocolProps::protocolHumanNames() { - return { - {Proto::OpenVpn, "OpenVPN"}, - {Proto::ShadowSocks, "ShadowSocks"}, - {Proto::Cloak, "Cloak"}, - {Proto::WireGuard, "WireGuard"}, - {Proto::Ikev2, "IKEv2"}, - {Proto::L2tp, "L2TP"}, + return { { Proto::OpenVpn, "OpenVPN" }, + { Proto::ShadowSocks, "ShadowSocks" }, + { Proto::Cloak, "Cloak" }, + { Proto::WireGuard, "WireGuard" }, + { Proto::Ikev2, "IKEv2" }, + { Proto::L2tp, "L2TP" }, - {Proto::TorWebSite, "Web site in Tor network"}, - {Proto::Dns, "DNS Service"}, - {Proto::FileShare, "File Sharing Service"}, - {Proto::Sftp, QObject::tr("Sftp service")} - }; + { Proto::TorWebSite, "Website in Tor network" }, + { Proto::Dns, "DNS Service" }, + { Proto::FileShare, "File Sharing Service" }, + { Proto::Sftp, QObject::tr("Sftp service") } }; } QMap ProtocolProps::protocolDescriptions() @@ -81,90 +83,89 @@ QMap ProtocolProps::protocolDescriptions() amnezia::ServiceType ProtocolProps::protocolService(Proto p) { switch (p) { - case Proto::Any : return ServiceType::None; - case Proto::OpenVpn : return ServiceType::Vpn; - case Proto::Cloak : return ServiceType::Vpn; - case Proto::ShadowSocks : return ServiceType::Vpn; - case Proto::WireGuard : return ServiceType::Vpn; - case Proto::TorWebSite : return ServiceType::Other; - case Proto::Dns : return ServiceType::Other; - case Proto::FileShare : return ServiceType::Other; - default: return ServiceType::Other; + case Proto::Any: return ServiceType::None; + case Proto::OpenVpn: return ServiceType::Vpn; + case Proto::Cloak: return ServiceType::Vpn; + case Proto::ShadowSocks: return ServiceType::Vpn; + case Proto::WireGuard: return ServiceType::Vpn; + case Proto::TorWebSite: return ServiceType::Other; + case Proto::Dns: return ServiceType::Other; + case Proto::FileShare: return ServiceType::Other; + default: return ServiceType::Other; } } int ProtocolProps::defaultPort(Proto p) { switch (p) { - case Proto::Any : return -1; - case Proto::OpenVpn : return 1194; - case Proto::Cloak : return 443; - case Proto::ShadowSocks : return 6789; - case Proto::WireGuard : return 51820; - case Proto::Ikev2 : return -1; - case Proto::L2tp : return -1; + case Proto::Any: return -1; + case Proto::OpenVpn: return 1194; + case Proto::Cloak: return 443; + case Proto::ShadowSocks: return 6789; + case Proto::WireGuard: return 51820; + case Proto::Ikev2: return -1; + case Proto::L2tp: return -1; - case Proto::TorWebSite : return -1; - case Proto::Dns : return 53; - case Proto::FileShare : return 139; - case Proto::Sftp : return 222; - default: return -1; + case Proto::TorWebSite: return -1; + case Proto::Dns: return 53; + case Proto::FileShare: return 139; + case Proto::Sftp: return 222; + default: return -1; } } bool ProtocolProps::defaultPortChangeable(Proto p) { switch (p) { - case Proto::Any : return false; - case Proto::OpenVpn : return true; - case Proto::Cloak : return true; - case Proto::ShadowSocks : return true; - case Proto::WireGuard : return true; - case Proto::Ikev2 : return false; - case Proto::L2tp : return false; + case Proto::Any: return false; + case Proto::OpenVpn: return true; + case Proto::Cloak: return true; + case Proto::ShadowSocks: return true; + case Proto::WireGuard: return true; + case Proto::Ikev2: return false; + case Proto::L2tp: return false; - - case Proto::TorWebSite : return true; - case Proto::Dns : return false; - case Proto::FileShare : return false; - default: return -1; + case Proto::TorWebSite: return true; + case Proto::Dns: return false; + case Proto::FileShare: return false; + default: return -1; } } TransportProto ProtocolProps::defaultTransportProto(Proto p) { switch (p) { - case Proto::Any : return TransportProto::Udp; - case Proto::OpenVpn : return TransportProto::Udp; - case Proto::Cloak : return TransportProto::Tcp; - case Proto::ShadowSocks : return TransportProto::Tcp; - case Proto::WireGuard : return TransportProto::Udp; - case Proto::Ikev2 : return TransportProto::Udp; - case Proto::L2tp : return TransportProto::Udp; + case Proto::Any: return TransportProto::Udp; + case Proto::OpenVpn: return TransportProto::Udp; + case Proto::Cloak: return TransportProto::Tcp; + case Proto::ShadowSocks: return TransportProto::Tcp; + case Proto::WireGuard: return TransportProto::Udp; + case Proto::Ikev2: return TransportProto::Udp; + case Proto::L2tp: return TransportProto::Udp; // non-vpn - case Proto::TorWebSite : return TransportProto::Tcp; - case Proto::Dns : return TransportProto::Udp; - case Proto::FileShare : return TransportProto::Udp; - case Proto::Sftp : return TransportProto::Tcp; + case Proto::TorWebSite: return TransportProto::Tcp; + case Proto::Dns: return TransportProto::Udp; + case Proto::FileShare: return TransportProto::Udp; + case Proto::Sftp: return TransportProto::Tcp; } } bool ProtocolProps::defaultTransportProtoChangeable(Proto p) { switch (p) { - case Proto::Any : return false; - case Proto::OpenVpn : return true; - case Proto::Cloak : return false; - case Proto::ShadowSocks : return false; - case Proto::WireGuard : return false; - case Proto::Ikev2 : return false; - case Proto::L2tp : return false; + case Proto::Any: return false; + case Proto::OpenVpn: return true; + case Proto::Cloak: return false; + case Proto::ShadowSocks: return false; + case Proto::WireGuard: return false; + case Proto::Ikev2: return false; + case Proto::L2tp: return false; // non-vpn - case Proto::TorWebSite : return false; - case Proto::Dns : return false; - case Proto::FileShare : return false; - case Proto::Sftp : return false; - default: return false; + case Proto::TorWebSite: return false; + case Proto::Dns: return false; + case Proto::FileShare: return false; + case Proto::Sftp: return false; + default: return false; } } diff --git a/client/ui/controllers/pageController.h b/client/ui/controllers/pageController.h index 8d3da507..07e77283 100644 --- a/client/ui/controllers/pageController.h +++ b/client/ui/controllers/pageController.h @@ -85,6 +85,7 @@ signals: void goToPageSettings(); void goToPageViewConfig(); void goToPageSettingsServerServices(); + void goToPageSettingsBackup(); void closePage(); diff --git a/client/ui/controllers/settingsController.h b/client/ui/controllers/settingsController.h index 3d96dc03..5a51a3b4 100644 --- a/client/ui/controllers/settingsController.h +++ b/client/ui/controllers/settingsController.h @@ -65,6 +65,8 @@ signals: void saveFile(const QString &fileName, const QString &data); + void importBackupFromOutside(QString filePath); + private: QSharedPointer m_serversModel; QSharedPointer m_containersModel; diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index 4d719d1a..6513ea7f 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -169,7 +169,7 @@ DrawerType { Layout.topMargin: 16 } - TextArea { + TextField { id: configText Layout.fillWidth: true @@ -180,6 +180,8 @@ DrawerType { leftPadding: 0 height: 24 + readOnly: true + color: "#D7D8DB" selectionColor: "#633303" selectedTextColor: "#D7D8DB" diff --git a/client/ui/qml/Pages2/PageSettingsBackup.qml b/client/ui/qml/Pages2/PageSettingsBackup.qml index 6a9ea58f..7a556dfb 100644 --- a/client/ui/qml/Pages2/PageSettingsBackup.qml +++ b/client/ui/qml/Pages2/PageSettingsBackup.qml @@ -10,6 +10,7 @@ import PageEnum 1.0 import "./" import "../Controls2" import "../Config" +import "../Components" import "../Controls2/TextTypes" PageType { @@ -27,6 +28,10 @@ PageType { //goToStartPage() PageController.goToPageHome() } + + function onImportBackupFromOutside(filePath) { + restoreBackup(filePath) + } } BackButtonType { @@ -116,15 +121,35 @@ PageType { text: qsTr("Restore from backup") onClicked: { - var fileName = SystemController.getFileName(qsTr("Open backup file"), + var filePath = SystemController.getFileName(qsTr("Open backup file"), qsTr("Backup files (*.backup)")) - if (fileName !== "") { - PageController.showBusyIndicator(true) - SettingsController.restoreAppConfig(fileName) - PageController.showBusyIndicator(false) + if (filePath !== "") { + restoreBackup(filePath) } } } } } + + function restoreBackup(filePath) { + questionDrawer.headerText = qsTr("Import settings from a backup file?") + questionDrawer.descriptionText = qsTr("All current settings will be reset"); + questionDrawer.yesButtonText = qsTr("Continue") + questionDrawer.noButtonText = qsTr("Cancel") + + questionDrawer.yesButtonFunction = function() { + questionDrawer.visible = false + PageController.showBusyIndicator(true) + SettingsController.restoreAppConfig(filePath) + PageController.showBusyIndicator(false) + } + questionDrawer.noButtonFunction = function() { + questionDrawer.visible = false + } + questionDrawer.visible = true + } + + QuestionDrawer { + id: questionDrawer + } } diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index c9f38753..073fb4ad 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -81,6 +81,10 @@ Window { function onShowPassphraseRequestDrawer() { privateKeyPassphraseDrawer.open() } + + function onGoToPageSettingsBackup() { + PageController.goToPage(PageEnum.PageSettingsBackup) + } } Connections {