mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-22 02:01:08 +07:00
feat: add vless string on sharing screen (#1999)
* feat: add vless config string and serialization * feat: add vless config string and serialization
This commit is contained in:
@@ -21,6 +21,7 @@ namespace amnezia::serialization
|
||||
namespace vless
|
||||
{
|
||||
QJsonObject Deserialize(const QString &vless, QString *alias, QString *errMessage);
|
||||
const QString Serialize(const VlessServerObject &server, const QString &alias);
|
||||
} // namespace vless
|
||||
|
||||
namespace ss
|
||||
|
||||
@@ -42,6 +42,25 @@ struct VMessServerObject
|
||||
};
|
||||
|
||||
|
||||
struct VlessServerObject
|
||||
{
|
||||
QString address;
|
||||
QString id; // UUID
|
||||
int port;
|
||||
QString flow = "xtls-rprx-vision";
|
||||
QString encryption = "none";
|
||||
QString network = "tcp";
|
||||
QString security = "reality";
|
||||
QString serverName; // SNI
|
||||
QString publicKey;
|
||||
QString shortId;
|
||||
QString fingerprint = "chrome";
|
||||
QString spiderX = "";
|
||||
JSONSTRUCT_COMPARE(VlessServerObject, address, id, port, flow, encryption)
|
||||
JSONSTRUCT_REGISTER(VlessServerObject, F(address, id, port, flow, encryption, network, security, serverName, publicKey, shortId, fingerprint, spiderX))
|
||||
};
|
||||
|
||||
|
||||
namespace transfer
|
||||
{
|
||||
|
||||
|
||||
@@ -252,5 +252,65 @@ QJsonObject Deserialize(const QString &str, QString *alias, QString *errMessage)
|
||||
root["inbounds"] = QJsonArray { inbound };
|
||||
return root;
|
||||
}
|
||||
} // namespace amnezia::serialization::vless
|
||||
|
||||
const QString Serialize(const VlessServerObject &server, const QString &alias)
|
||||
{
|
||||
|
||||
QUrl url;
|
||||
|
||||
// Set basic URL components
|
||||
url.setScheme("vless");
|
||||
url.setUserInfo(server.id);
|
||||
url.setHost(server.address);
|
||||
url.setPort(server.port);
|
||||
|
||||
QUrlQuery query;
|
||||
|
||||
if (!server.network.isEmpty() && server.network != "tcp") {
|
||||
query.addQueryItem("type", server.network);
|
||||
}
|
||||
|
||||
if (!server.encryption.isEmpty()) {
|
||||
query.addQueryItem("encryption", server.encryption);
|
||||
}
|
||||
|
||||
if (!server.security.isEmpty() && server.security != "none") {
|
||||
query.addQueryItem("security", server.security);
|
||||
}
|
||||
|
||||
if (!server.flow.isEmpty() && (server.security == "xtls" || server.security == "reality")) {
|
||||
query.addQueryItem("flow", server.flow);
|
||||
}
|
||||
|
||||
if (!server.serverName.isEmpty()) {
|
||||
query.addQueryItem("sni", server.serverName);
|
||||
}
|
||||
|
||||
if (server.security == "reality") {
|
||||
if (!server.fingerprint.isEmpty()) {
|
||||
query.addQueryItem("fp", server.fingerprint);
|
||||
}
|
||||
|
||||
if (!server.publicKey.isEmpty()) {
|
||||
query.addQueryItem("pbk", server.publicKey);
|
||||
}
|
||||
|
||||
if (!server.shortId.isEmpty()) {
|
||||
query.addQueryItem("sid", server.shortId);
|
||||
}
|
||||
|
||||
if (!server.spiderX.isEmpty()) {
|
||||
query.addQueryItem("spiderX", server.spiderX);
|
||||
}
|
||||
}
|
||||
|
||||
url.setQuery(query);
|
||||
|
||||
if (!alias.isEmpty()) {
|
||||
url.setFragment(alias);
|
||||
}
|
||||
|
||||
return url.toString(QUrl::ComponentFormattingOption::FullyEncoded);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user