Fix old relay pairing URL TLS compat (#896)
This commit is contained in:
@@ -203,6 +203,15 @@ function makeOffer(input?: Partial<ConnectionOffer>): ConnectionOffer {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function encodeOfferUrl(payload: unknown): string {
|
||||||
|
const encoded = Buffer.from(JSON.stringify(payload), "utf8")
|
||||||
|
.toString("base64")
|
||||||
|
.replace(/\+/g, "-")
|
||||||
|
.replace(/\//g, "_")
|
||||||
|
.replace(/=+$/g, "");
|
||||||
|
return `https://app.paseo.sh/#offer=${encoded}`;
|
||||||
|
}
|
||||||
|
|
||||||
function makeDeps(
|
function makeDeps(
|
||||||
latencyByConnectionId: Record<string, number | Error>,
|
latencyByConnectionId: Record<string, number | Error>,
|
||||||
createdClients: FakeDaemonClient[],
|
createdClients: FakeDaemonClient[],
|
||||||
@@ -1734,6 +1743,41 @@ describe("HostRuntimeStore", () => {
|
|||||||
store.syncHosts([]);
|
store.syncHosts([]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("uses TLS for old pairing URLs that omit relay TLS on port 443", async () => {
|
||||||
|
const store = new HostRuntimeStore({
|
||||||
|
deps: {
|
||||||
|
createClient: () => new FakeDaemonClient() as unknown as DaemonClient,
|
||||||
|
connectToDaemon: async ({ host }) => ({
|
||||||
|
client: makeConnectedProbeClient(5) as unknown as DaemonClient,
|
||||||
|
serverId: host.serverId,
|
||||||
|
hostname: host.label ?? null,
|
||||||
|
}),
|
||||||
|
getClientId: async () => "cid_test_runtime",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const oldPairingUrl = encodeOfferUrl({
|
||||||
|
v: 2,
|
||||||
|
serverId: "srv_offer",
|
||||||
|
daemonPublicKeyB64: "pk_test_offer",
|
||||||
|
relay: { endpoint: "relay.paseo.sh:443" },
|
||||||
|
});
|
||||||
|
|
||||||
|
await store.upsertConnectionFromOfferUrl(oldPairingUrl, "old relay");
|
||||||
|
|
||||||
|
const pairedHost = store.getHosts().find((host) => host.serverId === "srv_offer");
|
||||||
|
expect(pairedHost?.connections).toEqual([
|
||||||
|
{
|
||||||
|
id: "relay:wss:relay.paseo.sh:443",
|
||||||
|
type: "relay",
|
||||||
|
relayEndpoint: "relay.paseo.sh:443",
|
||||||
|
useTls: true,
|
||||||
|
daemonPublicKeyB64: "pk_test_offer",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
store.syncHosts([]);
|
||||||
|
});
|
||||||
|
|
||||||
it("uses the latest advertised hostname when re-pairing an existing relay host", async () => {
|
it("uses the latest advertised hostname when re-pairing an existing relay host", async () => {
|
||||||
const store = new HostRuntimeStore({
|
const store = new HostRuntimeStore({
|
||||||
deps: {
|
deps: {
|
||||||
|
|||||||
@@ -1506,10 +1506,12 @@ export class HostRuntimeStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async upsertConnectionFromOffer(offer: ConnectionOffer, label?: string): Promise<HostProfile> {
|
async upsertConnectionFromOffer(offer: ConnectionOffer, label?: string): Promise<HostProfile> {
|
||||||
|
// COMPAT(oldRelayOfferTls): added in v0.1.73, remove after 2026-11-10.
|
||||||
|
const useTls = offer.relay.useTls ?? shouldUseTlsForDefaultHostedRelay(offer.relay.endpoint);
|
||||||
return this.upsertRelayConnection({
|
return this.upsertRelayConnection({
|
||||||
serverId: offer.serverId,
|
serverId: offer.serverId,
|
||||||
relayEndpoint: offer.relay.endpoint,
|
relayEndpoint: offer.relay.endpoint,
|
||||||
useTls: offer.relay.useTls,
|
useTls,
|
||||||
daemonPublicKeyB64: offer.daemonPublicKeyB64,
|
daemonPublicKeyB64: offer.daemonPublicKeyB64,
|
||||||
label,
|
label,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ describe("connection offer", () => {
|
|||||||
expect(parseConnectionOfferFromUrl(`https://app.paseo.sh/#offer=${encoded}`)).toEqual(offer);
|
expect(parseConnectionOfferFromUrl(`https://app.paseo.sh/#offer=${encoded}`)).toEqual(offer);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("defaults relay TLS to false when absent", () => {
|
it("leaves relay TLS unset when absent", () => {
|
||||||
expect(
|
expect(
|
||||||
ConnectionOfferSchema.parse({
|
ConnectionOfferSchema.parse({
|
||||||
v: 2,
|
v: 2,
|
||||||
@@ -52,7 +52,7 @@ describe("connection offer", () => {
|
|||||||
v: 2,
|
v: 2,
|
||||||
serverId: "server-123",
|
serverId: "server-123",
|
||||||
daemonPublicKeyB64: "pubkey",
|
daemonPublicKeyB64: "pubkey",
|
||||||
relay: { endpoint: "relay.example.com:80", useTls: false },
|
relay: { endpoint: "relay.example.com:80" },
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export const ConnectionOfferV2Schema = z.object({
|
|||||||
daemonPublicKeyB64: z.string().min(1),
|
daemonPublicKeyB64: z.string().min(1),
|
||||||
relay: z.object({
|
relay: z.object({
|
||||||
endpoint: z.string().min(1),
|
endpoint: z.string().min(1),
|
||||||
useTls: z.boolean().optional().default(false),
|
useTls: z.boolean().optional(),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user