Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Access list to share manager #2834

Merged
merged 29 commits into from
Apr 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
d84df15
Add getAccessList to ShareManager
rullzer Sep 9, 2016
7dcc98e
Add owner to access list
rullzer Sep 9, 2016
88299ec
Added to public interface
rullzer Oct 19, 2016
a1edcc8
Port Encryption/file to new getAccessList
rullzer Oct 19, 2016
553b3b2
Fix tests
rullzer Oct 27, 2016
97f8ca6
Added ShareHelper
rullzer Oct 27, 2016
2cbac33
Offload acceslist creation to providers
rullzer Dec 22, 2016
12afd7d
Add mail element to access list
rullzer Jan 4, 2017
4437e00
Add shareHelper test
rullzer Jan 4, 2017
0c2dc3b
Fix comments
rullzer Mar 20, 2017
91e6507
Return the paths for the users without setting them all up
nickvergessen Mar 27, 2017
cf7c320
Also return the token
nickvergessen Mar 27, 2017
4bcb7d8
Return the token as well
nickvergessen Mar 28, 2017
3c1365c
Fix returned paths for remote shares
nickvergessen Mar 28, 2017
5df727d
Fix federated file sharing
nickvergessen Apr 10, 2017
2fcf334
Fix tests for ShareHelper
nickvergessen Apr 10, 2017
5b57bb9
Fix default share provider
nickvergessen Apr 10, 2017
4eeb194
Fix share manager test
nickvergessen Apr 10, 2017
6c23a5f
Add unit tests for sharebymail provider
nickvergessen Apr 11, 2017
629b7c0
Adjust docs and make !$currentAccess simpler
nickvergessen Apr 11, 2017
7d416ac
Activate the test
nickvergessen Apr 11, 2017
29f2088
Catch exceptions and use as many results as possible
nickvergessen Apr 11, 2017
e1d54e3
Add more tests for the share helper
nickvergessen Apr 11, 2017
f57ef55
Add samples to the docs
nickvergessen Apr 11, 2017
b96297e
Do not set full path if not currentAccess
rullzer Apr 13, 2017
aef95b9
Not needed in the DIContainer anymore
rullzer Apr 13, 2017
0f56823
Fix server container registration
rullzer Apr 13, 2017
6a519ab
Update autoloader
rullzer Apr 13, 2017
cab4111
Mail shares trigger the public key
rullzer Apr 13, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -794,6 +795,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 @@ -824,6 +825,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
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ public function __construct($appName, $urlParams = array(), ServerContainer $ser
);
});


/**
* App Framework APIs
*/
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 @@ -973,6 +979,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