add xray client id to the clients table

This commit is contained in:
Cyril Anisimov 2024-08-13 14:56:22 +02:00
parent 393e289784
commit 3d7a46d058
3 changed files with 127 additions and 13 deletions

View file

@ -3,6 +3,8 @@
#include <QFile> #include <QFile>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QUuid>
#include <qlogging.h>
#include "containers/containers_defs.h" #include "containers/containers_defs.h"
#include "core/controllers/serverController.h" #include "core/controllers/serverController.h"
@ -13,8 +15,8 @@ XrayConfigurator::XrayConfigurator(std::shared_ptr<Settings> settings, const QSh
{ {
} }
QString XrayConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &containerConfig, QString XrayConfigurator::createConfig(const ServerCredentials &credentials, DockerContainer container,
ErrorCode &errorCode) const QJsonObject &containerConfig, ErrorCode &errorCode)
{ {
QString config = m_serverController->replaceVars(amnezia::scriptData(ProtocolScriptType::xray_template, container), QString config = m_serverController->replaceVars(amnezia::scriptData(ProtocolScriptType::xray_template, container),
m_serverController->genVarsForScript(credentials, container, containerConfig)); 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); QString xrayUuid = m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::uuidPath, errorCode);
xrayUuid.replace("\n", ""); xrayUuid.replace("\n", "");
qDebug() << "===>> xrayUuid: " << xrayUuid;
QString xrayShortId = QString xrayShortId =
m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode); m_serverController->getTextFileFromContainer(container, credentials, amnezia::protocols::xray::shortidPath, errorCode);
xrayShortId.replace("\n", ""); xrayShortId.replace("\n", "");
QString xrayUserId = QUuid::createUuid().toString(QUuid::WithoutBraces);
if (errorCode != ErrorCode::NoError) { if (errorCode != ErrorCode::NoError) {
return ""; return "";
} }
@ -37,6 +41,8 @@ QString XrayConfigurator::createConfig(const ServerCredentials &credentials, Doc
config.replace("$XRAY_CLIENT_ID", xrayUuid); config.replace("$XRAY_CLIENT_ID", xrayUuid);
config.replace("$XRAY_PUBLIC_KEY", xrayPublicKey); config.replace("$XRAY_PUBLIC_KEY", xrayPublicKey);
config.replace("$XRAY_SHORT_ID", xrayShortId); config.replace("$XRAY_SHORT_ID", xrayShortId);
config.replace("$XRAY_USER_ID", xrayUserId);
qDebug() << "===>> xrayUserId: " << xrayUserId;
return config; return config;
} }

View file

@ -103,6 +103,8 @@ ErrorCode ClientManagementModel::updateModel(const DockerContainer container, co
error = getOpenVpnClients(container, credentials, serverController, count); error = getOpenVpnClients(container, credentials, serverController, count);
} else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { } else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) {
error = getWireGuardClients(container, credentials, serverController, count); error = getWireGuardClients(container, credentials, serverController, count);
} else if (container == DockerContainer::Xray) {
error = getXrayClients(container, credentials, serverController, count);
} }
if (error != ErrorCode::NoError) { if (error != ErrorCode::NoError) {
endResetModel(); endResetModel();
@ -232,6 +234,35 @@ ErrorCode ClientManagementModel::getWireGuardClients(const DockerContainer conta
} }
return error; return error;
} }
ErrorCode ClientManagementModel::getXrayClients(const DockerContainer container, const ServerCredentials& credentials,
const QSharedPointer<ServerController> &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, ErrorCode ClientManagementModel::wgShow(const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController, std::vector<WgShowData> &data) const QSharedPointer<ServerController> &serverController, std::vector<WgShowData> &data)
@ -413,10 +444,27 @@ ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContain
auto client = m_clientsTable.at(row).toObject(); auto client = m_clientsTable.at(row).toObject();
QString clientId = client.value(configKey::clientId).toString(); QString clientId = client.value(configKey::clientId).toString();
if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { switch(container)
errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController); {
} else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { case DockerContainer::OpenVpn:
errorCode = revokeWireGuard(row, container, credentials, serverController); 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) { if (errorCode == ErrorCode::NoError) {
@ -454,13 +502,26 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig
} }
Proto protocol; Proto protocol;
if (container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) {
switch(container)
{
case DockerContainer::ShadowSocks:
case DockerContainer::Cloak: {
protocol = Proto::OpenVpn; 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); protocol = ContainerProps::defaultProtocol(container);
} else { break;
}
default: {
logger.warning() << "Unknown container type was received";
return ErrorCode::NoError; return ErrorCode::NoError;
} }
}
auto protocolConfig = ContainerProps::getProtocolConfigFromContainer(protocol, containerConfig); auto protocolConfig = ContainerProps::getProtocolConfigFromContainer(protocol, containerConfig);
@ -478,11 +539,28 @@ ErrorCode ClientManagementModel::revokeClient(const QJsonObject &containerConfig
return errorCode; 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); errorCode = revokeOpenVpn(row, container, credentials, serverIndex, serverController);
} else if (container == DockerContainer::WireGuard || container == DockerContainer::Awg) { break;
errorCode = revokeWireGuard(row, container, credentials, serverController);
} }
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; return errorCode;
} }
@ -585,6 +663,32 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont
return ErrorCode::NoError; return ErrorCode::NoError;
} }
ErrorCode ClientManagementModel::revokeXray(const int row,
const DockerContainer container,
const ServerCredentials &credentials,
const QSharedPointer<ServerController> &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<int, QByteArray> ClientManagementModel::roleNames() const QHash<int, QByteArray> ClientManagementModel::roleNames() const
{ {
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;

View file

@ -62,11 +62,15 @@ private:
const QSharedPointer<ServerController> &serverController); const QSharedPointer<ServerController> &serverController);
ErrorCode revokeWireGuard(const int row, const DockerContainer container, const ServerCredentials &credentials, ErrorCode revokeWireGuard(const int row, const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController); const QSharedPointer<ServerController> &serverController);
ErrorCode revokeXray(const int row, const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController);
ErrorCode getOpenVpnClients(const DockerContainer container, const ServerCredentials &credentials, ErrorCode getOpenVpnClients(const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController, int &count); const QSharedPointer<ServerController> &serverController, int &count);
ErrorCode getWireGuardClients(const DockerContainer container, const ServerCredentials &credentials, ErrorCode getWireGuardClients(const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController, int &count); const QSharedPointer<ServerController> &serverController, int &count);
ErrorCode getXrayClients(const DockerContainer container, const ServerCredentials& credentials,
const QSharedPointer<ServerController> &serverController, int &count);
ErrorCode wgShow(const DockerContainer container, const ServerCredentials &credentials, ErrorCode wgShow(const DockerContainer container, const ServerCredentials &credentials,
const QSharedPointer<ServerController> &serverController, std::vector<WgShowData> &data); const QSharedPointer<ServerController> &serverController, std::vector<WgShowData> &data);