Skip to content

Commit

Permalink
⚡ Make n8n work in subfolder & Fix events in AffinityTrigger
Browse files Browse the repository at this point in the history
  • Loading branch information
janober committed Jul 12, 2020
1 parent c08ff6c commit e4cdc72
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 19 deletions.
7 changes: 7 additions & 0 deletions packages/cli/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,13 @@ const config = convict({
},

// How n8n can be reached (Editor & REST-API)
path: {
format: String,
default: '/',
arg: 'path',
env: 'N8N_PATH',
doc: 'Path n8n is deployed to'
},
host: {
format: String,
default: 'localhost',
Expand Down
5 changes: 3 additions & 2 deletions packages/cli/src/GenericHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ export function getBaseUrl(): string {
const protocol = config.get('protocol') as string;
const host = config.get('host') as string;
const port = config.get('port') as number;
const path = config.get('path') as string;

if (protocol === 'http' && port === 80 || protocol === 'https' && port === 443) {
return `${protocol}://${host}/`;
return `${protocol}://${host}${path}`;
}
return `${protocol}://${host}:${port}/`;
return `${protocol}://${host}:${port}${path}`;
}


Expand Down
39 changes: 30 additions & 9 deletions packages/cli/src/Server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -931,7 +931,8 @@ class App {
// Authorize OAuth Data
this.app.get(`/${this.restEndpoint}/oauth1-credential/auth`, ResponseHelper.send(async (req: express.Request, res: express.Response): Promise<string> => {
if (req.query.id === undefined) {
throw new Error('Required credential id is missing!');
res.status(500).send('Required credential id is missing!');
return '';
}

const result = await Db.collections.Credentials!.findOne(req.query.id as string);
Expand All @@ -943,7 +944,8 @@ class App {
let encryptionKey = undefined;
encryptionKey = await UserSettings.getEncryptionKey();
if (encryptionKey === undefined) {
throw new Error('No encryption key got found to decrypt the credentials!');
res.status(500).send('No encryption key got found to decrypt the credentials!');
return '';
}

// Decrypt the currently saved credentials
Expand Down Expand Up @@ -1015,7 +1017,8 @@ class App {
const { oauth_verifier, oauth_token, cid } = req.query;

if (oauth_verifier === undefined || oauth_token === undefined) {
throw new Error('Insufficient parameters for OAuth1 callback');
const errorResponse = new ResponseHelper.ResponseError('Insufficient parameters for OAuth1 callback. Received following query parameters: ' + JSON.stringify(req.query), undefined, 503);
return ResponseHelper.sendErrorResponse(res, errorResponse);
}

const result = await Db.collections.Credentials!.findOne(cid as any); // tslint:disable-line:no-any
Expand Down Expand Up @@ -1085,7 +1088,8 @@ class App {
// Authorize OAuth Data
this.app.get(`/${this.restEndpoint}/oauth2-credential/auth`, ResponseHelper.send(async (req: express.Request, res: express.Response): Promise<string> => {
if (req.query.id === undefined) {
throw new Error('Required credential id is missing!');
res.status(500).send('Required credential id is missing.');
return '';
}

const result = await Db.collections.Credentials!.findOne(req.query.id as string);
Expand All @@ -1097,7 +1101,8 @@ class App {
let encryptionKey = undefined;
encryptionKey = await UserSettings.getEncryptionKey();
if (encryptionKey === undefined) {
throw new Error('No encryption key got found to decrypt the credentials!');
res.status(500).send('No encryption key got found to decrypt the credentials!');
return '';
}

// Decrypt the currently saved credentials
Expand Down Expand Up @@ -1161,7 +1166,8 @@ class App {
const {code, state: stateEncoded } = req.query;

if (code === undefined || stateEncoded === undefined) {
throw new Error('Insufficient parameters for OAuth2 callback');
const errorResponse = new ResponseHelper.ResponseError('Insufficient parameters for OAuth2 callback. Received following query parameters: ' + JSON.stringify(req.query), undefined, 503);
return ResponseHelper.sendErrorResponse(res, errorResponse);
}

let state;
Expand Down Expand Up @@ -1211,17 +1217,20 @@ class App {
},
};
}
const redirectUri = `${WebhookHelpers.getWebhookBaseUrl()}${this.restEndpoint}/oauth2-credential/callback`;

const oAuthObj = new clientOAuth2({
clientId: _.get(oauthCredentials, 'clientId') as string,
clientSecret: _.get(oauthCredentials, 'clientSecret', '') as string,
accessTokenUri: _.get(oauthCredentials, 'accessTokenUrl', '') as string,
authorizationUri: _.get(oauthCredentials, 'authUrl', '') as string,
redirectUri: `${WebhookHelpers.getWebhookBaseUrl()}${this.restEndpoint}/oauth2-credential/callback`,
redirectUri,
scopes: _.split(_.get(oauthCredentials, 'scope', 'openid,') as string, ',')
});

const oauthToken = await oAuthObj.code.getToken(req.originalUrl, options);
const queryParameters = req.originalUrl.split('?').splice(1, 1).join('');

const oauthToken = await oAuthObj.code.getToken(`${redirectUri}?${queryParameters}`, options);

if (oauthToken === undefined) {
const errorResponse = new ResponseHelper.ResponseError('Unable to get access tokens!', undefined, 404);
Expand Down Expand Up @@ -1693,9 +1702,21 @@ class App {
});
}


// Read the index file and replace the path placeholder
const editorUiPath = require.resolve('n8n-editor-ui');
const filePath = pathJoin(pathDirname(editorUiPath), 'dist', 'index.html');
let readIndexFile = readFileSync(filePath, 'utf8');
const n8nPath = config.get('path');
readIndexFile = readIndexFile.replace(/\/%BASE_PATH%\//g, n8nPath);

// Serve the altered index.html file separately
this.app.get(`/index.html`, async (req: express.Request, res: express.Response) => {
res.send(readIndexFile);
});

// Serve the website
const startTime = (new Date()).toUTCString();
const editorUiPath = require.resolve('n8n-editor-ui');
this.app.use('/', express.static(pathJoin(pathDirname(editorUiPath), 'dist'), {
index: 'index.html',
setHeaders: (res, path) => {
Expand Down
3 changes: 2 additions & 1 deletion packages/editor-ui/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<link rel="icon" href="/%BASE_PATH%/favicon.ico">
<script type="text/javascript">window.BASE_PATH = "/%BASE_PATH%/";</script>
<title>n8n.io - Workflow Automation</title>
</head>
<body>
Expand Down
4 changes: 3 additions & 1 deletion packages/editor-ui/src/components/MainSidebar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

<el-menu-item index="logo" class="logo-item">
<a href="https://n8n.io" target="_blank" class="logo">
<img src="/n8n-icon-small.png" class="icon" alt="n8n.io"/>
<img :src="basePath + 'n8n-icon-small.png'" class="icon" alt="n8n.io"/>
<span class="logo-text" slot="title">n8n.io</span>
</a>
</el-menu-item>
Expand Down Expand Up @@ -208,6 +208,8 @@ export default mixins(
data () {
return {
aboutDialogVisible: false,
// @ts-ignore
basePath: window.BASE_PATH,
isCollapsed: true,
credentialNewDialogVisible: false,
credentialOpenDialogVisible: false,
Expand Down
3 changes: 2 additions & 1 deletion packages/editor-ui/src/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ Vue.use(Router);

export default new Router({
mode: 'history',
base: process.env.BASE_URL,
// @ts-ignore
base: window.BASE_PATH,
routes: [
{
path: '/execution/:id',
Expand Down
3 changes: 2 additions & 1 deletion packages/editor-ui/src/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ export const store = new Vuex.Store({
activeWorkflows: [] as string[],
activeActions: [] as string[],
activeNode: null as string | null,
baseUrl: process.env.VUE_APP_URL_BASE_API ? process.env.VUE_APP_URL_BASE_API : '/',
// @ts-ignore
baseUrl: window.BASE_PATH ? window.BASE_PATH : '/',
credentials: null as ICredentialsResponse[] | null,
credentialTypes: null as ICredentialType[] | null,
endpointWebhook: 'webhook',
Expand Down
2 changes: 1 addition & 1 deletion packages/editor-ui/vue.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ module.exports = {
},
},
},
publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH : '/',
publicPath: process.env.VUE_APP_PUBLIC_PATH ? process.env.VUE_APP_PUBLIC_PATH : '/%BASE_PATH%/',
};
6 changes: 3 additions & 3 deletions packages/nodes-base/nodes/Affinity/AffinityTrigger.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ export class AffinityTrigger implements INodeType {
options: [
{
name: 'file.created',
value: 'file.deleted',
value: 'file.created',
},
{
name: 'file.created',
name: 'file.deleted',
value: 'file.deleted',
},
{
Expand Down Expand Up @@ -136,7 +136,7 @@ export class AffinityTrigger implements INodeType {
},
{
name: 'opportunity.deleted',
value: 'organization.deleted',
value: 'opportunity.deleted',
},
{
name: 'person.created',
Expand Down

0 comments on commit e4cdc72

Please sign in to comment.