diff --git a/app/Protocols/General.php b/app/Protocols/General.php index 1a846f3..5c18caa 100644 --- a/app/Protocols/General.php +++ b/app/Protocols/General.php @@ -59,7 +59,8 @@ class General implements ProtocolInterface ['-', '_', ''], base64_encode("{$protocol_settings['cipher']}:{$password}") ); - return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n"; + $addr = Helper::wrapIPv6($server['host']); + return "ss://{$str}@{$addr}:{$server['port']}#{$name}\r\n"; } public static function buildVmess($uuid, $server) @@ -172,7 +173,7 @@ class General implements ProtocolInterface break; } - $user = $uuid . '@' . $host . ':' . $port; + $user = $uuid . '@' . Helper::wrapIPv6($host) . ':' . $port; $query = http_build_query($config); $fragment = urlencode($name); $link = sprintf("vless://%s?%s#%s\r\n", $user, $query, $fragment); @@ -207,7 +208,9 @@ class General implements ProtocolInterface break; } $query = http_build_query($array); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; + $addr = Helper::wrapIPv6($server['host']); + + $uri = "trojan://{$password}@{$addr}:{$server['port']}?{$query}#{$name}"; $uri .= "\r\n"; return $uri; } @@ -238,8 +241,9 @@ class General implements ProtocolInterface $query = http_build_query($params); $name = rawurlencode($server['name']); + $addr = Helper::wrapIPv6($server['host']); - $uri = "hysteria2://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; + $uri = "hysteria2://{$password}@{$addr}:{$server['port']}?{$query}#{$name}"; $uri .= "\r\n"; return $uri; diff --git a/app/Protocols/Shadowrocket.php b/app/Protocols/Shadowrocket.php index 213db7e..017b840 100644 --- a/app/Protocols/Shadowrocket.php +++ b/app/Protocols/Shadowrocket.php @@ -66,7 +66,9 @@ class Shadowrocket implements ProtocolInterface ['-', '_', ''], base64_encode("{$protocol_settings['cipher']}:{$password}") ); - $uri = "ss://{$str}@{$server['host']}:{$server['port']}"; + $addr = Helper::wrapIPv6($server['host']); + + $uri = "ss://{$str}@{$addr}:{$server['port']}"; if ($protocol_settings['obfs'] == 'http') { $obfs_host = data_get($protocol_settings, 'obfs_settings.obfs-host'); $obfs_path = data_get($protocol_settings, 'obfs_settings.obfs-path'); @@ -78,7 +80,7 @@ class Shadowrocket implements ProtocolInterface public static function buildVmess($uuid, $server) { $protocol_settings = $server['protocol_settings']; - $userinfo = base64_encode('auto:' . $uuid . '@' . $server['host'] . ':' . $server['port']); + $userinfo = base64_encode('auto:' . $uuid . '@' . Helper::wrapIPv6($server['host']) . ':' . $server['port']); $config = [ 'tfo' => 1, 'remark' => $server['name'], @@ -124,7 +126,7 @@ class Shadowrocket implements ProtocolInterface public static function buildVless($uuid, $server) { $protocol_settings = $server['protocol_settings']; - $userinfo = base64_encode('auto:' . $uuid . '@' . $server['host'] . ':' . $server['port']); + $userinfo = base64_encode('auto:' . $uuid . '@' . Helper::wrapIPv6($server['host']) . ':' . $server['port']); $config = [ 'tfo' => 1, 'remark' => $server['name'], @@ -213,7 +215,9 @@ class Shadowrocket implements ProtocolInterface break; } $query = http_build_query($params); - $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}&tfo=1#{$name}"; + $addr = Helper::wrapIPv6($server['host']); + + $uri = "trojan://{$password}@{$addr}:{$server['port']}?{$query}&tfo=1#{$name}"; $uri .= "\r\n"; return $uri; } @@ -241,7 +245,9 @@ class Shadowrocket implements ProtocolInterface if (isset($server['ports'])) $params['mport'] = $server['ports']; $query = http_build_query($params); - $uri = "hysteria://{$server['host']}:{$server['port']}?{$query}#{$server['name']}"; + $addr = Helper::wrapIPv6($server['host']); + + $uri = "hysteria://{$addr}:{$server['port']}?{$query}#{$server['name']}"; $uri .= "\r\n"; break; case 2: @@ -260,7 +266,9 @@ class Shadowrocket implements ProtocolInterface if (isset($server['ports'])) $params['mport'] = $server['ports']; $query = http_build_query($params); - $uri = "hysteria2://{$password}@{$server['host']}:{$server['port']}?{$query}#{$server['name']}"; + $addr = Helper::wrapIPv6($server['host']); + + $uri = "hysteria2://{$password}@{$addr}:{$server['port']}?{$query}#{$server['name']}"; $uri .= "\r\n"; break; } diff --git a/app/Utils/Helper.php b/app/Utils/Helper.php index f5a40dc..f974af8 100644 --- a/app/Utils/Helper.php +++ b/app/Utils/Helper.php @@ -72,6 +72,14 @@ class Helper return $str; } + public static function wrapIPv6($addr) { + if (filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + return "[$addr]"; + } else { + return $addr; + } + } + public static function multiPasswordVerify($algo, $salt, $password, $hash) { switch($algo) {