changes from previous fork (vityazaychek/amnezia-client)

This commit is contained in:
Viacheslav Sergeev
2023-04-30 14:24:12 +02:00
parent 780efc2477
commit 0099e642f3
17 changed files with 304 additions and 7 deletions

View File

@@ -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)

View File

@@ -61,6 +61,9 @@ QVector<amnezia::Proto> 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<DockerContainer, QString> 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<DockerContainer, QString> 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;
}
}

View File

@@ -24,7 +24,9 @@ enum DockerContainer {
TorWebSite,
Dns,
//FileShare,
Sftp
Sftp,
Nextcloud
};
Q_ENUM_NS(DockerContainer)
} // namespace ContainerEnumNS

View File

@@ -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()) {

View File

@@ -79,7 +79,8 @@ QMap<amnezia::Proto, QString> 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;
}
}

View File

@@ -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)

View File

@@ -171,5 +171,6 @@
<file>ui/qml/Controls/PopupWarning.qml</file>
<file>ui/qml/Controls/PopupWithTextField.qml</file>
<file>server_scripts/check_user_in_sudo.sh</file>
<file>ui/qml/Pages/Protocols/PageNextcloudProtocol.qml</file>
</qresource>
</RCC>

View File

@@ -0,0 +1,3 @@
FROM nextcloud:latest
LABEL maintainer="AmneziaVPN"

View File

@@ -0,0 +1,4 @@
# Run container
sudo docker run -d \
-p 9090:80 \
--name $CONTAINER_NAME $CONTAINER_NAME

View File

@@ -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<ErrorCode()> &action);

View File

@@ -0,0 +1,128 @@
#include "NextcloudLogic.h"
#include <functional>
#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<ServerConfiguringProgressLogic>()->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<ServerConfiguringProgressLogic>()->cancelDoInstallAction(true);
}

View File

@@ -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

View File

@@ -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
}
}
}
}

View File

@@ -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> settings, std::shared_ptr<VpnConfigur
m_protocolLogicMap.insert(Proto::Dns, new OtherProtocolsLogic(this));
m_protocolLogicMap.insert(Proto::Sftp, new OtherProtocolsLogic(this));
m_protocolLogicMap.insert(Proto::TorWebSite, new OtherProtocolsLogic(this));
m_protocolLogicMap.insert(Proto::Nextcloud, new NextcloudLogic(this));
}

View File

@@ -52,6 +52,7 @@ class PageProtocolLogicBase;
class OpenVpnLogic;
class ShadowSocksLogic;
class CloakLogic;
class NextcloudLogic;
class OtherProtocolsLogic;
@@ -100,6 +101,7 @@ public:
friend class OpenVpnLogic;
friend class ShadowSocksLogic;
friend class CloakLogic;
friend class NextcloudLogic;
friend class OtherProtocolsLogic;

View File

@@ -40,8 +40,8 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg
if [ -z "${QT_VERSION+x}" ]; then
QT_VERSION=6.4.1;
QIF_VERSION=4.1
QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin
QIF_BIN_DIR=$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin
# QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin
QIF_BIN_DIR=${QT_BIN_DIR:-$HOME/Qt/$QT_VERSION/macos/bin}/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin
fi
echo "Using Qt in $QT_BIN_DIR"