diff --git a/packages/cli/src/sso/saml/constants.ts b/packages/cli/src/sso/saml/constants.ts index 4b1bca0fce..b2dd3f2a9b 100644 --- a/packages/cli/src/sso/saml/constants.ts +++ b/packages/cli/src/sso/saml/constants.ts @@ -21,7 +21,7 @@ export class SamlUrls { static readonly defaultRedirect = '/'; - static readonly samlOnboarding = '/settings/personal'; // TODO:SAML: implement signup page + static readonly samlOnboarding = '/saml/onboarding'; } export const SAML_PREFERENCES_DB_KEY = 'features.saml'; diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts index b611b0a436..fb7483df03 100644 --- a/packages/editor-ui/src/constants.ts +++ b/packages/editor-ui/src/constants.ts @@ -389,6 +389,7 @@ export enum VIEWS { USAGE = 'Usage', LOG_STREAMING_SETTINGS = 'LogStreamingSettingsView', SSO_SETTINGS = 'SSoSettings', + SAML_ONBOARDING = 'SamlOnboarding', } export enum FAKE_DOOR_FEATURES { diff --git a/packages/editor-ui/src/router.ts b/packages/editor-ui/src/router.ts index 701cb1388f..937cb003a8 100644 --- a/packages/editor-ui/src/router.ts +++ b/packages/editor-ui/src/router.ts @@ -38,6 +38,7 @@ import { useSSOStore } from './stores/sso'; import SettingsUsageAndPlanVue from './views/SettingsUsageAndPlan.vue'; import SettingsSso from './views/SettingsSso.vue'; import SignoutView from '@/views/SignoutView.vue'; +import SamlOnboarding from '@/views/SamlOnboarding.vue'; Vue.use(Router); @@ -670,6 +671,34 @@ export const routes = [ }, ], }, + { + path: '/saml/onboarding', + name: VIEWS.SAML_ONBOARDING, + components: { + default: SamlOnboarding, + }, + meta: { + telemetry: { + pageCategory: 'auth', + }, + permissions: { + allow: { + loginStatus: [LOGIN_STATUS.LoggedIn], + }, + deny: { + shouldDeny: () => { + const settingsStore = useSettingsStore(); + const ssoStore = useSSOStore(); + return ( + !ssoStore.isEnterpriseSamlEnabled || + settingsStore.isCloudDeployment || + settingsStore.isDesktopDeployment + ); + }, + }, + }, + }, + }, { path: '*', name: VIEWS.NOT_FOUND, diff --git a/packages/editor-ui/src/stores/sso.ts b/packages/editor-ui/src/stores/sso.ts index 229bf99ec4..a897e824ab 100644 --- a/packages/editor-ui/src/stores/sso.ts +++ b/packages/editor-ui/src/stores/sso.ts @@ -5,10 +5,13 @@ import { useRootStore } from '@/stores/n8nRootStore'; import { useSettingsStore } from '@/stores/settings'; import * as ssoApi from '@/api/sso'; import { SamlPreferences } from '@/Interface'; +import { updateCurrentUser } from '@/api/users'; +import { useUsersStore } from '@/stores/users'; export const useSSOStore = defineStore('sso', () => { const rootStore = useRootStore(); const settingsStore = useSettingsStore(); + const usersStore = useUsersStore(); const state = reactive({ loading: false, @@ -58,6 +61,13 @@ export const useSSOStore = defineStore('sso', () => { ssoApi.saveSamlConfig(rootStore.getRestApiContext, config); const testSamlConfig = () => ssoApi.testSamlConfig(rootStore.getRestApiContext); + const updateUser = async (params: { firstName: string; lastName: string }) => + updateCurrentUser(rootStore.getRestApiContext, { + id: usersStore.currentUser!.id, + email: usersStore.currentUser!.email!, + ...params, + }); + return { isLoading, setLoading, @@ -69,5 +79,6 @@ export const useSSOStore = defineStore('sso', () => { getSamlConfig, saveSamlConfig, testSamlConfig, + updateUser, }; }); diff --git a/packages/editor-ui/src/views/SamlOnboarding.vue b/packages/editor-ui/src/views/SamlOnboarding.vue new file mode 100644 index 0000000000..044aa99a75 --- /dev/null +++ b/packages/editor-ui/src/views/SamlOnboarding.vue @@ -0,0 +1,44 @@ + + +