summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2021-09-01 14:04:57 +0200
committerArthur Schiwon <blizzz@arthur-schiwon.de>2021-09-10 13:22:26 +0200
commit88fc177e2672d3fba5451e351967301f42cf3028 (patch)
treef905ed98515c5f96aa7cd1b6b97ad80fa06751d6 /lib/private
parent414676468679ba93befde00322fcf2b8af9f3d2d (diff)
downloadnextcloud-server-88fc177e2672d3fba5451e351967301f42cf3028.tar.gz
nextcloud-server-88fc177e2672d3fba5451e351967301f42cf3028.zip
enable the user to set a primary (notification) email address (backend)
- specific getters and setters on IUser and implementation - new notify_email field in provisioning API Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/Setup.php2
-rw-r--r--lib/private/User/Manager.php1
-rw-r--r--lib/private/User/User.php77
3 files changed, 68 insertions, 12 deletions
diff --git a/lib/private/Setup.php b/lib/private/Setup.php
index 8e7e6ae6aea..cb0d812c885 100644
--- a/lib/private/Setup.php
+++ b/lib/private/Setup.php
@@ -436,7 +436,7 @@ class Setup {
// Set email for admin
if (!empty($options['adminemail'])) {
- $config->setUserValue($user->getUID(), 'settings', 'email', $options['adminemail']);
+ $user->setSystemEMailAddress($options['adminemail']);
}
}
diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php
index 0d340ad356e..bebb9c8c72c 100644
--- a/lib/private/User/Manager.php
+++ b/lib/private/User/Manager.php
@@ -700,6 +700,7 @@ class Manager extends PublicEmitter implements IUserManager {
* @since 9.1.0
*/
public function getByEmail($email) {
+ // looking for 'email' only (and not primary_mail) is intentional
$userIds = $this->config->getUsersForUserValueCaseInsensitive('settings', 'email', $email);
$users = array_map(function ($uid) {
diff --git a/lib/private/User/User.php b/lib/private/User/User.php
index f17824f51b9..5fa1272f95c 100644
--- a/lib/private/User/User.php
+++ b/lib/private/User/User.php
@@ -34,10 +34,12 @@
*/
namespace OC\User;
+use InvalidArgumentException;
use OC\Accounts\AccountManager;
use OC\Avatar\AvatarManager;
use OC\Hooks\Emitter;
use OC_Helper;
+use OCP\Accounts\IAccountManager;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Group\Events\BeforeUserRemovedEvent;
use OCP\Group\Events\UserRemovedEvent;
@@ -55,6 +57,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class User implements IUser {
+ /** @var IAccountManager */
+ protected $accountManager;
/** @var string */
private $uid;
@@ -165,25 +169,62 @@ class User implements IUser {
}
/**
- * set the email address of the user
- *
- * @param string|null $mailAddress
- * @return void
- * @since 9.0.0
+ * @inheritDoc
*/
public function setEMailAddress($mailAddress) {
- $oldMailAddress = $this->getEMailAddress();
+ $this->setSystemEMailAddress($mailAddress);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function setSystemEMailAddress(string $mailAddress): void {
+ $oldMailAddress = $this->getSystemEMailAddress();
+
+ if ($mailAddress === '') {
+ $this->config->deleteUserValue($this->uid, 'settings', 'email');
+ } else {
+ $this->config->setUserValue($this->uid, 'settings', 'email', $mailAddress);
+ }
+
+ $primaryAddress = $this->getPrimaryEMailAddress();
+ if ($primaryAddress === $mailAddress) {
+ // on match no dedicated primary settings is necessary
+ $this->setPrimaryEMailAddress('');
+ }
+
if ($oldMailAddress !== $mailAddress) {
- if ($mailAddress === '') {
- $this->config->deleteUserValue($this->uid, 'settings', 'email');
- } else {
- $this->config->setUserValue($this->uid, 'settings', 'email', $mailAddress);
- }
$this->triggerChange('eMailAddress', $mailAddress, $oldMailAddress);
}
}
/**
+ * @inheritDoc
+ */
+ public function setPrimaryEMailAddress(string $mailAddress): void {
+ if ($mailAddress === '') {
+ $this->config->deleteUserValue($this->uid, 'settings', 'primary_email');
+ return;
+ }
+
+ $this->ensureAccountManager();
+ $account = $this->accountManager->getAccount($this);
+ $property = $account->getPropertyCollection(IAccountManager::COLLECTION_EMAIL)
+ ->getPropertyByValue($mailAddress);
+
+ if ($property === null || $property->getLocallyVerified() !== IAccountManager::VERIFIED) {
+ throw new InvalidArgumentException('Only verified emails can be set as primary');
+ }
+ $this->config->setUserValue($this->uid, 'settings', 'primary_email', $mailAddress);
+ }
+
+ private function ensureAccountManager() {
+ if (!$this->accountManager instanceof IAccountManager) {
+ $this->accountManager = \OC::$server->get(IAccountManager::class);
+ }
+ }
+
+ /**
* returns the timestamp of the user's last login or 0 if the user did never
* login
*
@@ -390,10 +431,24 @@ class User implements IUser {
* @since 9.0.0
*/
public function getEMailAddress() {
+ return $this->getPrimaryEMailAddress() ?? $this->getSystemEMailAddress();
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getSystemEMailAddress(): ?string {
return $this->config->getUserValue($this->uid, 'settings', 'email', null);
}
/**
+ * @inheritDoc
+ */
+ public function getPrimaryEMailAddress(): ?string {
+ return $this->config->getUserValue($this->uid, 'settings', 'primary_email', null);
+ }
+
+ /**
* get the users' quota
*
* @return string