Share pages refactoring

This commit is contained in:
pokamest 2021-11-13 16:09:08 +03:00
parent 396af917b5
commit 836075de10
15 changed files with 222 additions and 622 deletions

View file

@ -14,8 +14,6 @@ class PageLogicBase : public QObject
{
Q_OBJECT
AUTO_PROPERTY(bool, pageEnabled)
// AUTO_PROPERTY(int, serverIndex)
// AUTO_PROPERTY(DockerContainer, dockerContainer)
public:
explicit PageLogicBase(UiLogic *uiLogic, QObject *parent = nullptr);

View file

@ -127,5 +127,5 @@ void ServerSettingsLogic::onLineEditDescriptionEditingFinished()
void ServerSettingsLogic::onPushButtonShareFullClicked()
{
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), DockerContainer::None);
emit uiLogic()->goToPage(Page::ShareConnection);
emit uiLogic()->goToShareProtocolPage(Protocol::Any);
}

View file

@ -23,161 +23,76 @@
ShareConnectionLogic::ShareConnectionLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent),
m_textEditShareOpenVpnCodeText{},
m_pushButtonShareOpenVpnCopyEnabled{false},
m_pushButtonShareOpenVpnSaveEnabled{false},
m_lineEditShareShadowSocksStringText{},
m_labelShareShadowSocksQrCodeText{},
m_shareShadowSocksQrCodeText{},
m_labelShareShadowSocksServerText{},
m_labelShareShadowSocksPortText{},
m_labelShareShadowSocksMethodText{},
m_labelShareShadowSocksPasswordText{},
m_plainTextEditShareCloakText{},
m_textEditShareFullCodeText{},
m_textEditShareCloakText{},
m_textEditShareAmneziaCodeText{},
m_pushButtonShareFullCopyText{tr("Copy")},
m_pushButtonShareAmneziaCopyText{tr("Copy")},
m_pushButtonShareOpenVpnCopyText{tr("Copy")},
m_pushButtonShareShadowSocksCopyText{tr("Copy")},
m_pushButtonShareCloakCopyText{tr("Copy")},
m_pushButtonShareAmneziaGenerateEnabled{true},
m_pushButtonShareAmneziaCopyEnabled{true},
m_pushButtonShareAmneziaGenerateText{tr("Generate config")},
m_pushButtonShareOpenVpnGenerateEnabled{true},
m_pushButtonShareOpenVpnGenerateText{tr("Generate config")}
{
// TODO consider move to Component.onCompleted
//updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), uiLogic()->selectedDockerContainer);
}
void ShareConnectionLogic::onPushButtonShareFullCopyClicked()
void ShareConnectionLogic::onUpdatePage()
{
QGuiApplication::clipboard()->setText(textEditShareFullCodeText());
set_pushButtonShareFullCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareFullCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareFullSaveClicked()
{
if (textEditShareFullCodeText().isEmpty()) return;
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save AmneziaVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.amnezia");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareFullCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::onPushButtonShareAmneziaCopyClicked()
{
if (textEditShareAmneziaCodeText().isEmpty()) return;
QGuiApplication::clipboard()->setText(textEditShareAmneziaCodeText());
set_pushButtonShareAmneziaCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareAmneziaCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareAmneziaSaveClicked()
{
if (textEditShareAmneziaCodeText().isEmpty()) return;
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save AmneziaVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.amnezia");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareAmneziaCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::onPushButtonShareOpenVpnCopyClicked()
{
QGuiApplication::clipboard()->setText(textEditShareOpenVpnCodeText());
set_pushButtonShareOpenVpnCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareOpenVpnCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareShadowSocksCopyClicked()
{
QGuiApplication::clipboard()->setText(lineEditShareShadowSocksStringText());
set_pushButtonShareShadowSocksCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareShadowSocksCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareCloakCopyClicked()
{
QGuiApplication::clipboard()->setText(plainTextEditShareCloakText());
set_pushButtonShareCloakCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareCloakCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked()
{
set_pushButtonShareAmneziaGenerateEnabled(false);
set_pushButtonShareAmneziaCopyEnabled(false);
set_pushButtonShareAmneziaGenerateText(tr("Generating..."));
qApp->processEvents();
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
containerConfig.insert(config_key::container, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ErrorCode e = ErrorCode::NoError;
for (Protocol p: ContainerProps::protocolsForContainer(uiLogic()->selectedDockerContainer)) {
QJsonObject protoConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p);
QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, p, &e);
if (e) {
cfg = "Error generating config";
break;
}
protoConfig.insert(config_key::last_config, cfg);
containerConfig.insert(ProtocolProps::protoToString(p), protoConfig);
}
QByteArray ba;
if (!e) {
QJsonObject serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
serverConfig.remove(config_key::userName);
serverConfig.remove(config_key::password);
serverConfig.remove(config_key::port);
serverConfig.insert(config_key::containers, QJsonArray {containerConfig});
serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ba = QJsonDocument(serverConfig).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
set_textEditShareAmneziaCodeText(QString("vpn://%1").arg(QString(ba)));
set_textEditShareAmneziaCodeText("");
QJsonObject serverConfig;
// Full access
if (shareFullAccess()) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
}
// Container share
else {
set_textEditShareAmneziaCodeText(tr("Error while generating connection profile"));
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
containerConfig.insert(config_key::container, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ErrorCode e = ErrorCode::NoError;
for (Protocol p: ContainerProps::protocolsForContainer(uiLogic()->selectedDockerContainer)) {
QJsonObject protoConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p);
QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, p, &e);
if (e) {
cfg = "Error generating config";
break;
}
protoConfig.insert(config_key::last_config, cfg);
containerConfig.insert(ProtocolProps::protoToString(p), protoConfig);
}
QByteArray ba;
if (!e) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
serverConfig.remove(config_key::userName);
serverConfig.remove(config_key::password);
serverConfig.remove(config_key::port);
serverConfig.insert(config_key::containers, QJsonArray {containerConfig});
serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
}
else {
set_textEditShareAmneziaCodeText(tr("Error while generating connection profile"));
return;
}
}
set_pushButtonShareAmneziaGenerateEnabled(true);
set_pushButtonShareAmneziaCopyEnabled(true);
set_pushButtonShareAmneziaGenerateText(tr("Generate config"));
QByteArray ba = QJsonDocument(serverConfig).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
QString code = QString("vpn://%1").arg(QString(ba));
set_textEditShareAmneziaCodeText(code);
QImage qr = updateQRCodeImage(code);
set_shareAmneziaQrCodeText(imageToBase64(qr));
}
void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked()
{
set_pushButtonShareOpenVpnGenerateEnabled(false);
set_pushButtonShareOpenVpnCopyEnabled(false);
set_pushButtonShareOpenVpnSaveEnabled(false);
set_pushButtonShareOpenVpnGenerateText(tr("Generating..."));
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
@ -189,49 +104,19 @@ void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked()
set_textEditShareOpenVpnCodeText(QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString());
set_pushButtonShareOpenVpnGenerateEnabled(true);
set_pushButtonShareOpenVpnCopyEnabled(true);
set_pushButtonShareOpenVpnSaveEnabled(true);
set_pushButtonShareOpenVpnGenerateText(tr("Generate config"));
}
void ShareConnectionLogic::onPushButtonShareOpenVpnSaveClicked()
{
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save OpenVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.ovpn");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareOpenVpnCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCredentials &credentials,
DockerContainer container)
{
uiLogic()->selectedDockerContainer = container;
uiLogic()->selectedServerIndex = serverIndex;
set_shareFullAccess(container == DockerContainer::None);
// Full access
if (container == DockerContainer::None) {
const QJsonObject &server = m_settings.server(uiLogic()->selectedServerIndex);
QByteArray ba = QJsonDocument(server).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
set_textEditShareFullCodeText(QString("vpn://%1").arg(QString(ba)));
}
else {
if (! shareFullAccess()) {
for (Protocol p : ContainerProps::protocolsForContainer(container)) {
if (p == Protocol::OpenVpn) {
QString cfg = tr("Press Generate config");
set_textEditShareOpenVpnCodeText(cfg);
set_pushButtonShareOpenVpnCopyEnabled(false);
set_pushButtonShareOpenVpnSaveEnabled(false);
}
else if (p == Protocol::ShadowSocks) {
if (p == Protocol::ShadowSocks) {
QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::ShadowSocks);
QString cfg = protoConfig.value(config_key::last_config).toString();
@ -254,7 +139,7 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
set_lineEditShareShadowSocksStringText(ssString);
QImage qr = updateQRCodeImage(ssString);
set_labelShareShadowSocksQrCodeText(imageToBase64(qr));
set_shareShadowSocksQrCodeText(imageToBase64(qr));
set_labelShareShadowSocksServerText(ssConfig.value("server").toString());
set_labelShareShadowSocksPortText(ssConfig.value("server_port").toString());
@ -263,7 +148,7 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
}
else if (p == Protocol::Cloak) {
set_plainTextEditShareCloakText(QString(""));
set_textEditShareCloakText(QString(""));
QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::Cloak);
QString cfg = protoConfig.value(config_key::last_config).toString();
@ -281,29 +166,15 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
cloakConfig.remove(config_key::transport_proto);
cloakConfig.insert("ProxyMethod", "shadowsocks");
set_plainTextEditShareCloakText(QJsonDocument(cloakConfig).toJson());
set_textEditShareCloakText(QJsonDocument(cloakConfig).toJson());
}
}
}
//ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client"));
// Amnezia sharing
// QJsonObject exportContainer;
// for (Protocol p: protocolsForContainer(container)) {
// QJsonObject protocolConfig = containerConfig.value(ProtocolProps::protoToString(p)).toObject();
// protocolConfig.remove(config_key::last_config);
// exportContainer.insert(ProtocolProps::protoToString(p), protocolConfig);
// }
// exportContainer.insert(config_key::container, containerToString(container));
// ui->textEdit_share_amnezia_code->setPlainText(QJsonDocument(exportContainer).toJson());
set_textEditShareAmneziaCodeText(tr(""));
}
QImage ShareConnectionLogic::updateQRCodeImage(const QString &text)
{
int levelIndex = 1;

View file

@ -11,40 +11,28 @@ class ShareConnectionLogic: public PageLogicBase
Q_OBJECT
public:
AUTO_PROPERTY(bool, shareFullAccess)
AUTO_PROPERTY(QString, textEditShareAmneziaCodeText)
AUTO_PROPERTY(QString, shareAmneziaQrCodeText)
AUTO_PROPERTY(QString, textEditShareOpenVpnCodeText)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnCopyEnabled)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnSaveEnabled)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnGenerateText)
AUTO_PROPERTY(QString, lineEditShareShadowSocksStringText)
AUTO_PROPERTY(QString, labelShareShadowSocksQrCodeText)
AUTO_PROPERTY(QString, shareShadowSocksQrCodeText)
AUTO_PROPERTY(QString, labelShareShadowSocksServerText)
AUTO_PROPERTY(QString, labelShareShadowSocksPortText)
AUTO_PROPERTY(QString, labelShareShadowSocksMethodText)
AUTO_PROPERTY(QString, labelShareShadowSocksPasswordText)
AUTO_PROPERTY(QString, plainTextEditShareCloakText)
AUTO_PROPERTY(QString, textEditShareFullCodeText)
AUTO_PROPERTY(QString, textEditShareAmneziaCodeText)
AUTO_PROPERTY(QString, pushButtonShareFullCopyText)
AUTO_PROPERTY(QString, pushButtonShareAmneziaCopyText)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnCopyText)
AUTO_PROPERTY(QString, pushButtonShareShadowSocksCopyText)
AUTO_PROPERTY(QString, pushButtonShareCloakCopyText)
AUTO_PROPERTY(bool, pushButtonShareAmneziaGenerateEnabled)
AUTO_PROPERTY(bool, pushButtonShareAmneziaCopyEnabled)
AUTO_PROPERTY(QString, pushButtonShareAmneziaGenerateText)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnGenerateEnabled)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnGenerateText)
AUTO_PROPERTY(QString, textEditShareCloakText)
public:
Q_INVOKABLE void onPushButtonShareFullCopyClicked();
Q_INVOKABLE void onPushButtonShareFullSaveClicked();
Q_INVOKABLE void onPushButtonShareAmneziaCopyClicked();
Q_INVOKABLE void onPushButtonShareAmneziaSaveClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnCopyClicked();
Q_INVOKABLE void onPushButtonShareShadowSocksCopyClicked();
Q_INVOKABLE void onPushButtonShareCloakCopyClicked();
Q_INVOKABLE void onPushButtonShareAmneziaGenerateClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnGenerateClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnSaveClicked();
Q_INVOKABLE virtual void onUpdatePage() override;
public:
explicit ShareConnectionLogic(UiLogic *uiLogic, QObject *parent = nullptr);