From 0099e642f3774fc5f124f49174fa5aa8c6113686 Mon Sep 17 00:00:00 2001 From: Viacheslav Sergeev Date: Sun, 30 Apr 2023 14:24:12 +0200 Subject: [PATCH 1/7] changes from previous fork (vityazaychek/amnezia-client) --- client/CMakeLists.txt | 1 + client/containers/containers_defs.cpp | 11 +- client/containers/containers_defs.h | 4 +- client/core/servercontroller.cpp | 5 + client/protocols/protocols_defs.cpp | 5 +- client/protocols/protocols_defs.h | 13 +- client/resources.qrc | 1 + client/server_scripts/nextcloud/Dockerfile | 3 + .../nextcloud/configure_container.sh | 0 .../server_scripts/nextcloud/run_container.sh | 4 + .../ServerConfiguringProgressLogic.h | 1 + .../pages_logic/protocols/NextcloudLogic.cpp | 128 ++++++++++++++++++ .../ui/pages_logic/protocols/NextcloudLogic.h | 47 +++++++ .../Pages/Protocols/PageNextcloudProtocol.qml | 80 +++++++++++ client/ui/uilogic.cpp | 2 + client/ui/uilogic.h | 2 + deploy/build_macos.sh | 4 +- 17 files changed, 304 insertions(+), 7 deletions(-) create mode 100644 client/server_scripts/nextcloud/Dockerfile create mode 100644 client/server_scripts/nextcloud/configure_container.sh create mode 100644 client/server_scripts/nextcloud/run_container.sh create mode 100644 client/ui/pages_logic/protocols/NextcloudLogic.cpp create mode 100644 client/ui/pages_logic/protocols/NextcloudLogic.h create mode 100644 client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index fad1b67e..dde3d508 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -92,6 +92,7 @@ set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/protocols/vpnprotocol.h ${CMAKE_CURRENT_BINARY_DIR}/version.h ${CMAKE_CURRENT_LIST_DIR}/core/sshclient.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/ ) if(NOT IOS) diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index 17391988..e33585bb 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -61,6 +61,9 @@ QVector ContainerProps::protocolsForContainer(amnezia::DockerCon case DockerContainer::Sftp: return { Proto::Sftp}; + case DockerContainer::Nextcloud: + return { Proto::Nextcloud }; + default: return { defaultProtocol(container) }; } @@ -90,7 +93,8 @@ QMap ContainerProps::containerHumanNames() {DockerContainer::TorWebSite, QObject::tr("Web site in Tor network")}, {DockerContainer::Dns, QObject::tr("DNS Service")}, //{DockerContainer::FileShare, QObject::tr("SMB file sharing service")}, - {DockerContainer::Sftp, QObject::tr("Sftp file sharing service")} + {DockerContainer::Sftp, QObject::tr("Sftp file sharing service")}, + {DockerContainer::Nextcloud, QObject::tr("Nextcloud")} }; } @@ -107,7 +111,8 @@ QMap ContainerProps::containerDescriptions() {DockerContainer::TorWebSite, QObject::tr("Web site 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")} + {DockerContainer::Sftp, QObject::tr("Sftp file sharing service - is secure FTP service")}, + {DockerContainer::Nextcloud, QObject::tr("Nextcloud private cloud")}, }; } @@ -124,6 +129,7 @@ amnezia::ServiceType ContainerProps::containerService(DockerContainer c) case DockerContainer::Dns : return ServiceType::Other; //case DockerContainer::FileShare : return ServiceType::Other; case DockerContainer::Sftp : return ServiceType::Other; + case DockerContainer::Nextcloud : return ServiceType::Other; default: return ServiceType::Other; } } @@ -142,6 +148,7 @@ Proto ContainerProps::defaultProtocol(DockerContainer c) case DockerContainer::Dns : return Proto::Dns; //case DockerContainer::FileShare : return Protocol::FileShare; case DockerContainer::Sftp : return Proto::Sftp; + case DockerContainer::Nextcloud : return Proto::Nextcloud; default: return Proto::Any; } } diff --git a/client/containers/containers_defs.h b/client/containers/containers_defs.h index ff230c3e..50488d1d 100644 --- a/client/containers/containers_defs.h +++ b/client/containers/containers_defs.h @@ -24,7 +24,9 @@ enum DockerContainer { TorWebSite, Dns, //FileShare, - Sftp + Sftp, + Nextcloud + }; Q_ENUM_NS(DockerContainer) } // namespace ContainerEnumNS diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 7f4690dc..74412b12 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -491,6 +491,7 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential const QJsonObject &ssConfig = config.value(ProtocolProps::protoToString(Proto::ShadowSocks)).toObject(); const QJsonObject &wireguarConfig = config.value(ProtocolProps::protoToString(Proto::WireGuard)).toObject(); const QJsonObject &sftpConfig = config.value(ProtocolProps::protoToString(Proto::Sftp)).toObject(); + const QJsonObject &nextcloudConfig = config.value(ProtocolProps::protoToString(Proto::Nextcloud)).toObject(); // Vars vars; @@ -568,6 +569,10 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({{"$SFTP_USER", sftpConfig.value(config_key::userName).toString() }}); vars.append({{"$SFTP_PASSWORD", sftpConfig.value(config_key::password).toString() }}); + // Nextcloud vars + vars.append({{"$NEXTCLOUD_PORT", sftpConfig.value(config_key::port).toString(QString::number(ProtocolProps::defaultPort(Proto::Nextcloud))) }}); + vars.append({{"$NEXTCLOUD_ADMIN_USER", nextcloudConfig.value(config_key::adminUser).toString(protocols::nextcloud::defaultAdminUser) }}); + vars.append({{"$NEXTCLOUD_ADMIN_PASSWORD", nextcloudConfig.value(config_key::adminPassword).toString(protocols::nextcloud::defaultAdminPassword) }}); QString serverIp = Utils::getIPAddress(credentials.hostName); if (!serverIp.isEmpty()) { diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index 549c3774..72de6618 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -79,7 +79,8 @@ QMap ProtocolProps::protocolHumanNames() {Proto::TorWebSite, "Web site in Tor network"}, {Proto::Dns, "DNS Service"}, {Proto::FileShare, "File Sharing Service"}, - {Proto::Sftp, QObject::tr("Sftp service")} + {Proto::Sftp, QObject::tr("Sftp service")}, + {Proto::Nextcloud, QObject::tr("Nextcloud")} }; } @@ -118,6 +119,7 @@ int ProtocolProps::defaultPort(Proto p) case Proto::Dns : return 53; case Proto::FileShare : return 139; case Proto::Sftp : return 222; + case Proto::Nextcloud : return 8080; default: return -1; } } @@ -156,6 +158,7 @@ TransportProto ProtocolProps::defaultTransportProto(Proto p) case Proto::Dns : return TransportProto::Udp; case Proto::FileShare : return TransportProto::Udp; case Proto::Sftp : return TransportProto::Tcp; + case Proto::Nextcloud : return TransportProto::Tcp; } } diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index 1f890f4c..f5be7db9 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -12,6 +12,9 @@ namespace config_key { constexpr char hostName[] = "hostName"; constexpr char userName[] = "userName"; constexpr char password[] = "password"; +constexpr char adminUser[] = "adminUser"; +constexpr char adminPassword[] = "adminPassword"; + constexpr char port[] = "port"; constexpr char local_port[] = "local_port"; @@ -125,6 +128,12 @@ constexpr char serverPskKeyPath[] = "/opt/amnezia/wireguard/wireguard_psk.key"; } +namespace nextcloud { +constexpr char defaultAdminUser[] = "admin"; +constexpr char defaultAdminPassword[] = "admin"; +} + + namespace sftp { constexpr char defaultUserName[] = "sftp_user"; @@ -154,7 +163,9 @@ enum Proto { TorWebSite, Dns, FileShare, - Sftp + // Fileshare + Sftp, + Nextcloud }; Q_ENUM_NS(Proto) diff --git a/client/resources.qrc b/client/resources.qrc index 91830679..63813bc2 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -171,5 +171,6 @@ ui/qml/Controls/PopupWarning.qml ui/qml/Controls/PopupWithTextField.qml server_scripts/check_user_in_sudo.sh + ui/qml/Pages/Protocols/PageNextcloudProtocol.qml diff --git a/client/server_scripts/nextcloud/Dockerfile b/client/server_scripts/nextcloud/Dockerfile new file mode 100644 index 00000000..a218ff84 --- /dev/null +++ b/client/server_scripts/nextcloud/Dockerfile @@ -0,0 +1,3 @@ +FROM nextcloud:latest + +LABEL maintainer="AmneziaVPN" \ No newline at end of file diff --git a/client/server_scripts/nextcloud/configure_container.sh b/client/server_scripts/nextcloud/configure_container.sh new file mode 100644 index 00000000..e69de29b diff --git a/client/server_scripts/nextcloud/run_container.sh b/client/server_scripts/nextcloud/run_container.sh new file mode 100644 index 00000000..5ac09bf4 --- /dev/null +++ b/client/server_scripts/nextcloud/run_container.sh @@ -0,0 +1,4 @@ +# Run container +sudo docker run -d \ +-p 9090:80 \ +--name $CONTAINER_NAME $CONTAINER_NAME \ No newline at end of file diff --git a/client/ui/pages_logic/ServerConfiguringProgressLogic.h b/client/ui/pages_logic/ServerConfiguringProgressLogic.h index 9f10bc87..b3fb8ad1 100644 --- a/client/ui/pages_logic/ServerConfiguringProgressLogic.h +++ b/client/ui/pages_logic/ServerConfiguringProgressLogic.h @@ -55,6 +55,7 @@ public: friend class ShadowSocksLogic; friend class CloakLogic; friend class UiLogic; + friend class NextcloudLogic; void onUpdatePage() override; ErrorCode doInstallAction(const std::function &action); diff --git a/client/ui/pages_logic/protocols/NextcloudLogic.cpp b/client/ui/pages_logic/protocols/NextcloudLogic.cpp new file mode 100644 index 00000000..aa64a895 --- /dev/null +++ b/client/ui/pages_logic/protocols/NextcloudLogic.cpp @@ -0,0 +1,128 @@ +#include "NextcloudLogic.h" + +#include + +#include "core/servercontroller.h" +#include "ui/pages_logic/ServerConfiguringProgressLogic.h" +#include "ui/uilogic.h" + +using namespace amnezia; +using namespace PageEnumNS; + +NextcloudLogic::NextcloudLogic(UiLogic *logic, QObject *parent): + PageProtocolLogicBase(logic, parent), + m_lineAdminUserText{}, + m_lineAdminPasswordText{}, + m_pushButtonSaveVisible{false}, + m_progressBarResetVisible{false}, + m_labelInfoVisible{true}, + m_labelInfoText{}, + m_progressBarResetValue{0}, + m_progressBarResetMaximium{100} + +{ + +} + +void NextcloudLogic::updateProtocolPage(const QJsonObject &nextcloudConfig, DockerContainer container, bool haveAuthData) +{ + set_pageEnabled(haveAuthData); + set_pushButtonSaveVisible(haveAuthData); + set_progressBarResetVisible(haveAuthData); + + set_lineAdminUserText(nextcloudConfig.value(config_key::adminUser).toString(protocols::nextcloud::defaultAdminUser)); + set_lineAdminPasswordText(nextcloudConfig.value(config_key::adminPassword).toString(protocols::nextcloud::defaultAdminPassword)); +} + +QJsonObject NextcloudLogic::getProtocolConfigFromPage(QJsonObject oldConfig) +{ + oldConfig.insert(config_key::adminUser, lineAdminUserText()); + oldConfig.insert(config_key::adminPassword, lineAdminPasswordText()); + return oldConfig; +} + +void NextcloudLogic::onPushButtonSaveClicked() +{ + QJsonObject protocolConfig = m_settings->protocolConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, Proto::Nextcloud); + protocolConfig = getProtocolConfigFromPage(protocolConfig); + + QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); + QJsonObject newContainerConfig = containerConfig; + newContainerConfig.insert(ProtocolProps::protoToString(Proto::Nextcloud), protocolConfig); + /* + + ServerConfiguringProgressLogic::PageFunc pageFunc; + pageFunc.setEnabledFunc = [this] (bool enabled) -> void { + set_pageEnabled(enabled); + }; + ServerConfiguringProgressLogic::ButtonFunc saveButtonFunc; + saveButtonFunc.setVisibleFunc = [this] (bool visible) -> void { + set_pushButtonSaveVisible(visible); + }; + ServerConfiguringProgressLogic::LabelFunc waitInfoFunc; + waitInfoFunc.setVisibleFunc = [this] (bool visible) -> void { + set_labelInfoVisible(visible); + }; + waitInfoFunc.setTextFunc = [this] (const QString& text) -> void { + set_labelInfoText(text); + }; + ServerConfiguringProgressLogic::ProgressFunc progressBarFunc; + progressBarFunc.setVisibleFunc = [this] (bool visible) -> void { + set_progressBarResetVisible(visible); + }; + progressBarFunc.setValueFunc = [this] (int value) -> void { + set_progressBarResetValue(value); + }; + progressBarFunc.getValueFunc = [this] (void) -> int { + return progressBarResetValue(); + }; + progressBarFunc.getMaximiumFunc = [this] (void) -> int { + return progressBarResetMaximium(); + }; + progressBarFunc.setTextVisibleFunc = [this] (bool visible) -> void { + set_progressBarTextVisible(visible); + }; + progressBarFunc.setTextFunc = [this] (const QString& text) -> void { + set_progressBarText(text); + }; + + ServerConfiguringProgressLogic::LabelFunc busyInfoFuncy; + busyInfoFuncy.setTextFunc = [this] (const QString& text) -> void { + set_labelServerBusyText(text); + }; + busyInfoFuncy.setVisibleFunc = [this] (bool visible) -> void { + set_labelServerBusyVisible(visible); + }; + + ServerConfiguringProgressLogic::ButtonFunc cancelButtonFunc; + cancelButtonFunc.setVisibleFunc = [this] (bool visible) -> void { + set_pushButtonCancelVisible(visible); + }; + + + progressBarFunc.setTextVisibleFunc(true); + progressBarFunc.setTextFunc(QString("Configuring...")); + + auto installAction = [this, containerConfig, &newContainerConfig]() { + ServerController serverController(m_settings); + return serverController.updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), + uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); + }; + + ErrorCode e = uiLogic()->pageLogic()->doInstallAction(installAction, pageFunc, progressBarFunc, + saveButtonFunc, waitInfoFunc, + busyInfoFuncy, cancelButtonFunc); + + if (!e) { + m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); + m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); + } + qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->m_selectedServerIndex << uiLogic()->m_selectedDockerContainer; +*/ + +} + +void NextcloudLogic::onPushButtonCancelClicked() +{ + emit uiLogic()->pageLogic()->cancelDoInstallAction(true); +} diff --git a/client/ui/pages_logic/protocols/NextcloudLogic.h b/client/ui/pages_logic/protocols/NextcloudLogic.h new file mode 100644 index 00000000..d0db430b --- /dev/null +++ b/client/ui/pages_logic/protocols/NextcloudLogic.h @@ -0,0 +1,47 @@ +#ifndef NEXTCLOUDLOGIC_H +#define NEXTCLOUDLOGIC_H + +#include "PageProtocolLogicBase.h" + +class UiLogic; + +class NextcloudLogic : public PageProtocolLogicBase +{ + Q_OBJECT + + AUTO_PROPERTY(QString, lineAdminUserText) + AUTO_PROPERTY(QString, lineAdminPasswordText) + + AUTO_PROPERTY(bool, labelInfoVisible) + AUTO_PROPERTY(QString, labelInfoText) + + AUTO_PROPERTY(int, progressBarResetValue) + AUTO_PROPERTY(int, progressBarResetMaximium) + AUTO_PROPERTY(bool, progressBarResetVisible) + AUTO_PROPERTY(bool, progressBarTextVisible) + AUTO_PROPERTY(QString, progressBarText) + + AUTO_PROPERTY(bool, labelServerBusyVisible) + AUTO_PROPERTY(QString, labelServerBusyText) + + AUTO_PROPERTY(bool, pushButtonSaveVisible) + AUTO_PROPERTY(bool, pushButtonCancelVisible) + +public: + Q_INVOKABLE void onPushButtonSaveClicked(); + Q_INVOKABLE void onPushButtonCancelClicked(); + +public: + explicit NextcloudLogic(UiLogic *uiLogic, QObject *parent = nullptr); + ~NextcloudLogic() = default; + + void updateProtocolPage(const QJsonObject &nextcloudConfig, DockerContainer container, bool haveAuthData) override; + QJsonObject getProtocolConfigFromPage(QJsonObject oldConfig) override; + +private: + UiLogic *m_uiLogic; + +}; + + +#endif // NEXTCLOUDLOGIC_H diff --git a/client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml b/client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml new file mode 100644 index 00000000..3b5fbc81 --- /dev/null +++ b/client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml @@ -0,0 +1,80 @@ +import QtQuick +import QtQuick.Controls +import ProtocolEnum 1.0 +import "../" +import "../../Controls" +import "../../Config" + +PageProtocolBase { + id: root + protocol: ProtocolEnum.Nextcloud + logic: UiLogic.protocolLogic(protocol) + + BackButton { + id: back + } + + Caption { + id: caption + text: qsTr("Nextcloud settings") + } + + Rectangle { + id: frame_settings + width: parent.width + anchors.top: caption.bottom + anchors.topMargin: 10 + + border.width: 1 + border.color: "lightgray" + anchors.bottomMargin: 5 + anchors.horizontalCenter: parent.horizontalCenter + radius: 2 + Grid { + id: grid + anchors.fill: parent + columns: 2 + horizontalItemAlignment: Grid.AlignHCenter + verticalItemAlignment: Grid.AlignVCenter + topPadding: 5 + leftPadding: 30 + rightPadding: 30 + spacing: 5 + + LabelType { + width: 130 + text: qsTr("Port") + } + TextFieldType { + id: tf_port_num + width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 + text: logic.labelTftpPortText + readOnly: true + } + + LabelType { + width: 130 + text: qsTr("Admin user") + } + TextFieldType { + id: tf_admin_user + width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 + text: logic.labelTftpPortText + readOnly: true + } + + LabelType { + width: 130 + text: qsTr("Admin password") + } + TextFieldType { + id: tf_admin_password + width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 + text: logic.labelTftpUserNameText + readOnly: true + } + + } + } + +} diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index ceb46930..dfc99c45 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -74,6 +74,7 @@ #include "pages_logic/protocols/ShadowSocksLogic.h" #include "pages_logic/protocols/OtherProtocolsLogic.h" #include "pages_logic/protocols/WireGuardLogic.h" +#include "pages_logic/protocols/NextcloudLogic.h" using namespace amnezia; using namespace PageEnumNS; @@ -100,6 +101,7 @@ UiLogic::UiLogic(std::shared_ptr settings, std::shared_ptr Date: Sun, 30 Apr 2023 15:11:54 +0200 Subject: [PATCH 2/7] Fix Nextcloud logic in UI Now the port value from UI should be assigned to the attribute NextcloudLogic object. --- client/protocols/protocols_defs.cpp | 10 +++++++--- client/resources.qrc | 2 +- client/ui/pages_logic/protocols/NextcloudLogic.cpp | 1 + client/ui/pages_logic/protocols/NextcloudLogic.h | 2 +- ...ageNextcloudProtocol.qml => PageProtoNextcloud.qml} | 6 +++--- 5 files changed, 13 insertions(+), 8 deletions(-) rename client/ui/qml/Pages/Protocols/{PageNextcloudProtocol.qml => PageProtoNextcloud.qml} (92%) diff --git a/client/protocols/protocols_defs.cpp b/client/protocols/protocols_defs.cpp index 72de6618..7cd9e7b1 100644 --- a/client/protocols/protocols_defs.cpp +++ b/client/protocols/protocols_defs.cpp @@ -97,10 +97,11 @@ amnezia::ServiceType ProtocolProps::protocolService(Proto p) 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::TorWebSite : return ServiceType::Other; case Proto::Dns : return ServiceType::Other; case Proto::FileShare : return ServiceType::Other; - default: return ServiceType::Other; + case Proto::Nextcloud : return ServiceType::Other; + default: return ServiceType::Other; } } @@ -132,6 +133,7 @@ bool ProtocolProps::defaultPortChangeable(Proto p) case Proto::Cloak : return true; case Proto::ShadowSocks : return true; case Proto::WireGuard : return true; + case Proto::Nextcloud : return true; case Proto::Ikev2 : return false; case Proto::L2tp : return false; @@ -159,6 +161,7 @@ TransportProto ProtocolProps::defaultTransportProto(Proto p) case Proto::FileShare : return TransportProto::Udp; case Proto::Sftp : return TransportProto::Tcp; case Proto::Nextcloud : return TransportProto::Tcp; + default: return defaultTransportProto(Proto::Any); } } @@ -177,7 +180,8 @@ bool ProtocolProps::defaultTransportProtoChangeable(Proto p) case Proto::Dns : return false; case Proto::FileShare : return false; case Proto::Sftp : return false; - default: return false; + case Proto::Nextcloud : return false; + default: return false; } } diff --git a/client/resources.qrc b/client/resources.qrc index 63813bc2..cc428ac1 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -95,6 +95,7 @@ ui/qml/Pages/Protocols/PageProtoTorWebSite.qml ui/qml/Pages/Protocols/PageProtocolBase.qml ui/qml/Pages/Protocols/PageProtoWireGuard.qml + ui/qml/Pages/Protocols/PageProtoNextcloud.qml ui/qml/Pages/InstallSettings/InstallSettingsBase.qml ui/qml/Pages/InstallSettings/SelectContainer.qml ui/qml/Pages/Share/PageShareProtoCloak.qml @@ -171,6 +172,5 @@ ui/qml/Controls/PopupWarning.qml ui/qml/Controls/PopupWithTextField.qml server_scripts/check_user_in_sudo.sh - ui/qml/Pages/Protocols/PageNextcloudProtocol.qml diff --git a/client/ui/pages_logic/protocols/NextcloudLogic.cpp b/client/ui/pages_logic/protocols/NextcloudLogic.cpp index aa64a895..ab2477b4 100644 --- a/client/ui/pages_logic/protocols/NextcloudLogic.cpp +++ b/client/ui/pages_logic/protocols/NextcloudLogic.cpp @@ -11,6 +11,7 @@ using namespace PageEnumNS; NextcloudLogic::NextcloudLogic(UiLogic *logic, QObject *parent): PageProtocolLogicBase(logic, parent), + m_lineNextcloudPortText{}, m_lineAdminUserText{}, m_lineAdminPasswordText{}, m_pushButtonSaveVisible{false}, diff --git a/client/ui/pages_logic/protocols/NextcloudLogic.h b/client/ui/pages_logic/protocols/NextcloudLogic.h index d0db430b..36e7e2f4 100644 --- a/client/ui/pages_logic/protocols/NextcloudLogic.h +++ b/client/ui/pages_logic/protocols/NextcloudLogic.h @@ -9,6 +9,7 @@ class NextcloudLogic : public PageProtocolLogicBase { Q_OBJECT + AUTO_PROPERTY(QString, lineNextcloudPortText) AUTO_PROPERTY(QString, lineAdminUserText) AUTO_PROPERTY(QString, lineAdminPasswordText) @@ -43,5 +44,4 @@ private: }; - #endif // NEXTCLOUDLOGIC_H diff --git a/client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml b/client/ui/qml/Pages/Protocols/PageProtoNextcloud.qml similarity index 92% rename from client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml rename to client/ui/qml/Pages/Protocols/PageProtoNextcloud.qml index 3b5fbc81..221975f9 100644 --- a/client/ui/qml/Pages/Protocols/PageNextcloudProtocol.qml +++ b/client/ui/qml/Pages/Protocols/PageProtoNextcloud.qml @@ -48,7 +48,7 @@ PageProtocolBase { TextFieldType { id: tf_port_num width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 - text: logic.labelTftpPortText + text: logic.lineNextcloudPortText readOnly: true } @@ -59,7 +59,7 @@ PageProtocolBase { TextFieldType { id: tf_admin_user width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 - text: logic.labelTftpPortText + text: logic.lineAdminUserText readOnly: true } @@ -70,7 +70,7 @@ PageProtocolBase { TextFieldType { id: tf_admin_password width: parent.width - 130 - parent.spacing - parent.leftPadding * 2 - text: logic.labelTftpUserNameText + text: logic.lineAdminPasswordText readOnly: true } From 5c167e426de552efe27b85237b2de08c4cae9ea0 Mon Sep 17 00:00:00 2001 From: Viacheslav Sergeev Date: Sun, 30 Apr 2023 15:27:55 +0200 Subject: [PATCH 3/7] Added working nextcloud installation --- client/core/scripts_registry.cpp | 1 + client/resources.qrc | 3 +++ client/server_scripts/nextcloud/Dockerfile | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/core/scripts_registry.cpp b/client/core/scripts_registry.cpp index 1b379ea1..6633eaf4 100644 --- a/client/core/scripts_registry.cpp +++ b/client/core/scripts_registry.cpp @@ -17,6 +17,7 @@ QString amnezia::scriptFolder(amnezia::DockerContainer container) case DockerContainer::Dns: return QLatin1String("dns"); //case DockerContainer::FileShare: return QLatin1String("file_share"); case DockerContainer::Sftp: return QLatin1String("sftp"); + case DockerContainer::Nextcloud: return QLatin1String("nextcloud"); default: return ""; } } diff --git a/client/resources.qrc b/client/resources.qrc index cc428ac1..697e35f9 100644 --- a/client/resources.qrc +++ b/client/resources.qrc @@ -34,6 +34,9 @@ server_scripts/openvpn_cloak/configure_container.sh server_scripts/openvpn_cloak/start.sh server_scripts/openvpn_cloak/template.ovpn + server_scripts/nextcloud/Dockerfile + server_scripts/nextcloud/configure_container.sh + server_scripts/nextcloud/run_container.sh server_scripts/install_docker.sh server_scripts/build_container.sh server_scripts/prepare_host.sh diff --git a/client/server_scripts/nextcloud/Dockerfile b/client/server_scripts/nextcloud/Dockerfile index a218ff84..12cf9763 100644 --- a/client/server_scripts/nextcloud/Dockerfile +++ b/client/server_scripts/nextcloud/Dockerfile @@ -1,3 +1,3 @@ -FROM nextcloud:latest +FROM nextcloud:latest as amnezia-nextcloud LABEL maintainer="AmneziaVPN" \ No newline at end of file From 5f3dbf0bdd4e948665eaea96b067f88526becea3 Mon Sep 17 00:00:00 2001 From: Viacheslav Sergeev Date: Sun, 30 Apr 2023 16:21:08 +0200 Subject: [PATCH 4/7] forward container configuration, and allow to override $NEXTCLOUD_PORT --- client/core/servercontroller.cpp | 5 +++-- client/server_scripts/nextcloud/run_container.sh | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 74412b12..6b424286 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -570,7 +570,8 @@ ServerController::Vars ServerController::genVarsForScript(const ServerCredential vars.append({{"$SFTP_PASSWORD", sftpConfig.value(config_key::password).toString() }}); // Nextcloud vars - vars.append({{"$NEXTCLOUD_PORT", sftpConfig.value(config_key::port).toString(QString::number(ProtocolProps::defaultPort(Proto::Nextcloud))) }}); + QString port = nextcloudConfig.value(config_key::port).toString(QString::number(ProtocolProps::defaultPort(Proto::Nextcloud))); + vars.append({{"$NEXTCLOUD_PORT", port }}); vars.append({{"$NEXTCLOUD_ADMIN_USER", nextcloudConfig.value(config_key::adminUser).toString(protocols::nextcloud::defaultAdminUser) }}); vars.append({{"$NEXTCLOUD_ADMIN_PASSWORD", nextcloudConfig.value(config_key::adminPassword).toString(protocols::nextcloud::defaultAdminPassword) }}); @@ -666,7 +667,7 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential } ErrorCode errorCode = runScript(credentials, - replaceVars(script, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr); + replaceVars(script, genVarsForScript(credentials, container, containerConfig)), cbReadStdOut, cbReadStdErr); if (errorCode != ErrorCode::NoError) { return errorCode; } diff --git a/client/server_scripts/nextcloud/run_container.sh b/client/server_scripts/nextcloud/run_container.sh index 5ac09bf4..515cbba0 100644 --- a/client/server_scripts/nextcloud/run_container.sh +++ b/client/server_scripts/nextcloud/run_container.sh @@ -1,4 +1,4 @@ # Run container sudo docker run -d \ --p 9090:80 \ +-p $NEXTCLOUD_PORT:80 \ --name $CONTAINER_NAME $CONTAINER_NAME \ No newline at end of file From 345cf6cf497bb6c0997c88c4af876930f073e20e Mon Sep 17 00:00:00 2001 From: Viacheslav Sergeev Date: Thu, 4 May 2023 20:15:55 +0200 Subject: [PATCH 5/7] install docker-compose together with docker --- client/server_scripts/install_docker.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index bb14e4cf..2ee2c3c1 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -3,8 +3,9 @@ if [[ -f "$pm_apt" ]]; then pm=$pm_apt; docker_pkg="docker.io"; else pm=$pm_yum; if [[ ! -f "/usr/bin/sudo" ]]; then $pm update -y -q; $pm install -y -q sudo; fi;\ docker_service=$(systemctl list-units --full -all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ if [[ -f "$pm_apt" ]]; then export DEBIAN_FRONTEND=noninteractive; fi;\ -if [[ -z "$docker_service" ]]; then sudo $pm update -y -q; sudo $pm install -y -q curl $docker_pkg; fi;\ +if [[ -z "$docker_service" ]]; then sudo $pm update -y -q; sudo $pm install -y -q curl $docker_pkg docker-compose; fi;\ docker_service=$(systemctl list-units --full -all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ if [[ -z "$docker_service" ]]; then sleep 5 && sudo systemctl start docker && sleep 5; fi;\ if [[ -f "$pm_yum" ]]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\ -docker --version +docker --version \ +docker-compose --version \ No newline at end of file From 7a6905f6bfc11fc1960b622e9b9cf805999da398 Mon Sep 17 00:00:00 2001 From: Viacheslav Sergeev Date: Thu, 4 May 2023 23:59:04 +0200 Subject: [PATCH 6/7] install docker-compose under the separate condition --- client/server_scripts/install_docker.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/server_scripts/install_docker.sh b/client/server_scripts/install_docker.sh index 2ee2c3c1..d2a32dfe 100644 --- a/client/server_scripts/install_docker.sh +++ b/client/server_scripts/install_docker.sh @@ -3,9 +3,10 @@ if [[ -f "$pm_apt" ]]; then pm=$pm_apt; docker_pkg="docker.io"; else pm=$pm_yum; if [[ ! -f "/usr/bin/sudo" ]]; then $pm update -y -q; $pm install -y -q sudo; fi;\ docker_service=$(systemctl list-units --full -all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ if [[ -f "$pm_apt" ]]; then export DEBIAN_FRONTEND=noninteractive; fi;\ -if [[ -z "$docker_service" ]]; then sudo $pm update -y -q; sudo $pm install -y -q curl $docker_pkg docker-compose; fi;\ +if [[ -z "$docker_service" ]]; then sudo $pm update -y -q; sudo $pm install -y -q curl $docker_pkg; fi;\ docker_service=$(systemctl list-units --full -all | grep docker.service | grep -v inactive | grep -v dead | grep -v failed);\ if [[ -z "$docker_service" ]]; then sleep 5 && sudo systemctl start docker && sleep 5; fi;\ if [[ -f "$pm_yum" ]]; then sudo systemctl enable docker && sudo systemctl start docker; fi;\ +if [[ ! -f "/usr/bin/docker-compose" ]]; then sudo $pm update -y -q; sudo $pm install -y -q docker-compose; fi;\ docker --version \ docker-compose --version \ No newline at end of file From 1674a66a3c6dddb1ec6acbdfed50476959a15c47 Mon Sep 17 00:00:00 2001 From: Evgenii Muravev Date: Thu, 25 May 2023 00:54:31 +0200 Subject: [PATCH 7/7] Removed redundant comments --- client/3rd/OpenVPNAdapter | 2 +- .../pages_logic/protocols/NextcloudLogic.cpp | 71 ------------------- 2 files changed, 1 insertion(+), 72 deletions(-) diff --git a/client/3rd/OpenVPNAdapter b/client/3rd/OpenVPNAdapter index 7b4046fa..0e2db0ba 160000 --- a/client/3rd/OpenVPNAdapter +++ b/client/3rd/OpenVPNAdapter @@ -1 +1 @@ -Subproject commit 7b4046faf358206d9640a8cc01cb4ab5fe2e4a6c +Subproject commit 0e2db0baa0d66029cbb18d74b78bc7a5c9013fba diff --git a/client/ui/pages_logic/protocols/NextcloudLogic.cpp b/client/ui/pages_logic/protocols/NextcloudLogic.cpp index ab2477b4..652b4dbd 100644 --- a/client/ui/pages_logic/protocols/NextcloudLogic.cpp +++ b/client/ui/pages_logic/protocols/NextcloudLogic.cpp @@ -50,77 +50,6 @@ void NextcloudLogic::onPushButtonSaveClicked() QJsonObject containerConfig = m_settings->containerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); QJsonObject newContainerConfig = containerConfig; newContainerConfig.insert(ProtocolProps::protoToString(Proto::Nextcloud), protocolConfig); - /* - - ServerConfiguringProgressLogic::PageFunc pageFunc; - pageFunc.setEnabledFunc = [this] (bool enabled) -> void { - set_pageEnabled(enabled); - }; - ServerConfiguringProgressLogic::ButtonFunc saveButtonFunc; - saveButtonFunc.setVisibleFunc = [this] (bool visible) -> void { - set_pushButtonSaveVisible(visible); - }; - ServerConfiguringProgressLogic::LabelFunc waitInfoFunc; - waitInfoFunc.setVisibleFunc = [this] (bool visible) -> void { - set_labelInfoVisible(visible); - }; - waitInfoFunc.setTextFunc = [this] (const QString& text) -> void { - set_labelInfoText(text); - }; - ServerConfiguringProgressLogic::ProgressFunc progressBarFunc; - progressBarFunc.setVisibleFunc = [this] (bool visible) -> void { - set_progressBarResetVisible(visible); - }; - progressBarFunc.setValueFunc = [this] (int value) -> void { - set_progressBarResetValue(value); - }; - progressBarFunc.getValueFunc = [this] (void) -> int { - return progressBarResetValue(); - }; - progressBarFunc.getMaximiumFunc = [this] (void) -> int { - return progressBarResetMaximium(); - }; - progressBarFunc.setTextVisibleFunc = [this] (bool visible) -> void { - set_progressBarTextVisible(visible); - }; - progressBarFunc.setTextFunc = [this] (const QString& text) -> void { - set_progressBarText(text); - }; - - ServerConfiguringProgressLogic::LabelFunc busyInfoFuncy; - busyInfoFuncy.setTextFunc = [this] (const QString& text) -> void { - set_labelServerBusyText(text); - }; - busyInfoFuncy.setVisibleFunc = [this] (bool visible) -> void { - set_labelServerBusyVisible(visible); - }; - - ServerConfiguringProgressLogic::ButtonFunc cancelButtonFunc; - cancelButtonFunc.setVisibleFunc = [this] (bool visible) -> void { - set_pushButtonCancelVisible(visible); - }; - - - progressBarFunc.setTextVisibleFunc(true); - progressBarFunc.setTextFunc(QString("Configuring...")); - - auto installAction = [this, containerConfig, &newContainerConfig]() { - ServerController serverController(m_settings); - return serverController.updateContainer(m_settings->serverCredentials(uiLogic()->m_selectedServerIndex), - uiLogic()->m_selectedDockerContainer, containerConfig, newContainerConfig); - }; - - ErrorCode e = uiLogic()->pageLogic()->doInstallAction(installAction, pageFunc, progressBarFunc, - saveButtonFunc, waitInfoFunc, - busyInfoFuncy, cancelButtonFunc); - - if (!e) { - m_settings->setContainerConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer, newContainerConfig); - m_settings->clearLastConnectionConfig(uiLogic()->m_selectedServerIndex, uiLogic()->m_selectedDockerContainer); - } - qDebug() << "Protocol saved with code:" << e << "for" << uiLogic()->m_selectedServerIndex << uiLogic()->m_selectedDockerContainer; -*/ - } void NextcloudLogic::onPushButtonCancelClicked()