aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-10-23 20:12:32 +0200
committerFerdinand Thiessen <opensource@fthiessen.de>2024-10-23 20:12:32 +0200
commit6d2c63ecffd86556a94458f6d57c7ae6abf26fb9 (patch)
tree80ab0229e8fbc19fdd19b427ca23455f8b8dd07f /apps/settings
parentc00d49bb5517b8bb9c9843cbebe13c182deed0a3 (diff)
downloadnextcloud-server-6d2c63ecffd86556a94458f6d57c7ae6abf26fb9.tar.gz
nextcloud-server-6d2c63ecffd86556a94458f6d57c7ae6abf26fb9.zip
fix(settings): Do not use `null` on `string` parameter for sharing disclaimer
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps/settings')
-rw-r--r--apps/settings/lib/Settings/Admin/Sharing.php2
-rw-r--r--apps/settings/src/components/AdminSettingsSharingForm.vue34
-rw-r--r--apps/settings/tests/Settings/Admin/SharingTest.php182
3 files changed, 112 insertions, 106 deletions
diff --git a/apps/settings/lib/Settings/Admin/Sharing.php b/apps/settings/lib/Settings/Admin/Sharing.php
index c9ad58250c9..f1c9052f4c3 100644
--- a/apps/settings/lib/Settings/Admin/Sharing.php
+++ b/apps/settings/lib/Settings/Admin/Sharing.php
@@ -62,7 +62,7 @@ class Sharing implements IDelegatedSettings {
'enforceExpireDate' => $this->getHumanBooleanConfig('core', 'shareapi_enforce_expire_date'),
'excludeGroups' => $this->config->getAppValue('core', 'shareapi_exclude_groups', 'no'),
'excludeGroupsList' => json_decode($excludedGroups, true) ?? [],
- 'publicShareDisclaimerText' => $this->config->getAppValue('core', 'shareapi_public_link_disclaimertext', null),
+ 'publicShareDisclaimerText' => $this->config->getAppValue('core', 'shareapi_public_link_disclaimertext'),
'enableLinkPasswordByDefault' => $this->getHumanBooleanConfig('core', 'shareapi_enable_link_password_by_default'),
'defaultPermissions' => (int)$this->config->getAppValue('core', 'shareapi_default_permissions', (string)Constants::PERMISSION_ALL),
'defaultInternalExpireDate' => $this->getHumanBooleanConfig('core', 'shareapi_default_internal_expire_date'),
diff --git a/apps/settings/src/components/AdminSettingsSharingForm.vue b/apps/settings/src/components/AdminSettingsSharingForm.vue
index 93f30b2262c..8e31fc8f96d 100644
--- a/apps/settings/src/components/AdminSettingsSharingForm.vue
+++ b/apps/settings/src/components/AdminSettingsSharingForm.vue
@@ -170,7 +170,7 @@
<NcCheckboxRadioSwitch type="switch" :checked.sync="publicShareDisclaimerEnabled">
{{ t('settings', 'Show disclaimer text on the public link upload page (only shown when the file list is hidden)') }}
</NcCheckboxRadioSwitch>
- <div v-if="typeof settings.publicShareDisclaimerText === 'string'"
+ <div v-if="publicShareDisclaimerEnabled"
aria-describedby="settings-sharing-privary-related-disclaimer-hint"
class="sharing__sub-section">
<NcTextArea class="sharing__input"
@@ -231,7 +231,7 @@ interface IShareSettings {
enforceExpireDate: boolean
excludeGroups: string
excludeGroupsList: string[]
- publicShareDisclaimerText?: string
+ publicShareDisclaimerText: string
enableLinkPasswordByDefault: boolean
defaultPermissions: number
defaultInternalExpireDate: boolean
@@ -252,8 +252,10 @@ export default defineComponent({
SelectSharingPermissions,
},
data() {
+ const settingsData = loadState<IShareSettings>('settings', 'sharingSettings')
return {
- settingsData: loadState<IShareSettings>('settings', 'sharingSettings'),
+ settingsData,
+ publicShareDisclaimerEnabled: settingsData.publicShareDisclaimerText !== '',
}
},
computed: {
@@ -272,26 +274,24 @@ export default defineComponent({
},
})
},
- publicShareDisclaimerEnabled: {
- get() {
- return typeof this.settingsData.publicShareDisclaimerText === 'string'
- },
- set(value) {
- if (value) {
- this.settingsData.publicShareDisclaimerText = ''
- } else {
- this.onUpdateDisclaimer()
- }
- },
+ },
+
+ watch: {
+ publicShareDisclaimerEnabled() {
+ // When disabled we just remove the disclaimer content
+ if (this.publicShareDisclaimerEnabled === false) {
+ this.onUpdateDisclaimer('')
+ }
},
},
+
methods: {
t,
- onUpdateDisclaimer: debounce(function(value?: string) {
+ onUpdateDisclaimer: debounce(function(value: string) {
const options = {
success() {
- if (value) {
+ if (value !== '') {
showSuccess(t('settings', 'Changed disclaimer text'))
} else {
showSuccess(t('settings', 'Deleted disclaimer text'))
@@ -301,7 +301,7 @@ export default defineComponent({
showError(t('settings', 'Could not set disclaimer text'))
},
}
- if (!value) {
+ if (value === '') {
window.OCP.AppConfig.deleteKey('core', 'shareapi_public_link_disclaimertext', options)
} else {
window.OCP.AppConfig.setValue('core', 'shareapi_public_link_disclaimertext', value, options)
diff --git a/apps/settings/tests/Settings/Admin/SharingTest.php b/apps/settings/tests/Settings/Admin/SharingTest.php
index 9db7a257806..5fcc153b6dd 100644
--- a/apps/settings/tests/Settings/Admin/SharingTest.php
+++ b/apps/settings/tests/Settings/Admin/SharingTest.php
@@ -20,9 +20,9 @@ use Test\TestCase;
class SharingTest extends TestCase {
/** @var Sharing */
private $admin;
- /** @var IConfig */
+ /** @var IConfig&MockObject */
private $config;
- /** @var IL10N|MockObject */
+ /** @var IL10N&MockObject */
private $l10n;
/** @var IManager|MockObject */
private $shareManager;
@@ -35,9 +35,7 @@ class SharingTest extends TestCase {
protected function setUp(): void {
parent::setUp();
- /** @var IConfig|MockObject */
$this->config = $this->getMockBuilder(IConfig::class)->getMock();
- /** @var IL10N|MockObject */
$this->l10n = $this->getMockBuilder(IL10N::class)->getMock();
/** @var IManager|MockObject */
@@ -82,7 +80,7 @@ class SharingTest extends TestCase {
['core', 'shareapi_expire_after_n_days', '7', '7'],
['core', 'shareapi_enforce_expire_date', 'no', 'no'],
['core', 'shareapi_exclude_groups', 'no', 'no'],
- ['core', 'shareapi_public_link_disclaimertext', null, 'Lorem ipsum'],
+ ['core', 'shareapi_public_link_disclaimertext', '', 'Lorem ipsum'],
['core', 'shareapi_enable_link_password_by_default', 'no', 'yes'],
['core', 'shareapi_default_permissions', (string)Constants::PERMISSION_ALL, Constants::PERMISSION_ALL],
['core', 'shareapi_default_internal_expire_date', 'no', 'no'],
@@ -98,50 +96,53 @@ class SharingTest extends TestCase {
->willReturn(false);
$this->appManager->method('isEnabledForUser')->with('files_sharing')->willReturn(false);
+
+ $initialStateCalls = [];
$this->initialState
->expects($this->exactly(3))
->method('provideInitialState')
- ->withConsecutive(
- ['sharingAppEnabled', false],
- ['sharingDocumentation', ''],
- [
- 'sharingSettings',
- [
- 'allowGroupSharing' => true,
- 'allowLinks' => true,
- 'allowPublicUpload' => true,
- 'allowResharing' => true,
- 'allowShareDialogUserEnumeration' => true,
- 'restrictUserEnumerationToGroup' => false,
- 'restrictUserEnumerationToPhone' => false,
- 'restrictUserEnumerationFullMatch' => true,
- 'restrictUserEnumerationFullMatchUserId' => true,
- 'restrictUserEnumerationFullMatchEmail' => true,
- 'restrictUserEnumerationFullMatchIgnoreSecondDN' => false,
- 'enforceLinksPassword' => false,
- 'onlyShareWithGroupMembers' => false,
- 'enabled' => true,
- 'defaultExpireDate' => false,
- 'expireAfterNDays' => '7',
- 'enforceExpireDate' => false,
- 'excludeGroups' => 'no',
- 'excludeGroupsList' => [],
- 'publicShareDisclaimerText' => 'Lorem ipsum',
- 'enableLinkPasswordByDefault' => true,
- 'defaultPermissions' => Constants::PERMISSION_ALL,
- 'defaultInternalExpireDate' => false,
- 'internalExpireAfterNDays' => '7',
- 'enforceInternalExpireDate' => false,
- 'defaultRemoteExpireDate' => false,
- 'remoteExpireAfterNDays' => '7',
- 'enforceRemoteExpireDate' => false,
- 'allowLinksExcludeGroups' => [],
- 'onlyShareWithGroupMembersExcludeGroupList' => [],
- 'enforceLinksPasswordExcludedGroups' => [],
- 'enforceLinksPasswordExcludedGroupsEnabled' => false,
- ]
- ],
- );
+ ->willReturnCallback(function (string $key) use (&$initialStateCalls) {
+ $initialStateCalls[$key] = func_get_args();
+ });
+
+ $expectedInitialStateCalls = [
+ 'sharingAppEnabled' => false,
+ 'sharingDocumentation' => '',
+ 'sharingSettings' => [
+ 'allowGroupSharing' => true,
+ 'allowLinks' => true,
+ 'allowPublicUpload' => true,
+ 'allowResharing' => true,
+ 'allowShareDialogUserEnumeration' => true,
+ 'restrictUserEnumerationToGroup' => false,
+ 'restrictUserEnumerationToPhone' => false,
+ 'restrictUserEnumerationFullMatch' => true,
+ 'restrictUserEnumerationFullMatchUserId' => true,
+ 'restrictUserEnumerationFullMatchEmail' => true,
+ 'restrictUserEnumerationFullMatchIgnoreSecondDN' => false,
+ 'enforceLinksPassword' => false,
+ 'onlyShareWithGroupMembers' => false,
+ 'enabled' => true,
+ 'defaultExpireDate' => false,
+ 'expireAfterNDays' => '7',
+ 'enforceExpireDate' => false,
+ 'excludeGroups' => 'no',
+ 'excludeGroupsList' => [],
+ 'publicShareDisclaimerText' => 'Lorem ipsum',
+ 'enableLinkPasswordByDefault' => true,
+ 'defaultPermissions' => Constants::PERMISSION_ALL,
+ 'defaultInternalExpireDate' => false,
+ 'internalExpireAfterNDays' => '7',
+ 'enforceInternalExpireDate' => false,
+ 'defaultRemoteExpireDate' => false,
+ 'remoteExpireAfterNDays' => '7',
+ 'enforceRemoteExpireDate' => false,
+ 'allowLinksExcludeGroups' => [],
+ 'onlyShareWithGroupMembersExcludeGroupList' => [],
+ 'enforceLinksPasswordExcludedGroups' => [],
+ 'enforceLinksPasswordExcludedGroupsEnabled' => false,
+ ]
+ ];
$expected = new TemplateResponse(
'settings',
@@ -151,6 +152,7 @@ class SharingTest extends TestCase {
);
$this->assertEquals($expected, $this->admin->getForm());
+ $this->assertEquals(sort($expectedInitialStateCalls), sort($initialStateCalls), 'Provided initial state does not match');
}
public function testGetFormWithExcludedGroups(): void {
@@ -175,7 +177,7 @@ class SharingTest extends TestCase {
['core', 'shareapi_expire_after_n_days', '7', '7'],
['core', 'shareapi_enforce_expire_date', 'no', 'no'],
['core', 'shareapi_exclude_groups', 'no', 'yes'],
- ['core', 'shareapi_public_link_disclaimertext', null, 'Lorem ipsum'],
+ ['core', 'shareapi_public_link_disclaimertext', '', 'Lorem ipsum'],
['core', 'shareapi_enable_link_password_by_default', 'no', 'yes'],
['core', 'shareapi_default_permissions', (string)Constants::PERMISSION_ALL, Constants::PERMISSION_ALL],
['core', 'shareapi_default_internal_expire_date', 'no', 'no'],
@@ -191,50 +193,53 @@ class SharingTest extends TestCase {
->willReturn(false);
$this->appManager->method('isEnabledForUser')->with('files_sharing')->willReturn(true);
+
+ $initialStateCalls = [];
$this->initialState
->expects($this->exactly(3))
->method('provideInitialState')
- ->withConsecutive(
- ['sharingAppEnabled', true],
- ['sharingDocumentation', ''],
- [
- 'sharingSettings',
- [
- 'allowGroupSharing' => true,
- 'allowLinks' => true,
- 'allowPublicUpload' => true,
- 'allowResharing' => true,
- 'allowShareDialogUserEnumeration' => true,
- 'restrictUserEnumerationToGroup' => false,
- 'restrictUserEnumerationToPhone' => false,
- 'restrictUserEnumerationFullMatch' => true,
- 'restrictUserEnumerationFullMatchUserId' => true,
- 'restrictUserEnumerationFullMatchEmail' => true,
- 'restrictUserEnumerationFullMatchIgnoreSecondDN' => false,
- 'enforceLinksPassword' => false,
- 'onlyShareWithGroupMembers' => false,
- 'enabled' => true,
- 'defaultExpireDate' => false,
- 'expireAfterNDays' => '7',
- 'enforceExpireDate' => false,
- 'excludeGroups' => 'yes',
- 'excludeGroupsList' => ['NoSharers','OtherNoSharers'],
- 'publicShareDisclaimerText' => 'Lorem ipsum',
- 'enableLinkPasswordByDefault' => true,
- 'defaultPermissions' => Constants::PERMISSION_ALL,
- 'defaultInternalExpireDate' => false,
- 'internalExpireAfterNDays' => '7',
- 'enforceInternalExpireDate' => false,
- 'defaultRemoteExpireDate' => false,
- 'remoteExpireAfterNDays' => '7',
- 'enforceRemoteExpireDate' => false,
- 'allowLinksExcludeGroups' => [],
- 'onlyShareWithGroupMembersExcludeGroupList' => [],
- 'enforceLinksPasswordExcludedGroups' => [],
- 'enforceLinksPasswordExcludedGroupsEnabled' => false,
- ]
- ],
- );
+ ->willReturnCallback(function (string $key) use (&$initialStateCalls) {
+ $initialStateCalls[$key] = func_get_args();
+ });
+
+ $expectedInitialStateCalls = [
+ 'sharingAppEnabled' => true,
+ 'sharingDocumentation' => '',
+ 'sharingSettings' => [
+ 'allowGroupSharing' => true,
+ 'allowLinks' => true,
+ 'allowPublicUpload' => true,
+ 'allowResharing' => true,
+ 'allowShareDialogUserEnumeration' => true,
+ 'restrictUserEnumerationToGroup' => false,
+ 'restrictUserEnumerationToPhone' => false,
+ 'restrictUserEnumerationFullMatch' => true,
+ 'restrictUserEnumerationFullMatchUserId' => true,
+ 'restrictUserEnumerationFullMatchEmail' => true,
+ 'restrictUserEnumerationFullMatchIgnoreSecondDN' => false,
+ 'enforceLinksPassword' => false,
+ 'onlyShareWithGroupMembers' => false,
+ 'enabled' => true,
+ 'defaultExpireDate' => false,
+ 'expireAfterNDays' => '7',
+ 'enforceExpireDate' => false,
+ 'excludeGroups' => 'yes',
+ 'excludeGroupsList' => ['NoSharers','OtherNoSharers'],
+ 'publicShareDisclaimerText' => 'Lorem ipsum',
+ 'enableLinkPasswordByDefault' => true,
+ 'defaultPermissions' => Constants::PERMISSION_ALL,
+ 'defaultInternalExpireDate' => false,
+ 'internalExpireAfterNDays' => '7',
+ 'enforceInternalExpireDate' => false,
+ 'defaultRemoteExpireDate' => false,
+ 'remoteExpireAfterNDays' => '7',
+ 'enforceRemoteExpireDate' => false,
+ 'allowLinksExcludeGroups' => [],
+ 'onlyShareWithGroupMembersExcludeGroupList' => [],
+ 'enforceLinksPasswordExcludedGroups' => [],
+ 'enforceLinksPasswordExcludedGroupsEnabled' => false,
+ ],
+ ];
$expected = new TemplateResponse(
'settings',
@@ -244,6 +249,7 @@ class SharingTest extends TestCase {
);
$this->assertEquals($expected, $this->admin->getForm());
+ $this->assertEquals(sort($expectedInitialStateCalls), sort($initialStateCalls), 'Provided initial state does not match');
}
public function testGetSection(): void {