Signed-off-by: Georg Ehrke <developer@georgehrke.com>tags/v16.0.0alpha1
@@ -172,6 +172,8 @@ return array( | |||
'OCA\\DAV\\Migration\\Version1008Date20181105110300' => $baseDir . '/../lib/Migration/Version1008Date20181105110300.php', | |||
'OCA\\DAV\\Migration\\Version1008Date20181105112049' => $baseDir . '/../lib/Migration/Version1008Date20181105112049.php', | |||
'OCA\\DAV\\Migration\\Version1008Date20181114084440' => $baseDir . '/../lib/Migration/Version1008Date20181114084440.php', | |||
'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', | |||
'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => $baseDir . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', | |||
'OCA\\DAV\\RootCollection' => $baseDir . '/../lib/RootCollection.php', | |||
'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php', | |||
'OCA\\DAV\\Settings\\CalDAVSettings' => $baseDir . '/../lib/Settings/CalDAVSettings.php', |
@@ -187,6 +187,8 @@ class ComposerStaticInitDAV | |||
'OCA\\DAV\\Migration\\Version1008Date20181105110300' => __DIR__ . '/..' . '/../lib/Migration/Version1008Date20181105110300.php', | |||
'OCA\\DAV\\Migration\\Version1008Date20181105112049' => __DIR__ . '/..' . '/../lib/Migration/Version1008Date20181105112049.php', | |||
'OCA\\DAV\\Migration\\Version1008Date20181114084440' => __DIR__ . '/..' . '/../lib/Migration/Version1008Date20181114084440.php', | |||
'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningNode' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningNode.php', | |||
'OCA\\DAV\\Provisioning\\Apple\\AppleProvisioningPlugin' => __DIR__ . '/..' . '/../lib/Provisioning/Apple/AppleProvisioningPlugin.php', | |||
'OCA\\DAV\\RootCollection' => __DIR__ . '/..' . '/../lib/RootCollection.php', | |||
'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php', | |||
'OCA\\DAV\\Settings\\CalDAVSettings' => __DIR__ . '/..' . '/../lib/Settings/CalDAVSettings.php', |
@@ -0,0 +1,91 @@ | |||
<?php | |||
/** | |||
* @copyright 2018, Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @author Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OCA\DAV\Provisioning\Apple; | |||
use OCP\AppFramework\Utility\ITimeFactory; | |||
use Sabre\DAV\Exception\Forbidden; | |||
use Sabre\DAV\INode; | |||
use Sabre\DAV\IProperties; | |||
use Sabre\DAV\PropPatch; | |||
class AppleProvisioningNode implements INode, IProperties { | |||
const FILENAME = 'apple-provisioning.mobileconfig'; | |||
protected $timeFactory; | |||
/** | |||
* @param ITimeFactory $timeFactory | |||
*/ | |||
public function __construct(ITimeFactory $timeFactory) { | |||
$this->timeFactory = $timeFactory; | |||
} | |||
/** | |||
* @return string | |||
*/ | |||
public function getName() { | |||
return self::FILENAME; | |||
} | |||
public function setName($name) { | |||
throw new Forbidden('Renaming ' . self::FILENAME . ' is forbidden'); | |||
} | |||
/** | |||
* @return null | |||
*/ | |||
public function getLastModified() { | |||
return null; | |||
} | |||
/** | |||
* @throws Forbidden | |||
*/ | |||
public function delete() { | |||
throw new Forbidden(self::FILENAME . ' may not be deleted.'); | |||
} | |||
/** | |||
* @param array $properties | |||
* @return array | |||
*/ | |||
public function getProperties($properties) { | |||
$datetime = $this->timeFactory->getDateTime(); | |||
return [ | |||
'{DAV:}getcontentlength' => 42, | |||
'{DAV:}getlastmodified' => $datetime->format(\DateTime::RFC2822), | |||
]; | |||
} | |||
/** | |||
* @param PropPatch $propPatch | |||
* @throws Forbidden | |||
*/ | |||
public function propPatch(PropPatch $propPatch) { | |||
throw new Forbidden(self::FILENAME . '\'s properties may not be altered.'); | |||
} | |||
} |
@@ -0,0 +1,269 @@ | |||
<?php | |||
/** | |||
* @copyright 2018, Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @author Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OCA\DAV\Provisioning\Apple; | |||
use OCA\Theming\ThemingDefaults; | |||
use OCP\IL10N; | |||
use OCP\IRequest; | |||
use OCP\IURLGenerator; | |||
use OCP\IUserSession; | |||
use Sabre\DAV\Server; | |||
use Sabre\DAV\ServerPlugin; | |||
use Sabre\DAV\UUIDUtil; | |||
use Sabre\HTTP\RequestInterface; | |||
use Sabre\HTTP\ResponseInterface; | |||
class AppleProvisioningPlugin extends ServerPlugin { | |||
/** | |||
* @var Server | |||
*/ | |||
protected $server; | |||
/** | |||
* @var IURLGenerator | |||
*/ | |||
protected $urlGenerator; | |||
/** | |||
* @var IUserSession | |||
*/ | |||
protected $userSession; | |||
/** | |||
* @var ThemingDefaults | |||
*/ | |||
protected $themingDefaults; | |||
/** | |||
* @var IRequest | |||
*/ | |||
protected $request; | |||
/** | |||
* @var IL10N | |||
*/ | |||
protected $l10n; | |||
/** | |||
* @var \closure | |||
*/ | |||
protected $uuidClosure; | |||
/** | |||
* AppleProvisioningPlugin constructor. | |||
* | |||
* @param IUserSession $userSession | |||
* @param IURLGenerator $urlGenerator | |||
* @param ThemingDefaults $themingDefaults | |||
* @param IRequest $request | |||
* @param IL10N $l10n | |||
* @param \closure $uuidClosure | |||
*/ | |||
public function __construct(IUserSession $userSession, IURLGenerator $urlGenerator, | |||
ThemingDefaults $themingDefaults, IRequest $request, | |||
IL10N $l10n, \closure $uuidClosure) { | |||
$this->userSession = $userSession; | |||
$this->urlGenerator = $urlGenerator; | |||
$this->themingDefaults = $themingDefaults; | |||
$this->request = $request; | |||
$this->l10n = $l10n; | |||
$this->uuidClosure = $uuidClosure; | |||
} | |||
/** | |||
* @param Server $server | |||
*/ | |||
public function initialize(Server $server) { | |||
$this->server = $server; | |||
$this->server->on('method:GET', [$this, 'httpGet'], 90); | |||
} | |||
/** | |||
* @param RequestInterface $request | |||
* @param ResponseInterface $response | |||
* @return boolean | |||
*/ | |||
public function httpGet(RequestInterface $request, ResponseInterface $response):bool { | |||
if ($request->getPath() !== 'provisioning/' . AppleProvisioningNode::FILENAME) { | |||
return true; | |||
} | |||
$user = $this->userSession->getUser(); | |||
if (!$user) { | |||
return true; | |||
} | |||
$serverProtocol = $this->request->getServerProtocol(); | |||
$useSSL = ($serverProtocol === 'https'); | |||
if (!$useSSL) { | |||
$response->setStatus(200); | |||
$response->setHeader('Content-Type', 'text/plain; charset=utf-8'); | |||
$response->setBody($this->l10n->t('Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.', [$this->themingDefaults->getName()])); | |||
return false; | |||
} | |||
$absoluteURL = $request->getAbsoluteUrl(); | |||
$parsedUrl = parse_url($absoluteURL); | |||
if (isset($parsedUrl['port'])) { | |||
$serverPort = (int) $parsedUrl['port']; | |||
} else { | |||
$serverPort = 443; | |||
} | |||
$server_url = $parsedUrl['host']; | |||
$description = $this->themingDefaults->getName(); | |||
$userId = $user->getUID(); | |||
$reverseDomain = implode('.', array_reverse(explode('.', $parsedUrl['host']))); | |||
$caldavUUID = call_user_func($this->uuidClosure); | |||
$carddavUUID = call_user_func($this->uuidClosure); | |||
$profileUUID = call_user_func($this->uuidClosure); | |||
$caldavIdentifier = $reverseDomain . '.' . $caldavUUID; | |||
$carddavIdentifier = $reverseDomain . '.' . $carddavUUID; | |||
$profileIdentifier = $reverseDomain . '.' . $profileUUID; | |||
$caldavDescription = $this->l10n->t('Configures a CalDAV account'); | |||
$caldavDisplayname = $description . ' CalDAV'; | |||
$carddavDescription = $this->l10n->t('Configures a CardDAV account'); | |||
$carddavDisplayname = $description . ' CardDAV'; | |||
$filename = $userId . '-' . AppleProvisioningNode::FILENAME; | |||
$xmlSkeleton = $this->getTemplate(); | |||
$body = vsprintf($xmlSkeleton, array_map(function($v) { | |||
return \htmlspecialchars($v, ENT_XML1, 'UTF-8'); | |||
}, [ | |||
$description, | |||
$server_url, | |||
$userId, | |||
$serverPort, | |||
$caldavDescription, | |||
$caldavDisplayname, | |||
$caldavIdentifier, | |||
$caldavUUID, | |||
$description, | |||
$server_url, | |||
$userId, | |||
$serverPort, | |||
$carddavDescription, | |||
$carddavDisplayname, | |||
$carddavIdentifier, | |||
$carddavUUID, | |||
$description, | |||
$profileIdentifier, | |||
$profileUUID | |||
] | |||
)); | |||
$response->setStatus(200); | |||
$response->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"'); | |||
$response->setHeader('Content-Type', 'application/xml; charset=utf-8'); | |||
$response->setBody($body); | |||
return false; | |||
} | |||
/** | |||
* @return string | |||
*/ | |||
private function getTemplate():string { | |||
return <<<EOF | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
<plist version="1.0"> | |||
<dict> | |||
<key>PayloadContent</key> | |||
<array> | |||
<dict> | |||
<key>CalDAVAccountDescription</key> | |||
<string>%s</string> | |||
<key>CalDAVHostName</key> | |||
<string>%s</string> | |||
<key>CalDAVUsername</key> | |||
<string>%s</string> | |||
<key>CalDAVUseSSL</key> | |||
<true/> | |||
<key>CalDAVPort</key> | |||
<integer>%s</integer> | |||
<key>PayloadDescription</key> | |||
<string>%s</string> | |||
<key>PayloadDisplayName</key> | |||
<string>%s</string> | |||
<key>PayloadIdentifier</key> | |||
<string>%s</string> | |||
<key>PayloadType</key> | |||
<string>com.apple.caldav.account</string> | |||
<key>PayloadUUID</key> | |||
<string>%s</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
<dict> | |||
<key>CardDAVAccountDescription</key> | |||
<string>%s</string> | |||
<key>CardDAVHostName</key> | |||
<string>%s</string> | |||
<key>CardDAVUsername</key> | |||
<string>%s</string> | |||
<key>CardDAVUseSSL</key> | |||
<true/> | |||
<key>CardDAVPort</key> | |||
<integer>%s</integer> | |||
<key>PayloadDescription</key> | |||
<string>%s</string> | |||
<key>PayloadDisplayName</key> | |||
<string>%s</string> | |||
<key>PayloadIdentifier</key> | |||
<string>%s</string> | |||
<key>PayloadType</key> | |||
<string>com.apple.carddav.account</string> | |||
<key>PayloadUUID</key> | |||
<string>%s</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
</array> | |||
<key>PayloadDisplayName</key> | |||
<string>%s</string> | |||
<key>PayloadIdentifier</key> | |||
<string>%s</string> | |||
<key>PayloadRemovalDisallowed</key> | |||
<false/> | |||
<key>PayloadType</key> | |||
<string>Configuration</string> | |||
<key>PayloadUUID</key> | |||
<string>%s</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
</plist> | |||
EOF; | |||
} | |||
} |
@@ -35,7 +35,9 @@ use OCA\DAV\Connector\Sabre\Principal; | |||
use OCA\DAV\DAV\GroupPrincipalBackend; | |||
use OCA\DAV\DAV\SystemPrincipalBackend; | |||
use OCA\DAV\CalDAV\Principal\Collection; | |||
use OCA\DAV\Provisioning\Apple\AppleProvisioningNode; | |||
use OCA\DAV\Upload\CleanupService; | |||
use OCP\AppFramework\Utility\ITimeFactory; | |||
use Sabre\DAV\SimpleCollection; | |||
class RootCollection extends SimpleCollection { | |||
@@ -130,6 +132,9 @@ class RootCollection extends SimpleCollection { | |||
$avatarCollection = new Avatars\RootCollection($userPrincipalBackend, 'principals/users'); | |||
$avatarCollection->disableListing = $disableListing; | |||
$appleProvisioning = new AppleProvisioningNode( | |||
\OC::$server->query(ITimeFactory::class)); | |||
$children = [ | |||
new SimpleCollection('principals', [ | |||
$userPrincipals, | |||
@@ -151,7 +156,10 @@ class RootCollection extends SimpleCollection { | |||
$systemTagRelationsCollection, | |||
$commentsCollection, | |||
$uploadCollection, | |||
$avatarCollection | |||
$avatarCollection, | |||
new SimpleCollection('provisioning', [ | |||
$appleProvisioning | |||
]) | |||
]; | |||
parent::__construct('root', $children); |
@@ -55,6 +55,7 @@ use OCA\DAV\Connector\Sabre\QuotaPlugin; | |||
use OCA\DAV\Files\BrowserErrorPagePlugin; | |||
use OCA\DAV\Connector\Sabre\AnonymousOptionsPlugin; | |||
use OCA\DAV\Files\LazySearchBackend; | |||
use OCA\DAV\Provisioning\Apple\AppleProvisioningPlugin; | |||
use OCA\DAV\SystemTag\SystemTagPlugin; | |||
use OCA\DAV\Upload\ChunkingPlugin; | |||
use OCP\IRequest; | |||
@@ -62,6 +63,7 @@ use OCP\SabrePluginEvent; | |||
use Sabre\CardDAV\VCFExportPlugin; | |||
use Sabre\DAV\Auth\Plugin; | |||
use OCA\DAV\Connector\Sabre\TagsPlugin; | |||
use Sabre\DAV\UUIDUtil; | |||
use SearchDAV\DAV\SearchPlugin; | |||
use OCA\DAV\AppInfo\PluginManager; | |||
@@ -281,6 +283,16 @@ class Server { | |||
\OC::$server->getConfig(), | |||
\OC::$server->query(BirthdayService::class) | |||
)); | |||
$this->server->addPlugin(new AppleProvisioningPlugin( | |||
\OC::$server->getUserSession(), | |||
\OC::$server->getURLGenerator(), | |||
\OC::$server->getThemingDefaults(), | |||
\OC::$server->getRequest(), | |||
\OC::$server->getL10N('dav'), | |||
function() { | |||
return UUIDUtil::getUUID(); | |||
} | |||
)); | |||
} | |||
// register plugins from apps |
@@ -0,0 +1,88 @@ | |||
<?php | |||
/** | |||
* @author Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @copyright Copyright (c) 2018 Georg Ehrke <oc.list@georgehrke.com> | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This code is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License, version 3, | |||
* as published by the Free Software Foundation. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License, version 3, | |||
* along with this program. If not, see <http://www.gnu.org/licenses/> | |||
* | |||
*/ | |||
namespace OCA\DAV\Tests\unit\Provisioning\Apple; | |||
use OCA\DAV\Provisioning\Apple\AppleProvisioningNode; | |||
use OCP\AppFramework\Utility\ITimeFactory; | |||
use Sabre\DAV\PropPatch; | |||
use Test\TestCase; | |||
class AppleProvisioningNodeTest extends TestCase { | |||
/** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */ | |||
private $timeFactory; | |||
/** @var AppleProvisioningNode */ | |||
private $node; | |||
public function setUp() { | |||
parent::setUp(); | |||
$this->timeFactory = $this->createMock(ITimeFactory::class); | |||
$this->node = new AppleProvisioningNode($this->timeFactory); | |||
} | |||
public function testGetName() { | |||
$this->assertEquals('apple-provisioning.mobileconfig', $this->node->getName()); | |||
} | |||
/** | |||
* @expectedException \Sabre\DAV\Exception\Forbidden | |||
* @expectedExceptionMessage Renaming apple-provisioning.mobileconfig is forbidden | |||
*/ | |||
public function testSetName() { | |||
$this->node->setName('foo'); | |||
} | |||
public function testGetLastModified() { | |||
$this->assertEquals(null, $this->node->getLastModified()); | |||
} | |||
/** | |||
* @expectedException \Sabre\DAV\Exception\Forbidden | |||
* @expectedExceptionMessage apple-provisioning.mobileconfig may not be deleted | |||
*/ | |||
public function testDelete() { | |||
$this->node->delete(); | |||
} | |||
public function testGetProperties() { | |||
$this->timeFactory->expects($this->at(0)) | |||
->method('getDateTime') | |||
->willReturn(new \DateTime('2000-01-01')); | |||
$this->assertEquals([ | |||
'{DAV:}getcontentlength' => 42, | |||
'{DAV:}getlastmodified' => 'Sat, 01 Jan 2000 00:00:00 +0000', | |||
], $this->node->getProperties([])); | |||
} | |||
/** | |||
* @expectedException \Sabre\DAV\Exception\Forbidden | |||
* @expectedExceptionMessage apple-provisioning.mobileconfig's properties may not be altered. | |||
*/ | |||
public function testGetPropPatch() { | |||
$propPatch = $this->createMock(PropPatch::class); | |||
$this->node->propPatch($propPatch); | |||
} | |||
} |
@@ -0,0 +1,267 @@ | |||
<?php | |||
/** | |||
* @author Georg Ehrke <oc.list@georgehrke.com> | |||
* | |||
* @copyright Copyright (c) 2018 Georg Ehrke <oc.list@georgehrke.com> | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This code is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License, version 3, | |||
* as published by the Free Software Foundation. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Affero General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Affero General Public License, version 3, | |||
* along with this program. If not, see <http://www.gnu.org/licenses/> | |||
* | |||
*/ | |||
namespace OCA\DAV\Tests\unit\Provisioning\Apple; | |||
use OCA\DAV\Provisioning\Apple\AppleProvisioningPlugin; | |||
use OCA\Theming\ThemingDefaults; | |||
use OCP\IL10N; | |||
use OCP\IRequest; | |||
use OCP\IURLGenerator; | |||
use OCP\IUser; | |||
use OCP\IUserSession; | |||
use Test\TestCase; | |||
class AppleProvisioningPluginTest extends TestCase { | |||
/** @var \Sabre\DAV\Server|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $server; | |||
/** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $userSession; | |||
/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $urlGenerator; | |||
/** @var ThemingDefaults|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $themingDefaults; | |||
/** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $request; | |||
/** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $l10n; | |||
/** @var \Sabre\HTTP\RequestInterface|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $sabreRequest; | |||
/** @var \Sabre\HTTP\ResponseInterface|\PHPUnit_Framework_MockObject_MockObject */ | |||
protected $sabreResponse; | |||
/** @var AppleProvisioningPlugin */ | |||
protected $plugin; | |||
public function setUp() { | |||
parent::setUp(); | |||
$this->server = $this->createMock(\Sabre\DAV\Server::class); | |||
$this->userSession = $this->createMock(IUserSession::class); | |||
$this->urlGenerator = $this->createMock(IURLGenerator::class); | |||
$this->themingDefaults = $this->createMock(ThemingDefaults::class); | |||
$this->request = $this->createMock(IRequest::class); | |||
$this->l10n = $this->createMock(IL10N::class); | |||
$this->plugin = new AppleProvisioningPlugin($this->userSession, | |||
$this->urlGenerator, | |||
$this->themingDefaults, | |||
$this->request, | |||
$this->l10n, | |||
function() { | |||
return 'generated-uuid'; | |||
} | |||
); | |||
$this->sabreRequest = $this->createMock(\Sabre\HTTP\RequestInterface::class); | |||
$this->sabreResponse = $this->createMock(\Sabre\HTTP\ResponseInterface::class); | |||
} | |||
public function testInitialize() { | |||
$server = $this->createMock(\Sabre\DAV\Server::class); | |||
$plugin = new AppleProvisioningPlugin($this->userSession, | |||
$this->urlGenerator, $this->themingDefaults, $this->request, $this->l10n, | |||
function() {}); | |||
$server->expects($this->at(0)) | |||
->method('on') | |||
->with('method:GET', [$plugin, 'httpGet'], 90); | |||
$plugin->initialize($server); | |||
} | |||
public function testHttpGetOnHttp() { | |||
$this->sabreRequest->expects($this->at(0)) | |||
->method('getPath') | |||
->with() | |||
->willReturn('provisioning/apple-provisioning.mobileconfig'); | |||
$user = $this->createMock(IUser::class); | |||
$this->userSession->expects($this->at(0)) | |||
->method('getUser') | |||
->willReturn($user); | |||
$this->request->expects($this->at(0)) | |||
->method('getServerProtocol') | |||
->wilLReturn('http'); | |||
$this->themingDefaults->expects($this->at(0)) | |||
->method('getName') | |||
->willReturn('InstanceName'); | |||
$this->l10n->expects($this->at(0)) | |||
->method('t') | |||
->with('Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS.', ['InstanceName']) | |||
->willReturn('LocalizedErrorMessage'); | |||
$this->sabreResponse->expects($this->at(0)) | |||
->method('setStatus') | |||
->with(200); | |||
$this->sabreResponse->expects($this->at(1)) | |||
->method('setHeader') | |||
->with('Content-Type', 'text/plain; charset=utf-8'); | |||
$this->sabreResponse->expects($this->at(2)) | |||
->method('setBody') | |||
->with('LocalizedErrorMessage'); | |||
$returnValue = $this->plugin->httpGet($this->sabreRequest, $this->sabreResponse); | |||
$this->assertFalse($returnValue); | |||
} | |||
public function testHttpGetOnHttps() { | |||
$this->sabreRequest->expects($this->at(0)) | |||
->method('getPath') | |||
->with() | |||
->willReturn('provisioning/apple-provisioning.mobileconfig'); | |||
$user = $this->createMock(IUser::class); | |||
$user->expects($this->at(0)) | |||
->method('getUID') | |||
->willReturn('userName'); | |||
$this->userSession->expects($this->at(0)) | |||
->method('getUser') | |||
->willReturn($user); | |||
$this->request->expects($this->at(0)) | |||
->method('getServerProtocol') | |||
->wilLReturn('https'); | |||
$this->sabreRequest->expects($this->at(1)) | |||
->method('getAbsoluteUrl') | |||
->with() | |||
->willReturn('https://nextcloud.tld/nextcloud/remote.php/dav/provisioning/apple-provisioning.mobileconfig'); | |||
$this->themingDefaults->expects($this->at(0)) | |||
->method('getName') | |||
->willReturn('InstanceName'); | |||
$this->l10n->expects($this->at(0)) | |||
->method('t') | |||
->with('Configures a CalDAV account') | |||
->willReturn('LocalizedConfiguresCalDAV'); | |||
$this->l10n->expects($this->at(1)) | |||
->method('t') | |||
->with('Configures a CardDAV account') | |||
->willReturn('LocalizedConfiguresCardDAV'); | |||
$this->sabreResponse->expects($this->at(0)) | |||
->method('setStatus') | |||
->with(200); | |||
$this->sabreResponse->expects($this->at(1)) | |||
->method('setHeader') | |||
->with('Content-Disposition', 'attachment; filename="userName-apple-provisioning.mobileconfig"'); | |||
$this->sabreResponse->expects($this->at(2)) | |||
->method('setHeader') | |||
->with('Content-Type', 'application/xml; charset=utf-8'); | |||
$this->sabreResponse->expects($this->at(3)) | |||
->method('setBody') | |||
->with(<<<EOF | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||
<plist version="1.0"> | |||
<dict> | |||
<key>PayloadContent</key> | |||
<array> | |||
<dict> | |||
<key>CalDAVAccountDescription</key> | |||
<string>InstanceName</string> | |||
<key>CalDAVHostName</key> | |||
<string>nextcloud.tld</string> | |||
<key>CalDAVUsername</key> | |||
<string>userName</string> | |||
<key>CalDAVUseSSL</key> | |||
<true/> | |||
<key>CalDAVPort</key> | |||
<integer>443</integer> | |||
<key>PayloadDescription</key> | |||
<string>LocalizedConfiguresCalDAV</string> | |||
<key>PayloadDisplayName</key> | |||
<string>InstanceName CalDAV</string> | |||
<key>PayloadIdentifier</key> | |||
<string>tld.nextcloud.generated-uuid</string> | |||
<key>PayloadType</key> | |||
<string>com.apple.caldav.account</string> | |||
<key>PayloadUUID</key> | |||
<string>generated-uuid</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
<dict> | |||
<key>CardDAVAccountDescription</key> | |||
<string>InstanceName</string> | |||
<key>CardDAVHostName</key> | |||
<string>nextcloud.tld</string> | |||
<key>CardDAVUsername</key> | |||
<string>userName</string> | |||
<key>CardDAVUseSSL</key> | |||
<true/> | |||
<key>CardDAVPort</key> | |||
<integer>443</integer> | |||
<key>PayloadDescription</key> | |||
<string>LocalizedConfiguresCardDAV</string> | |||
<key>PayloadDisplayName</key> | |||
<string>InstanceName CardDAV</string> | |||
<key>PayloadIdentifier</key> | |||
<string>tld.nextcloud.generated-uuid</string> | |||
<key>PayloadType</key> | |||
<string>com.apple.carddav.account</string> | |||
<key>PayloadUUID</key> | |||
<string>generated-uuid</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
</array> | |||
<key>PayloadDisplayName</key> | |||
<string>InstanceName</string> | |||
<key>PayloadIdentifier</key> | |||
<string>tld.nextcloud.generated-uuid</string> | |||
<key>PayloadRemovalDisallowed</key> | |||
<false/> | |||
<key>PayloadType</key> | |||
<string>Configuration</string> | |||
<key>PayloadUUID</key> | |||
<string>generated-uuid</string> | |||
<key>PayloadVersion</key> | |||
<integer>1</integer> | |||
</dict> | |||
</plist> | |||
EOF | |||
); | |||
$returnValue = $this->plugin->httpGet($this->sabreRequest, $this->sabreResponse); | |||
$this->assertFalse($returnValue); | |||
} | |||
} |