Skip to content

Commit b091566

Browse files
sandra0503Tuukkaa
authored andcommitted
feat(core): Enable external secrets for projects (#26329)
1 parent 76c78be commit b091566

9 files changed

Lines changed: 27 additions & 17 deletions

File tree

packages/@n8n/api-types/src/frontend-settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ export type FrontendModuleSettings = {
277277
multipleConnections: boolean;
278278
/** Whether project-scoped external secrets are enabled. */
279279
forProjects: boolean;
280+
/** Whether role-based access control for external secrets is enabled. */
281+
roleBasedAccess: boolean;
280282
};
281283
};
282284

packages/cli/src/modules/external-secrets.ee/external-secrets.config.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ export class ExternalSecretsConfig {
1212

1313
/** Whether to enable project-scoped external secrets */
1414
@Env('N8N_ENV_FEAT_EXTERNAL_SECRETS_FOR_PROJECTS')
15-
externalSecretsForProjects: boolean = false;
15+
externalSecretsForProjects: boolean = true;
1616

1717
/** Whether to enable multiple connections to global secret providers */
1818
@Env('N8N_ENV_FEAT_EXTERNAL_SECRETS_MULTIPLE_CONNECTIONS')
1919
externalSecretsMultipleConnections: boolean = true;
20+
21+
/** Whether to enable role based access control to manage secret providers */
22+
@Env('N8N_ENV_FEAT_EXTERNAL_SECRETS_ROLE_BASED_ACCESS')
23+
externalSecretsRoleBasedAccess: boolean = false;
2024
}

packages/cli/src/modules/external-secrets.ee/external-secrets.module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class ExternalSecretsModule implements ModuleInterface {
2929
return {
3030
multipleConnections: config.externalSecretsMultipleConnections,
3131
forProjects: config.externalSecretsForProjects,
32+
roleBasedAccess: config.externalSecretsRoleBasedAccess,
3233
};
3334
}
3435

packages/cli/test/integration/external-secrets/external-secrets.api.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ beforeAll(async () => {
136136

137137
// Get all service dependencies from Container
138138
const config = Container.get(ExternalSecretsConfig);
139+
config.externalSecretsForProjects = false;
139140
config.externalSecretsMultipleConnections = false;
140141
const settingsStore = Container.get(ExternalSecretsSettingsStore);
141142
const providerRegistry = Container.get(ExternalSecretsProviderRegistry);

packages/frontend/@n8n/i18n/src/locales/en.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3040,7 +3040,7 @@
30403040
"settings.externalSecrets.docs": "https://docs.n8n.io/external-secrets/",
30413041
"settings.externalSecrets.docs.use": "https://docs.n8n.io/external-secrets/#use-secrets-in-n8n-credentials",
30423042
"settings.secretsProviderConnections.title": "External Secrets",
3043-
"settings.secretsProviderConnections.emptyState.heading": "Add an external secrets store",
3043+
"settings.secretsProviderConnections.emptyState.heading": "Add an external secrets vault",
30443044
"settings.secretsProviderConnections.emptyState.description": "Manage credentials across multiple environments by adding an external secrets store. Keep sensitive credential information in your vault for added security.",
30453045
"settings.secretsProviderConnections.buttons.addSecretsStore": "Add secrets vault",
30463046
"settings.secretsProviderConnections.description": "Manage credentials across multiple environments by connecting an external secrets store. Keep sensitive credential information in your vault for added security.",
@@ -3053,7 +3053,7 @@
30533053
"settings.secretsProviderConnections.modal.scope.placeholder.project": "Assign globally or within selected project",
30543054
"settings.secretsProviderConnections.modal.scope.global": "Global",
30553055
"settings.secretsProviderConnections.modal.scope.emptyOptionsText": "No matching projects found",
3056-
"settings.secretsProviderConnections.modal.scope.info": "Selecting a project will share the secrets store with that project only. If you want to share the secrets store with all projects, select \"Global\".",
3056+
"settings.secretsProviderConnections.modal.scope.info": "Assigning a secret vault allows people to use external secrets in their credentials.",
30573057
"settings.secretsProviderConnections.modal.scope.label": "Scope",
30583058
"settings.secretsProviderConnections.modal.connectionName": "Vault name",
30593059
"settings.secretsProviderConnections.modal.providerType": "External secrets provider",
@@ -3079,8 +3079,8 @@
30793079
"settings.secretsProviderConnections.delete.confirmationLabel": "Type \"{name}\" to confirm.",
30803080
"settings.secretsProviderConnections.delete.success": "Secret store \"{name}\" deleted successfully",
30813081
"settings.secretsProviderConnections.delete.error": "Failed to delete secret store",
3082-
"settings.secretsProviderConnections.badge.tooltip.project": "This secrets store is shared with {projectName}.",
3083-
"settings.secretsProviderConnections.badge.tooltip.global": "This secrets store is available to all projects and users of this instance.",
3082+
"settings.secretsProviderConnections.badge.tooltip.project": "This secrets vault is shared with {projectName}.",
3083+
"settings.secretsProviderConnections.badge.tooltip.global": "This secrets vault is available to all projects and users of this instance.",
30843084
"settings.sourceControl.title": "Environments",
30853085
"settings.sourceControl.actionBox.title": "Available on the Enterprise plan",
30863086
"settings.sourceControl.actionBox.description": "Use multiple instances for different environments (dev, prod, etc.), deploying between them via a Git repository.",
@@ -4265,16 +4265,16 @@
42654265
"projects.settings.users.search.error": "An error occurred while searching for users",
42664266
"projects.settings.externalSecrets": "External secret stores",
42674267
"projects.settings.externalSecrets.emptyState.heading": "No external secrets available yet",
4268-
"projects.settings.externalSecrets.emptyState.instanceAdmin.noProjectProviders.description": "Share secrets store with this project to make external secrets available here. Once shared, secrets will appear automatically and can be referenced through aliases in credentials.",
4269-
"projects.settings.externalSecrets.emptyState.projectAdmin.description": "Add a secrets store and share it with this project to make external secrets available here. Once shared, secrets will appear automatically and can be referenced through aliases in credentials.",
4268+
"projects.settings.externalSecrets.emptyState.instanceAdmin.noProjectProviders.description": "Share secrets vault with this project to make external secrets available here. Once shared, secrets will appear automatically and can be referenced through aliases in credentials.",
4269+
"projects.settings.externalSecrets.emptyState.projectAdmin.description": "Add a secrets vault and share it with this project to make external secrets available here. Once shared, secrets will appear automatically and can be referenced through aliases in credentials.",
42704270
"projects.settings.externalSecrets.button.addSecretsStore": "Add secrets vault",
4271-
"projects.settings.externalSecrets.button.shareSecretsStore": "Share secrets store",
4271+
"projects.settings.externalSecrets.button.shareSecretsStore": "Share secrets vault",
42724272
"projects.settings.externalSecrets.table.header.secretName": "Secret name",
42734273
"projects.settings.externalSecrets.table.header.usedInCredentials": "Used in credentials",
42744274
"projects.settings.externalSecrets.search.placeholder": "Search secrets...",
42754275
"projects.settings.externalSecrets.load.error": "An error occurred while loading external secrets",
4276-
"projects.settings.externalSecrets.expand": "Expand external secrets store",
4277-
"projects.settings.externalSecrets.collapse": "Collapse external secrets store",
4276+
"projects.settings.externalSecrets.expand": "Expand external secrets vault",
4277+
"projects.settings.externalSecrets.collapse": "Collapse external secrets vault",
42784278
"projects.sharing.allUsers": "All users and projects",
42794279
"projects.sharing.noMatchingProjects": "There are no available projects",
42804280
"projects.sharing.noMatchingUsers": "No matching users or projects",

packages/frontend/editor-ui/src/features/integrations/secretsProviders.ee/components/SecretsProviderConnectionModal.ee.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ const initialState = {
139139
'external-secrets': {
140140
multipleConnections: true,
141141
forProjects: true,
142+
roleBasedAccess: false,
142143
},
143144
},
144145
},

packages/frontend/editor-ui/src/features/integrations/secretsProviders.ee/composables/useConnectionModal.ee.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ describe('useConnectionModal', () => {
208208
beforeEach(() => {
209209
mockModuleSettings['external-secrets'] = {
210210
multipleConnections: true,
211-
forProjects: false,
211+
forProjects: true,
212+
roleBasedAccess: false,
212213
};
213214
});
214215
it('should not provide option to create new infisical connection if multipleConnections is enabled', () => {

packages/frontend/editor-ui/src/features/project-roles/ProjectRoleView.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -493,26 +493,26 @@ describe('ProjectRoleView', () => {
493493
});
494494

495495
describe('External Secrets Scopes', () => {
496-
it('should not render externalSecretsProvider scope type when forProjects is off', () => {
496+
it('should not render externalSecretsProvider scope type when roleBasedAccess is off', () => {
497497
const { queryByText } = renderComponent();
498498

499499
expect(queryByText('Secret stores')).not.toBeInTheDocument();
500500
expect(queryByText('Secrets')).not.toBeInTheDocument();
501501
});
502502

503-
it('should render externalSecretsProvider scope type when forProjects is on', () => {
503+
it('should render externalSecretsProvider scope type when roleBasedAccess is on', () => {
504504
settingsStore.moduleSettings = {
505-
'external-secrets': { forProjects: true, multipleConnections: true },
505+
'external-secrets': { roleBasedAccess: true, forProjects: true, multipleConnections: true },
506506
};
507507
const { getByText } = renderComponent();
508508

509509
expect(getByText('Secrets vaults')).toBeInTheDocument();
510510
expect(getByText('Secrets')).toBeInTheDocument();
511511
});
512512

513-
it('should show secrets checkboxes when forProjects is on', async () => {
513+
it('should show secrets checkboxes when roleBasedAccess is on', async () => {
514514
settingsStore.moduleSettings = {
515-
'external-secrets': { forProjects: true, multipleConnections: true },
515+
'external-secrets': { roleBasedAccess: true, forProjects: true, multipleConnections: true },
516516
};
517517
const { getByTestId } = renderComponent();
518518

packages/frontend/editor-ui/src/features/project-roles/ProjectRoleView.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ function resetForm(payload: Role | undefined) {
129129
}
130130
131131
const scopeTypes = computed(() => {
132-
if (!settingsStore.moduleSettings['external-secrets']?.forProjects) {
132+
if (!settingsStore.moduleSettings['external-secrets']?.roleBasedAccess) {
133133
return SCOPE_TYPES.filter(
134134
(type) => type !== 'externalSecretsProvider' && type !== 'externalSecret',
135135
);

0 commit comments

Comments
 (0)