n8n 0.167.0 → 0.168.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/execute.js +3 -0
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/executeBatch.d.ts +2 -0
- package/dist/commands/executeBatch.js +3 -0
- package/dist/commands/executeBatch.js.map +1 -1
- package/dist/commands/import/credentials.d.ts +10 -0
- package/dist/commands/import/credentials.js +87 -26
- package/dist/commands/import/credentials.js.map +1 -1
- package/dist/commands/import/workflow.d.ts +11 -1
- package/dist/commands/import/workflow.js +109 -48
- package/dist/commands/import/workflow.js.map +1 -1
- package/dist/commands/start.js +25 -0
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/user-management/reset.d.ts +7 -0
- package/dist/commands/user-management/reset.js +66 -0
- package/dist/commands/user-management/reset.js.map +1 -0
- package/dist/commands/worker.js +4 -1
- package/dist/commands/worker.js.map +1 -1
- package/dist/config/index.d.ts +23 -0
- package/dist/config/index.js +92 -4
- package/dist/config/index.js.map +1 -1
- package/dist/src/ActiveWorkflowRunner.d.ts +2 -1
- package/dist/src/ActiveWorkflowRunner.js +44 -24
- package/dist/src/ActiveWorkflowRunner.js.map +1 -1
- package/dist/src/CredentialsHelper.d.ts +10 -2
- package/dist/src/CredentialsHelper.js +40 -11
- package/dist/src/CredentialsHelper.js.map +1 -1
- package/dist/src/Db.d.ts +4 -1
- package/dist/src/Db.js +90 -66
- package/dist/src/Db.js.map +1 -1
- package/dist/src/GenericHelpers.d.ts +6 -0
- package/dist/src/GenericHelpers.js +18 -1
- package/dist/src/GenericHelpers.js.map +1 -1
- package/dist/src/Interfaces.d.ts +74 -9
- package/dist/src/InternalHooks.d.ts +42 -6
- package/dist/src/InternalHooks.js +54 -13
- package/dist/src/InternalHooks.js.map +1 -1
- package/dist/src/ResponseHelper.js +5 -0
- package/dist/src/ResponseHelper.js.map +1 -1
- package/dist/src/Server.d.ts +2 -0
- package/dist/src/Server.js +584 -458
- package/dist/src/Server.js.map +1 -1
- package/dist/src/TagHelpers.d.ts +3 -3
- package/dist/src/TagHelpers.js +5 -24
- package/dist/src/TagHelpers.js.map +1 -1
- package/dist/src/UserManagement/Interfaces.d.ts +34 -0
- package/dist/src/UserManagement/Interfaces.js +3 -0
- package/dist/src/UserManagement/Interfaces.js.map +1 -0
- package/dist/src/UserManagement/UserManagementHelper.d.ts +17 -0
- package/dist/src/UserManagement/UserManagementHelper.js +158 -0
- package/dist/src/UserManagement/UserManagementHelper.js.map +1 -0
- package/dist/src/UserManagement/auth/jwt.d.ts +7 -0
- package/dist/src/UserManagement/auth/jwt.js +57 -0
- package/dist/src/UserManagement/auth/jwt.js.map +1 -0
- package/dist/src/UserManagement/email/Interfaces.d.ts +29 -0
- package/dist/src/UserManagement/email/Interfaces.js +3 -0
- package/dist/src/UserManagement/email/Interfaces.js.map +1 -0
- package/dist/src/UserManagement/email/NodeMailer.d.ts +7 -0
- package/dist/src/UserManagement/email/NodeMailer.js +67 -0
- package/dist/src/UserManagement/email/NodeMailer.js.map +1 -0
- package/dist/src/UserManagement/email/UserManagementMailer.d.ts +9 -0
- package/dist/src/UserManagement/email/UserManagementMailer.js +77 -0
- package/dist/src/UserManagement/email/UserManagementMailer.js.map +1 -0
- package/dist/src/UserManagement/email/index.d.ts +2 -0
- package/dist/src/UserManagement/email/index.js +7 -0
- package/dist/src/UserManagement/email/index.js.map +1 -0
- package/dist/src/UserManagement/email/templates/instanceSetup.html +5 -0
- package/dist/src/UserManagement/email/templates/invite.html +4 -0
- package/dist/src/UserManagement/email/templates/passwordReset.html +5 -0
- package/dist/src/UserManagement/index.d.ts +4 -0
- package/dist/src/UserManagement/index.js +6 -0
- package/dist/src/UserManagement/index.js.map +1 -0
- package/dist/src/UserManagement/routes/auth.d.ts +2 -0
- package/dist/src/UserManagement/routes/auth.js +74 -0
- package/dist/src/UserManagement/routes/auth.js.map +1 -0
- package/dist/src/UserManagement/routes/index.d.ts +2 -0
- package/dist/src/UserManagement/routes/index.js +100 -0
- package/dist/src/UserManagement/routes/index.js.map +1 -0
- package/dist/src/UserManagement/routes/me.d.ts +2 -0
- package/dist/src/UserManagement/routes/me.js +85 -0
- package/dist/src/UserManagement/routes/me.js.map +1 -0
- package/dist/src/UserManagement/routes/owner.d.ts +2 -0
- package/dist/src/UserManagement/routes/owner.js +68 -0
- package/dist/src/UserManagement/routes/owner.js.map +1 -0
- package/dist/src/UserManagement/routes/passwordReset.d.ts +2 -0
- package/dist/src/UserManagement/routes/passwordReset.js +129 -0
- package/dist/src/UserManagement/routes/passwordReset.js.map +1 -0
- package/dist/src/UserManagement/routes/users.d.ts +2 -0
- package/dist/src/UserManagement/routes/users.js +334 -0
- package/dist/src/UserManagement/routes/users.js.map +1 -0
- package/dist/src/WaitTracker.js +6 -0
- package/dist/src/WaitTracker.js.map +1 -1
- package/dist/src/WaitingWebhooks.js +9 -1
- package/dist/src/WaitingWebhooks.js.map +1 -1
- package/dist/src/WebhookHelpers.js +17 -1
- package/dist/src/WebhookHelpers.js.map +1 -1
- package/dist/src/WorkflowExecuteAdditionalData.d.ts +3 -3
- package/dist/src/WorkflowExecuteAdditionalData.js +41 -13
- package/dist/src/WorkflowExecuteAdditionalData.js.map +1 -1
- package/dist/src/WorkflowHelpers.d.ts +9 -10
- package/dist/src/WorkflowHelpers.js +48 -17
- package/dist/src/WorkflowHelpers.js.map +1 -1
- package/dist/src/WorkflowRunner.js +4 -2
- package/dist/src/WorkflowRunner.js.map +1 -1
- package/dist/src/WorkflowRunnerProcess.js +7 -4
- package/dist/src/WorkflowRunnerProcess.js.map +1 -1
- package/dist/src/api/credentials.api.d.ts +1 -0
- package/dist/src/api/credentials.api.js +222 -0
- package/dist/src/api/credentials.api.js.map +1 -0
- package/dist/src/constants.d.ts +5 -0
- package/dist/src/constants.js +9 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/databases/entities/CredentialsEntity.d.ts +2 -0
- package/dist/src/databases/entities/CredentialsEntity.js +13 -2
- package/dist/src/databases/entities/CredentialsEntity.js.map +1 -1
- package/dist/src/databases/entities/Role.d.ts +16 -0
- package/dist/src/databases/entities/Role.js +87 -0
- package/dist/src/databases/entities/Role.js.map +1 -0
- package/dist/src/databases/entities/Settings.d.ts +6 -0
- package/dist/src/databases/entities/Settings.js +32 -0
- package/dist/src/databases/entities/Settings.js.map +1 -0
- package/dist/src/databases/entities/SharedCredentials.d.ts +13 -0
- package/dist/src/databases/entities/SharedCredentials.js +83 -0
- package/dist/src/databases/entities/SharedCredentials.js.map +1 -0
- package/dist/src/databases/entities/SharedWorkflow.d.ts +13 -0
- package/dist/src/databases/entities/SharedWorkflow.js +83 -0
- package/dist/src/databases/entities/SharedWorkflow.js.map +1 -0
- package/dist/src/databases/entities/TagEntity.js +6 -2
- package/dist/src/databases/entities/TagEntity.js.map +1 -1
- package/dist/src/databases/entities/User.d.ts +24 -0
- package/dist/src/databases/entities/User.js +145 -0
- package/dist/src/databases/entities/User.js.map +1 -0
- package/dist/src/databases/entities/WorkflowEntity.d.ts +2 -0
- package/dist/src/databases/entities/WorkflowEntity.js +8 -1
- package/dist/src/databases/entities/WorkflowEntity.js.map +1 -1
- package/dist/src/databases/entities/index.d.ts +10 -0
- package/dist/src/databases/entities/index.js +10 -0
- package/dist/src/databases/entities/index.js.map +1 -1
- package/dist/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.js +0 -1
- package/dist/src/databases/mysqldb/migrations/1626183952959-AddWaitColumn.js.map +1 -1
- package/dist/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.js +0 -3
- package/dist/src/databases/mysqldb/migrations/1630451444017-UpdateWorkflowCredentials.js.map +1 -1
- package/dist/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.js +21 -8
- package/dist/src/databases/mysqldb/migrations/1644424784709-AddExecutionEntityIndexes.js.map +1 -1
- package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
- package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.js +100 -0
- package/dist/src/databases/mysqldb/migrations/1646992772331-CreateUserManagement.js.map +1 -0
- package/dist/src/databases/mysqldb/migrations/index.js +2 -0
- package/dist/src/databases/mysqldb/migrations/index.js.map +1 -1
- package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.d.ts +1 -1
- package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.js +1 -1
- package/dist/src/databases/postgresdb/migrations/1620824779533-UniqueWorkflowNames.js.map +1 -1
- package/dist/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.js +0 -1
- package/dist/src/databases/postgresdb/migrations/1626176912946-AddwaitTill.js.map +1 -1
- package/dist/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.js +0 -3
- package/dist/src/databases/postgresdb/migrations/1630419189837-UpdateWorkflowCredentials.js.map +1 -1
- package/dist/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.js +16 -17
- package/dist/src/databases/postgresdb/migrations/1644422880309-AddExecutionEntityIndexes.js.map +1 -1
- package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
- package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.js +106 -0
- package/dist/src/databases/postgresdb/migrations/1646992772331-CreateUserManagement.js.map +1 -0
- package/dist/src/databases/postgresdb/migrations/index.js +2 -0
- package/dist/src/databases/postgresdb/migrations/index.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1588102412422-InitialMigration.js +3 -0
- package/dist/src/databases/sqlite/migrations/1588102412422-InitialMigration.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1592445003908-WebhookModel.js +3 -0
- package/dist/src/databases/sqlite/migrations/1592445003908-WebhookModel.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.d.ts +1 -1
- package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.js +3 -0
- package/dist/src/databases/sqlite/migrations/1594825041918-CreateIndexStoppedAt.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.d.ts +2 -1
- package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.js +6 -0
- package/dist/src/databases/sqlite/migrations/1607431743769-MakeStoppedAtNullable.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.d.ts +1 -1
- package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.js +3 -0
- package/dist/src/databases/sqlite/migrations/1611071044839-AddWebhookId.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.d.ts +1 -1
- package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.js +3 -0
- package/dist/src/databases/sqlite/migrations/1617213344594-CreateTagEntity.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.d.ts +1 -1
- package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.js +3 -0
- package/dist/src/databases/sqlite/migrations/1620821879465-UniqueWorkflowNames.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.js +3 -1
- package/dist/src/databases/sqlite/migrations/1621707690587-AddWaitColumn.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.js +3 -3
- package/dist/src/databases/sqlite/migrations/1630330987096-UpdateWorkflowCredentials.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.js +17 -13
- package/dist/src/databases/sqlite/migrations/1644421939510-AddExecutionEntityIndexes.js.map +1 -1
- package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.d.ts +6 -0
- package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.js +73 -0
- package/dist/src/databases/sqlite/migrations/1646992772331-CreateUserManagement.js.map +1 -0
- package/dist/src/databases/sqlite/migrations/index.d.ts +3 -2
- package/dist/src/databases/sqlite/migrations/index.js +4 -1
- package/dist/src/databases/sqlite/migrations/index.js.map +1 -1
- package/dist/src/databases/utils/customValidators.d.ts +1 -0
- package/dist/src/databases/utils/customValidators.js +22 -0
- package/dist/src/databases/utils/customValidators.js.map +1 -0
- package/dist/src/databases/utils/migrationHelpers.d.ts +3 -0
- package/dist/src/databases/utils/migrationHelpers.js +60 -0
- package/dist/src/databases/utils/migrationHelpers.js.map +1 -0
- package/dist/src/databases/utils/transformers.d.ts +9 -0
- package/dist/src/databases/utils/transformers.js +16 -0
- package/dist/src/databases/utils/transformers.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +4 -1
- package/dist/src/telemetry/index.js +4 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/test/{CredentialsHelper.test.d.ts → integration/auth.endpoints.test.d.ts} +0 -0
- package/dist/test/integration/auth.endpoints.test.js +99 -0
- package/dist/test/integration/auth.endpoints.test.js.map +1 -0
- package/dist/test/integration/auth.middleware.test.d.ts +1 -0
- package/dist/test/integration/auth.middleware.test.js +46 -0
- package/dist/test/integration/auth.middleware.test.js.map +1 -0
- package/dist/test/integration/credentials.api.test.d.ts +1 -0
- package/dist/test/integration/credentials.api.test.js +401 -0
- package/dist/test/integration/credentials.api.test.js.map +1 -0
- package/dist/test/integration/me.endpoints.test.d.ts +1 -0
- package/dist/test/integration/me.endpoints.test.js +383 -0
- package/dist/test/integration/me.endpoints.test.js.map +1 -0
- package/dist/test/integration/owner.endpoints.test.d.ts +1 -0
- package/dist/test/integration/owner.endpoints.test.js +125 -0
- package/dist/test/integration/owner.endpoints.test.js.map +1 -0
- package/dist/test/integration/passwordReset.endpoints.test.d.ts +1 -0
- package/dist/test/integration/passwordReset.endpoints.test.js +221 -0
- package/dist/test/integration/passwordReset.endpoints.test.js.map +1 -0
- package/dist/test/integration/shared/constants.d.ts +16 -0
- package/dist/test/integration/shared/constants.js +41 -0
- package/dist/test/integration/shared/constants.js.map +1 -0
- package/dist/test/integration/shared/random.d.ts +5 -0
- package/dist/test/integration/shared/random.js +34 -0
- package/dist/test/integration/shared/random.js.map +1 -0
- package/dist/test/integration/shared/testDb.d.ts +47 -0
- package/dist/test/integration/shared/testDb.js +280 -0
- package/dist/test/integration/shared/testDb.js.map +1 -0
- package/dist/test/integration/shared/utils.d.ts +20 -0
- package/dist/test/integration/shared/utils.js +132 -0
- package/dist/test/integration/shared/utils.js.map +1 -0
- package/dist/test/integration/users.endpoints.test.d.ts +1 -0
- package/dist/test/integration/users.endpoints.test.js +420 -0
- package/dist/test/integration/users.endpoints.test.js.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +27 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test/teardown.d.ts +2 -0
- package/dist/test/teardown.js +33 -0
- package/dist/test/teardown.js.map +1 -0
- package/dist/test/unit/CredentialsHelper.test.d.ts +1 -0
- package/dist/test/{CredentialsHelper.test.js → unit/CredentialsHelper.test.js} +1 -1
- package/dist/test/unit/CredentialsHelper.test.js.map +1 -0
- package/dist/test/{Helpers.d.ts → unit/Helpers.d.ts} +0 -0
- package/dist/test/{Helpers.js → unit/Helpers.js} +0 -0
- package/dist/test/unit/Helpers.js.map +1 -0
- package/oclif.manifest.json +1 -1
- package/package.json +30 -29
- package/dist/src/PersonalizationSurvey.d.ts +0 -3
- package/dist/src/PersonalizationSurvey.js +0 -48
- package/dist/src/PersonalizationSurvey.js.map +0 -1
- package/dist/test/CredentialsHelper.test.js.map +0 -1
- package/dist/test/Helpers.js.map +0 -1
|
@@ -10,5 +10,8 @@ export declare class Telemetry {
|
|
|
10
10
|
trackWorkflowExecution(properties: IDataObject): Promise<void>;
|
|
11
11
|
trackN8nStop(): Promise<void>;
|
|
12
12
|
identify(traits?: IDataObject): Promise<void>;
|
|
13
|
-
track(eventName: string, properties?:
|
|
13
|
+
track(eventName: string, properties?: {
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
user_id?: string;
|
|
16
|
+
}): Promise<void>;
|
|
14
17
|
}
|
|
@@ -116,11 +116,13 @@ class Telemetry {
|
|
|
116
116
|
}
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
|
-
async track(eventName, properties) {
|
|
119
|
+
async track(eventName, properties = {}) {
|
|
120
120
|
return new Promise((resolve) => {
|
|
121
121
|
if (this.client) {
|
|
122
|
+
const { user_id } = properties;
|
|
123
|
+
Object.assign(properties, { instance_id: this.instanceId });
|
|
122
124
|
this.client.track({
|
|
123
|
-
userId: this.instanceId
|
|
125
|
+
userId: `${this.instanceId}${user_id ? `#${user_id}` : ''}`,
|
|
124
126
|
anonymousId: '000000000000',
|
|
125
127
|
event: eventName,
|
|
126
128
|
properties,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bcryptjs_1 = require("bcryptjs");
|
|
4
|
+
const validator_1 = require("validator");
|
|
5
|
+
const uuid_1 = require("uuid");
|
|
6
|
+
const config = require("../../config");
|
|
7
|
+
const utils = require("./shared/utils");
|
|
8
|
+
const constants_1 = require("./shared/constants");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
const random_1 = require("./shared/random");
|
|
11
|
+
const testDb_1 = require("./shared/testDb");
|
|
12
|
+
const testDb = require("./shared/testDb");
|
|
13
|
+
let globalOwnerRole;
|
|
14
|
+
let app;
|
|
15
|
+
let testDbName = '';
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
app = utils.initTestServer({ endpointGroups: ['auth'], applyAuth: true });
|
|
18
|
+
const initResult = await testDb.init();
|
|
19
|
+
testDbName = initResult.testDbName;
|
|
20
|
+
await testDb.truncate(['User'], testDbName);
|
|
21
|
+
globalOwnerRole = await testDb_1.getGlobalOwnerRole();
|
|
22
|
+
utils.initTestLogger();
|
|
23
|
+
utils.initTestTelemetry();
|
|
24
|
+
});
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
await testDb.createUser({
|
|
27
|
+
id: uuid_1.v4(),
|
|
28
|
+
email: TEST_USER.email,
|
|
29
|
+
firstName: TEST_USER.firstName,
|
|
30
|
+
lastName: TEST_USER.lastName,
|
|
31
|
+
password: bcryptjs_1.hashSync(TEST_USER.password, bcryptjs_1.genSaltSync(10)),
|
|
32
|
+
globalRole: globalOwnerRole,
|
|
33
|
+
});
|
|
34
|
+
config.set('userManagement.isInstanceOwnerSetUp', true);
|
|
35
|
+
await src_1.Db.collections.Settings.update({ key: 'userManagement.isInstanceOwnerSetUp' }, { value: JSON.stringify(true) });
|
|
36
|
+
});
|
|
37
|
+
afterEach(async () => {
|
|
38
|
+
await testDb.truncate(['User'], testDbName);
|
|
39
|
+
});
|
|
40
|
+
afterAll(async () => {
|
|
41
|
+
await testDb.terminate(testDbName);
|
|
42
|
+
});
|
|
43
|
+
test('POST /login should log user in', async () => {
|
|
44
|
+
const authlessAgent = utils.createAgent(app);
|
|
45
|
+
const response = await authlessAgent.post('/login').send({
|
|
46
|
+
email: TEST_USER.email,
|
|
47
|
+
password: TEST_USER.password,
|
|
48
|
+
});
|
|
49
|
+
expect(response.statusCode).toBe(200);
|
|
50
|
+
const { id, email, firstName, lastName, password, personalizationAnswers, globalRole, resetPasswordToken, } = response.body.data;
|
|
51
|
+
expect(validator_1.default.isUUID(id)).toBe(true);
|
|
52
|
+
expect(email).toBe(TEST_USER.email);
|
|
53
|
+
expect(firstName).toBe(TEST_USER.firstName);
|
|
54
|
+
expect(lastName).toBe(TEST_USER.lastName);
|
|
55
|
+
expect(password).toBeUndefined();
|
|
56
|
+
expect(personalizationAnswers).toBeNull();
|
|
57
|
+
expect(password).toBeUndefined();
|
|
58
|
+
expect(resetPasswordToken).toBeUndefined();
|
|
59
|
+
expect(globalRole).toBeDefined();
|
|
60
|
+
expect(globalRole.name).toBe('owner');
|
|
61
|
+
expect(globalRole.scope).toBe('global');
|
|
62
|
+
const authToken = utils.getAuthToken(response);
|
|
63
|
+
expect(authToken).toBeDefined();
|
|
64
|
+
});
|
|
65
|
+
test('GET /login should receive logged in user', async () => {
|
|
66
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
67
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
68
|
+
const response = await authOwnerAgent.get('/login');
|
|
69
|
+
expect(response.statusCode).toBe(200);
|
|
70
|
+
const { id, email, firstName, lastName, password, personalizationAnswers, globalRole, resetPasswordToken, } = response.body.data;
|
|
71
|
+
expect(validator_1.default.isUUID(id)).toBe(true);
|
|
72
|
+
expect(email).toBe(TEST_USER.email);
|
|
73
|
+
expect(firstName).toBe(TEST_USER.firstName);
|
|
74
|
+
expect(lastName).toBe(TEST_USER.lastName);
|
|
75
|
+
expect(password).toBeUndefined();
|
|
76
|
+
expect(personalizationAnswers).toBeNull();
|
|
77
|
+
expect(password).toBeUndefined();
|
|
78
|
+
expect(resetPasswordToken).toBeUndefined();
|
|
79
|
+
expect(globalRole).toBeDefined();
|
|
80
|
+
expect(globalRole.name).toBe('owner');
|
|
81
|
+
expect(globalRole.scope).toBe('global');
|
|
82
|
+
expect(response.headers['set-cookie']).toBeUndefined();
|
|
83
|
+
});
|
|
84
|
+
test('POST /logout should log user out', async () => {
|
|
85
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
86
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
87
|
+
const response = await authOwnerAgent.post('/logout');
|
|
88
|
+
expect(response.statusCode).toBe(200);
|
|
89
|
+
expect(response.body).toEqual(constants_1.LOGGED_OUT_RESPONSE_BODY);
|
|
90
|
+
const authToken = utils.getAuthToken(response);
|
|
91
|
+
expect(authToken).toBeUndefined();
|
|
92
|
+
});
|
|
93
|
+
const TEST_USER = {
|
|
94
|
+
email: random_1.randomEmail(),
|
|
95
|
+
password: random_1.randomValidPassword(),
|
|
96
|
+
firstName: random_1.randomName(),
|
|
97
|
+
lastName: random_1.randomName(),
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=auth.endpoints.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.endpoints.test.js","sourceRoot":"","sources":["../../../test/integration/auth.endpoints.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const request = require("supertest");
|
|
4
|
+
const constants_1 = require("./shared/constants");
|
|
5
|
+
const utils = require("./shared/utils");
|
|
6
|
+
const testDb = require("./shared/testDb");
|
|
7
|
+
let app;
|
|
8
|
+
let testDbName = '';
|
|
9
|
+
beforeAll(async () => {
|
|
10
|
+
app = utils.initTestServer({
|
|
11
|
+
applyAuth: true,
|
|
12
|
+
endpointGroups: ['me', 'auth', 'owner', 'users'],
|
|
13
|
+
});
|
|
14
|
+
const initResult = await testDb.init();
|
|
15
|
+
testDbName = initResult.testDbName;
|
|
16
|
+
utils.initTestLogger();
|
|
17
|
+
utils.initTestTelemetry();
|
|
18
|
+
});
|
|
19
|
+
afterAll(async () => {
|
|
20
|
+
await testDb.terminate(testDbName);
|
|
21
|
+
});
|
|
22
|
+
constants_1.ROUTES_REQUIRING_AUTHENTICATION.concat(constants_1.ROUTES_REQUIRING_AUTHORIZATION).forEach((route) => {
|
|
23
|
+
const [method, endpoint] = getMethodAndEndpoint(route);
|
|
24
|
+
test(`${route} should return 401 Unauthorized if no cookie`, async () => {
|
|
25
|
+
const response = await request(app)[method](endpoint).use(utils.prefix(constants_1.REST_PATH_SEGMENT));
|
|
26
|
+
expect(response.statusCode).toBe(401);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
constants_1.ROUTES_REQUIRING_AUTHORIZATION.forEach(async (route) => {
|
|
30
|
+
const [method, endpoint] = getMethodAndEndpoint(route);
|
|
31
|
+
test(`${route} should return 403 Forbidden for member`, async () => {
|
|
32
|
+
const member = await testDb.createUser();
|
|
33
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
34
|
+
const response = await authMemberAgent[method](endpoint);
|
|
35
|
+
if (response.statusCode === 500) {
|
|
36
|
+
console.log(response);
|
|
37
|
+
}
|
|
38
|
+
expect(response.statusCode).toBe(403);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
function getMethodAndEndpoint(route) {
|
|
42
|
+
return route.split(' ').map((segment, index) => {
|
|
43
|
+
return index % 2 === 0 ? segment.toLowerCase() : segment;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=auth.middleware.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.middleware.test.js","sourceRoot":"","sources":["../../../test/integration/auth.middleware.test.ts"],"names":[],"mappings":";;AACA,qCAAqC;AACrC,kDAI4B;AAE5B,wCAAwC;AACxC,0CAA0C;AAE1C,IAAI,GAAwB,CAAC;AAC7B,IAAI,UAAU,GAAG,EAAE,CAAC;AAEpB,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC;QAC1B,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;KAChD,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACvC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACnC,KAAK,CAAC,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,iBAAiB,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,2CAA+B,CAAC,MAAM,CAAC,0CAA8B,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACxF,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,CAAC,GAAG,KAAK,8CAA8C,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAAiB,CAAC,CAAC,CAAC;QAE3F,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,0CAA8B,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;IACtD,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,CAAC,GAAG,KAAK,yCAAyC,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SACtB;QAED,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9C,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const n8n_core_1 = require("n8n-core");
|
|
4
|
+
const src_1 = require("../../src");
|
|
5
|
+
const random_1 = require("./shared/random");
|
|
6
|
+
const utils = require("./shared/utils");
|
|
7
|
+
const testDb = require("./shared/testDb");
|
|
8
|
+
let app;
|
|
9
|
+
let testDbName = '';
|
|
10
|
+
let saveCredential;
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
app = utils.initTestServer({
|
|
13
|
+
endpointGroups: ['credentials'],
|
|
14
|
+
applyAuth: true,
|
|
15
|
+
});
|
|
16
|
+
const initResult = await testDb.init();
|
|
17
|
+
testDbName = initResult.testDbName;
|
|
18
|
+
utils.initConfigFile();
|
|
19
|
+
const credentialOwnerRole = await testDb.getCredentialOwnerRole();
|
|
20
|
+
saveCredential = affixRoleToSaveCredential(credentialOwnerRole);
|
|
21
|
+
utils.initTestTelemetry();
|
|
22
|
+
});
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
await testDb.createOwnerShell();
|
|
25
|
+
});
|
|
26
|
+
afterEach(async () => {
|
|
27
|
+
await testDb.truncate(['SharedCredentials'], testDbName);
|
|
28
|
+
await testDb.truncate(['User', 'Credentials'], testDbName);
|
|
29
|
+
});
|
|
30
|
+
afterAll(async () => {
|
|
31
|
+
await testDb.terminate(testDbName);
|
|
32
|
+
});
|
|
33
|
+
test('POST /credentials should create cred', async () => {
|
|
34
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
35
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
36
|
+
const payload = credentialPayload();
|
|
37
|
+
const response = await authOwnerAgent.post('/credentials').send(payload);
|
|
38
|
+
expect(response.statusCode).toBe(200);
|
|
39
|
+
const { id, name, type, nodesAccess, data: encryptedData } = response.body.data;
|
|
40
|
+
expect(name).toBe(payload.name);
|
|
41
|
+
expect(type).toBe(payload.type);
|
|
42
|
+
expect(nodesAccess[0].nodeType).toBe(payload.nodesAccess[0].nodeType);
|
|
43
|
+
expect(encryptedData).not.toBe(payload.data);
|
|
44
|
+
const credential = await src_1.Db.collections.Credentials.findOneOrFail(id);
|
|
45
|
+
expect(credential.name).toBe(payload.name);
|
|
46
|
+
expect(credential.type).toBe(payload.type);
|
|
47
|
+
expect(credential.nodesAccess[0].nodeType).toBe(payload.nodesAccess[0].nodeType);
|
|
48
|
+
expect(credential.data).not.toBe(payload.data);
|
|
49
|
+
const sharedCredential = await src_1.Db.collections.SharedCredentials.findOneOrFail({
|
|
50
|
+
relations: ['user', 'credentials'],
|
|
51
|
+
where: { credentials: credential },
|
|
52
|
+
});
|
|
53
|
+
expect(sharedCredential.user.id).toBe(owner.id);
|
|
54
|
+
expect(sharedCredential.credentials.name).toBe(payload.name);
|
|
55
|
+
});
|
|
56
|
+
test('POST /credentials should fail with invalid inputs', async () => {
|
|
57
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
58
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
59
|
+
for (const invalidPayload of INVALID_PAYLOADS) {
|
|
60
|
+
const response = await authOwnerAgent.post('/credentials').send(invalidPayload);
|
|
61
|
+
expect(response.statusCode).toBe(400);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
test('POST /credentials should fail with missing encryption key', async () => {
|
|
65
|
+
const mock = jest.spyOn(n8n_core_1.UserSettings, 'getEncryptionKey');
|
|
66
|
+
mock.mockResolvedValue(undefined);
|
|
67
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
68
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
69
|
+
const response = await authOwnerAgent.post('/credentials').send(credentialPayload());
|
|
70
|
+
expect(response.statusCode).toBe(500);
|
|
71
|
+
mock.mockRestore();
|
|
72
|
+
});
|
|
73
|
+
test('POST /credentials should ignore ID in payload', async () => {
|
|
74
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
75
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
76
|
+
const firstResponse = await authOwnerAgent
|
|
77
|
+
.post('/credentials')
|
|
78
|
+
.send(Object.assign({ id: '8' }, credentialPayload()));
|
|
79
|
+
expect(firstResponse.body.data.id).not.toBe('8');
|
|
80
|
+
const secondResponse = await authOwnerAgent
|
|
81
|
+
.post('/credentials')
|
|
82
|
+
.send(Object.assign({ id: 8 }, credentialPayload()));
|
|
83
|
+
expect(secondResponse.body.data.id).not.toBe(8);
|
|
84
|
+
});
|
|
85
|
+
test('DELETE /credentials/:id should delete owned cred for owner', async () => {
|
|
86
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
87
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
88
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
89
|
+
const response = await authOwnerAgent.delete(`/credentials/${savedCredential.id}`);
|
|
90
|
+
expect(response.statusCode).toBe(200);
|
|
91
|
+
expect(response.body).toEqual({ data: true });
|
|
92
|
+
const deletedCredential = await src_1.Db.collections.Credentials.findOne(savedCredential.id);
|
|
93
|
+
expect(deletedCredential).toBeUndefined();
|
|
94
|
+
const deletedSharedCredential = await src_1.Db.collections.SharedCredentials.findOne();
|
|
95
|
+
expect(deletedSharedCredential).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
test('DELETE /credentials/:id should delete non-owned cred for owner', async () => {
|
|
98
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
99
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
100
|
+
const member = await testDb.createUser();
|
|
101
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
|
102
|
+
const response = await authOwnerAgent.delete(`/credentials/${savedCredential.id}`);
|
|
103
|
+
expect(response.statusCode).toBe(200);
|
|
104
|
+
expect(response.body).toEqual({ data: true });
|
|
105
|
+
const deletedCredential = await src_1.Db.collections.Credentials.findOne(savedCredential.id);
|
|
106
|
+
expect(deletedCredential).toBeUndefined();
|
|
107
|
+
const deletedSharedCredential = await src_1.Db.collections.SharedCredentials.findOne();
|
|
108
|
+
expect(deletedSharedCredential).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
test('DELETE /credentials/:id should delete owned cred for member', async () => {
|
|
111
|
+
const member = await testDb.createUser();
|
|
112
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
113
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
|
114
|
+
const response = await authMemberAgent.delete(`/credentials/${savedCredential.id}`);
|
|
115
|
+
expect(response.statusCode).toBe(200);
|
|
116
|
+
expect(response.body).toEqual({ data: true });
|
|
117
|
+
const deletedCredential = await src_1.Db.collections.Credentials.findOne(savedCredential.id);
|
|
118
|
+
expect(deletedCredential).toBeUndefined();
|
|
119
|
+
const deletedSharedCredential = await src_1.Db.collections.SharedCredentials.findOne();
|
|
120
|
+
expect(deletedSharedCredential).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
test('DELETE /credentials/:id should not delete non-owned cred for member', async () => {
|
|
123
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
124
|
+
const member = await testDb.createUser();
|
|
125
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
126
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
127
|
+
const response = await authMemberAgent.delete(`/credentials/${savedCredential.id}`);
|
|
128
|
+
expect(response.statusCode).toBe(404);
|
|
129
|
+
const shellCredential = await src_1.Db.collections.Credentials.findOne(savedCredential.id);
|
|
130
|
+
expect(shellCredential).toBeDefined();
|
|
131
|
+
const deletedSharedCredential = await src_1.Db.collections.SharedCredentials.findOne();
|
|
132
|
+
expect(deletedSharedCredential).toBeDefined();
|
|
133
|
+
});
|
|
134
|
+
test('DELETE /credentials/:id should fail if cred not found', async () => {
|
|
135
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
136
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
137
|
+
const response = await authOwnerAgent.delete('/credentials/123');
|
|
138
|
+
expect(response.statusCode).toBe(404);
|
|
139
|
+
});
|
|
140
|
+
test('PATCH /credentials/:id should update owned cred for owner', async () => {
|
|
141
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
142
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
143
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
144
|
+
const patchPayload = credentialPayload();
|
|
145
|
+
const response = await authOwnerAgent
|
|
146
|
+
.patch(`/credentials/${savedCredential.id}`)
|
|
147
|
+
.send(patchPayload);
|
|
148
|
+
expect(response.statusCode).toBe(200);
|
|
149
|
+
const { id, name, type, nodesAccess, data: encryptedData } = response.body.data;
|
|
150
|
+
expect(name).toBe(patchPayload.name);
|
|
151
|
+
expect(type).toBe(patchPayload.type);
|
|
152
|
+
expect(nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
153
|
+
expect(encryptedData).not.toBe(patchPayload.data);
|
|
154
|
+
const credential = await src_1.Db.collections.Credentials.findOneOrFail(id);
|
|
155
|
+
expect(credential.name).toBe(patchPayload.name);
|
|
156
|
+
expect(credential.type).toBe(patchPayload.type);
|
|
157
|
+
expect(credential.nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
158
|
+
expect(credential.data).not.toBe(patchPayload.data);
|
|
159
|
+
const sharedCredential = await src_1.Db.collections.SharedCredentials.findOneOrFail({
|
|
160
|
+
relations: ['credentials'],
|
|
161
|
+
where: { credentials: credential },
|
|
162
|
+
});
|
|
163
|
+
expect(sharedCredential.credentials.name).toBe(patchPayload.name);
|
|
164
|
+
});
|
|
165
|
+
test('PATCH /credentials/:id should update non-owned cred for owner', async () => {
|
|
166
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
167
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
168
|
+
const member = await testDb.createUser();
|
|
169
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
|
170
|
+
const patchPayload = credentialPayload();
|
|
171
|
+
const response = await authOwnerAgent
|
|
172
|
+
.patch(`/credentials/${savedCredential.id}`)
|
|
173
|
+
.send(patchPayload);
|
|
174
|
+
expect(response.statusCode).toBe(200);
|
|
175
|
+
const { id, name, type, nodesAccess, data: encryptedData } = response.body.data;
|
|
176
|
+
expect(name).toBe(patchPayload.name);
|
|
177
|
+
expect(type).toBe(patchPayload.type);
|
|
178
|
+
expect(nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
179
|
+
expect(encryptedData).not.toBe(patchPayload.data);
|
|
180
|
+
const credential = await src_1.Db.collections.Credentials.findOneOrFail(id);
|
|
181
|
+
expect(credential.name).toBe(patchPayload.name);
|
|
182
|
+
expect(credential.type).toBe(patchPayload.type);
|
|
183
|
+
expect(credential.nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
184
|
+
expect(credential.data).not.toBe(patchPayload.data);
|
|
185
|
+
const sharedCredential = await src_1.Db.collections.SharedCredentials.findOneOrFail({
|
|
186
|
+
relations: ['credentials'],
|
|
187
|
+
where: { credentials: credential },
|
|
188
|
+
});
|
|
189
|
+
expect(sharedCredential.credentials.name).toBe(patchPayload.name);
|
|
190
|
+
});
|
|
191
|
+
test('PATCH /credentials/:id should update owned cred for member', async () => {
|
|
192
|
+
const member = await testDb.createUser();
|
|
193
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
194
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
|
195
|
+
const patchPayload = credentialPayload();
|
|
196
|
+
const response = await authMemberAgent
|
|
197
|
+
.patch(`/credentials/${savedCredential.id}`)
|
|
198
|
+
.send(patchPayload);
|
|
199
|
+
expect(response.statusCode).toBe(200);
|
|
200
|
+
const { id, name, type, nodesAccess, data: encryptedData } = response.body.data;
|
|
201
|
+
expect(name).toBe(patchPayload.name);
|
|
202
|
+
expect(type).toBe(patchPayload.type);
|
|
203
|
+
expect(nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
204
|
+
expect(encryptedData).not.toBe(patchPayload.data);
|
|
205
|
+
const credential = await src_1.Db.collections.Credentials.findOneOrFail(id);
|
|
206
|
+
expect(credential.name).toBe(patchPayload.name);
|
|
207
|
+
expect(credential.type).toBe(patchPayload.type);
|
|
208
|
+
expect(credential.nodesAccess[0].nodeType).toBe(patchPayload.nodesAccess[0].nodeType);
|
|
209
|
+
expect(credential.data).not.toBe(patchPayload.data);
|
|
210
|
+
const sharedCredential = await src_1.Db.collections.SharedCredentials.findOneOrFail({
|
|
211
|
+
relations: ['credentials'],
|
|
212
|
+
where: { credentials: credential },
|
|
213
|
+
});
|
|
214
|
+
expect(sharedCredential.credentials.name).toBe(patchPayload.name);
|
|
215
|
+
});
|
|
216
|
+
test('PATCH /credentials/:id should not update non-owned cred for member', async () => {
|
|
217
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
218
|
+
const member = await testDb.createUser();
|
|
219
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
220
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
221
|
+
const patchPayload = credentialPayload();
|
|
222
|
+
const response = await authMemberAgent
|
|
223
|
+
.patch(`/credentials/${savedCredential.id}`)
|
|
224
|
+
.send(patchPayload);
|
|
225
|
+
expect(response.statusCode).toBe(404);
|
|
226
|
+
const shellCredential = await src_1.Db.collections.Credentials.findOneOrFail(savedCredential.id);
|
|
227
|
+
expect(shellCredential.name).not.toBe(patchPayload.name);
|
|
228
|
+
});
|
|
229
|
+
test('PATCH /credentials/:id should fail with invalid inputs', async () => {
|
|
230
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
231
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
232
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
233
|
+
for (const invalidPayload of INVALID_PAYLOADS) {
|
|
234
|
+
const response = await authOwnerAgent
|
|
235
|
+
.patch(`/credentials/${savedCredential.id}`)
|
|
236
|
+
.send(invalidPayload);
|
|
237
|
+
expect(response.statusCode).toBe(400);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
test('PATCH /credentials/:id should fail if cred not found', async () => {
|
|
241
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
242
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
243
|
+
const response = await authOwnerAgent.patch('/credentials/123').send(credentialPayload());
|
|
244
|
+
expect(response.statusCode).toBe(404);
|
|
245
|
+
});
|
|
246
|
+
test('PATCH /credentials/:id should fail with missing encryption key', async () => {
|
|
247
|
+
const mock = jest.spyOn(n8n_core_1.UserSettings, 'getEncryptionKey');
|
|
248
|
+
mock.mockResolvedValue(undefined);
|
|
249
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
250
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
251
|
+
const response = await authOwnerAgent.post('/credentials').send(credentialPayload());
|
|
252
|
+
expect(response.statusCode).toBe(500);
|
|
253
|
+
mock.mockRestore();
|
|
254
|
+
});
|
|
255
|
+
test('GET /credentials should retrieve all creds for owner', async () => {
|
|
256
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
257
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
258
|
+
for (let i = 0; i < 3; i++) {
|
|
259
|
+
await saveCredential(credentialPayload(), { user: owner });
|
|
260
|
+
}
|
|
261
|
+
const member = await testDb.createUser();
|
|
262
|
+
await saveCredential(credentialPayload(), { user: member });
|
|
263
|
+
const response = await authOwnerAgent.get('/credentials');
|
|
264
|
+
expect(response.statusCode).toBe(200);
|
|
265
|
+
expect(response.body.data.length).toBe(4);
|
|
266
|
+
for (const credential of response.body.data) {
|
|
267
|
+
const { name, type, nodesAccess, data: encryptedData } = credential;
|
|
268
|
+
expect(typeof name).toBe('string');
|
|
269
|
+
expect(typeof type).toBe('string');
|
|
270
|
+
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
|
271
|
+
expect(encryptedData).toBeUndefined();
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
test('GET /credentials should retrieve owned creds for member', async () => {
|
|
275
|
+
const member = await testDb.createUser();
|
|
276
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
277
|
+
for (let i = 0; i < 3; i++) {
|
|
278
|
+
await saveCredential(credentialPayload(), { user: member });
|
|
279
|
+
}
|
|
280
|
+
const response = await authMemberAgent.get('/credentials');
|
|
281
|
+
expect(response.statusCode).toBe(200);
|
|
282
|
+
expect(response.body.data.length).toBe(3);
|
|
283
|
+
for (const credential of response.body.data) {
|
|
284
|
+
const { name, type, nodesAccess, data: encryptedData } = credential;
|
|
285
|
+
expect(typeof name).toBe('string');
|
|
286
|
+
expect(typeof type).toBe('string');
|
|
287
|
+
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
|
288
|
+
expect(encryptedData).toBeUndefined();
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
test('GET /credentials should not retrieve non-owned creds for member', async () => {
|
|
292
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
293
|
+
const member = await testDb.createUser();
|
|
294
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
295
|
+
for (let i = 0; i < 3; i++) {
|
|
296
|
+
await saveCredential(credentialPayload(), { user: owner });
|
|
297
|
+
}
|
|
298
|
+
const response = await authMemberAgent.get('/credentials');
|
|
299
|
+
expect(response.statusCode).toBe(200);
|
|
300
|
+
expect(response.body.data.length).toBe(0);
|
|
301
|
+
});
|
|
302
|
+
test('GET /credentials/:id should retrieve owned cred for owner', async () => {
|
|
303
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
304
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
305
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
306
|
+
const firstResponse = await authOwnerAgent.get(`/credentials/${savedCredential.id}`);
|
|
307
|
+
expect(firstResponse.statusCode).toBe(200);
|
|
308
|
+
expect(typeof firstResponse.body.data.name).toBe('string');
|
|
309
|
+
expect(typeof firstResponse.body.data.type).toBe('string');
|
|
310
|
+
expect(typeof firstResponse.body.data.nodesAccess[0].nodeType).toBe('string');
|
|
311
|
+
expect(firstResponse.body.data.data).toBeUndefined();
|
|
312
|
+
const secondResponse = await authOwnerAgent
|
|
313
|
+
.get(`/credentials/${savedCredential.id}`)
|
|
314
|
+
.query({ includeData: true });
|
|
315
|
+
expect(secondResponse.statusCode).toBe(200);
|
|
316
|
+
expect(typeof secondResponse.body.data.name).toBe('string');
|
|
317
|
+
expect(typeof secondResponse.body.data.type).toBe('string');
|
|
318
|
+
expect(typeof secondResponse.body.data.nodesAccess[0].nodeType).toBe('string');
|
|
319
|
+
expect(secondResponse.body.data.data).toBeDefined();
|
|
320
|
+
});
|
|
321
|
+
test('GET /credentials/:id should retrieve owned cred for member', async () => {
|
|
322
|
+
const member = await testDb.createUser();
|
|
323
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
324
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
|
325
|
+
const firstResponse = await authMemberAgent.get(`/credentials/${savedCredential.id}`);
|
|
326
|
+
expect(firstResponse.statusCode).toBe(200);
|
|
327
|
+
expect(typeof firstResponse.body.data.name).toBe('string');
|
|
328
|
+
expect(typeof firstResponse.body.data.type).toBe('string');
|
|
329
|
+
expect(typeof firstResponse.body.data.nodesAccess[0].nodeType).toBe('string');
|
|
330
|
+
expect(firstResponse.body.data.data).toBeUndefined();
|
|
331
|
+
const secondResponse = await authMemberAgent
|
|
332
|
+
.get(`/credentials/${savedCredential.id}`)
|
|
333
|
+
.query({ includeData: true });
|
|
334
|
+
expect(secondResponse.statusCode).toBe(200);
|
|
335
|
+
expect(typeof secondResponse.body.data.name).toBe('string');
|
|
336
|
+
expect(typeof secondResponse.body.data.type).toBe('string');
|
|
337
|
+
expect(typeof secondResponse.body.data.nodesAccess[0].nodeType).toBe('string');
|
|
338
|
+
expect(secondResponse.body.data.data).toBeDefined();
|
|
339
|
+
});
|
|
340
|
+
test('GET /credentials/:id should not retrieve non-owned cred for member', async () => {
|
|
341
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
342
|
+
const member = await testDb.createUser();
|
|
343
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
|
344
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
345
|
+
const response = await authMemberAgent.get(`/credentials/${savedCredential.id}`);
|
|
346
|
+
expect(response.statusCode).toBe(404);
|
|
347
|
+
expect(response.body.data).toBeUndefined();
|
|
348
|
+
});
|
|
349
|
+
test('GET /credentials/:id should fail with missing encryption key', async () => {
|
|
350
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
351
|
+
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
352
|
+
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
|
353
|
+
const mock = jest.spyOn(n8n_core_1.UserSettings, 'getEncryptionKey');
|
|
354
|
+
mock.mockResolvedValue(undefined);
|
|
355
|
+
const response = await authOwnerAgent
|
|
356
|
+
.get(`/credentials/${savedCredential.id}`)
|
|
357
|
+
.query({ includeData: true });
|
|
358
|
+
expect(response.statusCode).toBe(500);
|
|
359
|
+
mock.mockRestore();
|
|
360
|
+
});
|
|
361
|
+
test('GET /credentials/:id should return 404 if cred not found', async () => {
|
|
362
|
+
const owner = await src_1.Db.collections.User.findOneOrFail();
|
|
363
|
+
const authMemberAgent = utils.createAgent(app, { auth: true, user: owner });
|
|
364
|
+
const response = await authMemberAgent.get('/credentials/789');
|
|
365
|
+
expect(response.statusCode).toBe(404);
|
|
366
|
+
});
|
|
367
|
+
const credentialPayload = () => ({
|
|
368
|
+
name: random_1.randomName(),
|
|
369
|
+
type: random_1.randomName(),
|
|
370
|
+
nodesAccess: [{ nodeType: random_1.randomName() }],
|
|
371
|
+
data: { accessToken: random_1.randomString(6, 16) },
|
|
372
|
+
});
|
|
373
|
+
const INVALID_PAYLOADS = [
|
|
374
|
+
{
|
|
375
|
+
type: random_1.randomName(),
|
|
376
|
+
nodesAccess: [{ nodeType: random_1.randomName() }],
|
|
377
|
+
data: { accessToken: random_1.randomString(6, 16) },
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
name: random_1.randomName(),
|
|
381
|
+
nodesAccess: [{ nodeType: random_1.randomName() }],
|
|
382
|
+
data: { accessToken: random_1.randomString(6, 16) },
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
name: random_1.randomName(),
|
|
386
|
+
type: random_1.randomName(),
|
|
387
|
+
data: { accessToken: random_1.randomString(6, 16) },
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
name: random_1.randomName(),
|
|
391
|
+
type: random_1.randomName(),
|
|
392
|
+
nodesAccess: [{ nodeType: random_1.randomName() }],
|
|
393
|
+
},
|
|
394
|
+
{},
|
|
395
|
+
[],
|
|
396
|
+
undefined,
|
|
397
|
+
];
|
|
398
|
+
function affixRoleToSaveCredential(role) {
|
|
399
|
+
return (credentialPayload, { user }) => testDb.saveCredential(credentialPayload, { user, role });
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=credentials.api.test.js.map
|