mirror of
				https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
				synced 2025-10-31 13:41:07 +08:00 
			
		
		
		
	feat: 支持 VLESS spx 参数; 支持 Trojan 结合 REALITY/XHTTP
This commit is contained in:
		
							parent
							
								
									74ec133a79
								
							
						
					
					
						commit
						afb5f7b880
					
				| @ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "sub-store", |   "name": "sub-store", | ||||||
|   "version": "2.16.25", |   "version": "2.16.26", | ||||||
|   "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", |   "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", | ||||||
|   "main": "src/main.js", |   "main": "src/main.js", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|  | |||||||
| @ -529,6 +529,9 @@ function URI_VLESS() { | |||||||
|             if (params.sid) { |             if (params.sid) { | ||||||
|                 opts['short-id'] = params.sid; |                 opts['short-id'] = params.sid; | ||||||
|             } |             } | ||||||
|  |             if (params.spx) { | ||||||
|  |                 opts['_spider-x'] = params.spx; | ||||||
|  |             } | ||||||
|             if (Object.keys(opts).length > 0) { |             if (Object.keys(opts).length > 0) { | ||||||
|                 // proxy[`${params.security}-opts`] = opts;
 |                 // proxy[`${params.security}-opts`] = opts;
 | ||||||
|                 proxy[`${params.security}-opts`] = opts; |                 proxy[`${params.security}-opts`] = opts; | ||||||
| @ -596,8 +599,12 @@ function URI_VLESS() { | |||||||
|                 // mKCP 的伪装头部类型。当前可选值有 none / srtp / utp / wechat-video / dtls / wireguard。省略时默认值为 none,即不使用伪装头部,但不可以为空字符串。
 |                 // mKCP 的伪装头部类型。当前可选值有 none / srtp / utp / wechat-video / dtls / wireguard。省略时默认值为 none,即不使用伪装头部,但不可以为空字符串。
 | ||||||
|                 proxy.headerType = params.headerType || 'none'; |                 proxy.headerType = params.headerType || 'none'; | ||||||
|             } |             } | ||||||
|  | 
 | ||||||
|  |             if (params.mode) { | ||||||
|  |                 proxy._mode = params.mode; | ||||||
|  |             } | ||||||
|             if (params.extra) { |             if (params.extra) { | ||||||
|                 proxy.extra = params.extra; |                 proxy._extra = params.extra; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -80,6 +80,9 @@ port = digits:[0-9]+ { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| params = "?" head:param tail:("&"@param)* { | params = "?" head:param tail:("&"@param)* { | ||||||
|  |   for (const [key, value] of Object.entries(params)) { | ||||||
|  |     params[key] = decodeURIComponent(value); | ||||||
|  |   } | ||||||
|   proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); |   proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); | ||||||
|   proxy.sni = params["sni"] || params["peer"]; |   proxy.sni = params["sni"] || params["peer"]; | ||||||
|   proxy['client-fingerprint'] = params.fp; |   proxy['client-fingerprint'] = params.fp; | ||||||
| @ -115,6 +118,27 @@ params = "?" head:param tail:("&"@param)* { | |||||||
|         $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true);  |         $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true);  | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     if (['reality'].includes(params.security)) { | ||||||
|  |       const opts = {}; | ||||||
|  |       if (params.pbk) { | ||||||
|  |         opts['public-key'] = params.pbk; | ||||||
|  |       } | ||||||
|  |       if (params.sid) { | ||||||
|  |         opts['short-id'] = params.sid; | ||||||
|  |       } | ||||||
|  |       if (params.spx) { | ||||||
|  |         opts['_spider-x'] = params.spx; | ||||||
|  |       } | ||||||
|  |       if (params.mode) { | ||||||
|  |         proxy._mode = params.mode; | ||||||
|  |       } | ||||||
|  |       if (params.extra) { | ||||||
|  |         proxy._extra = params.extra; | ||||||
|  |       } | ||||||
|  |       if (Object.keys(opts).length > 0) { | ||||||
|  |         $set(proxy, params.security+"-opts", opts);  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   proxy.udp = toBool(params["udp"]); |   proxy.udp = toBool(params["udp"]); | ||||||
|  | |||||||
| @ -78,6 +78,9 @@ port = digits:[0-9]+ { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| params = "?" head:param tail:("&"@param)* { | params = "?" head:param tail:("&"@param)* { | ||||||
|  |   for (const [key, value] of Object.entries(params)) { | ||||||
|  |     params[key] = decodeURIComponent(value); | ||||||
|  |   } | ||||||
|   proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); |   proxy["skip-cert-verify"] = toBool(params["allowInsecure"]); | ||||||
|   proxy.sni = params["sni"] || params["peer"]; |   proxy.sni = params["sni"] || params["peer"]; | ||||||
|   proxy['client-fingerprint'] = params.fp; |   proxy['client-fingerprint'] = params.fp; | ||||||
| @ -113,6 +116,27 @@ params = "?" head:param tail:("&"@param)* { | |||||||
|         $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true);  |         $set(proxy, proxy.network+"-opts.v2ray-http-upgrade-fast-open", true);  | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     if (['reality'].includes(params.security)) { | ||||||
|  |       const opts = {}; | ||||||
|  |       if (params.pbk) { | ||||||
|  |         opts['public-key'] = params.pbk; | ||||||
|  |       } | ||||||
|  |       if (params.sid) { | ||||||
|  |         opts['short-id'] = params.sid; | ||||||
|  |       } | ||||||
|  |       if (params.spx) { | ||||||
|  |         opts['_spider-x'] = params.spx; | ||||||
|  |       } | ||||||
|  |       if (params.mode) { | ||||||
|  |         proxy._mode = params.mode; | ||||||
|  |       } | ||||||
|  |       if (params.extra) { | ||||||
|  |         proxy._extra = params.extra; | ||||||
|  |       } | ||||||
|  |       if (Object.keys(opts).length > 0) { | ||||||
|  |         $set(proxy, params.security+"-opts", opts);  | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   proxy.udp = toBool(params["udp"]); |   proxy.udp = toBool(params["udp"]); | ||||||
|  | |||||||
| @ -149,6 +149,7 @@ export default function URI_Producer() { | |||||||
|                 const isReality = proxy['reality-opts']; |                 const isReality = proxy['reality-opts']; | ||||||
|                 let sid = ''; |                 let sid = ''; | ||||||
|                 let pbk = ''; |                 let pbk = ''; | ||||||
|  |                 let spx = ''; | ||||||
|                 if (isReality) { |                 if (isReality) { | ||||||
|                     security = 'reality'; |                     security = 'reality'; | ||||||
|                     const publicKey = proxy['reality-opts']?.['public-key']; |                     const publicKey = proxy['reality-opts']?.['public-key']; | ||||||
| @ -159,6 +160,10 @@ export default function URI_Producer() { | |||||||
|                     if (shortId) { |                     if (shortId) { | ||||||
|                         sid = `&sid=${encodeURIComponent(shortId)}`; |                         sid = `&sid=${encodeURIComponent(shortId)}`; | ||||||
|                     } |                     } | ||||||
|  |                     const spiderX = proxy['reality-opts']?.['_spider-x']; | ||||||
|  |                     if (spiderX) { | ||||||
|  |                         spx = `&spx=${encodeURIComponent(spiderX)}`; | ||||||
|  |                     } | ||||||
|                 } else if (proxy.tls) { |                 } else if (proxy.tls) { | ||||||
|                     security = 'tls'; |                     security = 'tls'; | ||||||
|                 } |                 } | ||||||
| @ -189,8 +194,12 @@ export default function URI_Producer() { | |||||||
|                     flow = `&flow=${encodeURIComponent(proxy.flow)}`; |                     flow = `&flow=${encodeURIComponent(proxy.flow)}`; | ||||||
|                 } |                 } | ||||||
|                 let extra = ''; |                 let extra = ''; | ||||||
|                 if (proxy.extra) { |                 if (proxy._extra) { | ||||||
|                     extra = `&extra=${encodeURIComponent(proxy.extra)}`; |                     extra = `&extra=${encodeURIComponent(proxy._extra)}`; | ||||||
|  |                 } | ||||||
|  |                 let mode = ''; | ||||||
|  |                 if (proxy._mode) { | ||||||
|  |                     mode = `&mode=${encodeURIComponent(proxy._mode)}`; | ||||||
|                 } |                 } | ||||||
|                 let vlessType = proxy.network; |                 let vlessType = proxy.network; | ||||||
|                 if ( |                 if ( | ||||||
| @ -258,7 +267,7 @@ export default function URI_Producer() { | |||||||
|                     proxy.port |                     proxy.port | ||||||
|                 }?security=${encodeURIComponent( |                 }?security=${encodeURIComponent( | ||||||
|                     security, |                     security, | ||||||
|                 )}${vlessTransport}${alpn}${allowInsecure}${sni}${fp}${flow}${sid}${pbk}${extra}#${encodeURIComponent( |                 )}${vlessTransport}${alpn}${allowInsecure}${sni}${fp}${flow}${sid}${spx}${pbk}${mode}${extra}#${encodeURIComponent( | ||||||
|                     proxy.name, |                     proxy.name, | ||||||
|                 )}`;
 |                 )}`;
 | ||||||
|                 break; |                 break; | ||||||
| @ -328,11 +337,41 @@ export default function URI_Producer() { | |||||||
|                             : proxy.alpn.join(','), |                             : proxy.alpn.join(','), | ||||||
|                     )}`;
 |                     )}`;
 | ||||||
|                 } |                 } | ||||||
|  |                 const trojanIsReality = proxy['reality-opts']; | ||||||
|  |                 let trojanSid = ''; | ||||||
|  |                 let trojanPbk = ''; | ||||||
|  |                 let trojanSpx = ''; | ||||||
|  |                 let trojanSecurity = ''; | ||||||
|  |                 let trojanMode = ''; | ||||||
|  |                 let trojanExtra = ''; | ||||||
|  |                 if (trojanIsReality) { | ||||||
|  |                     trojanSecurity = `&security=reality`; | ||||||
|  |                     const publicKey = proxy['reality-opts']?.['public-key']; | ||||||
|  |                     if (publicKey) { | ||||||
|  |                         trojanPbk = `&pbk=${encodeURIComponent(publicKey)}`; | ||||||
|  |                     } | ||||||
|  |                     const shortId = proxy['reality-opts']?.['short-id']; | ||||||
|  |                     if (shortId) { | ||||||
|  |                         trojanSid = `&sid=${encodeURIComponent(shortId)}`; | ||||||
|  |                     } | ||||||
|  |                     const spiderX = proxy['reality-opts']?.['_spider-x']; | ||||||
|  |                     if (spiderX) { | ||||||
|  |                         trojanSpx = `&spx=${encodeURIComponent(spiderX)}`; | ||||||
|  |                     } | ||||||
|  |                     if (proxy._extra) { | ||||||
|  |                         trojanExtra = `&extra=${encodeURIComponent( | ||||||
|  |                             proxy._extra, | ||||||
|  |                         )}`;
 | ||||||
|  |                     } | ||||||
|  |                     if (proxy._mode) { | ||||||
|  |                         trojanMode = `&mode=${encodeURIComponent(proxy._mode)}`; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|                 result = `trojan://${proxy.password}@${proxy.server}:${ |                 result = `trojan://${proxy.password}@${proxy.server}:${ | ||||||
|                     proxy.port |                     proxy.port | ||||||
|                 }?sni=${encodeURIComponent(proxy.sni || proxy.server)}${ |                 }?sni=${encodeURIComponent(proxy.sni || proxy.server)}${ | ||||||
|                     proxy['skip-cert-verify'] ? '&allowInsecure=1' : '' |                     proxy['skip-cert-verify'] ? '&allowInsecure=1' : '' | ||||||
|                 }${trojanTransport}${trojanAlpn}${trojanFp}#${encodeURIComponent( |                 }${trojanTransport}${trojanAlpn}${trojanFp}${trojanSecurity}${trojanSid}${trojanPbk}${trojanSpx}${trojanMode}${trojanExtra}#${encodeURIComponent( | ||||||
|                     proxy.name, |                     proxy.name, | ||||||
|                 )}`;
 |                 )}`;
 | ||||||
|                 break; |                 break; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 xream
						xream