Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions apps/dav/lib/CalDAV/CalDavBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,55 @@ function getCalendarsForUser($principalUri) {
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);
}

/**
* @return array
*/
Expand Down Expand Up @@ -587,6 +636,16 @@ function deleteCalendar($calendarId) {
$this->sharingBackend->deleteAllShares($calendarId);
}

/**
* Delete all of an user's shares
*
* @param string $principaluri
* @return void
*/
function deleteAllSharesForUser($principaluri) {
$this->sharingBackend->deleteAllSharesByUser($principaluri);
}

/**
* Returns all calendar objects within a calendar.
*
Expand Down
8 changes: 8 additions & 0 deletions apps/dav/lib/DAV/Sharing/Backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,14 @@ public function deleteAllShares($resourceId) {
->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 string $element
Expand Down
20 changes: 19 additions & 1 deletion apps/dav/lib/HookManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ class HookManager {
/** @var L10N */
private $l10n;

/** @var array */
private $calendarsToDelete;

/** @var array */
private $addressBooksToDelete;

public function __construct(IUserManager $userManager,
SyncService $syncService,
CalDavBackend $calDav,
Expand Down Expand Up @@ -90,14 +96,26 @@ public function postCreateUser($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) {
$uid = $params['uid'];
if (isset($this->usersToDelete[$uid])){
$this->syncService->deleteUser($this->usersToDelete[$uid]);
}

foreach ($this->calendarsToDelete as $calendar) {
$this->calDav->deleteCalendar($calendar['id']);
}
$this->calDav->deleteAllSharesForUser('principals/users/' . $uid);

foreach ($this->addressBooksToDelete as $addressBook) {
$this->cardDav->deleteAddressBook($addressBook['id']);
}
}

public function changeUser($params) {
Expand Down
73 changes: 58 additions & 15 deletions apps/dav/tests/unit/DAV/HookManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\HookManager;
use OCP\IUser;
use OCP\IUserManager;
use Test\TestCase;

Expand All @@ -50,24 +51,24 @@ public function setUp() {
}

public function test() {
$user = $this->getMockBuilder('\OCP\IUser')
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$user->expects($this->once())->method('getUID')->willReturn('newUser');

/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
$userManager = $this->getMockBuilder('\OCP\IUserManager')
$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('OCA\DAV\CardDAV\SyncService')
$syncService = $this->getMockBuilder(SyncService::class)
->disableOriginalConstructor()
->getMock();

/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
$cal = $this->getMockBuilder(CalDavBackend::class)
->disableOriginalConstructor()
->getMock();
$cal->expects($this->once())->method('getCalendarsForUser')->willReturn([]);
Expand All @@ -80,7 +81,7 @@ public function test() {
]);

/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
$card = $this->getMockBuilder(CardDavBackend::class)
->disableOriginalConstructor()
->getMock();
$card->expects($this->once())->method('getAddressBooksForUser')->willReturn([]);
Expand All @@ -93,24 +94,24 @@ public function test() {
}

public function testWithExisting() {
$user = $this->getMockBuilder('\OCP\IUser')
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$user->expects($this->once())->method('getUID')->willReturn('newUser');

/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
$userManager = $this->getMockBuilder('\OCP\IUserManager')
$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('OCA\DAV\CardDAV\SyncService')
$syncService = $this->getMockBuilder(SyncService::class)
->disableOriginalConstructor()
->getMock();

/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
$cal = $this->getMockBuilder(CalDavBackend::class)
->disableOriginalConstructor()
->getMock();
$cal->expects($this->once())->method('getCalendarsForUser')->willReturn([
Expand All @@ -119,7 +120,7 @@ public function testWithExisting() {
$cal->expects($this->never())->method('createCalendar');

/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
$card = $this->getMockBuilder(CardDavBackend::class)
->disableOriginalConstructor()
->getMock();
$card->expects($this->once())->method('getAddressBooksForUser')->willReturn([
Expand All @@ -132,24 +133,24 @@ public function testWithExisting() {
}

public function testWithBirthdayCalendar() {
$user = $this->getMockBuilder('\OCP\IUser')
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
$user->expects($this->once())->method('getUID')->willReturn('newUser');

/** @var IUserManager | \PHPUnit_Framework_MockObject_MockObject $userManager */
$userManager = $this->getMockBuilder('\OCP\IUserManager')
$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('OCA\DAV\CardDAV\SyncService')
$syncService = $this->getMockBuilder(SyncService::class)
->disableOriginalConstructor()
->getMock();

/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cal */
$cal = $this->getMockBuilder('OCA\DAV\CalDAV\CalDavBackend')
$cal = $this->getMockBuilder(CalDavBackend::class)
->disableOriginalConstructor()
->getMock();
$cal->expects($this->once())->method('getCalendarsForUser')->willReturn([
Expand All @@ -164,7 +165,7 @@ public function testWithBirthdayCalendar() {
]);

/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $card */
$card = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')
$card = $this->getMockBuilder(CardDavBackend::class)
->disableOriginalConstructor()
->getMock();
$card->expects($this->once())->method('getAddressBooksForUser')->willReturn([]);
Expand All @@ -175,4 +176,46 @@ public function testWithBirthdayCalendar() {
$hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n);
$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('deleteAllSharesForUser');

/** @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']);
}
}