Qv2ray/src/core/connection/Serialization.cpp

83 lines
3.2 KiB
C++

#include "Serialization.hpp"
#include "Generation.hpp"
#include "common/QvHelpers.hpp"
#include "core/CoreUtils.hpp"
#include "core/handler/ConfigHandler.hpp"
namespace Qv2ray::core::connection
{
namespace Serialization
{
const QString ConvertConfigToString(const QString &alias, const CONFIGROOT &server, bool isSip002);
CONFIGROOT ConvertConfigFromString(const QString &link, QString *alias, QString *errMessage)
{
CONFIGROOT config;
if (link.startsWith("vmess://"))
{
config = ConvertConfigFromVMessString(link, alias, errMessage);
}
else if (link.startsWith("ss://"))
{
config = ConvertConfigFromSSString(link, alias, errMessage);
}
else
{
*errMessage = QObject::tr("Unsupported share link format.");
}
return config;
}
const QString ConvertConfigToString(const ConnectionId &id, bool isSip002)
{
auto alias = GetDisplayName(id);
if (IsComplexConfig(id))
{
DEBUG(MODULE_CONNECTION, "Ignored an complex config: " + alias)
return QV2RAY_SERIALIZATION_COMPLEX_CONFIG_PLACEHOLDER;
}
auto server = ConnectionManager->GetConnectionRoot(id);
return ConvertConfigToString(alias, server, isSip002);
}
const QString ConvertConfigToString(const QString &alias, const CONFIGROOT &server, bool isSip002)
{
OUTBOUND outbound = OUTBOUND(server["outbounds"].toArray().first().toObject());
auto type = outbound["protocol"].toString();
QString sharelink = "";
if (type == "vmess")
{
auto vmessServer =
StructFromJsonString<VMessServerObject>(JsonToString(outbound["settings"].toObject()["vnext"].toArray().first().toObject()));
auto transport = StructFromJsonString<StreamSettingsObject>(JsonToString(outbound["streamSettings"].toObject()));
sharelink = vmess::ConvertConfigToVMessString(transport, vmessServer, alias);
}
else if (type == "shadowsocks")
{
auto ssServer = StructFromJsonString<ShadowSocksServerObject>(
JsonToString(outbound["settings"].toObject()["servers"].toArray().first().toObject()));
sharelink = ss::ConvertConfigToSSString(ssServer, alias, isSip002);
}
else
{
LOG(MODULE_CONNECTION, "Unsupported outbound type: " + type)
}
return sharelink;
}
QString DecodeSubscriptionString(QByteArray arr)
{
// String may start with: vmess:// and ss://
// We only process vmess:// here
// Some subscription providers may use plain vmess:// saperated by
// lines But others may use base64 of above.
auto result = QString::fromUtf8(arr).trimmed();
return result.startsWith("vmess://") ? result : Base64Decode(result);
}
} // namespace Serialization
} // namespace Qv2ray::core::connection