include OpenWebRX ticket in issued session URLs

This commit is contained in:
2026-04-02 23:15:15 +02:00
parent 25bd51c0db
commit 3ca8db4231
3 changed files with 26 additions and 5 deletions

View File

@@ -58,10 +58,12 @@ function issueAccess(ctx, tickets, input) {
expiresAtMs expiresAtMs
}); });
const openWebRxPath = String(ctx.getSetting("upstreamPath", ctx.env.OPENWEBRX_PATH || "/openwebrx/")).trim() || "/openwebrx/"; const openWebRxPath = String(ctx.getSetting("upstreamPath", ctx.env.OPENWEBRX_PATH || "/openwebrx/")).trim() || "/openwebrx/";
const separator = openWebRxPath.includes("?") ? "&" : "?";
const iframeUrl = `${openWebRxPath}${separator}ticket=${encodeURIComponent(ticket)}`;
return { return {
ticket, ticket,
expiresAt: new Date(expiresAtMs).toISOString(), expiresAt: new Date(expiresAtMs).toISOString(),
iframeUrl: openWebRxPath, iframeUrl,
userId userId
}; };
} }

View File

@@ -1617,8 +1617,9 @@ async function openOpenWebRxSession() {
try { try {
const result = await requestOpenWebRxSessionWithRetry(); const result = await requestOpenWebRxSessionWithRetry();
const session = result && result.session ? result.session : null; const session = result && result.session ? result.session : null;
state.openWebRx.sessionUrl = session && session.iframeUrl ? session.iframeUrl : ""; const sessionTicket = session && session.ticket ? String(session.ticket) : "";
state.openWebRx.sessionTicket = session && session.ticket ? String(session.ticket) : ""; state.openWebRx.sessionUrl = buildOpenWebRxSessionUrl(session && session.iframeUrl ? session.iframeUrl : "", sessionTicket);
state.openWebRx.sessionTicket = sessionTicket;
state.openWebRx.expiresAt = session && session.expiresAt ? session.expiresAt : null; state.openWebRx.expiresAt = session && session.expiresAt ? session.expiresAt : null;
syncOpenWebRxTicketCookie(state.openWebRx.sessionTicket, state.openWebRx.expiresAt); syncOpenWebRxTicketCookie(state.openWebRx.sessionTicket, state.openWebRx.expiresAt);
renderOpenWebRxSessionAccess(); renderOpenWebRxSessionAccess();
@@ -1641,12 +1642,13 @@ async function openOpenWebRxExternal() {
try { try {
const result = await requestOpenWebRxSessionWithRetry(); const result = await requestOpenWebRxSessionWithRetry();
const session = result && result.session ? result.session : null; const session = result && result.session ? result.session : null;
const sessionUrl = session && session.iframeUrl ? String(session.iframeUrl) : ""; const sessionTicket = session && session.ticket ? String(session.ticket) : "";
const sessionUrl = buildOpenWebRxSessionUrl(session && session.iframeUrl ? String(session.iframeUrl) : "", sessionTicket);
if (!sessionUrl) { if (!sessionUrl) {
throw new Error("OpenWebRX Session konnte nicht erstellt werden"); throw new Error("OpenWebRX Session konnte nicht erstellt werden");
} }
state.openWebRx.sessionUrl = sessionUrl; state.openWebRx.sessionUrl = sessionUrl;
state.openWebRx.sessionTicket = session && session.ticket ? String(session.ticket) : ""; state.openWebRx.sessionTicket = sessionTicket;
state.openWebRx.expiresAt = session && session.expiresAt ? session.expiresAt : null; state.openWebRx.expiresAt = session && session.expiresAt ? session.expiresAt : null;
syncOpenWebRxTicketCookie(state.openWebRx.sessionTicket, state.openWebRx.expiresAt); syncOpenWebRxTicketCookie(state.openWebRx.sessionTicket, state.openWebRx.expiresAt);
renderOpenWebRxSessionAccess(); renderOpenWebRxSessionAccess();
@@ -1658,6 +1660,22 @@ async function openOpenWebRxExternal() {
} }
} }
function buildOpenWebRxSessionUrl(rawUrl, ticket) {
const baseUrl = String(rawUrl || "").trim();
const normalizedTicket = String(ticket || "").trim();
if (!baseUrl) {
return "";
}
if (!normalizedTicket) {
return baseUrl;
}
if (/[?&]ticket=/.test(baseUrl)) {
return baseUrl;
}
const separator = baseUrl.includes("?") ? "&" : "?";
return `${baseUrl}${separator}ticket=${encodeURIComponent(normalizedTicket)}`;
}
async function requestOpenWebRxSessionWithRetry() { async function requestOpenWebRxSessionWithRetry() {
const attempts = [0, 700, 1400, 2200]; const attempts = [0, 700, 1400, 2200];
let lastError = null; let lastError = null;

View File

@@ -1667,6 +1667,7 @@ test("openwebrx session is owner-bound and release disables tx first", async (t)
}); });
assert.equal(session.ok, true); assert.equal(session.ok, true);
assert.ok(session.session.ticket); assert.ok(session.session.ticket);
assert.match(String(session.session.iframeUrl || ""), /[?&]ticket=/);
const authOk = await fetch(`${baseUrl}/v1/openwebrx/authorize?ticket=${encodeURIComponent(session.session.ticket)}`); const authOk = await fetch(`${baseUrl}/v1/openwebrx/authorize?ticket=${encodeURIComponent(session.session.ticket)}`);
assert.equal(authOk.status, 200); assert.equal(authOk.status, 200);