|
|
@ -73,77 +73,71 @@ ssrObfsList = [ # ShadowsocksR混淆方式 |
|
|
|
'random_head', |
|
|
|
] |
|
|
|
|
|
|
|
def __ssrFill(raw: dict) -> dict: # 补全可选值 |
|
|
|
try: |
|
|
|
if 'protocol' not in raw: |
|
|
|
raw['protocol'] = '' |
|
|
|
if 'protocolParam' not in raw: |
|
|
|
raw['protocolParam'] = '' |
|
|
|
if 'obfs' not in raw: |
|
|
|
raw['obfs'] = '' |
|
|
|
if 'obfsParam' not in raw: |
|
|
|
raw['obfsParam'] = '' |
|
|
|
except: |
|
|
|
pass |
|
|
|
return raw |
|
|
|
|
|
|
|
def __ssrFormat(raw: dict) -> dict: # 容错性格式化 |
|
|
|
try: |
|
|
|
raw['server'] = raw['server'].strip() |
|
|
|
raw['port'] = int(raw['port']) |
|
|
|
raw['method'] = raw['method'].replace('_', '-').lower().strip() |
|
|
|
if raw['protocol'] is None: |
|
|
|
raw['protocol'] = '' |
|
|
|
if raw['protocolParam'] is None: |
|
|
|
raw['protocolParam'] = '' |
|
|
|
if raw['obfs'] is None: |
|
|
|
raw['obfs'] = '' |
|
|
|
if raw['obfsParam'] is None: |
|
|
|
raw['obfsParam'] = '' |
|
|
|
raw['protocol'] = raw['protocol'].replace('-', '_').lower().strip() |
|
|
|
raw['obfs'] = raw['obfs'].replace('-', '_').lower().strip() |
|
|
|
except: |
|
|
|
pass |
|
|
|
return raw |
|
|
|
|
|
|
|
def __ssrParamCheck(raw: dict) -> tuple[bool, str or None]: # 参数检查 |
|
|
|
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 'passwd' not in raw: |
|
|
|
return False, 'Missing `passwd` option' |
|
|
|
if 'protocol' not in raw: |
|
|
|
return False, 'Missing `protocol` option' |
|
|
|
if 'protocolParam' not in raw: |
|
|
|
return False, 'Missing `protocolParam` option' |
|
|
|
if 'obfs' not in raw: |
|
|
|
return False, 'Missing `obfs` option' |
|
|
|
if 'obfsParam' not in raw: |
|
|
|
return False, 'Missing `obfsParam` option' |
|
|
|
|
|
|
|
if not isinstance(raw['server'], str): |
|
|
|
return False, 'Illegal `server` option' |
|
|
|
if not isinstance(raw['port'], int): |
|
|
|
return False, 'Illegal `int` option' |
|
|
|
if not isinstance(raw['method'], str): |
|
|
|
return False, 'Illegal `method` option' |
|
|
|
if not isinstance(raw['passwd'], str): |
|
|
|
return False, 'Illegal `passwd` option' |
|
|
|
if not isinstance(raw['protocol'], str): |
|
|
|
return False, 'Illegal `protocol` option' |
|
|
|
if not isinstance(raw['protocolParam'], str): |
|
|
|
return False, 'Illegal `protocolParam` option' |
|
|
|
if not isinstance(raw['obfs'], str): |
|
|
|
return False, 'Illegal `obfs` option' |
|
|
|
if not isinstance(raw['obfsParam'], str): |
|
|
|
return False, 'Illegal `obfsParam` option' |
|
|
|
except: |
|
|
|
return False, 'Unknown error' |
|
|
|
return True, None |
|
|
|
ssrFilterRules = { |
|
|
|
'rootObject': { |
|
|
|
'remark': { |
|
|
|
'optional': False, |
|
|
|
'default': '', |
|
|
|
'type': str |
|
|
|
}, |
|
|
|
'group': { |
|
|
|
'optional': False, |
|
|
|
'default': '', |
|
|
|
'type': str |
|
|
|
}, |
|
|
|
'server': { |
|
|
|
'optional': True, |
|
|
|
'type': str, |
|
|
|
'format': lambda s: s.lower().strip(), |
|
|
|
'filter': baseFunc.isHost, |
|
|
|
'errMsg': 'Illegal server address' |
|
|
|
}, |
|
|
|
'port': { |
|
|
|
'optional': True, |
|
|
|
'type': int, |
|
|
|
'format': lambda i: int(i), |
|
|
|
'filter': baseFunc.isPort, |
|
|
|
'errMsg': 'Illegal port number' |
|
|
|
}, |
|
|
|
'method': { |
|
|
|
'optional': True, |
|
|
|
'type': str, |
|
|
|
'format': lambda s: s.replace('_', '-').lower().strip(), |
|
|
|
'filter': lambda method: method in ssrMethodList, |
|
|
|
'errMsg': 'Unknown ShadowsocksR method' |
|
|
|
}, |
|
|
|
'passwd': { |
|
|
|
'optional': True, |
|
|
|
'type': str |
|
|
|
}, |
|
|
|
'protocol': { |
|
|
|
'optional': False, |
|
|
|
'default': 'origin', |
|
|
|
'type': str, |
|
|
|
'format': lambda s: s.replace('-', '_').lower().strip(), |
|
|
|
'filter': lambda method: method in ssrProtocolList, |
|
|
|
'errMsg': 'Unknown ShadowsocksR protocol' |
|
|
|
}, |
|
|
|
'protocolParam': { |
|
|
|
'optional': False, |
|
|
|
'default': '', |
|
|
|
'type': str |
|
|
|
}, |
|
|
|
'obfs': { |
|
|
|
'optional': False, |
|
|
|
'default': 'plain', |
|
|
|
'type': str, |
|
|
|
'format': lambda s: s.replace('-', '_').lower().strip(), |
|
|
|
'filter': lambda method: method in ssrObfsList, |
|
|
|
'errMsg': 'Unknown ShadowsocksR obfs' |
|
|
|
}, |
|
|
|
'obfsParam': { |
|
|
|
'optional': False, |
|
|
|
'default': '', |
|
|
|
'type': str |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
def ssrFilter(rawInfo: dict, isExtra: bool) -> tuple[bool, str or dict]: |
|
|
|
""" |
|
|
@ -159,62 +153,11 @@ def ssrFilter(rawInfo: dict, isExtra: bool) -> tuple[bool, str or dict]: |
|
|
|
} |
|
|
|
""" |
|
|
|
try: |
|
|
|
raw = rawInfo |
|
|
|
raw = __ssrFormat(__ssrFill(raw)) # 预处理 |
|
|
|
status, reason = __ssrParamCheck(raw) # 参数检查 |
|
|
|
if not status: # 参数有误 |
|
|
|
return False, reason |
|
|
|
|
|
|
|
result = {'type': 'ssr'} |
|
|
|
if isExtra: # 携带额外参数 |
|
|
|
if 'remark' not in raw: # 补全默认值 |
|
|
|
raw['remark'] = '' |
|
|
|
if 'group' not in raw: |
|
|
|
raw['group'] = '' |
|
|
|
if raw['remark'] is None: # 容错格式化 |
|
|
|
raw['remark'] = '' |
|
|
|
if raw['group'] is None: |
|
|
|
raw['group'] = '' |
|
|
|
if not isinstance(raw['remark'], str): # 参数检查 |
|
|
|
return False, 'Illegal `remark` option' |
|
|
|
if not isinstance(raw['group'], str): |
|
|
|
return False, 'Illegal `group` option' |
|
|
|
result['remark'] = raw['remark'] |
|
|
|
result['group'] = raw['group'] |
|
|
|
|
|
|
|
if baseFunc.isHost(raw['server']): |
|
|
|
result['server'] = raw['server'] # server |
|
|
|
else: |
|
|
|
return False, 'Illegal `server` option' |
|
|
|
if baseFunc.isPort(raw['port']): |
|
|
|
result['port'] = raw['port'] # port |
|
|
|
else: |
|
|
|
return False, 'Illegal `port` option' |
|
|
|
if raw['method'] in ssrMethodList: |
|
|
|
result['method'] = raw['method'] # method |
|
|
|
else: |
|
|
|
return False, 'Unknown ShadowsocksR method' |
|
|
|
result['passwd'] = raw['passwd'] # passwd |
|
|
|
|
|
|
|
if raw['protocol'] in ['', 'origin']: # 默认协议 |
|
|
|
result['protocol'] = 'origin' |
|
|
|
result['protocolParam'] = '' |
|
|
|
else: |
|
|
|
if raw['protocol'] in ssrProtocolList: |
|
|
|
result['protocol'] = raw['protocol'] |
|
|
|
result['protocolParam'] = raw['protocolParam'] |
|
|
|
else: |
|
|
|
return False, 'Unknown ShadowsocksR protocol' |
|
|
|
|
|
|
|
if raw['obfs'] in ['', 'plain']: # 默认混淆 |
|
|
|
result['obfs'] = 'plain' |
|
|
|
result['obfsParam'] = '' |
|
|
|
else: |
|
|
|
if raw['obfs'] in ssrObfsList: |
|
|
|
result['obfs'] = raw['obfs'] |
|
|
|
result['obfsParam'] = raw['obfsParam'] |
|
|
|
else: |
|
|
|
return False, 'Unknown ShadowsocksR obfs' |
|
|
|
if not isExtra: |
|
|
|
ssrFilterRules['rootObject'].pop('remark') |
|
|
|
ssrFilterRules['rootObject'].pop('group') |
|
|
|
return baseFunc.rulesFilter(rawInfo, ssrFilterRules, { |
|
|
|
'type': 'ssr' |
|
|
|
}) |
|
|
|
except: |
|
|
|
return False, 'Unknown error' |
|
|
|
return True, result |
|
|
|