Merge pull request #24415 from owncloud/optimize_sharingdisabled_for_user

Optimize isSharingDisabledForUser
This commit is contained in:
Vincent Petry 2016-06-16 09:27:48 +02:00 committed by GitHub
commit 9c328de4ab
3 changed files with 50 additions and 20 deletions

View File

@ -24,25 +24,24 @@
namespace OC\Share20; namespace OC\Share20;
use OC\Cache\CappedMemoryCache;
use OC\Files\Mount\MoveableMount; use OC\Files\Mount\MoveableMount;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\IUserManager;
use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
use OC\Share20\Exception\BackendError;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
use OCP\Security\ISecureRandom;
use OCP\Security\IHasher;
use OCP\Files\Mount\IMountManager;
use OCP\IGroupManager;
use OCP\Files\File; use OCP\Files\File;
use OCP\Files\Folder; use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Share\Exceptions\ShareNotFound; use OCP\Files\Mount\IMountManager;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\ILogger;
use OCP\IUserManager;
use OCP\Security\IHasher;
use OCP\Security\ISecureRandom;
use OCP\Share\Exceptions\GenericShareException; use OCP\Share\Exceptions\GenericShareException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
/** /**
* This class is the communication hub for all sharing related operations. * This class is the communication hub for all sharing related operations.
@ -69,6 +68,9 @@ class Manager implements IManager {
private $userManager; private $userManager;
/** @var IRootFolder */ /** @var IRootFolder */
private $rootFolder; private $rootFolder;
/** @var CappedMemoryCache */
private $sharingDisabledForUsersCache;
/** /**
* Manager constructor. * Manager constructor.
@ -106,6 +108,7 @@ class Manager implements IManager {
$this->factory = $factory; $this->factory = $factory;
$this->userManager = $userManager; $this->userManager = $userManager;
$this->rootFolder = $rootFolder; $this->rootFolder = $rootFolder;
$this->sharingDisabledForUsersCache = new CappedMemoryCache();
} }
/** /**
@ -1209,6 +1212,14 @@ class Manager implements IManager {
* @return bool * @return bool
*/ */
public function sharingDisabledForUser($userId) { public function sharingDisabledForUser($userId) {
if ($userId === null) {
return false;
}
if (isset($this->sharingDisabledForUsersCache[$userId])) {
return $this->sharingDisabledForUsersCache[$userId];
}
if ($this->config->getAppValue('core', 'shareapi_exclude_groups', 'no') === 'yes') { if ($this->config->getAppValue('core', 'shareapi_exclude_groups', 'no') === 'yes') {
$groupsList = $this->config->getAppValue('core', 'shareapi_exclude_groups_list', ''); $groupsList = $this->config->getAppValue('core', 'shareapi_exclude_groups_list', '');
$excludedGroups = json_decode($groupsList); $excludedGroups = json_decode($groupsList);
@ -1224,10 +1235,13 @@ class Manager implements IManager {
// if the user is only in groups which are disabled for sharing then // if the user is only in groups which are disabled for sharing then
// sharing is also disabled for the user // sharing is also disabled for the user
if (empty($remainingGroups)) { if (empty($remainingGroups)) {
$this->sharingDisabledForUsersCache[$userId] = true;
return true; return true;
} }
} }
} }
$this->sharingDisabledForUsersCache[$userId] = false;
return false; return false;
} }

View File

@ -63,6 +63,9 @@ class Util {
const ERROR=3; const ERROR=3;
const FATAL=4; const FATAL=4;
/** \OCP\Share\IManager */
private static $shareManager;
/** /**
* get the current installed version of ownCloud * get the current installed version of ownCloud
* @return array * @return array
@ -171,13 +174,19 @@ class Util {
* *
* @return boolean * @return boolean
* @since 7.0.0 * @since 7.0.0
* @deprecated 9.1.0 Use \OC::$server->getShareManager()->sharingDisabledForUser
*/ */
public static function isSharingDisabledForUser() { public static function isSharingDisabledForUser() {
return \OC_Util::isSharingDisabledForUser( if (self::$shareManager === null) {
\OC::$server->getConfig(), self::$shareManager = \OC::$server->getShareManager();
\OC::$server->getGroupManager(), }
\OC::$server->getUserSession()->getUser()
); $user = \OC::$server->getUserSession()->getUser();
if ($user !== null) {
$user = $user->getUID();
}
return self::$shareManager->sharingDisabledForUser($user);
} }
/** /**

View File

@ -7,6 +7,7 @@
namespace Test\Files; namespace Test\Files;
use OC\Cache\CappedMemoryCache;
use OC\Files\Cache\Watcher; use OC\Files\Cache\Watcher;
use OC\Files\Storage\Common; use OC\Files\Storage\Common;
use OC\Files\Mount\MountPoint; use OC\Files\Mount\MountPoint;
@ -269,6 +270,9 @@ class ViewTest extends \Test\TestCase {
* @dataProvider sharingDisabledPermissionProvider * @dataProvider sharingDisabledPermissionProvider
*/ */
public function testRemoveSharePermissionWhenSharingDisabledForUser($excludeGroups, $excludeGroupsList, $expectedShareable) { public function testRemoveSharePermissionWhenSharingDisabledForUser($excludeGroups, $excludeGroupsList, $expectedShareable) {
// Reset sharing disabled for users cache
$this->invokePrivate(\OC::$server->getShareManager(), 'sharingDisabledForUsersCache', [new CappedMemoryCache()]);
$appConfig = \OC::$server->getAppConfig(); $appConfig = \OC::$server->getAppConfig();
$oldExcludeGroupsFlag = $appConfig->getValue('core', 'shareapi_exclude_groups', 'no'); $oldExcludeGroupsFlag = $appConfig->getValue('core', 'shareapi_exclude_groups', 'no');
$oldExcludeGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list', ''); $oldExcludeGroupsList = $appConfig->getValue('core', 'shareapi_exclude_groups_list', '');
@ -290,6 +294,9 @@ class ViewTest extends \Test\TestCase {
$appConfig->setValue('core', 'shareapi_exclude_groups', $oldExcludeGroupsFlag); $appConfig->setValue('core', 'shareapi_exclude_groups', $oldExcludeGroupsFlag);
$appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList); $appConfig->setValue('core', 'shareapi_exclude_groups_list', $oldExcludeGroupsList);
// Reset sharing disabled for users cache
$this->invokePrivate(\OC::$server->getShareManager(), 'sharingDisabledForUsersCache', [new CappedMemoryCache()]);
} }
public function testCacheIncompleteFolder() { public function testCacheIncompleteFolder() {