mirror of https://github.com/dnomd343/ProxyC
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.6 KiB
166 lines
5.6 KiB
#!/usr/bin/python
|
|
# -*- coding:utf-8 -*-
|
|
|
|
from ProxyFilter import baseFunc
|
|
|
|
def __vmessFill(raw: dict) -> dict: # 补全可选值
|
|
try:
|
|
pass
|
|
except:
|
|
pass
|
|
return raw
|
|
|
|
def __vmessFormat(raw: dict) -> dict: # 容错性格式化
|
|
try:
|
|
pass
|
|
except:
|
|
pass
|
|
return raw
|
|
|
|
def __obfsParamCheck(obfs: dict or None) -> tuple[bool, str or None]: # obfs参数检查
|
|
pass
|
|
|
|
def __secureParamCheck(secure: dict or None) -> tuple[bool, str or None]: # secure参数检查
|
|
pass
|
|
|
|
def __streamParamCheck(stream: dict) -> tuple[bool, str or None]: # stream参数检查
|
|
if 'type' not in stream:
|
|
return False, 'Missing `type` option'
|
|
if stream['type'] == 'tcp':
|
|
if 'obfs' not in stream:
|
|
return False, 'Missing `stream.obfs` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
|
|
if (stream['obfs'] is not None) and (not isinstance(stream['obfs'], dict)):
|
|
return False, 'Illegal `stream.obfs` option'
|
|
if (stream['secure'] is not None) and (not isinstance(stream['secure'], dict)):
|
|
return False, 'Illegal `stream.secure` option'
|
|
|
|
status, reason = __obfsParamCheck(stream['obfs'])
|
|
if not status:
|
|
return False, reason
|
|
status, reason = __secureParamCheck(stream['secure'])
|
|
if not status:
|
|
return False, reason
|
|
|
|
elif stream['type'] == 'kcp':
|
|
if 'seed' not in stream:
|
|
return False, 'Missing `stream.seed` option'
|
|
if 'obfs' not in stream:
|
|
return False, 'Missing `stream.obfs` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
pass
|
|
|
|
elif stream['type'] == 'ws':
|
|
if 'host' not in stream:
|
|
return False, 'Missing `stream.host` option'
|
|
if 'path' not in stream:
|
|
return False, 'Missing `stream.path` option'
|
|
if 'ed' not in stream:
|
|
return False, 'Missing `stream.ed` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
pass
|
|
|
|
elif stream['type'] == 'h2':
|
|
if 'host' not in stream:
|
|
return False, 'Missing `stream.host` option'
|
|
if 'path' not in stream:
|
|
return False, 'Missing `stream.path` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
pass
|
|
|
|
elif stream['type'] == 'quic':
|
|
if 'method' not in stream:
|
|
return False, 'Missing `stream.method` option'
|
|
if 'passwd' not in stream:
|
|
return False, 'Missing `stream.passwd` option'
|
|
if 'obfs' not in stream:
|
|
return False, 'Missing `stream.obfs` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
pass
|
|
|
|
elif stream['type'] == 'grpc':
|
|
if 'service' not in stream:
|
|
return False, 'Missing `stream.service` option'
|
|
if 'secure' not in stream:
|
|
return False, 'Missing `stream.secure` option'
|
|
pass
|
|
|
|
else:
|
|
return False, 'Unknown stream type'
|
|
return True, None
|
|
|
|
def __vmessParamCheck(raw: dict) -> tuple[bool, str or None]: # VMess节点参数检查
|
|
try:
|
|
if 'server' not in raw:
|
|
return False, 'Missing `server` option'
|
|
if 'port' not in raw:
|
|
return False, 'Missing `port` option'
|
|
if 'method' not in raw:
|
|
return False, 'Missing `method` option'
|
|
if 'id' not in raw:
|
|
return False, 'Missing `id` option'
|
|
if 'aid' not in raw:
|
|
return False, 'Missing `aid` option'
|
|
if 'stream' not in raw:
|
|
return False, 'Missing `stream` option'
|
|
|
|
if not isinstance(raw['server'], str):
|
|
return False, 'Illegal `server` option'
|
|
if not isinstance(raw['port'], int):
|
|
return False, 'Illegal `port` option'
|
|
if not isinstance(raw['method'], str):
|
|
return False, 'Illegal `method` option'
|
|
if not isinstance(raw['id'], str):
|
|
return False, 'Illegal `id` option'
|
|
if not isinstance(raw['aid'], str):
|
|
return False, 'Illegal `aid` option'
|
|
if not isinstance(raw['stream'], dict):
|
|
return False, 'Illegal `stream` option'
|
|
|
|
status, reason = __streamParamCheck(raw['stream'])
|
|
if not status:
|
|
return False, reason
|
|
except:
|
|
return False, 'Unknown error'
|
|
return True, None
|
|
|
|
def vmessFilter(rawInfo: dict, isExtra: bool) -> tuple[bool, str or dict]:
|
|
"""
|
|
VMess节点合法性检查
|
|
|
|
不合法:
|
|
return False, {reason}
|
|
|
|
合法:
|
|
return True, {
|
|
'type': 'vmess',
|
|
...
|
|
}
|
|
"""
|
|
try:
|
|
raw = rawInfo
|
|
raw = __vmessFormat(__vmessFill(raw)) # 预处理
|
|
status, reason = __vmessParamCheck(raw) # 参数检查
|
|
if not status: # 参数有误
|
|
return False, reason
|
|
|
|
result = {'type': 'vmess'}
|
|
if isExtra: # 携带额外参数
|
|
if 'remark' not in raw: # 补全默认值
|
|
raw['remark'] = ''
|
|
if raw['remark'] is None: # 容错格式化
|
|
raw['remark'] = ''
|
|
if not isinstance(raw['remark'], str): # 参数检查
|
|
return False, 'Illegal `remark` option'
|
|
result['remark'] = raw['remark']
|
|
|
|
pass
|
|
except:
|
|
return False, 'Unknown error'
|
|
return True, result
|
|
|