Fix REALITY share links missing SNI

This commit is contained in:
Puya 2026-05-28 16:49:37 +02:00
parent c5dc84d314
commit de2eb9236e

View file

@ -358,13 +358,14 @@ export function genVlessLink(input: GenVlessLinkInput): string {
const reality = stream.realitySettings; const reality = stream.realitySettings;
params.set('pbk', reality.settings.publicKey); params.set('pbk', reality.settings.publicKey);
params.set('fp', reality.settings.fingerprint); params.set('fp', reality.settings.fingerprint);
// Legacy parity quirk: the old class stored realitySettings.serverNames
// as a comma-joined string and gated SNI on `!ObjectUtil.isArrEmpty(s)` const sni =
// — which returns true for any string, so SNI was never written into reality.settings.serverName ||
// Reality share links. Existing deployed clients rely on receiving reality.serverNames?.[0] ||
// the SNI from realitySettings.target instead; we keep the omission reality.target?.split(':')[0];
// here so this extraction stays byte-stable with the legacy URL.
// Fixing the bug is a separate intentional commit. if (sni && sni.length > 0) params.set('sni', sni);
if (reality.shortIds.length > 0) params.set('sid', reality.shortIds[0]); if (reality.shortIds.length > 0) params.set('sid', reality.shortIds[0]);
if (reality.settings.spiderX.length > 0) params.set('spx', reality.settings.spiderX); if (reality.settings.spiderX.length > 0) params.set('spx', reality.settings.spiderX);
if (reality.settings.mldsa65Verify.length > 0) params.set('pqv', reality.settings.mldsa65Verify); if (reality.settings.mldsa65Verify.length > 0) params.set('pqv', reality.settings.mldsa65Verify);
@ -436,6 +437,14 @@ function writeRealityParams(stream: NonNullable<Inbound['streamSettings']>, para
const reality = stream.realitySettings; const reality = stream.realitySettings;
params.set('pbk', reality.settings.publicKey); params.set('pbk', reality.settings.publicKey);
params.set('fp', reality.settings.fingerprint); params.set('fp', reality.settings.fingerprint);
const sni =
reality.settings.serverName ||
reality.serverNames?.[0] ||
reality.target?.split(':')[0];
if (sni && sni.length > 0) params.set('sni', sni);
if (reality.shortIds.length > 0) params.set('sid', reality.shortIds[0]); if (reality.shortIds.length > 0) params.set('sid', reality.shortIds[0]);
if (reality.settings.spiderX.length > 0) params.set('spx', reality.settings.spiderX); if (reality.settings.spiderX.length > 0) params.set('spx', reality.settings.spiderX);
if (reality.settings.mldsa65Verify.length > 0) params.set('pqv', reality.settings.mldsa65Verify); if (reality.settings.mldsa65Verify.length > 0) params.set('pqv', reality.settings.mldsa65Verify);