diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-01-07 14:57:05 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-01-07 14:57:05 +0100 |
commit | 601457d2217ec1ed18b49061e38d4cda3703c9f6 (patch) | |
tree | 5e27256a3442453f3544ad4f107aa60114275a99 /lib/private | |
parent | 9d3c14c7dd102784a4e1b57ed063cddf59f63f8c (diff) | |
parent | 1358e5dcd9af0ecace07115a790544a22d5eb3bd (diff) | |
download | nextcloud-server-601457d2217ec1ed18b49061e38d4cda3703c9f6.tar.gz nextcloud-server-601457d2217ec1ed18b49061e38d4cda3703c9f6.zip |
Merge pull request #20773 from owncloud/share2.0_create
[Sharing 2.0] create share
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/share20/defaultshareprovider.php | 124 | ||||
-rw-r--r-- | lib/private/share20/ishare.php | 35 | ||||
-rw-r--r-- | lib/private/share20/ishareprovider.php | 3 | ||||
-rw-r--r-- | lib/private/share20/manager.php | 540 | ||||
-rw-r--r-- | lib/private/share20/share.php | 2 |
5 files changed, 677 insertions, 27 deletions
diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php index bc3bc0ce9ed..a7155644920 100644 --- a/lib/private/share20/defaultshareprovider.php +++ b/lib/private/share20/defaultshareprovider.php @@ -64,11 +64,90 @@ class DefaultShareProvider implements IShareProvider { /** * Share a path - * + * * @param IShare $share * @return IShare The share object + * @throws ShareNotFound + * @throws \Exception */ public function create(IShare $share) { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share'); + $qb->setValue('share_type', $qb->createNamedParameter($share->getShareType())); + + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { + //Set the UID of the user we share with + $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()->getUID())); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { + //Set the GID of the group we share with + $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()->getGID())); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { + //Set the token of the share + $qb->setValue('token', $qb->createNamedParameter($share->getToken())); + + //If a password is set store it + if ($share->getPassword() !== null) { + $qb->setValue('share_with', $qb->createNamedParameter($share->getPassword())); + } + + //If an expiration date is set store it + if ($share->getExpirationDate() !== null) { + $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime')); + } + } else { + throw new \Exception('invalid share type!'); + } + + // Set what is shares + $qb->setValue('item_type', $qb->createParameter('itemType')); + if ($share->getPath() instanceof \OCP\Files\File) { + $qb->setParameter('itemType', 'file'); + } else { + $qb->setParameter('itemType', 'folder'); + } + + // Set the file id + $qb->setValue('item_source', $qb->createNamedParameter($share->getPath()->getId())); + $qb->setValue('file_source', $qb->createNamedParameter($share->getPath()->getId())); + + // set the permissions + $qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions())); + + // Set who created this share + $qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()->getUID())); + + // Set who is the owner of this file/folder (and this the owner of the share) + $qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()->getUID())); + + // Set the file target + $qb->setValue('file_target', $qb->createNamedParameter($share->getTarget())); + + // Set the time this share was created + $qb->setValue('stime', $qb->createNamedParameter(time())); + + // insert the data and fetch the id of the share + $this->dbConn->beginTransaction(); + $qb->execute(); + $id = $this->dbConn->lastInsertId('*PREFIX*share'); + $this->dbConn->commit(); + + // Now fetch the inserted share and create a complete share object + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('*PREFIX*share') + ->where($qb->expr()->eq('id', $qb->createNamedParameter($id))); + + $cursor = $qb->execute(); + $data = $cursor->fetch(); + $cursor->closeCursor(); + + if ($data === false) { + throw new ShareNotFound(); + } + + $share = $this->createShare($data); + return $share; } /** @@ -170,11 +249,29 @@ class DefaultShareProvider implements IShareProvider { /** * Get shares for a given path * - * @param \OCP\IUser $user * @param \OCP\Files\Node $path * @return IShare[] */ - public function getSharesByPath(IUser $user, Node $path) { + public function getSharesByPath(Node $path) { + $qb = $this->dbConn->getQueryBuilder(); + + $cursor = $qb->select('*') + ->from('share') + ->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId()))) + ->andWhere( + $qb->expr()->orX( + $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)), + $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)) + ) + )->execute(); + + $shares = []; + while($data = $cursor->fetch()) { + $shares[] = $this->createShare($data); + } + $cursor->closeCursor(); + + return $shares; } /** @@ -223,16 +320,21 @@ class DefaultShareProvider implements IShareProvider { $share->setSharedWith($data['share_with']); } - $share->setSharedBy($this->userManager->get($data['uid_owner'])); - - // TODO: getById can return an array. How to handle this properly?? - $folder = $this->rootFolder->getUserFolder($share->getSharedBy()->getUID()); - $path = $folder->getById((int)$data['file_source'])[0]; + if ($data['uid_initiator'] === null) { + //OLD SHARE + $share->setSharedBy($this->userManager->get($data['uid_owner'])); + $folder = $this->rootFolder->getUserFolder($share->getSharedBy()->getUID()); + $path = $folder->getById((int)$data['file_source'])[0]; - $owner = $path->getOwner(); - $share->setShareOwner($owner); + $owner = $path->getOwner(); + $share->setShareOwner($owner); + } else { + //New share! + $share->setSharedBy($this->userManager->get($data['uid_initiator'])); + $share->setShareOwner($this->userManager->get($data['uid_owner'])); + } - $path = $this->rootFolder->getUserFolder($owner->getUID())->getById((int)$data['file_source'])[0]; + $path = $this->rootFolder->getUserFolder($share->getShareOwner()->getUID())->getById((int)$data['file_source'])[0]; $share->setPath($path); if ($data['expiration'] !== null) { diff --git a/lib/private/share20/ishare.php b/lib/private/share20/ishare.php index 2e54da7a029..a149c578fb2 100644 --- a/lib/private/share20/ishare.php +++ b/lib/private/share20/ishare.php @@ -101,7 +101,7 @@ interface IShare { * @param \DateTime $expireDate * @return Share The modified object */ - public function setExpirationDate(\DateTime $expireDate); + public function setExpirationDate($expireDate); /** * Get the share expiration date @@ -111,6 +111,14 @@ interface IShare { public function getExpirationDate(); /** + * Set the sharer of the path + * + * @param IUser|string $sharedBy + * @return Share The modified object + */ + public function setSharedBy($sharedBy); + + /** * Get share sharer * * @return IUser|string @@ -118,6 +126,15 @@ interface IShare { public function getSharedBy(); /** + * Set the original share owner (who owns the path) + * + * @param IUser|string + * + * @return Share The modified object + */ + public function setShareOwner($shareOwner); + + /** * Get the original share owner (who owns the path) * * @return IUser|string @@ -141,6 +158,14 @@ interface IShare { public function getPassword(); /** + * Set the token + * + * @param string $token + * @return Share The modified object + */ + public function setToken($token); + + /** * Get the token * * @return string @@ -155,6 +180,14 @@ interface IShare { public function getParent(); /** + * Set the target of this share + * + * @param string $target + * @return Share The modified object + */ + public function setTarget($target); + + /** * Get the target of this share * * @return string diff --git a/lib/private/share20/ishareprovider.php b/lib/private/share20/ishareprovider.php index 56a550acf71..97a2b728d5f 100644 --- a/lib/private/share20/ishareprovider.php +++ b/lib/private/share20/ishareprovider.php @@ -81,11 +81,10 @@ interface IShareProvider { /** * Get shares for a given path * - * @param \OCP\IUser $user * @param \OCP\Files\Node $path * @return IShare[] */ - public function getSharesByPath(\OCP\IUser $user, \OCP\Files\Node $path); + public function getSharesByPath(\OCP\Files\Node $path); /** * Get shared with the given user diff --git a/lib/private/share20/manager.php b/lib/private/share20/manager.php index 882b281c490..8d753061c0c 100644 --- a/lib/private/share20/manager.php +++ b/lib/private/share20/manager.php @@ -21,53 +21,458 @@ namespace OC\Share20; -use OCP\IAppConfig; +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\Folder; +use OCP\IUser; use OC\Share20\Exception\ShareNotFound; +use OC\HintException; /** * This class is the communication hub for all sharing related operations. */ class Manager { - /** - * @var IShareProvider[] - */ + /** @var IShareProvider[] */ private $defaultProvider; /** @var ILogger */ private $logger; - /** @var IAppConfig */ - private $appConfig; + /** @var IConfig */ + private $config; + + /** @var ISecureRandom */ + private $secureRandom; + + /** @var IHasher */ + private $hasher; + + /** @var IMountManager */ + private $mountManager; + + /** @var IGroupManager */ + private $groupManager; + + /** @var IL10N */ + private $l; /** * Manager constructor. * * @param ILogger $logger - * @param IAppConfig $appConfig + * @param IConfig $config * @param IShareProvider $defaultProvider + * @param ISecureRandom $secureRandom + * @param IHasher $hasher + * @param IMountManager $mountManager + * @param IGroupManager $groupManager + * @param IL10N $l */ public function __construct( ILogger $logger, - IAppConfig $appConfig, - IShareProvider $defaultProvider + IConfig $config, + IShareProvider $defaultProvider, + ISecureRandom $secureRandom, + IHasher $hasher, + IMountManager $mountManager, + IGroupManager $groupManager, + IL10N $l ) { $this->logger = $logger; - $this->appConfig = $appConfig; + $this->config = $config; + $this->secureRandom = $secureRandom; + $this->hasher = $hasher; + $this->mountManager = $mountManager; + $this->groupManager = $groupManager; + $this->l = $l; // TEMP SOLUTION JUST TO GET STARTED $this->defaultProvider = $defaultProvider; } /** + * Verify if a password meets all requirements + * + * @param string $password + * @throws \Exception + */ + protected function verifyPassword($password) { + if ($password === null) { + // No password is set, check if this is allowed. + if ($this->shareApiLinkEnforcePassword()) { + throw new \InvalidArgumentException('Passwords are enforced for link shares'); + } + + return; + } + + // Let others verify the password + $accepted = true; + $message = ''; + \OCP\Util::emitHook('\OC\Share', 'verifyPassword', [ + 'password' => $password, + 'accepted' => &$accepted, + 'message' => &$message + ]); + + if (!$accepted) { + throw new \Exception($message); + } + } + + /** + * Check for generic requirements before creating a share + * + * @param IShare $share + * @throws \Exception + */ + protected function generalCreateChecks(IShare $share) { + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { + // We expect a valid user as sharedWith for user shares + if (!($share->getSharedWith() instanceof \OCP\IUser)) { + throw new \InvalidArgumentException('SharedWith should be an IUser'); + } + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { + // We expect a valid group as sharedWith for group shares + if (!($share->getSharedWith() instanceof \OCP\IGroup)) { + throw new \InvalidArgumentException('SharedWith should be an IGroup'); + } + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { + if ($share->getSharedWith() !== null) { + throw new \InvalidArgumentException('SharedWith should be empty'); + } + } else { + // We can't handle other types yet + throw new \InvalidArgumentException('unkown share type'); + } + + // Verify the initiator of the share is et + if ($share->getSharedBy() === null) { + throw new \InvalidArgumentException('SharedBy should be set'); + } + + // Cannot share with yourself + if ($share->getSharedWith() === $share->getSharedBy()) { + throw new \InvalidArgumentException('Can\'t share with yourself'); + } + + // The path should be set + if ($share->getPath() === null) { + throw new \InvalidArgumentException('Path should be set'); + } + // And it should be a file or a folder + if (!($share->getPath() instanceof \OCP\Files\File) && + !($share->getPath() instanceof \OCP\Files\Folder)) { + throw new \InvalidArgumentException('Path should be either a file or a folder'); + } + + // Check if we actually have share permissions + if (!$share->getPath()->isShareable()) { + $message_t = $this->l->t('You are not allowed to share %s', [$share->getPath()->getPath()]); + throw new HintException($message_t, $message_t, 404); + } + + // Permissions should be set + if ($share->getPermissions() === null) { + throw new \InvalidArgumentException('A share requires permissions'); + } + + // Check that we do not share with more permissions than we have + if ($share->getPermissions() & ~$share->getPath()->getPermissions()) { + $message_t = $this->l->t('Cannot increase permissions of %s', [$share->getPath()->getPath()]); + throw new HintException($message_t, $message_t, 404); + } + + // Check that read permissions are always set + if (($share->getPermissions() & \OCP\Constants::PERMISSION_READ) === 0) { + throw new \InvalidArgumentException('Shares need at least read permissions'); + } + } + + /** + * Validate if the expiration date fits the system settings + * + * @param \DateTime $expireDate The current expiration date (can be null) + * @return \DateTime|null The expiration date or null if $expireDate was null and it is not required + * @throws \OC\HintException + */ + protected function validateExpiredate($expireDate) { + + if ($expireDate !== null) { + //Make sure the expiration date is a date + $expireDate->setTime(0, 0, 0); + + $date = new \DateTime(); + $date->setTime(0, 0, 0); + if ($date >= $expireDate) { + $message = $this->l->t('Expiration date is in the past'); + throw new \OC\HintException($message, $message, 404); + } + } + + // If we enforce the expiration date check that is does not exceed + if ($this->shareApiLinkDefaultExpireDateEnforced()) { + if ($expireDate === null) { + throw new \InvalidArgumentException('Expiration date is enforced'); + } + + $date = new \DateTime(); + $date->setTime(0, 0, 0); + $date->add(new \DateInterval('P' . $this->shareApiLinkDefaultExpireDays() . 'D')); + if ($date < $expireDate) { + $message = $this->l->t('Cannot set expiration date more than %s days in the future', [$this->shareApiLinkDefaultExpireDays()]); + throw new \OC\HintException($message, $message, 404); + } + + return $expireDate; + } + + // If expiredate is empty set a default one if there is a default + if ($expireDate === null && $this->shareApiLinkDefaultExpireDate()) { + $date = new \DateTime(); + $date->setTime(0,0,0); + $date->add(new \DateInterval('P'.$this->shareApiLinkDefaultExpireDays().'D')); + return $date; + } + + return $expireDate; + } + + + /** + * Check for pre share requirements for use shares + * + * @param IShare $share + * @throws \Exception + */ + protected function userCreateChecks(IShare $share) { + // Check if we can share with group members only + if ($this->shareWithGroupMembersOnly()) { + // Verify we can share with this user + $groups = array_intersect( + $this->groupManager->getUserGroupIds($share->getSharedBy()), + $this->groupManager->getUserGroupIds($share->getSharedWith()) + ); + if (empty($groups)) { + throw new \Exception('Only sharing with group members is allowed'); + } + } + + /* + * TODO: Could be costly, fix + * + * Also this is not what we want in the future.. then we want to squash identical shares. + */ + $existingShares = $this->defaultProvider->getSharesByPath($share->getPath()); + foreach($existingShares as $existingShare) { + // Identical share already existst + if ($existingShare->getSharedWith() === $share->getSharedWith()) { + throw new \Exception('Path already shared with this user'); + } + + // The share is already shared with this user via a group share + if ($existingShare->getShareType() === \OCP\Share::SHARE_TYPE_GROUP && + $existingShare->getSharedWith()->inGroup($share->getSharedWith()) && + $existingShare->getShareOwner() !== $share->getShareOwner()) { + throw new \Exception('Path already shared with this user'); + } + } + } + + /** + * Check for pre share requirements for group shares + * + * @param IShare $share + * @throws \Exception + */ + protected function groupCreateChecks(IShare $share) { + // Verify if the user can share with this group + if ($this->shareWithGroupMembersOnly()) { + if (!$share->getSharedWith()->inGroup($share->getSharedBy())) { + throw new \Exception('Only sharing within your own groups is allowed'); + } + } + + /* + * TODO: Could be costly, fix + * + * Also this is not what we want in the future.. then we want to squash identical shares. + */ + $existingShares = $this->defaultProvider->getSharesByPath($share->getPath()); + foreach($existingShares as $existingShare) { + if ($existingShare->getSharedWith() === $share->getSharedWith()) { + throw new \Exception('Path already shared with this group'); + } + } + } + + /** + * Check for pre share requirements for link shares + * + * @param IShare $share + * @throws \Exception + */ + protected function linkCreateChecks(IShare $share) { + // Are link shares allowed? + if (!$this->shareApiAllowLinks()) { + throw new \Exception('Link sharing not allowed'); + } + + // Link shares by definition can't have share permissions + if ($share->getPermissions() & \OCP\Constants::PERMISSION_SHARE) { + throw new \InvalidArgumentException('Link shares can\'t have reshare permissions'); + } + + // We don't allow deletion on link shares + if ($share->getPermissions() & \OCP\Constants::PERMISSION_DELETE) { + throw new \InvalidArgumentException('Link shares can\'t have delete permissions'); + } + + // Check if public upload is allowed + if (!$this->shareApiLinkAllowPublicUpload() && + ($share->getPermissions() & (\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE))) { + throw new \InvalidArgumentException('Public upload not allowed'); + } + } + + /** + * @param File|Folder $path + */ + protected function pathCreateChecks($path) { + // Make sure that we do not share a path that contains a shared mountpoint + if ($path instanceof \OCP\Files\Folder) { + $mounts = $this->mountManager->findIn($path->getPath()); + foreach($mounts as $mount) { + if ($mount->getStorage()->instanceOfStorage('\OCA\Files_Sharing\ISharedStorage')) { + throw new \InvalidArgumentException('Path contains files shared with you'); + } + } + } + } + + /** + * Check if the user that is sharing can actually share + * + * @param IShare $share + * @return bool + */ + protected function canShare(IShare $share) { + if (!$this->shareApiEnabled()) { + return false; + } + + if ($this->isSharingDisabledForUser($share->getSharedBy())) { + return false; + } + + return true; + } + + /** * Share a path * - * @param Share $share + * @param IShare $share * @return Share The share object + * @throws \Exception + * + * TODO: handle link share permissions or check them */ - public function createShare(Share $share) { + public function createShare(IShare $share) { + if (!$this->canShare($share)) { + throw new \Exception('The Share API is disabled'); + } + + $this->generalCreateChecks($share); + + //Verify share type + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { + $this->userCreateChecks($share); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { + $this->groupCreateChecks($share); + } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { + $this->linkCreateChecks($share); + + /* + * For now ignore a set token. + */ + $share->setToken( + $this->secureRandom->generate( + \OC\Share\Constants::TOKEN_LENGTH, + \OCP\Security\ISecureRandom::CHAR_LOWER. + \OCP\Security\ISecureRandom::CHAR_UPPER. + \OCP\Security\ISecureRandom::CHAR_DIGITS + ) + ); + + //Verify the expiration date + $share->setExpirationDate($this->validateExpiredate($share->getExpirationDate())); + + //Verify the password + $this->verifyPassword($share->getPassword()); + + // If a password is set. Hash it! + if ($share->getPassword() !== null) { + $share->setPassword($this->hasher->hash($share->getPassword())); + } + } + + // Verify if there are any issues with the path + $this->pathCreateChecks($share->getPath()); + + // On creation of a share the owner is always the owner of the path + $share->setShareOwner($share->getPath()->getOwner()); + + // Generate the target + $target = $this->config->getSystemValue('share_folder', '/') .'/'. $share->getPath()->getName(); + $target = \OC\Files\Filesystem::normalizePath($target); + $share->setTarget($target); + + // Pre share hook + $run = true; + $error = ''; + $preHookData = [ + 'itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder', + 'itemSource' => $share->getPath()->getId(), + 'shareType' => $share->getShareType(), + 'uidOwner' => $share->getSharedBy()->getUID(), + 'permissions' => $share->getPermissions(), + 'fileSource' => $share->getPath()->getId(), + 'expiration' => $share->getExpirationDate(), + 'token' => $share->getToken(), + 'run' => &$run, + 'error' => &$error + ]; + \OC_Hook::emit('OCP\Share', 'pre_shared', $preHookData); + + if ($run === false) { + throw new \Exception($error); + } + + $share = $this->defaultProvider->create($share); + + // Post share hook + $postHookData = [ + 'itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder', + 'itemSource' => $share->getPath()->getId(), + 'shareType' => $share->getShareType(), + 'uidOwner' => $share->getSharedBy()->getUID(), + 'permissions' => $share->getPermissions(), + 'fileSource' => $share->getPath()->getId(), + 'expiration' => $share->getExpirationDate(), + 'token' => $share->getToken(), + 'id' => $share->getId(), + ]; + \OC_Hook::emit('OCP\Share', 'post_shared', $postHookData); + + return $share; } /** @@ -251,4 +656,115 @@ class Manager { */ public function getAccessList(\OCP\Files\Node $path) { } + + /** + * Create a new share + * @return IShare; + */ + public function newShare() { + return new \OC\Share20\Share(); + } + + /** + * Is the share API enabled + * + * @return bool + */ + public function shareApiEnabled() { + return $this->config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes'; + } + + /** + * Is public link sharing enabled + * + * @return bool + */ + public function shareApiAllowLinks() { + return $this->config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes'; + } + + /** + * Is password on public link requires + * + * @return bool + */ + public function shareApiLinkEnforcePassword() { + return $this->config->getAppValue('core', 'shareapi_enforce_links_password', 'no') === 'yes'; + } + + /** + * Is default expire date enabled + * + * @return bool + */ + public function shareApiLinkDefaultExpireDate() { + return $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes'; + } + + /** + * Is default expire date enforced + *` + * @return bool + */ + public function shareApiLinkDefaultExpireDateEnforced() { + return $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes'; + } + + /** + * Number of default expire days + *shareApiLinkAllowPublicUpload + * @return int + */ + public function shareApiLinkDefaultExpireDays() { + return (int)$this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7'); + } + + /** + * Allow public upload on link shares + * + * @return bool + */ + public function shareApiLinkAllowPublicUpload() { + return $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes') === 'yes'; + } + + /** + * check if user can only share with group members + * @return bool + */ + public function shareWithGroupMembersOnly() { + return $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + } + + + /** + * Copied from \OC_Util::isSharingDisabledForUser + * + * TODO: Deprecate fuction from OC_Util + * + * @param IUser $user + * @return bool + */ + public function isSharingDisabledForUser($user) { + if ($this->config->getAppValue('core', 'shareapi_exclude_groups', 'no') === 'yes') { + $groupsList = $this->config->getAppValue('core', 'shareapi_exclude_groups_list', ''); + $excludedGroups = json_decode($groupsList); + if (is_null($excludedGroups)) { + $excludedGroups = explode(',', $groupsList); + $newValue = json_encode($excludedGroups); + $this->config->setAppValue('core', 'shareapi_exclude_groups_list', $newValue); + } + $usersGroups = $this->groupManager->getUserGroupIds($user); + if (!empty($usersGroups)) { + $remainingGroups = array_diff($usersGroups, $excludedGroups); + // if the user is only in groups which are disabled for sharing then + // sharing is also disabled for the user + if (empty($remainingGroups)) { + return true; + } + } + } + return false; + } + } diff --git a/lib/private/share20/share.php b/lib/private/share20/share.php index b7ce38ac61d..4827000eefa 100644 --- a/lib/private/share20/share.php +++ b/lib/private/share20/share.php @@ -163,7 +163,7 @@ class Share implements IShare { * @param \DateTime $expireDate * @return Share The modified object */ - public function setExpirationDate(\DateTime $expireDate) { + public function setExpirationDate($expireDate) { //TODO checks $this->expireDate = $expireDate; |