diff --git a/client/configurators/xray_configurator.cpp b/client/configurators/xray_configurator.cpp index 786da47c..19692db8 100644 --- a/client/configurators/xray_configurator.cpp +++ b/client/configurators/xray_configurator.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "containers/containers_defs.h" #include "core/controllers/serverController.h" @@ -13,8 +15,8 @@ XrayConfigurator::XrayConfigurator(std::shared_ptr settings, const QSh { } -QString XrayConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, - ErrorCode &errorCode) +QString XrayConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, + const QJsonObject &containerConfig, ErrorCode &errorCode) { QString config = m_serverController->replaceVars(amnezia::scriptData(ProtocolScriptType::xray_template, container), m_serverController->genVarsForScript(credentials, container, containerConfig)); @@ -25,11 +27,13 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc QString xrayUuid = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::uuidPath, errorCode); xrayUuid.replace("\n", ""); - + qDebug() << "===>> xrayUuid: " << xrayUuid; QString xrayShortId = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode); xrayShortId.replace("\n", ""); + QString xrayUserId = QUuid::createUuid().toString(QUuid::WithoutBraces); + if (errorCode != ErrorCode::NoError) { return ""; } @@ -37,6 +41,8 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc config.replace("$XRAY_CLIENT_ID", xrayUuid); config.replace("$XRAY_PUBLIC_KEY", xrayPublicKey); config.replace("$XRAY_SHORT_ID", xrayShortId); + config.replace("$XRAY_USER_ID", xrayUserId); + qDebug() << "===>> xrayUserId: " << xrayUserId; return config; } diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index f2117f75..1698d612 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -103,6 +103,8 @@ ErrorCode ClientManagementModel::updateModel(const DockerContainer container, co error = getOpenVpnClients(container, credentials, serverController, count); } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { error = getWireGuardClients(container, credentials, serverController, count); + } else if (container == DockerContainer::Xray) { + error = getXrayClients(container, credentials, serverController, count); } if (error != ErrorCode::NoError) { endResetModel(); @@ -232,6 +234,35 @@ ErrorCode ClientManagementModel::getWireGuardClients(const DockerContainer conta } return error; } +ErrorCode ClientManagementModel::getXrayClients(const DockerContainer container, const ServerCredentials& credentials, + const QSharedPointer &serverController, int &count) +{ + ErrorCode error = ErrorCode::NoError; + + const QString xrayClientIdFile = QStringLiteral("/opt/amnezia/xray/xray_uuid.key"); + const QString xrayClientId = serverController->getTextFileFromContainer(container, credentials, xrayClientIdFile, error); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to get the xray client id file from the server"; + return error; + } + QStringList xrayClientIds { xrayClientId }; + + for (auto &xrayClientId : xrayClientIds) { + if (!isClientExists(xrayClientId)) { + QJsonObject client; + client[configKey::clientId] = xrayClientId; + + QJsonObject userData; + userData[configKey::clientName] = QStringLiteral("Client %1").arg(count); + userData[configKey::userData] = userData; + + m_clientsTable.push_back(client); + + count++; + } + } + return error; +} ErrorCode ClientManagementModel::wgShow(const DockerContainer container, const ServerCredentials &credentials, const QSharedPointer &serverController, std::vector &data) @@ -413,10 +444,27 @@ ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContain auto client = m_clientsTable.at(row).toObject(); QString clientId = client.value(configKey::clientId).toString(); - if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); - } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - errorCode = revokeWireGuard(row, container, credentials, serverController); + switch(container) + { + case DockerContainer::OpenVpn: + case DockerContainer::ShadowSocks: + case DockerContainer::Cloak: { + errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); + break; + } + case DockerContainer::WireGuard: + case DockerContainer::Awg: { + errorCode = revokeWireGuard(row, container, credentials, serverController); + break; + } + case DockerContainer::Xray: { + errorCode = revokeXray(row, container, credentials, serverController); + break; + } + default: { + logger.warning() << "Unknown container type was received"; + break; + } } if (errorCode == ErrorCode::NoError) { @@ -454,13 +502,26 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig } Proto protocol; - if (container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { + + switch(container) + { + case DockerContainer::ShadowSocks: + case DockerContainer::Cloak: { protocol = Proto::OpenVpn; - } else if (container == DockerContainer::OpenVpn || container == DockerContainer::WireGuard || container == DockerContainer::Awg) { + break; + } + case DockerContainer::OpenVpn: + case DockerContainer::WireGuard: + case DockerContainer::Awg: + case DockerContainer::Xray: { protocol = ContainerProps::defaultProtocol(container); - } else { + break; + } + default: { + logger.warning() << "Unknown container type was received"; return ErrorCode::NoError; } + } auto protocolConfig = ContainerProps::getProtocolConfigFromContainer(protocol, containerConfig); @@ -478,11 +539,28 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig return errorCode; } - if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { + switch (container) + { + case DockerContainer::OpenVpn: + case DockerContainer::ShadowSocks: + case DockerContainer::Cloak: { errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); - } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { - errorCode = revokeWireGuard(row, container, credentials, serverController); + break; } + case DockerContainer::WireGuard: + case DockerContainer::Awg: { + errorCode = revokeWireGuard(row, container, credentials, serverController); + break; + } + case DockerContainer::Xray: { + errorCode = revokeXray(row, container, credentials, serverController); + break; + } + default: + logger.warning() << "Unknown container type was received"; + break; + } + return errorCode; } @@ -585,6 +663,32 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont return ErrorCode::NoError; } +ErrorCode ClientManagementModel::revokeXray(const int row, + const DockerContainer container, + const ServerCredentials &credentials, + const QSharedPointer &serverController) +{ + ErrorCode error = ErrorCode::NoError; + + const QString xrayClientIdFile = QStringLiteral("/opt/amnezia/xray/xray_uuid.key"); + const QString xrayClientId = serverController->getTextFileFromContainer(container, credentials, xrayClientIdFile, error); + if (error != ErrorCode::NoError) { + logger.error() << "Failed to get the xray client id file from the server"; + return error; + } + + auto client = m_clientsTable.at(row).toObject(); + QString clientId = client.value(configKey::clientId).toString(); + + // remove from /opt/amnezia/xray/server.json + + beginRemoveRows(QModelIndex(), row, row); + m_clientsTable.removeAt(row); + endRemoveRows(); + + return error; +} + QHash ClientManagementModel::roleNames() const { QHash roles; diff --git a/client/ui/models/clientManagementModel.h b/client/ui/models/clientManagementModel.h index d64280a3..2df641b4 100644 --- a/client/ui/models/clientManagementModel.h +++ b/client/ui/models/clientManagementModel.h @@ -62,11 +62,15 @@ private: const QSharedPointer &serverController); ErrorCode revokeWireGuard(const int row, const DockerContainer container, const ServerCredentials &credentials, const QSharedPointer &serverController); + ErrorCode revokeXray(const int row, const DockerContainer container, const ServerCredentials &credentials, + const QSharedPointer &serverController); ErrorCode getOpenVpnClients(const DockerContainer container, const ServerCredentials &credentials, const QSharedPointer &serverController, int &count); ErrorCode getWireGuardClients(const DockerContainer container, const ServerCredentials &credentials, const QSharedPointer &serverController, int &count); + ErrorCode getXrayClients(const DockerContainer container, const ServerCredentials& credentials, + const QSharedPointer &serverController, int &count); ErrorCode wgShow(const DockerContainer container, const ServerCredentials &credentials, const QSharedPointer &serverController, std::vector &data);