mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
fix(core): App should not crash with a custom rest endpoint (#5911)
fixes #5880
This commit is contained in:
parent
6689451e8c
commit
2881ee9ecc
|
@ -10,7 +10,7 @@
|
||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
import assert from 'assert';
|
||||||
import { exec as callbackExec } from 'child_process';
|
import { exec as callbackExec } from 'child_process';
|
||||||
import { access as fsAccess } from 'fs/promises';
|
import { access as fsAccess } from 'fs/promises';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
|
@ -452,6 +452,11 @@ class Server extends AbstractServer {
|
||||||
...excludeEndpoints.split(':'),
|
...excludeEndpoints.split(':'),
|
||||||
].filter((u) => !!u);
|
].filter((u) => !!u);
|
||||||
|
|
||||||
|
assert(
|
||||||
|
!ignoredEndpoints.includes(this.restEndpoint),
|
||||||
|
`REST endpoint cannot be set to any of these values: ${ignoredEndpoints.join()} `,
|
||||||
|
);
|
||||||
|
|
||||||
// eslint-disable-next-line no-useless-escape
|
// eslint-disable-next-line no-useless-escape
|
||||||
const authIgnoreRegex = new RegExp(`^\/(${ignoredEndpoints.join('|')})\/?.*$`);
|
const authIgnoreRegex = new RegExp(`^\/(${ignoredEndpoints.join('|')})\/?.*$`);
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,7 @@ export class Start extends BaseCommand {
|
||||||
private async generateStaticAssets() {
|
private async generateStaticAssets() {
|
||||||
// Read the index file and replace the path placeholder
|
// Read the index file and replace the path placeholder
|
||||||
const n8nPath = config.getEnv('path');
|
const n8nPath = config.getEnv('path');
|
||||||
|
const restEndpoint = config.getEnv('endpoints.rest');
|
||||||
const hooksUrls = config.getEnv('externalFrontendHooksUrls');
|
const hooksUrls = config.getEnv('externalFrontendHooksUrls');
|
||||||
|
|
||||||
let scriptsString = '';
|
let scriptsString = '';
|
||||||
|
@ -167,6 +168,7 @@ export class Start extends BaseCommand {
|
||||||
];
|
];
|
||||||
if (filePath.endsWith('index.html')) {
|
if (filePath.endsWith('index.html')) {
|
||||||
streams.push(
|
streams.push(
|
||||||
|
replaceStream('{{REST_ENDPOINT}}', restEndpoint, { ignoreCase: false }),
|
||||||
replaceStream(closingTitleTag, closingTitleTag + scriptsString, {
|
replaceStream(closingTitleTag, closingTitleTag + scriptsString, {
|
||||||
ignoreCase: false,
|
ignoreCase: false,
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.BASE_PATH = '/{{BASE_PATH}}/';
|
window.BASE_PATH = '/{{BASE_PATH}}/';
|
||||||
|
window.REST_ENDPOINT = '{{REST_ENDPOINT}}';
|
||||||
</script>
|
</script>
|
||||||
<script>!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled getFeatureFlag onFeatureFlags reloadFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[])</script>
|
<script>!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled getFeatureFlag onFeatureFlags reloadFeatureFlags".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[])</script>
|
||||||
|
|
||||||
|
|
|
@ -985,6 +985,7 @@ export interface WorkflowsState {
|
||||||
|
|
||||||
export interface RootState {
|
export interface RootState {
|
||||||
baseUrl: string;
|
baseUrl: string;
|
||||||
|
restEndpoint: string;
|
||||||
defaultLocale: string;
|
defaultLocale: string;
|
||||||
endpointWebhook: string;
|
endpointWebhook: string;
|
||||||
endpointWebhookTest: string;
|
endpointWebhookTest: string;
|
||||||
|
|
2
packages/editor-ui/src/shims.d.ts
vendored
2
packages/editor-ui/src/shims.d.ts
vendored
|
@ -11,12 +11,12 @@ declare global {
|
||||||
PROD: boolean;
|
PROD: boolean;
|
||||||
NODE_ENV: 'development' | 'production';
|
NODE_ENV: 'development' | 'production';
|
||||||
VUE_APP_URL_BASE_API: string;
|
VUE_APP_URL_BASE_API: string;
|
||||||
VUE_APP_ENDPOINT_REST?: string;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Window {
|
interface Window {
|
||||||
BASE_PATH: string;
|
BASE_PATH: string;
|
||||||
|
REST_ENDPOINT: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace JSX {
|
namespace JSX {
|
||||||
|
|
|
@ -5,12 +5,16 @@ import { defineStore } from 'pinia';
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { useNodeTypesStore } from './nodeTypes';
|
import { useNodeTypesStore } from './nodeTypes';
|
||||||
|
|
||||||
const { VUE_APP_URL_BASE_API, VUE_APP_ENDPOINT_REST } = import.meta.env;
|
const { VUE_APP_URL_BASE_API } = import.meta.env;
|
||||||
|
|
||||||
export const useRootStore = defineStore(STORES.ROOT, {
|
export const useRootStore = defineStore(STORES.ROOT, {
|
||||||
state: (): RootState => ({
|
state: (): RootState => ({
|
||||||
baseUrl:
|
baseUrl:
|
||||||
VUE_APP_URL_BASE_API ?? (window.BASE_PATH === '/{{BASE_PATH}}/' ? '/' : window.BASE_PATH),
|
VUE_APP_URL_BASE_API ?? (window.BASE_PATH === '/{{BASE_PATH}}/' ? '/' : window.BASE_PATH),
|
||||||
|
restEndpoint:
|
||||||
|
!window.REST_ENDPOINT || window.REST_ENDPOINT === '{{REST_ENDPOINT}}'
|
||||||
|
? 'rest'
|
||||||
|
: window.REST_ENDPOINT,
|
||||||
defaultLocale: 'en',
|
defaultLocale: 'en',
|
||||||
endpointWebhook: 'webhook',
|
endpointWebhook: 'webhook',
|
||||||
endpointWebhookTest: 'webhook-test',
|
endpointWebhookTest: 'webhook-test',
|
||||||
|
@ -41,20 +45,12 @@ export const useRootStore = defineStore(STORES.ROOT, {
|
||||||
},
|
},
|
||||||
|
|
||||||
getRestUrl(): string {
|
getRestUrl(): string {
|
||||||
let endpoint = 'rest';
|
return `${this.baseUrl}${this.restEndpoint}`;
|
||||||
if (VUE_APP_ENDPOINT_REST) {
|
|
||||||
endpoint = VUE_APP_ENDPOINT_REST;
|
|
||||||
}
|
|
||||||
return `${this.baseUrl}${endpoint}`;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
getRestApiContext(): IRestApiContext {
|
getRestApiContext(): IRestApiContext {
|
||||||
let endpoint = 'rest';
|
|
||||||
if (VUE_APP_ENDPOINT_REST) {
|
|
||||||
endpoint = VUE_APP_ENDPOINT_REST;
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
baseUrl: `${this.baseUrl}${endpoint}`,
|
baseUrl: this.getRestUrl,
|
||||||
sessionId: this.sessionId,
|
sessionId: this.sessionId,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue