mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
fix: Remove foreign credentials when copying nodes or duplicating workflow (#4880)
* fix: Remove foreign credentials when copying nodes or duplicating workflow * chore: fix linting issue
This commit is contained in:
parent
4765d767e3
commit
7d2e2ee0f7
|
@ -315,7 +315,7 @@ export interface IWorkflowDb {
|
||||||
sharedWith?: Array<Partial<IUser>>;
|
sharedWith?: Array<Partial<IUser>>;
|
||||||
ownedBy?: Partial<IUser>;
|
ownedBy?: Partial<IUser>;
|
||||||
versionId: string;
|
versionId: string;
|
||||||
usedCredentials?: Array<Partial<ICredentialsResponse>>;
|
usedCredentials?: IUsedCredential[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Identical to cli.Interfaces.ts
|
// Identical to cli.Interfaces.ts
|
||||||
|
|
|
@ -125,8 +125,10 @@ export default mixins(showMessage, workflowHelpers, restApi).extend({
|
||||||
try {
|
try {
|
||||||
let workflowToUpdate: IWorkflowDataUpdate | undefined;
|
let workflowToUpdate: IWorkflowDataUpdate | undefined;
|
||||||
if (currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {
|
if (currentWorkflowId !== PLACEHOLDER_EMPTY_WORKFLOW_ID) {
|
||||||
const { createdAt, updatedAt, ...workflow } = await this.restApi().getWorkflow(this.data.id);
|
const { createdAt, updatedAt, usedCredentials, ...workflow } = await this.restApi().getWorkflow(this.data.id);
|
||||||
workflowToUpdate = workflow;
|
workflowToUpdate = workflow;
|
||||||
|
|
||||||
|
this.removeForeignCredentialsFromWorkflow(workflowToUpdate, this.credentialsStore.allCredentials);
|
||||||
}
|
}
|
||||||
|
|
||||||
const saved = await this.saveAsNewWorkflow({
|
const saved = await this.saveAsNewWorkflow({
|
||||||
|
|
|
@ -67,6 +67,7 @@ import { useTemplatesStore } from '@/stores/templates';
|
||||||
import { useNodeTypesStore } from '@/stores/nodeTypes';
|
import { useNodeTypesStore } from '@/stores/nodeTypes';
|
||||||
import useWorkflowsEEStore from "@/stores/workflows.ee";
|
import useWorkflowsEEStore from "@/stores/workflows.ee";
|
||||||
import {useUsersStore} from "@/stores/users";
|
import {useUsersStore} from "@/stores/users";
|
||||||
|
import {ICredentialMap, ICredentialsResponse, IUsedCredential} from "@/Interface";
|
||||||
|
|
||||||
let cachedWorkflowKey: string | null = '';
|
let cachedWorkflowKey: string | null = '';
|
||||||
let cachedWorkflow: Workflow | null = null;
|
let cachedWorkflow: Workflow | null = null;
|
||||||
|
@ -928,5 +929,23 @@ export const workflowHelpers = mixins(
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
removeForeignCredentialsFromWorkflow(workflow: IWorkflowData | IWorkflowDataUpdate, usableCredentials: ICredentialsResponse[]): void {
|
||||||
|
workflow.nodes.forEach((node: INode) => {
|
||||||
|
if (!node.credentials) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node.credentials = Object.entries(node.credentials)
|
||||||
|
.reduce<INodeCredentials>((acc, [credentialType, credential]) => {
|
||||||
|
const isUsableCredential = usableCredentials.some((ownCredential) => `${ownCredential.id}` === `${credential.id}`);
|
||||||
|
if (credential.id && isUsableCredential) {
|
||||||
|
acc[credentialType] = node.credentials![credentialType];
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -69,6 +69,7 @@ const createEmptyWorkflow = (): IWorkflowDb => ({
|
||||||
tags: [],
|
tags: [],
|
||||||
pinData: {},
|
pinData: {},
|
||||||
versionId: '',
|
versionId: '',
|
||||||
|
usedCredentials: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, {
|
export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, {
|
||||||
|
@ -269,6 +270,7 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, {
|
||||||
},
|
},
|
||||||
|
|
||||||
setUsedCredentials(data: IUsedCredential[]) {
|
setUsedCredentials(data: IUsedCredential[]) {
|
||||||
|
this.workflow.usedCredentials = data;
|
||||||
this.usedCredentials = data.reduce<{ [name: string]: IUsedCredential }>((accu, credential) => {
|
this.usedCredentials = data.reduce<{ [name: string]: IUsedCredential }>((accu, credential) => {
|
||||||
accu[credential.id!] = credential;
|
accu[credential.id!] = credential;
|
||||||
return accu;
|
return accu;
|
||||||
|
|
|
@ -1230,7 +1230,10 @@ export default mixins(
|
||||||
...data,
|
...data,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.removeForeignCredentialsFromWorkflow(workflowToCopy, this.credentialsStore.allCredentials);
|
||||||
|
|
||||||
const nodeData = JSON.stringify(workflowToCopy, null, 2);
|
const nodeData = JSON.stringify(workflowToCopy, null, 2);
|
||||||
|
|
||||||
this.copyToClipboard(nodeData);
|
this.copyToClipboard(nodeData);
|
||||||
if (data.nodes.length > 0) {
|
if (data.nodes.length > 0) {
|
||||||
if (!isCut) {
|
if (!isCut) {
|
||||||
|
|
Loading…
Reference in a new issue