Skip to content

Commit

Permalink
Merge pull request #2834 from nextcloud/accesListToShareManager
Browse files Browse the repository at this point in the history
Access list to share manager
  • Loading branch information
MorrisJobke authored Apr 15, 2017
2 parents dafa9c7 + cab4111 commit 10290eb
Show file tree
Hide file tree
Showing 17 changed files with 1,287 additions and 32 deletions.
40 changes: 40 additions & 0 deletions apps/federatedfilesharing/lib/FederatedShareProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

use OC\Share20\Share;
use OCP\Federation\ICloudIdManager;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\IConfig;
Expand Down Expand Up @@ -974,4 +975,43 @@ public function isLookupServerUploadEnabled() {
$result = $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes');
return ($result === 'yes');
}

/**
* @inheritdoc
*/
public function getAccessList($nodes, $currentAccess) {
$ids = [];
foreach ($nodes as $node) {
$ids[] = $node->getId();
}

$qb = $this->dbConnection->getQueryBuilder();
$qb->select('share_with', 'token', 'file_source')
->from('share')
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_REMOTE)))
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
->andWhere($qb->expr()->orX(
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
));
$cursor = $qb->execute();

if ($currentAccess === false) {
$remote = $cursor->fetch() !== false;
$cursor->closeCursor();

return ['remote' => $remote];
}

$remote = [];
while ($row = $cursor->fetch()) {
$remote[$row['share_with']] = [
'node_id' => $row['file_source'],
'token' => $row['token'],
];
}
$cursor->closeCursor();

return ['remote' => $remote];
}
}
58 changes: 57 additions & 1 deletion apps/federatedfilesharing/tests/FederatedShareProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class FederatedShareProviderTest extends \Test\TestCase {
protected $addressHandler;
/** @var Notifications | \PHPUnit_Framework_MockObject_MockObject */
protected $notifications;
/** @var TokenHandler */
/** @var TokenHandler|\PHPUnit_Framework_MockObject_MockObject */
protected $tokenHandler;
/** @var IL10N */
protected $l;
Expand Down Expand Up @@ -788,4 +788,60 @@ public function testGetSharesInFolder() {
$u1->delete();
$u2->delete();
}

public function testGetAccessList() {
$userManager = \OC::$server->getUserManager();
$rootFolder = \OC::$server->getRootFolder();

$u1 = $userManager->createUser('testFed', md5(time()));

$folder1 = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo');
$file1 = $folder1->newFile('bar1');

$this->tokenHandler->expects($this->exactly(2))
->method('generateToken')
->willReturnOnConsecutiveCalls('token1', 'token2');
$this->notifications->expects($this->atLeastOnce())
->method('sendRemoteShare')
->willReturn(true);

$result = $this->provider->getAccessList([$file1], true);
$this->assertEquals(['remote' => []], $result);

$result = $this->provider->getAccessList([$file1], false);
$this->assertEquals(['remote' => false], $result);

$share1 = $this->shareManager->newShare();
$share1->setSharedWith('user@server.com')
->setSharedBy($u1->getUID())
->setShareOwner($u1->getUID())
->setPermissions(\OCP\Constants::PERMISSION_READ)
->setNode($file1);
$this->provider->create($share1);

$share2 = $this->shareManager->newShare();
$share2->setSharedWith('foobar@localhost')
->setSharedBy($u1->getUID())
->setShareOwner($u1->getUID())
->setPermissions(\OCP\Constants::PERMISSION_READ)
->setNode($file1);
$this->provider->create($share2);

$result = $this->provider->getAccessList([$file1], true);
$this->assertEquals(['remote' => [
'user@server.com' => [
'token' => 'token1',
'node_id' => $file1->getId(),
],
'foobar@localhost' => [
'token' => 'token2',
'node_id' => $file1->getId(),
],
]], $result);

$result = $this->provider->getAccessList([$file1], false);
$this->assertEquals(['remote' => true], $result);

$u1->delete();
}
}
27 changes: 27 additions & 0 deletions apps/sharebymail/lib/ShareByMailProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -834,4 +834,31 @@ public function getSharesInFolder($userId, Folder $node, $reshares) {
return $shares;
}

/**
* @inheritdoc
*/
public function getAccessList($nodes, $currentAccess) {
$ids = [];
foreach ($nodes as $node) {
$ids[] = $node->getId();
}

$qb = $this->dbConnection->getQueryBuilder();
$qb->select('share_with')
->from('share')
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_EMAIL)))
->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
->andWhere($qb->expr()->orX(
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
))
->setMaxResults(1);
$cursor = $qb->execute();

$mail = $cursor->fetch() !== false;
$cursor->closeCursor();

return ['public' => $mail];
}

}
62 changes: 62 additions & 0 deletions apps/sharebymail/tests/ShareByMailProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -664,4 +664,66 @@ public function testGetSharesInFolder() {
$u2->delete();
}

public function testGetAccessList() {
$userManager = \OC::$server->getUserManager();
$rootFolder = \OC::$server->getRootFolder();

$provider = $this->getInstance(['sendMailNotification', 'createActivity']);

$u1 = $userManager->createUser('testFed', md5(time()));
$u2 = $userManager->createUser('testFed2', md5(time()));

$folder = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo');

$accessList = $provider->getAccessList([$folder], true);
$this->assertArrayHasKey('public', $accessList);
$this->assertFalse($accessList['public']);
$accessList = $provider->getAccessList([$folder], false);
$this->assertArrayHasKey('public', $accessList);
$this->assertFalse($accessList['public']);

$share1 = $this->shareManager->newShare();
$share1->setSharedWith('user@server.com')
->setSharedBy($u1->getUID())
->setShareOwner($u1->getUID())
->setPermissions(\OCP\Constants::PERMISSION_READ)
->setNode($folder);
$share1 = $provider->create($share1);

$share2 = $this->shareManager->newShare();
$share2->setSharedWith('user2@server.com')
->setSharedBy($u2->getUID())
->setShareOwner($u1->getUID())
->setPermissions(\OCP\Constants::PERMISSION_READ)
->setNode($folder);
$share2 = $provider->create($share2);

$accessList = $provider->getAccessList([$folder], true);
$this->assertArrayHasKey('public', $accessList);
$this->assertTrue($accessList['public']);
$accessList = $provider->getAccessList([$folder], false);
$this->assertArrayHasKey('public', $accessList);
$this->assertTrue($accessList['public']);

$provider->delete($share2);

$accessList = $provider->getAccessList([$folder], true);
$this->assertArrayHasKey('public', $accessList);
$this->assertTrue($accessList['public']);
$accessList = $provider->getAccessList([$folder], false);
$this->assertArrayHasKey('public', $accessList);
$this->assertTrue($accessList['public']);

$provider->delete($share1);

$accessList = $provider->getAccessList([$folder], true);
$this->assertArrayHasKey('public', $accessList);
$this->assertFalse($accessList['public']);
$accessList = $provider->getAccessList([$folder], false);
$this->assertArrayHasKey('public', $accessList);
$this->assertFalse($accessList['public']);

$u1->delete();
$u2->delete();
}
}
2 changes: 2 additions & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@
'OCP\\Share\\IManager' => $baseDir . '/lib/public/Share/IManager.php',
'OCP\\Share\\IProviderFactory' => $baseDir . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IShare' => $baseDir . '/lib/public/Share/IShare.php',
'OCP\\Share\\IShareHelper' => $baseDir . '/lib/public/Share/IShareHelper.php',
'OCP\\Share\\IShareProvider' => $baseDir . '/lib/public/Share/IShareProvider.php',
'OCP\\Share_Backend' => $baseDir . '/lib/public/Share_Backend.php',
'OCP\\Share_Backend_Collection' => $baseDir . '/lib/public/Share_Backend_Collection.php',
Expand Down Expand Up @@ -804,6 +805,7 @@
'OC\\Share20\\Manager' => $baseDir . '/lib/private/Share20/Manager.php',
'OC\\Share20\\ProviderFactory' => $baseDir . '/lib/private/Share20/ProviderFactory.php',
'OC\\Share20\\Share' => $baseDir . '/lib/private/Share20/Share.php',
'OC\\Share20\\ShareHelper' => $baseDir . '/lib/private/Share20/ShareHelper.php',
'OC\\Share\\Constants' => $baseDir . '/lib/private/Share/Constants.php',
'OC\\Share\\Helper' => $baseDir . '/lib/private/Share/Helper.php',
'OC\\Share\\MailNotifications' => $baseDir . '/lib/private/Share/MailNotifications.php',
Expand Down
2 changes: 2 additions & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\Share\\IManager' => __DIR__ . '/../../..' . '/lib/public/Share/IManager.php',
'OCP\\Share\\IProviderFactory' => __DIR__ . '/../../..' . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IShare' => __DIR__ . '/../../..' . '/lib/public/Share/IShare.php',
'OCP\\Share\\IShareHelper' => __DIR__ . '/../../..' . '/lib/public/Share/IShareHelper.php',
'OCP\\Share\\IShareProvider' => __DIR__ . '/../../..' . '/lib/public/Share/IShareProvider.php',
'OCP\\Share_Backend' => __DIR__ . '/../../..' . '/lib/public/Share_Backend.php',
'OCP\\Share_Backend_Collection' => __DIR__ . '/../../..' . '/lib/public/Share_Backend_Collection.php',
Expand Down Expand Up @@ -834,6 +835,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Share20\\Manager' => __DIR__ . '/../../..' . '/lib/private/Share20/Manager.php',
'OC\\Share20\\ProviderFactory' => __DIR__ . '/../../..' . '/lib/private/Share20/ProviderFactory.php',
'OC\\Share20\\Share' => __DIR__ . '/../../..' . '/lib/private/Share20/Share.php',
'OC\\Share20\\ShareHelper' => __DIR__ . '/../../..' . '/lib/private/Share20/ShareHelper.php',
'OC\\Share\\Constants' => __DIR__ . '/../../..' . '/lib/private/Share/Constants.php',
'OC\\Share\\Helper' => __DIR__ . '/../../..' . '/lib/private/Share/Helper.php',
'OC\\Share\\MailNotifications' => __DIR__ . '/../../..' . '/lib/private/Share/MailNotifications.php',
Expand Down
35 changes: 28 additions & 7 deletions lib/private/Encryption/File.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,22 +25,35 @@
namespace OC\Encryption;

use OC\Cache\CappedMemoryCache;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Share\IManager;

class File implements \OCP\Encryption\IFile {

/** @var Util */
protected $util;

/** @var IRootFolder */
private $rootFolder;

/** @var IManager */
private $shareManager;

/**
* cache results of already checked folders
*
* @var array
*/
protected $cache;

public function __construct(Util $util) {
public function __construct(Util $util,
IRootFolder $rootFolder,
IManager $shareManager) {
$this->util = $util;
$this->cache = new CappedMemoryCache();
$this->rootFolder = $rootFolder;
$this->shareManager = $shareManager;
}


Expand All @@ -63,26 +76,34 @@ public function getAccessList($path) {
}

$ownerPath = substr($ownerPath, strlen('/files'));
$userFolder = $this->rootFolder->getUserFolder($owner);
try {
$file = $userFolder->get($ownerPath);
} catch (NotFoundException $e) {
$file = null;
}
$ownerPath = $this->util->stripPartialFileExtension($ownerPath);


// first get the shares for the parent and cache the result so that we don't
// need to check all parents for every file
$parent = dirname($ownerPath);
$parentNode = $userFolder->get($parent);
if (isset($this->cache[$parent])) {
$resultForParents = $this->cache[$parent];
} else {
$resultForParents = \OCP\Share::getUsersSharingFile($parent, $owner);
$resultForParents = $this->shareManager->getAccessList($parentNode);
$this->cache[$parent] = $resultForParents;
}
$userIds = \array_merge($userIds, $resultForParents['users']);
$userIds = array_merge($userIds, $resultForParents['users']);
$public = $resultForParents['public'] || $resultForParents['remote'];


// Find out who, if anyone, is sharing the file
$resultForFile = \OCP\Share::getUsersSharingFile($ownerPath, $owner, false, false, false);
$userIds = \array_merge($userIds, $resultForFile['users']);
$public = $resultForFile['public'] || $resultForFile['remote'] || $public;
if ($file !== null) {
$resultForFile = $this->shareManager->getAccessList($file, false);
$userIds = array_merge($userIds, $resultForFile['users']);
$public = $resultForFile['public'] || $resultForFile['remote'] || $public;
}

// check if it is a group mount
if (\OCP\App::isEnabled("files_external")) {
Expand Down
14 changes: 13 additions & 1 deletion lib/private/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
use OC\Security\SecureRandom;
use OC\Security\TrustedDomainHelper;
use OC\Session\CryptoWrapper;
use OC\Share20\ShareHelper;
use OC\Tagging\TagMapper;
use OCA\Theming\ThemingDefaults;
use OCP\App\IAppManager;
Expand All @@ -106,6 +107,7 @@
use OCP\ITempManager;
use OCP\RichObjectStrings\IValidator;
use OCP\Security\IContentSecurityPolicyManager;
use OCP\Share\IShareHelper;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

Expand Down Expand Up @@ -173,7 +175,11 @@ public function __construct($webRoot, \OC\Config $config) {
$c->getGroupManager(),
$c->getConfig()
);
return new Encryption\File($util);
return new Encryption\File(
$util,
$c->getRootFolder(),
$c->getShareManager()
);
});

$this->registerService('EncryptionKeyStorage', function (Server $c) {
Expand Down Expand Up @@ -988,6 +994,12 @@ public function __construct($webRoot, \OC\Config $config) {
$this->registerService(\OCP\ISession::class, function(SimpleContainer $c) {
return $c->query(\OCP\IUserSession::class)->getSession();
});

$this->registerService(IShareHelper::class, function(Server $c) {
return new ShareHelper(
$c->query(\OCP\Share\IManager::class)
);
});
}

/**
Expand Down
Loading

0 comments on commit 10290eb

Please sign in to comment.