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>>;
|
||||
ownedBy?: Partial<IUser>;
|
||||
versionId: string;
|
||||
usedCredentials?: Array<Partial<ICredentialsResponse>>;
|
||||
usedCredentials?: IUsedCredential[];
|
||||
}
|
||||
|
||||
// Identical to cli.Interfaces.ts
|
||||
|
|
|
@ -125,8 +125,10 @@ export default mixins(showMessage, workflowHelpers, restApi).extend({
|
|||
try {
|
||||
let workflowToUpdate: IWorkflowDataUpdate | undefined;
|
||||
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;
|
||||
|
||||
this.removeForeignCredentialsFromWorkflow(workflowToUpdate, this.credentialsStore.allCredentials);
|
||||
}
|
||||
|
||||
const saved = await this.saveAsNewWorkflow({
|
||||
|
|
|
@ -67,6 +67,7 @@ import { useTemplatesStore } from '@/stores/templates';
|
|||
import { useNodeTypesStore } from '@/stores/nodeTypes';
|
||||
import useWorkflowsEEStore from "@/stores/workflows.ee";
|
||||
import {useUsersStore} from "@/stores/users";
|
||||
import {ICredentialMap, ICredentialsResponse, IUsedCredential} from "@/Interface";
|
||||
|
||||
let cachedWorkflowKey: string | null = '';
|
||||
let cachedWorkflow: Workflow | null = null;
|
||||
|
@ -928,5 +929,23 @@ export const workflowHelpers = mixins(
|
|||
|
||||
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: [],
|
||||
pinData: {},
|
||||
versionId: '',
|
||||
usedCredentials: [],
|
||||
});
|
||||
|
||||
export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, {
|
||||
|
@ -269,6 +270,7 @@ export const useWorkflowsStore = defineStore(STORES.WORKFLOWS, {
|
|||
},
|
||||
|
||||
setUsedCredentials(data: IUsedCredential[]) {
|
||||
this.workflow.usedCredentials = data;
|
||||
this.usedCredentials = data.reduce<{ [name: string]: IUsedCredential }>((accu, credential) => {
|
||||
accu[credential.id!] = credential;
|
||||
return accu;
|
||||
|
|
|
@ -1230,7 +1230,10 @@ export default mixins(
|
|||
...data,
|
||||
};
|
||||
|
||||
this.removeForeignCredentialsFromWorkflow(workflowToCopy, this.credentialsStore.allCredentials);
|
||||
|
||||
const nodeData = JSON.stringify(workflowToCopy, null, 2);
|
||||
|
||||
this.copyToClipboard(nodeData);
|
||||
if (data.nodes.length > 0) {
|
||||
if (!isCut) {
|
||||
|
|
Loading…
Reference in a new issue