added import backup file from outside for ios

This commit is contained in:
vladimir.kuznetsov 2023-09-13 16:11:08 +05:00
parent e2aef1fc1d
commit 4ae608ed93
10 changed files with 157 additions and 111 deletions

View file

@ -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));

View file

@ -86,7 +86,7 @@ QMap<DockerContainer, QString> 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<DockerContainer, QString> 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") } };

View file

@ -76,11 +76,15 @@
QString filePath(url.path.UTF8String);
if (filePath.isEmpty()) return NO;
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;

View file

@ -4,28 +4,30 @@
#include "protocols/vpnprotocol.h"
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <Foundation/Foundation.h>
@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<void (const QString &)> &&callback);
void getBackendLogs(std::function<void(const QString &)> &&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<void(NSDictionary*)> callback = nullptr);
NETunnelProviderManager *m_currentTunnel {};
NSString *m_serverAddress {};
bool isOurManager(NETunnelProviderManager *manager);
void sendVpnExtensionMessage(NSDictionary *message, std::function<void(NSDictionary *)> callback = nullptr);
#endif
amnezia::Proto m_proto;

View file

@ -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<Proto>();
for (int i = 0; i < metaEnum.keyCount(); ++i) {
Proto p = static_cast<Proto>(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<Proto>();
QString protoKey = metaEnum.valueToKey(static_cast<int>(p));
@ -43,7 +47,8 @@ TransportProto ProtocolProps::transportProtoFromString(QString p)
QMetaEnum metaEnum = QMetaEnum::fromType<TransportProto>();
for (int i = 0; i < metaEnum.keyCount(); ++i) {
TransportProto tp = static_cast<TransportProto>(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<amnezia::Proto, QString> 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<amnezia::Proto, QString> ProtocolProps::protocolDescriptions()
@ -81,14 +83,14 @@ QMap<amnezia::Proto, QString> 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;
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;
}
}
@ -96,18 +98,18 @@ amnezia::ServiceType ProtocolProps::protocolService(Proto p)
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;
case Proto::TorWebSite: return -1;
case Proto::Dns: return 53;
case Proto::FileShare: return 139;
case Proto::Sftp: return 222;
default: return -1;
}
}
@ -115,18 +117,17 @@ int ProtocolProps::defaultPort(Proto p)
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;
case Proto::TorWebSite: return true;
case Proto::Dns: return false;
case Proto::FileShare: return false;
default: return -1;
}
}
@ -134,36 +135,36 @@ bool ProtocolProps::defaultPortChangeable(Proto p)
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;
case Proto::TorWebSite: return false;
case Proto::Dns: return false;
case Proto::FileShare: return false;
case Proto::Sftp: return false;
default: return false;
}
}

View file

@ -85,6 +85,7 @@ signals:
void goToPageSettings();
void goToPageViewConfig();
void goToPageSettingsServerServices();
void goToPageSettingsBackup();
void closePage();

View file

@ -65,6 +65,8 @@ signals:
void saveFile(const QString &fileName, const QString &data);
void importBackupFromOutside(QString filePath);
private:
QSharedPointer<ServersModel> m_serversModel;
QSharedPointer<ContainersModel> m_containersModel;

View file

@ -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"

View file

@ -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 !== "") {
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(fileName)
SettingsController.restoreAppConfig(filePath)
PageController.showBusyIndicator(false)
}
questionDrawer.noButtonFunction = function() {
questionDrawer.visible = false
}
questionDrawer.visible = true
}
}
QuestionDrawer {
id: questionDrawer
}
}

View file

@ -81,6 +81,10 @@ Window {
function onShowPassphraseRequestDrawer() {
privateKeyPassphraseDrawer.open()
}
function onGoToPageSettingsBackup() {
PageController.goToPage(PageEnum.PageSettingsBackup)
}
}
Connections {