Skip to content

Commit

Permalink
Merge pull request #1106 from M03ED/dev
Browse files Browse the repository at this point in the history
fix(subscription): prevent sending null alpn parameter
  • Loading branch information
SaintShit authored Jul 15, 2024
2 parents 8cf6440 + 410f113 commit 0e0e0e5
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 28 deletions.
2 changes: 1 addition & 1 deletion app/subscription/share.py
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ def process_inbounds_and_tags(
"sni": sni,
"host": req_host,
"tls": inbound["tls"] if host["tls"] is None else host["tls"],
"alpn": host["alpn"] or inbound.get("alpn", ""),
"alpn": host["alpn"] if host["alpn"] else None,
"path": path,
"fp": host["fingerprint"] or inbound.get("fp", ""),
"ais": host["allowinsecure"]
Expand Down
4 changes: 3 additions & 1 deletion app/subscription/singbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
if net in ["grpc", "gun"]:
path = get_grpc_gun(path)

alpn = inbound.get('alpn', None)

outbound = self.make_outbound(
remark=remark,
type=inbound['protocol'],
Expand All @@ -253,7 +255,7 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
sni=inbound['sni'],
host=inbound['host'],
path=path,
alpn=inbound.get('alpn', '').rsplit(sep=","),
alpn=alpn.rsplit(sep=",") if alpn else None,
fp=inbound.get('fp', ''),
pbk=inbound.get('pbk', ''),
sid=inbound.get('sid', ''),
Expand Down
73 changes: 47 additions & 26 deletions app/subscription/v2ray.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from app.subscription.funcs import get_grpc_gun, get_grpc_multi
from app.templates import render_template
from config import (
MUX_TEMPLATE,
USER_AGENT_TEMPLATE,
MUX_TEMPLATE,
USER_AGENT_TEMPLATE,
V2RAY_SUBSCRIPTION_TEMPLATE,
GRPC_USER_AGENT_TEMPLATE,
)
Expand Down Expand Up @@ -63,7 +63,8 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
fs=inbound.get("fragment_setting", ""),
multiMode=multi_mode,
max_upload_size=inbound.get('max_upload_size', 1000000),
max_concurrent_uploads=inbound.get('max_concurrent_uploads', 10),
max_concurrent_uploads=inbound.get(
'max_concurrent_uploads', 10),
)

elif inbound["protocol"] == "vless":
Expand All @@ -88,7 +89,8 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
fs=inbound.get("fragment_setting", ""),
multiMode=multi_mode,
max_upload_size=inbound.get('max_upload_size', 1000000),
max_concurrent_uploads=inbound.get('max_concurrent_uploads', 10),
max_concurrent_uploads=inbound.get(
'max_concurrent_uploads', 10),
)

elif inbound["protocol"] == "trojan":
Expand All @@ -113,7 +115,8 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
fs=inbound.get("fragment_setting", ""),
multiMode=multi_mode,
max_upload_size=inbound.get('max_upload_size', 1000000),
max_concurrent_uploads=inbound.get('max_concurrent_uploads', 10),
max_concurrent_uploads=inbound.get(
'max_concurrent_uploads', 10),
)

elif inbound["protocol"] == "shadowsocks":
Expand Down Expand Up @@ -172,11 +175,13 @@ def vmess(
if tls == "tls":
payload["sni"] = sni
payload["fp"] = fp
payload["alpn"] = alpn
if alpn:
payload["alpn"] = alpn
if fs:
payload["fragment"] = fs
if ais:
payload["allowInsecure"] = 1

elif tls == "reality":
payload["sni"] = sni
payload["fp"] = fp
Expand Down Expand Up @@ -225,7 +230,7 @@ def vless(cls,
multiMode: bool = False,
max_upload_size: int = 1000000,
max_concurrent_uploads: int = 10,
):
):

payload = {
"security": tls,
Expand Down Expand Up @@ -260,11 +265,13 @@ def vless(cls,
if tls == "tls":
payload["sni"] = sni
payload["fp"] = fp
payload["alpn"] = alpn
if alpn:
payload["alpn"] = alpn
if fs:
payload["fragment"] = fs
if ais:
payload["allowInsecure"] = 1

elif tls == "reality":
payload["sni"] = sni
payload["fp"] = fp
Expand Down Expand Up @@ -337,7 +344,8 @@ def trojan(cls,
if tls == "tls":
payload["sni"] = sni
payload["fp"] = fp
payload["alpn"] = alpn
if alpn:
payload["alpn"] = alpn
if fs:
payload["fragment"] = fs
if ais:
Expand Down Expand Up @@ -376,7 +384,7 @@ def __init__(self):
self.mux_template = render_template(MUX_TEMPLATE)
temp_user_agent_data = render_template(USER_AGENT_TEMPLATE)
user_agent_data = json.loads(temp_user_agent_data)

if 'list' in user_agent_data and isinstance(user_agent_data['list'], list):
self.user_agent_list = user_agent_data['list']
else:
Expand Down Expand Up @@ -460,7 +468,8 @@ def httpupgrade_config(self, path=None, host=None, random_user_agent=None):
if host:
httpupgradeSettings["host"] = host
if random_user_agent:
httpupgradeSettings["headers"]["User-Agent"] = choice(self.user_agent_list)
httpupgradeSettings["headers"]["User-Agent"] = choice(
self.user_agent_list)

return httpupgradeSettings

Expand All @@ -480,7 +489,7 @@ def splithttp_config(self, path=None, host=None, random_user_agent=None,
self.user_agent_list)
splithttpSettings["maxUploadSize"] = max_upload_size
splithttpSettings["maxConcurrentUploads"] = max_concurrent_uploads

return splithttpSettings

def grpc_config(self, path=None, host=None, multiMode=False, random_user_agent=None):
Expand Down Expand Up @@ -513,8 +522,9 @@ def tcp_http_config(self, path=None, host=None, random_user_agent=None):

tcpSettings["header"]["request"]["headers"] = {}
tcpSettings["header"]["request"]["method"] = "GET"
tcpSettings["header"]["request"]["headers"]["Accept-Encoding"] = ["gzip, deflate"]
tcpSettings["header"]["request"]["headers"]["Connection"] = ["keep-alive"]
tcpSettings["header"]["request"]["headers"]["Accept-Encoding"] = ["gzip", "deflate"]
tcpSettings["header"]["request"]["headers"]["Connection"] = [
"keep-alive"]
tcpSettings["header"]["request"]["headers"]["Pragma"] = "no-cache"

if path:
Expand All @@ -524,7 +534,8 @@ def tcp_http_config(self, path=None, host=None, random_user_agent=None):
tcpSettings["header"]["request"]["headers"]["Host"] = [host]

if random_user_agent:
tcpSettings["header"]["request"]["headers"]["User-Agent"] = [choice(self.user_agent_list)]
tcpSettings["header"]["request"]["headers"]["User-Agent"] = [
choice(self.user_agent_list)]
else:
tcpSettings["header"]["request"]["headers"]["User-Agent"] = []

Expand All @@ -543,7 +554,8 @@ def h2_config(self, path=None, host=None, random_user_agent=None):
else:
httpSettings["host"] = []
if random_user_agent:
httpSettings["headers"]["User-Agent"] = [choice(self.user_agent_list)]
httpSettings["headers"]["User-Agent"] = [
choice(self.user_agent_list)]

return httpSettings

Expand Down Expand Up @@ -734,23 +746,29 @@ def make_stream_setting(self,
):

if net == "ws":
network_setting = self.ws_config(path=path, host=host, random_user_agent=random_user_agent)
network_setting = self.ws_config(
path=path, host=host, random_user_agent=random_user_agent)
elif net == "grpc":
network_setting = self.grpc_config(path=path, host=host, multiMode=multiMode, random_user_agent=random_user_agent)
network_setting = self.grpc_config(
path=path, host=host, multiMode=multiMode, random_user_agent=random_user_agent)
elif net == "h2":
network_setting = self.h2_config(path=path, host=host, random_user_agent=random_user_agent)
network_setting = self.h2_config(
path=path, host=host, random_user_agent=random_user_agent)
elif net == "kcp":
network_setting = self.kcp_config(
path=path, host=host, header=headers)
elif net == "tcp":
network_setting = self.tcp_http_config(path=path, host=host, random_user_agent=random_user_agent)
network_setting = self.tcp_http_config(
path=path, host=host, random_user_agent=random_user_agent)
elif net == "quic":
network_setting = self.quic_config(path=path, host=host, header=headers)
network_setting = self.quic_config(
path=path, host=host, header=headers)
elif net == "httpupgrade":
network_setting = self.httpupgrade_config(path=path, host=host, random_user_agent=random_user_agent)
network_setting = self.httpupgrade_config(
path=path, host=host, random_user_agent=random_user_agent)
elif net == "splithttp":
network_setting = self.splithttp_config(path=path, host=host, random_user_agent=random_user_agent,
max_upload_size=max_upload_size,
network_setting = self.splithttp_config(path=path, host=host, random_user_agent=random_user_agent,
max_upload_size=max_upload_size,
max_concurrent_uploads=max_concurrent_uploads)

if tls == "tls":
Expand Down Expand Up @@ -835,19 +853,22 @@ def add(self, remark: str, address: str, inbound: dict, settings: dict):
if fragment:
try:
length, interval, packets = fragment.split(',')
fragment_outbound = self.make_fragment_outbound(packets, length, interval)
fragment_outbound = self.make_fragment_outbound(
packets, length, interval)
outbounds.append(fragment_outbound)
dialer_proxy = fragment_outbound['tag']
except ValueError:
pass

alpn = inbound.get('alpn', None)

outbound["streamSettings"] = self.make_stream_setting(
net=net,
tls=tls,
sni=inbound['sni'],
host=inbound['host'],
path=path,
alpn=inbound.get('alpn', '').rsplit(sep=","),
alpn=alpn.rsplit(sep=",") if alpn else None,
fp=inbound.get('fp', ''),
pbk=inbound.get('pbk', ''),
sid=inbound.get('sid', ''),
Expand Down

0 comments on commit 0e0e0e5

Please sign in to comment.