mirror of
https://github.com/nextcloud/server.git
synced 2026-04-15 22:11:17 -04:00
Update attendence for external users
For local users it's possible to select their calendar via the principal url and first update their own attendance status. External users have no calendar event hence the recipient is the organizer. Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
This commit is contained in:
parent
35be21dbb7
commit
fab887cb7c
3 changed files with 85 additions and 25 deletions
|
|
@ -121,4 +121,10 @@ class InvitationResponseServer {
|
|||
$schedulingPlugin = $this->server->getPlugin('caldav-schedule');
|
||||
$schedulingPlugin->scheduleLocalDelivery($iTipMessage);
|
||||
}
|
||||
|
||||
public function isExternalAttendee(string $principalUri): bool {
|
||||
/** @var \Sabre\DAVACL\Plugin $aclPlugin */
|
||||
$aclPlugin = $this->server->getPlugin('acl');
|
||||
return $aclPlugin->getPrincipalByUri($principalUri) === null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -198,7 +198,12 @@ class InvitationResponseController extends Controller {
|
|||
$iTipMessage->method = 'REPLY';
|
||||
$iTipMessage->sequence = $row['sequence'];
|
||||
$iTipMessage->sender = $row['attendee'];
|
||||
$iTipMessage->recipient = $row['attendee'];
|
||||
|
||||
if ($this->responseServer->isExternalAttendee($row['attendee'])) {
|
||||
$iTipMessage->recipient = $row['organizer'];
|
||||
} else {
|
||||
$iTipMessage->recipient = $row['attendee'];
|
||||
}
|
||||
|
||||
$message = <<<EOF
|
||||
BEGIN:VCALENDAR
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ declare(strict_types=1);
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Tests\Unit\DAV\Controller;
|
||||
|
||||
use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer;
|
||||
|
|
@ -77,7 +78,17 @@ class InvitationResponseControllerTest extends TestCase {
|
|||
);
|
||||
}
|
||||
|
||||
public function testAccept() {
|
||||
public function attendeeProvider(): array {
|
||||
return [
|
||||
'local attendee' => [false],
|
||||
'external attendee' => [true]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider attendeeProvider
|
||||
*/
|
||||
public function testAccept(bool $isExternalAttendee): void {
|
||||
$this->buildQueryExpects('TOKEN123', [
|
||||
'id' => 0,
|
||||
'uid' => 'this-is-the-events-uid',
|
||||
|
|
@ -110,21 +121,26 @@ EOF;
|
|||
$called = false;
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('handleITipMessage')
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $expected) {
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $isExternalAttendee, $expected) {
|
||||
$called = true;
|
||||
$this->assertEquals('this-is-the-events-uid', $iTipMessage->uid);
|
||||
$this->assertEquals('VEVENT', $iTipMessage->component);
|
||||
$this->assertEquals('REPLY', $iTipMessage->method);
|
||||
$this->assertEquals(null, $iTipMessage->sequence);
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->sender);
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
if ($isExternalAttendee) {
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
} else {
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->recipient);
|
||||
}
|
||||
|
||||
$iTipMessage->scheduleStatus = '1.2;Message delivered locally';
|
||||
|
||||
$this->assertEquals($expected, $iTipMessage->message->serialize());
|
||||
});
|
||||
|
||||
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('isExternalAttendee')
|
||||
->willReturn($isExternalAttendee);
|
||||
|
||||
$response = $this->controller->accept('TOKEN123');
|
||||
$this->assertInstanceOf(TemplateResponse::class, $response);
|
||||
|
|
@ -133,7 +149,10 @@ EOF;
|
|||
$this->assertTrue($called);
|
||||
}
|
||||
|
||||
public function testAcceptSequence() {
|
||||
/**
|
||||
* @dataProvider attendeeProvider
|
||||
*/
|
||||
public function testAcceptSequence(bool $isExternalAttendee): void {
|
||||
$this->buildQueryExpects('TOKEN123', [
|
||||
'id' => 0,
|
||||
'uid' => 'this-is-the-events-uid',
|
||||
|
|
@ -166,21 +185,26 @@ EOF;
|
|||
$called = false;
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('handleITipMessage')
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $expected) {
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $isExternalAttendee, $expected) {
|
||||
$called = true;
|
||||
$this->assertEquals('this-is-the-events-uid', $iTipMessage->uid);
|
||||
$this->assertEquals('VEVENT', $iTipMessage->component);
|
||||
$this->assertEquals('REPLY', $iTipMessage->method);
|
||||
$this->assertEquals(1337, $iTipMessage->sequence);
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->sender);
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
if ($isExternalAttendee) {
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
} else {
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->recipient);
|
||||
}
|
||||
|
||||
$iTipMessage->scheduleStatus = '1.2;Message delivered locally';
|
||||
|
||||
$this->assertEquals($expected, $iTipMessage->message->serialize());
|
||||
});
|
||||
|
||||
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('isExternalAttendee')
|
||||
->willReturn($isExternalAttendee);
|
||||
|
||||
$response = $this->controller->accept('TOKEN123');
|
||||
$this->assertInstanceOf(TemplateResponse::class, $response);
|
||||
|
|
@ -189,7 +213,10 @@ EOF;
|
|||
$this->assertTrue($called);
|
||||
}
|
||||
|
||||
public function testAcceptRecurrenceId() {
|
||||
/**
|
||||
* @dataProvider attendeeProvider
|
||||
*/
|
||||
public function testAcceptRecurrenceId(bool $isExternalAttendee): void {
|
||||
$this->buildQueryExpects('TOKEN123', [
|
||||
'id' => 0,
|
||||
'uid' => 'this-is-the-events-uid',
|
||||
|
|
@ -223,21 +250,26 @@ EOF;
|
|||
$called = false;
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('handleITipMessage')
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $expected) {
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $isExternalAttendee, $expected) {
|
||||
$called = true;
|
||||
$this->assertEquals('this-is-the-events-uid', $iTipMessage->uid);
|
||||
$this->assertEquals('VEVENT', $iTipMessage->component);
|
||||
$this->assertEquals('REPLY', $iTipMessage->method);
|
||||
$this->assertEquals(0, $iTipMessage->sequence);
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->sender);
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
if ($isExternalAttendee) {
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
} else {
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->recipient);
|
||||
}
|
||||
|
||||
$iTipMessage->scheduleStatus = '1.2;Message delivered locally';
|
||||
|
||||
$this->assertEquals($expected, $iTipMessage->message->serialize());
|
||||
});
|
||||
|
||||
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('isExternalAttendee')
|
||||
->willReturn($isExternalAttendee);
|
||||
|
||||
$response = $this->controller->accept('TOKEN123');
|
||||
$this->assertInstanceOf(TemplateResponse::class, $response);
|
||||
|
|
@ -273,7 +305,10 @@ EOF;
|
|||
$this->assertEquals([], $response->getParams());
|
||||
}
|
||||
|
||||
public function testDecline() {
|
||||
/**
|
||||
* @dataProvider attendeeProvider
|
||||
*/
|
||||
public function testDecline(bool $isExternalAttendee): void {
|
||||
$this->buildQueryExpects('TOKEN123', [
|
||||
'id' => 0,
|
||||
'uid' => 'this-is-the-events-uid',
|
||||
|
|
@ -306,21 +341,26 @@ EOF;
|
|||
$called = false;
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('handleITipMessage')
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $expected) {
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $isExternalAttendee, $expected) {
|
||||
$called = true;
|
||||
$this->assertEquals('this-is-the-events-uid', $iTipMessage->uid);
|
||||
$this->assertEquals('VEVENT', $iTipMessage->component);
|
||||
$this->assertEquals('REPLY', $iTipMessage->method);
|
||||
$this->assertEquals(null, $iTipMessage->sequence);
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->sender);
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
if ($isExternalAttendee) {
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
} else {
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->recipient);
|
||||
}
|
||||
|
||||
$iTipMessage->scheduleStatus = '1.2;Message delivered locally';
|
||||
|
||||
$this->assertEquals($expected, $iTipMessage->message->serialize());
|
||||
});
|
||||
|
||||
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('isExternalAttendee')
|
||||
->willReturn($isExternalAttendee);
|
||||
|
||||
$response = $this->controller->decline('TOKEN123');
|
||||
$this->assertInstanceOf(TemplateResponse::class, $response);
|
||||
|
|
@ -336,7 +376,10 @@ EOF;
|
|||
$this->assertEquals(['token' => 'TOKEN123'], $response->getParams());
|
||||
}
|
||||
|
||||
public function testProcessMoreOptionsResult() {
|
||||
/**
|
||||
* @dataProvider attendeeProvider
|
||||
*/
|
||||
public function testProcessMoreOptionsResult(bool $isExternalAttendee): void {
|
||||
$this->request->expects($this->at(0))
|
||||
->method('getParam')
|
||||
->with('partStat')
|
||||
|
|
@ -384,20 +427,26 @@ EOF;
|
|||
$called = false;
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('handleITipMessage')
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $expected) {
|
||||
->willReturnCallback(function (Message $iTipMessage) use (&$called, $isExternalAttendee, $expected) {
|
||||
$called = true;
|
||||
$this->assertEquals('this-is-the-events-uid', $iTipMessage->uid);
|
||||
$this->assertEquals('VEVENT', $iTipMessage->component);
|
||||
$this->assertEquals('REPLY', $iTipMessage->method);
|
||||
$this->assertEquals(null, $iTipMessage->sequence);
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->sender);
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
if ($isExternalAttendee) {
|
||||
$this->assertEquals('mailto:organizer@foo.bar', $iTipMessage->recipient);
|
||||
} else {
|
||||
$this->assertEquals('mailto:attendee@foo.bar', $iTipMessage->recipient);
|
||||
}
|
||||
|
||||
$iTipMessage->scheduleStatus = '1.2;Message delivered locally';
|
||||
|
||||
$this->assertEquals($expected, $iTipMessage->message->serialize());
|
||||
});
|
||||
|
||||
$this->responseServer->expects($this->once())
|
||||
->method('isExternalAttendee')
|
||||
->willReturn($isExternalAttendee);
|
||||
|
||||
|
||||
$response = $this->controller->processMoreOptionsResult('TOKEN123');
|
||||
|
|
|
|||
Loading…
Reference in a new issue