custom_config, true); switch ((int) $node_raw->sort) { case 0: $node = [ 'type' => 'shadowsocks', 'tag' => $node_raw->name, 'server' => $node_raw->server, 'server_port' => (int) $node_custom_config['offset_port_user'], 'method' => $user->method, 'password' => $user->passwd, ]; break; case 1: $ss_2022_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443); $method = $node_custom_config['method'] ?? '2022-blake3-aes-128-gcm'; $user_pk = Tools::genSs2022UserPk($user->passwd, $method); if (! $user_pk) { $node = []; break; } $server_key = $node_custom_config['server_key'] ?? ''; $node = [ 'type' => 'shadowsocks', 'tag' => $node_raw->name, 'server' => $node_raw->server, 'server_port' => (int) $ss_2022_port, 'method' => $method, 'password' => $server_key === '' ? $user_pk : $server_key . ':' .$user_pk, ]; break; case 2: $tuic_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443); $host = $node_custom_config['host'] ?? ''; $allow_insecure = $node_custom_config['allow_insecure'] ?? false; $congestion_control = $node_custom_config['congestion_control'] ?? 'bbr'; $node = [ 'type' => 'tuic', 'tag' => $node_raw->name, 'server' => $node_raw->server, 'server_port' => (int) $tuic_port, 'uuid' => $user->uuid, 'password' => $user->passwd, 'congestion_control' => $congestion_control, 'zero_rtt_handshake' => true, 'tls' => [ 'enabled' => true, 'server_name' => $host, 'insecure' => (bool) $allow_insecure, ], ]; $node['tls'] = array_filter($node['tls']); break; case 11: $v2_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443); $transport = ($node_custom_config['network'] ?? '') === 'tcp' ? '' : $node_custom_config['network']; $host = $node_custom_config['header']['request']['headers']['Host'][0] ?? $node_custom_config['host'] ?? ''; $path = $node_custom_config['header']['request']['path'][0] ?? $node_custom_config['path'] ?? ''; $headers = $node_custom_config['header']['request']['headers'] ?? []; $service_name = $node_custom_config['servicename'] ?? ''; $node = [ 'type' => 'vmess', 'tag' => $node_raw->name, 'server' => $node_raw->server, 'server_port' => (int) $v2_port, 'uuid' => $user->uuid, 'security' => 'auto', 'alter_id' => 0, 'tls' => [ 'server_name' => $host, ], 'transport' => [ 'type' => $transport, 'path' => $path, 'headers' => $headers, 'service_name' => $service_name, ], ]; $node['tls'] = array_filter($node['tls']); $node['transport'] = array_filter($node['transport']); break; case 14: $trojan_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443); $host = $node_custom_config['host'] ?? ''; $allow_insecure = $node_custom_config['allow_insecure'] ?? '0'; $transport = $node_custom_config['network'] ?? ''; $path = $node_custom_config['header']['request']['path'][0] ?? $node_custom_config['path'] ?? ''; $headers = $node_custom_config['header']['request']['headers'] ?? []; $service_name = $node_custom_config['servicename'] ?? ''; $node = [ 'type' => 'trojan', 'tag' => $node_raw->name, 'server' => $node_raw->server, 'server_port' => (int) $trojan_port, 'password' => $user->uuid, 'tls' => [ 'enabled' => true, 'server_name' => $host, 'insecure' => (bool) $allow_insecure, ], 'transport' => [ 'type' => $transport, 'path' => $path, 'headers' => $headers, 'service_name' => $service_name, ], ]; $node['tls'] = array_filter($node['tls']); $node['transport'] = array_filter($node['transport']); break; default: $node = []; break; } if ($node === []) { continue; } $nodes[] = $node; $singbox_config['outbounds'][0]['outbounds'][] = $node_raw->name; } $singbox_config['outbounds'] = array_merge($singbox_config['outbounds'], $nodes); $singbox_config['experimental']['cache_file']['cache_id'] = $_ENV['appName']; return json_encode($singbox_config); } }