diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts
index 1008a09639..588dc13b48 100644
--- a/packages/editor-ui/src/Interface.ts
+++ b/packages/editor-ui/src/Interface.ts
@@ -530,6 +530,7 @@ export interface IPermissionGroup {
loginStatus?: ILogInStatus[];
role?: IRole[];
um?: boolean;
+ api?: boolean;
}
export interface IPermissions {
@@ -632,6 +633,9 @@ export interface IN8nUISettings {
enabled: boolean;
host: string;
};
+ publicApi: {
+ enabled: boolean;
+ };
}
export interface IWorkflowSettings extends IWorkflowSettingsWorkflow {
@@ -834,6 +838,7 @@ export interface ISettingsState {
userManagement: IUserManagementConfig;
templatesEndpointHealthy: boolean;
api: {
+ enabled: boolean;
key: string | undefined;
};
}
diff --git a/packages/editor-ui/src/components/MainSidebar.vue b/packages/editor-ui/src/components/MainSidebar.vue
index 7ed13fac03..9274389a4f 100644
--- a/packages/editor-ui/src/components/MainSidebar.vue
+++ b/packages/editor-ui/src/components/MainSidebar.vue
@@ -259,7 +259,11 @@ export default mixins(
'isTemplatesEnabled',
]),
canUserAccessSettings(): boolean {
- return this.canUserAccessRouteByName(VIEWS.PERSONAL_SETTINGS) || this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS);
+ return [
+ VIEWS.PERSONAL_SETTINGS,
+ VIEWS.USERS_SETTINGS,
+ VIEWS.API_SETTINGS,
+ ].some((route) => this.canUserAccessRouteByName(route));
},
helpMenuItems (): object[] {
return [
diff --git a/packages/editor-ui/src/components/SettingsSidebar.vue b/packages/editor-ui/src/components/SettingsSidebar.vue
index da15882587..91aeb0eb64 100644
--- a/packages/editor-ui/src/components/SettingsSidebar.vue
+++ b/packages/editor-ui/src/components/SettingsSidebar.vue
@@ -19,7 +19,7 @@
{{ $locale.baseText('settings.users') }}
-
+
@@ -54,6 +54,9 @@ export default mixins(
canAccessUsersSettings(): boolean {
return this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS);
},
+ canAccessApiSettings(): boolean {
+ return this.canUserAccessRouteByName(VIEWS.API_SETTINGS);
+ },
onVersionClick() {
this.$store.dispatch('ui/openModal', ABOUT_MODAL_KEY);
},
diff --git a/packages/editor-ui/src/components/mixins/userHelpers.ts b/packages/editor-ui/src/components/mixins/userHelpers.ts
index 9a1fb398a3..720e7b7249 100644
--- a/packages/editor-ui/src/components/mixins/userHelpers.ts
+++ b/packages/editor-ui/src/components/mixins/userHelpers.ts
@@ -19,11 +19,13 @@ export const userHelpers = Vue.extend({
const permissions: IPermissions = route.meta && route.meta.permissions;
const currentUser = this.$store.getters['users/currentUser'];
const isUMEnabled = this.$store.getters['settings/isUserManagementEnabled'];
+ const isPublicApiEnabled = this.$store.getters['settings/isPublicApiEnabled'];
- if (permissions && isAuthorized(permissions, { currentUser, isUMEnabled })) {
- return true;
- }
- return false;
+ return permissions && isAuthorized(permissions, {
+ currentUser,
+ isUMEnabled,
+ isPublicApiEnabled,
+ });
},
},
});
diff --git a/packages/editor-ui/src/modules/settings.ts b/packages/editor-ui/src/modules/settings.ts
index 1452d27921..9169f97d69 100644
--- a/packages/editor-ui/src/modules/settings.ts
+++ b/packages/editor-ui/src/modules/settings.ts
@@ -26,6 +26,7 @@ const module: Module = {
},
templatesEndpointHealthy: false,
api: {
+ enabled: false,
key: undefined,
},
},
@@ -36,6 +37,9 @@ const module: Module = {
isUserManagementEnabled(state: ISettingsState): boolean {
return state.userManagement.enabled;
},
+ isPublicApiEnabled(state: ISettingsState): boolean {
+ return state.api.enabled;
+ },
showSetupPage(state: ISettingsState) {
return state.userManagement.showSetupOnFirstLoad;
},
@@ -82,6 +86,7 @@ const module: Module = {
state.userManagement.enabled = settings.userManagement.enabled;
state.userManagement.showSetupOnFirstLoad = !!settings.userManagement.showSetupOnFirstLoad;
state.userManagement.smtpSetup = settings.userManagement.smtpSetup;
+ state.api.enabled = settings.publicApi.enabled;
},
stopShowingSetupPage(state: ISettingsState) {
Vue.set(state.userManagement, 'showSetupOnFirstLoad', false);
diff --git a/packages/editor-ui/src/modules/userHelpers.ts b/packages/editor-ui/src/modules/userHelpers.ts
index 61f3505ed6..3d78082b69 100644
--- a/packages/editor-ui/src/modules/userHelpers.ts
+++ b/packages/editor-ui/src/modules/userHelpers.ts
@@ -42,10 +42,25 @@ export const PERMISSIONS: IUserPermissions = {
},
};
-export const isAuthorized = (permissions: IPermissions, {currentUser, isUMEnabled}: {currentUser: IUser | null, isUMEnabled: boolean}): boolean => {
+interface IsAuthorizedOptions {
+ currentUser: IUser | null;
+ isUMEnabled?: boolean;
+ isPublicApiEnabled?: boolean;
+}
+
+export const isAuthorized = (permissions: IPermissions, {
+ currentUser,
+ isUMEnabled,
+ isPublicApiEnabled,
+}: IsAuthorizedOptions): boolean => {
const loginStatus = currentUser ? LOGIN_STATUS.LoggedIn : LOGIN_STATUS.LoggedOut;
+
if (permissions.deny) {
- if (permissions.deny.um === isUMEnabled) {
+ if (permissions.deny.hasOwnProperty('um') && permissions.deny.um === isUMEnabled) {
+ return false;
+ }
+
+ if (permissions.deny.hasOwnProperty('api') && permissions.deny.api === isPublicApiEnabled) {
return false;
}
@@ -65,7 +80,11 @@ export const isAuthorized = (permissions: IPermissions, {currentUser, isUMEnable
}
if (permissions.allow) {
- if (permissions.allow.um === isUMEnabled) {
+ if (permissions.allow.hasOwnProperty('um') && permissions.allow.um === isUMEnabled) {
+ return true;
+ }
+
+ if (permissions.allow.hasOwnProperty('api') && permissions.allow.api === isPublicApiEnabled) {
return true;
}
diff --git a/packages/editor-ui/src/router.ts b/packages/editor-ui/src/router.ts
index 331e3e1128..231ae2d5f8 100644
--- a/packages/editor-ui/src/router.ts
+++ b/packages/editor-ui/src/router.ts
@@ -375,6 +375,9 @@ const router = new Router({
allow: {
loginStatus: [LOGIN_STATUS.LoggedIn],
},
+ deny: {
+ api: false,
+ },
},
},
},