amnezia-client/client/ui/models/protocols_model.cpp

183 lines
7.8 KiB
C++

#include "protocols_model.h"
#include "core/models/protocols/awgProtocolConfig.h"
#include "core/models/protocols/cloakProtocolConfig.h"
#include "core/models/protocols/openvpnProtocolConfig.h"
#include "core/models/protocols/shadowsocksProtocolConfig.h"
#include "core/models/protocols/wireguardProtocolConfig.h"
#include "core/models/protocols/xrayProtocolConfig.h"
ProtocolsModel::ProtocolsModel(QObject *parent) : QAbstractListModel(parent)
{
}
ProtocolsModel::ProtocolsModel(const QSharedPointer<OpenVpnConfigModel> &openVpnConfigModel,
const QSharedPointer<ShadowSocksConfigModel> &shadowSocksConfigModel,
const QSharedPointer<CloakConfigModel> &cloakConfigModel,
const QSharedPointer<WireGuardConfigModel> &wireGuardConfigModel,
const QSharedPointer<AwgConfigModel> &awgConfigModel, const QSharedPointer<XrayConfigModel> &xrayConfigModel,
const QSharedPointer<Ikev2ConfigModel> &ikev2ConfigModel,
const QSharedPointer<SftpConfigModel> &sftpConfigModel,
const QSharedPointer<Socks5ProxyConfigModel> &socks5ProxyConfigModel, QObject *parent)
: QAbstractListModel(parent),
m_openVpnConfigModel(openVpnConfigModel),
m_shadowSocksConfigModel(shadowSocksConfigModel),
m_cloakConfigModel(cloakConfigModel),
m_wireGuardConfigModel(wireGuardConfigModel),
m_awgConfigModel(awgConfigModel),
m_xrayConfigModel(xrayConfigModel),
m_ikev2ConfigModel(ikev2ConfigModel),
m_sftpConfigModel(sftpConfigModel),
m_socks5ProxyConfigModel(socks5ProxyConfigModel)
{
}
int ProtocolsModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_protocolConfigs.size();
}
QHash<int, QByteArray> ProtocolsModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[ProtocolNameRole] = "protocolName";
roles[ServerProtocolPageRole] = "serverProtocolPage";
roles[ClientProtocolPageRole] = "clientProtocolPage";
roles[ProtocolIndexRole] = "protocolIndex";
roles[RawConfigRole] = "rawConfig";
roles[IsClientProtocolExistsRole] = "isClientProtocolExists";
return roles;
}
QVariant ProtocolsModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() < 0 || index.row() >= m_protocolConfigs.size()) {
return QVariant();
}
auto protocolConfig = m_protocolConfigs.at(index.row());
amnezia::Proto protocol = ProtocolProps::protoFromString(protocolConfig->protocolName);
switch (role) {
case ProtocolNameRole: {
return ProtocolProps::protocolHumanNames().value(protocol);
}
case ServerProtocolPageRole: return static_cast<int>(serverProtocolPage(protocol));
case ClientProtocolPageRole: return static_cast<int>(clientProtocolPage(protocol));
case ProtocolIndexRole: return protocol;
// case RawConfigRole: {
// auto protocolConfig = m_content.value(ContainerProps::containerTypeToString(m_container)).toObject();
// auto lastConfigJsonDoc = QJsonDocument::fromJson(protocolConfig.value(config_key::last_config).toString().toUtf8());
// auto lastConfigJson = lastConfigJsonDoc.object();
// QString rawConfig;
// QStringList lines = lastConfigJson.value(config_key::config).toString().replace("\r", "").split("\n");
// for (const QString &l : lines) {
// rawConfig.append(l + "\n");
// }
// return rawConfig;
// }
case IsClientProtocolExistsRole: {
auto protocolVariant = ProtocolConfig::getProtocolConfigVariant(protocolConfig);
return std::visit([](const auto &ptr) -> bool { return ptr->clientProtocolConfig.isEmpty; }, protocolVariant);
}
}
return QVariant();
}
void ProtocolsModel::updateModel(const QMap<QString, QSharedPointer<ProtocolConfig>> &protocolConfigs)
{
beginResetModel();
m_protocolConfigs.clear();
for (const auto &protocolConfig : protocolConfigs) {
m_protocolConfigs.push_back(protocolConfig);
}
endResetModel();
}
void ProtocolsModel::updateProtocolModel(amnezia::Proto protocol)
{
QSharedPointer<ProtocolConfig> protocolConfig;
for (const auto &config : m_protocolConfigs) {
if (ProtocolProps::protoFromString(config->protocolName) == protocol) {
protocolConfig = config;
break;
}
}
switch (protocol) {
case Proto::OpenVpn: m_openVpnConfigModel->updateModel(config); break;
case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break;
case Proto::Cloak: m_cloakConfigModel->updateModel(config); break;
case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); break;
case Proto::Awg: m_awgConfigModel->updateModel(config); break;
case Proto::Xray: m_xrayConfigModel->updateModel(config); break;
#ifdef Q_OS_WINDOWS
case Proto::Ikev2:
case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break;
#endif
case Proto::Sftp: m_sftpConfigModel->updateModel(config); break;
case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break;
default: break;
}
}
QMap<QString, QSharedPointer<ProtocolConfig>> ProtocolsModel::getProtocolConfigs()
{
QMap<QString, QSharedPointer<ProtocolConfig>> protocolConfigs;
for (const auto &config : m_protocolConfigs) {
switch (ProtocolProps::protoFromString(config->protocolName)) {
case Proto::OpenVpn: protocolConfigs.insert(config->protocolName, m_openVpnConfigModel->getConfig()); break;
case Proto::ShadowSocks: m_shadowSocksConfigModel->updateModel(config); break;
case Proto::Cloak: m_cloakConfigModel->updateModel(config); break;
case Proto::WireGuard: m_wireGuardConfigModel->updateModel(config); break;
case Proto::Awg: protocolConfigs.insert(config->protocolName, m_awgConfigModel->getConfig()); break;
case Proto::Xray: m_xrayConfigModel->updateModel(config); break;
#ifdef Q_OS_WINDOWS
case Proto::Ikev2:
case Proto::L2tp: m_ikev2ConfigModel->updateModel(config); break;
#endif
case Proto::Sftp: m_sftpConfigModel->updateModel(config); break;
case Proto::Socks5Proxy: m_socks5ProxyConfigModel->updateModel(config); break;
default: break;
}
}
return protocolConfigs;
}
PageLoader::PageEnum ProtocolsModel::serverProtocolPage(Proto protocol) const
{
switch (protocol) {
case Proto::OpenVpn: return PageLoader::PageEnum::PageProtocolOpenVpnSettings;
case Proto::Cloak: return PageLoader::PageEnum::PageProtocolCloakSettings;
case Proto::ShadowSocks: return PageLoader::PageEnum::PageProtocolShadowSocksSettings;
case Proto::WireGuard: return PageLoader::PageEnum::PageProtocolWireGuardSettings;
case Proto::Awg: return PageLoader::PageEnum::PageProtocolAwgSettings;
case Proto::Ikev2: return PageLoader::PageEnum::PageProtocolIKev2Settings;
case Proto::L2tp: return PageLoader::PageEnum::PageProtocolIKev2Settings;
case Proto::Xray: return PageLoader::PageEnum::PageProtocolXraySettings;
// non-vpn
case Proto::TorWebSite: return PageLoader::PageEnum::PageServiceTorWebsiteSettings;
case Proto::Dns: return PageLoader::PageEnum::PageServiceDnsSettings;
case Proto::Sftp: return PageLoader::PageEnum::PageServiceSftpSettings;
case Proto::Socks5Proxy: return PageLoader::PageEnum::PageServiceSocksProxySettings;
default: return PageLoader::PageEnum::PageProtocolOpenVpnSettings;
}
}
PageLoader::PageEnum ProtocolsModel::clientProtocolPage(Proto protocol) const
{
switch (protocol) {
case Proto::WireGuard: return PageLoader::PageEnum::PageProtocolWireGuardClientSettings;
case Proto::Awg: return PageLoader::PageEnum::PageProtocolAwgClientSettings;
default: return PageLoader::PageEnum::PageProtocolOpenVpnSettings;
}
}