summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJoas Schilling <nickvergessen@gmx.de>2016-04-07 13:01:10 +0200
committerJoas Schilling <nickvergessen@gmx.de>2016-04-07 13:01:10 +0200
commit0de15a86f057c8b0e88f353762059d4e0971b780 (patch)
tree718fc80fb91b2cf032998d49f655b4700cb26570 /lib
parent8932ec64a5d61691a506166ebbeeeb37af8b5106 (diff)
parente0cee43cf0a3899567f50a5fb03d867fc2f0327a (diff)
downloadnextcloud-server-0de15a86f057c8b0e88f353762059d4e0971b780.tar.gz
nextcloud-server-0de15a86f057c8b0e88f353762059d4e0971b780.zip
Merge pull request #23773 from owncloud/share_move_delete_user_hook
Migrate post_userDelete hook to share manager
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 706322fb542..a76edb1192a 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -777,7 +777,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);
}