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, + }, }, }, },