fixed qr code generation for native configs

This commit is contained in:
vladimir.kuznetsov 2023-11-25 13:02:02 +07:00
parent 9cfcb714ae
commit 1bf808c9ee
3 changed files with 61 additions and 19 deletions

View file

@ -8,10 +8,10 @@
#include <QImage> #include <QImage>
#include <QStandardPaths> #include <QStandardPaths>
#include "configurators/openvpn_configurator.h"
#include "configurators/wireguard_configurator.h"
#include "configurators/shadowsocks_configurator.h"
#include "configurators/cloak_configurator.h" #include "configurators/cloak_configurator.h"
#include "configurators/openvpn_configurator.h"
#include "configurators/shadowsocks_configurator.h"
#include "configurators/wireguard_configurator.h"
#include "core/errorstrings.h" #include "core/errorstrings.h"
#include "systemController.h" #include "systemController.h"
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
@ -157,8 +157,6 @@ void ExportController::generateOpenVpnConfig()
m_config.append(line + "\n"); m_config.append(line + "\n");
} }
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged(); emit exportConfigChanged();
} }
@ -191,7 +189,8 @@ void ExportController::generateWireGuardConfig()
m_config.append(line + "\n"); m_config.append(line + "\n");
} }
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_config.toUtf8(), qrcodegen::QrCode::Ecc::LOW);
m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1)));
emit exportConfigChanged(); emit exportConfigChanged();
} }
@ -211,7 +210,8 @@ void ExportController::generateShadowSocksConfig()
containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); containerConfig.insert(config_key::container, ContainerProps::containerToString(container));
ErrorCode errorCode = ErrorCode::NoError; ErrorCode errorCode = ErrorCode::NoError;
QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container, containerConfig, &errorCode); QString config = m_configurator->shadowSocksConfigurator->genShadowSocksConfig(credentials, container,
containerConfig, &errorCode);
if (errorCode) { if (errorCode) {
emit exportErrorOccurred(errorString(errorCode)); emit exportErrorOccurred(errorString(errorCode));
@ -220,15 +220,20 @@ void ExportController::generateShadowSocksConfig()
config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::ShadowSocks, config); config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::ShadowSocks, config);
QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object(); QJsonObject configJson = QJsonDocument::fromJson(config.toUtf8()).object();
m_config = QString("%1:%2@%3:%4") QStringList lines = QString(QJsonDocument(configJson).toJson()).replace("\r", "").split("\n");
.arg(configJson.value("method").toString(), for (const QString &line : lines) {
configJson.value("password").toString(), m_config.append(line + "\n");
configJson.value("server").toString(), }
configJson.value("server_port").toString());
m_config = "ss://" + m_config.toUtf8().toBase64(); m_nativeConfigString =
QString("%1:%2@%3:%4")
.arg(configJson.value("method").toString(), configJson.value("password").toString(),
configJson.value("server").toString(), configJson.value("server_port").toString());
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8()); m_nativeConfigString = "ss://" + m_config.toUtf8().toBase64();
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_nativeConfigString.toUtf8(), qrcodegen::QrCode::Ecc::LOW);
m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1)));
emit exportConfigChanged(); emit exportConfigChanged();
} }
@ -248,7 +253,8 @@ void ExportController::generateCloakConfig()
containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); containerConfig.insert(config_key::container, ContainerProps::containerToString(container));
ErrorCode errorCode = ErrorCode::NoError; ErrorCode errorCode = ErrorCode::NoError;
QString config = m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode); QString config =
m_configurator->cloakConfigurator->genCloakConfig(credentials, container, containerConfig, &errorCode);
if (errorCode) { if (errorCode) {
emit exportErrorOccurred(errorString(errorCode)); emit exportErrorOccurred(errorString(errorCode));
@ -265,8 +271,6 @@ void ExportController::generateCloakConfig()
m_config.append(line + "\n"); m_config.append(line + "\n");
} }
m_qrCodes = generateQrCodeImageSeries(m_config.toUtf8());
emit exportConfigChanged(); emit exportConfigChanged();
} }
@ -275,6 +279,11 @@ QString ExportController::getConfig()
return m_config; return m_config;
} }
QString ExportController::getNativeConfigString()
{
return m_nativeConfigString;
}
QList<QString> ExportController::getQrCodes() QList<QString> ExportController::getQrCodes()
{ {
return m_qrCodes; return m_qrCodes;
@ -299,7 +308,7 @@ QList<QString> ExportController::generateQrCodeImageSeries(const QByteArray &dat
QByteArray ba = chunk.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); QByteArray ba = chunk.toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(ba, qrcodegen::QrCode::Ecc::LOW); qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(ba, qrcodegen::QrCode::Ecc::LOW);
QString svg = QString::fromStdString(toSvgString(qr, 0)); QString svg = QString::fromStdString(toSvgString(qr, 1));
chunks.append(svgToBase64(svg)); chunks.append(svgToBase64(svg));
} }
@ -319,5 +328,6 @@ int ExportController::getQrCodesCount()
void ExportController::clearPreviousConfig() void ExportController::clearPreviousConfig()
{ {
m_config.clear(); m_config.clear();
m_nativeConfigString.clear();
m_qrCodes.clear(); m_qrCodes.clear();
} }

View file

@ -22,6 +22,7 @@ public:
Q_PROPERTY(QList<QString> qrCodes READ getQrCodes NOTIFY exportConfigChanged) Q_PROPERTY(QList<QString> qrCodes READ getQrCodes NOTIFY exportConfigChanged)
Q_PROPERTY(int qrCodesCount READ getQrCodesCount NOTIFY exportConfigChanged) Q_PROPERTY(int qrCodesCount READ getQrCodesCount NOTIFY exportConfigChanged)
Q_PROPERTY(QString config READ getConfig NOTIFY exportConfigChanged) Q_PROPERTY(QString config READ getConfig NOTIFY exportConfigChanged)
Q_PROPERTY(QString nativeConfigString READ getNativeConfigString NOTIFY exportConfigChanged)
public slots: public slots:
void generateFullAccessConfig(); void generateFullAccessConfig();
@ -35,6 +36,7 @@ public slots:
void generateCloakConfig(); void generateCloakConfig();
QString getConfig(); QString getConfig();
QString getNativeConfigString();
QList<QString> getQrCodes(); QList<QString> getQrCodes();
void exportConfig(const QString &fileName); void exportConfig(const QString &fileName);
@ -61,6 +63,7 @@ private:
std::shared_ptr<VpnConfigurator> m_configurator; std::shared_ptr<VpnConfigurator> m_configurator;
QString m_config; QString m_config;
QString m_nativeConfigString;
QList<QString> m_qrCodes; QList<QString> m_qrCodes;
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID

View file

@ -112,6 +112,30 @@ DrawerType {
} }
} }
BasicButtonType {
Layout.fillWidth: true
Layout.topMargin: 8
visible: nativeConfigString.text !== ""
defaultColor: "transparent"
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
pressedColor: Qt.rgba(1, 1, 1, 0.12)
disabledColor: "#878B91"
textColor: "#D7D8DB"
borderWidth: 1
text: qsTr("Copy config string")
imageSource: "qrc:/images/controls/copy.svg"
onClicked: {
nativeConfigString.selectAll()
nativeConfigString.copy()
nativeConfigString.select(0, 0)
PageController.showNotificationMessage(qsTr("Copied"))
}
}
BasicButtonType { BasicButtonType {
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 24 Layout.topMargin: 24
@ -170,6 +194,12 @@ DrawerType {
} }
TextField { TextField {
id: nativeConfigString
visible: false
text: ExportController.nativeConfigString
}
TextArea {
id: configText id: configText
Layout.fillWidth: true Layout.fillWidth: true
@ -213,7 +243,6 @@ DrawerType {
Image { Image {
anchors.fill: parent anchors.fill: parent
anchors.margins: 2
smooth: false smooth: false
source: ExportController.qrCodesCount ? ExportController.qrCodes[0] : "" source: ExportController.qrCodesCount ? ExportController.qrCodes[0] : ""