Merge pull request #1545 from nextcloud/delete-calendars-with-their-users
Delete calendars with their users
This commit is contained in:
commit
ef0760f84f
|
@ -300,6 +300,48 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||||
return array_values($calendars);
|
return array_values($calendars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getUsersOwnCalendars($principalUri) {
|
||||||
|
$principalUri = $this->convertPrincipal($principalUri, true);
|
||||||
|
$fields = array_values($this->propertyMap);
|
||||||
|
$fields[] = 'id';
|
||||||
|
$fields[] = 'uri';
|
||||||
|
$fields[] = 'synctoken';
|
||||||
|
$fields[] = 'components';
|
||||||
|
$fields[] = 'principaluri';
|
||||||
|
$fields[] = 'transparent';
|
||||||
|
// Making fields a comma-delimited list
|
||||||
|
$query = $this->db->getQueryBuilder();
|
||||||
|
$query->select($fields)->from('calendars')
|
||||||
|
->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)))
|
||||||
|
->orderBy('calendarorder', 'ASC');
|
||||||
|
$stmt = $query->execute();
|
||||||
|
$calendars = [];
|
||||||
|
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
|
||||||
|
$components = [];
|
||||||
|
if ($row['components']) {
|
||||||
|
$components = explode(',',$row['components']);
|
||||||
|
}
|
||||||
|
$calendar = [
|
||||||
|
'id' => $row['id'],
|
||||||
|
'uri' => $row['uri'],
|
||||||
|
'principaluri' => $this->convertPrincipal($row['principaluri'], false),
|
||||||
|
'{' . Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($row['synctoken']?$row['synctoken']:'0'),
|
||||||
|
'{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
|
||||||
|
'{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components),
|
||||||
|
'{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
|
||||||
|
];
|
||||||
|
foreach($this->propertyMap as $xmlName=>$dbName) {
|
||||||
|
$calendar[$xmlName] = $row[$dbName];
|
||||||
|
}
|
||||||
|
if (!isset($calendars[$calendar['id']])) {
|
||||||
|
$calendars[$calendar['id']] = $calendar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$stmt->closeCursor();
|
||||||
|
return array_values($calendars);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private function getUserDisplayName($uid) {
|
private function getUserDisplayName($uid) {
|
||||||
if (!isset($this->userDisplayNames[$uid])) {
|
if (!isset($this->userDisplayNames[$uid])) {
|
||||||
$user = $this->userManager->get($uid);
|
$user = $this->userManager->get($uid);
|
||||||
|
@ -639,6 +681,16 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||||
$this->sharingBackend->deleteAllShares($calendarId);
|
$this->sharingBackend->deleteAllShares($calendarId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all of an user's shares
|
||||||
|
*
|
||||||
|
* @param string $principaluri
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function deleteAllSharesByUser($principaluri) {
|
||||||
|
$this->sharingBackend->deleteAllSharesByUser($principaluri);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all calendar objects within a calendar.
|
* Returns all calendar objects within a calendar.
|
||||||
*
|
*
|
||||||
|
|
|
@ -110,6 +110,14 @@ class Backend {
|
||||||
->execute();
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function deleteAllSharesByUser($principaluri) {
|
||||||
|
$query = $this->db->getQueryBuilder();
|
||||||
|
$query->delete('dav_shares')
|
||||||
|
->where($query->expr()->eq('principaluri', $query->createNamedParameter($principaluri)))
|
||||||
|
->andWhere($query->expr()->eq('type', $query->createNamedParameter($this->resourceType)))
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param IShareable $shareable
|
* @param IShareable $shareable
|
||||||
* @param string $element
|
* @param string $element
|
||||||
|
|
|
@ -46,6 +46,12 @@ class HookManager {
|
||||||
/** @var CardDavBackend */
|
/** @var CardDavBackend */
|
||||||
private $cardDav;
|
private $cardDav;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $calendarsToDelete;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $addressBooksToDelete;
|
||||||
|
|
||||||
public function __construct(IUserManager $userManager,
|
public function __construct(IUserManager $userManager,
|
||||||
SyncService $syncService,
|
SyncService $syncService,
|
||||||
CalDavBackend $calDav,
|
CalDavBackend $calDav,
|
||||||
|
@ -85,7 +91,10 @@ class HookManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function preDeleteUser($params) {
|
public function preDeleteUser($params) {
|
||||||
$this->usersToDelete[$params['uid']] = $this->userManager->get($params['uid']);
|
$uid = $params['uid'];
|
||||||
|
$this->usersToDelete[$uid] = $this->userManager->get($uid);
|
||||||
|
$this->calendarsToDelete = $this->calDav->getUsersOwnCalendars('principals/users/' . $uid);
|
||||||
|
$this->addressBooksToDelete = $this->cardDav->getAddressBooksForUser('principals/users/' . $uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function postDeleteUser($params) {
|
public function postDeleteUser($params) {
|
||||||
|
@ -93,6 +102,15 @@ class HookManager {
|
||||||
if (isset($this->usersToDelete[$uid])){
|
if (isset($this->usersToDelete[$uid])){
|
||||||
$this->syncService->deleteUser($this->usersToDelete[$uid]);
|
$this->syncService->deleteUser($this->usersToDelete[$uid]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($this->calendarsToDelete as $calendar) {
|
||||||
|
$this->calDav->deleteCalendar($calendar['id']);
|
||||||
|
}
|
||||||
|
$this->calDav->deleteAllSharesByUser('principals/users/' . $uid);
|
||||||
|
|
||||||
|
foreach ($this->addressBooksToDelete as $addressBook) {
|
||||||
|
$this->cardDav->deleteAddressBook($addressBook['id']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function changeUser($params) {
|
public function changeUser($params) {
|
||||||
|
|
|
@ -28,29 +28,45 @@ use OCA\DAV\CalDAV\CalDavBackend;
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
use OCA\DAV\CardDAV\CardDavBackend;
|
||||||
use OCA\DAV\CardDAV\SyncService;
|
use OCA\DAV\CardDAV\SyncService;
|
||||||
use OCA\DAV\HookManager;
|
use OCA\DAV\HookManager;
|
||||||
|
use OCP\IL10N;
|
||||||
|
use OCP\IUser;
|
||||||
use OCP\IUserManager;
|
use OCP\IUserManager;
|
||||||
use Test\TestCase;
|
use Test\TestCase;
|
||||||
|
|
||||||
class HookManagerTest extends TestCase {
|
class HookManagerTest extends TestCase {
|
||||||
|
/** @var IL10N */
|
||||||
|
private $l10n;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->l10n = $this->createMock(IL10N::class);
|
||||||
|
$this->l10n
|
||||||
|
->expects($this->any())
|
||||||
|
->method('t')
|
||||||
|
->will($this->returnCallback(function ($text, $parameters = []) {
|
||||||
|
return vsprintf($text, $parameters);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
public function test() {
|
public function test() {
|
||||||
$user = $this->getMockBuilder('\OCP\IUser')
|
$user = $this->getMockBuilder(IUser::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
||||||
|
|
||||||
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
||||||
$userManager = $this->getMockBuilder('\OCP\IUserManager')
|
$userManager = $this->getMockBuilder(IUserManager::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$userManager->expects($this->once())->method('get')->willReturn($user);
|
$userManager->expects($this->once())->method('get')->willReturn($user);
|
||||||
|
|
||||||
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
||||||
$syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
|
$syncService = $this->getMockBuilder(SyncService::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
||||||
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
|
$cal = $this->getMockBuilder(CalDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(0);
|
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(0);
|
||||||
|
@ -59,7 +75,7 @@ class HookManagerTest extends TestCase {
|
||||||
'personal', ['{DAV:}displayname' => 'Personal']);
|
'personal', ['{DAV:}displayname' => 'Personal']);
|
||||||
|
|
||||||
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
||||||
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
|
$card = $this->getMockBuilder(CardDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(0);
|
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(0);
|
||||||
|
@ -72,31 +88,31 @@ class HookManagerTest extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testWithExisting() {
|
public function testWithExisting() {
|
||||||
$user = $this->getMockBuilder('\OCP\IUser')
|
$user = $this->getMockBuilder(IUser::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
||||||
|
|
||||||
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
||||||
$userManager = $this->getMockBuilder('\OCP\IUserManager')
|
$userManager = $this->getMockBuilder(IUserManager::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$userManager->expects($this->once())->method('get')->willReturn($user);
|
$userManager->expects($this->once())->method('get')->willReturn($user);
|
||||||
|
|
||||||
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
||||||
$syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
|
$syncService = $this->getMockBuilder(SyncService::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
||||||
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
|
$cal = $this->getMockBuilder(CalDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(1);
|
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(1);
|
||||||
$cal->expects($this->never())->method('createCalendar');
|
$cal->expects($this->never())->method('createCalendar');
|
||||||
|
|
||||||
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
||||||
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
|
$card = $this->getMockBuilder(CardDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(1);
|
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(1);
|
||||||
|
@ -107,24 +123,24 @@ class HookManagerTest extends TestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testWithBirthdayCalendar() {
|
public function testWithBirthdayCalendar() {
|
||||||
$user = $this->getMockBuilder('\OCP\IUser')
|
$user = $this->getMockBuilder(IUser::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
$user->expects($this->once())->method('getUID')->willReturn('newUser');
|
||||||
|
|
||||||
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
||||||
$userManager = $this->getMockBuilder('\OCP\IUserManager')
|
$userManager = $this->getMockBuilder(IUserManager::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$userManager->expects($this->once())->method('get')->willReturn($user);
|
$userManager->expects($this->once())->method('get')->willReturn($user);
|
||||||
|
|
||||||
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
||||||
$syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
|
$syncService = $this->getMockBuilder(SyncService::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
|
|
||||||
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
||||||
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
|
$cal = $this->getMockBuilder(CalDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(0);
|
$cal->expects($this->once())->method('getCalendarsForUserCount')->willReturn(0);
|
||||||
|
@ -133,7 +149,7 @@ class HookManagerTest extends TestCase {
|
||||||
'personal', ['{DAV:}displayname' => 'Personal']);
|
'personal', ['{DAV:}displayname' => 'Personal']);
|
||||||
|
|
||||||
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
||||||
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
|
$card = $this->getMockBuilder(CardDavBackend::class)
|
||||||
->disableOriginalConstructor()
|
->disableOriginalConstructor()
|
||||||
->getMock();
|
->getMock();
|
||||||
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(0);
|
$card->expects($this->once())->method('getAddressBooksForUserCount')->willReturn(0);
|
||||||
|
@ -144,4 +160,46 @@ class HookManagerTest extends TestCase {
|
||||||
$hm = new HookManager($userManager, $syncService, $cal, $card);
|
$hm = new HookManager($userManager, $syncService, $cal, $card);
|
||||||
$hm->postLogin(['uid' => 'newUser']);
|
$hm->postLogin(['uid' => 'newUser']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testDeleteCalendar() {
|
||||||
|
$user = $this->getMockBuilder(IUser::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
|
||||||
|
$userManager = $this->getMockBuilder(IUserManager::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
$userManager->expects($this->once())->method('get')->willReturn($user);
|
||||||
|
|
||||||
|
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
|
||||||
|
$syncService = $this->getMockBuilder(SyncService::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
$syncService->expects($this->once())
|
||||||
|
->method('deleteUser');
|
||||||
|
|
||||||
|
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
|
||||||
|
$cal = $this->getMockBuilder(CalDavBackend::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
$cal->expects($this->once())->method('getUsersOwnCalendars')->willReturn([
|
||||||
|
['id' => 'personal']
|
||||||
|
]);
|
||||||
|
$cal->expects($this->once())->method('deleteCalendar');
|
||||||
|
$cal->expects($this->once())->method('deleteAllSharesByUser');
|
||||||
|
|
||||||
|
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
|
||||||
|
$card = $this->getMockBuilder(CardDavBackend::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
$card->expects($this->once())->method('getAddressBooksForUser')->willReturn([
|
||||||
|
['id' => 'personal']
|
||||||
|
]);
|
||||||
|
$card->expects($this->once())->method('deleteAddressBook');
|
||||||
|
|
||||||
|
$hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n);
|
||||||
|
$hm->preDeleteUser(['uid' => 'newUser']);
|
||||||
|
$hm->postDeleteUser(['uid' => 'newUser']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue