diff options
author | Robin Appelman <robin@icewind.nl> | 2017-01-27 12:52:17 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2017-02-08 15:17:02 +0100 |
commit | fa49c4a13b6c5455b13ad44cfc158b271aa9b616 (patch) | |
tree | 1014b6de1bd3761e2e26467c78c6f5fd4697ea56 /apps/federatedfilesharing/lib | |
parent | 1a591cea97313b8500154d6c2c9ce3aaf2f38a88 (diff) | |
download | nextcloud-server-fa49c4a13b6c5455b13ad44cfc158b271aa9b616.tar.gz nextcloud-server-fa49c4a13b6c5455b13ad44cfc158b271aa9b616.zip |
Add a single public api for resolving a cloud id to a user and remote and back
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'apps/federatedfilesharing/lib')
7 files changed, 78 insertions, 90 deletions
diff --git a/apps/federatedfilesharing/lib/AddressHandler.php b/apps/federatedfilesharing/lib/AddressHandler.php index 5fc41c2c804..6c59df06863 100644 --- a/apps/federatedfilesharing/lib/AddressHandler.php +++ b/apps/federatedfilesharing/lib/AddressHandler.php @@ -22,6 +22,7 @@ namespace OCA\FederatedFileSharing; use OC\HintException; +use OCP\Federation\ICloudIdManager; use OCP\IL10N; use OCP\IURLGenerator; @@ -38,18 +39,24 @@ class AddressHandler { /** @var IURLGenerator */ private $urlGenerator; + /** @var ICloudIdManager */ + private $cloudIdManager; + /** * AddressHandler constructor. * * @param IURLGenerator $urlGenerator * @param IL10N $il10n + * @param ICloudIdManager $cloudIdManager */ public function __construct( IURLGenerator $urlGenerator, - IL10N $il10n + IL10N $il10n, + ICloudIdManager $cloudIdManager ) { $this->l = $il10n; $this->urlGenerator = $urlGenerator; + $this->cloudIdManager = $cloudIdManager; } /** @@ -60,44 +67,13 @@ class AddressHandler { * @throws HintException */ public function splitUserRemote($address) { - if (strpos($address, '@') === false) { + try { + $cloudId = $this->cloudIdManager->resolveCloudId($address); + return [$cloudId->getUser(), $cloudId->getRemote()]; + } catch (\InvalidArgumentException $e) { $hint = $this->l->t('Invalid Federated Cloud ID'); - throw new HintException('Invalid Federated Cloud ID', $hint); - } - - // Find the first character that is not allowed in user names - $id = str_replace('\\', '/', $address); - $posSlash = strpos($id, '/'); - $posColon = strpos($id, ':'); - - if ($posSlash === false && $posColon === false) { - $invalidPos = strlen($id); - } else if ($posSlash === false) { - $invalidPos = $posColon; - } else if ($posColon === false) { - $invalidPos = $posSlash; - } else { - $invalidPos = min($posSlash, $posColon); - } - - // Find the last @ before $invalidPos - $pos = $lastAtPos = 0; - while ($lastAtPos !== false && $lastAtPos <= $invalidPos) { - $pos = $lastAtPos; - $lastAtPos = strpos($id, '@', $pos + 1); + throw new HintException('Invalid Federated Cloud ID', $hint, 0, $e); } - - if ($pos !== false) { - $user = substr($id, 0, $pos); - $remote = substr($id, $pos + 1); - $remote = $this->fixRemoteURL($remote); - if (!empty($user) && !empty($remote)) { - return array($user, $remote); - } - } - - $hint = $this->l->t('Invalid Federated Cloud ID'); - throw new HintException('Invalid Federated Cloud ID', $hint); } /** @@ -175,27 +151,4 @@ class AddressHandler { return false; } - - /** - * Strips away a potential file names and trailing slashes: - * - http://localhost - * - http://localhost/ - * - http://localhost/index.php - * - http://localhost/index.php/s/{shareToken} - * - * all return: http://localhost - * - * @param string $remote - * @return string - */ - protected function fixRemoteURL($remote) { - $remote = str_replace('\\', '/', $remote); - if ($fileNamePosition = strpos($remote, '/index.php')) { - $remote = substr($remote, 0, $fileNamePosition); - } - $remote = rtrim($remote, '/'); - - return $remote; - } - } diff --git a/apps/federatedfilesharing/lib/AppInfo/Application.php b/apps/federatedfilesharing/lib/AppInfo/Application.php index c37cb9b87bb..3e97edeada0 100644 --- a/apps/federatedfilesharing/lib/AppInfo/Application.php +++ b/apps/federatedfilesharing/lib/AppInfo/Application.php @@ -45,7 +45,8 @@ class Application extends App { $container->registerService('RequestHandlerController', function(SimpleContainer $c) use ($server) { $addressHandler = new AddressHandler( $server->getURLGenerator(), - $server->getL10N('federatedfilesharing') + $server->getL10N('federatedfilesharing'), + $server->getCloudIdManager() ); $notification = new Notifications( $addressHandler, @@ -64,7 +65,8 @@ class Application extends App { $server->getShareManager(), $notification, $addressHandler, - $server->getUserManager() + $server->getUserManager(), + $server->getCloudIdManager() ); }); } @@ -94,7 +96,8 @@ class Application extends App { protected function initFederatedShareProvider() { $addressHandler = new \OCA\FederatedFileSharing\AddressHandler( \OC::$server->getURLGenerator(), - \OC::$server->getL10N('federatedfilesharing') + \OC::$server->getL10N('federatedfilesharing'), + \OC::$server->getCloudIdManager() ); $discoveryManager = new \OCA\FederatedFileSharing\DiscoveryManager( \OC::$server->getMemCacheFactory(), @@ -119,7 +122,8 @@ class Application extends App { \OC::$server->getLogger(), \OC::$server->getLazyRootFolder(), \OC::$server->getConfig(), - \OC::$server->getUserManager() + \OC::$server->getUserManager(), + \OC::$server->getCloudIdManager() ); } diff --git a/apps/federatedfilesharing/lib/BackgroundJob/RetryJob.php b/apps/federatedfilesharing/lib/BackgroundJob/RetryJob.php index 26afcae32b7..2356c569d87 100644 --- a/apps/federatedfilesharing/lib/BackgroundJob/RetryJob.php +++ b/apps/federatedfilesharing/lib/BackgroundJob/RetryJob.php @@ -65,7 +65,8 @@ class RetryJob extends Job { } else { $addressHandler = new AddressHandler( \OC::$server->getURLGenerator(), - \OC::$server->getL10N('federatedfilesharing') + \OC::$server->getL10N('federatedfilesharing'), + \OC::$server->getCloudIdManager() ); $discoveryManager = new DiscoveryManager( \OC::$server->getMemCacheFactory(), diff --git a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php index 3c399268124..dd2e88d2dae 100644 --- a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php +++ b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php @@ -35,6 +35,7 @@ use OCA\Files_Sharing\External\Manager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; +use OCP\Federation\ICloudIdManager; use OCP\Files\StorageInvalidException; use OCP\Http\Client\IClientService; use OCP\IL10N; @@ -74,6 +75,9 @@ class MountPublicLinkController extends Controller { /** @var IClientService */ private $clientService; + /** @var ICloudIdManager */ + private $cloudIdManager; + /** * MountPublicLinkController constructor. * @@ -86,6 +90,7 @@ class MountPublicLinkController extends Controller { * @param IL10N $l * @param IUserSession $userSession * @param IClientService $clientService + * @param ICloudIdManager $cloudIdManager */ public function __construct($appName, IRequest $request, @@ -95,7 +100,8 @@ class MountPublicLinkController extends Controller { ISession $session, IL10N $l, IUserSession $userSession, - IClientService $clientService + IClientService $clientService, + ICloudIdManager $cloudIdManager ) { parent::__construct($appName, $request); @@ -106,6 +112,7 @@ class MountPublicLinkController extends Controller { $this->l = $l; $this->userSession = $userSession; $this->clientService = $clientService; + $this->cloudIdManager = $cloudIdManager; } /** @@ -177,7 +184,7 @@ class MountPublicLinkController extends Controller { return new JSONResponse(['message' => $this->l->t('Server to server sharing is not enabled on this server')], Http::STATUS_BAD_REQUEST); } - $shareWith = $this->userSession->getUser()->getUID() . '@' . $this->addressHandler->generateRemoteURL(); + $cloudId = $this->cloudIdManager->getCloudId($this->userSession->getUser()->getUID(), $this->addressHandler->generateRemoteURL()); $httpClient = $this->clientService->newClient(); @@ -187,7 +194,7 @@ class MountPublicLinkController extends Controller { 'body' => [ 'token' => $token, - 'shareWith' => rtrim($shareWith, '/'), + 'shareWith' => rtrim($cloudId->getId(), '/'), 'password' => $password ], 'connect_timeout' => 10, diff --git a/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php b/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php index 750415077a8..a5e75e145c8 100644 --- a/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php +++ b/apps/federatedfilesharing/lib/Controller/RequestHandlerController.php @@ -38,6 +38,7 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; use OCP\Constants; +use OCP\Federation\ICloudIdManager; use OCP\Files\NotFoundException; use OCP\IDBConnection; use OCP\IRequest; @@ -68,6 +69,9 @@ class RequestHandlerController extends OCSController { /** @var string */ private $shareTable = 'share'; + /** @var ICloudIdManager */ + private $cloudIdManager; + /** * Server2Server constructor. * @@ -79,6 +83,7 @@ class RequestHandlerController extends OCSController { * @param Notifications $notifications * @param AddressHandler $addressHandler * @param IUserManager $userManager + * @param ICloudIdManager $cloudIdManager */ public function __construct($appName, IRequest $request, @@ -87,7 +92,8 @@ class RequestHandlerController extends OCSController { Share\IManager $shareManager, Notifications $notifications, AddressHandler $addressHandler, - IUserManager $userManager + IUserManager $userManager, + ICloudIdManager $cloudIdManager ) { parent::__construct($appName, $request); @@ -97,6 +103,7 @@ class RequestHandlerController extends OCSController { $this->notifications = $notifications; $this->addressHandler = $addressHandler; $this->userManager = $userManager; + $this->cloudIdManager = $cloudIdManager; } /** @@ -164,7 +171,7 @@ class RequestHandlerController extends OCSController { $shareId = \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*share_external'); if ($ownerFederatedId === null) { - $ownerFederatedId = $owner . '@' . $this->cleanupRemote($remote); + $ownerFederatedId = $this->cloudIdManager->getCloudId($owner, $this->cleanupRemote($remote))->getId(); } // if the owner of the share and the initiator are the same user // we also complete the federated share ID for the initiator @@ -424,7 +431,7 @@ class RequestHandlerController extends OCSController { $remote = $this->cleanupRemote($share['remote']); - $owner = $share['owner'] . '@' . $remote; + $owner = $this->cloudIdManager->getCloudId($share['owner'], $remote); $mountpoint = $share['mountpoint']; $user = $share['user']; diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php index 61f1b1c8f18..b8a584ce6be 100644 --- a/apps/federatedfilesharing/lib/FederatedShareProvider.php +++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php @@ -27,6 +27,7 @@ namespace OCA\FederatedFileSharing; use OC\Share20\Share; +use OCP\Federation\ICloudIdManager; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\IConfig; @@ -80,6 +81,9 @@ class FederatedShareProvider implements IShareProvider { /** @var IUserManager */ private $userManager; + /** @var ICloudIdManager */ + private $cloudIdManager; + /** * DefaultShareProvider constructor. * @@ -92,6 +96,7 @@ class FederatedShareProvider implements IShareProvider { * @param IRootFolder $rootFolder * @param IConfig $config * @param IUserManager $userManager + * @param ICloudIdManager $cloudIdManager */ public function __construct( IDBConnection $connection, @@ -102,7 +107,8 @@ class FederatedShareProvider implements IShareProvider { ILogger $logger, IRootFolder $rootFolder, IConfig $config, - IUserManager $userManager + IUserManager $userManager, + ICloudIdManager $cloudIdManager ) { $this->dbConnection = $connection; $this->addressHandler = $addressHandler; @@ -113,6 +119,7 @@ class FederatedShareProvider implements IShareProvider { $this->rootFolder = $rootFolder; $this->config = $config; $this->userManager = $userManager; + $this->cloudIdManager = $cloudIdManager; } /** @@ -153,17 +160,18 @@ class FederatedShareProvider implements IShareProvider { // don't allow federated shares if source and target server are the same - list($user, $remote) = $this->addressHandler->splitUserRemote($shareWith); + $cloudId = $this->cloudIdManager->resolveCloudId($shareWith); $currentServer = $this->addressHandler->generateRemoteURL(); $currentUser = $sharedBy; - if ($this->addressHandler->compareAddresses($user, $remote, $currentUser, $currentServer)) { + if ($this->addressHandler->compareAddresses($cloudId->getUser(), $cloudId->getRemote(), $currentUser, $currentServer)) { $message = 'Not allowed to create a federated share with the same user.'; $message_t = $this->l->t('Not allowed to create a federated share with the same user'); $this->logger->debug($message, ['app' => 'Federated File Sharing']); throw new \Exception($message_t); } - $share->setSharedWith($user . '@' . $remote); + + $share->setSharedWith(rtrim($cloudId->getId(), '/')); try { $remoteShare = $this->getShareFromExternalShareTable($share); @@ -173,8 +181,8 @@ class FederatedShareProvider implements IShareProvider { if ($remoteShare) { try { - $uidOwner = $remoteShare['owner'] . '@' . $remoteShare['remote']; - $shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $uidOwner, $permissions, 'tmp_token_' . time()); + $ownerCloudId = $this->cloudIdManager->getCloudId($remoteShare['owner'], $remoteShare['remote']); + $shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $ownerCloudId->getId(), $permissions, 'tmp_token_' . time()); $share->setId($shareId); list($token, $remoteId) = $this->askOwnerToReShare($shareWith, $share, $shareId); // remote share was create successfully if we get a valid token as return @@ -227,15 +235,17 @@ class FederatedShareProvider implements IShareProvider { try { $sharedByFederatedId = $share->getSharedBy(); if ($this->userManager->userExists($sharedByFederatedId)) { - $sharedByFederatedId = $sharedByFederatedId . '@' . $this->addressHandler->generateRemoteURL(); + $cloudId = $this->cloudIdManager->getCloudId($sharedByFederatedId, $this->addressHandler->generateRemoteURL()); + $sharedByFederatedId = $cloudId->getId(); } + $ownerCloudId = $this->cloudIdManager->getCloudId($share->getShareOwner(), $this->addressHandler->generateRemoteURL()); $send = $this->notifications->sendRemoteShare( $token, $share->getSharedWith(), $share->getNode()->getName(), $shareId, $share->getShareOwner(), - $share->getShareOwner() . '@' . $this->addressHandler->generateRemoteURL(), + $ownerCloudId->getId(), $share->getSharedBy(), $sharedByFederatedId ); diff --git a/apps/federatedfilesharing/lib/Notifier.php b/apps/federatedfilesharing/lib/Notifier.php index 507dd98330e..faf79480b7e 100644 --- a/apps/federatedfilesharing/lib/Notifier.php +++ b/apps/federatedfilesharing/lib/Notifier.php @@ -27,6 +27,8 @@ namespace OCA\FederatedFileSharing; use OC\HintException; use OC\Share\Helper; use OCP\Contacts\IManager; +use OCP\Federation\ICloudId; +use OCP\Federation\ICloudIdManager; use OCP\IURLGenerator; use OCP\L10N\IFactory; use OCP\Notification\INotification; @@ -41,16 +43,20 @@ class Notifier implements INotifier { protected $url; /** @var array */ protected $federatedContacts; + /** @var ICloudIdManager */ + protected $cloudIdManager; /** * @param IFactory $factory * @param IManager $contactsManager * @param IURLGenerator $url + * @param ICloudIdManager $cloudIdManager */ - public function __construct(IFactory $factory, IManager $contactsManager, IURLGenerator $url) { + public function __construct(IFactory $factory, IManager $contactsManager, IURLGenerator $url, ICloudIdManager $cloudIdManager) { $this->factory = $factory; $this->contactsManager = $contactsManager; $this->url = $url; + $this->cloudIdManager = $cloudIdManager; } /** @@ -140,8 +146,10 @@ class Notifier implements INotifier { protected function createRemoteUser($cloudId) { $displayName = $cloudId; try { - list($user, $server) = Helper::splitUserRemote($cloudId); - $displayName = $this->getDisplayName($user, $server); + $resolvedId = $this->cloudIdManager->resolveCloudId($cloudId); + $displayName = $this->getDisplayName($resolvedId); + $user = $resolvedId->getUser(); + $server = $resolvedId->getRemote(); } catch (HintException $e) { $user = $cloudId; $server = ''; @@ -158,14 +166,12 @@ class Notifier implements INotifier { /** * Try to find the user in the contacts * - * @param string $user - * @param string $server + * @param ICloudId $cloudId * @return string - * @throws \OutOfBoundsException when there is no contact for the id */ - protected function getDisplayName($user, $server) { - $server = strtolower(rtrim($server, '/')); - + protected function getDisplayName(ICloudId $cloudId) { + $server = $cloudId->getRemote(); + $user = $cloudId->getUser(); if (strpos($server, 'http://') === 0) { $server = substr($server, strlen('http://')); } else if (strpos($server, 'https://') === 0) { @@ -173,7 +179,7 @@ class Notifier implements INotifier { } try { - return $this->getDisplayNameFromContact($user . '@' . $server); + return $this->getDisplayNameFromContact($cloudId->getId()); } catch (\OutOfBoundsException $e) { } @@ -187,7 +193,7 @@ class Notifier implements INotifier { } catch (\OutOfBoundsException $e) { } - return $user . '@' . $server; + return $cloudId->getId(); } /** |