mirror of
https://github.com/nextcloud/server.git
synced 2026-06-13 18:50:47 -04:00
fix(settings): Handle email change restriction separately from display name change restriction
Co-authored-by: provokateurin <kate@provokateurin.de> Co-authored-by: Ferdinand Thiessen <opensource@fthiessen.de> Co-authored-by: Louis <louis@chmn.me> Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
This commit is contained in:
parent
9bd991b3e8
commit
8a8d6addfb
7 changed files with 126 additions and 30 deletions
|
|
@ -744,14 +744,16 @@ class UsersController extends AUserData {
|
|||
$targetUser = $currentLoggedInUser;
|
||||
}
|
||||
|
||||
// Editing self (display, email)
|
||||
if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
|
||||
if (
|
||||
$targetUser->getBackend() instanceof ISetDisplayNameBackend
|
||||
|| $targetUser->getBackend()->implementsActions(Backend::SET_DISPLAYNAME)
|
||||
) {
|
||||
$permittedFields[] = IAccountManager::PROPERTY_DISPLAYNAME;
|
||||
}
|
||||
$allowDisplayNameChange = $this->config->getSystemValue('allow_user_to_change_display_name', true);
|
||||
if ($allowDisplayNameChange === true && (
|
||||
$targetUser->getBackend() instanceof ISetDisplayNameBackend
|
||||
|| $targetUser->getBackend()->implementsActions(Backend::SET_DISPLAYNAME)
|
||||
)) {
|
||||
$permittedFields[] = IAccountManager::PROPERTY_DISPLAYNAME;
|
||||
}
|
||||
|
||||
// Fallback to display name value to avoid changing behavior with the new option.
|
||||
if ($this->config->getSystemValue('allow_user_to_change_email', $allowDisplayNameChange)) {
|
||||
$permittedFields[] = IAccountManager::PROPERTY_EMAIL;
|
||||
}
|
||||
|
||||
|
|
@ -902,15 +904,17 @@ class UsersController extends AUserData {
|
|||
|
||||
$permittedFields = [];
|
||||
if ($targetUser->getUID() === $currentLoggedInUser->getUID()) {
|
||||
// Editing self (display, email)
|
||||
if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
|
||||
if (
|
||||
$targetUser->getBackend() instanceof ISetDisplayNameBackend
|
||||
|| $targetUser->getBackend()->implementsActions(Backend::SET_DISPLAYNAME)
|
||||
) {
|
||||
$permittedFields[] = self::USER_FIELD_DISPLAYNAME;
|
||||
$permittedFields[] = IAccountManager::PROPERTY_DISPLAYNAME;
|
||||
}
|
||||
$allowDisplayNameChange = $this->config->getSystemValue('allow_user_to_change_display_name', true);
|
||||
if ($allowDisplayNameChange !== false && (
|
||||
$targetUser->getBackend() instanceof ISetDisplayNameBackend
|
||||
|| $targetUser->getBackend()->implementsActions(Backend::SET_DISPLAYNAME)
|
||||
)) {
|
||||
$permittedFields[] = self::USER_FIELD_DISPLAYNAME;
|
||||
$permittedFields[] = IAccountManager::PROPERTY_DISPLAYNAME;
|
||||
}
|
||||
|
||||
// Fallback to display name value to avoid changing behavior with the new option.
|
||||
if ($this->config->getSystemValue('allow_user_to_change_email', $allowDisplayNameChange)) {
|
||||
$permittedFields[] = IAccountManager::PROPERTY_EMAIL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ use OCP\User\Backend\ISetDisplayNameBackend;
|
|||
use OCP\UserInterface;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use RuntimeException;
|
||||
use Test\TestCase;
|
||||
|
||||
class UsersControllerTest extends TestCase {
|
||||
|
|
@ -1639,6 +1640,8 @@ class UsersControllerTest extends TestCase {
|
|||
->method('getBackend')
|
||||
->willReturn($backend);
|
||||
|
||||
$this->config->method('getSystemValue')->willReturnCallback(fn (string $key, mixed $default) => $default);
|
||||
|
||||
$this->assertEquals([], $this->api->editUser('UserToEdit', 'email', 'demo@nextcloud.com')->getData());
|
||||
}
|
||||
|
||||
|
|
@ -1833,6 +1836,8 @@ class UsersControllerTest extends TestCase {
|
|||
->method('getBackend')
|
||||
->willReturn($backend);
|
||||
|
||||
$this->config->method('getSystemValue')->willReturnCallback(fn (string $key, mixed $default) => $default);
|
||||
|
||||
$this->api->editUser('UserToEdit', 'email', 'demo.org');
|
||||
}
|
||||
|
||||
|
|
@ -4224,7 +4229,8 @@ class UsersControllerTest extends TestCase {
|
|||
|
||||
public function dataGetEditableFields() {
|
||||
return [
|
||||
[false, ISetDisplayNameBackend::class, [
|
||||
[false, true, ISetDisplayNameBackend::class, [
|
||||
IAccountManager::PROPERTY_EMAIL,
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
|
|
@ -4237,7 +4243,21 @@ class UsersControllerTest extends TestCase {
|
|||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[true, ISetDisplayNameBackend::class, [
|
||||
[true, false, ISetDisplayNameBackend::class, [
|
||||
IAccountManager::PROPERTY_DISPLAYNAME,
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
IAccountManager::PROPERTY_WEBSITE,
|
||||
IAccountManager::PROPERTY_TWITTER,
|
||||
IAccountManager::PROPERTY_FEDIVERSE,
|
||||
IAccountManager::PROPERTY_ORGANISATION,
|
||||
IAccountManager::PROPERTY_ROLE,
|
||||
IAccountManager::PROPERTY_HEADLINE,
|
||||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[true, true, ISetDisplayNameBackend::class, [
|
||||
IAccountManager::PROPERTY_DISPLAYNAME,
|
||||
IAccountManager::PROPERTY_EMAIL,
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
|
|
@ -4252,7 +4272,20 @@ class UsersControllerTest extends TestCase {
|
|||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[true, UserInterface::class, [
|
||||
[false, false, ISetDisplayNameBackend::class, [
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
IAccountManager::PROPERTY_WEBSITE,
|
||||
IAccountManager::PROPERTY_TWITTER,
|
||||
IAccountManager::PROPERTY_FEDIVERSE,
|
||||
IAccountManager::PROPERTY_ORGANISATION,
|
||||
IAccountManager::PROPERTY_ROLE,
|
||||
IAccountManager::PROPERTY_HEADLINE,
|
||||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[false, true, UserInterface::class, [
|
||||
IAccountManager::PROPERTY_EMAIL,
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
|
|
@ -4266,6 +4299,46 @@ class UsersControllerTest extends TestCase {
|
|||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[true, false, UserInterface::class, [
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
IAccountManager::PROPERTY_WEBSITE,
|
||||
IAccountManager::PROPERTY_TWITTER,
|
||||
IAccountManager::PROPERTY_FEDIVERSE,
|
||||
IAccountManager::PROPERTY_ORGANISATION,
|
||||
IAccountManager::PROPERTY_ROLE,
|
||||
IAccountManager::PROPERTY_HEADLINE,
|
||||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[true, true, UserInterface::class, [
|
||||
IAccountManager::PROPERTY_EMAIL,
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
IAccountManager::PROPERTY_WEBSITE,
|
||||
IAccountManager::PROPERTY_TWITTER,
|
||||
IAccountManager::PROPERTY_FEDIVERSE,
|
||||
IAccountManager::PROPERTY_ORGANISATION,
|
||||
IAccountManager::PROPERTY_ROLE,
|
||||
IAccountManager::PROPERTY_HEADLINE,
|
||||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
[false, false, UserInterface::class, [
|
||||
IAccountManager::COLLECTION_EMAIL,
|
||||
IAccountManager::PROPERTY_PHONE,
|
||||
IAccountManager::PROPERTY_ADDRESS,
|
||||
IAccountManager::PROPERTY_WEBSITE,
|
||||
IAccountManager::PROPERTY_TWITTER,
|
||||
IAccountManager::PROPERTY_FEDIVERSE,
|
||||
IAccountManager::PROPERTY_ORGANISATION,
|
||||
IAccountManager::PROPERTY_ROLE,
|
||||
IAccountManager::PROPERTY_HEADLINE,
|
||||
IAccountManager::PROPERTY_BIOGRAPHY,
|
||||
IAccountManager::PROPERTY_PROFILE_ENABLED,
|
||||
]],
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -4276,13 +4349,12 @@ class UsersControllerTest extends TestCase {
|
|||
* @param string $userBackend
|
||||
* @param array $expected
|
||||
*/
|
||||
public function testGetEditableFields(bool $allowedToChangeDisplayName, string $userBackend, array $expected) {
|
||||
$this->config
|
||||
->method('getSystemValue')
|
||||
->with(
|
||||
$this->equalTo('allow_user_to_change_display_name'),
|
||||
$this->anything()
|
||||
)->willReturn($allowedToChangeDisplayName);
|
||||
public function testGetEditableFields(bool $allowedToChangeDisplayName, bool $allowedToChangeEmail, string $userBackend, array $expected): void {
|
||||
$this->config->method('getSystemValue')->willReturnCallback(fn (string $key, mixed $default) => match ($key) {
|
||||
'allow_user_to_change_display_name' => $allowedToChangeDisplayName,
|
||||
'allow_user_to_change_email' => $allowedToChangeEmail,
|
||||
default => throw new RuntimeException('Unexpected system config key: ' . $key),
|
||||
});
|
||||
|
||||
$user = $this->createMock(IUser::class);
|
||||
$this->userSession->method('getUser')
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ class PersonalInfo implements ISettings {
|
|||
$accountParameters = [
|
||||
'avatarChangeSupported' => $user->canChangeAvatar(),
|
||||
'displayNameChangeSupported' => $user->canChangeDisplayName(),
|
||||
'emailChangeSupported' => $user->canChangeEmail(),
|
||||
'federationEnabled' => $federationEnabled,
|
||||
'lookupServerUploadEnabled' => $lookupServerUploadEnabled,
|
||||
];
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
:scope.sync="primaryEmail.scope"
|
||||
@add-additional="onAddAdditionalEmail" />
|
||||
|
||||
<template v-if="displayNameChangeSupported">
|
||||
<template v-if="emailChangeSupported">
|
||||
<Email :input-id="inputId"
|
||||
:primary="true"
|
||||
:scope.sync="primaryEmail.scope"
|
||||
|
|
@ -56,7 +56,7 @@ import { validateEmail } from '../../../utils/validate.js'
|
|||
import { handleError } from '../../../utils/handlers.ts'
|
||||
|
||||
const { emailMap: { additionalEmails, primaryEmail, notificationEmail } } = loadState('settings', 'personalInfoParameters', {})
|
||||
const { displayNameChangeSupported } = loadState('settings', 'accountParameters', {})
|
||||
const { emailChangeSupported } = loadState('settings', 'accountParameters', {})
|
||||
|
||||
export default {
|
||||
name: 'EmailSection',
|
||||
|
|
@ -70,7 +70,7 @@ export default {
|
|||
return {
|
||||
accountProperty: ACCOUNT_PROPERTY_READABLE_ENUM.EMAIL,
|
||||
additionalEmails: additionalEmails.map(properties => ({ ...properties, key: this.generateUniqueKey() })),
|
||||
displayNameChangeSupported,
|
||||
emailChangeSupported,
|
||||
primaryEmail: { ...primaryEmail, readable: NAME_READABLE_ENUM[primaryEmail.name] },
|
||||
notificationEmail,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1068,6 +1068,11 @@
|
|||
<code><![CDATA[null]]></code>
|
||||
</NullArgument>
|
||||
</file>
|
||||
<file src="apps/settings/lib/Settings/Personal/PersonalInfo.php">
|
||||
<UndefinedInterfaceMethod>
|
||||
<code><![CDATA[canChangeEmail]]></code>
|
||||
</UndefinedInterfaceMethod>
|
||||
</file>
|
||||
<file src="apps/sharebymail/lib/ShareByMailProvider.php">
|
||||
<InvalidArgument>
|
||||
<code><![CDATA[$share->getId()]]></code>
|
||||
|
|
@ -2774,6 +2779,11 @@
|
|||
<code><![CDATA[false]]></code>
|
||||
</FalsableReturnStatement>
|
||||
</file>
|
||||
<file src="lib/private/User/LazyUser.php">
|
||||
<UndefinedInterfaceMethod>
|
||||
<code><![CDATA[canChangeEmail]]></code>
|
||||
</UndefinedInterfaceMethod>
|
||||
</file>
|
||||
<file src="lib/private/User/Manager.php">
|
||||
<ImplementedReturnTypeMismatch>
|
||||
<code><![CDATA[IUser|false]]></code>
|
||||
|
|
|
|||
|
|
@ -108,6 +108,10 @@ class LazyUser implements IUser {
|
|||
return $this->getUser()->canChangeDisplayName();
|
||||
}
|
||||
|
||||
public function canChangeEmail(): bool {
|
||||
return $this->getUser()->canChangeEmail();
|
||||
}
|
||||
|
||||
public function isEnabled() {
|
||||
return $this->getUser()->isEnabled();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -428,6 +428,11 @@ class User implements IUser {
|
|||
return $this->backend->implementsActions(Backend::SET_DISPLAYNAME);
|
||||
}
|
||||
|
||||
public function canChangeEmail(): bool {
|
||||
// Fallback to display name value to avoid changing behavior with the new option.
|
||||
return $this->config->getSystemValueBool('allow_user_to_change_email', $this->config->getSystemValueBool('allow_user_to_change_display_name', true));
|
||||
}
|
||||
|
||||
/**
|
||||
* check if the user is enabled
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue