summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@owncloud.com>2016-04-04 12:28:19 +0200
committerRoeland Jago Douma <rullzer@owncloud.com>2016-04-04 14:15:38 +0200
commite0cee43cf0a3899567f50a5fb03d867fc2f0327a (patch)
tree5f0d5503b3d971e0b813bc14fd7956cf114abbfe /lib
parentf6cea3c9c436142110504ba76320d57ca7899b27 (diff)
downloadnextcloud-server-e0cee43cf0a3899567f50a5fb03d867fc2f0327a.tar.gz
nextcloud-server-e0cee43cf0a3899567f50a5fb03d867fc2f0327a.zip
Migrate post_userDelete hook to share manager
This makes the post_userDelete hook call the sharemanager. This will cleanup to and from this user. * All shares owned by this user * All shares with this user (user) * All custom group shares * All link share initiated by this user (to avoid invisible link shares) Unit tests are added for the defaultshare provider as well as the federated share provider
Diffstat (limited to 'lib')
-rw-r--r--lib/base.php2
-rw-r--r--lib/private/Share20/DefaultShareProvider.php65
-rw-r--r--lib/private/Share20/Hooks.php27
-rw-r--r--lib/private/Share20/Manager.php12
-rw-r--r--lib/private/share/hooks.php18
-rw-r--r--lib/public/Share/IManager.php11
-rw-r--r--lib/public/Share/IShareProvider.php10
7 files changed, 125 insertions, 20 deletions
diff --git a/lib/base.php b/lib/base.php
index f3076a1181a..d457d1ed485 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -776,7 +776,7 @@ class OC {
*/
public static function registerShareHooks() {
if (\OC::$server->getSystemConfig()->getValue('installed')) {
- OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share\Hooks', 'post_deleteUser');
+ OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Share20\Hooks', 'post_deleteUser');
OC_Hook::connect('OC_User', 'post_addToGroup', 'OC\Share\Hooks', 'post_addToGroup');
OC_Hook::connect('OC_Group', 'pre_addToGroup', 'OC\Share\Hooks', 'pre_addToGroup');
OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OC\Share\Hooks', 'post_removeFromGroup');
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index f6171f87992..370655f8315 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -28,7 +28,6 @@ use OC\Share20\Exception\ProviderException;
use OCP\Share\Exceptions\ShareNotFound;
use OC\Share20\Exception\BackendError;
use OCP\DB\QueryBuilder\IQueryBuilder;
-use OCP\Files\NotFoundException;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUserManager;
@@ -804,4 +803,68 @@ class DefaultShareProvider implements IShareProvider {
return $share;
}
+ /**
+ * A user is deleted from the system
+ * So clean up the relevant shares.
+ *
+ * @param string $uid
+ * @param int $shareType
+ */
+ public function userDeleted($uid, $shareType) {
+ $qb = $this->dbConn->getQueryBuilder();
+
+ $qb->delete('share');
+
+ if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
+ /*
+ * Delete all user shares that are owned by this user
+ * or that are received by this user
+ */
+
+ $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
+
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
+ $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
+ )
+ );
+ } else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
+ /*
+ * Delete all group shares that are owned by this user
+ * Or special user group shares that are received by this user
+ */
+ $qb->where(
+ $qb->expr()->andX(
+ $qb->expr()->orX(
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
+ ),
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
+ )
+ );
+
+ $qb->orWhere(
+ $qb->expr()->andX(
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
+ $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
+ )
+ );
+ } else if ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
+ /*
+ * Delete all link shares owned by this user.
+ * And all link shares initiated by this user (until #22327 is in)
+ */
+ $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
+
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
+ $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
+ )
+ );
+ }
+
+ $qb->execute();
+ }
}
diff --git a/lib/private/Share20/Hooks.php b/lib/private/Share20/Hooks.php
new file mode 100644
index 00000000000..93669974b28
--- /dev/null
+++ b/lib/private/Share20/Hooks.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @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 <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OC\Share20;
+
+class Hooks {
+ public static function post_deleteUser($arguments) {
+ \OC::$server->getShareManager()->userDeleted($arguments['uid']);
+ }
+}
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 1c9d4d82277..6c665f7e133 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -1019,6 +1019,18 @@ class Manager implements IManager {
}
/**
+ * @inheritdoc
+ */
+ public function userDeleted($uid) {
+ $types = [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_LINK, \OCP\Share::SHARE_TYPE_REMOTE];
+
+ foreach ($types as $type) {
+ $provider = $this->factory->getProviderForType($type);
+ $provider->userDeleted($uid, $type);
+ }
+ }
+
+ /**
* Get access list to a path. This means
* all the users and groups that can access a given path.
*
diff --git a/lib/private/share/hooks.php b/lib/private/share/hooks.php
index 750486ba80f..dae273eefb8 100644
--- a/lib/private/share/hooks.php
+++ b/lib/private/share/hooks.php
@@ -33,24 +33,6 @@ class Hooks extends \OC\Share\Constants {
private static $updateTargets = array();
/**
- * Function that is called after a user is deleted. Cleans up the shares of that user.
- * @param array $arguments
- */
- public static function post_deleteUser($arguments) {
- // Delete any items shared with the deleted user
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share`'
- .' WHERE `share_with` = ? AND (`share_type` = ? OR `share_type` = ?)');
- $query->execute(array($arguments['uid'], self::SHARE_TYPE_USER, self::$shareTypeGroupUserUnique));
- // Delete any items the deleted user shared
- $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*share` WHERE `uid_owner` = ?');
- $result = $query->execute(array($arguments['uid']));
- while ($item = $result->fetchRow()) {
- Helper::delete($item['id']);
- }
- }
-
-
- /**
* Function that is called before a user is added to a group.
* check if we need to create a unique target for the user
* @param array $arguments
diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php
index 64e5b554de9..e3780ac070c 100644
--- a/lib/public/Share/IManager.php
+++ b/lib/public/Share/IManager.php
@@ -150,6 +150,17 @@ interface IManager {
public function checkPassword(IShare $share, $password);
/**
+ * The user with UID is deleted.
+ * All share providers have to cleanup the shares with this user as well
+ * as shares owned by this user.
+ * Shares only initiated by this user are fine.
+ *
+ * @param string $uid
+ * @since 9.1.0
+ */
+ public function userDeleted($uid);
+
+ /**
* Instantiates a new share object. This is to be passed to
* createShare.
*
diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php
index d00b9da7b59..e201ba81ebc 100644
--- a/lib/public/Share/IShareProvider.php
+++ b/lib/public/Share/IShareProvider.php
@@ -146,4 +146,14 @@ interface IShareProvider {
* @since 9.0.0
*/
public function getShareByToken($token);
+
+ /**
+ * A user is deleted from the system
+ * So clean up the relevant shares.
+ *
+ * @param string $uid
+ * @param int $shareType
+ * @since 9.1.0
+ */
+ public function userDeleted($uid, $shareType);
}