added native config generation for ss and cloak

This commit is contained in:
vladimir.kuznetsov 2023-10-30 14:20:21 +05:00
parent 282f159311
commit 9cfcb714ae
4 changed files with 127 additions and 8 deletions

View file

@ -10,6 +10,8 @@
#include "configurators/openvpn_configurator.h" #include "configurators/openvpn_configurator.h"
#include "configurators/wireguard_configurator.h" #include "configurators/wireguard_configurator.h"
#include "configurators/shadowsocks_configurator.h"
#include "configurators/cloak_configurator.h"
#include "core/errorstrings.h" #include "core/errorstrings.h"
#include "systemController.h" #include "systemController.h"
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
@ -155,6 +157,8 @@ void ExportController::generateOpenVpnConfig()
m_config.append(line + "\n"); m_config.append(line + "\n");
} }
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged(); emit exportConfigChanged();
} }
@ -187,6 +191,82 @@ void ExportController::generateWireGuardConfig()
m_config.append(line + "\n"); m_config.append(line + "\n");
} }
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged();
}
void ExportController::generateShadowSocksConfig()
{
clearPreviousConfig();
int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex();
ServerCredentials credentials =
qvariant_cast<ServerCredentials>(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole));
DockerContainer container = static_cast<DockerContainer>(m_containersModel->getCurrentlyProcessedContainerIndex());
QModelIndex containerModelIndex = m_containersModel->index(container);
QJsonObject containerConfig =
qvariant_cast<QJsonObject>(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole));
containerConfig.insert(config_key::container, ContainerProps::containerToString(container));
ErrorCode errorCode = ErrorCode::NoError;
QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, &errorCode);
if (errorCode) {
emit exportErrorOccurred(errorString(errorCode));
return;
}
config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::ShadowSocks, config);
QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object();
m_config = QString("%1:%2@%3:%4")
.arg(configJson.value("method").toString(),
configJson.value("password").toString(),
configJson.value("server").toString(),
configJson.value("server_port").toString());
m_config = "ss://" + m_config.toUtf8().toBase64();
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged();
}
void ExportController::generateCloakConfig()
{
clearPreviousConfig();
int serverIndex = m_serversModel->getCurrentlyProcessedServerIndex();
ServerCredentials credentials =
qvariant_cast<ServerCredentials>(m_serversModel->data(serverIndex, ServersModel::Roles::CredentialsRole));
DockerContainer container = static_cast<DockerContainer>(m_containersModel->getCurrentlyProcessedContainerIndex());
QModelIndex containerModelIndex = m_containersModel->index(container);
QJsonObject containerConfig =
qvariant_cast<QJsonObject>(m_containersModel->data(containerModelIndex, ContainersModel::Roles::ConfigRole));
containerConfig.insert(config_key::container, ContainerProps::containerToString(container));
ErrorCode errorCode = ErrorCode::NoError;
QString config = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode);
if (errorCode) {
emit exportErrorOccurred(errorString(errorCode));
return;
}
config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::Cloak, config);
QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object();
configJson.remove(config_key::transport_proto);
configJson.insert("ProxyMethod", "shadowsocks");
QStringList lines = QString(QJsonDocument(configJson).toJson()).replace("\r", "").split("\n");
for (const QString &line : lines) {
m_config.append(line + "\n");
}
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged(); emit exportConfigChanged();
} }

View file

@ -31,6 +31,8 @@ public slots:
void generateConnectionConfig(); void generateConnectionConfig();
void generateOpenVpnConfig(); void generateOpenVpnConfig();
void generateWireGuardConfig(); void generateWireGuardConfig();
void generateShadowSocksConfig();
void generateCloakConfig();
QString getConfig(); QString getConfig();
QList<QString> getQrCodes(); QList<QString> getQrCodes();

View file

@ -54,7 +54,7 @@ PageType {
regularExpression: InstallController.ipAddressPortRegExp() regularExpression: InstallController.ipAddressPortRegExp()
} }
onTextFieldTextChanged: { onFocusChanged: {
textField.text = textField.text.replace(/^\s+|\s+$/g, ''); textField.text = textField.text.replace(/^\s+|\s+$/g, '');
} }
} }
@ -81,6 +81,10 @@ PageType {
clickedFunc: function() { clickedFunc: function() {
hidePassword = !hidePassword hidePassword = !hidePassword
} }
onFocusChanged: {
textField.text = textField.text.replace(/^\s+|\s+$/g, '');
}
} }
BasicButtonType { BasicButtonType {
@ -90,6 +94,7 @@ PageType {
text: qsTr("Continue") text: qsTr("Continue")
onClicked: function() { onClicked: function() {
forceActiveFocus()
if (!isCredentialsFilled()) { if (!isCredentialsFilled()) {
return return
} }
@ -112,8 +117,7 @@ PageType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 12 Layout.topMargin: 12
text: qsTr("All data you enter will remain strictly confidential text: qsTr("All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties")
and will not be shared or disclosed to the Amnezia or any third parties")
} }
} }
} }

View file

@ -20,7 +20,9 @@ PageType {
AmneziaConnection, AmneziaConnection,
AmneziaFullAccess, AmneziaFullAccess,
OpenVpn, OpenVpn,
WireGuard WireGuard,
ShadowSocks,
Cloak
} }
Connections { Connections {
@ -44,18 +46,32 @@ PageType {
break; break;
} }
case PageShare.ConfigType.OpenVpn: { case PageShare.ConfigType.OpenVpn: {
ExportController.generateOpenVpnConfig(); ExportController.generateOpenVpnConfig()
shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config")
shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configExtension = ".ovpn"
shareConnectionDrawer.configFileName = "amnezia_for_openvpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn"
break; break
} }
case PageShare.ConfigType.WireGuard: { case PageShare.ConfigType.WireGuard: {
ExportController.generateWireGuardConfig(); ExportController.generateWireGuardConfig()
shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configCaption = qsTr("Save WireGuard config")
shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configExtension = ".conf"
shareConnectionDrawer.configFileName = "amnezia_for_wireguard" shareConnectionDrawer.configFileName = "amnezia_for_wireguard"
break; break
}
case PageShare.ConfigType.ShadowSocks: {
ExportController.generateShadowSocksConfig()
shareConnectionDrawer.configCaption = qsTr("Save ShadowSocks config")
shareConnectionDrawer.configExtension = ".json"
shareConnectionDrawer.configFileName = "amnezia_for_shadowsocks"
break
}
case PageShare.ConfigType.Cloak: {
ExportController.generateCloakConfig()
shareConnectionDrawer.configCaption = qsTr("Save Cloak config")
shareConnectionDrawer.configExtension = ".json"
shareConnectionDrawer.configFileName = "amnezia_for_cloak"
break
} }
} }
@ -96,6 +112,16 @@ PageType {
property string name: qsTr("WireGuard native format") property string name: qsTr("WireGuard native format")
property var type: PageShare.ConfigType.WireGuard property var type: PageShare.ConfigType.WireGuard
} }
QtObject {
id: shadowSocksConnectionFormat
property string name: qsTr("ShadowSocks native format")
property var type: PageShare.ConfigType.ShadowSocks
}
QtObject {
id: cloakConnectionFormat
property string name: qsTr("Cloak native format")
property var type: PageShare.ConfigType.Cloak
}
FlickableType { FlickableType {
anchors.top: parent.top anchors.top: parent.top
@ -322,6 +348,13 @@ PageType {
root.connectionTypesModel.push(openVpnConnectionFormat) root.connectionTypesModel.push(openVpnConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-wireguard")) { } else if (index === ContainerProps.containerFromString("amnezia-wireguard")) {
root.connectionTypesModel.push(wireGuardConnectionFormat) root.connectionTypesModel.push(wireGuardConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-shadowsocks")) {
root.connectionTypesModel.push(openVpnConnectionFormat)
root.connectionTypesModel.push(shadowSocksConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-openvpn-cloak")) {
root.connectionTypesModel.push(openVpnConnectionFormat)
root.connectionTypesModel.push(shadowSocksConnectionFormat)
root.connectionTypesModel.push(cloakConnectionFormat)
} }
} }
} }