Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,16 @@ set(PROJECT_SOURCES
include/sys/windows/eventHandler.h
src/dataStore/Group.cpp
src/dataStore/ProxyEntity.cpp
include/configs/baseConfig.h
include/configs/common/DialFields.h
include/configs/common/TLS.h
include/configs/common/multiplex.h
include/configs/common/transport.h
include/configs/common/Outbound.h
include/configs/outbounds/socks.h
include/configs/outbounds/http.h
include/configs/outbounds/shadowsocks.h
include/configs/outbounds/vmess.h
)

if (NOT APPLE AND Qt6_VERSION VERSION_GREATER_EQUAL 6.9.0)
Expand Down
22 changes: 22 additions & 0 deletions include/configs/baseConfig.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include <QJsonObject>
#include <QString>
#include "include/global/ConfigItem.hpp"

namespace Configs
{
class baseConfig : public JsonStore
{
public:
virtual bool ParseFromLink(QString link);

virtual bool ParseFromJson(QJsonObject object);

virtual QString ExportToLink();

virtual QJsonObject ExportToJson();

virtual QJsonObject Build();
};
}
24 changes: 24 additions & 0 deletions include/configs/common/DialFields.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once
#include "include/configs/baseConfig.h"

namespace Configs
{
class DialFields : baseConfig
{
public:
bool reuse_addr = false;
QString connect_timeout;
bool tcp_fast_open = false;
bool tcp_multi_path = false;
bool udp_fragment = false;

DialFields()
{
_add(new configItem("reuse_addr", &reuse_addr, itemType::boolean));
_add(new configItem("connect_timeout", &connect_timeout, itemType::string));
_add(new configItem("tcp_fast_open", &tcp_fast_open, itemType::boolean));
_add(new configItem("tcp_multi_path", &tcp_multi_path, itemType::boolean));
_add(new configItem("udp_fragment", &udp_fragment, itemType::boolean));
}
};
}
24 changes: 24 additions & 0 deletions include/configs/common/Outbound.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once
#include "include/configs/baseConfig.h"

namespace Configs
{
class OutboundCommons : public baseConfig
{
public:
QString type;
QString name;
int id = -1;
QString server;
int server_port = 0;

OutboundCommons()
{
_add(new configItem("type", &type, string));
_add(new configItem("name", &name, string));
_add(new configItem("id", &id, integer));
_add(new configItem("server", &server, string));
_add(new configItem("server_port", &server_port, integer));
}
};
}
104 changes: 104 additions & 0 deletions include/configs/common/TLS.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#pragma once
#include "include/configs/baseConfig.h"

namespace Configs
{

inline QStringList tlsFingerprints = {"", "chrome", "firefox", "edge", "safari", "360", "qq", "ios", "android", "random", "randomized"};

class uTLS : public baseConfig
{
public:
bool enabled = false;
QString fingerPrint;

uTLS()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("fingerprint", &fingerPrint, string));
}
};

class ECH : public baseConfig
{
public:
bool enabled = false;
QStringList config;
QString config_path;

ECH()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("config", &config, stringList));
_add(new configItem("config_path", &config_path, string));
}
};

class Reality : public baseConfig
{
public:
bool enabled = false;
QString public_key;
QString short_id;

Reality()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("public_key", &public_key, string));
_add(new configItem("short_id", &short_id, string));
}
};

class TLS : public baseConfig
{
public:
bool enabled = false;
bool disable_sni = false;
QString server_name;
bool insecure = false;
QStringList alpn;
QString min_version;
QString max_version;
QStringList cipher_suites;
QStringList curve_preferences;
QString certificate;
QString certificate_path;
QStringList certificate_public_key_sha256;
QString client_certificate;
QString client_certificate_path;
QStringList client_key;
QString client_key_path;
bool fragment = false;
QString fragment_fallback_delay;
bool record_fragment = false;
std::shared_ptr<ECH> ech = std::make_shared<ECH>();
std::shared_ptr<uTLS> utls = std::make_shared<uTLS>();
std::shared_ptr<Reality> reality = std::make_shared<Reality>();

TLS()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("disable_sni", &disable_sni, boolean));
_add(new configItem("server_name", &server_name, string));
_add(new configItem("insecure", &insecure, boolean));
_add(new configItem("alpn", &alpn, stringList));
_add(new configItem("min_version", &min_version, string));
_add(new configItem("max_version", &max_version, string));
_add(new configItem("cipher_suites", &cipher_suites, stringList));
_add(new configItem("curve_preferences", &curve_preferences, stringList));
_add(new configItem("certificate", &certificate, string));
_add(new configItem("certificate_path", &certificate_path, string));
_add(new configItem("certificate_public_key_sha256", &certificate_public_key_sha256, stringList));
_add(new configItem("client_certificate", &client_certificate, string));
_add(new configItem("client_certificate_path", &client_certificate_path, string));
_add(new configItem("client_key", &client_key, stringList));
_add(new configItem("client_key_path", &client_key_path, string));
_add(new configItem("fragment", &fragment, boolean));
_add(new configItem("fragment_fallback_delay", &fragment_fallback_delay, string));
_add(new configItem("record_fragment", &record_fragment, boolean));
_add(new configItem("ech", dynamic_cast<JsonStore *>(ech.get()), jsonStore));
_add(new configItem("utls", dynamic_cast<JsonStore *>(utls.get()), jsonStore));
_add(new configItem("reality", dynamic_cast<JsonStore *>(reality.get()), jsonStore));
}
};
}
45 changes: 45 additions & 0 deletions include/configs/common/multiplex.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once
#include "include/configs/baseConfig.h"

namespace Configs
{
inline QStringLists muxProtocols = {"smux", "yamux", "h2mux"};

class TcpBrutal : public baseConfig
{
public:
bool enabled = false;
int up_mbps = 0;
int down_mbps = 0;

TcpBrutal()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("up_mbps", &up_mbps, integer));
_add(new configItem("down_mbps", &down_mbps, integer));
}
};

class Multiplex : public baseConfig
{
public:
bool enabled = false;
QString protocol;
int max_connections = 0;
int min_streams = 0;
int max_streams = 0;
bool padding = false;
std::shared_ptr<TcpBrutal> brutal = std::make_shared<TcpBrutal>();

Multiplex()
{
_add(new configItem("enabled", &enabled, boolean));
_add(new configItem("protocol", &protocol, string));
_add(new configItem("max_connections", &max_connections, integer));
_add(new configItem("min_streams", &min_streams, integer));
_add(new configItem("max_streams", &max_streams, integer));
_add(new configItem("padding", &padding, boolean));
_add(new configItem("brutal", dynamic_cast<JsonStore *>(brutal.get()), jsonStore));
}
};
}
40 changes: 40 additions & 0 deletions include/configs/common/transport.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once
#include "include/configs/baseConfig.h"

namespace Configs
{
class Transport : public baseConfig
{
public:
QString type;

// HTTP
QString host;
QString path;
QString method;
QStringList headers;
QString idle_timeout;
QString ping_timeout;

// Websocket
int max_early_data = 0;
QString early_data_header_name;

// gRPC
QString service_name;

Transport()
{
_add(new configItem("type", &type, string));
_add(new configItem("host", &host, string));
_add(new configItem("path", &path, string));
_add(new configItem("method", &method, string));
_add(new configItem("headers", &headers, stringList));
_add(new configItem("idle_timeout", &idle_timeout, string));
_add(new configItem("ping_timeout", &ping_timeout, string));
_add(new configItem("max_early_data", &max_early_data, integer));
_add(new configItem("early_data_header_name", &early_data_header_name, string));
_add(new configItem("service_name", &service_name, string));
}
};
}
28 changes: 28 additions & 0 deletions include/configs/outbounds/http.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#pragma once
#include "include/configs/baseConfig.h"
#include "include/configs/common/Outbound.h"
#include "include/configs/common/TLS.h"

namespace Configs
{
class http : public baseConfig
{
public:
std::shared_ptr<OutboundCommons> commons = std::make_shared<OutboundCommons>();
QString username;
QString password;
QString path;
QStringList headers;
std::shared_ptr<TLS> tls = std::make_shared<TLS>();

http()
{
_add(new configItem("commons", dynamic_cast<JsonStore *>(commons.get()), jsonStore));
_add(new configItem("username", &username, string));
_add(new configItem("password", &password, string));
_add(new configItem("path", &path, string));
_add(new configItem("headers", &headers, stringList));
_add(new configItem("tls", dynamic_cast<JsonStore *>(tls.get()), jsonStore));
}
};
}
35 changes: 35 additions & 0 deletions include/configs/outbounds/shadowsocks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once
#include <Wbemidl.h>

#include "include/configs/baseConfig.h"
#include "include/configs/common/multiplex.h"
#include "include/configs/common/Outbound.h"

namespace Configs
{

inline QStringList shadowsocksMethods = {"2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "none", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "rc4-md5", "chacha20-ietf", "xchacha20"};

class shadowsocks : public baseConfig
{
public:
std::shared_ptr<OutboundCommons> commons = std::make_shared<OutboundCommons>();
QString method;
QString password;
QString plugin;
QString plugin_opts;
bool uot = false;
std::shared_ptr<Multiplex> mux = std::make_shared<Multiplex>();

shadowsocks()
{
_add(new configItem("commons", dynamic_cast<JsonStore *>(commons.get()), jsonStore));
_add(new configItem("method", &method, string));
_add(new configItem("password", &password, string));
_add(new configItem("plugin", &plugin, string));
_add(new configItem("plugin_opts", &plugin_opts, string));
_add(new configItem("uot", &uot, itemType::boolean));
_add(new configItem("mux", dynamic_cast<JsonStore *>(mux.get()), jsonStore));
}
};
}
23 changes: 23 additions & 0 deletions include/configs/outbounds/socks.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#pragma once
#include "include/configs/baseConfig.h"
#include "include/configs/common/Outbound.h"

namespace Configs
{
class socks : public baseConfig
{
public:
std::shared_ptr<OutboundCommons> commons = std::make_shared<OutboundCommons>();
QString username;
QString password;
bool uot = false;

socks()
{
_add(new configItem("commons", dynamic_cast<JsonStore *>(commons.get()), jsonStore));
_add(new configItem("username", &username, string));
_add(new configItem("password", &password, string));
_add(new configItem("uot", &uot, boolean));
}
};
}
Loading