From 190a71ecf9a39ea31c8296798a2011352b7394b2 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 5 Feb 2022 19:55:23 +0100 Subject: Expose additional emails in {DAV:}alternate-URI-set This allows iMip invitations to be send with an alternative email as "Reply-To" field. Closes #27201 Signed-off-by: Thomas Citharel --- apps/dav/appinfo/v1/caldav.php | 2 + apps/dav/appinfo/v1/carddav.php | 2 + apps/dav/lib/Command/CreateCalendar.php | 2 + apps/dav/lib/Connector/Sabre/Principal.php | 16 +++++++ apps/dav/lib/RootCollection.php | 2 + .../tests/unit/CalDAV/AbstractCalDavBackend.php | 2 + apps/dav/tests/unit/CardDAV/CardDavBackendTest.php | 2 + .../tests/unit/Connector/Sabre/PrincipalTest.php | 49 ++++++++++++++++++++++ 8 files changed, 77 insertions(+) (limited to 'apps/dav') diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php index 6a496a992e6..eccd3186196 100644 --- a/apps/dav/appinfo/v1/caldav.php +++ b/apps/dav/appinfo/v1/caldav.php @@ -34,6 +34,7 @@ use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin; use OCA\DAV\Connector\Sabre\MaintenancePlugin; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccountManager; use Psr\Log\LoggerInterface; $authBackend = new Auth( @@ -47,6 +48,7 @@ $authBackend = new Auth( $principalBackend = new Principal( \OC::$server->getUserManager(), \OC::$server->getGroupManager(), + \OC::$server->get(IAccountManager::class), \OC::$server->getShareManager(), \OC::$server->getUserSession(), \OC::$server->getAppManager(), diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index a0306118781..8cf42af9a6c 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -35,6 +35,7 @@ use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin; use OCA\DAV\Connector\Sabre\MaintenancePlugin; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; use Psr\Log\LoggerInterface; use Sabre\CardDAV\Plugin; @@ -50,6 +51,7 @@ $authBackend = new Auth( $principalBackend = new Principal( \OC::$server->getUserManager(), \OC::$server->getGroupManager(), + \OC::$server->get(IAccountManager::class), \OC::$server->getShareManager(), \OC::$server->getUserSession(), \OC::$server->getAppManager(), diff --git a/apps/dav/lib/Command/CreateCalendar.php b/apps/dav/lib/Command/CreateCalendar.php index 2bea82a345e..8a945f32eba 100644 --- a/apps/dav/lib/Command/CreateCalendar.php +++ b/apps/dav/lib/Command/CreateCalendar.php @@ -29,6 +29,7 @@ use OC\KnownUser\KnownUserService; use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\Proxy\ProxyMapper; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccountManager; use OCP\EventDispatcher\IEventDispatcher; use OCP\IConfig; use OCP\IDBConnection; @@ -83,6 +84,7 @@ class CreateCalendar extends Command { $principalBackend = new Principal( $this->userManager, $this->groupManager, + \OC::$server->get(IAccountManager::class), \OC::$server->getShareManager(), \OC::$server->getUserSession(), \OC::$server->getAppManager(), diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php index 94e3978e67d..75bee4e7b42 100644 --- a/apps/dav/lib/Connector/Sabre/Principal.php +++ b/apps/dav/lib/Connector/Sabre/Principal.php @@ -41,6 +41,9 @@ use OC\KnownUser\KnownUserService; use OCA\Circles\Exceptions\CircleNotFoundException; use OCA\DAV\CalDAV\Proxy\ProxyMapper; use OCA\DAV\Traits\PrincipalProxyTrait; +use OCP\Accounts\IAccountManager; +use OCP\Accounts\IAccountProperty; +use OCP\Accounts\PropertyDoesNotExistException; use OCP\App\IAppManager; use OCP\AppFramework\QueryException; use OCP\Constants; @@ -64,6 +67,9 @@ class Principal implements BackendInterface { /** @var IGroupManager */ private $groupManager; + /** @var IAccountManager */ + private $accountManager; + /** @var IShareManager */ private $shareManager; @@ -95,6 +101,7 @@ class Principal implements BackendInterface { public function __construct(IUserManager $userManager, IGroupManager $groupManager, + IAccountManager $accountManager, IShareManager $shareManager, IUserSession $userSession, IAppManager $appManager, @@ -105,6 +112,7 @@ class Principal implements BackendInterface { string $principalPrefix = 'principals/users/') { $this->userManager = $userManager; $this->groupManager = $groupManager; + $this->accountManager = $accountManager; $this->shareManager = $shareManager; $this->userSession = $userSession; $this->appManager = $appManager; @@ -506,6 +514,7 @@ class Principal implements BackendInterface { /** * @param IUser $user * @return array + * @throws PropertyDoesNotExistException */ protected function userToPrincipal($user) { $userId = $user->getUID(); @@ -517,11 +526,18 @@ class Principal implements BackendInterface { '{http://nextcloud.com/ns}language' => $this->languageFactory->getUserLanguage($user), ]; + $account = $this->accountManager->getAccount($user); + $alternativeEmails = array_map(fn (IAccountProperty $property) => 'mailto:' . $property->getValue(), $account->getPropertyCollection(IAccountManager::COLLECTION_EMAIL)->getProperties()); + $email = $user->getSystemEMailAddress(); if (!empty($email)) { $principal['{http://sabredav.org/ns}email-address'] = $email; } + if (!empty($alternativeEmails)) { + $principal['{DAV:}alternate-URI-set'] = $alternativeEmails; + } + return $principal; } diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index 8a11a676609..359037587a5 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -43,6 +43,7 @@ use OCA\DAV\DAV\GroupPrincipalBackend; use OCA\DAV\DAV\SystemPrincipalBackend; use OCA\DAV\Provisioning\Apple\AppleProvisioningNode; use OCA\DAV\Upload\CleanupService; +use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; use OCP\AppFramework\Utility\ITimeFactory; use OCP\EventDispatcher\IEventDispatcher; @@ -68,6 +69,7 @@ class RootCollection extends SimpleCollection { $userPrincipalBackend = new Principal( $userManager, $groupManager, + \OC::$server->get(IAccountManager::class), $shareManager, \OC::$server->getUserSession(), \OC::$server->getAppManager(), diff --git a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php index ec966248e01..0a234fc5c8d 100644 --- a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php +++ b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackend.php @@ -30,6 +30,7 @@ use OC\KnownUser\KnownUserService; use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CalDAV\Proxy\ProxyMapper; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; use OCP\EventDispatcher\IEventDispatcher; use OCP\IConfig; @@ -89,6 +90,7 @@ abstract class AbstractCalDavBackend extends TestCase { ->setConstructorArgs([ $this->userManager, $this->groupManager, + $this->createMock(IAccountManager::class), $this->createMock(ShareManager::class), $this->createMock(IUserSession::class), $this->createMock(IAppManager::class), diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index 7eda691d199..136751628d0 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -37,6 +37,7 @@ use OCA\DAV\CalDAV\Proxy\ProxyMapper; use OCA\DAV\CardDAV\AddressBook; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\EventDispatcher\IEventDispatcher; @@ -136,6 +137,7 @@ class CardDavBackendTest extends TestCase { ->setConstructorArgs([ $this->userManager, $this->groupManager, + $this->createMock(IAccountManager::class), $this->createMock(ShareManager::class), $this->createMock(IUserSession::class), $this->createMock(IAppManager::class), diff --git a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php index 86413e4a366..444c267b509 100644 --- a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php @@ -34,6 +34,10 @@ use OC\User\User; use OCA\DAV\CalDAV\Proxy\Proxy; use OCA\DAV\CalDAV\Proxy\ProxyMapper; use OCA\DAV\Connector\Sabre\Principal; +use OCP\Accounts\IAccount; +use OCP\Accounts\IAccountManager; +use OCP\Accounts\IAccountProperty; +use OCP\Accounts\IAccountPropertyCollection; use OCP\App\IAppManager; use OCP\IConfig; use OCP\IGroup; @@ -59,6 +63,9 @@ class PrincipalTest extends TestCase { /** @var IGroupManager | MockObject */ private $groupManager; + /** @var IAccountManager|MockObject */ + private $accountManager; + /** @var IManager | MockObject */ private $shareManager; @@ -81,6 +88,7 @@ class PrincipalTest extends TestCase { protected function setUp(): void { $this->userManager = $this->createMock(IUserManager::class); $this->groupManager = $this->createMock(IGroupManager::class); + $this->accountManager = $this->createMock(IAccountManager::class); $this->shareManager = $this->createMock(IManager::class); $this->userSession = $this->createMock(IUserSession::class); $this->appManager = $this->createMock(IAppManager::class); @@ -92,6 +100,7 @@ class PrincipalTest extends TestCase { $this->connector = new Principal( $this->userManager, $this->groupManager, + $this->accountManager, $this->shareManager, $this->userSession, $this->appManager, @@ -143,6 +152,45 @@ class PrincipalTest extends TestCase { ->withConsecutive([$fooUser], [$barUser]) ->willReturnOnConsecutiveCalls('de', 'en'); + $fooAccountPropertyCollection = $this->createMock(IAccountPropertyCollection::class); + $fooAccountPropertyCollection->expects($this->once()) + ->method('getProperties') + ->with() + ->willReturn([]); + $fooAccount = $this->createMock(IAccount::class); + $fooAccount->expects($this->once()) + ->method('getPropertyCollection') + ->with(IAccountManager::COLLECTION_EMAIL) + ->willReturn($fooAccountPropertyCollection); + + $emailPropertyOne = $this->createMock(IAccountProperty::class); + $emailPropertyOne->expects($this->once()) + ->method('getValue') + ->with() + ->willReturn('alias@nextcloud.com'); + $emailPropertyTwo = $this->createMock(IAccountProperty::class); + $emailPropertyTwo->expects($this->once()) + ->method('getValue') + ->with() + ->willReturn('alias2@nextcloud.com'); + + $barAccountPropertyCollection = $this->createMock(IAccountPropertyCollection::class); + $barAccountPropertyCollection->expects($this->once()) + ->method('getProperties') + ->with() + ->willReturn([$emailPropertyOne, $emailPropertyTwo]); + $barAccount = $this->createMock(IAccount::class); + $barAccount->expects($this->once()) + ->method('getPropertyCollection') + ->with(IAccountManager::COLLECTION_EMAIL) + ->willReturn($barAccountPropertyCollection); + + $this->accountManager + ->expects($this->exactly(2)) + ->method('getAccount') + ->withConsecutive([$fooUser], [$barUser]) + ->willReturnOnConsecutiveCalls($fooAccount, $barAccount); + $expectedResponse = [ 0 => [ 'uri' => 'principals/users/foo', @@ -156,6 +204,7 @@ class PrincipalTest extends TestCase { '{urn:ietf:params:xml:ns:caldav}calendar-user-type' => 'INDIVIDUAL', '{http://nextcloud.com/ns}language' => 'en', '{http://sabredav.org/ns}email-address' => 'bar@nextcloud.com', + '{DAV:}alternate-URI-set' => ['mailto:alias@nextcloud.com', 'mailto:alias2@nextcloud.com'] ] ]; $response = $this->connector->getPrincipalsByPrefix('principals/users'); -- cgit v1.2.3