From b84b5f67b86fff1f7ba73a424a97ed8cca44f6d4 Mon Sep 17 00:00:00 2001 From: wyx2685 Date: Thu, 2 Nov 2023 13:18:42 +0900 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84Singbox=E8=AE=A2=E9=98=85?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E8=AE=A2=E9=98=85?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Protocols/Clash.php | 22 ++- app/Protocols/ClashMeta.php | 40 ++++-- app/Protocols/ClashVerge.php | 43 ++++-- app/Protocols/General.php | 30 +++- app/Protocols/Passwall.php | 38 +++++- app/Protocols/SSRPlus.php | 38 ++++-- app/Protocols/SagerNet.php | 57 +++++--- app/Protocols/Shadowrocket.php | 33 ++++- app/Protocols/Singbox.php | 243 ++++++++++++++++++++++++++------- app/Protocols/V2rayN.php | 36 +++-- app/Protocols/V2rayNG.php | 28 +++- 11 files changed, 461 insertions(+), 147 deletions(-) diff --git a/app/Protocols/Clash.php b/app/Protocols/Clash.php index b07552cb..bcd4f901 100644 --- a/app/Protocols/Clash.php +++ b/app/Protocols/Clash.php @@ -130,7 +130,7 @@ class Clash if ($server['network'] === 'tcp') { $tcpSettings = $server['networkSettings']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; - if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; + if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path']; } if ($server['network'] === 'ws') { $array['network'] = 'ws'; @@ -141,10 +141,6 @@ class Clash $array['ws-opts']['path'] = $wsSettings['path']; if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; - if (isset($wsSettings['path']) && !empty($wsSettings['path'])) - $array['ws-path'] = $wsSettings['path']; - if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) - $array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']]; } } if ($server['network'] === 'grpc') { @@ -226,6 +222,22 @@ class Clash $array['port'] = $server['port']; $array['password'] = $password; $array['udp'] = true; + if(in_array($server['network'], ["grpc", "ws"])){ + $array['network'] = $server['network']; + // grpc配置 + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName']; + } + // ws配置 + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $array['ws-opts']['path'] = $server['networkSettings']['path']; + } + if(isset($server['networkSettings']['headers']['Host'])){ + $array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host']; + } + } + }; if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); return $array; diff --git a/app/Protocols/ClashMeta.php b/app/Protocols/ClashMeta.php index b5abfa67..3457c67d 100644 --- a/app/Protocols/ClashMeta.php +++ b/app/Protocols/ClashMeta.php @@ -104,7 +104,7 @@ class ClashMeta $password = "{$serverKey}:{$userKey}"; } $array = []; - $array['name'] = $server['name']; + $array['name'] = rawurlencode($server['name']); $array['type'] = 'ss'; $array['server'] = $server['host']; $array['port'] = $server['port']; @@ -139,7 +139,7 @@ class ClashMeta if ($server['network'] === 'tcp') { $tcpSettings = $server['networkSettings']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; - if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; + if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path']; } if ($server['network'] === 'ws') { $array['network'] = 'ws'; @@ -150,10 +150,6 @@ class ClashMeta $array['ws-opts']['path'] = $wsSettings['path']; if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; - if (isset($wsSettings['path']) && !empty($wsSettings['path'])) - $array['ws-path'] = $wsSettings['path']; - if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) - $array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']]; } } if ($server['network'] === 'grpc') { @@ -176,12 +172,13 @@ class ClashMeta $array['server'] = $server['host']; $array['port'] = $server['port']; $array['uuid'] = $uuid; - $array['flow'] = !empty($server['flow']) ? $server['flow']: ""; - $array['client-fingerprint'] = 'chrome'; $array['udp'] = true; if ($server['tls']) { $array['tls'] = true; + $array['skip-cert-verify'] = isset($server['tls_settings']['allow_insecure']) && $server['tls_settings']['allow_insecure'] == 1 ? true : false; + $array['flow'] = !empty($server['flow']) ? $server['flow']: ""; + $array['client-fingerprint'] = !empty($server['fingerprint']) ? $server['fingerprint'] : 'chrome'; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) @@ -196,6 +193,8 @@ class ClashMeta if ($server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; + if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['network'] = $tcpSettings['header']['type']; + if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path']; } if ($server['network'] === 'ws') { @@ -207,10 +206,6 @@ class ClashMeta $array['ws-opts']['path'] = $wsSettings['path']; if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; - if (isset($wsSettings['path']) && !empty($wsSettings['path'])) - $array['ws-path'] = $wsSettings['path']; - if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) - $array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']]; } } if ($server['network'] === 'grpc') { @@ -243,6 +238,22 @@ class ClashMeta $array['port'] = $server['port']; $array['password'] = $password; $array['udp'] = true; + if(in_array($server['network'], ["grpc", "ws"])){ + $array['network'] = $server['network']; + // grpc配置 + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName']; + } + // ws配置 + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $array['ws-opts']['path'] = $server['networkSettings']['path']; + } + if(isset($server['networkSettings']['headers']['Host'])){ + $array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host']; + } + } + }; if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); return $array; @@ -255,6 +266,7 @@ class ClashMeta $array['server'] = $server['host']; $array['port'] = $server['port']; $array['udp'] = true; + $array['skip-cert-verify'] = $server['insecure'] == 1 ? true : false; if (isset($server['server_name'])) $array['sni'] = $server['server_name']; @@ -272,8 +284,8 @@ class ClashMeta $array['obfs'] = $server['obfs_password']; } //Todo:完善客户端上下行 - $array['up'] = $server['up_mbps']; - $array['down'] = $server['down_mbps']; + $array['up'] = $server['down_mbps']; + $array['down'] = $server['up_mbps']; $array['protocol'] = 'udp'; } diff --git a/app/Protocols/ClashVerge.php b/app/Protocols/ClashVerge.php index 94a87053..3d5bf303 100644 --- a/app/Protocols/ClashVerge.php +++ b/app/Protocols/ClashVerge.php @@ -139,7 +139,7 @@ class ClashVerge if ($server['network'] === 'tcp') { $tcpSettings = $server['networkSettings']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; - if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; + if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path']; } if ($server['network'] === 'ws') { $array['network'] = 'ws'; @@ -150,10 +150,7 @@ class ClashVerge $array['ws-opts']['path'] = $wsSettings['path']; if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; - if (isset($wsSettings['path']) && !empty($wsSettings['path'])) - $array['ws-path'] = $wsSettings['path']; - if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) - $array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']]; + } } if ($server['network'] === 'grpc') { @@ -176,12 +173,13 @@ class ClashVerge $array['server'] = $server['host']; $array['port'] = $server['port']; $array['uuid'] = $uuid; - $array['flow'] = !empty($server['flow']) ? $server['flow']: ""; - $array['client-fingerprint'] = 'chrome'; $array['udp'] = true; - + if ($server['tls']) { $array['tls'] = true; + $array['skip-cert-verify'] = isset($server['tls_settings']['allow_insecure']) && $server['tls_settings']['allow_insecure'] == 1 ? true : false; + $array['flow'] = !empty($server['flow']) ? $server['flow']: ""; + $array['client-fingerprint'] = !empty($server['fingerprint']) ? $server['fingerprint'] : 'chrome'; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) @@ -196,6 +194,8 @@ class ClashVerge if ($server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; + if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['network'] = $tcpSettings['header']['type']; + if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path']; } if ($server['network'] === 'ws') { @@ -207,10 +207,6 @@ class ClashVerge $array['ws-opts']['path'] = $wsSettings['path']; if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; - if (isset($wsSettings['path']) && !empty($wsSettings['path'])) - $array['ws-path'] = $wsSettings['path']; - if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) - $array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']]; } } if ($server['network'] === 'grpc') { @@ -242,6 +238,22 @@ class ClashVerge $array['port'] = $server['port']; $array['password'] = $password; $array['udp'] = true; + if(in_array($server['network'], ["grpc", "ws"])){ + $array['network'] = $server['network']; + // grpc配置 + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName']; + } + // ws配置 + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $array['ws-opts']['path'] = $server['networkSettings']['path']; + } + if(isset($server['networkSettings']['headers']['Host'])){ + $array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host']; + } + } + }; if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); return $array; @@ -254,7 +266,8 @@ class ClashVerge $array['server'] = $server['host']; $array['port'] = $server['port']; $array['udp'] = true; - + $array['skip-cert-verify'] = $server['insecure'] == 1 ? true : false; + if (isset($server['server_name'])) $array['sni'] = $server['server_name']; if ($server['version'] === 2) { @@ -271,8 +284,8 @@ class ClashVerge $array['obfs'] = $server['obfs_password']; } //Todo:完善客户端上下行 - $array['up'] = $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps']; - $array['down'] = $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps']; + $array['up'] = $server['down_mbps']; + $array['down'] = $server['up_mbps']; $array['protocol'] = 'udp'; } diff --git a/app/Protocols/General.php b/app/Protocols/General.php index b1b9dd91..feee6a2f 100644 --- a/app/Protocols/General.php +++ b/app/Protocols/General.php @@ -119,6 +119,7 @@ class General "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -128,7 +129,7 @@ class General $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -143,7 +144,8 @@ class General if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; @@ -180,7 +182,8 @@ class General if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -193,8 +196,23 @@ class General 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } @@ -215,7 +233,7 @@ class General 'auth' => $password, 'insecure' => $server['insecure'], 'peer' => $server['server_name'], - 'upmbps' => $server['up_mbps'], + 'upmbps' => $server['down_mbps'], 'downmbps' => $server['up_mbps'] ]); $uri .= $query; diff --git a/app/Protocols/Passwall.php b/app/Protocols/Passwall.php index b3938090..99778025 100644 --- a/app/Protocols/Passwall.php +++ b/app/Protocols/Passwall.php @@ -41,6 +41,16 @@ class Passwall public static function buildShadowsocks($password, $server) { + if ($server['cipher'] === '2022-blake3-aes-128-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 16); + $userKey = Helper::uuidToBase64($password, 16); + $password = "{$serverKey}:{$userKey}"; + } + if ($server['cipher'] === '2022-blake3-aes-256-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 32); + $userKey = Helper::uuidToBase64($password, 32); + $password = "{$serverKey}:{$userKey}"; + } $name = rawurlencode($server['name']); $str = str_replace( ['+', '/', '='], @@ -105,6 +115,7 @@ class Passwall "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -114,7 +125,7 @@ class Passwall $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -129,7 +140,8 @@ class Passwall if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; @@ -166,7 +178,8 @@ class Passwall if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -179,8 +192,23 @@ class Passwall 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } diff --git a/app/Protocols/SSRPlus.php b/app/Protocols/SSRPlus.php index 9144a668..02d93fe1 100644 --- a/app/Protocols/SSRPlus.php +++ b/app/Protocols/SSRPlus.php @@ -1,7 +1,7 @@ "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -108,7 +109,7 @@ class SSRPlus $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -123,14 +124,15 @@ class SSRPlus if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type']; if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']); $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; - } + } if ((string)$server['network'] === 'ws') { $wsSettings = $server['network_settings']; if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']); @@ -147,11 +149,11 @@ class SSRPlus $quicSettings = $server['network_settings']; if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security']; if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type']; - + $output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}"; - + if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']); - + $output .= "&key={$config['path']}"; } if ((string)$server['network'] === 'grpc') { @@ -160,7 +162,8 @@ class SSRPlus if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -173,8 +176,23 @@ class SSRPlus 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } diff --git a/app/Protocols/SagerNet.php b/app/Protocols/SagerNet.php index 73ad16c8..e2fa3089 100644 --- a/app/Protocols/SagerNet.php +++ b/app/Protocols/SagerNet.php @@ -40,30 +40,27 @@ class SagerNet return base64_encode($uri); } - public static function buildShadowsocks($uuid, $server) + public static function buildShadowsocks($password, $server) { + if ($server['cipher'] === '2022-blake3-aes-128-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 16); + $userKey = Helper::uuidToBase64($password, 16); + $password = "{$serverKey}:{$userKey}"; + } + if ($server['cipher'] === '2022-blake3-aes-256-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 32); + $userKey = Helper::uuidToBase64($password, 32); + $password = "{$serverKey}:{$userKey}"; + } $name = rawurlencode($server['name']); $str = str_replace( ['+', '/', '='], ['-', '_', ''], - base64_encode("{$server['cipher']}:{$uuid}") + base64_encode("{$server['cipher']}:{$password}") ); return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n"; } - public static function buildShadowsocksSIP008($uuid, $server) - { - $config = [ - "id" => $server['id'], - "remarks" => $server['name'], - "server" => $server['host'], - "server_port" => $server['port'], - "password" => $uuid, - "method" => $server['cipher'] - ]; - return $config; - } - public static function buildVmess($uuid, $server) { $config = [ @@ -111,6 +108,7 @@ class SagerNet "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -120,7 +118,7 @@ class SagerNet $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -135,7 +133,8 @@ class SagerNet if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; @@ -172,12 +171,13 @@ class SagerNet if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } - public static function buildTrojan($uuid, $server) + public static function buildTrojan($password, $server) { $name = rawurlencode($server['name']); $query = http_build_query([ @@ -185,8 +185,23 @@ class SagerNet 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$uuid}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } } diff --git a/app/Protocols/Shadowrocket.php b/app/Protocols/Shadowrocket.php index cc4e5997..f9313bce 100644 --- a/app/Protocols/Shadowrocket.php +++ b/app/Protocols/Shadowrocket.php @@ -142,6 +142,7 @@ class Shadowrocket "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -151,7 +152,7 @@ class Shadowrocket $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -166,7 +167,8 @@ class Shadowrocket if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; @@ -203,7 +205,8 @@ class Shadowrocket if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -213,10 +216,26 @@ class Shadowrocket $name = rawurlencode($server['name']); $query = http_build_query([ 'allowInsecure' => $server['allow_insecure'], - 'peer' => $server['server_name'] + 'peer' => $server['server_name'], + 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}&tfo=1#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } @@ -237,7 +256,7 @@ class Shadowrocket 'auth' => $password, 'insecure' => $server['insecure'], 'peer' => $server['server_name'], - 'upmbps' => $server['up_mbps'], + 'upmbps' => $server['down_mbps'], 'downmbps' => $server['up_mbps'] ]); $uri .= $query; diff --git a/app/Protocols/Singbox.php b/app/Protocols/Singbox.php index 12fc6f95..750d9791 100644 --- a/app/Protocols/Singbox.php +++ b/app/Protocols/Singbox.php @@ -3,6 +3,7 @@ namespace App\Protocols; use App\Models\ServerHysteria; use App\Models\User; +use App\Utils\Helper; class SingBox { @@ -56,17 +57,35 @@ class SingBox $outbounds[] = &$selector; foreach ($this->servers as $item) { + if ($item['type'] === 'shadowsocks') { + $ssConfig = $this->buildShadowsocks($this->user['uuid'], $item); + $outbounds[] = $ssConfig; + $selector['outbounds'][] = $item['name']; + $urltest['outbounds'][] = $item['name']; + } + if ($item['type'] === 'trojan') { + $trojanConfig = $this->buildTrojan($this->user['uuid'], $item); + $outbounds[] = $trojanConfig; + $selector['outbounds'][] = $item['name']; + $urltest['outbounds'][] = $item['name']; + } + if ($item['type'] === 'vmess') { + $vmessConfig = $this->buildVmess($this->user['uuid'], $item); + $outbounds[] = $vmessConfig; + $selector['outbounds'][] = $item['name']; + $urltest['outbounds'][] = $item['name']; + } if ($item['type'] === 'vless') { $vlessConfig = $this->buildVless($this->user['uuid'], $item); $outbounds[] = $vlessConfig; $selector['outbounds'][] = $item['name']; $urltest['outbounds'][] = $item['name']; - } elseif ($item['type'] === 'hysteria') { + } + if ($item['type'] === 'hysteria') { $hysteriaConfig = $this->buildHysteria($this->user['uuid'], $item, $this->user); $outbounds[] = $hysteriaConfig; - $tag = $item['version'] == 2 ? "Hy2" : "Hy"; - $selector['outbounds'][] = "[$tag]{$item['name']}"; - $urltest['outbounds'][] = "[$tag]{$item['name']}"; + $selector['outbounds'][] = $item['name']; + $urltest['outbounds'][] = $item['name']; } } @@ -78,58 +97,184 @@ class SingBox return $outbounds; } - /** - * Vless订阅 - */ - - protected function buildVless($password, $server) + protected function buildShadowsocks($password, $server) { - $tlsSettings = $server['tls_settings'] ?? []; - $tlsConfig = []; + if ($server['cipher'] === '2022-blake3-aes-128-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 16); + $userKey = Helper::uuidToBase64($password, 16); + $password = "{$serverKey}:{$userKey}"; + } + if ($server['cipher'] === '2022-blake3-aes-256-gcm') { + $serverKey = Helper::getServerKey($server['created_at'], 32); + $userKey = Helper::uuidToBase64($password, 32); + $password = "{$serverKey}:{$userKey}"; + } + $array = []; + $array['tag'] = $server['name']; + $array['type'] = 'shadowsocks'; + $array['server'] = $server['host']; + $array['server_port'] = $server['port']; + $array['method'] = $server['cipher']; + $array['password'] = $password; + + return $array; + } + + + protected function buildVmess($uuid, $server) + { + $array = []; + $array['tag'] = $server['name']; + $array['type'] = 'vmess'; + $array['server'] = $server['host']; + $array['server_port'] = $server['port']; + $array['uuid'] = $uuid; + $array['security'] = 'auto'; + $array['alterId'] = 0; + $array['transport']= []; if ($server['tls']) { + $tlsConfig = []; $tlsConfig['enabled'] = true; - - switch ($server['tls']) { - case 1: - $tlsConfig['insecure'] = (bool) ($tlsSettings['allowInsecure'] ?? false); - $tlsConfig['server_name'] = $tlsSettings['serverName'] ?? null; - break; - - case 2: - $tlsConfig['insecure'] = (bool) ($tlsSettings['allowInsecure'] ?? false); - $tlsConfig['server_name'] = $tlsSettings['server_name'] ?? null; - - if ( - isset($tlsSettings['public_key'], $tlsSettings['short_id']) && - !empty($tlsSettings['server_name']) - ) { - $tlsConfig['reality'] = [ - 'enabled' => true, - 'public_key' => $tlsSettings['public_key'], - 'short_id' => $tlsSettings['short_id'] - ]; - - $fingerprints = ['chrome', 'firefox', 'safari', 'ios', 'edge', 'qq']; - $tlsConfig['utls'] = [ - "enabled" => true, - "fingerprint" => $fingerprints[array_rand($fingerprints)] - ]; - } - break; + if ($server['tlsSettings']) { + $tlsSettings = $server['tlsSettings'] ?? []; + $tlsConfig['insecure'] = $tlsSettings['allowInsecure'] ? true : false; + $tlsConfig['server_name'] = $tlsSettings['serverName'] ?? null; + } + $array['tls'] = $tlsConfig; + } + if ($server['network'] === 'tcp') { + $tcpSettings = $server['networkSettings']; + if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['transport']['type'] = $tcpSettings['header']['type']; + if (isset($tcpSettings['header']['request']['path'])) $array['transport']['path'] = $tcpSettings['header']['request']['path']; + } + if ($server['network'] === 'ws') { + $array['transport']['type'] ='ws'; + if ($server['networkSettings']) { + $wsSettings = $server['networkSettings']; + if (isset($wsSettings['path']) && !empty($wsSettings['path'])) $array['transport']['path'] = $wsSettings['path']; + if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['transport']['headers'] = ['Host' => array($wsSettings['headers']['Host'])]; + $array['transport']['max_early_data'] = 2048; + $array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol'; + } + } + if ($server['network'] === 'grpc') { + $array['transport']['type'] ='grpc'; + if ($server['networkSettings']) { + $grpcSettings = $server['networkSettings']; + if (isset($grpcSettings['serviceName'])) $array['transport']['service_name'] = $grpcSettings['serviceName']; } } - return [ + return $array; + } + + protected function buildVless($password, $server) + { + $array = [ "type" => "vless", "tag" => $server['name'], "server" => $server['host'], "server_port" => $server['port'], "uuid" => $password, - "flow" => $server['flow'], - "packet_encoding" => "xudp", - "tls" => $tlsConfig + "packet_encoding" => "xudp" ]; + + $tlsSettings = $server['tls_settings'] ?? []; + + if ($server['tls']) { + $tlsConfig = []; + $tlsConfig['enabled'] = true; + $array['flow'] = !empty($server['flow']) ? $server['flow'] : ""; + $tlsSettings = $server['tls_settings'] ?? []; + if ($server['tls_settings']) { + $tlsConfig['insecure'] = isset($tlsSettings['allow_insecure']) && $tlsSettings['allow_insecure'] == 1 ? true : false; + $tlsConfig['server_name'] = $tlsSettings['server_name'] ?? null; + if ($server['tls'] == 2) { + $tlsConfig['reality'] = [ + 'enabled' => true, + 'public_key' => $tlsSettings['public_key'], + 'short_id' => $tlsSettings['short_id'] + ]; + } + $fingerprints = ['chrome', 'firefox', 'safari', 'ios', 'edge', 'qq']; + $tlsConfig['utls'] = [ + "enabled" => true, + "fingerprint" => $fingerprints[array_rand($fingerprints)] + ]; + } + $array['tls'] = $tlsConfig; + } + + if ($server['network'] === 'tcp') { + $tcpSettings = $server['network_settings']; + if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['transport']['type'] = $tcpSettings['header']['type']; + if (isset($tcpSettings['header']['request']['path'])) $array['transport']['path'] = $tcpSettings['header']['request']['path']; + } + if ($server['network'] === 'ws') { + $array['transport']['type'] ='ws'; + if ($server['network_settings']) { + $wsSettings = $server['network_settings']; + if (isset($wsSettings['path']) && !empty($wsSettings['path'])) $array['transport']['path'] = $wsSettings['path']; + if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['transport']['headers'] = ['Host' => array($wsSettings['headers']['Host'])]; + $array['transport']['max_early_data'] = 2048; + $array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol'; + } + } + if ($server['network'] === 'grpc') { + $array['transport']['type'] ='grpc'; + if ($server['network_settings']) { + $grpcSettings = $server['network_settings']; + if (isset($grpcSettings['serviceName'])) $array['transport']['service_name'] = $grpcSettings['serviceName']; + } + } + if ($server['network'] === 'h2') { + $array['transport']['type'] = 'http'; + if ($server['network_settings']) { + $h2Settings = $server['network_settings']; + if (isset($h2Settings['host'])) $array['transport']['host'] = array($h2Settings['host']); + if (isset($h2Settings['path'])) $array['transport']['path'] = $h2Settings['path']; + } + } + + return $array; + } + + protected function buildTrojan($password, $server) + { + $array = []; + $array['tag'] = $server['name']; + $array['type'] = 'trojan'; + $array['server'] = $server['host']; + $array['server_port'] = $server['port']; + $array['password'] = $password; + + $array['tls'] = [ + 'enabled' => true, + 'insecure' => $server['allow_insecure'] ? true : false, + 'server_name' => $server['server_name'] + ]; + + if(in_array($server['network'], ["grpc", "ws"])){ + $array['transport']['type'] = $server['network']; + // grpc配置 + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $array['transport']['service_name'] = $server['networkSettings']['serviceName']; + } + // ws配置 + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $array['transport']['path'] = $server['networkSettings']['path']; + } + if(isset($server['networkSettings']['headers']['Host'])){ + $array['transport']['headers'] = ['Host' => array($server['networkSettings']['headers']['Host'])]; + } + $array['transport']['max_early_data'] = 2048; + $array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol'; + } + }; + + return $array; } protected function buildHysteria($password, $server, $user) @@ -137,8 +282,6 @@ class SingBox $array = [ 'server' => $server['host'], 'server_port' => $server['port'], - //'up_mbps' => $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps'], - //'down_mbps' => $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps'], 'tls' => [ 'enabled' => true, 'insecure' => $server['insecure'] ? true : false, @@ -148,19 +291,19 @@ class SingBox if ($server['version'] == 1) { $array['auth_str'] = $password; - $array['tag'] = "[Hy]" . $server['name']; + $array['tag'] = $server['name']; $array['type'] = 'hysteria'; $array['up_mbps'] = $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps']; $array['down_mbps'] = $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps']; - if ($server['is_obfs']) { - $array['obfs'] = $server['server_key']; + if (isset($server['obfs']) && isset($server['obfs_password'])) { + $array['obfs'] = $server['obfs_password']; } $array['disable_mtu_discovery'] = true; - $array['tls']['alpn'] = [ServerHysteria::$alpnMap[$server['alpn']]]; + } elseif ($server['version'] == 2) { $array['password'] = $password; - $array['tag'] = "[Hy2]" . $server['name']; + $array['tag'] = $server['name']; $array['type'] = 'hysteria2'; $array['password'] = $password; diff --git a/app/Protocols/V2rayN.php b/app/Protocols/V2rayN.php index c3ed422e..d2f82573 100644 --- a/app/Protocols/V2rayN.php +++ b/app/Protocols/V2rayN.php @@ -116,6 +116,7 @@ class V2rayN "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -125,7 +126,7 @@ class V2rayN $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -140,14 +141,15 @@ class V2rayN if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type']; if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']); $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; - } + } if ((string)$server['network'] === 'ws') { $wsSettings = $server['network_settings']; if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']); @@ -164,11 +166,11 @@ class V2rayN $quicSettings = $server['network_settings']; if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security']; if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type']; - + $output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}"; - + if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']); - + $output .= "&key={$config['path']}"; } if ((string)$server['network'] === 'grpc') { @@ -177,7 +179,8 @@ class V2rayN if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -190,8 +193,23 @@ class V2rayN 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } diff --git a/app/Protocols/V2rayNG.php b/app/Protocols/V2rayNG.php index 9166fa60..4a1ad67e 100644 --- a/app/Protocols/V2rayNG.php +++ b/app/Protocols/V2rayNG.php @@ -115,6 +115,7 @@ class V2rayNG "mode" => "gun", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "flow" => $server['flow'], + "fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome', "sni" => "", "pbk" => "", "sid" =>"", @@ -124,7 +125,7 @@ class V2rayNG $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; if ($server['tls']) { - if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; + if ($config['flow'] != "") $output .= "&flow={$config['flow']}"; if ($server['tls_settings']) { $tlsSettings = $server['tls_settings']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; @@ -139,7 +140,8 @@ class V2rayNG if ((string)$server['network'] === 'tcp') { $tcpSettings = $server['network_settings']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; - $output .= "&headerType={$config['headerType']}"; + if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path']; + $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; } if ((string)$server['network'] === 'kcp') { $kcpSettings = $server['network_settings']; @@ -176,7 +178,8 @@ class V2rayNG if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; } - $output .= "&fp=chrome" . "#" . $config['name']; + + $output .= "&fp={$config['fp']}" . "#" . $config['name']; return $output . "\r\n"; } @@ -189,8 +192,23 @@ class V2rayNG 'peer' => $server['server_name'], 'sni' => $server['server_name'] ]); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; - $uri .= "\r\n"; + $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}"; + if(in_array($server['network'], ["grpc", "ws"])){ + $uri .= "&type={$server['network']}"; + if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) { + $uri .= "&path={$server['networkSettings']['serviceName']}"; + } + if($server['network'] === "ws") { + if(isset($server['networkSettings']['path'])) { + $uri .= "&path={$server['networkSettings']['path']}"; + } + if(isset($server['networkSettings']['headers']['Host'])) { + $uri .= "&host={$server['networkSettings']['headers']['Host']}"; + } + } + } + + $uri .= "#{$name}\r\n"; return $uri; } }