fix: improve node filtering by client base_version, set subscription content-type, and add hop_interval support for hysteria2

- Refactor node filtering logic to correctly handle client base_version requirements.
- Set appropriate Content-Type header for subscription responses.
- Add support for hop_interval configuration in hysteria2 node delivery.
This commit is contained in:
xboard
2025-05-24 13:45:32 +08:00
parent a3700ad685
commit bf3a9112f2
12 changed files with 82 additions and 29 deletions
+2 -1
View File
@@ -91,7 +91,8 @@ class Clash extends AbstractProtocol
$yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
$yaml = str_replace('$app_name', admin_setting('app_name', 'XBoard'), $yaml);
return response($yaml, 200)
return response($yaml)
->header('content-type', 'text/yaml')
->header('subscription-userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}")
->header('profile-update-interval', '24')
->header('content-disposition', 'attachment;filename*=UTF-8\'\'' . rawurlencode($appName))
+2 -1
View File
@@ -154,7 +154,8 @@ class ClashMeta extends AbstractProtocol
$yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
$yaml = str_replace('$app_name', admin_setting('app_name', 'XBoard'), $yaml);
return response($yaml, 200)
return response($yaml)
->header('content-type', 'text/yaml')
->header('subscription-userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}")
->header('profile-update-interval', '24')
->header('content-disposition', 'attachment;filename*=UTF-8\'\'' . rawurlencode($appName));
+1 -1
View File
@@ -53,7 +53,7 @@ class General extends AbstractProtocol
$uri .= self::buildSocks($user['uuid'], $item);
}
}
return base64_encode($uri);
return response(base64_encode($uri))->header('content-type', 'text/plain');
}
public static function buildShadowsocks($password, $server)
+2 -1
View File
@@ -41,7 +41,8 @@ class Loon extends AbstractProtocol
$uri .= self::buildHysteria($user['uuid'], $item, $user);
}
}
return response($uri, 200)
return response($uri)
->header('content-type', 'text/plain')
->header('Subscription-Userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
}
+2 -1
View File
@@ -24,7 +24,8 @@ class QuantumultX extends AbstractProtocol
$uri .= self::buildTrojan($user['uuid'], $item);
}
}
return response(base64_encode($uri), 200)
return response(base64_encode($uri))
->header('content-type', 'text/plain')
->header('subscription-userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}");
}
+10 -2
View File
@@ -16,6 +16,9 @@ class Shadowrocket extends AbstractProtocol
'2' => '1993'
],
],
'anytls' => [
'base_version' => '2592'
],
],
];
@@ -54,7 +57,8 @@ class Shadowrocket extends AbstractProtocol
$uri .= self::buildAnyTLS($user['uuid'], $item);
}
}
return base64_encode($uri);
return response(base64_encode($uri))
->header('content-type', 'text/plain');
}
@@ -267,8 +271,12 @@ class Shadowrocket extends AbstractProtocol
$params['obfs-password'] = data_get($protocol_settings, 'obfs.password');
}
$params['insecure'] = data_get($protocol_settings, 'tls.allow_insecure');
if (isset($server['ports']))
if (isset($protocol_settings['hop_interval'])) {
$params['keepalive'] = $protocol_settings['hop_interval'];
}
if (isset($server['ports'])) {
$params['mport'] = $server['ports'];
}
$query = http_build_query($params);
$addr = Helper::wrapIPv6($server['host']);
+2 -1
View File
@@ -36,7 +36,8 @@ class Shadowsocks extends AbstractProtocol
$subs['bytes_remaining'] = $bytesRemaining;
$subs['servers'] = array_merge($subs['servers'], $configs);
return json_encode($subs, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
return response()->json($subs)
->header('content-type', 'application/json');
}
public static function SIP008($server, $user)
+13 -9
View File
@@ -48,6 +48,9 @@ class SingBox extends AbstractProtocol
],
'wireguard' => [
'base_version' => '1.5.0'
],
'anytls' => [
'base_version' => '1.12.0'
]
]
];
@@ -340,15 +343,16 @@ class SingBox extends AbstractProtocol
'insecure' => (bool) $protocol_settings['tls']['allow_insecure'],
]
];
Log::info($this->clientName);
Log::info($this->clientVersion);
// if (
// isset($server['ports'])
// && $this->clientName == 'sfm'
// && version_compare($this->clientVersion, '1.11.0', '>=')
// ) {
// $baseConfig['server_ports'][] = str_replace('-', ':', $server['ports']);
// }
// 支持 1.11.0 版本及以上 `server_ports` 和 `hop_interval` 配置
if ($this->supportsFeature('sing-box', '1.11.0')) {
if (isset($server['ports'])) {
$baseConfig['server_ports'] = [str_replace('-', ':', $server['ports'])];
}
if (isset($protocol_settings['hop_interval'])) {
$baseConfig['hop_interval'] = "{$protocol_settings['hop_interval']}s";
}
}
if ($serverName = data_get($protocol_settings, 'tls_settings.server_name')) {
$baseConfig['tls']['server_name'] = $serverName;
}
+2 -1
View File
@@ -149,7 +149,8 @@ class Stash extends AbstractProtocol
$yaml = Yaml::dump($config, 2, 4, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
$yaml = str_replace('$app_name', admin_setting('app_name', 'XBoard'), $yaml);
return response($yaml, 200)
return response($yaml)
->header('content-type', 'text/yaml')
->header('subscription-userinfo', "upload={$user['u']}; download={$user['d']}; total={$user['transfer_enable']}; expire={$user['expired_at']}")
->header('profile-update-interval', '24')
->header('content-disposition', 'attachment;filename*=UTF-8\'\'' . rawurlencode($appName));