extend with group deletion handling

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
Arthur Schiwon 2019-11-13 12:28:23 +01:00
parent be85d00a38
commit 4baab51f4c
No known key found for this signature in database
GPG Key ID: 7424F1874854DF23
2 changed files with 25 additions and 6 deletions

View File

@ -64,6 +64,7 @@ use OCA\Files_External\Service\BackendService;
use OCP\AppFramework\App; use OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer; use OCP\AppFramework\IAppContainer;
use OCP\Files\Config\IUserMountCache; use OCP\Files\Config\IUserMountCache;
use OCP\IGroup;
use OCP\IUser; use OCP\IUser;
use Symfony\Component\EventDispatcher\GenericEvent; use Symfony\Component\EventDispatcher\GenericEvent;
@ -111,6 +112,16 @@ class Application extends App implements IBackendProvider, IAuthMechanismProvide
$config->modifyMountsOnUserDelete($user->getUID()); $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());
}
);
} }
/** /**

View File

@ -114,15 +114,23 @@ class DBConfigService {
return $this->getMountsFromQuery($query); return $this->getMountsFromQuery($query);
} }
public function modifyMountsOnUserDelete(string $uid) { 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(); $builder = $this->connection->getQueryBuilder();
$query = $builder->select(['a.mount_id', $builder->func()->count('a.mount_id', 'count')]) $query = $builder->select(['a.mount_id', $builder->func()->count('a.mount_id', 'count')])
->from('external_applicable', 'a') ->from('external_applicable', 'a')
->rightJoin('a', 'external_applicable', 'b', $builder->expr()->eq('a.mount_id', 'b.mount_id')) ->rightJoin('a', 'external_applicable', 'b', $builder->expr()->eq('a.mount_id', 'b.mount_id'))
->where($builder->expr()->andX( // mounts for user ->where($builder->expr()->andX(
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)), $builder->expr()->eq('a.type', $builder->createNamedParameter($applicableType, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($uid)) $builder->expr()->eq('a.value', $builder->createNamedParameter($applicableId))
) )
) )
->groupBy(['a.mount_id']); ->groupBy(['a.mount_id']);
$stmt = $query->execute(); $stmt = $query->execute();
@ -131,7 +139,7 @@ class DBConfigService {
foreach ($result as $row) { foreach ($result as $row) {
if((int)$row['count'] > 1) { if((int)$row['count'] > 1) {
$this->removeApplicable($row['mount_id'], self::APPLICABLE_TYPE_USER, $uid); $this->removeApplicable($row['mount_id'], $applicableType, $applicableId);
} else { } else {
$this->removeMount($row['mount_id']); $this->removeMount($row['mount_id']);
} }