diff --git a/changelog/unreleased/enhancement-add-logout-url b/changelog/unreleased/enhancement-add-logout-url new file mode 100644 index 00000000000..4d0124f41d0 --- /dev/null +++ b/changelog/unreleased/enhancement-add-logout-url @@ -0,0 +1,6 @@ +Enhancement: Add logout url + +We've added "Logout from active devices" in the account settings + +https://github.com/owncloud/web/pull/8630 +https://github.com/owncloud/web/issues/8609 diff --git a/packages/web-pkg/src/configuration/manager.ts b/packages/web-pkg/src/configuration/manager.ts index fef708d120f..5b5607b1dfd 100644 --- a/packages/web-pkg/src/configuration/manager.ts +++ b/packages/web-pkg/src/configuration/manager.ts @@ -34,6 +34,15 @@ export class ConfigurationManager { this.oidcConfiguration = rawConfig.openIdConnect ? (rawConfig.openIdConnect as OIDCConfiguration) : null + this.logoutUrl = rawConfig.options?.logoutUrl + } + + set logoutUrl(url: string) { + this.optionsConfiguration.logoutUrl = url + } + + get logoutUrl(): string { + return this.optionsConfiguration.logoutUrl } set serverUrl(url: string) { diff --git a/packages/web-pkg/src/configuration/types.ts b/packages/web-pkg/src/configuration/types.ts index 9323518a152..91a0cdcc569 100644 --- a/packages/web-pkg/src/configuration/types.ts +++ b/packages/web-pkg/src/configuration/types.ts @@ -8,6 +8,7 @@ export interface RoutingOptionsConfiguration { export interface OptionsConfiguration { routing?: RoutingOptionsConfiguration + logoutUrl?: string } export interface OAuth2Configuration { diff --git a/packages/web-runtime/src/pages/account.vue b/packages/web-runtime/src/pages/account.vue index 5c1ef5dd319..c35cdbd349a 100644 --- a/packages/web-runtime/src/pages/account.vue +++ b/packages/web-runtime/src/pages/account.vue @@ -30,44 +30,46 @@ -

Account Information

+

+
@@ -97,6 +113,7 @@ import axios from 'axios' import { v4 as uuidV4 } from 'uuid' import { useGettext } from 'vue3-gettext' import { setCurrentLanguage } from 'web-runtime/src/helpers/language' +import { configurationManager } from 'web-pkg/src/configuration' export default defineComponent({ name: 'Personal', @@ -201,6 +218,10 @@ export default defineComponent({ return unref(user).groups.join(', ') }) + const logoutUrl = computed(() => { + return configurationManager.logoutUrl + }) + onMounted(() => { if (unref(isLanguageSupported)) { loadAccountBundleTask.perform() @@ -216,7 +237,8 @@ export default defineComponent({ isChangePasswordEnabled, isLanguageSupported, groupNames, - user + user, + logoutUrl } }, data() { diff --git a/packages/web-runtime/tests/unit/pages/__snapshots__/account.spec.ts.snap b/packages/web-runtime/tests/unit/pages/__snapshots__/account.spec.ts.snap index eceb6ee95a2..37dfd0da120 100644 --- a/packages/web-runtime/tests/unit/pages/__snapshots__/account.spec.ts.snap +++ b/packages/web-runtime/tests/unit/pages/__snapshots__/account.spec.ts.snap @@ -3,27 +3,33 @@ exports[`account page account information displays basic user information 1`] = `
+
`; diff --git a/packages/web-runtime/tests/unit/pages/account.spec.ts b/packages/web-runtime/tests/unit/pages/account.spec.ts index 5b23cf90f94..948ca3b12cb 100644 --- a/packages/web-runtime/tests/unit/pages/account.spec.ts +++ b/packages/web-runtime/tests/unit/pages/account.spec.ts @@ -23,6 +23,12 @@ const selectors = { groupNamesEmpty: '[data-testid="group-names-empty"]' } +jest.mock('web-pkg/src/configuration', () => ({ + configurationManager: { + logoutUrl: 'https://account-manager/logout' + } +})) + describe('account page', () => { describe('header section', () => { it('renders page title', () => { @@ -113,6 +119,22 @@ describe('account page', () => { expect(wrapper.vm.isChangePasswordEnabled).toBeFalsy() }) }) + describe('Logout from all devices link', () => { + it('should render the logout from active devices if logoutUrl is provided', () => { + const { wrapper } = getWrapper() + expect(wrapper.find('[data-testid="logout"]').exists()).toBe(true) + }) + it("shouldn't render the logout from active devices if logoutUrl isn't provided", () => { + const { wrapper } = getWrapper() + wrapper.vm.logoutUrl = undefined + expect(wrapper.find('[data-testid="logout"]').exists()).toBe(true) + }) + it('should use url from configuration manager', () => { + const { wrapper } = getWrapper() + const button = wrapper.find('oc-button-stub') + expect(button.attributes('href')).toBe('https://account-manager/logout') + }) + }) }) function getWrapper({ data = {}, user = {}, capabilities = {}, accountEditLink = undefined } = {}) {