added import backup file from outside for ios
This commit is contained in:
parent
e2aef1fc1d
commit
4ae608ed93
10 changed files with 157 additions and 111 deletions
|
@ -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));
|
||||
|
|
|
@ -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") } };
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,6 +85,7 @@ signals:
|
|||
void goToPageSettings();
|
||||
void goToPageViewConfig();
|
||||
void goToPageSettingsServerServices();
|
||||
void goToPageSettingsBackup();
|
||||
|
||||
void closePage();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,6 +81,10 @@ Window {
|
|||
function onShowPassphraseRequestDrawer() {
|
||||
privateKeyPassphraseDrawer.open()
|
||||
}
|
||||
|
||||
function onGoToPageSettingsBackup() {
|
||||
PageController.goToPage(PageEnum.PageSettingsBackup)
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue