Browse Source
Merge pull request #10068 from nextcloud/feature/1434/provisioning_profiles_for_dav
Merge pull request #10068 from nextcloud/feature/1434/provisioning_profiles_for_dav
Add Apple Provisioning profilepull/13633/head
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 738 additions and 1 deletions
-
2apps/dav/composer/composer/autoload_classmap.php
-
2apps/dav/composer/composer/autoload_static.php
-
91apps/dav/lib/Provisioning/Apple/AppleProvisioningNode.php
-
267apps/dav/lib/Provisioning/Apple/AppleProvisioningPlugin.php
-
10apps/dav/lib/RootCollection.php
-
12apps/dav/lib/Server.php
-
88apps/dav/tests/unit/Provisioning/Apple/AppleProvisioningNodeTest.php
-
267apps/dav/tests/unit/Provisioning/Apple/AppleProvisioningPluginTest.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,267 @@ |
|||
<?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\IL10N; |
|||
use OCP\IRequest; |
|||
use OCP\IURLGenerator; |
|||
use OCP\IUserSession; |
|||
use Sabre\DAV\Server; |
|||
use Sabre\DAV\ServerPlugin; |
|||
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 \OC_Defaults |
|||
*/ |
|||
protected $themingDefaults; |
|||
|
|||
/** |
|||
* @var IRequest |
|||
*/ |
|||
protected $request; |
|||
|
|||
/** |
|||
* @var IL10N |
|||
*/ |
|||
protected $l10n; |
|||
|
|||
/** |
|||
* @var \closure |
|||
*/ |
|||
protected $uuidClosure; |
|||
|
|||
/** |
|||
* AppleProvisioningPlugin constructor. |
|||
* |
|||
* @param IUserSession $userSession |
|||
* @param IURLGenerator $urlGenerator |
|||
* @param \OC_Defaults $themingDefaults |
|||
* @param IRequest $request |
|||
* @param IL10N $l10n |
|||
* @param \closure $uuidClosure |
|||
*/ |
|||
public function __construct(IUserSession $userSession, IURLGenerator $urlGenerator, |
|||
\OC_Defaults $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; |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue