diff --git a/app/Http/Controllers/Client/ClientController.php b/app/Http/Controllers/Client/ClientController.php index 2d19ae93..e8eb92d5 100644 --- a/app/Http/Controllers/Client/ClientController.php +++ b/app/Http/Controllers/Client/ClientController.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Controller; use App\Services\ServerService; use App\Utils\Clash; use App\Utils\QuantumultX; +use App\Utils\Shadowrocket; use App\Utils\Surge; use Illuminate\Http\Request; use App\Models\Server; @@ -41,6 +42,9 @@ class ClientController extends Controller if (strpos($_SERVER['HTTP_USER_AGENT'], 'surge') !== false) { die($this->surge($user, $servers['vmess'], $servers['trojan'])); } + if (strpos($_SERVER['HTTP_USER_AGENT'], 'shadowrocket') !== false) { + die($this->shadowrocket($user, $servers['vmess'], $servers['trojan'])); + } } die($this->origin($user, $servers['vmess'], $servers['trojan'])); } @@ -66,6 +70,20 @@ class ClientController extends Controller return base64_encode($uri); } + private function shadowrocket($user, $vmess = [], $trojan = []) + { + $uri = ''; + //TODO: display remaining traffic and expire date + //$uri .= 'STATUS=' . 'Traffic:' . 'Expiry:' . '\r\n'; + foreach ($vmess as $item) { + $uri .= Shadowrocket::buildVmess($user->uuid, $item); + } + foreach ($trojan as $item) { + $uri .= Shadowrocket::buildTrojan($user->uuid, $item); + } + return base64_encode($uri); + } + private function quantumultX($user, $vmess = [], $trojan = []) { $uri = ''; diff --git a/app/Utils/Clash.php b/app/Utils/Clash.php index 33159593..53a7aa40 100644 --- a/app/Utils/Clash.php +++ b/app/Utils/Clash.php @@ -15,6 +15,7 @@ class Clash $array['uuid'] = $uuid; $array['alterId'] = 2; $array['cipher'] = 'auto'; + $array['udp'] = true; if ($server->tls) { $tlsSettings = json_decode($server->tlsSettings); $array['tls'] = true; @@ -42,6 +43,7 @@ class Clash $array['server'] = $server->host; $array['port'] = $server->port; $array['password'] = $password; + $array['udp'] = true; $array['sni'] = $server->server_name; if ($server->allow_insecure) { $array['skip-cert-verify'] = true; diff --git a/app/Utils/Shadowrocket.php b/app/Utils/Shadowrocket.php new file mode 100644 index 00000000..b52315da --- /dev/null +++ b/app/Utils/Shadowrocket.php @@ -0,0 +1,43 @@ +host . ':' . $server->port); + $config = [ + 'remark' => $server->name + ]; + if ($server->tls) { + $tlsSettings = json_decode($server->tlsSettings); + $config['tls'] = 1; + if (isset($tlsSettings->serverName)) $config['peer'] = $tlsSettings->serverName; + if (isset($tlsSettings->allowInsecure)) $config['allowInsecure'] = 1; + } + if ($server->network === 'ws') { + $wsSettings = json_decode($server->networkSettings); + $config['obfs'] = "websocket"; + if (isset($wsSettings->path)) $config['path'] = $wsSettings->path; + if (isset($wsSettings->headers->Host)) $config['obfsParam'] = $wsSettings->headers->Host; + } + $query = http_build_query($config); + $uri = "vmess://{$userinfo}?{$query}&tfo=1"; + $uri .= "\r\n"; + return $uri; + } + + public static function buildTrojan($password, $server) + { + $server->name = rawurlencode($server->name); + $query = http_build_query([ + 'allowInsecure' => $server->allow_insecure, + 'peer' => $server->server_name + ]); + $uri = "trojan://{$password}@{$server->host}:{$server->port}?{$query}&tfo=1#{$server->name}"; + $uri .= "\r\n"; + return $uri; + } +}