Merge pull request #17920 from nextcloud/fix/15258/ext-storage-respect-deletion
when a user was deleted remove them from applicable list, unless...
This commit is contained in:
commit
254d4e0964
|
@ -34,6 +34,8 @@ require_once __DIR__ . '/../3rdparty/autoload.php';
|
|||
|
||||
// register Application object singleton
|
||||
\OC_Mount_Config::$app = \OC::$server->query(\OCA\Files_External\AppInfo\Application::class);
|
||||
\OC_Mount_Config::$app->registerListeners();
|
||||
|
||||
$appContainer = \OC_Mount_Config::$app->getContainer();
|
||||
|
||||
\OCA\Files\App::getNavigationManager()->add(function () {
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
namespace OCA\Files_External\AppInfo;
|
||||
|
||||
use OCA\Files_External\Config\UserPlaceholderHandler;
|
||||
use OCA\Files_External\Service\DBConfigService;
|
||||
use OCA\Files_External\Lib\Auth\AmazonS3\AccessKey;
|
||||
use OCA\Files_External\Lib\Auth\Builtin;
|
||||
use OCA\Files_External\Lib\Auth\NullMechanism;
|
||||
|
@ -63,6 +64,9 @@ use OCA\Files_External\Service\BackendService;
|
|||
use OCP\AppFramework\App;
|
||||
use OCP\AppFramework\IAppContainer;
|
||||
use OCP\Files\Config\IUserMountCache;
|
||||
use OCP\IGroup;
|
||||
use OCP\IUser;
|
||||
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||
|
||||
/**
|
||||
* @package OCA\Files_External\AppInfo
|
||||
|
@ -96,6 +100,30 @@ class Application extends App implements IBackendProvider, IAuthMechanismProvide
|
|||
$this->getAuthMechanisms();
|
||||
}
|
||||
|
||||
public function registerListeners() {
|
||||
$dispatcher = $this->getContainer()->getServer()->getEventDispatcher();
|
||||
$dispatcher->addListener(
|
||||
IUser::class . '::postDelete',
|
||||
function (GenericEvent $event) {
|
||||
/** @var IUser $user */
|
||||
$user = $event->getSubject();
|
||||
/** @var DBConfigService $config */
|
||||
$config = $this->getContainer()->query(DBConfigService::class);
|
||||
$config->modifyMountsOnUserDelete($user->getUID());
|
||||
}
|
||||
);
|
||||
$dispatcher->addListener(
|
||||
IGroup::class . '::postDelete',
|
||||
function (GenericEvent $event) {
|
||||
/** @var IGroup $group */
|
||||
$group = $event->getSubject();
|
||||
/** @var DBConfigService $config */
|
||||
$config = $this->getContainer()->query(DBConfigService::class);
|
||||
$config->modifyMountsOnGroupDelete($group->getGID());
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @{inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -114,6 +114,38 @@ class DBConfigService {
|
|||
return $this->getMountsFromQuery($query);
|
||||
}
|
||||
|
||||
public function modifyMountsOnUserDelete(string $uid): void {
|
||||
$this->modifyMountsOnDelete($uid, self::APPLICABLE_TYPE_USER);
|
||||
}
|
||||
|
||||
public function modifyMountsOnGroupDelete(string $gid): void {
|
||||
$this->modifyMountsOnDelete($gid, self::APPLICABLE_TYPE_GROUP);
|
||||
}
|
||||
|
||||
protected function modifyMountsOnDelete(string $applicableId, int $applicableType): void {
|
||||
$builder = $this->connection->getQueryBuilder();
|
||||
$query = $builder->select(['a.mount_id', $builder->func()->count('a.mount_id', 'count')])
|
||||
->from('external_applicable', 'a')
|
||||
->rightJoin('a', 'external_applicable', 'b', $builder->expr()->eq('a.mount_id', 'b.mount_id'))
|
||||
->where($builder->expr()->andX(
|
||||
$builder->expr()->eq('a.type', $builder->createNamedParameter($applicableType, IQueryBuilder::PARAM_INT)),
|
||||
$builder->expr()->eq('a.value', $builder->createNamedParameter($applicableId))
|
||||
)
|
||||
)
|
||||
->groupBy(['a.mount_id']);
|
||||
$stmt = $query->execute();
|
||||
$result = $stmt->fetchAll();
|
||||
$stmt->closeCursor();
|
||||
|
||||
foreach ($result as $row) {
|
||||
if((int)$row['count'] > 1) {
|
||||
$this->removeApplicable($row['mount_id'], $applicableType, $applicableId);
|
||||
} else {
|
||||
$this->removeMount($row['mount_id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get admin defined mounts
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue