Connection string support for XRay protocol (#777)
* Connection string support for XRay protocol
This commit is contained in:
parent
d8020878d5
commit
e6ee9085a2
39 changed files with 20709 additions and 11 deletions
|
|
@ -4,8 +4,13 @@
|
|||
#include <QFileInfo>
|
||||
#include <QQuickItem>
|
||||
#include <QRandomGenerator>
|
||||
#include <QUrlQuery>
|
||||
#include <QStandardPaths>
|
||||
|
||||
#include "utilities.h"
|
||||
#include "core/serialization/serialization.h"
|
||||
#include "core/errorstrings.h"
|
||||
|
||||
#ifdef Q_OS_ANDROID
|
||||
#include "platforms/android/android_controller.h"
|
||||
#endif
|
||||
|
|
@ -86,6 +91,55 @@ bool ImportController::extractConfigFromFile(const QString &fileName)
|
|||
bool ImportController::extractConfigFromData(QString data)
|
||||
{
|
||||
QString config = data;
|
||||
QString prefix;
|
||||
QString errormsg;
|
||||
|
||||
if (config.startsWith("vless://")) {
|
||||
m_configType = ConfigTypes::Xray;
|
||||
m_config = extractXrayConfig(Utils::JsonToString(serialization::vless::Deserialize(config, &prefix, &errormsg),
|
||||
QJsonDocument::JsonFormat::Compact), prefix);
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
if (config.startsWith("vmess://") && config.contains("@")) {
|
||||
m_configType = ConfigTypes::Xray;
|
||||
m_config = extractXrayConfig(Utils::JsonToString(serialization::vmess_new::Deserialize(config, &prefix, &errormsg),
|
||||
QJsonDocument::JsonFormat::Compact), prefix);
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
if (config.startsWith("vmess://")) {
|
||||
m_configType = ConfigTypes::Xray;
|
||||
m_config = extractXrayConfig(Utils::JsonToString(serialization::vmess::Deserialize(config, &prefix, &errormsg),
|
||||
QJsonDocument::JsonFormat::Compact), prefix);
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
if (config.startsWith("trojan://")) {
|
||||
m_configType = ConfigTypes::Xray;
|
||||
m_config = extractXrayConfig(Utils::JsonToString(serialization::trojan::Deserialize(config, &prefix, &errormsg),
|
||||
QJsonDocument::JsonFormat::Compact), prefix);
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
if (config.startsWith("ss://") && !config.contains("plugin=")) {
|
||||
m_configType = ConfigTypes::ShadowSocks;
|
||||
m_config = extractXrayConfig(Utils::JsonToString(serialization::ss::Deserialize(config, &prefix, &errormsg),
|
||||
QJsonDocument::JsonFormat::Compact), prefix);
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
if (config.startsWith("ssd://")) {
|
||||
QStringList tmp;
|
||||
QList<std::pair<QString, QJsonObject>> servers = serialization::ssd::Deserialize(config, &prefix, &tmp);
|
||||
m_configType = ConfigTypes::ShadowSocks;
|
||||
// Took only first config from list
|
||||
if (!servers.isEmpty()) {
|
||||
m_config = extractXrayConfig(servers.first().first);
|
||||
}
|
||||
return m_config.empty() ? false : true;
|
||||
}
|
||||
|
||||
m_configType = checkConfigFormat(config);
|
||||
if (m_configType == ConfigTypes::Invalid) {
|
||||
data.replace("vpn://", "");
|
||||
|
|
@ -397,7 +451,7 @@ QJsonObject ImportController::extractWireGuardConfig(const QString &data)
|
|||
return config;
|
||||
}
|
||||
|
||||
QJsonObject ImportController::extractXrayConfig(const QString &data)
|
||||
QJsonObject ImportController::extractXrayConfig(const QString &data, const QString &description)
|
||||
{
|
||||
QJsonParseError parserErr;
|
||||
QJsonDocument jsonConf = QJsonDocument::fromJson(data.toLocal8Bit(), &parserErr);
|
||||
|
|
@ -409,8 +463,13 @@ QJsonObject ImportController::extractXrayConfig(const QString &data)
|
|||
lastConfig[config_key::isThirdPartyConfig] = true;
|
||||
|
||||
QJsonObject containers;
|
||||
containers.insert(config_key::container, QJsonValue("amnezia-xray"));
|
||||
containers.insert(config_key::xray, QJsonValue(lastConfig));
|
||||
if (m_configType == ConfigTypes::ShadowSocks) {
|
||||
containers.insert(config_key::ssxray, QJsonValue(lastConfig));
|
||||
containers.insert(config_key::container, QJsonValue("amnezia-ssxray"));
|
||||
} else {
|
||||
containers.insert(config_key::container, QJsonValue("amnezia-xray"));
|
||||
containers.insert(config_key::xray, QJsonValue(lastConfig));
|
||||
}
|
||||
|
||||
QJsonArray arr;
|
||||
arr.push_back(containers);
|
||||
|
|
@ -425,9 +484,17 @@ QJsonObject ImportController::extractXrayConfig(const QString &data)
|
|||
|
||||
QJsonObject config;
|
||||
config[config_key::containers] = arr;
|
||||
config[config_key::defaultContainer] = "amnezia-xray";
|
||||
config[config_key::description] = m_settings->nextAvailableServerName();
|
||||
|
||||
if (m_configType == ConfigTypes::ShadowSocks) {
|
||||
config[config_key::defaultContainer] = "amnezia-ssxray";
|
||||
} else {
|
||||
config[config_key::defaultContainer] = "amnezia-xray";
|
||||
}
|
||||
if (description.isEmpty()) {
|
||||
config[config_key::description] = m_settings->nextAvailableServerName();
|
||||
} else {
|
||||
config[config_key::description] = description;
|
||||
}
|
||||
config[config_key::hostName] = hostName;
|
||||
|
||||
return config;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace
|
|||
WireGuard,
|
||||
Awg,
|
||||
Xray,
|
||||
ShadowSocks,
|
||||
Backup,
|
||||
Invalid
|
||||
};
|
||||
|
|
@ -63,7 +64,7 @@ signals:
|
|||
private:
|
||||
QJsonObject extractOpenVpnConfig(const QString &data);
|
||||
QJsonObject extractWireGuardConfig(const QString &data);
|
||||
QJsonObject extractXrayConfig(const QString &data);
|
||||
QJsonObject extractXrayConfig(const QString &data, const QString &description = "");
|
||||
|
||||
void checkForMaliciousStrings(const QJsonObject &protocolConfig);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue