171 lines
7.0 KiB
PHP
Executable File
171 lines
7.0 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services\Subscribe;
|
|
|
|
use App\Services\Subscribe;
|
|
use App\Utils\Tools;
|
|
use function array_filter;
|
|
use function array_merge;
|
|
use function json_decode;
|
|
use function json_encode;
|
|
|
|
final class SingBox extends Base
|
|
{
|
|
public function getContent($user): string
|
|
{
|
|
$nodes = [];
|
|
$singbox_config = $_ENV['SingBox_Config'];
|
|
$nodes_raw = Subscribe::getUserNodes($user);
|
|
|
|
foreach ($nodes_raw as $node_raw) {
|
|
$node_custom_config = json_decode($node_raw->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);
|
|
}
|
|
}
|