mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-20 02:40:20 +08:00
Merge branch 'dev-qjsonstruct-omitting-default-value' into dev
* dev-qjsonstruct-omitting-default-value: fix: fixed compilation for Qt6 fix: make QV2RAY_RULE_ENABLED, QV2RAY_RULE_TAG mandatory fix, plugin: fixed BuiltinProtocolSupport causing null in JSON update, qjsonstruct: tweaks fix, test: fixed vmess testing 2 fix, QJsonStruct: make some fields mandatory fix, test: fixed vmess testing add: support omitting default values
This commit is contained in:
commit
8d35e54739
@ -267,6 +267,7 @@ include(cmake/libcurl.cmake)
|
|||||||
include(cmake/libsemver.cmake)
|
include(cmake/libsemver.cmake)
|
||||||
include(cmake/protobuf.cmake)
|
include(cmake/protobuf.cmake)
|
||||||
include(cmake/backend.cmake)
|
include(cmake/backend.cmake)
|
||||||
|
include(3rdparty/QJsonStruct/QJsonStruct.cmake)
|
||||||
|
|
||||||
# ==================================================================================
|
# ==================================================================================
|
||||||
# Qv2ray Base, Qt Libraries, Qv2ray GUI Libraries, libThreads
|
# Qv2ray Base, Qt Libraries, Qv2ray GUI Libraries, libThreads
|
||||||
|
@ -16,9 +16,7 @@ if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" OR NOT DEFINED CMAKE_BUILD_
|
|||||||
add_custom_target(lupdate
|
add_custom_target(lupdate
|
||||||
COMMENT "Generating Translation Sources"
|
COMMENT "Generating Translation Sources"
|
||||||
COMMAND lupdate
|
COMMAND lupdate
|
||||||
${QV2RAY_BASE_SOURCES}
|
${CMAKE_SOURCE_DIR}/src
|
||||||
${QV2RAY_UI_SOURCES}
|
|
||||||
${QVPLUGIN_INTERFACE_HEADERS}
|
|
||||||
-ts translations/en_US.ts
|
-ts translations/en_US.ts
|
||||||
-locations none
|
-locations none
|
||||||
-no-obsolete
|
-no-obsolete
|
||||||
|
@ -1 +1 @@
|
|||||||
6096
|
6097
|
||||||
|
@ -10,10 +10,3 @@
|
|||||||
// Add key value pair into JSON named 'root'
|
// Add key value pair into JSON named 'root'
|
||||||
#define JADDEx(field) root.insert(#field, field);
|
#define JADDEx(field) root.insert(#field, field);
|
||||||
#define JADD(...) FOR_EACH(JADDEx, __VA_ARGS__)
|
#define JADD(...) FOR_EACH(JADDEx, __VA_ARGS__)
|
||||||
|
|
||||||
#define JAUTOREMOVE(jObj, key) \
|
|
||||||
{ \
|
|
||||||
if ((jObj[key].isArray() && jObj[key].toArray().isEmpty()) || (jObj[key].isObject() && jObj[key].toObject().isEmpty()) || \
|
|
||||||
(jObj[key].isString() && jObj[key].toString().isEmpty())) \
|
|
||||||
jObj.remove(key); \
|
|
||||||
}
|
|
||||||
|
@ -37,6 +37,7 @@ namespace Qv2ray::base::objects
|
|||||||
}
|
}
|
||||||
void loadJson(const QJsonValue &___json_object_)
|
void loadJson(const QJsonValue &___json_object_)
|
||||||
{
|
{
|
||||||
|
DNSServerObject ___qjsonstruct_default_check;
|
||||||
// Hack to convert simple DNS settings to complex format.
|
// Hack to convert simple DNS settings to complex format.
|
||||||
if (___json_object_.isString())
|
if (___json_object_.isString())
|
||||||
{
|
{
|
||||||
@ -55,6 +56,7 @@ namespace Qv2ray::base::objects
|
|||||||
[[nodiscard]] const QJsonObject toJson() const
|
[[nodiscard]] const QJsonObject toJson() const
|
||||||
{
|
{
|
||||||
QJsonObject ___json_object_;
|
QJsonObject ___json_object_;
|
||||||
|
DNSServerObject ___qjsonstruct_default_check;
|
||||||
FOREACH_CALL_FUNC(___SERIALIZE_TO_JSON_EXTRACT_B_F, F(QV2RAY_DNS_IS_COMPLEX_DNS, address, port, domains, expectIPs));
|
FOREACH_CALL_FUNC(___SERIALIZE_TO_JSON_EXTRACT_B_F, F(QV2RAY_DNS_IS_COMPLEX_DNS, address, port, domains, expectIPs));
|
||||||
return ___json_object_;
|
return ___json_object_;
|
||||||
}
|
}
|
||||||
@ -79,7 +81,7 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString user;
|
QString user;
|
||||||
QString pass;
|
QString pass;
|
||||||
AccountObject(){};
|
JSONSTRUCT_COMPARE(AccountObject, user, pass)
|
||||||
JSONSTRUCT_REGISTER(AccountObject, F(user, pass))
|
JSONSTRUCT_REGISTER(AccountObject, F(user, pass))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -90,19 +92,27 @@ namespace Qv2ray::base::objects
|
|||||||
QString QV2RAY_RULE_TAG = "New Rule";
|
QString QV2RAY_RULE_TAG = "New Rule";
|
||||||
//
|
//
|
||||||
QString type = "field";
|
QString type = "field";
|
||||||
QList<QString> domain;
|
|
||||||
QList<QString> ip;
|
|
||||||
QString port = "1-65535";
|
|
||||||
QString network;
|
|
||||||
QList<QString> source;
|
|
||||||
QList<QString> user;
|
|
||||||
QList<QString> inboundTag;
|
QList<QString> inboundTag;
|
||||||
QList<QString> protocol;
|
|
||||||
QString attrs;
|
|
||||||
QString outboundTag;
|
QString outboundTag;
|
||||||
QString balancerTag;
|
QString balancerTag;
|
||||||
JSONSTRUCT_REGISTER(RuleObject, F(QV2RAY_RULE_ENABLED, QV2RAY_RULE_TAG, type, domain, ip, port, network, source, user, inboundTag, protocol,
|
// Addresses
|
||||||
attrs, outboundTag, balancerTag))
|
QList<QString> source;
|
||||||
|
QList<QString> domain;
|
||||||
|
QList<QString> ip;
|
||||||
|
// Ports
|
||||||
|
QString sourcePort;
|
||||||
|
QString port;
|
||||||
|
//
|
||||||
|
QString network;
|
||||||
|
QList<QString> protocol;
|
||||||
|
QString attrs;
|
||||||
|
JSONSTRUCT_COMPARE(RuleObject, type, outboundTag, balancerTag, //
|
||||||
|
QV2RAY_RULE_ENABLED, QV2RAY_RULE_TAG, //
|
||||||
|
domain, ip, port, sourcePort, network, source, inboundTag, protocol, attrs)
|
||||||
|
JSONSTRUCT_REGISTER(RuleObject, //
|
||||||
|
A(type, outboundTag, balancerTag), //
|
||||||
|
A(QV2RAY_RULE_ENABLED, QV2RAY_RULE_TAG), //
|
||||||
|
F(domain, ip, port, sourcePort, network, source, inboundTag, protocol, attrs))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@ -110,6 +120,7 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString tag;
|
QString tag;
|
||||||
QList<QString> selector;
|
QList<QString> selector;
|
||||||
|
JSONSTRUCT_COMPARE(BalancerObject, tag, selector)
|
||||||
JSONSTRUCT_REGISTER(BalancerObject, F(tag, selector))
|
JSONSTRUCT_REGISTER(BalancerObject, F(tag, selector))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -120,8 +131,21 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString version = "1.1";
|
QString version = "1.1";
|
||||||
QString method = "GET";
|
QString method = "GET";
|
||||||
QList<QString> path;
|
QList<QString> path = { "/" };
|
||||||
QMap<QString, QList<QString>> headers;
|
QMap<QString, QList<QString>> headers;
|
||||||
|
HTTPRequestObject()
|
||||||
|
{
|
||||||
|
headers = {
|
||||||
|
{ "Host", { "www.baidu.com", "www.bing.com" } },
|
||||||
|
{ "User-Agent",
|
||||||
|
{ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
|
||||||
|
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46" } },
|
||||||
|
{ "Accept-Encoding", { "gzip, deflate" } },
|
||||||
|
{ "Connection", { "keep-alive" } },
|
||||||
|
{ "Pragma", { "no-cache" } }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
JSONSTRUCT_COMPARE(HTTPRequestObject, version, method, path, headers)
|
||||||
JSONSTRUCT_REGISTER(HTTPRequestObject, F(version, method, path, headers))
|
JSONSTRUCT_REGISTER(HTTPRequestObject, F(version, method, path, headers))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -132,6 +156,14 @@ namespace Qv2ray::base::objects
|
|||||||
QString status = "200";
|
QString status = "200";
|
||||||
QString reason = "OK";
|
QString reason = "OK";
|
||||||
QMap<QString, QList<QString>> headers;
|
QMap<QString, QList<QString>> headers;
|
||||||
|
HTTPResponseObject()
|
||||||
|
{
|
||||||
|
headers = { { "Content-Type", { "application/octet-stream", "video/mpeg" } }, //
|
||||||
|
{ "Transfer-Encoding", { "chunked" } }, //
|
||||||
|
{ "Connection", { "keep-alive" } }, //
|
||||||
|
{ "Pragma", { "no-cache" } } };
|
||||||
|
}
|
||||||
|
JSONSTRUCT_COMPARE(HTTPResponseObject, version, status, reason, headers)
|
||||||
JSONSTRUCT_REGISTER(HTTPResponseObject, F(version, status, reason, headers))
|
JSONSTRUCT_REGISTER(HTTPResponseObject, F(version, status, reason, headers))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -141,6 +173,7 @@ namespace Qv2ray::base::objects
|
|||||||
QString type = "none";
|
QString type = "none";
|
||||||
HTTPRequestObject request;
|
HTTPRequestObject request;
|
||||||
HTTPResponseObject response;
|
HTTPResponseObject response;
|
||||||
|
JSONSTRUCT_COMPARE(TCPHeader_Internal, type, request, response)
|
||||||
JSONSTRUCT_REGISTER(TCPHeader_Internal, F(type, request, response))
|
JSONSTRUCT_REGISTER(TCPHeader_Internal, F(type, request, response))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -148,6 +181,7 @@ namespace Qv2ray::base::objects
|
|||||||
struct ObfsHeaderObject
|
struct ObfsHeaderObject
|
||||||
{
|
{
|
||||||
QString type = "none";
|
QString type = "none";
|
||||||
|
JSONSTRUCT_COMPARE(ObfsHeaderObject, type)
|
||||||
JSONSTRUCT_REGISTER(ObfsHeaderObject, F(type))
|
JSONSTRUCT_REGISTER(ObfsHeaderObject, F(type))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -155,7 +189,7 @@ namespace Qv2ray::base::objects
|
|||||||
struct TCPObject
|
struct TCPObject
|
||||||
{
|
{
|
||||||
TCPHeader_Internal header;
|
TCPHeader_Internal header;
|
||||||
TCPObject(){};
|
JSONSTRUCT_COMPARE(TCPObject, header)
|
||||||
JSONSTRUCT_REGISTER(TCPObject, F(header))
|
JSONSTRUCT_REGISTER(TCPObject, F(header))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -172,6 +206,7 @@ namespace Qv2ray::base::objects
|
|||||||
QString seed;
|
QString seed;
|
||||||
ObfsHeaderObject header;
|
ObfsHeaderObject header;
|
||||||
KCPObject(){};
|
KCPObject(){};
|
||||||
|
JSONSTRUCT_COMPARE(KCPObject, mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, seed, header)
|
||||||
JSONSTRUCT_REGISTER(KCPObject, F(mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header, seed))
|
JSONSTRUCT_REGISTER(KCPObject, F(mtu, tti, uplinkCapacity, downlinkCapacity, congestion, readBufferSize, writeBufferSize, header, seed))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -180,6 +215,7 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString path = "/";
|
QString path = "/";
|
||||||
QMap<QString, QString> headers;
|
QMap<QString, QString> headers;
|
||||||
|
JSONSTRUCT_COMPARE(WebSocketObject, path, headers)
|
||||||
JSONSTRUCT_REGISTER(WebSocketObject, F(path, headers))
|
JSONSTRUCT_REGISTER(WebSocketObject, F(path, headers))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -188,6 +224,7 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QList<QString> host;
|
QList<QString> host;
|
||||||
QString path = "/";
|
QString path = "/";
|
||||||
|
JSONSTRUCT_COMPARE(HttpObject, host, path)
|
||||||
JSONSTRUCT_REGISTER(HttpObject, F(host, path))
|
JSONSTRUCT_REGISTER(HttpObject, F(host, path))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -195,6 +232,7 @@ namespace Qv2ray::base::objects
|
|||||||
struct DomainSocketObject
|
struct DomainSocketObject
|
||||||
{
|
{
|
||||||
QString path = "/";
|
QString path = "/";
|
||||||
|
JSONSTRUCT_COMPARE(DomainSocketObject, path)
|
||||||
JSONSTRUCT_REGISTER(DomainSocketObject, F(path))
|
JSONSTRUCT_REGISTER(DomainSocketObject, F(path))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -204,7 +242,7 @@ namespace Qv2ray::base::objects
|
|||||||
QString security;
|
QString security;
|
||||||
QString key;
|
QString key;
|
||||||
ObfsHeaderObject header;
|
ObfsHeaderObject header;
|
||||||
QuicObject(){};
|
JSONSTRUCT_COMPARE(QuicObject, security, key, header)
|
||||||
JSONSTRUCT_REGISTER(QuicObject, F(security, key, header))
|
JSONSTRUCT_REGISTER(QuicObject, F(security, key, header))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -214,6 +252,7 @@ namespace Qv2ray::base::objects
|
|||||||
int mark = 255;
|
int mark = 255;
|
||||||
bool tcpFastOpen = false;
|
bool tcpFastOpen = false;
|
||||||
QString tproxy = "off";
|
QString tproxy = "off";
|
||||||
|
JSONSTRUCT_COMPARE(SockoptObject, mark, tcpFastOpen, tproxy)
|
||||||
JSONSTRUCT_REGISTER(SockoptObject, F(mark, tcpFastOpen, tproxy))
|
JSONSTRUCT_REGISTER(SockoptObject, F(mark, tcpFastOpen, tproxy))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -225,6 +264,7 @@ namespace Qv2ray::base::objects
|
|||||||
QString keyFile;
|
QString keyFile;
|
||||||
QList<QString> certificate;
|
QList<QString> certificate;
|
||||||
QList<QString> key;
|
QList<QString> key;
|
||||||
|
JSONSTRUCT_COMPARE(CertificateObject, usage, certificateFile, keyFile, certificate, key)
|
||||||
JSONSTRUCT_REGISTER(CertificateObject, F(usage, certificateFile, keyFile, certificate, key))
|
JSONSTRUCT_REGISTER(CertificateObject, F(usage, certificateFile, keyFile, certificate, key))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -233,13 +273,12 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString serverName;
|
QString serverName;
|
||||||
bool allowInsecure = false;
|
bool allowInsecure = false;
|
||||||
bool allowInsecureCiphers = false;
|
|
||||||
bool disableSessionResumption = true;
|
bool disableSessionResumption = true;
|
||||||
bool disableSystemRoot = false;
|
bool disableSystemRoot = false;
|
||||||
QList<QString> alpn = { "http/1.1" };
|
QList<QString> alpn = { "http/1.1" };
|
||||||
QList<CertificateObject> certificates;
|
QList<CertificateObject> certificates;
|
||||||
JSONSTRUCT_REGISTER(TLSObject,
|
JSONSTRUCT_COMPARE(TLSObject, serverName, allowInsecure, disableSessionResumption, disableSystemRoot, alpn, certificates)
|
||||||
F(serverName, allowInsecure, allowInsecureCiphers, disableSessionResumption, alpn, certificates, disableSystemRoot))
|
JSONSTRUCT_REGISTER(TLSObject, F(serverName, allowInsecure, disableSessionResumption, disableSystemRoot, alpn, certificates))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@ -247,13 +286,12 @@ namespace Qv2ray::base::objects
|
|||||||
{
|
{
|
||||||
QString serverName;
|
QString serverName;
|
||||||
bool allowInsecure = false;
|
bool allowInsecure = false;
|
||||||
bool allowInsecureCiphers = false;
|
|
||||||
bool disableSessionResumption = true;
|
bool disableSessionResumption = true;
|
||||||
bool disableSystemRoot = false;
|
bool disableSystemRoot = false;
|
||||||
QList<QString> alpn = { "http/1.1" };
|
QList<QString> alpn = { "http/1.1" };
|
||||||
QList<CertificateObject> certificates;
|
QList<CertificateObject> certificates;
|
||||||
JSONSTRUCT_REGISTER(XTLSObject,
|
JSONSTRUCT_COMPARE(XTLSObject, serverName, allowInsecure, disableSessionResumption, disableSystemRoot, alpn, certificates)
|
||||||
F(serverName, allowInsecure, allowInsecureCiphers, disableSessionResumption, alpn, certificates, disableSystemRoot))
|
JSONSTRUCT_REGISTER(XTLSObject, F(serverName, allowInsecure, disableSessionResumption, disableSystemRoot, alpn, certificates))
|
||||||
};
|
};
|
||||||
} // namespace transfer
|
} // namespace transfer
|
||||||
//
|
//
|
||||||
@ -271,8 +309,12 @@ namespace Qv2ray::base::objects
|
|||||||
transfer::HttpObject httpSettings;
|
transfer::HttpObject httpSettings;
|
||||||
transfer::DomainSocketObject dsSettings;
|
transfer::DomainSocketObject dsSettings;
|
||||||
transfer::QuicObject quicSettings;
|
transfer::QuicObject quicSettings;
|
||||||
JSONSTRUCT_REGISTER(StreamSettingsObject, F(network, security, sockopt, tcpSettings, tlsSettings, xtlsSettings, kcpSettings, wsSettings,
|
JSONSTRUCT_COMPARE(StreamSettingsObject, //
|
||||||
httpSettings, dsSettings, quicSettings))
|
network, security, sockopt, //
|
||||||
|
tcpSettings, tlsSettings, xtlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings)
|
||||||
|
JSONSTRUCT_REGISTER(StreamSettingsObject, //
|
||||||
|
F(network, security, sockopt),
|
||||||
|
F(tcpSettings, tlsSettings, xtlsSettings, kcpSettings, wsSettings, httpSettings, dsSettings, quicSettings))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
// Some protocols from: https://v2ray.com/chapter_02/02_protocols.html
|
// Some protocols from: https://v2ray.com/chapter_02/02_protocols.html
|
||||||
@ -289,12 +331,14 @@ namespace Qv2ray::base::objects
|
|||||||
int alterId = VMESS_USER_ALTERID_DEFAULT;
|
int alterId = VMESS_USER_ALTERID_DEFAULT;
|
||||||
QString security = "auto";
|
QString security = "auto";
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
JSONSTRUCT_COMPARE(UserObject, id, alterId, security, level)
|
||||||
JSONSTRUCT_REGISTER(UserObject, F(id, alterId, security, level))
|
JSONSTRUCT_REGISTER(UserObject, F(id, alterId, security, level))
|
||||||
};
|
};
|
||||||
|
|
||||||
QString address;
|
QString address;
|
||||||
int port = 0;
|
int port;
|
||||||
QList<UserObject> users;
|
QList<UserObject> users;
|
||||||
|
JSONSTRUCT_COMPARE(VMessServerObject, address, port, users)
|
||||||
JSONSTRUCT_REGISTER(VMessServerObject, F(address, port, users))
|
JSONSTRUCT_REGISTER(VMessServerObject, F(address, port, users))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -305,6 +349,7 @@ namespace Qv2ray::base::objects
|
|||||||
QString method = "aes-256-cfb";
|
QString method = "aes-256-cfb";
|
||||||
QString password;
|
QString password;
|
||||||
int port;
|
int port;
|
||||||
|
JSONSTRUCT_COMPARE(ShadowSocksServerObject, address, method, password)
|
||||||
JSONSTRUCT_REGISTER(ShadowSocksServerObject, F(address, port, method, password))
|
JSONSTRUCT_REGISTER(ShadowSocksServerObject, F(address, port, method, password))
|
||||||
};
|
};
|
||||||
} // namespace protocol
|
} // namespace protocol
|
||||||
|
@ -79,7 +79,7 @@ namespace Qv2ray::base::objects::complex
|
|||||||
meta.realOutbound = out;
|
meta.realOutbound = out;
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
explicit OutboundObjectMeta() : metaType(METAOUTBOUND_ORIGINAL){};
|
OutboundObjectMeta() : metaType(METAOUTBOUND_ORIGINAL){};
|
||||||
JSONSTRUCT_REGISTER(OutboundObjectMeta, F(metaType, displayName, connectionId, outboundTags, chainPortAllocation))
|
JSONSTRUCT_REGISTER(OutboundObjectMeta, F(metaType, displayName, connectionId, outboundTags, chainPortAllocation))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -113,6 +113,11 @@ namespace Qv2ray::base
|
|||||||
bool overrideForwardProxyConfig = false;
|
bool overrideForwardProxyConfig = false;
|
||||||
config::QvConfig_ForwardProxy forwardProxyConfig;
|
config::QvConfig_ForwardProxy forwardProxyConfig;
|
||||||
//
|
//
|
||||||
|
JSONSTRUCT_COMPARE(GroupRoutingConfig, //
|
||||||
|
overrideDNS, dnsConfig, //
|
||||||
|
overrideRoute, routeConfig, //
|
||||||
|
overrideConnectionConfig, connectionConfig, //
|
||||||
|
overrideForwardProxyConfig, forwardProxyConfig)
|
||||||
JSONSTRUCT_REGISTER(GroupRoutingConfig, //
|
JSONSTRUCT_REGISTER(GroupRoutingConfig, //
|
||||||
F(overrideRoute, routeConfig), //
|
F(overrideRoute, routeConfig), //
|
||||||
F(overrideDNS, dnsConfig), //
|
F(overrideDNS, dnsConfig), //
|
||||||
@ -135,8 +140,10 @@ namespace Qv2ray::base
|
|||||||
QList<QString> ExcludeKeywords;
|
QList<QString> ExcludeKeywords;
|
||||||
SubscriptionFilterRelation IncludeRelation = RELATION_OR;
|
SubscriptionFilterRelation IncludeRelation = RELATION_OR;
|
||||||
SubscriptionFilterRelation ExcludeRelation = RELATION_AND;
|
SubscriptionFilterRelation ExcludeRelation = RELATION_AND;
|
||||||
JSONSTRUCT_REGISTER(SubscriptionConfigObject,
|
JSONSTRUCT_COMPARE(SubscriptionConfigObject, address, type, updateInterval, //
|
||||||
F(updateInterval, address, type, IncludeRelation, ExcludeRelation, IncludeKeywords, ExcludeKeywords))
|
IncludeKeywords, ExcludeKeywords, IncludeRelation, ExcludeRelation)
|
||||||
|
JSONSTRUCT_REGISTER(SubscriptionConfigObject, F(updateInterval, address, type),
|
||||||
|
F(IncludeRelation, ExcludeRelation, IncludeKeywords, ExcludeKeywords))
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GroupObject : __Qv2rayConfigObjectBase
|
struct GroupObject : __Qv2rayConfigObjectBase
|
||||||
@ -146,6 +153,7 @@ namespace Qv2ray::base
|
|||||||
GroupRoutingId routeConfigId;
|
GroupRoutingId routeConfigId;
|
||||||
SubscriptionConfigObject subscriptionOption;
|
SubscriptionConfigObject subscriptionOption;
|
||||||
GroupObject() : __Qv2rayConfigObjectBase(){};
|
GroupObject() : __Qv2rayConfigObjectBase(){};
|
||||||
|
JSONSTRUCT_COMPARE(GroupObject, isSubscription, connections, routeConfigId, subscriptionOption)
|
||||||
JSONSTRUCT_REGISTER(GroupObject, F(connections, isSubscription, routeConfigId, subscriptionOption), B(__Qv2rayConfigObjectBase))
|
JSONSTRUCT_REGISTER(GroupObject, F(connections, isSubscription, routeConfigId, subscriptionOption), B(__Qv2rayConfigObjectBase))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -197,6 +205,10 @@ namespace Qv2ray::base
|
|||||||
{
|
{
|
||||||
return JsonStructHelper::Serialize(entries);
|
return JsonStructHelper::Serialize(entries);
|
||||||
}
|
}
|
||||||
|
friend bool operator==(const ConnectionStatsObject &left, const ConnectionStatsObject &right)
|
||||||
|
{
|
||||||
|
return left.toJson() == right.toJson();
|
||||||
|
}
|
||||||
void loadJson(const QJsonValue &d)
|
void loadJson(const QJsonValue &d)
|
||||||
{
|
{
|
||||||
JsonStructHelper::Deserialize(entries, d);
|
JsonStructHelper::Deserialize(entries, d);
|
||||||
@ -218,6 +230,7 @@ namespace Qv2ray::base
|
|||||||
ConnectionStatsObject stats;
|
ConnectionStatsObject stats;
|
||||||
//
|
//
|
||||||
int __qvConnectionRefCount = 0;
|
int __qvConnectionRefCount = 0;
|
||||||
|
JSONSTRUCT_COMPARE(ConnectionObject, lastConnected, latency, importSource, stats, displayName, creationDate, lastUpdatedDate)
|
||||||
JSONSTRUCT_REGISTER(ConnectionObject, F(lastConnected, latency, importSource, stats), B(__Qv2rayConfigObjectBase))
|
JSONSTRUCT_REGISTER(ConnectionObject, F(lastConnected, latency, importSource, stats), B(__Qv2rayConfigObjectBase))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "3rdparty/QJsonStruct/QJsonStruct.hpp"
|
#include "QJsonStruct.hpp"
|
||||||
#include "base/models/CoreObjectModels.hpp"
|
#include "base/models/CoreObjectModels.hpp"
|
||||||
namespace Qv2ray::base::config
|
namespace Qv2ray::base::config
|
||||||
{
|
{
|
||||||
@ -11,28 +11,19 @@ namespace Qv2ray::base::config
|
|||||||
QList<QString> block;
|
QList<QString> block;
|
||||||
QList<QString> proxy;
|
QList<QString> proxy;
|
||||||
QvRouteConfig_Impl(){};
|
QvRouteConfig_Impl(){};
|
||||||
friend bool operator==(const QvRouteConfig_Impl &left, const QvRouteConfig_Impl &right)
|
|
||||||
{
|
|
||||||
return left.direct == right.direct && left.block == right.block && left.proxy == right.proxy;
|
|
||||||
}
|
|
||||||
QvRouteConfig_Impl(const QList<QString> &_direct, const QList<QString> &_block, const QList<QString> &_proxy)
|
QvRouteConfig_Impl(const QList<QString> &_direct, const QList<QString> &_block, const QList<QString> &_proxy)
|
||||||
: direct(_direct), //
|
: direct(_direct), block(_block), proxy(_proxy){};
|
||||||
block(_block), //
|
JSONSTRUCT_COMPARE(QvRouteConfig_Impl, direct, block, proxy)
|
||||||
proxy(_proxy){};
|
|
||||||
JSONSTRUCT_REGISTER(QvRouteConfig_Impl, F(proxy, block, direct))
|
JSONSTRUCT_REGISTER(QvRouteConfig_Impl, F(proxy, block, direct))
|
||||||
};
|
};
|
||||||
|
|
||||||
QString domainStrategy;
|
QString domainStrategy;
|
||||||
QvRouteConfig_Impl domains;
|
QvRouteConfig_Impl domains;
|
||||||
QvRouteConfig_Impl ips;
|
QvRouteConfig_Impl ips;
|
||||||
friend bool operator==(const QvConfig_Route &left, const QvConfig_Route &right)
|
|
||||||
{
|
|
||||||
return left.domainStrategy == right.domainStrategy && left.domains == right.domains && left.ips == right.ips;
|
|
||||||
}
|
|
||||||
QvConfig_Route(){};
|
QvConfig_Route(){};
|
||||||
QvConfig_Route(const QvRouteConfig_Impl &_domains, const QvRouteConfig_Impl &_ips, const QString &ds)
|
QvConfig_Route(const QvRouteConfig_Impl &_domains, const QvRouteConfig_Impl &_ips, const QString &ds)
|
||||||
: domainStrategy(ds), //
|
: domainStrategy(ds), domains(_domains), ips(_ips){};
|
||||||
domains(_domains), //
|
JSONSTRUCT_COMPARE(QvConfig_Route, domainStrategy, domains, ips)
|
||||||
ips(_ips){};
|
|
||||||
JSONSTRUCT_REGISTER(QvConfig_Route, F(domainStrategy, domains, ips))
|
JSONSTRUCT_REGISTER(QvConfig_Route, F(domainStrategy, domains, ips))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -41,6 +32,7 @@ namespace Qv2ray::base::config
|
|||||||
struct QvConfig_Outbounds
|
struct QvConfig_Outbounds
|
||||||
{
|
{
|
||||||
int mark = 255;
|
int mark = 255;
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_Outbounds, mark)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_Outbounds, F(mark))
|
JSONSTRUCT_REGISTER(QvConfig_Outbounds, F(mark))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -53,6 +45,7 @@ namespace Qv2ray::base::config
|
|||||||
bool useAuth = false;
|
bool useAuth = false;
|
||||||
QString username;
|
QString username;
|
||||||
QString password;
|
QString password;
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_ForwardProxy, enableForwardProxy, type, serverAddress, port, useAuth, username, password)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_ForwardProxy, F(enableForwardProxy, type, serverAddress, port, useAuth, username, password))
|
JSONSTRUCT_REGISTER(QvConfig_ForwardProxy, F(enableForwardProxy, type, serverAddress, port, useAuth, username, password))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -66,22 +59,27 @@ namespace Qv2ray::base::config
|
|||||||
bool withLocalDNS = true;
|
bool withLocalDNS = true;
|
||||||
bool dnsIntercept = false;
|
bool dnsIntercept = false;
|
||||||
bool fakeDNS = false;
|
bool fakeDNS = false;
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_Connection, enableProxy, //
|
||||||
|
bypassCN, bypassBT, bypassLAN, //
|
||||||
|
v2rayFreedomDNS, withLocalDNS, dnsIntercept, fakeDNS)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_Connection, F(bypassCN, bypassBT, bypassLAN, enableProxy, v2rayFreedomDNS, withLocalDNS, dnsIntercept, fakeDNS))
|
JSONSTRUCT_REGISTER(QvConfig_Connection, F(bypassCN, bypassBT, bypassLAN, enableProxy, v2rayFreedomDNS, withLocalDNS, dnsIntercept, fakeDNS))
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QvConfig_SystemProxy
|
struct QvConfig_SystemProxy
|
||||||
{
|
{
|
||||||
bool setSystemProxy = true;
|
bool setSystemProxy = true;
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_SystemProxy, setSystemProxy)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_SystemProxy, F(setSystemProxy))
|
JSONSTRUCT_REGISTER(QvConfig_SystemProxy, F(setSystemProxy))
|
||||||
};
|
};
|
||||||
|
|
||||||
struct __Qv2rayConfig_ProtocolInboundBase
|
struct __Qv2rayConfig_ProtocolInboundBase
|
||||||
{
|
{
|
||||||
int port;
|
int port = 0;
|
||||||
bool useAuth = false;
|
bool useAuth = false;
|
||||||
bool sniffing = false;
|
bool sniffing = false;
|
||||||
objects::AccountObject account;
|
objects::AccountObject account;
|
||||||
__Qv2rayConfig_ProtocolInboundBase(int _port = 0) : port(_port){};
|
__Qv2rayConfig_ProtocolInboundBase(){};
|
||||||
|
JSONSTRUCT_COMPARE(__Qv2rayConfig_ProtocolInboundBase, port, useAuth, sniffing)
|
||||||
JSONSTRUCT_REGISTER(__Qv2rayConfig_ProtocolInboundBase, F(port, useAuth, sniffing, account))
|
JSONSTRUCT_REGISTER(__Qv2rayConfig_ProtocolInboundBase, F(port, useAuth, sniffing, account))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -89,13 +87,19 @@ namespace Qv2ray::base::config
|
|||||||
{
|
{
|
||||||
bool enableUDP = true;
|
bool enableUDP = true;
|
||||||
QString localIP = "127.0.0.1";
|
QString localIP = "127.0.0.1";
|
||||||
QvConfig_SocksInbound() : __Qv2rayConfig_ProtocolInboundBase(1089){};
|
QvConfig_SocksInbound() : __Qv2rayConfig_ProtocolInboundBase()
|
||||||
|
{
|
||||||
|
port = 1089;
|
||||||
|
}
|
||||||
JSONSTRUCT_REGISTER(QvConfig_SocksInbound, B(__Qv2rayConfig_ProtocolInboundBase), F(enableUDP, localIP))
|
JSONSTRUCT_REGISTER(QvConfig_SocksInbound, B(__Qv2rayConfig_ProtocolInboundBase), F(enableUDP, localIP))
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QvConfig_HttpInbound : __Qv2rayConfig_ProtocolInboundBase
|
struct QvConfig_HttpInbound : __Qv2rayConfig_ProtocolInboundBase
|
||||||
{
|
{
|
||||||
QvConfig_HttpInbound() : __Qv2rayConfig_ProtocolInboundBase(8889){};
|
QvConfig_HttpInbound() : __Qv2rayConfig_ProtocolInboundBase()
|
||||||
|
{
|
||||||
|
port = 8889;
|
||||||
|
}
|
||||||
JSONSTRUCT_REGISTER(QvConfig_HttpInbound, B(__Qv2rayConfig_ProtocolInboundBase))
|
JSONSTRUCT_REGISTER(QvConfig_HttpInbound, B(__Qv2rayConfig_ProtocolInboundBase))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -108,6 +112,7 @@ namespace Qv2ray::base::config
|
|||||||
bool hasUDP = true;
|
bool hasUDP = true;
|
||||||
bool sniffing = true;
|
bool sniffing = true;
|
||||||
QString mode = "tproxy";
|
QString mode = "tproxy";
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_TProxy, tProxyIP, tProxyV6IP, port, hasTCP, hasUDP, sniffing, mode)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_TProxy, F(tProxyIP, tProxyV6IP, port, hasTCP, hasUDP, sniffing, mode))
|
JSONSTRUCT_REGISTER(QvConfig_TProxy, F(tProxyIP, tProxyV6IP, port, hasTCP, hasUDP, sniffing, mode))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -122,6 +127,8 @@ namespace Qv2ray::base::config
|
|||||||
QvConfig_HttpInbound httpSettings;
|
QvConfig_HttpInbound httpSettings;
|
||||||
QvConfig_SocksInbound socksSettings;
|
QvConfig_SocksInbound socksSettings;
|
||||||
QvConfig_SystemProxy systemProxySettings;
|
QvConfig_SystemProxy systemProxySettings;
|
||||||
|
JSONSTRUCT_COMPARE(QvConfig_Inbounds, listenip, useSocks, useHTTP, useTPROXY, tProxySettings, httpSettings, socksSettings,
|
||||||
|
systemProxySettings)
|
||||||
JSONSTRUCT_REGISTER(QvConfig_Inbounds, //
|
JSONSTRUCT_REGISTER(QvConfig_Inbounds, //
|
||||||
F(listenip, useSocks, useHTTP, useTPROXY), //
|
F(listenip, useSocks, useHTTP, useTPROXY), //
|
||||||
F(tProxySettings, httpSettings, socksSettings, systemProxySettings))
|
F(tProxySettings, httpSettings, socksSettings, systemProxySettings))
|
||||||
|
@ -42,12 +42,14 @@ namespace Qv2ray::base::safetype
|
|||||||
{
|
{
|
||||||
T1 value1;
|
T1 value1;
|
||||||
T2 value2;
|
T2 value2;
|
||||||
JSONSTRUCT_REGISTER(___qvpair_t, F(value1, value2))
|
friend bool operator==(const QvPair<T1, T2> &one, const QvPair<T1, T2> &another)
|
||||||
private:
|
{
|
||||||
typedef QvPair<T1, T2> ___qvpair_t;
|
return another.value1 == one.value1 && another.value2 == one.value2;
|
||||||
|
}
|
||||||
|
JSONSTRUCT_REGISTER(___qvpair_t, F(value1, value2)) private : typedef QvPair<T1, T2> ___qvpair_t;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename enumKey, typename TValue, typename = typename std::enable_if<std::is_enum<enumKey>::value>::type>
|
template<typename enumKey, typename TValue, typename = typename std::enable_if_t<std::is_enum_v<enumKey>>>
|
||||||
struct QvEnumMap : QMap<enumKey, TValue>
|
struct QvEnumMap : QMap<enumKey, TValue>
|
||||||
{
|
{
|
||||||
// WARN: Changing this will break all existing JSON.
|
// WARN: Changing this will break all existing JSON.
|
||||||
|
@ -23,6 +23,10 @@ namespace Qv2ray::base::config
|
|||||||
this->width = w;
|
this->width = w;
|
||||||
this->style = s;
|
this->style = s;
|
||||||
};
|
};
|
||||||
|
friend bool operator==(const QvGraphPenConfig &one, const QvGraphPenConfig &another)
|
||||||
|
{
|
||||||
|
return one.R == another.R && one.G == another.G && one.B == another.B && one.width == another.width && one.style == another.style;
|
||||||
|
}
|
||||||
JSONSTRUCT_REGISTER(QvGraphPenConfig, F(R, G, B, width, style))
|
JSONSTRUCT_REGISTER(QvGraphPenConfig, F(R, G, B, width, style))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -31,6 +35,7 @@ namespace Qv2ray::base::config
|
|||||||
bool useOutboundStats = true;
|
bool useOutboundStats = true;
|
||||||
bool hasDirectStats = true;
|
bool hasDirectStats = true;
|
||||||
safetype::QvEnumMap<StatisticsType, safetype::QvPair<QvGraphPenConfig>> colorConfig;
|
safetype::QvEnumMap<StatisticsType, safetype::QvPair<QvGraphPenConfig>> colorConfig;
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Graph, useOutboundStats, hasDirectStats, colorConfig)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Graph, F(useOutboundStats, hasDirectStats, colorConfig))
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Graph, F(useOutboundStats, hasDirectStats, colorConfig))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,6 +51,8 @@ namespace Qv2ray::base::config
|
|||||||
int maximumLogLines = 500;
|
int maximumLogLines = 500;
|
||||||
int maxJumpListCount = 20;
|
int maxJumpListCount = 20;
|
||||||
bool useOldShareLinkFormat = false;
|
bool useOldShareLinkFormat = false;
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_UI, theme, language, quietMode, graphConfig, useDarkTheme, useDarkTrayIcon, maximumLogLines, maxJumpListCount,
|
||||||
|
recentConnections, useOldShareLinkFormat)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_UI, F(theme, language, quietMode, graphConfig, useDarkTheme, useDarkTrayIcon, maximumLogLines,
|
JSONSTRUCT_REGISTER(Qv2rayConfig_UI, F(theme, language, quietMode, graphConfig, useDarkTheme, useDarkTrayIcon, maximumLogLines,
|
||||||
maxJumpListCount, recentConnections, useOldShareLinkFormat))
|
maxJumpListCount, recentConnections, useOldShareLinkFormat))
|
||||||
};
|
};
|
||||||
@ -55,6 +62,7 @@ namespace Qv2ray::base::config
|
|||||||
QMap<QString, bool> pluginStates;
|
QMap<QString, bool> pluginStates;
|
||||||
bool v2rayIntegration = true;
|
bool v2rayIntegration = true;
|
||||||
int portAllocationStart = 15000;
|
int portAllocationStart = 15000;
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Plugin, pluginStates, v2rayIntegration, portAllocationStart)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Plugin, F(pluginStates, v2rayIntegration, portAllocationStart))
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Plugin, F(pluginStates, v2rayIntegration, portAllocationStart))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -93,6 +101,10 @@ namespace Qv2ray::base::config
|
|||||||
#undef _VARNAME_VCOREPATH_
|
#undef _VARNAME_VCOREPATH_
|
||||||
#undef _VARNAME_VASSETSPATH_
|
#undef _VARNAME_VASSETSPATH_
|
||||||
|
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Kernel, enableAPI, statsPort, //
|
||||||
|
v2CorePath_linux, v2AssetsPath_linux, //
|
||||||
|
v2CorePath_macx, v2AssetsPath_macx, //
|
||||||
|
v2CorePath_win, v2AssetsPath_win)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Kernel, //
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Kernel, //
|
||||||
F(enableAPI, statsPort), //
|
F(enableAPI, statsPort), //
|
||||||
F(v2CorePath_linux, v2AssetsPath_linux), //
|
F(v2CorePath_linux, v2AssetsPath_linux), //
|
||||||
@ -109,6 +121,7 @@ namespace Qv2ray::base::config
|
|||||||
};
|
};
|
||||||
UpdateChannel updateChannel = CHANNEL_STABLE;
|
UpdateChannel updateChannel = CHANNEL_STABLE;
|
||||||
QString ignoredVersion;
|
QString ignoredVersion;
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Update, updateChannel, ignoredVersion)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Update, F(ignoredVersion, updateChannel))
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Update, F(ignoredVersion, updateChannel))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -119,7 +132,10 @@ namespace Qv2ray::base::config
|
|||||||
bool testLatencyPeriodcally = false;
|
bool testLatencyPeriodcally = false;
|
||||||
bool disableSystemRoot = false;
|
bool disableSystemRoot = false;
|
||||||
bool testLatencyOnConnected = false;
|
bool testLatencyOnConnected = false;
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Advanced, F(setAllowInsecure, setSessionResumption, testLatencyPeriodcally, disableSystemRoot, testLatencyOnConnected))
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Advanced, setAllowInsecure, setSessionResumption, testLatencyPeriodcally, disableSystemRoot,
|
||||||
|
testLatencyOnConnected)
|
||||||
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Advanced,
|
||||||
|
F(setAllowInsecure, setSessionResumption, testLatencyPeriodcally, disableSystemRoot, testLatencyOnConnected))
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Qv2rayLatencyTestingMethod
|
enum Qv2rayLatencyTestingMethod
|
||||||
@ -145,6 +161,7 @@ namespace Qv2ray::base::config
|
|||||||
QString type = "http";
|
QString type = "http";
|
||||||
int port = 8000;
|
int port = 8000;
|
||||||
QString userAgent = "Qv2ray/$VERSION WebRequestHelper";
|
QString userAgent = "Qv2ray/$VERSION WebRequestHelper";
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfig_Network, latencyTestingMethod, latencyRealPingTestURL, proxyType, type, address, port, userAgent)
|
||||||
JSONSTRUCT_REGISTER(Qv2rayConfig_Network, F(latencyTestingMethod, latencyRealPingTestURL, proxyType, type, address, port, userAgent))
|
JSONSTRUCT_REGISTER(Qv2rayConfig_Network, F(latencyTestingMethod, latencyRealPingTestURL, proxyType, type, address, port, userAgent))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -183,9 +200,11 @@ namespace Qv2ray::base::config
|
|||||||
#else
|
#else
|
||||||
Q_DISABLE_COPY_MOVE(Qv2rayConfigObject);
|
Q_DISABLE_COPY_MOVE(Qv2rayConfigObject);
|
||||||
#endif
|
#endif
|
||||||
|
JSONSTRUCT_COMPARE(Qv2rayConfigObject, config_version, logLevel, autoStartId, lastConnectedId, autoStartBehavior, uiConfig, pluginConfig,
|
||||||
|
kernelConfig, updateConfig, networkConfig, inboundConfig, outboundConfig, advancedConfig, defaultRouteConfig)
|
||||||
JSONSTRUCT_REGISTER_NOCOPYMOVE(Qv2rayConfigObject, //
|
JSONSTRUCT_REGISTER_NOCOPYMOVE(Qv2rayConfigObject, //
|
||||||
F(config_version, autoStartId, lastConnectedId, autoStartBehavior, logLevel), //
|
A(config_version, autoStartId, lastConnectedId, autoStartBehavior, logLevel), //
|
||||||
F(uiConfig, advancedConfig, pluginConfig, updateConfig, kernelConfig, networkConfig), //
|
A(uiConfig, advancedConfig, pluginConfig, updateConfig, kernelConfig, networkConfig), //
|
||||||
F(inboundConfig, outboundConfig, defaultRouteConfig))
|
A(inboundConfig, outboundConfig, defaultRouteConfig))
|
||||||
};
|
};
|
||||||
} // namespace Qv2ray::base::config
|
} // namespace Qv2ray::base::config
|
||||||
|
@ -14,9 +14,9 @@ namespace Qv2ray::core::connection::generation::routing
|
|||||||
if (withLocalhost)
|
if (withLocalhost)
|
||||||
servers.push_front("localhost");
|
servers.push_front("localhost");
|
||||||
root["servers"] = servers;
|
root["servers"] = servers;
|
||||||
JAUTOREMOVE(root, "clientIp");
|
// JAUTOREMOVE(root, "clientIp");
|
||||||
JAUTOREMOVE(root, "hosts");
|
// JAUTOREMOVE(root, "hosts");
|
||||||
JAUTOREMOVE(root, "tag");
|
// JAUTOREMOVE(root, "tag");
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,8 +97,6 @@ namespace Qv2ray::core::handler
|
|||||||
groupObject[key.toString()] = groups[key].toJson();
|
groupObject[key.toString()] = groups[key].toJson();
|
||||||
}
|
}
|
||||||
StringToFile(JsonToString(groupObject), QV2RAY_CONFIG_DIR + "groups.json");
|
StringToFile(JsonToString(groupObject), QV2RAY_CONFIG_DIR + "groups.json");
|
||||||
RouteManager->SaveRoutes();
|
|
||||||
SaveGlobalSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QvConfigHandler::timerEvent(QTimerEvent *event)
|
void QvConfigHandler::timerEvent(QTimerEvent *event)
|
||||||
@ -341,7 +339,6 @@ namespace Qv2ray::core::handler
|
|||||||
void QvConfigHandler::StopConnection() // const ConnectionId &id
|
void QvConfigHandler::StopConnection() // const ConnectionId &id
|
||||||
{
|
{
|
||||||
kernelHandler->StopConnection();
|
kernelHandler->StopConnection();
|
||||||
SaveConnectionConfig();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QvConfigHandler::p_OnKernelCrashed(const ConnectionGroupPair &id, const QString &errMessage)
|
void QvConfigHandler::p_OnKernelCrashed(const ConnectionGroupPair &id, const QString &errMessage)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "3rdparty/QJsonStruct/QJsonStruct.hpp"
|
#include "QJsonStruct.hpp"
|
||||||
|
|
||||||
// GUI TOOLS
|
// GUI TOOLS
|
||||||
#define RED(obj) \
|
#define RED(obj) \
|
||||||
@ -16,6 +16,7 @@ struct HTTPSOCKSUserObject
|
|||||||
QString user;
|
QString user;
|
||||||
QString pass;
|
QString pass;
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
JSONSTRUCT_COMPARE(HTTPSOCKSUserObject, user, pass, level)
|
||||||
JSONSTRUCT_REGISTER(HTTPSOCKSUserObject, F(user, pass, level))
|
JSONSTRUCT_REGISTER(HTTPSOCKSUserObject, F(user, pass, level))
|
||||||
};
|
};
|
||||||
//
|
//
|
||||||
@ -25,6 +26,7 @@ struct SocksServerObject
|
|||||||
QString address = "0.0.0.0";
|
QString address = "0.0.0.0";
|
||||||
int port = 0;
|
int port = 0;
|
||||||
QList<HTTPSOCKSUserObject> users;
|
QList<HTTPSOCKSUserObject> users;
|
||||||
|
JSONSTRUCT_COMPARE(SocksServerObject, address, port, users)
|
||||||
JSONSTRUCT_REGISTER(SocksServerObject, F(address, port, users))
|
JSONSTRUCT_REGISTER(SocksServerObject, F(address, port, users))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -35,6 +37,7 @@ struct HttpServerObject
|
|||||||
QString address = "0.0.0.0";
|
QString address = "0.0.0.0";
|
||||||
int port = 0;
|
int port = 0;
|
||||||
QList<HTTPSOCKSUserObject> users;
|
QList<HTTPSOCKSUserObject> users;
|
||||||
|
JSONSTRUCT_COMPARE(HttpServerObject, address, port, users)
|
||||||
JSONSTRUCT_REGISTER(HttpServerObject, F(address, port, users))
|
JSONSTRUCT_REGISTER(HttpServerObject, F(address, port, users))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,6 +49,7 @@ struct ShadowSocksServerObject
|
|||||||
QString method = "aes-256-cfb";
|
QString method = "aes-256-cfb";
|
||||||
QString password;
|
QString password;
|
||||||
int port = 0;
|
int port = 0;
|
||||||
|
JSONSTRUCT_COMPARE(ShadowSocksServerObject, address, method, password)
|
||||||
JSONSTRUCT_REGISTER(ShadowSocksServerObject, F(address, port, method, password))
|
JSONSTRUCT_REGISTER(ShadowSocksServerObject, F(address, port, method, password))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -58,12 +62,14 @@ struct VLESSServerObject
|
|||||||
QString id;
|
QString id;
|
||||||
QString encryption = "none";
|
QString encryption = "none";
|
||||||
QString flow;
|
QString flow;
|
||||||
JSONSTRUCT_REGISTER(UserObject, F(id, encryption, flow))
|
JSONSTRUCT_COMPARE(UserObject, id, encryption, flow)
|
||||||
|
JSONSTRUCT_REGISTER(UserObject, A(encryption), F(id, flow))
|
||||||
};
|
};
|
||||||
|
|
||||||
QString address;
|
QString address;
|
||||||
int port = 0;
|
int port = 0;
|
||||||
QList<UserObject> users;
|
QList<UserObject> users;
|
||||||
|
JSONSTRUCT_COMPARE(VLESSServerObject, address, port, users)
|
||||||
JSONSTRUCT_REGISTER(VLESSServerObject, F(address, port, users))
|
JSONSTRUCT_REGISTER(VLESSServerObject, F(address, port, users))
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -78,11 +84,13 @@ struct VMessServerObject
|
|||||||
int alterId = VMESS_USER_ALTERID_DEFAULT;
|
int alterId = VMESS_USER_ALTERID_DEFAULT;
|
||||||
QString security = "auto";
|
QString security = "auto";
|
||||||
int level = 0;
|
int level = 0;
|
||||||
|
JSONSTRUCT_COMPARE(UserObject, id, alterId, security, level)
|
||||||
JSONSTRUCT_REGISTER(UserObject, F(id, alterId, security, level))
|
JSONSTRUCT_REGISTER(UserObject, F(id, alterId, security, level))
|
||||||
};
|
};
|
||||||
|
|
||||||
QString address;
|
QString address;
|
||||||
int port = 0;
|
int port = 0;
|
||||||
QList<UserObject> users;
|
QList<UserObject> users;
|
||||||
|
JSONSTRUCT_COMPARE(VMessServerObject, address, port, users)
|
||||||
JSONSTRUCT_REGISTER(VMessServerObject, F(address, port, users))
|
JSONSTRUCT_REGISTER(VMessServerObject, F(address, port, users))
|
||||||
};
|
};
|
||||||
|
@ -29,6 +29,7 @@ ADD_SOURCE(inbound socksin)
|
|||||||
|
|
||||||
set(BUILTIN_PROTOCOL_PLUGIN_SOURCES
|
set(BUILTIN_PROTOCOL_PLUGIN_SOURCES
|
||||||
${PLUGIN_UI_SOURCE}
|
${PLUGIN_UI_SOURCE}
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/../common/CommonTypes.hpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/BuiltinProtocolPlugin.hpp
|
${CMAKE_CURRENT_LIST_DIR}/BuiltinProtocolPlugin.hpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/BuiltinProtocolPlugin.cpp
|
${CMAKE_CURRENT_LIST_DIR}/BuiltinProtocolPlugin.cpp
|
||||||
${CMAKE_CURRENT_LIST_DIR}/core/OutboundHandler.cpp
|
${CMAKE_CURRENT_LIST_DIR}/core/OutboundHandler.cpp
|
||||||
|
@ -20,7 +20,10 @@ void BlackholeOutboundEditor::changeEvent(QEvent *e)
|
|||||||
void BlackholeOutboundEditor::SetContent(const QJsonObject &_content)
|
void BlackholeOutboundEditor::SetContent(const QJsonObject &_content)
|
||||||
{
|
{
|
||||||
this->content = _content;
|
this->content = _content;
|
||||||
PLUGIN_EDITOR_LOADING_SCOPE({ responseTypeCB->setCurrentText(content["response"].toObject()["response"].toString()); })
|
PLUGIN_EDITOR_LOADING_SCOPE({
|
||||||
|
if (content.contains("response") && content["response"].toObject().contains("type"))
|
||||||
|
responseTypeCB->setCurrentText(content["response"].toObject()["type"].toString());
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlackholeOutboundEditor::on_responseTypeCB_currentTextChanged(const QString &arg1)
|
void BlackholeOutboundEditor::on_responseTypeCB_currentTextChanged(const QString &arg1)
|
||||||
|
@ -114,7 +114,7 @@ void OutboundEditor::reloadGUI()
|
|||||||
tag = originalConfig["tag"].toString();
|
tag = originalConfig["tag"].toString();
|
||||||
tagTxt->setText(tag);
|
tagTxt->setText(tag);
|
||||||
outboundType = originalConfig["protocol"].toString("vmess");
|
outboundType = originalConfig["protocol"].toString("vmess");
|
||||||
muxConfig = originalConfig["mux"].toObject();
|
muxConfig = originalConfig.contains("mux") ? originalConfig["mux"].toObject() : QJsonObject{};
|
||||||
useForwardProxy = originalConfig[QV2RAY_USE_FPROXY_KEY].toBool(false);
|
useForwardProxy = originalConfig[QV2RAY_USE_FPROXY_KEY].toBool(false);
|
||||||
streamSettingsWidget->SetStreamObject(StreamSettingsObject::fromJson(originalConfig["streamSettings"].toObject()));
|
streamSettingsWidget->SetStreamObject(StreamSettingsObject::fromJson(originalConfig["streamSettings"].toObject()));
|
||||||
//
|
//
|
||||||
|
@ -239,8 +239,6 @@ CONFIGROOT RouteEditor::OpenEditor()
|
|||||||
{
|
{
|
||||||
const auto &ruleObject = rules[ruleTag];
|
const auto &ruleObject = rules[ruleTag];
|
||||||
auto ruleJson = ruleObject.toJson();
|
auto ruleJson = ruleObject.toJson();
|
||||||
JAUTOREMOVE(ruleJson, "network");
|
|
||||||
JAUTOREMOVE(ruleJson, "port");
|
|
||||||
if (ruleJson["outboundTag"].toString().isEmpty())
|
if (ruleJson["outboundTag"].toString().isEmpty())
|
||||||
ruleJson.remove("outboundTag");
|
ruleJson.remove("outboundTag");
|
||||||
else
|
else
|
||||||
|
@ -64,7 +64,7 @@ void QvNodeRuleWidget::setValue(std::shared_ptr<RuleObject> _ruleptr)
|
|||||||
routePortTxt->setText(rule.port);
|
routePortTxt->setText(rule.port);
|
||||||
//
|
//
|
||||||
// Users
|
// Users
|
||||||
const auto users = rule.user.join(NEWLINE);
|
const auto sourcePorts = rule.sourcePort;
|
||||||
//
|
//
|
||||||
// Incoming Sources
|
// Incoming Sources
|
||||||
const auto sources = rule.source.join(NEWLINE);
|
const auto sources = rule.source.join(NEWLINE);
|
||||||
@ -115,11 +115,6 @@ void QvNodeRuleWidget::on_routePortTxt_textEdited(const QString &arg1)
|
|||||||
LOADINGCHECK
|
LOADINGCHECK
|
||||||
rule.port = arg1;
|
rule.port = arg1;
|
||||||
}
|
}
|
||||||
void QvNodeRuleWidget::on_routeUserTxt_textEdited(const QString &arg1)
|
|
||||||
{
|
|
||||||
LOADINGCHECK
|
|
||||||
rule.user = SplitLines(arg1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QvNodeRuleWidget::on_netUDPRB_clicked()
|
void QvNodeRuleWidget::on_netUDPRB_clicked()
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,6 @@ class QvNodeRuleWidget
|
|||||||
void on_hostList_textChanged();
|
void on_hostList_textChanged();
|
||||||
void on_ipList_textChanged();
|
void on_ipList_textChanged();
|
||||||
void on_routePortTxt_textEdited(const QString &arg1);
|
void on_routePortTxt_textEdited(const QString &arg1);
|
||||||
void on_routeUserTxt_textEdited(const QString &arg1);
|
|
||||||
void on_netUDPRB_clicked();
|
void on_netUDPRB_clicked();
|
||||||
void on_netTCPRB_clicked();
|
void on_netTCPRB_clicked();
|
||||||
void on_sourceIPList_textChanged();
|
void on_sourceIPList_textChanged();
|
||||||
|
@ -153,25 +153,13 @@ void StreamSettingsWidget::on_wsHeadersTxt_textChanged()
|
|||||||
void StreamSettingsWidget::on_tcpRequestDefBtn_clicked()
|
void StreamSettingsWidget::on_tcpRequestDefBtn_clicked()
|
||||||
{
|
{
|
||||||
tcpRequestTxt->clear();
|
tcpRequestTxt->clear();
|
||||||
tcpRequestTxt->setPlainText("{\"version\":\"1.1\",\"method\":\"GET\",\"path\":[\"/\"],\"headers\":"
|
tcpRequestTxt->setPlainText(JsonToString(transfer::HTTPRequestObject().toJson()["headers"].toObject()));
|
||||||
"{\"Host\":[\"www.baidu.com\",\"www.bing.com\"],\"User-Agent\":"
|
|
||||||
"[\"Mozilla/5.0 (Windows NT 10.0; WOW64) "
|
|
||||||
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\","
|
|
||||||
"\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) "
|
|
||||||
"AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 "
|
|
||||||
"Safari/601.1.46\"],\"Accept-Encoding\":[\"gzip, deflate\"],"
|
|
||||||
"\"Connection\":[\"keep-alive\"],\"Pragma\":\"no-cache\"}}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StreamSettingsWidget::on_tcpRespDefBtn_clicked()
|
void StreamSettingsWidget::on_tcpRespDefBtn_clicked()
|
||||||
{
|
{
|
||||||
tcpRespTxt->clear();
|
tcpRespTxt->clear();
|
||||||
tcpRespTxt->setPlainText("{\"version\":\"1.1\",\"status\":\"200\",\""
|
tcpRespTxt->setPlainText(JsonToString(transfer::HTTPResponseObject().toJson()["headers"].toObject()));
|
||||||
"reason\":\"OK\",\"headers\":{\"Content-Typ"
|
|
||||||
"e\":[\"application/octet-stream\",\"video/"
|
|
||||||
"mpeg\"],\"Transfer-Encoding\":[\"chunked\""
|
|
||||||
"],\"Connection\":[\"keep-alive\"],\"Pragma"
|
|
||||||
"\":\"no-cache\"}}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StreamSettingsWidget::on_soMarkSpinBox_valueChanged(int arg1)
|
void StreamSettingsWidget::on_soMarkSpinBox_valueChanged(int arg1)
|
||||||
|
@ -35,15 +35,13 @@ SCENARIO("Test Parse VMess V2 url", "[ParseVMessV2]")
|
|||||||
const auto portParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "port").toInt();
|
const auto portParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "port").toInt();
|
||||||
const auto idParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "users", 0, "id").toString();
|
const auto idParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "users", 0, "id").toString();
|
||||||
const auto alterIdParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "users", 0, "alterId").toInt();
|
const auto alterIdParsed = QJsonIO::GetValue(result, "outbounds", 0, "settings", "vnext", 0, "users", 0, "alterId").toInt();
|
||||||
const auto typeParsed = QJsonIO::GetValue(result, "outbounds", 0, "streamSettings", "tcpSettings", "header", "type").toString();
|
|
||||||
|
|
||||||
REQUIRE(commentParsed.toStdString() == comment.toStdString());
|
REQUIRE(commentParsed.toStdString() == comment.toStdString());
|
||||||
REQUIRE(addressParsed.toStdString() == address.toStdString());
|
REQUIRE(addressParsed.toStdString() == address.toStdString());
|
||||||
REQUIRE(portParsed == port);
|
REQUIRE(portParsed == port);
|
||||||
REQUIRE(idParsed.toStdString() == uuid.toStdString());
|
REQUIRE(idParsed.toStdString() == uuid.toStdString());
|
||||||
REQUIRE(alterIdParsed == alterId);
|
REQUIRE(alterIdParsed == alterId);
|
||||||
REQUIRE(networkParsed.toStdString() == network.toStdString());
|
REQUIRE(networkParsed.toStdString() == "");
|
||||||
REQUIRE(typeParsed.toStdString() == "none");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,8 +86,6 @@ SCENARIO("Test Parse VMess V1 url", "[ParseVMessV1]")
|
|||||||
REQUIRE(idParsed.toStdString() == uuid.toStdString());
|
REQUIRE(idParsed.toStdString() == uuid.toStdString());
|
||||||
REQUIRE(alterIdParsed == alterId);
|
REQUIRE(alterIdParsed == alterId);
|
||||||
REQUIRE(networkParsed.toStdString() == network.toStdString());
|
REQUIRE(networkParsed.toStdString() == network.toStdString());
|
||||||
REQUIRE(typeParsed.toStdString() == "none");
|
|
||||||
REQUIRE(tlsParsed.toStdString() == "none");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2256,6 +2256,14 @@ Output: <byte value="xd"/>
|
|||||||
<source>Please upgrade firstly up to Qv2ray v2.0/v2.1 and try again.</source>
|
<source>Please upgrade firstly up to Qv2ray v2.0/v2.1 and try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Qv2ray has encountered an uncaught exception: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Please report a bug via Github with the file located here: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Qv2ray::Qv2rayWidgetApplication</name>
|
<name>Qv2ray::Qv2rayWidgetApplication</name>
|
||||||
@ -3271,4 +3279,339 @@ Maybe you have downloaded the wrong core?</source>
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>dokodemodoorInEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Address</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Optional when using "Follow Redirect"</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Port</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Network</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>TCP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UDP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Timeout</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Follow Redirect</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enabled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>httpInEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Allow Transparent</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Timeout</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>s</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Users</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Username</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>PluginInboundEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>socksInEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UDP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Enabled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UDP Local IP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>127.0.0.1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Auth</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Users</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Username</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>blackholeOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Response</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Type</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>dnsOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Network</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>TCP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UDP</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Original</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Address</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Port</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>freedomOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Domain Strategy</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Redirect</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>:0</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>httpOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Username</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>PluginOutboundEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>shadowsocksOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Encryption Method</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>socksOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Username</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Password</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>vlessOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UUID</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Encryption</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Flow</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><h3>Notes for <code>udp443</code> Methods</h3>
|
||||||
|
|
||||||
|
<p>Some applications like Google Chrome would attempt to use QUIC protocol instead of TLS, which, won't benefit from XTLS at all. What's worse, QUIC over TCP will cause potential congestion control problem, downgrading your experience.</p>
|
||||||
|
|
||||||
|
<p>Non-<code>udp443</code> methods block UDP 443 outbound traffic to workaround this situation. If you do want to let it go, use at your own peril.</p></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>vmessOutEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>UUID</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Alter ID</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Security</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>PluginSettingsWidget</name>
|
||||||
|
<message>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>MainWindowForm.ui</name>
|
||||||
|
<message>
|
||||||
|
<source>Qv2ray</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>HTTPInboundEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Removing a user</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>You haven't selected a user yet.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Add a user</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>This user exists already.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SocksInboundEditor</name>
|
||||||
|
<message>
|
||||||
|
<source>Removing a user</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>You haven't selected a user yet.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Add a user</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>This user exists already.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
</TS>
|
</TS>
|
||||||
|
Loading…
Reference in New Issue
Block a user