mirror of https://github.com/dnomd343/ProxyC
				
				
			
				 5 changed files with 181 additions and 4 deletions
			
			
		@ -0,0 +1,159 @@ | 
				
			|||||
 | 
					#!/usr/bin/python | 
				
			||||
 | 
					# -*- coding:utf-8 -*- | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from ProxyFilter import baseFunc | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					ssrMethodList = [ | 
				
			||||
 | 
					    "aes-128-cfb", | 
				
			||||
 | 
					    "aes-192-cfb", | 
				
			||||
 | 
					    "aes-256-cfb", | 
				
			||||
 | 
					    "aes-128-cfb1", | 
				
			||||
 | 
					    "aes-192-cfb1", | 
				
			||||
 | 
					    "aes-256-cfb1", | 
				
			||||
 | 
					    "aes-128-cfb8", | 
				
			||||
 | 
					    "aes-192-cfb8", | 
				
			||||
 | 
					    "aes-256-cfb8", | 
				
			||||
 | 
					    "aes-128-ctr", | 
				
			||||
 | 
					    "aes-192-ctr", | 
				
			||||
 | 
					    "aes-256-ctr", | 
				
			||||
 | 
					    "aes-128-gcm", | 
				
			||||
 | 
					    "aes-192-gcm", | 
				
			||||
 | 
					    "aes-256-gcm", | 
				
			||||
 | 
					    "aes-128-ofb", | 
				
			||||
 | 
					    "aes-192-ofb", | 
				
			||||
 | 
					    "aes-256-ofb", | 
				
			||||
 | 
					    "camellia-128-cfb", | 
				
			||||
 | 
					    "camellia-192-cfb", | 
				
			||||
 | 
					    "camellia-256-cfb", | 
				
			||||
 | 
					    "none", | 
				
			||||
 | 
					    "table", | 
				
			||||
 | 
					    "rc4", | 
				
			||||
 | 
					    "rc4-md5", | 
				
			||||
 | 
					    "rc4-md5-6", | 
				
			||||
 | 
					    "bf-cfb", | 
				
			||||
 | 
					    "cast5-cfb", | 
				
			||||
 | 
					    "des-cfb", | 
				
			||||
 | 
					    "idea-cfb", | 
				
			||||
 | 
					    "seed-cfb", | 
				
			||||
 | 
					    "rc2-cfb", | 
				
			||||
 | 
					    "salsa20", | 
				
			||||
 | 
					    "xsalsa20", | 
				
			||||
 | 
					    "chacha20", | 
				
			||||
 | 
					    "xchacha20", | 
				
			||||
 | 
					    "chacha20-ietf", | 
				
			||||
 | 
					] | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					ssrProtocolList = [ | 
				
			||||
 | 
					    "origin", | 
				
			||||
 | 
					    "verify_sha1", | 
				
			||||
 | 
					    "verify_simple", | 
				
			||||
 | 
					    "verify_deflate", | 
				
			||||
 | 
					    "auth_simple", | 
				
			||||
 | 
					    "auth_sha1", | 
				
			||||
 | 
					    "auth_sha1_v2", | 
				
			||||
 | 
					    "auth_sha1_v4", | 
				
			||||
 | 
					    "auth_aes128", | 
				
			||||
 | 
					    "auth_aes128_md5", | 
				
			||||
 | 
					    "auth_aes128_sha1", | 
				
			||||
 | 
					    "auth_chain_a", | 
				
			||||
 | 
					    "auth_chain_b", | 
				
			||||
 | 
					    "auth_chain_c", | 
				
			||||
 | 
					    "auth_chain_d", | 
				
			||||
 | 
					    "auth_chain_e", | 
				
			||||
 | 
					    "auth_chain_f", | 
				
			||||
 | 
					] | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					ssrObfsList = [ | 
				
			||||
 | 
					    "plain", | 
				
			||||
 | 
					    "http_post", | 
				
			||||
 | 
					    "http_simple", | 
				
			||||
 | 
					    "tls_simple", | 
				
			||||
 | 
					    "tls1.2_ticket_auth", | 
				
			||||
 | 
					    "tls1.2_ticket_fastauth", | 
				
			||||
 | 
					    "random_head", | 
				
			||||
 | 
					] | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					def __ssrFormat(raw): # 容错性格式化 | 
				
			||||
 | 
					    try: | 
				
			||||
 | 
					        raw['server'] = raw['server'].strip() | 
				
			||||
 | 
					        raw['port'] = int(raw['port']) | 
				
			||||
 | 
					        raw['method'] = raw['method'].replace('_', '-').lower().strip() | 
				
			||||
 | 
					        if 'protocol' in raw: | 
				
			||||
 | 
					            raw['protocol'] = raw['protocol'].replace('-', '_').lower().strip() | 
				
			||||
 | 
					        if 'obfs' in raw: | 
				
			||||
 | 
					            raw['obfs'] = raw['obfs'].replace('-', '_').lower().strip() | 
				
			||||
 | 
					    except: | 
				
			||||
 | 
					        pass | 
				
			||||
 | 
					    return raw | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					def ssrFilter(raw): | 
				
			||||
 | 
					    ''' | 
				
			||||
 | 
					    ShadowsocksR节点合法性检查 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        不合法: | 
				
			||||
 | 
					            return False, {reason} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        合法: | 
				
			||||
 | 
					            return True, { | 
				
			||||
 | 
					                'type': 'ssr', | 
				
			||||
 | 
					                'server': '...', | 
				
			||||
 | 
					                'port': ..., | 
				
			||||
 | 
					                'password': '...', | 
				
			||||
 | 
					                'method": '...', | 
				
			||||
 | 
					                'protocol': '...', | 
				
			||||
 | 
					                'protocolParam': '...', | 
				
			||||
 | 
					                'obfs': '...', | 
				
			||||
 | 
					                'obfsParam': '...' | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					    ''' | 
				
			||||
 | 
					    try: | 
				
			||||
 | 
					        result = {} | 
				
			||||
 | 
					        result['type'] = 'ssr' | 
				
			||||
 | 
					        raw = __ssrFormat(raw) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if not 'server' in raw: | 
				
			||||
 | 
					            return False, 'Missing `server` option' | 
				
			||||
 | 
					        if not 'port' in raw: | 
				
			||||
 | 
					            return False, 'Missing `port` option' | 
				
			||||
 | 
					        if not 'password' in raw: | 
				
			||||
 | 
					            return False, 'Missing `password` option' | 
				
			||||
 | 
					        if not 'method' in raw: | 
				
			||||
 | 
					            return False, 'Missing `method` option' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if baseFunc.isHost(raw['server']): | 
				
			||||
 | 
					            result['server'] = raw['server'] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            return False, 'Illegal `server` option' | 
				
			||||
 | 
					        if baseFunc.isPort(raw['port']): | 
				
			||||
 | 
					            result['port'] = raw['port'] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            return False, 'Illegal `port` option' | 
				
			||||
 | 
					        result['password'] = raw['password'] | 
				
			||||
 | 
					        if raw['method'] in ssrMethodList: | 
				
			||||
 | 
					            result['method'] = raw['method'] | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            return False, 'Unknown ShadowsocksR method' | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        if (not 'protocol' in raw) or raw['protocol'] == 'origin' or raw['protocol'] == '': | 
				
			||||
 | 
					            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 (not 'obfs' in raw) or raw['obfs'] == 'plain' or raw['obfs'] == '': | 
				
			||||
 | 
					            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' | 
				
			||||
 | 
					    except: | 
				
			||||
 | 
					        return False, 'Unknown error' | 
				
			||||
 | 
					    return True, result | 
				
			||||
					Loading…
					
					
				
		Reference in new issue