diff --git a/apps/federatedfilesharing/appinfo/info.xml b/apps/federatedfilesharing/appinfo/info.xml index e4f7777cf249..2a0cbe3cd9da 100644 --- a/apps/federatedfilesharing/appinfo/info.xml +++ b/apps/federatedfilesharing/appinfo/info.xml @@ -20,4 +20,7 @@ OCA\FederatedFileSharing\Panels\GeneralPersonalPanel OCA\FederatedFileSharing\Panels\SharingPersonalPanel + + OCA\FederatedFileSharing\Command\SyncIncomingShares + diff --git a/apps/federatedfilesharing/lib/Command/SyncIncomingShares.php b/apps/federatedfilesharing/lib/Command/SyncIncomingShares.php new file mode 100644 index 000000000000..1c7228f78d7a --- /dev/null +++ b/apps/federatedfilesharing/lib/Command/SyncIncomingShares.php @@ -0,0 +1,86 @@ + + * + * @copyright Copyright (c) 2018, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\FederatedFileSharing\Command; + +use OCA\Files_Sharing\AppInfo\Application; +use OCP\Files\StorageNotAvailableException; +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\Lock\LockedException; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class SyncIncomingShares extends Command { + /** @var IDBConnection */ + private $dbConnection; + + /** @var IUserManager */ + private $userManager; + + public function __construct(IDBConnection $dbConnection, IUserManager $userManager) { + parent::__construct(); + $this->dbConnection = $dbConnection; + $this->userManager = $userManager; + } + + protected function configure() { + $this + ->setName('incomingShares:sync') + ->setDescription('Sync external shares'); + } + + public function execute(InputInterface $input, OutputInterface $output) { + $app = new Application(); + /** @var \OCA\Files_Sharing\External\MountProvider $mountProvider */ + $mountProvider = $app->getContainer()->query('ExternalMountProvider'); + $loader = \OC\Files\Filesystem::getLoader(); + + $qb = $this->dbConnection->getQueryBuilder(); + $qb->selectDistinct('user') + ->from('share_external') + ->where($qb->expr()->eq('accepted', $qb->expr()->literal('1'))); + $cursor = $qb->execute(); + while ($data = $cursor->fetch()) { + $user = $this->userManager->get($data['user']); + $userMounts = $mountProvider->getMountsForUser($user, $loader); + foreach ($userMounts as $mount) { + /** @var \OCA\Files_Sharing\External\Storage $storage */ + $storage = $mount->getStorage(); + try { + $localMtime = $storage->filemtime(''); + if ($storage->hasUpdated('', $localMtime)) { + // sync + try { + $storage->getScanner('')->scan('', false, 0); + } catch (LockedException $e) { + // it can be locked, let's skip it then + } + } + } catch (StorageNotAvailableException $e) { + // pass + } + } + } + $cursor->closeCursor(); + } +}