Delete SAML groups without members

Signed-off-by: Jonathan Treffler <mail@jonathan-treffler.de>
Signed-off-by: Giuliano Mele <giuliano.mele@verdigado.com>
This commit is contained in:
Giuliano Mele 2021-07-31 18:34:34 +02:00 committed by Jonathan Treffler
parent 49bc11c4e2
commit ae7528fa55
2 changed files with 48 additions and 1 deletions

View file

@ -7,11 +7,13 @@ use Doctrine\DBAL\FetchMode;
use OCA\User_SAML\Exceptions\AddUserToGroupException;
use OCP\Group\Backend\ABackend;
use OCP\Group\Backend\IAddToGroupBackend;
use OCP\Group\Backend\ICountUsersBackend;
use OCP\Group\Backend\ICreateGroupBackend;
use OCP\Group\Backend\IDeleteGroupBackend;
use OCP\Group\Backend\IRemoveFromGroupBackend;
use OCP\IDBConnection;
class GroupBackend extends ABackend implements IAddToGroupBackend, IRemoveFromGroupBackend {
class GroupBackend extends ABackend implements IAddToGroupBackend, IRemoveFromGroupBackend, ICountUsersBackend, IDeleteGroupBackend {
/** @var IDBConnection */
private $dbc;
@ -202,4 +204,46 @@ class GroupBackend extends ABackend implements IAddToGroupBackend, IRemoveFromGr
return true;
}
public function countUsersInGroup(string $gid, string $search = ''): int {
$query = $this->dbc->getQueryBuilder();
$query->select($query->func()->count('*', 'num_users'))
->from(self::TABLE_MEMBERS)
->where($query->expr()->eq('gid', $query->createNamedParameter($gid)));
if ($search !== '') {
$query->andWhere($query->expr()->like('uid', $query->createNamedParameter(
'%' . $this->dbConn->escapeLikeParameter($search) . '%'
)));
}
$result = $query->executeQuery();
$count = $result->fetchOne();
$result->closeCursor();
if ($count !== false) {
$count = (int)$count;
} else {
$count = 0;
}
return $count;
}
public function deleteGroup(string $gid): bool {
$query = $this->dbc->getQueryBuilder();
// delete the group
$query->delete(self::TABLE_GROUPS)
->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
->executeStatement();
// delete group user relation
$query->delete(self::TABLE_MEMBERS)
->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
->executeStatement();
// remove from cache
unset($this->groupCache[$gid]);
return true;
}
}

View file

@ -119,6 +119,9 @@ class GroupManager
return;
}
$group->removeUser($user);
if ($this->ownGroupBackend->countUsersInGroup($gid) === 0) {
$group->delete();
}
}
public function addGroups(IUser $user, $groupIds) {