mirror of https://github.com/dnomd343/ProxyC
				
				
			
				 5 changed files with 128 additions and 3 deletions
			
			
		| @ -0,0 +1,23 @@ | |||||
|  | #!/usr/bin/env python3 | ||||
|  | # -*- coding: utf-8 -*- | ||||
|  | 
 | ||||
|  | import json | ||||
|  | from Builder import Xray | ||||
|  | 
 | ||||
|  | def load(proxyInfo: dict, socksInfo: dict, configFile: str) -> tuple[list, str, dict]: | ||||
|  |     outboundConfig = { | ||||
|  |         'protocol': 'vless', | ||||
|  |         'settings': { | ||||
|  |             'vnext': [{ | ||||
|  |                 'address': proxyInfo['server'], | ||||
|  |                 'port': proxyInfo['port'], | ||||
|  |                 'users': [{**{ | ||||
|  |                     'id': proxyInfo['id'], | ||||
|  |                     'encryption': proxyInfo['method'] | ||||
|  |                 }, **Xray.xtlsFlow(proxyInfo['stream'])}] | ||||
|  |             }] | ||||
|  |         }, | ||||
|  |         'streamSettings': Xray.loadStream(proxyInfo['stream']) | ||||
|  |     } | ||||
|  |     vlessConfig = Xray.loadConfig(socksInfo, outboundConfig)  # load config file for xray-core | ||||
|  |     return ['xray', '-c', configFile], json.dumps(vlessConfig), {} | ||||
| @ -0,0 +1,79 @@ | |||||
|  | #!/usr/bin/env python3 | ||||
|  | # -*- coding: utf-8 -*- | ||||
|  | 
 | ||||
|  | from Builder import V2ray | ||||
|  | 
 | ||||
|  | loadConfig = V2ray.loadConfig  # same basic config format | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def loadSecure(secureInfo: dict or None) -> dict:  # TLS / XTLS encrypt config | ||||
|  |     if secureInfo is None: | ||||
|  |         return {'security': 'none'}  # without TLS / XTLS options | ||||
|  |     if secureInfo['type'] not in ['tls', 'xtls']: | ||||
|  |         raise RuntimeError('Unknown secure type') | ||||
|  |     secureObject = { | ||||
|  |         'allowInsecure': not secureInfo['verify']  # whether verify server's certificate | ||||
|  |     } | ||||
|  |     if secureInfo['alpn'] is not None: | ||||
|  |         secureObject['alpn'] = secureInfo['alpn'].split(',')  # multi-alpn like `h2,http/1.1` | ||||
|  |     if secureInfo['sni'] != '': | ||||
|  |         secureObject['serverName'] = secureInfo['sni']  # SNI field in TLS / XTLS protocol | ||||
|  |     return { | ||||
|  |         'security': secureInfo['type'], | ||||
|  |         '%sSettings' % secureInfo['type']: secureObject | ||||
|  |     } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def wsStream(streamInfo: dict) -> dict:  # WebSocket stream config (different ed config with v2fly-core) | ||||
|  |     wsObject = { | ||||
|  |         'path': streamInfo['path']  # websocket connection path | ||||
|  |     } | ||||
|  |     if streamInfo['host'] != '':  # empty host should not be set | ||||
|  |         wsObject['headers'] = {} | ||||
|  |         wsObject['headers']['Host'] = streamInfo['host'] | ||||
|  |     if streamInfo['ed'] is not None:  # ed value into uri path -> /...?ed=xxx | ||||
|  |         if wsObject['path'].find('?') == -1:  # no params in raw path | ||||
|  |             wsObject['path'] += '?ed=' + str(streamInfo['ed']) | ||||
|  |         else: | ||||
|  |             wsObject['path'] += '&ed=' + str(streamInfo['ed']) | ||||
|  |     return { | ||||
|  |         'network': 'ws', | ||||
|  |         'wsSettings': wsObject | ||||
|  |     } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def loadStream(streamInfo: dict) -> dict: | ||||
|  |     streamEntry = { | ||||
|  |         'tcp': V2ray.tcpStream, | ||||
|  |         'kcp': V2ray.kcpStream, | ||||
|  |         'ws': wsStream,  # different with v2fly-core | ||||
|  |         'h2': V2ray.h2Stream, | ||||
|  |         'quic': V2ray.quicStream, | ||||
|  |         'grpc': V2ray.grpcStream, | ||||
|  |     } | ||||
|  |     if streamInfo['type'] not in streamEntry: | ||||
|  |         raise RuntimeError('Unknown stream type') | ||||
|  |     streamObject = streamEntry[streamInfo['type']](streamInfo) | ||||
|  |     return { | ||||
|  |         **streamObject, | ||||
|  |         **loadSecure(streamInfo['secure']) | ||||
|  |     } | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | def xtlsFlow(streamInfo: dict or None) -> dict: | ||||
|  |     if streamInfo['secure'] is not None:  # without TLS / XTLS options | ||||
|  |         return {} | ||||
|  |     if streamInfo['secure']['type'] != 'xtls':  # not XTLS secure type | ||||
|  |         return {} | ||||
|  |     xtlsFlows = { | ||||
|  |         'xtls-origin': 'xtls-rprx-origin', | ||||
|  |         'xtls-direct': 'xtls-rprx-direct', | ||||
|  |         'xtls-splice': 'xtls-rprx-splice', | ||||
|  |     } | ||||
|  |     if streamInfo['secure']['flow'] not in xtlsFlows: | ||||
|  |         raise RuntimeError('Unknown xtls flow') | ||||
|  |     return { | ||||
|  |         'flow': xtlsFlows[streamInfo['secure']['flow']] + (  # xtls-rprx-xxx | ||||
|  |             '-udp443' if streamInfo['secure']['udp443'] else ''  # whether block udp/443 (disable http/3) | ||||
|  |         ) | ||||
|  |     } | ||||
					Loading…
					
					
				
		Reference in new issue