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 @@
-
-
- Username
+
-
{{ user.username || user.id }}
-
- User ID
+
-
{{ user.id }}
-
- Display name
+
-
{{ user.displayname }}
-
- Email
+
-
{{ user.email }}
- No email has been set up
+
-
- Group memberships
+
-
{{ groupNames }}
- You are not part of any group
+
-
- Language
+
-
+
+
+ -
+
+
+
+
+
@@ -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`] = `
-
- Username
+ - Username
-
- Display name
+ - Display name
-
- Email
+ - Email
-
- No email has been set up
+ No email has been set up
-
- Group memberships
+ - Group memberships
-
- You are not part of any group
+ You are not part of any group
+
+
- Logout from active devices
+ -
+
+
+
`;
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 } = {}) {