UNPKG

@n8n/n8n-nodes-langchain

Version:
121 lines 4.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CHAT_REFRESH_HEADER = exports.CHAT_REFRESH_PARAM = exports.CHAT_FRAME_SANDBOX = exports.CHAT_SHELL_INNER_PARAM = void 0; exports.isShellInnerRequest = isShellInnerRequest; exports.buildInnerFrameSrc = buildInnerFrameSrc; exports.buildChatRefreshUrl = buildChatRefreshUrl; exports.setChatOAuthToken = setChatOAuthToken; exports.readChatOAuthToken = readChatOAuthToken; exports.clearChatOAuthToken = clearChatOAuthToken; exports.setChatRefreshToken = setChatRefreshToken; exports.readChatRefreshToken = readChatRefreshToken; exports.clearChatRefreshToken = clearChatRefreshToken; exports.isChatRefreshRequest = isChatRefreshRequest; exports.CHAT_SHELL_INNER_PARAM = 'n8nShellInner'; exports.CHAT_FRAME_SANDBOX = 'allow-scripts allow-forms allow-modals allow-popups'; function isShellInnerRequest(req) { if (req.query[exports.CHAT_SHELL_INNER_PARAM] !== '1') return false; return req.headers['sec-fetch-dest'] === 'iframe'; } function buildInnerFrameSrc(req) { const [path, query] = req.originalUrl.split('?'); const params = new URLSearchParams(query); params.set(exports.CHAT_SHELL_INNER_PARAM, '1'); return `${path}?${params.toString()}`; } exports.CHAT_REFRESH_PARAM = 'n8nChatRefresh'; exports.CHAT_REFRESH_HEADER = 'x-n8n-chat-refresh'; function buildChatRefreshUrl(req) { const [path, query] = req.originalUrl.split('?'); const params = new URLSearchParams(query); params.set(exports.CHAT_REFRESH_PARAM, '1'); return `${path}?${params.toString()}`; } const CHAT_OAUTH_COOKIE_NAME = 'n8n-chat-oauth'; const CHAT_OAUTH_REFRESH_COOKIE_NAME = 'n8n-chat-oauth-refresh'; const REFRESH_COOKIE_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000; function isSecureRequest(req) { const forwardedProto = req.headers['x-forwarded-proto']; const firstValue = Array.isArray(forwardedProto) ? forwardedProto[0] : forwardedProto; const proto = firstValue?.split(',')[0]?.trim() || req.protocol; return proto === 'https'; } function chatOAuthCookieOptions(req, resourceUrl) { return { httpOnly: true, sameSite: 'lax', secure: isSecureRequest(req), path: new URL(resourceUrl).pathname, }; } function setChatOAuthToken(res, req, resourceUrl, payload) { const value = { t: payload.token, e: payload.expiresAt }; res.cookie(CHAT_OAUTH_COOKIE_NAME, JSON.stringify(value), { ...chatOAuthCookieOptions(req, resourceUrl), maxAge: 60_000, }); } function decodeCookieValue(value) { try { return decodeURIComponent(value.trim()); } catch { return null; } } function readRawCookie(req, name) { for (const pair of (req.headers.cookie ?? '').split(';')) { const separator = pair.indexOf('='); if (separator === -1) continue; if (pair.slice(0, separator).trim() !== name) continue; return decodeCookieValue(pair.slice(separator + 1)); } return null; } function isSerializedPayload(value) { if (typeof value !== 'object' || value === null) return false; const { t, e } = value; return typeof t === 'string' && t !== '' && typeof e === 'number' && Number.isFinite(e); } function readChatOAuthToken(req) { const raw = readRawCookie(req, CHAT_OAUTH_COOKIE_NAME); if (!raw) return null; try { const parsed = JSON.parse(raw); return isSerializedPayload(parsed) ? { token: parsed.t, expiresAt: parsed.e } : null; } catch { return null; } } function clearChatOAuthToken(res, req, resourceUrl) { res.clearCookie(CHAT_OAUTH_COOKIE_NAME, chatOAuthCookieOptions(req, resourceUrl)); } function setChatRefreshToken(res, req, resourceUrl, refreshToken) { res.cookie(CHAT_OAUTH_REFRESH_COOKIE_NAME, refreshToken, { ...chatOAuthCookieOptions(req, resourceUrl), maxAge: REFRESH_COOKIE_MAX_AGE_MS, }); } function readChatRefreshToken(req) { return readRawCookie(req, CHAT_OAUTH_REFRESH_COOKIE_NAME); } function clearChatRefreshToken(res, req, resourceUrl) { res.clearCookie(CHAT_OAUTH_REFRESH_COOKIE_NAME, chatOAuthCookieOptions(req, resourceUrl)); } function isChatRefreshRequest(req) { if (req.query[exports.CHAT_REFRESH_PARAM] !== '1') return false; if (req.headers[exports.CHAT_REFRESH_HEADER] !== '1') return false; const site = req.headers['sec-fetch-site']; if (typeof site === 'string' && site !== 'same-origin') return false; return true; } //# sourceMappingURL=shell.js.map