diff options
Diffstat (limited to 'apps/federatedfilesharing/src/components/AdminSettings.vue')
-rw-r--r-- | apps/federatedfilesharing/src/components/AdminSettings.vue | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/apps/federatedfilesharing/src/components/AdminSettings.vue b/apps/federatedfilesharing/src/components/AdminSettings.vue new file mode 100644 index 00000000000..84bf6b565a3 --- /dev/null +++ b/apps/federatedfilesharing/src/components/AdminSettings.vue @@ -0,0 +1,215 @@ +<!-- + - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<template> + <NcSettingsSection :name="t('federatedfilesharing', 'Federated Cloud Sharing')" + :description="t('federatedfilesharing', 'Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing.')" + :doc-url="sharingFederatedDocUrl"> + <NcCheckboxRadioSwitch type="switch" + :checked.sync="outgoingServer2serverShareEnabled" + @update:checked="update('outgoing_server2server_share_enabled', outgoingServer2serverShareEnabled)"> + {{ t('federatedfilesharing', 'Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)') }} + </NcCheckboxRadioSwitch> + + <NcCheckboxRadioSwitch type="switch" + :checked.sync="incomingServer2serverShareEnabled" + @update:checked="update('incoming_server2server_share_enabled', incomingServer2serverShareEnabled)"> + {{ t('federatedfilesharing', 'Allow people on this server to receive shares from other servers') }} + </NcCheckboxRadioSwitch> + + <NcCheckboxRadioSwitch v-if="federatedGroupSharingSupported" + type="switch" + :checked.sync="outgoingServer2serverGroupShareEnabled" + @update:checked="update('outgoing_server2server_group_share_enabled', outgoingServer2serverGroupShareEnabled)"> + {{ t('federatedfilesharing', 'Allow people on this server to send shares to groups on other servers') }} + </NcCheckboxRadioSwitch> + + <NcCheckboxRadioSwitch v-if="federatedGroupSharingSupported" + type="switch" + :checked.sync="incomingServer2serverGroupShareEnabled" + @update:checked="update('incoming_server2server_group_share_enabled', incomingServer2serverGroupShareEnabled)"> + {{ t('federatedfilesharing', 'Allow people on this server to receive group shares from other servers') }} + </NcCheckboxRadioSwitch> + + <fieldset> + <legend>{{ t('federatedfilesharing', 'The lookup server is only available for global scale.') }}</legend> + + <NcCheckboxRadioSwitch type="switch" + :checked="lookupServerEnabled" + disabled + @update:checked="showLookupServerConfirmation"> + {{ t('federatedfilesharing', 'Search global and public address book for people') }} + </NcCheckboxRadioSwitch> + + <NcCheckboxRadioSwitch type="switch" + :checked="lookupServerUploadEnabled" + disabled + @update:checked="showLookupServerUploadConfirmation"> + {{ t('federatedfilesharing', 'Allow people to publish their data to a global and public address book') }} + </NcCheckboxRadioSwitch> + </fieldset> + + <!-- Trusted server handling --> + <div class="settings-subsection"> + <h3 class="settings-subsection__name"> + {{ t('federatedfilesharing', 'Trusted federation') }} + </h3> + <NcCheckboxRadioSwitch type="switch" + :checked.sync="federatedTrustedShareAutoAccept" + @update:checked="update('federatedTrustedShareAutoAccept', federatedTrustedShareAutoAccept)"> + {{ t('federatedfilesharing', 'Automatically accept shares from trusted federated accounts and groups by default') }} + </NcCheckboxRadioSwitch> + </div> + </NcSettingsSection> +</template> + +<script> +import { loadState } from '@nextcloud/initial-state' +import { DialogBuilder, DialogSeverity, showError } from '@nextcloud/dialogs' +import { generateOcsUrl } from '@nextcloud/router' +import { confirmPassword } from '@nextcloud/password-confirmation' +import axios from '@nextcloud/axios' +import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch' +import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection' + +import '@nextcloud/password-confirmation/dist/style.css' + +export default { + name: 'AdminSettings', + + components: { + NcCheckboxRadioSwitch, + NcSettingsSection, + }, + + data() { + return { + outgoingServer2serverShareEnabled: loadState('federatedfilesharing', 'outgoingServer2serverShareEnabled'), + incomingServer2serverShareEnabled: loadState('federatedfilesharing', 'incomingServer2serverShareEnabled'), + outgoingServer2serverGroupShareEnabled: loadState('federatedfilesharing', 'outgoingServer2serverGroupShareEnabled'), + incomingServer2serverGroupShareEnabled: loadState('federatedfilesharing', 'incomingServer2serverGroupShareEnabled'), + federatedGroupSharingSupported: loadState('federatedfilesharing', 'federatedGroupSharingSupported'), + lookupServerEnabled: loadState('federatedfilesharing', 'lookupServerEnabled'), + lookupServerUploadEnabled: loadState('federatedfilesharing', 'lookupServerUploadEnabled'), + federatedTrustedShareAutoAccept: loadState('federatedfilesharing', 'federatedTrustedShareAutoAccept'), + internalOnly: loadState('federatedfilesharing', 'internalOnly'), + sharingFederatedDocUrl: loadState('federatedfilesharing', 'sharingFederatedDocUrl'), + } + }, + methods: { + setLookupServerUploadEnabled(state) { + if (state === this.lookupServerUploadEnabled) { + return + } + this.lookupServerUploadEnabled = state + this.update('lookupServerUploadEnabled', state) + }, + + async showLookupServerUploadConfirmation(state) { + // No confirmation needed for disabling + if (state === false) { + return this.setLookupServerUploadEnabled(false) + } + + const dialog = new DialogBuilder(t('federatedfilesharing', 'Confirm data upload to lookup server')) + await dialog + .setSeverity(DialogSeverity.Warning) + .setText( + t('federatedfilesharing', 'When enabled, all account properties (e.g. email address) with scope visibility set to "published", will be automatically synced and transmitted to an external system and made available in a public, global address book.'), + ) + .addButton({ + callback: () => this.setLookupServerUploadEnabled(false), + label: t('federatedfilesharing', 'Disable upload'), + }) + .addButton({ + callback: () => this.setLookupServerUploadEnabled(true), + label: t('federatedfilesharing', 'Enable data upload'), + type: 'error', + }) + .build() + .show() + }, + + setLookupServerEnabled(state) { + if (state === this.lookupServerEnabled) { + return + } + this.lookupServerEnabled = state + this.update('lookupServerEnabled', state) + }, + + async showLookupServerConfirmation(state) { + // No confirmation needed for disabling + if (state === false) { + return this.setLookupServerEnabled(false) + } + + const dialog = new DialogBuilder(t('federatedfilesharing', 'Confirm querying lookup server')) + await dialog + .setSeverity(DialogSeverity.Warning) + .setText( + t('federatedfilesharing', 'When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book.') + + t('federatedfilesharing', 'This is used to retrieve the federated cloud ID to make federated sharing easier.') + + t('federatedfilesharing', 'Moreover, email addresses of users might be sent to that system in order to verify them.'), + ) + .addButton({ + callback: () => this.setLookupServerEnabled(false), + label: t('federatedfilesharing', 'Disable querying'), + }) + .addButton({ + callback: () => this.setLookupServerEnabled(true), + label: t('federatedfilesharing', 'Enable querying'), + type: 'error', + }) + .build() + .show() + }, + + async update(key, value) { + await confirmPassword() + + const url = generateOcsUrl('/apps/provisioning_api/api/v1/config/apps/{appId}/{key}', { + appId: 'files_sharing', + key, + }) + + const stringValue = value ? 'yes' : 'no' + try { + const { data } = await axios.post(url, { + value: stringValue, + }) + this.handleResponse({ + status: data.ocs?.meta?.status, + }) + } catch (e) { + this.handleResponse({ + errorMessage: t('federatedfilesharing', 'Unable to update federated files sharing config'), + error: e, + }) + } + }, + async handleResponse({ status, errorMessage, error }) { + if (status !== 'ok') { + showError(errorMessage) + console.error(errorMessage, error) + } + }, + }, +} +</script> +<style scoped> +.settings-subsection { + margin-top: 20px; +} + +.settings-subsection__name { + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 16px; + font-weight: bold; + max-width: 900px; + margin-top: 0; +} +</style> |