Browse Source

feat: demo of VMess Filter

master
Dnomd343 3 years ago
parent
commit
92a917915e
  1. 166
      ProxyFilter/VMess.py
  2. 7
      docs/ProxyObject.md

166
ProxyFilter/VMess.py

@ -0,0 +1,166 @@
#!/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

7
docs/ProxyObject.md

@ -181,6 +181,13 @@
## VMess
> **remark**
>
> + 类型:*str*
> + 说明:节点备注名称
> + 缺省:''
> + 可选值:不限
```
{
'type': 'vmess',

Loading…
Cancel
Save