summaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/appinfo/info.xml5
-rw-r--r--apps/dav/appinfo/v1/caldav.php4
-rw-r--r--apps/dav/appinfo/v1/carddav.php2
-rw-r--r--apps/dav/appinfo/v1/webdav.php1
-rw-r--r--apps/dav/appinfo/v2/remote.php1
-rw-r--r--apps/dav/l10n/bg.js49
-rw-r--r--apps/dav/l10n/bg.json47
-rw-r--r--apps/dav/l10n/bg_BG.js49
-rw-r--r--apps/dav/l10n/bg_BG.json47
-rw-r--r--apps/dav/l10n/cs.js49
-rw-r--r--apps/dav/l10n/cs.json47
-rw-r--r--apps/dav/l10n/cs_CZ.js70
-rw-r--r--apps/dav/l10n/cs_CZ.json70
-rw-r--r--apps/dav/l10n/de.js28
-rw-r--r--apps/dav/l10n/de.json28
-rw-r--r--apps/dav/l10n/de_DE.js24
-rw-r--r--apps/dav/l10n/de_DE.json24
-rw-r--r--apps/dav/l10n/hu.js49
-rw-r--r--apps/dav/l10n/hu.json47
-rw-r--r--apps/dav/l10n/is.js49
-rw-r--r--apps/dav/l10n/is.json47
-rw-r--r--apps/dav/l10n/nb.js49
-rw-r--r--apps/dav/l10n/nb.json47
-rw-r--r--apps/dav/l10n/nb_NO.js38
-rw-r--r--apps/dav/l10n/nb_NO.json38
-rw-r--r--apps/dav/l10n/pl.js42
-rw-r--r--apps/dav/l10n/pl.json42
-rw-r--r--apps/dav/l10n/ro.js49
-rw-r--r--apps/dav/l10n/ro.json47
-rw-r--r--apps/dav/l10n/ru.js40
-rw-r--r--apps/dav/l10n/ru.json40
-rw-r--r--apps/dav/l10n/sq.js42
-rw-r--r--apps/dav/l10n/sq.json40
-rw-r--r--apps/dav/l10n/sv.js44
-rw-r--r--apps/dav/l10n/sv.json44
-rw-r--r--apps/dav/l10n/zh_CN.js49
-rw-r--r--apps/dav/l10n/zh_CN.json47
-rw-r--r--apps/dav/lib/CalDAV/Activity/Backend.php4
-rw-r--r--apps/dav/lib/CalDAV/Activity/Setting/Todo.php2
-rw-r--r--apps/dav/lib/CalDAV/BirthdayService.php45
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php52
-rw-r--r--apps/dav/lib/CalDAV/CalendarHome.php7
-rw-r--r--apps/dav/lib/CalDAV/CalendarObject.php8
-rw-r--r--apps/dav/lib/CalDAV/Schedule/Plugin.php59
-rw-r--r--apps/dav/lib/CardDAV/CardDavBackend.php66
-rw-r--r--apps/dav/lib/Connector/LegacyDAVACL.php22
-rw-r--r--apps/dav/lib/Connector/Sabre/Auth.php7
-rw-r--r--apps/dav/lib/Connector/Sabre/DavAclPlugin.php17
-rw-r--r--apps/dav/lib/Connector/Sabre/FakeLockerPlugin.php2
-rw-r--r--apps/dav/lib/Connector/Sabre/File.php7
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesPlugin.php22
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesReportPlugin.php12
-rw-r--r--apps/dav/lib/Connector/Sabre/MaintenancePlugin.php3
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php2
-rw-r--r--apps/dav/lib/Connector/Sabre/TagsPlugin.php6
-rw-r--r--apps/dav/lib/DAV/GroupPrincipalBackend.php6
-rw-r--r--apps/dav/lib/Files/FileSearchBackend.php277
-rw-r--r--apps/dav/lib/Files/RootCollection.php1
-rw-r--r--apps/dav/lib/HookManager.php2
-rw-r--r--apps/dav/lib/Migration/ValueFix.php71
-rw-r--r--apps/dav/lib/Migration/ValueFixInsert.php63
-rw-r--r--apps/dav/lib/Server.php49
-rw-r--r--apps/dav/lib/SystemTag/SystemTagNode.php7
-rw-r--r--apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php2
-rw-r--r--apps/dav/tests/travis/caldav/script-new-endpoint.sh (renamed from apps/dav/tests/travis/caldav/script.sh)3
-rw-r--r--apps/dav/tests/travis/caldav/script-old-endpoint.sh23
-rw-r--r--apps/dav/tests/travis/caldavtest/serverinfo-new-endpoint.xml (renamed from apps/dav/tests/travis/caldavtest/serverinfo.xml)0
-rw-r--r--apps/dav/tests/travis/caldavtest/serverinfo-old-caldav-endpoint.xml850
-rw-r--r--apps/dav/tests/travis/caldavtest/serverinfo-old-carddav-endpoint.xml850
-rw-r--r--apps/dav/tests/travis/carddav/script-new-endpoint.sh25
-rw-r--r--apps/dav/tests/travis/carddav/script-old-endpoint.sh22
-rw-r--r--apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php3
-rw-r--r--apps/dav/tests/unit/CalDAV/CalDavBackendTest.php93
-rw-r--r--apps/dav/tests/unit/CalDAV/CalendarTest.php8
-rw-r--r--apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php41
-rw-r--r--apps/dav/tests/unit/CardDAV/CardDavBackendTest.php2
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/AuthTest.php8
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php2
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/MaintenancePluginTest.php18
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php45
-rw-r--r--apps/dav/tests/unit/DAV/GroupPrincipalTest.php29
-rw-r--r--apps/dav/tests/unit/DAV/HookManagerTest.php2
-rw-r--r--apps/dav/tests/unit/Files/FileSearchBackendTest.php304
-rw-r--r--apps/dav/tests/unit/Migration/ValueFixInsertTest.php117
-rw-r--r--apps/dav/tests/unit/Migration/ValueFixTest.php200
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php42
86 files changed, 4556 insertions, 387 deletions
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index f362c882f97..4cd606007c3 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -5,7 +5,7 @@
<description>WebDAV endpoint</description>
<licence>AGPL</licence>
<author>owncloud.org</author>
- <version>1.1.1</version>
+ <version>1.2.0</version>
<default_enable/>
<types>
<filesystem/>
@@ -15,7 +15,7 @@
<webdav>appinfo/v1/publicwebdav.php</webdav>
</public>
<dependencies>
- <nextcloud min-version="11" max-version="11" />
+ <nextcloud min-version="12" max-version="12" />
</dependencies>
<background-jobs>
<job>OCA\DAV\CardDAV\SyncJob</job>
@@ -23,6 +23,7 @@
<repair-steps>
<post-migration>
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
+ <step>OCA\DAV\Migration\ValueFixInsert</step>
</post-migration>
</repair-steps>
<commands>
diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php
index 9f12a92f4cd..7f2ff2b37da 100644
--- a/apps/dav/appinfo/v1/caldav.php
+++ b/apps/dav/appinfo/v1/caldav.php
@@ -49,7 +49,7 @@ $db = \OC::$server->getDatabaseConnection();
$userManager = \OC::$server->getUserManager();
$random = \OC::$server->getSecureRandom();
$dispatcher = \OC::$server->getEventDispatcher();
-$calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, $random, $dispatcher);
+$calDavBackend = new CalDavBackend($db, $principalBackend, $userManager, $random, $dispatcher, true);
$debugging = \OC::$server->getConfig()->getSystemValue('debug', false);
@@ -67,6 +67,7 @@ $nodes = array(
// Fire up server
$server = new \Sabre\DAV\Server($nodes);
+$server::$exposeVersion = false;
$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
$server->setBaseUri($baseuri);
@@ -80,6 +81,7 @@ if ($debugging) {
$server->addPlugin(new Sabre\DAV\Browser\Plugin());
}
+$server->addPlugin(new \Sabre\DAV\Sync\Plugin());
$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
$server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin());
$server->addPlugin(new \OCA\DAV\CalDAV\Schedule\IMipPlugin( \OC::$server->getMailer(), \OC::$server->getLogger()));
diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php
index e379707807f..04344e83fde 100644
--- a/apps/dav/appinfo/v1/carddav.php
+++ b/apps/dav/appinfo/v1/carddav.php
@@ -66,6 +66,7 @@ $nodes = array(
// Fire up server
$server = new \Sabre\DAV\Server($nodes);
+$server::$exposeVersion = false;
$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
$server->setBaseUri($baseuri);
// Add plugins
@@ -78,6 +79,7 @@ if ($debugging) {
$server->addPlugin(new Sabre\DAV\Browser\Plugin());
}
+$server->addPlugin(new \Sabre\DAV\Sync\Plugin());
$server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());
$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(\OC::$server->getLogger()));
$server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger()));
diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php
index f04bf406334..5ad11ceada8 100644
--- a/apps/dav/appinfo/v1/webdav.php
+++ b/apps/dav/appinfo/v1/webdav.php
@@ -25,6 +25,7 @@
// no php execution timeout for webdav
set_time_limit(0);
+ignore_user_abort(true);
// Turn off output buffering to prevent memory problems
\OC_Util::obEnd();
diff --git a/apps/dav/appinfo/v2/remote.php b/apps/dav/appinfo/v2/remote.php
index ab05e376503..b4a6578a41a 100644
--- a/apps/dav/appinfo/v2/remote.php
+++ b/apps/dav/appinfo/v2/remote.php
@@ -21,6 +21,7 @@
*/
// no php execution timeout for webdav
set_time_limit(0);
+ignore_user_abort(true);
// Turn off output buffering to prevent memory problems
\OC_Util::obEnd();
diff --git a/apps/dav/l10n/bg.js b/apps/dav/l10n/bg.js
new file mode 100644
index 00000000000..3f55af78124
--- /dev/null
+++ b/apps/dav/l10n/bg.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Календар",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
+ "You created calendar {calendar}" : "Направихте календар {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} изтри календар {calendar}",
+ "You deleted calendar {calendar}" : "Изтрихте календар {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обнови календар {calendar}",
+ "You updated calendar {calendar}" : "Обновихте календар {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} сподели календар {calendar} с теб",
+ "You shared calendar {calendar} with {user}" : "Споделихте календар {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} сподели календар {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} отказа споделяне на календар {calendar} с теб",
+ "You unshared calendar {calendar} from {user}" : "Отказахте споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} отказа споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} отказа споделяне на календар {calendar} от себеси",
+ "You shared calendar {calendar} with group {group}" : "Споделихте календар {calendar} с група {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} сподели календар {calendar} с група {group}",
+ "You unshared calendar {calendar} from group {group}" : "Отказахте споделяне на календар {calendar} от група {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} отказа споделяне с календар {calendar} от група {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} създаде събитие {event} в календар {calendar}",
+ "You created event {event} in calendar {calendar}" : "Създадохте събитие {event} в календар {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} изтри събитие {event} от календар {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Изтрихте събитие {event} от календар {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обнови събитие {event} в календар {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Обновихте събитие {event} в календар {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} създаде задача {todo} в списък {calendar}",
+ "You created todo {todo} in list {calendar}" : "Създадохте задача {todo} в списък {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} изтри задача {todo} от списък {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от лист {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> беше променен",
+ "A calendar <strong>event</strong> was modified" : "Календарно <strong>събитие</strong> беше променено",
+ "A calendar <strong>todo</strong> was modified" : "Календарна <strong>задача</strong> беше променена",
+ "Contact birthdays" : "Рождени дни на контакти",
+ "Personal" : "Личен",
+ "Contacts" : "Контакти",
+ "Technical details" : "Технически детайли",
+ "Remote Address: %s" : "Отдалечен адрес: %s",
+ "Request ID: %s" : "ID на заявка: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/bg.json b/apps/dav/l10n/bg.json
new file mode 100644
index 00000000000..03238418d18
--- /dev/null
+++ b/apps/dav/l10n/bg.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Календар",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
+ "You created calendar {calendar}" : "Направихте календар {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} изтри календар {calendar}",
+ "You deleted calendar {calendar}" : "Изтрихте календар {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обнови календар {calendar}",
+ "You updated calendar {calendar}" : "Обновихте календар {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} сподели календар {calendar} с теб",
+ "You shared calendar {calendar} with {user}" : "Споделихте календар {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} сподели календар {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} отказа споделяне на календар {calendar} с теб",
+ "You unshared calendar {calendar} from {user}" : "Отказахте споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} отказа споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} отказа споделяне на календар {calendar} от себеси",
+ "You shared calendar {calendar} with group {group}" : "Споделихте календар {calendar} с група {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} сподели календар {calendar} с група {group}",
+ "You unshared calendar {calendar} from group {group}" : "Отказахте споделяне на календар {calendar} от група {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} отказа споделяне с календар {calendar} от група {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} създаде събитие {event} в календар {calendar}",
+ "You created event {event} in calendar {calendar}" : "Създадохте събитие {event} в календар {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} изтри събитие {event} от календар {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Изтрихте събитие {event} от календар {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обнови събитие {event} в календар {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Обновихте събитие {event} в календар {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} създаде задача {todo} в списък {calendar}",
+ "You created todo {todo} in list {calendar}" : "Създадохте задача {todo} в списък {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} изтри задача {todo} от списък {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от лист {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> беше променен",
+ "A calendar <strong>event</strong> was modified" : "Календарно <strong>събитие</strong> беше променено",
+ "A calendar <strong>todo</strong> was modified" : "Календарна <strong>задача</strong> беше променена",
+ "Contact birthdays" : "Рождени дни на контакти",
+ "Personal" : "Личен",
+ "Contacts" : "Контакти",
+ "Technical details" : "Технически детайли",
+ "Remote Address: %s" : "Отдалечен адрес: %s",
+ "Request ID: %s" : "ID на заявка: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/bg_BG.js b/apps/dav/l10n/bg_BG.js
new file mode 100644
index 00000000000..3f55af78124
--- /dev/null
+++ b/apps/dav/l10n/bg_BG.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Календар",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
+ "You created calendar {calendar}" : "Направихте календар {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} изтри календар {calendar}",
+ "You deleted calendar {calendar}" : "Изтрихте календар {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обнови календар {calendar}",
+ "You updated calendar {calendar}" : "Обновихте календар {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} сподели календар {calendar} с теб",
+ "You shared calendar {calendar} with {user}" : "Споделихте календар {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} сподели календар {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} отказа споделяне на календар {calendar} с теб",
+ "You unshared calendar {calendar} from {user}" : "Отказахте споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} отказа споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} отказа споделяне на календар {calendar} от себеси",
+ "You shared calendar {calendar} with group {group}" : "Споделихте календар {calendar} с група {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} сподели календар {calendar} с група {group}",
+ "You unshared calendar {calendar} from group {group}" : "Отказахте споделяне на календар {calendar} от група {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} отказа споделяне с календар {calendar} от група {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} създаде събитие {event} в календар {calendar}",
+ "You created event {event} in calendar {calendar}" : "Създадохте събитие {event} в календар {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} изтри събитие {event} от календар {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Изтрихте събитие {event} от календар {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обнови събитие {event} в календар {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Обновихте събитие {event} в календар {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} създаде задача {todo} в списък {calendar}",
+ "You created todo {todo} in list {calendar}" : "Създадохте задача {todo} в списък {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} изтри задача {todo} от списък {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от лист {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> беше променен",
+ "A calendar <strong>event</strong> was modified" : "Календарно <strong>събитие</strong> беше променено",
+ "A calendar <strong>todo</strong> was modified" : "Календарна <strong>задача</strong> беше променена",
+ "Contact birthdays" : "Рождени дни на контакти",
+ "Personal" : "Личен",
+ "Contacts" : "Контакти",
+ "Technical details" : "Технически детайли",
+ "Remote Address: %s" : "Отдалечен адрес: %s",
+ "Request ID: %s" : "ID на заявка: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/bg_BG.json b/apps/dav/l10n/bg_BG.json
new file mode 100644
index 00000000000..03238418d18
--- /dev/null
+++ b/apps/dav/l10n/bg_BG.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Календар",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
+ "You created calendar {calendar}" : "Направихте календар {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} изтри календар {calendar}",
+ "You deleted calendar {calendar}" : "Изтрихте календар {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обнови календар {calendar}",
+ "You updated calendar {calendar}" : "Обновихте календар {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} сподели календар {calendar} с теб",
+ "You shared calendar {calendar} with {user}" : "Споделихте календар {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} сподели календар {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} отказа споделяне на календар {calendar} с теб",
+ "You unshared calendar {calendar} from {user}" : "Отказахте споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} отказа споделяне на календар {calendar} от {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} отказа споделяне на календар {calendar} от себеси",
+ "You shared calendar {calendar} with group {group}" : "Споделихте календар {calendar} с група {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} сподели календар {calendar} с група {group}",
+ "You unshared calendar {calendar} from group {group}" : "Отказахте споделяне на календар {calendar} от група {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} отказа споделяне с календар {calendar} от група {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} създаде събитие {event} в календар {calendar}",
+ "You created event {event} in calendar {calendar}" : "Създадохте събитие {event} в календар {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} изтри събитие {event} от календар {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Изтрихте събитие {event} от календар {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обнови събитие {event} в календар {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Обновихте събитие {event} в календар {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} създаде задача {todo} в списък {calendar}",
+ "You created todo {todo} in list {calendar}" : "Създадохте задача {todo} в списък {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} изтри задача {todo} от списък {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Изтрихте задача {todo} от лист {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} актуализира задача {todo} в списък {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Променихте задача {todo} в списък {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} реши задача {todo} в списък {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Решихте задача {todo} в списък {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} възобнови задача {todo} в списък {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Възобновихте задача {todo} в списък {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> беше променен",
+ "A calendar <strong>event</strong> was modified" : "Календарно <strong>събитие</strong> беше променено",
+ "A calendar <strong>todo</strong> was modified" : "Календарна <strong>задача</strong> беше променена",
+ "Contact birthdays" : "Рождени дни на контакти",
+ "Personal" : "Личен",
+ "Contacts" : "Контакти",
+ "Technical details" : "Технически детайли",
+ "Remote Address: %s" : "Отдалечен адрес: %s",
+ "Request ID: %s" : "ID на заявка: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/cs.js b/apps/dav/l10n/cs.js
new file mode 100644
index 00000000000..acd0b85b03f
--- /dev/null
+++ b/apps/dav/l10n/cs.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
+ "A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
+ "Contact birthdays" : "Narozeniny kontaktů",
+ "Personal" : "Osobní",
+ "Contacts" : "Kontakty",
+ "Technical details" : "Technické detaily",
+ "Remote Address: %s" : "Vzdálená adresa: %s",
+ "Request ID: %s" : "ID požadavku: %s"
+},
+"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/dav/l10n/cs.json b/apps/dav/l10n/cs.json
new file mode 100644
index 00000000000..c1a25b3401e
--- /dev/null
+++ b/apps/dav/l10n/cs.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
+ "A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
+ "Contact birthdays" : "Narozeniny kontaktů",
+ "Personal" : "Osobní",
+ "Contacts" : "Kontakty",
+ "Technical details" : "Technické detaily",
+ "Remote Address: %s" : "Vzdálená adresa: %s",
+ "Request ID: %s" : "ID požadavku: %s"
+},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/cs_CZ.js b/apps/dav/l10n/cs_CZ.js
index 3ffe09c4fe3..acd0b85b03f 100644
--- a/apps/dav/l10n/cs_CZ.js
+++ b/apps/dav/l10n/cs_CZ.js
@@ -1,44 +1,44 @@
OC.L10N.register(
"dav",
{
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
"A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
"A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
"A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
- "%1$s created calendar %2$s" : "%1$s vytvořil(a) kalendář %2$s",
- "You created calendar %2$s" : "Vytvořili jste kalendář %2$s",
- "%1$s deleted calendar %2$s" : "%1$s vymazal(a) kalendář %2$s",
- "You deleted calendar %2$s" : "Smazali jste kalendář %2$s",
- "%1$s updated calendar %2$s" : "%1$s aktualizoval(a) kalendář %2$s",
- "You updated calendar %2$s" : "Aktualizovali jste kalendář %2$s",
- "%1$s shared calendar %2$s with you" : "%1$s s vámi začal(a) sdílet kalendář %2$s",
- "You shared calendar %2$s with %1$s" : "S uživatelem %1$s jste začal(a) sdílet kalendář %2$s",
- "%3$s shared calendar %2$s with %1$s" : "%3$s nasdílel(a) s %1$s kalendář %2$s",
- "%1$s unshared calendar %2$s from you" : "%1$s s vámi přestal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from %1$s" : "S %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from %1$s" : "%3$s přestal s %1$s sdílet kalendář %2$s",
- "%1$s unshared calendar %2$s from themselves" : "%1$s přestal sám se sebou sdílet kalendář %2$s",
- "You shared calendar %2$s with group %1$s" : "Se skupinou %1$s jste nasdílel(a) kalendář %2$s",
- "%3$s shared calendar %2$s with group %1$s" : "%3$s se skupinou %1$s začal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from group %1$s" : "Se skupinou %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from group %1$s" : "%3$s přestal ve skupině %1$s sdílet kalendář %2$s",
- "%1$s created event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s vytvořil událost %3$s",
- "You created event %3$s in calendar %2$s" : "V kalendáři %2$s jste vytvořil(a) událost %3$s",
- "%1$s deleted event %3$s from calendar %2$s" : "%1$s z kalendáře %2$s smazal(a) událost %3$s",
- "You deleted event %3$s from calendar %2$s" : "V kalendáři %2$s jste smazal(a) událost %3$s",
- "%1$s updated event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s aktualizoval(a) událost %3$s",
- "You updated event %3$s in calendar %2$s" : "Aktualizoval(a) jste událost %3$s v kalendáři %2$s",
- "%1$s created todo %3$s in list %2$s" : "%1$s v seznamu %2$s vytvořil(a) úkol %3$s",
- "You created todo %3$s in list %2$s" : "V seznamu %2$s jste vytvořil(a) úkol %3$s",
- "%1$s deleted todo %3$s from list %2$s" : "%1$s ze seznamu %2$s smazal(a) úkol %3$s",
- "You deleted todo %3$s from list %2$s" : "Ze seznamu %2$s jste odstranil(a) úkol %3$s",
- "%1$s updated todo %3$s in list %2$s" : "%1$s v seznamu %2$s aktualizoval(a) úkol %3$s",
- "You updated todo %3$s in list %2$s" : "Aktualizoval(a) jste úkol %3$s v seznamu %2$s",
- "%1$s solved todo %3$s in list %2$s" : "%1$s v seznamu %2$s vyřešil(a) úkol %3$s",
- "You solved todo %3$s in list %2$s" : "Vyřešil(a) jste úkol %3$s v seznamu %2$s",
- "%1$s reopened todo %3$s in list %2$s" : "%1$s znovu otevřel úkol %3$s v seznamu %2$s",
- "You reopened todo %3$s in list %2$s" : "Znovu jste otevřel(a) úkol %3$s v seznamu %2$s",
- "Calendar" : "Kalendář",
- "Todos" : "Úkoly",
"Contact birthdays" : "Narozeniny kontaktů",
"Personal" : "Osobní",
"Contacts" : "Kontakty",
diff --git a/apps/dav/l10n/cs_CZ.json b/apps/dav/l10n/cs_CZ.json
index abe873a2094..c1a25b3401e 100644
--- a/apps/dav/l10n/cs_CZ.json
+++ b/apps/dav/l10n/cs_CZ.json
@@ -1,42 +1,42 @@
{ "translations": {
+ "Calendar" : "Kalendář",
+ "Todos" : "Úkoly",
+ "{actor} created calendar {calendar}" : "{actor} vytvořil(a) kalendář {calendar}",
+ "You created calendar {calendar}" : "Vytvořil(a",
+ "{actor} deleted calendar {calendar}" : "{actor} smazal(a) kalendář {calendar}",
+ "You deleted calendar {calendar}" : "Smazal(a) jste kalendář {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} aktualizoval(a) kalendář {calendar}",
+ "You updated calendar {calendar}" : "Aktualizoval(a) jste kalendář {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} s vámi nasdílel(a) kalendář {calendar}",
+ "You shared calendar {calendar} with {user}" : "S uživatelem {user} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} začal sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} s vámi přestal(a) sdílet kalendář {calendar}",
+ "You unshared calendar {calendar} from {user}" : "S uživatelem {user} jste přestal(a) sdílet kalendář {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} přestal(a) sdílet kalendář {calendar} s uživatelem {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} přestal sdílet kalendář {calendar} sám se sebou",
+ "You shared calendar {calendar} with group {group}" : "Se skupinou {group} jste začal(a) sdílet kalendář {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} nasdílel(a) kalendář {calendar} skupině {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zrušil(a) jste sdílení kalendáře {calendar} skupině {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} přestal(a) sdílet kalendář {calendar} se skupinou {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} vytvořil(a) událost {event} v kalendáři {calendar}",
+ "You created event {event} in calendar {calendar}" : "V kalendáři {calendar} jste vytvořil(a) událost {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} z kalendáře {calendar} smazal(a) událost {event}",
+ "You deleted event {event} from calendar {calendar}" : "Smazal(a) jste událost {event} z kalendáře {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} aktualizoval(a) událost {event} v kalendáři {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Aktualizoval(a) jste událost {event} v kalendáři {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} vytvořil(a) v seznamu {calendar} vytvořila úkol {todo}",
+ "You created todo {todo} in list {calendar}" : "V seznamu {calendar} jste vytvořil(a) úkol {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} smazal(a) úkol {todo} ze seznamu {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ze seznamu {todo} jste smazal(a) úkol {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} aktualizoval(a) úkol {todo} v seznamu {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Aktualizoval(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} vyřešil(a) úkol {todo} v seznamu {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Vyřešil(a) jste úkol {todo} v seznamu {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} znovu otevřel(a) úkol {todo} v seznamu {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Znovu jste otevřel(a) úkol {todo} v seznamu {calendar}",
"A <strong>calendar</strong> was modified" : "<strong>Kalendář</strong> byl změněn",
"A calendar <strong>event</strong> was modified" : "<strong>Událost</strong> v kalendáři byla změněna",
"A calendar <strong>todo</strong> was modified" : "<strong>Úkol</strong> v kalendáři byl změněn",
- "%1$s created calendar %2$s" : "%1$s vytvořil(a) kalendář %2$s",
- "You created calendar %2$s" : "Vytvořili jste kalendář %2$s",
- "%1$s deleted calendar %2$s" : "%1$s vymazal(a) kalendář %2$s",
- "You deleted calendar %2$s" : "Smazali jste kalendář %2$s",
- "%1$s updated calendar %2$s" : "%1$s aktualizoval(a) kalendář %2$s",
- "You updated calendar %2$s" : "Aktualizovali jste kalendář %2$s",
- "%1$s shared calendar %2$s with you" : "%1$s s vámi začal(a) sdílet kalendář %2$s",
- "You shared calendar %2$s with %1$s" : "S uživatelem %1$s jste začal(a) sdílet kalendář %2$s",
- "%3$s shared calendar %2$s with %1$s" : "%3$s nasdílel(a) s %1$s kalendář %2$s",
- "%1$s unshared calendar %2$s from you" : "%1$s s vámi přestal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from %1$s" : "S %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from %1$s" : "%3$s přestal s %1$s sdílet kalendář %2$s",
- "%1$s unshared calendar %2$s from themselves" : "%1$s přestal sám se sebou sdílet kalendář %2$s",
- "You shared calendar %2$s with group %1$s" : "Se skupinou %1$s jste nasdílel(a) kalendář %2$s",
- "%3$s shared calendar %2$s with group %1$s" : "%3$s se skupinou %1$s začal(a) sdílet kalendář %2$s",
- "You unshared calendar %2$s from group %1$s" : "Se skupinou %1$s jste přestal(a) sdílet kalendář %2$s",
- "%3$s unshared calendar %2$s from group %1$s" : "%3$s přestal ve skupině %1$s sdílet kalendář %2$s",
- "%1$s created event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s vytvořil událost %3$s",
- "You created event %3$s in calendar %2$s" : "V kalendáři %2$s jste vytvořil(a) událost %3$s",
- "%1$s deleted event %3$s from calendar %2$s" : "%1$s z kalendáře %2$s smazal(a) událost %3$s",
- "You deleted event %3$s from calendar %2$s" : "V kalendáři %2$s jste smazal(a) událost %3$s",
- "%1$s updated event %3$s in calendar %2$s" : "%1$s v kalendáři %2$s aktualizoval(a) událost %3$s",
- "You updated event %3$s in calendar %2$s" : "Aktualizoval(a) jste událost %3$s v kalendáři %2$s",
- "%1$s created todo %3$s in list %2$s" : "%1$s v seznamu %2$s vytvořil(a) úkol %3$s",
- "You created todo %3$s in list %2$s" : "V seznamu %2$s jste vytvořil(a) úkol %3$s",
- "%1$s deleted todo %3$s from list %2$s" : "%1$s ze seznamu %2$s smazal(a) úkol %3$s",
- "You deleted todo %3$s from list %2$s" : "Ze seznamu %2$s jste odstranil(a) úkol %3$s",
- "%1$s updated todo %3$s in list %2$s" : "%1$s v seznamu %2$s aktualizoval(a) úkol %3$s",
- "You updated todo %3$s in list %2$s" : "Aktualizoval(a) jste úkol %3$s v seznamu %2$s",
- "%1$s solved todo %3$s in list %2$s" : "%1$s v seznamu %2$s vyřešil(a) úkol %3$s",
- "You solved todo %3$s in list %2$s" : "Vyřešil(a) jste úkol %3$s v seznamu %2$s",
- "%1$s reopened todo %3$s in list %2$s" : "%1$s znovu otevřel úkol %3$s v seznamu %2$s",
- "You reopened todo %3$s in list %2$s" : "Znovu jste otevřel(a) úkol %3$s v seznamu %2$s",
- "Calendar" : "Kalendář",
- "Todos" : "Úkoly",
"Contact birthdays" : "Narozeniny kontaktů",
"Personal" : "Osobní",
"Contacts" : "Kontakty",
diff --git a/apps/dav/l10n/de.js b/apps/dav/l10n/de.js
index 5ee0af7dbaa..d5ebd166a29 100644
--- a/apps/dav/l10n/de.js
+++ b/apps/dav/l10n/de.js
@@ -6,10 +6,10 @@ OC.L10N.register(
"{actor} created calendar {calendar}" : "{actor} hat den Kalender {calendar} erstellt",
"You created calendar {calendar}" : "Du hast den Kalender {calendar} erstellt",
"{actor} deleted calendar {calendar}" : "{actor} hat den Kalender {calendar} gelöscht",
- "You deleted calendar {calendar}" : "Du hast hat den Kalender {calendar} gelöscht",
+ "You deleted calendar {calendar}" : "Du hast den Kalender {calendar} gelöscht",
"{actor} updated calendar {calendar}" : "{actor} hat den Kalender {calendar} aktualisiert",
"You updated calendar {calendar}" : "Du hast den Kalender {calendar} aktualisiert",
- "{actor} shared calendar {calendar} with you" : "{actor} hat den Kalender {calendar} mit Ihnen geteilt",
+ "{actor} shared calendar {calendar} with you" : "{actor} hat den Kalender {calendar} mit dir geteilt",
"You shared calendar {calendar} with {user}" : "Du hast den Kalender {calendar} mit {user} geteilt",
"{actor} shared calendar {calendar} with {user}" : "{actor} hat den Kalender {calendar} mit {user} geteilt",
"{actor} unshared calendar {calendar} from you" : "{actor} teilt den Kalender {calendar} nicht mehr mit dir",
@@ -26,16 +26,16 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "Du hast das Ereignis {event} im Kalender {calendar} gelöscht",
"{actor} updated event {event} in calendar {calendar}" : "{actor} hat das Ereignis {event} im Kalender {calendar} aktualisiert",
"You updated event {event} in calendar {calendar}" : "Du hast das Ereignis {event} im Kalender {calendar} aktualisiert",
- "{actor} created todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erstellt",
- "You created todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} erstellt",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} gelöscht",
- "You deleted todo {todo} from list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} gelöscht",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} aktualisiert",
- "You updated todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} aktualisiert",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erledigt",
- "You solved todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} erledigt",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} wieder geöffnet",
- "You reopened todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} wieder geöffnet",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "You created todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "You deleted todo {todo} from list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "You updated todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "You solved todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wieder geöffnet",
+ "You reopened todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} wieder geöffnet",
"A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet",
"A calendar <strong>event</strong> was modified" : "Ein <strong>Ereignis</strong> wurde bearbeitet",
"A calendar <strong>todo</strong> was modified" : "Eine <strong>Aufgabe</strong> wurde bearbeitet",
@@ -43,7 +43,7 @@ OC.L10N.register(
"Personal" : "Persönlich",
"Contacts" : "Kontakte",
"Technical details" : "Technische Details",
- "Remote Address: %s" : "Entfernte Adresse: %s",
- "Request ID: %s" : "Anfragekennung: %s"
+ "Remote Address: %s" : "Remote-Adresse: %s",
+ "Request ID: %s" : "Anfrage-ID: %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json
index 915c2cfb540..dbec1faa87b 100644
--- a/apps/dav/l10n/de.json
+++ b/apps/dav/l10n/de.json
@@ -4,10 +4,10 @@
"{actor} created calendar {calendar}" : "{actor} hat den Kalender {calendar} erstellt",
"You created calendar {calendar}" : "Du hast den Kalender {calendar} erstellt",
"{actor} deleted calendar {calendar}" : "{actor} hat den Kalender {calendar} gelöscht",
- "You deleted calendar {calendar}" : "Du hast hat den Kalender {calendar} gelöscht",
+ "You deleted calendar {calendar}" : "Du hast den Kalender {calendar} gelöscht",
"{actor} updated calendar {calendar}" : "{actor} hat den Kalender {calendar} aktualisiert",
"You updated calendar {calendar}" : "Du hast den Kalender {calendar} aktualisiert",
- "{actor} shared calendar {calendar} with you" : "{actor} hat den Kalender {calendar} mit Ihnen geteilt",
+ "{actor} shared calendar {calendar} with you" : "{actor} hat den Kalender {calendar} mit dir geteilt",
"You shared calendar {calendar} with {user}" : "Du hast den Kalender {calendar} mit {user} geteilt",
"{actor} shared calendar {calendar} with {user}" : "{actor} hat den Kalender {calendar} mit {user} geteilt",
"{actor} unshared calendar {calendar} from you" : "{actor} teilt den Kalender {calendar} nicht mehr mit dir",
@@ -24,16 +24,16 @@
"You deleted event {event} from calendar {calendar}" : "Du hast das Ereignis {event} im Kalender {calendar} gelöscht",
"{actor} updated event {event} in calendar {calendar}" : "{actor} hat das Ereignis {event} im Kalender {calendar} aktualisiert",
"You updated event {event} in calendar {calendar}" : "Du hast das Ereignis {event} im Kalender {calendar} aktualisiert",
- "{actor} created todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erstellt",
- "You created todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} erstellt",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} gelöscht",
- "You deleted todo {todo} from list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} gelöscht",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} aktualisiert",
- "You updated todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} aktualisiert",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erledigt",
- "You solved todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} erledigt",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} wieder geöffnet",
- "You reopened todo {todo} in list {calendar}" : "Du hast das ToDo {todo} in der Liste {calendar} wieder geöffnet",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "You created todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "You deleted todo {todo} from list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "You updated todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "You solved todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wieder geöffnet",
+ "You reopened todo {todo} in list {calendar}" : "Du hast die Aufgabe {todo} in der Liste {calendar} wieder geöffnet",
"A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet",
"A calendar <strong>event</strong> was modified" : "Ein <strong>Ereignis</strong> wurde bearbeitet",
"A calendar <strong>todo</strong> was modified" : "Eine <strong>Aufgabe</strong> wurde bearbeitet",
@@ -41,7 +41,7 @@
"Personal" : "Persönlich",
"Contacts" : "Kontakte",
"Technical details" : "Technische Details",
- "Remote Address: %s" : "Entfernte Adresse: %s",
- "Request ID: %s" : "Anfragekennung: %s"
+ "Remote Address: %s" : "Remote-Adresse: %s",
+ "Request ID: %s" : "Anfrage-ID: %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js
index 03da3d51f7c..07758a7b122 100644
--- a/apps/dav/l10n/de_DE.js
+++ b/apps/dav/l10n/de_DE.js
@@ -26,19 +26,19 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "Sie haben das Ereignis {event} im Kalender {calendar} gelöscht",
"{actor} updated event {event} in calendar {calendar}" : "{actor} hat das Ereignis {event} im Kalender {calendar} aktualisiert",
"You updated event {event} in calendar {calendar}" : "Sie haben das Ereignis {event} im Kalender {calendar} aktualisiert",
- "{actor} created todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erstellt",
- "You created todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} erstellt",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} gelöscht",
- "You deleted todo {todo} from list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} gelöscht",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} aktualisiert",
- "You updated todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} aktualisiert",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erledigt",
- "You solved todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} erledigt",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} wieder geöffnet",
- "You reopened todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} wieder geöffnet",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "You created todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "You deleted todo {todo} from list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "You updated todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "You solved todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wiedereröffnet",
+ "You reopened todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} wiedereröffnet",
"A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet",
- "A calendar <strong>event</strong> was modified" : "Ein <strong>Ereignis</strong> wurde bearbeitet",
- "A calendar <strong>todo</strong> was modified" : "Eine <strong>Aufgabe</strong> wurde bearbeitet",
+ "A calendar <strong>event</strong> was modified" : "Ein Kalender-<strong>Ereignis</strong> wurde bearbeitet",
+ "A calendar <strong>todo</strong> was modified" : "Eine Kalender-<strong>Aufgabe</strong> wurde bearbeitet",
"Contact birthdays" : "Geburtstage von Kontakten",
"Personal" : "Persönlich",
"Contacts" : "Kontakte",
diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json
index b7751ee32a4..8440fb0ca50 100644
--- a/apps/dav/l10n/de_DE.json
+++ b/apps/dav/l10n/de_DE.json
@@ -24,19 +24,19 @@
"You deleted event {event} from calendar {calendar}" : "Sie haben das Ereignis {event} im Kalender {calendar} gelöscht",
"{actor} updated event {event} in calendar {calendar}" : "{actor} hat das Ereignis {event} im Kalender {calendar} aktualisiert",
"You updated event {event} in calendar {calendar}" : "Sie haben das Ereignis {event} im Kalender {calendar} aktualisiert",
- "{actor} created todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erstellt",
- "You created todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} erstellt",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} gelöscht",
- "You deleted todo {todo} from list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} gelöscht",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} aktualisiert",
- "You updated todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} aktualisiert",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} erledigt",
- "You solved todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} erledigt",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat das ToDo {todo} in der Liste {calendar} wieder geöffnet",
- "You reopened todo {todo} in list {calendar}" : "Sie haben das ToDo {todo} in der Liste {calendar} wieder geöffnet",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "You created todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erstellt",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "You deleted todo {todo} from list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} gelöscht",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "You updated todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} aktualisiert",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "You solved todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} erledigt",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} hat die Aufgabe {todo} in der Liste {calendar} wiedereröffnet",
+ "You reopened todo {todo} in list {calendar}" : "Sie haben die Aufgabe {todo} in der Liste {calendar} wiedereröffnet",
"A <strong>calendar</strong> was modified" : "Ein <strong>Kalender</strong> wurde bearbeitet",
- "A calendar <strong>event</strong> was modified" : "Ein <strong>Ereignis</strong> wurde bearbeitet",
- "A calendar <strong>todo</strong> was modified" : "Eine <strong>Aufgabe</strong> wurde bearbeitet",
+ "A calendar <strong>event</strong> was modified" : "Ein Kalender-<strong>Ereignis</strong> wurde bearbeitet",
+ "A calendar <strong>todo</strong> was modified" : "Eine Kalender-<strong>Aufgabe</strong> wurde bearbeitet",
"Contact birthdays" : "Geburtstage von Kontakten",
"Personal" : "Persönlich",
"Contacts" : "Kontakte",
diff --git a/apps/dav/l10n/hu.js b/apps/dav/l10n/hu.js
new file mode 100644
index 00000000000..85c3bc641ff
--- /dev/null
+++ b/apps/dav/l10n/hu.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Naptár",
+ "Todos" : "Teendők",
+ "{actor} created calendar {calendar}" : "{actor} létrehozta a naptárt: {calendar}",
+ "You created calendar {calendar}" : "Létrehoztad a naptárt: {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} törölte a naptárt: {calendar}",
+ "You deleted calendar {calendar}" : "Törölted a naptárt: {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} frissítette a napárt: {calendar}",
+ "You updated calendar {calendar}" : "Frissítetted a naptárt: {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} megosztotta veled ezt a naptárt: {calendar}",
+ "You shared calendar {calendar} with {user}" : "Megosztottad ezt a napárt: {calendar} vele: {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} megosztotta ezt a napárt: {calendar} vele: {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} visszavonta töled a naptár megosztását: {calendar}",
+ "You unshared calendar {calendar} from {user}" : "Visszavontad a naptár megosztását: {calendar} tőle: {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} visszavonta a naptár megosztását: {calendar} tőle: {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} visszavonta tőlük a naptár megosztását: {calendar}",
+ "You shared calendar {calendar} with group {group}" : "Megosztottad ezt a naptárt: {calendar} evvel a csoporttal: {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} megosztotta ezt a naptárt: {calendar} evvel a csoporttal: {group}",
+ "You unshared calendar {calendar} from group {group}" : "Visszavontad ennek a naptárnak a magosztását: {calendar} ettől a csoporttól: {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} visszavonta ennek a naptárnak a magosztását: {calendar} ettől a csoporttól: {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} létrehozta ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "You created event {event} in calendar {calendar}" : "Létrehoztad ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} törölte ezt az eseményt: {event} ebből a naptárból: {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Törölted ezt az eseményt: {event} ebből a naptárból: {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} frissítette ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Frissítetted ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} létrehozta ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You created todo {todo} in list {calendar}" : "Létrehoztad ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} törölte ezt a teendőt: {todo} ebből a listából: {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Törölted ezt a teendőt: {todo} ebből a listából: {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} frissítette ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Frissítetted ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} elintézte ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Elintézted ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} újranyitotta ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Újranyitottad ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "A <strong>calendar</strong> was modified" : "Egy <strong>naptár</strong> megváltozott",
+ "A calendar <strong>event</strong> was modified" : "Egy naptár <strong>esemény</strong> megváltozott",
+ "A calendar <strong>todo</strong> was modified" : "Egy naptár <strong>teendő</strong> megváltozott",
+ "Contact birthdays" : "Születésnapok",
+ "Personal" : "Személyes",
+ "Contacts" : "Névjegyek",
+ "Technical details" : "Technikai adatok",
+ "Remote Address: %s" : "Távoli cím: %s",
+ "Request ID: %s" : "Kérelem azonosító: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/hu.json b/apps/dav/l10n/hu.json
new file mode 100644
index 00000000000..f84e4c4fce3
--- /dev/null
+++ b/apps/dav/l10n/hu.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Naptár",
+ "Todos" : "Teendők",
+ "{actor} created calendar {calendar}" : "{actor} létrehozta a naptárt: {calendar}",
+ "You created calendar {calendar}" : "Létrehoztad a naptárt: {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} törölte a naptárt: {calendar}",
+ "You deleted calendar {calendar}" : "Törölted a naptárt: {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} frissítette a napárt: {calendar}",
+ "You updated calendar {calendar}" : "Frissítetted a naptárt: {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} megosztotta veled ezt a naptárt: {calendar}",
+ "You shared calendar {calendar} with {user}" : "Megosztottad ezt a napárt: {calendar} vele: {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} megosztotta ezt a napárt: {calendar} vele: {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} visszavonta töled a naptár megosztását: {calendar}",
+ "You unshared calendar {calendar} from {user}" : "Visszavontad a naptár megosztását: {calendar} tőle: {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} visszavonta a naptár megosztását: {calendar} tőle: {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} visszavonta tőlük a naptár megosztását: {calendar}",
+ "You shared calendar {calendar} with group {group}" : "Megosztottad ezt a naptárt: {calendar} evvel a csoporttal: {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} megosztotta ezt a naptárt: {calendar} evvel a csoporttal: {group}",
+ "You unshared calendar {calendar} from group {group}" : "Visszavontad ennek a naptárnak a magosztását: {calendar} ettől a csoporttól: {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} visszavonta ennek a naptárnak a magosztását: {calendar} ettől a csoporttól: {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} létrehozta ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "You created event {event} in calendar {calendar}" : "Létrehoztad ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} törölte ezt az eseményt: {event} ebből a naptárból: {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Törölted ezt az eseményt: {event} ebből a naptárból: {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} frissítette ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Frissítetted ezt az eseményt: {event} ebben a naptárban: {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} létrehozta ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You created todo {todo} in list {calendar}" : "Létrehoztad ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} törölte ezt a teendőt: {todo} ebből a listából: {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Törölted ezt a teendőt: {todo} ebből a listából: {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} frissítette ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Frissítetted ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} elintézte ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Elintézted ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} újranyitotta ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Újranyitottad ezt a teendőt: {todo} ebben a listában: {calendar}",
+ "A <strong>calendar</strong> was modified" : "Egy <strong>naptár</strong> megváltozott",
+ "A calendar <strong>event</strong> was modified" : "Egy naptár <strong>esemény</strong> megváltozott",
+ "A calendar <strong>todo</strong> was modified" : "Egy naptár <strong>teendő</strong> megváltozott",
+ "Contact birthdays" : "Születésnapok",
+ "Personal" : "Személyes",
+ "Contacts" : "Névjegyek",
+ "Technical details" : "Technikai adatok",
+ "Remote Address: %s" : "Távoli cím: %s",
+ "Request ID: %s" : "Kérelem azonosító: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/is.js b/apps/dav/l10n/is.js
new file mode 100644
index 00000000000..79b4275068a
--- /dev/null
+++ b/apps/dav/l10n/is.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Dagatal",
+ "Todos" : "Verkþættir",
+ "{actor} created calendar {calendar}" : "{actor} bjó til dagatalið {calendar}",
+ "You created calendar {calendar}" : "Þú bjóst til dagatalið {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} eyddi dagatalinu {calendar}",
+ "You deleted calendar {calendar}" : "Þú eyddir dagatalinu {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppfærði dagatalið {calendar}",
+ "You updated calendar {calendar}" : "Þú uppfærðir dagatalið {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} deildi dagatalinu {calendar} með þér",
+ "You shared calendar {calendar} with {user}" : "Þú deildir dagatalinu {calendar} með {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} deildi dagatalinu {calendar} með {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} tók af deilingu á dagatalinu {calendar} frá þér",
+ "You unshared calendar {calendar} from {user}" : "Þú tókst af deilingu á dagatalinu {calendar} frá {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} tók af deilingu á dagatalinu {calendar} frá {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} tók af deilingu á dagatalinu {calendar} frá þeim sjálfum",
+ "You shared calendar {calendar} with group {group}" : "Þú deildir dagatalinu {calendar} með hópnum {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} deildi dagatalinu {calendar} með hópnum {group}",
+ "You unshared calendar {calendar} from group {group}" : "Þú tókst af deilingu á dagatalinu {calendar} frá hópnum {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} tók af deilingu á dagatalinu {calendar} frá hópnum {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} bjó til atburðinn {event} í dagatalinu {calendar}",
+ "You created event {event} in calendar {calendar}" : "Þú bjóst til atburðinn {event} í dagatalinu {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} eyddi atburðinum {event} úr dagatalinu {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Þú eyddir atburðinum {event} úr dagatalinu {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} uppfærði atburðinn {event} í dagatalinu {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Þú uppfærðir atburðinn {event} í dagatalinu {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} bjó til verkefnið {todo} á listanum {calendar}",
+ "You created todo {todo} in list {calendar}" : "Þú bjóst til verkefnið {todo} á listanum {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} eyddi verkefninu {todo} af listanum {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Þú eyddir verkefninu {todo} af listanum {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppfærði verkefnið {todo} á listanum {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Þú uppfærðir verkefnið {todo} á listanum {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} leysti verkefnið {todo} á listanum {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Þú leystir verkefnið {todo} á listanum {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} opnaði aftur verkefnið {todo} á listanum {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Þú opnaðir aftur verkefnið {todo} á listanum {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Dagatali</strong> var breytt",
+ "A calendar <strong>event</strong> was modified" : "<strong>Atburði</strong> dagatals var breytt",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Verkefnalista</strong> dagatals var breytt",
+ "Contact birthdays" : "Afmælisdagar tengiliðar",
+ "Personal" : "Einka",
+ "Contacts" : "Tengiliðir",
+ "Technical details" : "Tæknilegar upplýsingar",
+ "Remote Address: %s" : "Fjartengt vistfang: %s",
+ "Request ID: %s" : "Beiðni um auðkenni: %s"
+},
+"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
diff --git a/apps/dav/l10n/is.json b/apps/dav/l10n/is.json
new file mode 100644
index 00000000000..aba5a88917f
--- /dev/null
+++ b/apps/dav/l10n/is.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Dagatal",
+ "Todos" : "Verkþættir",
+ "{actor} created calendar {calendar}" : "{actor} bjó til dagatalið {calendar}",
+ "You created calendar {calendar}" : "Þú bjóst til dagatalið {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} eyddi dagatalinu {calendar}",
+ "You deleted calendar {calendar}" : "Þú eyddir dagatalinu {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppfærði dagatalið {calendar}",
+ "You updated calendar {calendar}" : "Þú uppfærðir dagatalið {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} deildi dagatalinu {calendar} með þér",
+ "You shared calendar {calendar} with {user}" : "Þú deildir dagatalinu {calendar} með {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} deildi dagatalinu {calendar} með {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} tók af deilingu á dagatalinu {calendar} frá þér",
+ "You unshared calendar {calendar} from {user}" : "Þú tókst af deilingu á dagatalinu {calendar} frá {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} tók af deilingu á dagatalinu {calendar} frá {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} tók af deilingu á dagatalinu {calendar} frá þeim sjálfum",
+ "You shared calendar {calendar} with group {group}" : "Þú deildir dagatalinu {calendar} með hópnum {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} deildi dagatalinu {calendar} með hópnum {group}",
+ "You unshared calendar {calendar} from group {group}" : "Þú tókst af deilingu á dagatalinu {calendar} frá hópnum {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} tók af deilingu á dagatalinu {calendar} frá hópnum {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} bjó til atburðinn {event} í dagatalinu {calendar}",
+ "You created event {event} in calendar {calendar}" : "Þú bjóst til atburðinn {event} í dagatalinu {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} eyddi atburðinum {event} úr dagatalinu {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Þú eyddir atburðinum {event} úr dagatalinu {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} uppfærði atburðinn {event} í dagatalinu {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Þú uppfærðir atburðinn {event} í dagatalinu {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} bjó til verkefnið {todo} á listanum {calendar}",
+ "You created todo {todo} in list {calendar}" : "Þú bjóst til verkefnið {todo} á listanum {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} eyddi verkefninu {todo} af listanum {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Þú eyddir verkefninu {todo} af listanum {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppfærði verkefnið {todo} á listanum {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Þú uppfærðir verkefnið {todo} á listanum {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} leysti verkefnið {todo} á listanum {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Þú leystir verkefnið {todo} á listanum {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} opnaði aftur verkefnið {todo} á listanum {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Þú opnaðir aftur verkefnið {todo} á listanum {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Dagatali</strong> var breytt",
+ "A calendar <strong>event</strong> was modified" : "<strong>Atburði</strong> dagatals var breytt",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Verkefnalista</strong> dagatals var breytt",
+ "Contact birthdays" : "Afmælisdagar tengiliðar",
+ "Personal" : "Einka",
+ "Contacts" : "Tengiliðir",
+ "Technical details" : "Tæknilegar upplýsingar",
+ "Remote Address: %s" : "Fjartengt vistfang: %s",
+ "Request ID: %s" : "Beiðni um auðkenni: %s"
+},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/nb.js b/apps/dav/l10n/nb.js
new file mode 100644
index 00000000000..364f305189d
--- /dev/null
+++ b/apps/dav/l10n/nb.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Kalender",
+ "Todos" : "Gjøremål",
+ "{actor} created calendar {calendar}" : "{actor} opprettet kalenderen {calendar}",
+ "You created calendar {calendar}" : "Du opprettet kalenderen {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} slettet kalenderen {calendar}",
+ "You deleted calendar {calendar}" : "Du slettet kalenderen {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} oppdaterte kalenderen {calendar}",
+ "You updated calendar {calendar}" : "Du oppdaterte kalenderen {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delte kalenderen {calendar} med deg",
+ "You shared calendar {calendar} with {user}" : "Du delte kalenderen {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delte kalenderen {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} fjernet delingen av kalenderen {calendar} med deg",
+ "You unshared calendar {calendar} from {user}" : "Du fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} fjernet delingen av kalender {calendar} med seg selv",
+ "You shared calendar {calendar} with group {group}" : "Du delte kalender {calendar} med gruppe {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delte kalenderen {calendar} med gruppe {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} opprettet en hendelse {event} i kalenderen {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du opprettet en hendelse {event} i kalenderen {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} slettet hendelsen {event} fra kalenderen {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du slettet hendelsen {event} fra kalenderen {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelse {event} i kalenderen {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelse {event} i kalenderen {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} opprettet en oppgave {todo} i listen {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du opprettet en oppgave {todo} i listen {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} slettet en oppgave {todo} fra listen {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du slettet en oppgave {todo} fra listen {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} oppdaterte en oppgave {todo} i listen {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du oppdaterte en oppgave {todo} i listen {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} ferdigstilte oppgaven {todo} i listen {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du ferdigstilte oppgaven {todo} i listen {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} gjenåpnet oppgaven {todo} i listen {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du gjenåpnet oppgaven {todo} i listen {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret",
+ "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret",
+ "A calendar <strong>todo</strong> was modified" : "En kalende <strong>gjøremål</strong> ble endret",
+ "Contact birthdays" : "Kontakters fødelsdag",
+ "Personal" : "Personlig",
+ "Contacts" : "Kontakter",
+ "Technical details" : "Tekniske detaljer",
+ "Remote Address: %s" : "Ekstern adresse: %s",
+ "Request ID: %s" : "Forespørsel ID: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/nb.json b/apps/dav/l10n/nb.json
new file mode 100644
index 00000000000..3725ba697fa
--- /dev/null
+++ b/apps/dav/l10n/nb.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Kalender",
+ "Todos" : "Gjøremål",
+ "{actor} created calendar {calendar}" : "{actor} opprettet kalenderen {calendar}",
+ "You created calendar {calendar}" : "Du opprettet kalenderen {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} slettet kalenderen {calendar}",
+ "You deleted calendar {calendar}" : "Du slettet kalenderen {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} oppdaterte kalenderen {calendar}",
+ "You updated calendar {calendar}" : "Du oppdaterte kalenderen {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delte kalenderen {calendar} med deg",
+ "You shared calendar {calendar} with {user}" : "Du delte kalenderen {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delte kalenderen {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} fjernet delingen av kalenderen {calendar} med deg",
+ "You unshared calendar {calendar} from {user}" : "Du fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} fjernet delingen av kalender {calendar} med seg selv",
+ "You shared calendar {calendar} with group {group}" : "Du delte kalender {calendar} med gruppe {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delte kalenderen {calendar} med gruppe {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} opprettet en hendelse {event} i kalenderen {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du opprettet en hendelse {event} i kalenderen {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} slettet hendelsen {event} fra kalenderen {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du slettet hendelsen {event} fra kalenderen {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelse {event} i kalenderen {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelse {event} i kalenderen {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} opprettet en oppgave {todo} i listen {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du opprettet en oppgave {todo} i listen {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} slettet en oppgave {todo} fra listen {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du slettet en oppgave {todo} fra listen {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} oppdaterte en oppgave {todo} i listen {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du oppdaterte en oppgave {todo} i listen {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} ferdigstilte oppgaven {todo} i listen {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du ferdigstilte oppgaven {todo} i listen {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} gjenåpnet oppgaven {todo} i listen {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du gjenåpnet oppgaven {todo} i listen {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret",
+ "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret",
+ "A calendar <strong>todo</strong> was modified" : "En kalende <strong>gjøremål</strong> ble endret",
+ "Contact birthdays" : "Kontakters fødelsdag",
+ "Personal" : "Personlig",
+ "Contacts" : "Kontakter",
+ "Technical details" : "Tekniske detaljer",
+ "Remote Address: %s" : "Ekstern adresse: %s",
+ "Request ID: %s" : "Forespørsel ID: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/nb_NO.js b/apps/dav/l10n/nb_NO.js
index 7c620457436..364f305189d 100644
--- a/apps/dav/l10n/nb_NO.js
+++ b/apps/dav/l10n/nb_NO.js
@@ -1,6 +1,44 @@
OC.L10N.register(
"dav",
{
+ "Calendar" : "Kalender",
+ "Todos" : "Gjøremål",
+ "{actor} created calendar {calendar}" : "{actor} opprettet kalenderen {calendar}",
+ "You created calendar {calendar}" : "Du opprettet kalenderen {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} slettet kalenderen {calendar}",
+ "You deleted calendar {calendar}" : "Du slettet kalenderen {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} oppdaterte kalenderen {calendar}",
+ "You updated calendar {calendar}" : "Du oppdaterte kalenderen {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delte kalenderen {calendar} med deg",
+ "You shared calendar {calendar} with {user}" : "Du delte kalenderen {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delte kalenderen {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} fjernet delingen av kalenderen {calendar} med deg",
+ "You unshared calendar {calendar} from {user}" : "Du fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} fjernet delingen av kalender {calendar} med seg selv",
+ "You shared calendar {calendar} with group {group}" : "Du delte kalender {calendar} med gruppe {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delte kalenderen {calendar} med gruppe {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} opprettet en hendelse {event} i kalenderen {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du opprettet en hendelse {event} i kalenderen {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} slettet hendelsen {event} fra kalenderen {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du slettet hendelsen {event} fra kalenderen {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelse {event} i kalenderen {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelse {event} i kalenderen {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} opprettet en oppgave {todo} i listen {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du opprettet en oppgave {todo} i listen {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} slettet en oppgave {todo} fra listen {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du slettet en oppgave {todo} fra listen {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} oppdaterte en oppgave {todo} i listen {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du oppdaterte en oppgave {todo} i listen {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} ferdigstilte oppgaven {todo} i listen {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du ferdigstilte oppgaven {todo} i listen {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} gjenåpnet oppgaven {todo} i listen {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du gjenåpnet oppgaven {todo} i listen {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret",
+ "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret",
+ "A calendar <strong>todo</strong> was modified" : "En kalende <strong>gjøremål</strong> ble endret",
"Contact birthdays" : "Kontakters fødelsdag",
"Personal" : "Personlig",
"Contacts" : "Kontakter",
diff --git a/apps/dav/l10n/nb_NO.json b/apps/dav/l10n/nb_NO.json
index 5c305db045c..3725ba697fa 100644
--- a/apps/dav/l10n/nb_NO.json
+++ b/apps/dav/l10n/nb_NO.json
@@ -1,4 +1,42 @@
{ "translations": {
+ "Calendar" : "Kalender",
+ "Todos" : "Gjøremål",
+ "{actor} created calendar {calendar}" : "{actor} opprettet kalenderen {calendar}",
+ "You created calendar {calendar}" : "Du opprettet kalenderen {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} slettet kalenderen {calendar}",
+ "You deleted calendar {calendar}" : "Du slettet kalenderen {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} oppdaterte kalenderen {calendar}",
+ "You updated calendar {calendar}" : "Du oppdaterte kalenderen {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delte kalenderen {calendar} med deg",
+ "You shared calendar {calendar} with {user}" : "Du delte kalenderen {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delte kalenderen {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} fjernet delingen av kalenderen {calendar} med deg",
+ "You unshared calendar {calendar} from {user}" : "Du fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} fjernet delingen av kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} fjernet delingen av kalender {calendar} med seg selv",
+ "You shared calendar {calendar} with group {group}" : "Du delte kalender {calendar} med gruppe {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delte kalenderen {calendar} med gruppe {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} fjernet deling av kalenderen {calendar} med gruppe {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} opprettet en hendelse {event} i kalenderen {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du opprettet en hendelse {event} i kalenderen {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} slettet hendelsen {event} fra kalenderen {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du slettet hendelsen {event} fra kalenderen {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} oppdaterte hendelse {event} i kalenderen {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du oppdaterte hendelse {event} i kalenderen {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} opprettet en oppgave {todo} i listen {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du opprettet en oppgave {todo} i listen {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} slettet en oppgave {todo} fra listen {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du slettet en oppgave {todo} fra listen {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} oppdaterte en oppgave {todo} i listen {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du oppdaterte en oppgave {todo} i listen {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} ferdigstilte oppgaven {todo} i listen {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du ferdigstilte oppgaven {todo} i listen {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} gjenåpnet oppgaven {todo} i listen {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du gjenåpnet oppgaven {todo} i listen {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> ble endret",
+ "A calendar <strong>event</strong> was modified" : "En kalender <strong>hendelse</strong> ble endret",
+ "A calendar <strong>todo</strong> was modified" : "En kalende <strong>gjøremål</strong> ble endret",
"Contact birthdays" : "Kontakters fødelsdag",
"Personal" : "Personlig",
"Contacts" : "Kontakter",
diff --git a/apps/dav/l10n/pl.js b/apps/dav/l10n/pl.js
index 38c19d99b9b..e07afbb5528 100644
--- a/apps/dav/l10n/pl.js
+++ b/apps/dav/l10n/pl.js
@@ -1,11 +1,49 @@
OC.L10N.register(
"dav",
{
- "Contact birthdays" : "Kontakt urodzinowy",
+ "Calendar" : "Kalendarz",
+ "Todos" : "Zadania",
+ "{actor} created calendar {calendar}" : "{actor} utworzył/-a kalendarz {calendar}",
+ "You created calendar {calendar}" : "Utworzyłeś/-aś kalendarz {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} usunął/-ęła kalendarz {calendar} .",
+ "You deleted calendar {calendar}" : "Usunąłęś/ęłaś kalendarz {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} zaktualizował/-a kalendarz {calendar} .",
+ "You updated calendar {calendar}" : "Zaktualizowałeś/-aś kalendarz {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} współdzieli kalendarz {calendar} z tobą",
+ "You shared calendar {calendar} with {user}" : "Współdzielisz kalendarz {calendar} z {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} współdzieli kalendarz {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} zakończył/-a współdzielienie kalendarza {calendar} z tobą",
+ "You unshared calendar {calendar} from {user}" : "Zakończyłeś/-aś współdzielenie kalendarza {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} zakończył/-a współdzielenie kalendarza {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} zakończył/-a wspóldzielenie kalendarza {calendar} od siebie",
+ "You shared calendar {calendar} with group {group}" : "Współdzielisz kalendarz {calendar} z grupą {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} współdzieli kalendarz {calendar} z grupą {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zakończyłeś współdzielenie kalendarza {calendar} z grupą {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} nie współdzieli kalendarza {calendar} z grupą {group} .",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} utworzył/-a wydarzenie {event} w kalendarzu {calendar}",
+ "You created event {event} in calendar {calendar}" : "Utworzyłeś/-ał wydarzenie {event} w kalendarzu {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} usunął/-ęłą wydarzenie {event} z kalendarza {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Usunąłeś/-aś wydarzenie {event} z kalendarza {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} zaktualizował/-a wydarzenie {event} z kalendarza {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Zaktualizowałeś/-aś wydarzenie {event} w kalendarzu {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} utworzył/-a zadanie {todo} na liście {calendar}",
+ "You created todo {todo} in list {calendar}" : "Utworzyłeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} usunął/-ęła zadanie {todo} z listy {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Usunąłeś/-ęłaś zadanie {todo} z listy {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} zaktualizował/-a zadanie {todo} na liście {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Zaktualizowałeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} zakończył zadanie {todo} na liście {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Zakończyłeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} otworzył ponownie zadanie {todo} na liście {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Otworzyłęś/-aś ponownie zadanie {todo} na liście {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Kalendarz</strong> został zmodyfikowany",
+ "A calendar <strong>event</strong> was modified" : "<strong>Zdarzenie</strong> kalendarza zostało zmodyfikowane",
+ "A calendar <strong>todo</strong> was modified" : "Kalendarz <strong>zadań</strong> został zmieniony",
+ "Contact birthdays" : "Urodziny kontaktu",
"Personal" : "Osobiste",
"Contacts" : "Kontakty",
"Technical details" : "Szczegóły techniczne",
"Remote Address: %s" : "Adres zdalny: %s",
"Request ID: %s" : "ID żądania: %s"
},
-"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
+"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
diff --git a/apps/dav/l10n/pl.json b/apps/dav/l10n/pl.json
index 4cc85f135ac..2409315f341 100644
--- a/apps/dav/l10n/pl.json
+++ b/apps/dav/l10n/pl.json
@@ -1,9 +1,47 @@
{ "translations": {
- "Contact birthdays" : "Kontakt urodzinowy",
+ "Calendar" : "Kalendarz",
+ "Todos" : "Zadania",
+ "{actor} created calendar {calendar}" : "{actor} utworzył/-a kalendarz {calendar}",
+ "You created calendar {calendar}" : "Utworzyłeś/-aś kalendarz {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} usunął/-ęła kalendarz {calendar} .",
+ "You deleted calendar {calendar}" : "Usunąłęś/ęłaś kalendarz {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} zaktualizował/-a kalendarz {calendar} .",
+ "You updated calendar {calendar}" : "Zaktualizowałeś/-aś kalendarz {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} współdzieli kalendarz {calendar} z tobą",
+ "You shared calendar {calendar} with {user}" : "Współdzielisz kalendarz {calendar} z {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} współdzieli kalendarz {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} zakończył/-a współdzielienie kalendarza {calendar} z tobą",
+ "You unshared calendar {calendar} from {user}" : "Zakończyłeś/-aś współdzielenie kalendarza {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} zakończył/-a współdzielenie kalendarza {calendar} z {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} zakończył/-a wspóldzielenie kalendarza {calendar} od siebie",
+ "You shared calendar {calendar} with group {group}" : "Współdzielisz kalendarz {calendar} z grupą {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} współdzieli kalendarz {calendar} z grupą {group}",
+ "You unshared calendar {calendar} from group {group}" : "Zakończyłeś współdzielenie kalendarza {calendar} z grupą {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} nie współdzieli kalendarza {calendar} z grupą {group} .",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} utworzył/-a wydarzenie {event} w kalendarzu {calendar}",
+ "You created event {event} in calendar {calendar}" : "Utworzyłeś/-ał wydarzenie {event} w kalendarzu {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} usunął/-ęłą wydarzenie {event} z kalendarza {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Usunąłeś/-aś wydarzenie {event} z kalendarza {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} zaktualizował/-a wydarzenie {event} z kalendarza {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Zaktualizowałeś/-aś wydarzenie {event} w kalendarzu {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} utworzył/-a zadanie {todo} na liście {calendar}",
+ "You created todo {todo} in list {calendar}" : "Utworzyłeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} usunął/-ęła zadanie {todo} z listy {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Usunąłeś/-ęłaś zadanie {todo} z listy {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} zaktualizował/-a zadanie {todo} na liście {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Zaktualizowałeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} zakończył zadanie {todo} na liście {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Zakończyłeś/-aś zadanie {todo} na liście {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} otworzył ponownie zadanie {todo} na liście {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Otworzyłęś/-aś ponownie zadanie {todo} na liście {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Kalendarz</strong> został zmodyfikowany",
+ "A calendar <strong>event</strong> was modified" : "<strong>Zdarzenie</strong> kalendarza zostało zmodyfikowane",
+ "A calendar <strong>todo</strong> was modified" : "Kalendarz <strong>zadań</strong> został zmieniony",
+ "Contact birthdays" : "Urodziny kontaktu",
"Personal" : "Osobiste",
"Contacts" : "Kontakty",
"Technical details" : "Szczegóły techniczne",
"Remote Address: %s" : "Adres zdalny: %s",
"Request ID: %s" : "ID żądania: %s"
-},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
+},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/dav/l10n/ro.js b/apps/dav/l10n/ro.js
new file mode 100644
index 00000000000..9f3f2fbf72f
--- /dev/null
+++ b/apps/dav/l10n/ro.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Calendar",
+ "Todos" : "De făcut",
+ "{actor} created calendar {calendar}" : "{actor} a creat calendarul {calendar}",
+ "You created calendar {calendar}" : "Ai creat calendarul {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} a șters calendarul {calendar}",
+ "You deleted calendar {calendar}" : "Ai șters calendarul {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} a actualiza calendarul {calendar}",
+ "You updated calendar {calendar}" : "Ai actualizat calendarul {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} a partajat calendarul {calendar} cu tine",
+ "You shared calendar {calendar} with {user}" : "Ai partajat calendarul {calendar} cu {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} a partajat calendarul {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} a eliminat partajarea calendarului {calendar} cu tine",
+ "You unshared calendar {calendar} from {user}" : "Ai eliminat partajarea calendarului {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} a eliminat partajarea calendarului {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} a eliminat partajarea calendarului {calendar} catre sine",
+ "You shared calendar {calendar} with group {group}" : "Ai partajat calendarul {calendar} cu grupul {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} a partajat calendarul {calendar} cu grupul {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ai eliminat partajarea calendarului {calendar} către grupul {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} a elimina partajarea calendarului {calendar} către grupul {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} a creat evenimentul {event} în calendarul {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ai creat evenimentul {event} în calendarul {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} a șters evenimentul {event} din calendarul {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "AI șters evenimentul {event} din calendarul {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} a actualizat evenimentul {event} din calendarul {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ai actualizat evenimentul {event} din calendarul {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} a creat lista {todo} în calendarul {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ai creat lista {todo} în lista {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} a șters lista {todo} din calendarul {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ai șters lista {todo} din calendarul {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} a actualizat lista {todo} din calendarul {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Ai actualizat lista {todo} din calendarul {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} a completat lista {todo} din calendarul {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Ai completat lista {todo} din calendarul {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} a redeschis lista {todo} din calendarul {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Ai redeschis lista {todo} din calendarul {calendar}",
+ "A <strong>calendar</strong> was modified" : "Un <strong>calendar</strong> a fost modificat",
+ "A calendar <strong>event</strong> was modified" : "Un <strong>eveniment</strong> din calendar a fost modificat",
+ "A calendar <strong>todo</strong> was modified" : "O <strong>listă</strong> din calendar a fost modificată",
+ "Contact birthdays" : "Zile de naștere ale persoanelor de contact",
+ "Personal" : "Personal",
+ "Contacts" : "Persoane de contact",
+ "Technical details" : "Detalii tehnice",
+ "Remote Address: %s" : "Adresă la distanță: %s",
+ "Request ID: %s" : "ID-ul cererii: %s"
+},
+"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");
diff --git a/apps/dav/l10n/ro.json b/apps/dav/l10n/ro.json
new file mode 100644
index 00000000000..f93f03bd4dd
--- /dev/null
+++ b/apps/dav/l10n/ro.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "Calendar",
+ "Todos" : "De făcut",
+ "{actor} created calendar {calendar}" : "{actor} a creat calendarul {calendar}",
+ "You created calendar {calendar}" : "Ai creat calendarul {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} a șters calendarul {calendar}",
+ "You deleted calendar {calendar}" : "Ai șters calendarul {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} a actualiza calendarul {calendar}",
+ "You updated calendar {calendar}" : "Ai actualizat calendarul {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} a partajat calendarul {calendar} cu tine",
+ "You shared calendar {calendar} with {user}" : "Ai partajat calendarul {calendar} cu {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} a partajat calendarul {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} a eliminat partajarea calendarului {calendar} cu tine",
+ "You unshared calendar {calendar} from {user}" : "Ai eliminat partajarea calendarului {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} a eliminat partajarea calendarului {calendar} cu {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} a eliminat partajarea calendarului {calendar} catre sine",
+ "You shared calendar {calendar} with group {group}" : "Ai partajat calendarul {calendar} cu grupul {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} a partajat calendarul {calendar} cu grupul {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ai eliminat partajarea calendarului {calendar} către grupul {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} a elimina partajarea calendarului {calendar} către grupul {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} a creat evenimentul {event} în calendarul {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ai creat evenimentul {event} în calendarul {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} a șters evenimentul {event} din calendarul {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "AI șters evenimentul {event} din calendarul {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} a actualizat evenimentul {event} din calendarul {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ai actualizat evenimentul {event} din calendarul {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} a creat lista {todo} în calendarul {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ai creat lista {todo} în lista {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} a șters lista {todo} din calendarul {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ai șters lista {todo} din calendarul {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} a actualizat lista {todo} din calendarul {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Ai actualizat lista {todo} din calendarul {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} a completat lista {todo} din calendarul {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Ai completat lista {todo} din calendarul {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} a redeschis lista {todo} din calendarul {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Ai redeschis lista {todo} din calendarul {calendar}",
+ "A <strong>calendar</strong> was modified" : "Un <strong>calendar</strong> a fost modificat",
+ "A calendar <strong>event</strong> was modified" : "Un <strong>eveniment</strong> din calendar a fost modificat",
+ "A calendar <strong>todo</strong> was modified" : "O <strong>listă</strong> din calendar a fost modificată",
+ "Contact birthdays" : "Zile de naștere ale persoanelor de contact",
+ "Personal" : "Personal",
+ "Contacts" : "Persoane de contact",
+ "Technical details" : "Detalii tehnice",
+ "Remote Address: %s" : "Adresă la distanță: %s",
+ "Request ID: %s" : "ID-ul cererii: %s"
+},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/ru.js b/apps/dav/l10n/ru.js
index 5cda18af266..e6749e7fb1b 100644
--- a/apps/dav/l10n/ru.js
+++ b/apps/dav/l10n/ru.js
@@ -1,10 +1,48 @@
OC.L10N.register(
"dav",
{
+ "Calendar" : "Календарь",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} создал календарь {calendar}",
+ "You created calendar {calendar}" : "Вы создали календарь {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} удалил календарь {calendar}",
+ "You deleted calendar {calendar}" : "Вы удалили календарь {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обновил календарь {calendar}",
+ "You updated calendar {calendar}" : "Вы обновили календарь {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} поделился календарем {calendar} с вами",
+ "You shared calendar {calendar} with {user}" : "Вы поделились календарем {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} поделился календарем {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} закрыл для вас доступ к календарю {calendar}",
+ "You unshared calendar {calendar} from {user}" : "Вы закрыли доступ к календарю {calendar} для {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} закрыл доступ к календарю {calendar} для {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} закрыл доступ к календарю {calendar} для себя",
+ "You shared calendar {calendar} with group {group}" : "Вы поделились календарем {calendar} с группой {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} поделился календарем {calendar} с группой {group}",
+ "You unshared calendar {calendar} from group {group}" : "Вы закрыли доступ к календарю {calendar} для группы {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} закрыл доступ к календарю {calendar} для группы {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} создал событие {event} в календаре {calendar}",
+ "You created event {event} in calendar {calendar}" : "Вы создали событие {event} в календаре {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} удалил событие {event} из календаря {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Вы удалили событие {event} из календаря {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обновил событие {event} в календаре {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Вы обновили событие {event} в календаре {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} создал задачу {todo} в списке {calendar}",
+ "You created todo {todo} in list {calendar}" : "Вы создали задачу {todo} в списке {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} удалил задачу {todo} из списка {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Вы удалили задачу {todo} из списка {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} обновил задачу {todo} из списка {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Вы обновили задачу {todo} из списка {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} завершил задачу {todo} из списка {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Вы завершили задачу {todo} из списка {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно открыл задачу {todo} из списка {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Вы повторно открыли задачу {todo} из списка {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календарь</strong> был изменен",
+ "A calendar <strong>event</strong> was modified" : "<strong>Событие</strong> календаря была изменена",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Задача</strong> календаря была изменена",
"Contact birthdays" : "Дни рождения контакта",
"Personal" : "Личное",
"Contacts" : "Контакты",
- "Technical details" : "Технические характеристики",
+ "Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s"
},
diff --git a/apps/dav/l10n/ru.json b/apps/dav/l10n/ru.json
index bdee4d3cca9..538be85207e 100644
--- a/apps/dav/l10n/ru.json
+++ b/apps/dav/l10n/ru.json
@@ -1,8 +1,46 @@
{ "translations": {
+ "Calendar" : "Календарь",
+ "Todos" : "Задачи",
+ "{actor} created calendar {calendar}" : "{actor} создал календарь {calendar}",
+ "You created calendar {calendar}" : "Вы создали календарь {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} удалил календарь {calendar}",
+ "You deleted calendar {calendar}" : "Вы удалили календарь {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} обновил календарь {calendar}",
+ "You updated calendar {calendar}" : "Вы обновили календарь {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} поделился календарем {calendar} с вами",
+ "You shared calendar {calendar} with {user}" : "Вы поделились календарем {calendar} с {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} поделился календарем {calendar} с {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} закрыл для вас доступ к календарю {calendar}",
+ "You unshared calendar {calendar} from {user}" : "Вы закрыли доступ к календарю {calendar} для {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} закрыл доступ к календарю {calendar} для {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} закрыл доступ к календарю {calendar} для себя",
+ "You shared calendar {calendar} with group {group}" : "Вы поделились календарем {calendar} с группой {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} поделился календарем {calendar} с группой {group}",
+ "You unshared calendar {calendar} from group {group}" : "Вы закрыли доступ к календарю {calendar} для группы {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} закрыл доступ к календарю {calendar} для группы {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} создал событие {event} в календаре {calendar}",
+ "You created event {event} in calendar {calendar}" : "Вы создали событие {event} в календаре {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} удалил событие {event} из календаря {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Вы удалили событие {event} из календаря {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} обновил событие {event} в календаре {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Вы обновили событие {event} в календаре {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} создал задачу {todo} в списке {calendar}",
+ "You created todo {todo} in list {calendar}" : "Вы создали задачу {todo} в списке {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} удалил задачу {todo} из списка {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Вы удалили задачу {todo} из списка {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} обновил задачу {todo} из списка {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Вы обновили задачу {todo} из списка {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} завершил задачу {todo} из списка {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Вы завершили задачу {todo} из списка {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно открыл задачу {todo} из списка {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Вы повторно открыли задачу {todo} из списка {calendar}",
+ "A <strong>calendar</strong> was modified" : "<strong>Календарь</strong> был изменен",
+ "A calendar <strong>event</strong> was modified" : "<strong>Событие</strong> календаря была изменена",
+ "A calendar <strong>todo</strong> was modified" : "<strong>Задача</strong> календаря была изменена",
"Contact birthdays" : "Дни рождения контакта",
"Personal" : "Личное",
"Contacts" : "Контакты",
- "Technical details" : "Технические характеристики",
+ "Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
diff --git a/apps/dav/l10n/sq.js b/apps/dav/l10n/sq.js
new file mode 100644
index 00000000000..6a683d01712
--- /dev/null
+++ b/apps/dav/l10n/sq.js
@@ -0,0 +1,42 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "Kalendar",
+ "{actor} created calendar {calendar}" : "{actor} krijoj kalendarin {calendar}",
+ "You created calendar {calendar}" : "Ju krijuat kalendarin {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} fshiu kalendarin {calendar}",
+ "You deleted calendar {calendar}" : "Ju fshit kalendarin {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} përditësoi kalendarin {calendar}",
+ "You updated calendar {calendar}" : "Ju përditësuat kalendarin {calendar}",
+ "{actor} shared calendar {calendar} with you" : " {actor} ndau kalendarin {calendar} me ju",
+ "You shared calendar {calendar} with {user}" : "Ju ndat kalendarin {calendar} me {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} ndau kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} ndaloj së ndari kalendarin {calendar} me ju",
+ "You unshared calendar {calendar} from {user}" : "Ju ndaluat së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} ndaloj së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} ndaloj së ndari kalendarin {calendar} me veten",
+ "You shared calendar {calendar} with group {group}" : "Ju ndat kalendarin {calendar} me grupin {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} ndau kalendarin {calendar} me grupin {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ju ndaluat së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} ndaloj së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} krijoj eventin {event} në kalendarin {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ju krijuat eventin {event} në kalendarin {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} fshiu eventin {event} nga kalendari {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Ju fshit eventin {event} nga kalndari {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} përditsoi eventin {event} në kalndarin {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ju përditësuat eventin {event} në kalndarin {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} u krijua todo{todo} në listën {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ju krijuat todo {todo} në listën {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} u fshi todo{ todo} nga lista{calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ju fshit todo{todo} nga lista {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} u përditësua todo{todo} në listën{calendar}",
+ "A <strong>calendar</strong> was modified" : "Një <strong>kalendar</strong> u modifikua",
+ "A calendar <strong>event</strong> was modified" : "Një <strong>event</strong> në kalendar u modifikua",
+ "A calendar <strong>todo</strong> was modified" : "Një kalendar <strong>todo<strong> u modifikua",
+ "Personal" : "Personale",
+ "Contacts" : "Kontaktet",
+ "Technical details" : "Detaje teknike",
+ "Remote Address: %s" : "Adresa remote: %s",
+ "Request ID: %s" : "ID e kërkesës: %s"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/sq.json b/apps/dav/l10n/sq.json
new file mode 100644
index 00000000000..f5a98e8845c
--- /dev/null
+++ b/apps/dav/l10n/sq.json
@@ -0,0 +1,40 @@
+{ "translations": {
+ "Calendar" : "Kalendar",
+ "{actor} created calendar {calendar}" : "{actor} krijoj kalendarin {calendar}",
+ "You created calendar {calendar}" : "Ju krijuat kalendarin {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} fshiu kalendarin {calendar}",
+ "You deleted calendar {calendar}" : "Ju fshit kalendarin {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} përditësoi kalendarin {calendar}",
+ "You updated calendar {calendar}" : "Ju përditësuat kalendarin {calendar}",
+ "{actor} shared calendar {calendar} with you" : " {actor} ndau kalendarin {calendar} me ju",
+ "You shared calendar {calendar} with {user}" : "Ju ndat kalendarin {calendar} me {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} ndau kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} ndaloj së ndari kalendarin {calendar} me ju",
+ "You unshared calendar {calendar} from {user}" : "Ju ndaluat së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} ndaloj së ndari kalendarin {calendar} me {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} ndaloj së ndari kalendarin {calendar} me veten",
+ "You shared calendar {calendar} with group {group}" : "Ju ndat kalendarin {calendar} me grupin {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} ndau kalendarin {calendar} me grupin {group}",
+ "You unshared calendar {calendar} from group {group}" : "Ju ndaluat së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} ndaloj së ndari kalendarin {calendar} me grupin {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} krijoj eventin {event} në kalendarin {calendar}",
+ "You created event {event} in calendar {calendar}" : "Ju krijuat eventin {event} në kalendarin {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} fshiu eventin {event} nga kalendari {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Ju fshit eventin {event} nga kalndari {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} përditsoi eventin {event} në kalndarin {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Ju përditësuat eventin {event} në kalndarin {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} u krijua todo{todo} në listën {calendar}",
+ "You created todo {todo} in list {calendar}" : "Ju krijuat todo {todo} në listën {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} u fshi todo{ todo} nga lista{calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Ju fshit todo{todo} nga lista {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} u përditësua todo{todo} në listën{calendar}",
+ "A <strong>calendar</strong> was modified" : "Një <strong>kalendar</strong> u modifikua",
+ "A calendar <strong>event</strong> was modified" : "Një <strong>event</strong> në kalendar u modifikua",
+ "A calendar <strong>todo</strong> was modified" : "Një kalendar <strong>todo<strong> u modifikua",
+ "Personal" : "Personale",
+ "Contacts" : "Kontaktet",
+ "Technical details" : "Detaje teknike",
+ "Remote Address: %s" : "Adresa remote: %s",
+ "Request ID: %s" : "ID e kërkesës: %s"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index 07a5521092d..25cd0d797c8 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -1,11 +1,49 @@
OC.L10N.register(
"dav",
{
- "Contact birthdays" : "Kontaktfödelsedagar",
- "Personal" : "Personligt",
+ "Calendar" : "Kalender",
+ "Todos" : "Uppgifter",
+ "{actor} created calendar {calendar}" : "{actor} skapade kalender {calendar}",
+ "You created calendar {calendar}" : "Du skapade kalender {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} raderade kalender {calendar}",
+ "You deleted calendar {calendar}" : "Du raderade kalender {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender {calendar}",
+ "You updated calendar {calendar}" : "Du uppdaterade kalender {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delade kalender {calendar} med dig",
+ "You shared calendar {calendar} with {user}" : "Du delade kalender {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delade kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} slutade dela kalender {calendar} med dig",
+ "You unshared calendar {calendar} from {user}" : "Du slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} slutade dela kalender {calendar} med sig själv",
+ "You shared calendar {calendar} with group {group}" : "Du delade kalender {calendar} med grupp {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delade kalender {calendar} med grupp {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} skapade händelse {event} i kalender {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du skapade händelse {event} i kalender {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} raderade händelse {event} från kalender {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du raderade händelse {event} från kalender {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} uppdaterade händelse {event} i kalender {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} i kalender {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} skapade uppgift {todo} i listan {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du skapade uppgift {todo} i listan {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade uppgift {todo} från listan {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du raderade uppgift {todo} från listan {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade uppgift {todo} i listan {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du uppdaterade uppgift {todo} i listan {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} löste uppgift {todo} i listan {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du löste uppgift {todo} i listan {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog uppgift {todo} i listan {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du återupptog uppgift {todo} i listan {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> modifierades",
+ "A calendar <strong>event</strong> was modified" : "En kalender-<strong>händelse</strong> modifierades",
+ "A calendar <strong>todo</strong> was modified" : "En kalender <strong>uppgift</strong> modifierades",
+ "Contact birthdays" : "Födelsedagar",
+ "Personal" : "Privat",
"Contacts" : "Kontakter",
"Technical details" : "Tekniska detaljer",
- "Remote Address: %s" : "Fjärradress: %s",
+ "Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index 361e3131470..ba76ca55329 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -1,9 +1,47 @@
{ "translations": {
- "Contact birthdays" : "Kontaktfödelsedagar",
- "Personal" : "Personligt",
+ "Calendar" : "Kalender",
+ "Todos" : "Uppgifter",
+ "{actor} created calendar {calendar}" : "{actor} skapade kalender {calendar}",
+ "You created calendar {calendar}" : "Du skapade kalender {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} raderade kalender {calendar}",
+ "You deleted calendar {calendar}" : "Du raderade kalender {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} uppdaterade kalender {calendar}",
+ "You updated calendar {calendar}" : "Du uppdaterade kalender {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} delade kalender {calendar} med dig",
+ "You shared calendar {calendar} with {user}" : "Du delade kalender {calendar} med {user}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} delade kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} slutade dela kalender {calendar} med dig",
+ "You unshared calendar {calendar} from {user}" : "Du slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} slutade dela kalender {calendar} med {user}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} slutade dela kalender {calendar} med sig själv",
+ "You shared calendar {calendar} with group {group}" : "Du delade kalender {calendar} med grupp {group}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} delade kalender {calendar} med grupp {group}",
+ "You unshared calendar {calendar} from group {group}" : "Du slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} slutade dela kalender {calendar} med gruppen {group}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} skapade händelse {event} i kalender {calendar}",
+ "You created event {event} in calendar {calendar}" : "Du skapade händelse {event} i kalender {calendar}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} raderade händelse {event} från kalender {calendar}",
+ "You deleted event {event} from calendar {calendar}" : "Du raderade händelse {event} från kalender {calendar}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} uppdaterade händelse {event} i kalender {calendar}",
+ "You updated event {event} in calendar {calendar}" : "Du uppdaterade händelse {event} i kalender {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} skapade uppgift {todo} i listan {calendar}",
+ "You created todo {todo} in list {calendar}" : "Du skapade uppgift {todo} i listan {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} raderade uppgift {todo} från listan {calendar}",
+ "You deleted todo {todo} from list {calendar}" : "Du raderade uppgift {todo} från listan {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} uppdaterade uppgift {todo} i listan {calendar}",
+ "You updated todo {todo} in list {calendar}" : "Du uppdaterade uppgift {todo} i listan {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} löste uppgift {todo} i listan {calendar}",
+ "You solved todo {todo} in list {calendar}" : "Du löste uppgift {todo} i listan {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} återupptog uppgift {todo} i listan {calendar}",
+ "You reopened todo {todo} in list {calendar}" : "Du återupptog uppgift {todo} i listan {calendar}",
+ "A <strong>calendar</strong> was modified" : "En <strong>kalender</strong> modifierades",
+ "A calendar <strong>event</strong> was modified" : "En kalender-<strong>händelse</strong> modifierades",
+ "A calendar <strong>todo</strong> was modified" : "En kalender <strong>uppgift</strong> modifierades",
+ "Contact birthdays" : "Födelsedagar",
+ "Personal" : "Privat",
"Contacts" : "Kontakter",
"Technical details" : "Tekniska detaljer",
- "Remote Address: %s" : "Fjärradress: %s",
+ "Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/dav/l10n/zh_CN.js b/apps/dav/l10n/zh_CN.js
new file mode 100644
index 00000000000..ab25f50f4d6
--- /dev/null
+++ b/apps/dav/l10n/zh_CN.js
@@ -0,0 +1,49 @@
+OC.L10N.register(
+ "dav",
+ {
+ "Calendar" : "日历",
+ "Todos" : "待办事项",
+ "{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
+ "You created calendar {calendar}" : "您创建的日历 {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} 删除了日历 {calendar}",
+ "You deleted calendar {calendar}" : "您删除的日历 {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} 更新了日历 {calendar}",
+ "You updated calendar {calendar}" : "您更新了日历 {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} 分享给您的日历 {calendar}",
+ "You shared calendar {calendar} with {user}" : "您与 {user} 分享了日历 {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} 与 {user} 分享了日历 {calendar}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} 取消分享 {calendar} 给您",
+ "You unshared calendar {calendar} from {user}" : "您取消分享给 {user} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} 取消分享给 {uesr} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} 取消分享日历 {calendar}",
+ "You shared calendar {calendar} with group {group}" : "您通过组 {group} 分享了日历 {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} 通过组 {group} 分享了日历 {calendar}",
+ "You unshared calendar {calendar} from group {group}" : "您取消分享给组 {group} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} 取消分享给组 {group} 的日历 {calendar}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} 在日历 {calendar} 中创建了事件 {event}",
+ "You created event {event} in calendar {calendar}" : "您在日历 {calendar} 中创建了事件 {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} 在日历 {calendar} 中删除了事件 {event}",
+ "You deleted event {event} from calendar {calendar}" : "您在日历 {calendar} 中删除了事件 {event}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} 在日历 {calendar} 中更新了事件 {event}",
+ "You updated event {event} in calendar {calendar}" : "您在日历 {calendar} 中更新了事件 {event}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中创建了待办事项 {todo}",
+ "You created todo {todo} in list {calendar}" : "您在列表 {calendar} 中创建了待办事项 {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} 在列表 {calendar} 中删除了待办事项 {todo}",
+ "You deleted todo {todo} from list {calendar}" : "您在列表 {calendar} 中删除了待办事项 {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中更新了待办事项 {todo}",
+ "You updated todo {todo} in list {calendar}" : "您在列表 {calendar} 中更新了待办事项 {todo}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中解决了待办事项 {todo}",
+ "You solved todo {todo} in list {calendar}" : "您在列表 {calendar} 中解决了待办事项 {todo}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中重新打开了待办事项 {todo}",
+ "You reopened todo {todo} in list {calendar}" : "您在列表 {calendar} 中重新打开了待办事项 {todo}",
+ "A <strong>calendar</strong> was modified" : "<strong>日历</strong>已经修改",
+ "A calendar <strong>event</strong> was modified" : "日历中<strong>事件</strong>已经修改",
+ "A calendar <strong>todo</strong> was modified" : "列表中<strong>待办事项</strong>已经修改",
+ "Contact birthdays" : "联系人生日",
+ "Personal" : "个人",
+ "Contacts" : "联系人",
+ "Technical details" : "技术细节",
+ "Remote Address: %s" : "远程地址: %s",
+ "Request ID: %s" : "请求 ID: %s"
+},
+"nplurals=1; plural=0;");
diff --git a/apps/dav/l10n/zh_CN.json b/apps/dav/l10n/zh_CN.json
new file mode 100644
index 00000000000..1dd7fde8c00
--- /dev/null
+++ b/apps/dav/l10n/zh_CN.json
@@ -0,0 +1,47 @@
+{ "translations": {
+ "Calendar" : "日历",
+ "Todos" : "待办事项",
+ "{actor} created calendar {calendar}" : "{actor} 创建了日历 {calendar}",
+ "You created calendar {calendar}" : "您创建的日历 {calendar}",
+ "{actor} deleted calendar {calendar}" : "{actor} 删除了日历 {calendar}",
+ "You deleted calendar {calendar}" : "您删除的日历 {calendar}",
+ "{actor} updated calendar {calendar}" : "{actor} 更新了日历 {calendar}",
+ "You updated calendar {calendar}" : "您更新了日历 {calendar}",
+ "{actor} shared calendar {calendar} with you" : "{actor} 分享给您的日历 {calendar}",
+ "You shared calendar {calendar} with {user}" : "您与 {user} 分享了日历 {calendar}",
+ "{actor} shared calendar {calendar} with {user}" : "{actor} 与 {user} 分享了日历 {calendar}",
+ "{actor} unshared calendar {calendar} from you" : "{actor} 取消分享 {calendar} 给您",
+ "You unshared calendar {calendar} from {user}" : "您取消分享给 {user} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from {user}" : "{actor} 取消分享给 {uesr} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from themselves" : "{actor} 取消分享日历 {calendar}",
+ "You shared calendar {calendar} with group {group}" : "您通过组 {group} 分享了日历 {calendar}",
+ "{actor} shared calendar {calendar} with group {group}" : "{actor} 通过组 {group} 分享了日历 {calendar}",
+ "You unshared calendar {calendar} from group {group}" : "您取消分享给组 {group} 的日历 {calendar}",
+ "{actor} unshared calendar {calendar} from group {group}" : "{actor} 取消分享给组 {group} 的日历 {calendar}",
+ "{actor} created event {event} in calendar {calendar}" : "{actor} 在日历 {calendar} 中创建了事件 {event}",
+ "You created event {event} in calendar {calendar}" : "您在日历 {calendar} 中创建了事件 {event}",
+ "{actor} deleted event {event} from calendar {calendar}" : "{actor} 在日历 {calendar} 中删除了事件 {event}",
+ "You deleted event {event} from calendar {calendar}" : "您在日历 {calendar} 中删除了事件 {event}",
+ "{actor} updated event {event} in calendar {calendar}" : "{actor} 在日历 {calendar} 中更新了事件 {event}",
+ "You updated event {event} in calendar {calendar}" : "您在日历 {calendar} 中更新了事件 {event}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中创建了待办事项 {todo}",
+ "You created todo {todo} in list {calendar}" : "您在列表 {calendar} 中创建了待办事项 {todo}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} 在列表 {calendar} 中删除了待办事项 {todo}",
+ "You deleted todo {todo} from list {calendar}" : "您在列表 {calendar} 中删除了待办事项 {todo}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中更新了待办事项 {todo}",
+ "You updated todo {todo} in list {calendar}" : "您在列表 {calendar} 中更新了待办事项 {todo}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中解决了待办事项 {todo}",
+ "You solved todo {todo} in list {calendar}" : "您在列表 {calendar} 中解决了待办事项 {todo}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} 在列表 {calendar} 中重新打开了待办事项 {todo}",
+ "You reopened todo {todo} in list {calendar}" : "您在列表 {calendar} 中重新打开了待办事项 {todo}",
+ "A <strong>calendar</strong> was modified" : "<strong>日历</strong>已经修改",
+ "A calendar <strong>event</strong> was modified" : "日历中<strong>事件</strong>已经修改",
+ "A calendar <strong>todo</strong> was modified" : "列表中<strong>待办事项</strong>已经修改",
+ "Contact birthdays" : "联系人生日",
+ "Personal" : "个人",
+ "Contacts" : "联系人",
+ "Technical details" : "技术细节",
+ "Remote Address: %s" : "远程地址: %s",
+ "Request ID: %s" : "请求 ID: %s"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/apps/dav/lib/CalDAV/Activity/Backend.php b/apps/dav/lib/CalDAV/Activity/Backend.php
index 953fdcea832..f8cc82407fd 100644
--- a/apps/dav/lib/CalDAV/Activity/Backend.php
+++ b/apps/dav/lib/CalDAV/Activity/Backend.php
@@ -103,7 +103,7 @@ class Backend {
}
$principal = explode('/', $calendarData['principaluri']);
- $owner = $principal[2];
+ $owner = array_pop($principal);
$currentUser = $this->userSession->getUser();
if ($currentUser instanceof IUser) {
@@ -369,7 +369,7 @@ class Backend {
}
$principal = explode('/', $calendarData['principaluri']);
- $owner = $principal[2];
+ $owner = array_pop($principal);
$currentUser = $this->userSession->getUser();
if ($currentUser instanceof IUser) {
diff --git a/apps/dav/lib/CalDAV/Activity/Setting/Todo.php b/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
index 0c8215f4843..234774bfea4 100644
--- a/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
+++ b/apps/dav/lib/CalDAV/Activity/Setting/Todo.php
@@ -42,7 +42,7 @@ class Todo implements ISetting {
* @since 11.0.0
*/
public function getIdentifier() {
- return 'calendar_todos';
+ return 'calendar_todo';
}
/**
diff --git a/apps/dav/lib/CalDAV/BirthdayService.php b/apps/dav/lib/CalDAV/BirthdayService.php
index 104eec6b496..702b74bf1b3 100644
--- a/apps/dav/lib/CalDAV/BirthdayService.php
+++ b/apps/dav/lib/CalDAV/BirthdayService.php
@@ -30,6 +30,11 @@ use Exception;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\DAV\GroupPrincipalBackend;
use Sabre\VObject\Component\VCalendar;
+use Sabre\VObject\Component\VCard;
+use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Document;
+use Sabre\VObject\InvalidDataException;
+use Sabre\VObject\Property\VCard\DateAndOrTime;
use Sabre\VObject\Reader;
class BirthdayService {
@@ -129,6 +134,12 @@ class BirthdayService {
}
try {
$doc = Reader::read($cardData);
+ // We're always converting to vCard 4.0 so we can rely on the
+ // VCardConverter handling the X-APPLE-OMIT-YEAR property for us.
+ if (!$doc instanceof VCard) {
+ return null;
+ }
+ $doc = $doc->convert(Document::VCARD40);
} catch (Exception $e) {
return null;
}
@@ -136,21 +147,43 @@ class BirthdayService {
if (!isset($doc->{$dateField})) {
return null;
}
+ if (!isset($doc->FN)) {
+ return null;
+ }
$birthday = $doc->{$dateField};
if (!(string)$birthday) {
return null;
}
- $title = str_replace('{name}',
- strtr((string)$doc->FN, array('\,' => ',', '\;' => ';')),
- '{name}'
- );
+ // Skip if the BDAY property is not of the right type.
+ if (!$birthday instanceof DateAndOrTime) {
+ return null;
+ }
+
+ // Skip if we can't parse the BDAY value.
+ try {
+ $dateParts = DateTimeParser::parseVCardDateTime($birthday->getValue());
+ } catch (InvalidDataException $e) {
+ return null;
+ }
+
+ $unknownYear = false;
+ if (!$dateParts['year']) {
+ $birthday = '1900-' . $dateParts['month'] . '-' . $dateParts['date'];
+
+ $unknownYear = true;
+ }
+
try {
$date = new \DateTime($birthday);
} catch (Exception $e) {
return null;
}
-
- $summary = $title . ' (' . $summarySymbol . $date->format('Y') . ')';
+ if ($unknownYear) {
+ $summary = $doc->FN->getValue() . ' ' . $summarySymbol;
+ } else {
+ $year = (int)$date->format('Y');
+ $summary = $doc->FN->getValue() . " ($summarySymbol$year)";
+ }
$vCal = new VCalendar();
$vCal->VERSION = '2.0';
$vEvent = $vCal->createComponent('VEVENT');
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index d77c761a2cf..dbe86438238 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -131,6 +131,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
/** @var EventDispatcherInterface */
private $dispatcher;
+ /** @var bool */
+ private $legacyEndpoint;
+
/**
* CalDavBackend constructor.
*
@@ -139,18 +142,21 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @param IUserManager $userManager
* @param ISecureRandom $random
* @param EventDispatcherInterface $dispatcher
+ * @param bool $legacyEndpoint
*/
public function __construct(IDBConnection $db,
Principal $principalBackend,
IUserManager $userManager,
ISecureRandom $random,
- EventDispatcherInterface $dispatcher) {
+ EventDispatcherInterface $dispatcher,
+ $legacyEndpoint = false) {
$this->db = $db;
$this->principalBackend = $principalBackend;
$this->userManager = $userManager;
$this->sharingBackend = new Backend($this->db, $principalBackend, 'calendar');
$this->random = $random;
$this->dispatcher = $dispatcher;
+ $this->legacyEndpoint = $legacyEndpoint;
}
/**
@@ -230,12 +236,12 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $this->convertPrincipal($row['principaluri'], false),
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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'),
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $principalUri,
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $this->convertPrincipal($principalUri, !$this->legacyEndpoint),
];
foreach($this->propertyMap as $xmlName=>$dbName) {
@@ -271,7 +277,21 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
->setParameter('principaluri', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
->execute();
+ $readOnlyPropertyName = '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only';
while($row = $result->fetch()) {
+ $readOnly = (int) $row['access'] === Backend::ACCESS_READ;
+ if (isset($calendars[$row['id']])) {
+ if ($readOnly) {
+ // New share can not have more permissions then the old one.
+ continue;
+ }
+ if (isset($calendars[$row['id']][$readOnlyPropertyName]) &&
+ $calendars[$row['id']][$readOnlyPropertyName] === 0) {
+ // Old share is already read-write, no more permissions can be gained
+ continue;
+ }
+ }
+
list(, $name) = URLUtil::splitPath($row['principaluri']);
$uri = $row['uri'] . '_shared_by_' . $name;
$row['displayname'] = $row['displayname'] . ' (' . $this->getUserDisplayName($name) . ')';
@@ -282,22 +302,20 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $uri,
- 'principaluri' => $principalUri,
+ 'principaluri' => $this->convertPrincipal($principalUri, !$this->legacyEndpoint),
'{' . 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'),
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
+ $readOnlyPropertyName => $readOnly,
];
foreach($this->propertyMap as $xmlName=>$dbName) {
$calendar[$xmlName] = $row[$dbName];
}
- if (!isset($calendars[$calendar['id']])) {
- $calendars[$calendar['id']] = $calendar;
- }
+ $calendars[$calendar['id']] = $calendar;
}
$result->closeCursor();
@@ -328,7 +346,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $this->convertPrincipal($row['principaluri'], false),
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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),
@@ -392,12 +410,12 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['publicuri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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'),
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $this->convertPrincipal($row['principaluri'], $this->legacyEndpoint),
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}public' => (int)$row['access'] === self::ACCESS_PUBLIC,
];
@@ -456,12 +474,12 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['publicuri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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'),
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
'{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}public' => (int)$row['access'] === self::ACCESS_PUBLIC,
];
@@ -510,7 +528,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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),
@@ -554,7 +572,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendar = [
'id' => $row['id'],
'uri' => $row['uri'],
- 'principaluri' => $row['principaluri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], !$this->legacyEndpoint),
'{' . 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),
@@ -581,7 +599,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
*/
function createCalendar($principalUri, $calendarUri, array $properties) {
$values = [
- 'principaluri' => $principalUri,
+ 'principaluri' => $this->convertPrincipal($principalUri, true),
'uri' => $calendarUri,
'synctoken' => 1,
'transparent' => 0,
diff --git a/apps/dav/lib/CalDAV/CalendarHome.php b/apps/dav/lib/CalDAV/CalendarHome.php
index f84b0c863c6..7320754e6df 100644
--- a/apps/dav/lib/CalDAV/CalendarHome.php
+++ b/apps/dav/lib/CalDAV/CalendarHome.php
@@ -42,6 +42,13 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
}
/**
+ * @return BackendInterface
+ */
+ public function getCalDAVBackend() {
+ return $this->caldavBackend;
+ }
+
+ /**
* @inheritdoc
*/
function getChildren() {
diff --git a/apps/dav/lib/CalDAV/CalendarObject.php b/apps/dav/lib/CalDAV/CalendarObject.php
index 6d429fa6bf5..c5dc50650af 100644
--- a/apps/dav/lib/CalDAV/CalendarObject.php
+++ b/apps/dav/lib/CalDAV/CalendarObject.php
@@ -1,8 +1,10 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2017, Georg Ehrke
*
* @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license AGPL-3.0
*
@@ -42,7 +44,11 @@ class CalendarObject extends \Sabre\CalDAV\CalendarObject {
}
private function isShared() {
- return isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal']);
+ if (!isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) {
+ return false;
+ }
+
+ return $this->calendarInfo['{http://owncloud.org/ns}owner-principal'] !== $this->calendarInfo['principaluri'];
}
/**
diff --git a/apps/dav/lib/CalDAV/Schedule/Plugin.php b/apps/dav/lib/CalDAV/Schedule/Plugin.php
index ad55a2756b0..34df666637c 100644
--- a/apps/dav/lib/CalDAV/Schedule/Plugin.php
+++ b/apps/dav/lib/CalDAV/Schedule/Plugin.php
@@ -1,7 +1,9 @@
<?php
/**
* @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl>
+ * @copyright Copyright (c) 2016, Joas Schilling <coding@schilljs.com>
*
+ * @author Joas Schilling <coding@schilljs.com>
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @license GNU AGPL version 3 or any later version
@@ -22,9 +24,28 @@
*/
namespace OCA\DAV\CalDAV\Schedule;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\CalDAV\CalendarHome;
+use Sabre\DAV\INode;
+use Sabre\DAV\PropFind;
+use Sabre\DAV\Server;
+use Sabre\DAV\Xml\Property\LocalHref;
+use Sabre\DAVACL\IPrincipal;
+
class Plugin extends \Sabre\CalDAV\Schedule\Plugin {
/**
+ * Initializes the plugin
+ *
+ * @param Server $server
+ * @return void
+ */
+ function initialize(Server $server) {
+ parent::initialize($server);
+ $server->on('propFind', [$this, 'propFindDefaultCalendarUrl'], 90);
+ }
+
+ /**
* Returns a list of addresses that are associated with a principal.
*
* @param string $principal
@@ -39,4 +60,42 @@ class Plugin extends \Sabre\CalDAV\Schedule\Plugin {
return $result;
}
+
+ /**
+ * Always use the personal calendar as target for scheduled events
+ *
+ * @param PropFind $propFind
+ * @param INode $node
+ * @return void
+ */
+ function propFindDefaultCalendarUrl(PropFind $propFind, INode $node) {
+ if ($node instanceof IPrincipal) {
+ $propFind->handle('{' . self::NS_CALDAV . '}schedule-default-calendar-URL', function() use ($node) {
+ /** @var \OCA\DAV\CalDAV\Plugin $caldavPlugin */
+ $caldavPlugin = $this->server->getPlugin('caldav');
+ $principalUrl = $node->getPrincipalUrl();
+
+ $calendarHomePath = $caldavPlugin->getCalendarHomeForPrincipal($principalUrl);
+
+ if (!$calendarHomePath) {
+ return null;
+ }
+
+ /** @var CalendarHome $calendarHome */
+ $calendarHome = $this->server->tree->getNodeForPath($calendarHomePath);
+ if (!$calendarHome->childExists(CalDavBackend::PERSONAL_CALENDAR_URI)) {
+ $calendarHome->getCalDAVBackend()->createCalendar($principalUrl, CalDavBackend::PERSONAL_CALENDAR_URI, [
+ '{DAV:}displayname' => CalDavBackend::PERSONAL_CALENDAR_NAME,
+ ]);
+ }
+
+ $result = $this->server->getPropertiesForPath($calendarHomePath . '/' . CalDavBackend::PERSONAL_CALENDAR_URI, [], 1);
+ if (empty($result)) {
+ return null;
+ }
+
+ return new LocalHref($result[0]['href']);
+ });
+ }
+ }
}
diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php
index a320984c1fe..6f9a73298ef 100644
--- a/apps/dav/lib/CardDAV/CardDavBackend.php
+++ b/apps/dav/lib/CardDAV/CardDavBackend.php
@@ -172,23 +172,63 @@ class CardDavBackend implements BackendInterface, SyncSupport {
->setParameter('principaluri', $principals, IQueryBuilder::PARAM_STR_ARRAY)
->execute();
+ $readOnlyPropertyName = '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only';
while($row = $result->fetch()) {
+ $readOnly = (int) $row['access'] === Backend::ACCESS_READ;
+ if (isset($addressBooks[$row['id']])) {
+ if ($readOnly) {
+ // New share can not have more permissions then the old one.
+ continue;
+ }
+ if (isset($addressBooks[$row['id']][$readOnlyPropertyName]) &&
+ $addressBooks[$row['id']][$readOnlyPropertyName] === 0) {
+ // Old share is already read-write, no more permissions can be gained
+ continue;
+ }
+ }
+
list(, $name) = URLUtil::splitPath($row['principaluri']);
$uri = $row['uri'] . '_shared_by_' . $name;
$displayName = $row['displayname'] . ' (' . $this->getUserDisplayName($name) . ')';
- if (!isset($addressBooks[$row['id']])) {
- $addressBooks[$row['id']] = [
- 'id' => $row['id'],
- 'uri' => $uri,
- 'principaluri' => $principalUri,
- '{DAV:}displayname' => $displayName,
- '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
- '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
- '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
- '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ,
- ];
- }
+
+ $addressBooks[$row['id']] = [
+ 'id' => $row['id'],
+ 'uri' => $uri,
+ 'principaluri' => $principalUriOriginal,
+ '{DAV:}displayname' => $displayName,
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}owner-principal' => $row['principaluri'],
+ $readOnlyPropertyName => $readOnly,
+ ];
+ }
+ $result->closeCursor();
+
+ return array_values($addressBooks);
+ }
+
+ public function getUsersOwnAddressBooks($principalUri) {
+ $principalUriOriginal = $principalUri;
+ $principalUri = $this->convertPrincipal($principalUri, true);
+ $query = $this->db->getQueryBuilder();
+ $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
+ ->from('addressbooks')
+ ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)));
+
+ $addressBooks = [];
+
+ $result = $query->execute();
+ while($row = $result->fetch()) {
+ $addressBooks[$row['id']] = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $this->convertPrincipal($row['principaluri'], false),
+ '{DAV:}displayname' => $row['displayname'],
+ '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
+ '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
+ ];
}
$result->closeCursor();
diff --git a/apps/dav/lib/Connector/LegacyDAVACL.php b/apps/dav/lib/Connector/LegacyDAVACL.php
index 83b08ec44fb..46cbb504cce 100644
--- a/apps/dav/lib/Connector/LegacyDAVACL.php
+++ b/apps/dav/lib/Connector/LegacyDAVACL.php
@@ -33,24 +33,9 @@ use Sabre\DAVACL\Xml\Property\Principal;
class LegacyDAVACL extends DavAclPlugin {
/**
- * Converts the v1 principal `principal/<username>` to the new v2
- * `principal/users/<username>` which is required for permission checks
- *
* @inheritdoc
*/
- function getCurrentUserPrincipal() {
- $principalV1 = parent::getCurrentUserPrincipal();
- if (is_null($principalV1)) {
- return $principalV1;
- }
- return $this->convertPrincipal($principalV1, true);
- }
-
-
- /**
- * @inheritdoc
- */
- function getCurrentUserPrincipals() {
+ public function getCurrentUserPrincipals() {
$principalV2 = $this->getCurrentUserPrincipal();
if (is_null($principalV2)) return [];
@@ -73,7 +58,7 @@ class LegacyDAVACL extends DavAclPlugin {
return "principals/$name";
}
- function propFind(PropFind $propFind, INode $node) {
+ public function propFind(PropFind $propFind, INode $node) {
/* Overload current-user-principal */
$propFind->handle('{DAV:}current-user-principal', function () {
if ($url = parent::getCurrentUserPrincipal()) {
@@ -82,6 +67,7 @@ class LegacyDAVACL extends DavAclPlugin {
return new Principal(Principal::UNAUTHENTICATED);
}
});
- parent::propFind($propFind, $node);
+
+ return parent::propFind($propFind, $node);
}
}
diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php
index 95222dafec9..93d8b14d9c9 100644
--- a/apps/dav/lib/Connector/Sabre/Auth.php
+++ b/apps/dav/lib/Connector/Sabre/Auth.php
@@ -32,7 +32,6 @@
namespace OCA\DAV\Connector\Sabre;
use Exception;
-use OC\AppFramework\Http\Request;
use OC\Authentication\Exceptions\PasswordLoginForbiddenException;
use OC\Authentication\TwoFactorAuth\Manager;
use OC\Security\Bruteforce\Throttler;
@@ -177,9 +176,9 @@ class Auth extends AbstractBasic {
// Official ownCloud clients require no checks
if($this->request->isUserAgent([
- Request::USER_AGENT_OWNCLOUD_DESKTOP,
- Request::USER_AGENT_OWNCLOUD_ANDROID,
- Request::USER_AGENT_OWNCLOUD_IOS,
+ IRequest::USER_AGENT_CLIENT_DESKTOP,
+ IRequest::USER_AGENT_CLIENT_ANDROID,
+ IRequest::USER_AGENT_CLIENT_IOS,
])) {
return false;
}
diff --git a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
index 244394ec6fc..427a3756019 100644
--- a/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/DavAclPlugin.php
@@ -23,6 +23,7 @@
namespace OCA\DAV\Connector\Sabre;
+use Sabre\CalDAV\Principal\User;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile;
use Sabre\DAV\INode;
@@ -72,4 +73,20 @@ class DavAclPlugin extends \Sabre\DAVACL\Plugin {
return $access;
}
+
+ public function propFind(PropFind $propFind, INode $node) {
+ // If the node is neither readable nor writable then fail unless its of
+ // the standard user-principal
+ if(!($node instanceof User)) {
+ $path = $propFind->getPath();
+ $readPermissions = $this->checkPrivileges($path, '{DAV:}read', self::R_PARENT, false);
+ $writePermissions = $this->checkPrivileges($path, '{DAV:}write', self::R_PARENT, false);
+ if ($readPermissions === false && $writePermissions === false) {
+ $this->checkPrivileges($path, '{DAV:}read', self::R_PARENT, true);
+ $this->checkPrivileges($path, '{DAV:}write', self::R_PARENT, true);
+ }
+ }
+
+ return parent::propFind($propFind, $node);
+ }
}
diff --git a/apps/dav/lib/Connector/Sabre/FakeLockerPlugin.php b/apps/dav/lib/Connector/Sabre/FakeLockerPlugin.php
index c330e5d203a..3baacfc064a 100644
--- a/apps/dav/lib/Connector/Sabre/FakeLockerPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FakeLockerPlugin.php
@@ -136,7 +136,9 @@ class FakeLockerPlugin extends ServerPlugin {
new LockDiscovery([$lockInfo])
]);
+ $response->setStatus(200);
$response->setBody($body);
+ $response->setStatus(200);
return false;
}
diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php
index 0e535314c2e..1f878df1564 100644
--- a/apps/dav/lib/Connector/Sabre/File.php
+++ b/apps/dav/lib/Connector/Sabre/File.php
@@ -206,7 +206,12 @@ class File extends Node implements IFile {
// allow sync clients to send the mtime along in a header
$request = \OC::$server->getRequest();
if (isset($request->server['HTTP_X_OC_MTIME'])) {
- if ($this->fileView->touch($this->path, $request->server['HTTP_X_OC_MTIME'])) {
+ $mtimeStr = $request->server['HTTP_X_OC_MTIME'];
+ if (!is_numeric($mtimeStr)) {
+ throw new \InvalidArgumentException('X-OC-Mtime header must be an integer (unix timestamp).');
+ }
+ $mtime = intval($mtimeStr);
+ if ($this->fileView->touch($this->path, $mtime)) {
header('X-OC-MTime: accepted');
}
}
diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
index 59b326243ee..2f86ce5bf41 100644
--- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php
@@ -247,8 +247,10 @@ class FilesPlugin extends ServerPlugin {
$node = $this->tree->getNodeForPath($request->getPath());
if (!($node instanceof IFile)) return;
- // adds a 'Content-Disposition: attachment' header
- if ($this->downloadAttachment) {
+ // adds a 'Content-Disposition: attachment' header in case no disposition
+ // header has been set before
+ if ($this->downloadAttachment &&
+ $response->getHeader('Content-Disposition') === null) {
$filename = $node->getName();
if ($this->request->isUserAgent(
[
@@ -315,17 +317,27 @@ class FilesPlugin extends ServerPlugin {
$propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
$owner = $node->getOwner();
- return $owner->getUID();
+ if (!$owner) {
+ return null;
+ } else {
+ return $owner->getUID();
+ }
});
$propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) {
$owner = $node->getOwner();
- $displayName = $owner->getDisplayName();
- return $displayName;
+ if (!$owner) {
+ return null;
+ } else {
+ return $owner->getDisplayName();
+ }
});
$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
});
+ $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
+ return $node->getSize();
+ });
}
if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
diff --git a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
index bc0c1c2f603..81c082b9105 100644
--- a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
@@ -24,9 +24,7 @@
namespace OCA\DAV\Connector\Sabre;
use OC\Files\View;
-use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\Exception\PreconditionFailed;
-use Sabre\DAV\Exception\ReportNotSupported;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\ServerPlugin;
use Sabre\DAV\Tree;
@@ -105,7 +103,7 @@ class FilesReportPlugin extends ServerPlugin {
* @param ITagManager $fileTagger manager for private tags
* @param IUserSession $userSession
* @param IGroupManager $groupManager
- * @param Folder $userfolder
+ * @param Folder $userFolder
*/
public function __construct(Tree $tree,
View $view,
@@ -161,11 +159,12 @@ class FilesReportPlugin extends ServerPlugin {
* REPORT operations to look for files
*
* @param string $reportName
- * @param [] $report
+ * @param $report
* @param string $uri
* @return bool
- * @throws NotFound
- * @throws ReportNotSupported
+ * @throws BadRequest
+ * @throws PreconditionFailed
+ * @internal param $ [] $report
*/
public function onReport($reportName, $report, $uri) {
$reportTargetNode = $this->server->tree->getNodeForPath($uri);
@@ -232,7 +231,6 @@ class FilesReportPlugin extends ServerPlugin {
private function getFilesBaseUri($uri, $subPath) {
$uri = trim($uri, '/');
$subPath = trim($subPath, '/');
- $filesUri = '';
if (empty($subPath)) {
$filesUri = $uri;
} else {
diff --git a/apps/dav/lib/Connector/Sabre/MaintenancePlugin.php b/apps/dav/lib/Connector/Sabre/MaintenancePlugin.php
index 57284b22445..c305fa63f69 100644
--- a/apps/dav/lib/Connector/Sabre/MaintenancePlugin.php
+++ b/apps/dav/lib/Connector/Sabre/MaintenancePlugin.php
@@ -78,9 +78,6 @@ class MaintenancePlugin extends ServerPlugin {
* @return bool
*/
public function checkMaintenanceMode() {
- if ($this->config->getSystemValue('singleuser', false)) {
- throw new ServiceUnavailable('System in single user mode.');
- }
if ($this->config->getSystemValue('maintenance', false)) {
throw new ServiceUnavailable('System in maintenance mode.');
}
diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php
index a592ed80918..9da416312d0 100644
--- a/apps/dav/lib/Connector/Sabre/Principal.php
+++ b/apps/dav/lib/Connector/Sabre/Principal.php
@@ -150,7 +150,7 @@ class Principal implements BackendInterface {
$groups = $this->groupManager->getUserGroups($user);
$groups = array_map(function($group) {
/** @var IGroup $group */
- return 'principals/groups/' . $group->getGID();
+ return 'principals/groups/' . urlencode($group->getGID());
}, $groups);
return $groups;
diff --git a/apps/dav/lib/Connector/Sabre/TagsPlugin.php b/apps/dav/lib/Connector/Sabre/TagsPlugin.php
index ef6bece58bc..59e4ab4546d 100644
--- a/apps/dav/lib/Connector/Sabre/TagsPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/TagsPlugin.php
@@ -250,7 +250,11 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin
if (is_null($isFav)) {
list(, $isFav) = $this->getTagsAndFav($node->getId());
}
- return $isFav;
+ if ($isFav) {
+ return 1;
+ } else {
+ return 0;
+ }
});
}
diff --git a/apps/dav/lib/DAV/GroupPrincipalBackend.php b/apps/dav/lib/DAV/GroupPrincipalBackend.php
index f8dc1e60881..f6295d3b386 100644
--- a/apps/dav/lib/DAV/GroupPrincipalBackend.php
+++ b/apps/dav/lib/DAV/GroupPrincipalBackend.php
@@ -76,14 +76,14 @@ class GroupPrincipalBackend implements BackendInterface {
* @return array
*/
public function getPrincipalByPath($path) {
- $elements = explode('/', $path);
+ $elements = explode('/', $path, 3);
if ($elements[0] !== 'principals') {
return null;
}
if ($elements[1] !== 'groups') {
return null;
}
- $name = $elements[2];
+ $name = urldecode($elements[2]);
$group = $this->groupManager->get($name);
if (!is_null($group)) {
@@ -179,7 +179,7 @@ class GroupPrincipalBackend implements BackendInterface {
protected function groupToPrincipal($group) {
$groupId = $group->getGID();
$principal = [
- 'uri' => "principals/groups/$groupId",
+ 'uri' => 'principals/groups/' . urlencode($groupId),
'{DAV:}displayname' => $groupId,
];
diff --git a/apps/dav/lib/Files/FileSearchBackend.php b/apps/dav/lib/Files/FileSearchBackend.php
new file mode 100644
index 00000000000..5816c659932
--- /dev/null
+++ b/apps/dav/lib/Files/FileSearchBackend.php
@@ -0,0 +1,277 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @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\Files;
+
+use OC\Files\Search\SearchBinaryOperator;
+use OC\Files\Search\SearchComparison;
+use OC\Files\Search\SearchOrder;
+use OC\Files\Search\SearchQuery;
+use OC\Files\View;
+use OCA\DAV\Connector\Sabre\Directory;
+use OCA\DAV\Connector\Sabre\FilesPlugin;
+use OCA\DAV\Connector\Sabre\TagsPlugin;
+use OCP\Files\Cache\ICacheEntry;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\Node;
+use OCP\Files\Search\ISearchOperator;
+use OCP\Files\Search\ISearchOrder;
+use OCP\Files\Search\ISearchQuery;
+use OCP\IUser;
+use OCP\Share\IManager;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Tree;
+use SearchDAV\Backend\ISearchBackend;
+use SearchDAV\Backend\SearchPropertyDefinition;
+use SearchDAV\Backend\SearchResult;
+use SearchDAV\XML\BasicSearch;
+use SearchDAV\XML\Literal;
+use SearchDAV\XML\Operator;
+use SearchDAV\XML\Order;
+
+class FileSearchBackend implements ISearchBackend {
+ /** @var Tree */
+ private $tree;
+
+ /** @var IUser */
+ private $user;
+
+ /** @var IRootFolder */
+ private $rootFolder;
+
+ /** @var IManager */
+ private $shareManager;
+
+ /** @var View */
+ private $view;
+
+ /**
+ * FileSearchBackend constructor.
+ *
+ * @param Tree $tree
+ * @param IUser $user
+ * @param IRootFolder $rootFolder
+ * @param IManager $shareManager
+ * @param View $view
+ * @internal param IRootFolder $rootFolder
+ */
+ public function __construct(Tree $tree, IUser $user, IRootFolder $rootFolder, IManager $shareManager, View $view) {
+ $this->tree = $tree;
+ $this->user = $user;
+ $this->rootFolder = $rootFolder;
+ $this->shareManager = $shareManager;
+ $this->view = $view;
+ }
+
+ /**
+ * Search endpoint will be remote.php/dav
+ *
+ * @return string
+ */
+ public function getArbiterPath() {
+ return '';
+ }
+
+ public function isValidScope($href, $depth, $path) {
+ // only allow scopes inside the dav server
+ if (is_null($path)) {
+ return false;
+ }
+
+ try {
+ $node = $this->tree->getNodeForPath($path);
+ return $node instanceof Directory;
+ } catch (NotFound $e) {
+ return false;
+ }
+ }
+
+ public function getPropertyDefinitionsForScope($href, $path) {
+ // all valid scopes support the same schema
+
+ //todo dynamically load all propfind properties that are supported
+ return [
+ // queryable properties
+ new SearchPropertyDefinition('{DAV:}displayname', true, false, true),
+ new SearchPropertyDefinition('{DAV:}getcontenttype', true, true, true),
+ new SearchPropertyDefinition('{DAV:}getlastmodified', true, true, true, SearchPropertyDefinition::DATATYPE_DATETIME),
+ new SearchPropertyDefinition(FilesPlugin::SIZE_PROPERTYNAME, true, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
+ new SearchPropertyDefinition(TagsPlugin::FAVORITE_PROPERTYNAME, true, true, true, SearchPropertyDefinition::DATATYPE_BOOLEAN),
+
+ // select only properties
+ new SearchPropertyDefinition('{DAV:}resourcetype', false, true, false),
+ new SearchPropertyDefinition('{DAV:}getcontentlength', false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::CHECKSUMS_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::PERMISSIONS_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::GETETAG_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::OWNER_ID_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME, false, true, false),
+ new SearchPropertyDefinition(FilesPlugin::HAS_PREVIEW_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_BOOLEAN),
+ new SearchPropertyDefinition(FilesPlugin::INTERNAL_FILEID_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
+ new SearchPropertyDefinition(FilesPlugin::FILEID_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
+ ];
+ }
+
+ /**
+ * @param BasicSearch $search
+ * @return SearchResult[]
+ */
+ public function search(BasicSearch $search) {
+ if (count($search->from) !== 1) {
+ throw new \InvalidArgumentException('Searching more than one folder is not supported');
+ }
+ $query = $this->transformQuery($search);
+ $scope = $search->from[0];
+ if ($scope->path === null) {
+ throw new \InvalidArgumentException('Using uri\'s as scope is not supported, please use a path relative to the search arbiter instead');
+ }
+ $node = $this->tree->getNodeForPath($scope->path);
+ if (!$node instanceof Directory) {
+ throw new \InvalidArgumentException('Search is only supported on directories');
+ }
+
+ $fileInfo = $node->getFileInfo();
+ $folder = $this->rootFolder->get($fileInfo->getPath());
+ /** @var Folder $folder $results */
+ $results = $folder->search($query);
+
+ return array_map(function (Node $node) {
+ if ($node instanceof Folder) {
+ return new SearchResult(new \OCA\DAV\Connector\Sabre\Directory($this->view, $node, $this->tree, $this->shareManager), $this->getHrefForNode($node));
+ } else {
+ return new SearchResult(new \OCA\DAV\Connector\Sabre\File($this->view, $node, $this->shareManager), $this->getHrefForNode($node));
+ }
+ }, $results);
+ }
+
+ /**
+ * @param Node $node
+ * @return string
+ */
+ private function getHrefForNode(Node $node) {
+ $base = '/files/' . $this->user->getUID();
+ return $base . $this->view->getRelativePath($node->getPath());
+ }
+
+ /**
+ * @param BasicSearch $query
+ * @return ISearchQuery
+ */
+ private function transformQuery(BasicSearch $query) {
+ // TODO offset, limit
+ $orders = array_map([$this, 'mapSearchOrder'], $query->orderBy);
+ return new SearchQuery($this->transformSearchOperation($query->where), 0, 0, $orders, $this->user);
+ }
+
+ /**
+ * @param Order $order
+ * @return ISearchOrder
+ */
+ private function mapSearchOrder(Order $order) {
+ return new SearchOrder($order->order === Order::ASC ? ISearchOrder::DIRECTION_ASCENDING : ISearchOrder::DIRECTION_DESCENDING, $this->mapPropertyNameToColumn($order->property));
+ }
+
+ /**
+ * @param Operator $operator
+ * @return ISearchOperator
+ */
+ private function transformSearchOperation(Operator $operator) {
+ list(, $trimmedType) = explode('}', $operator->type);
+ switch ($operator->type) {
+ case Operator::OPERATION_AND:
+ case Operator::OPERATION_OR:
+ case Operator::OPERATION_NOT:
+ $arguments = array_map([$this, 'transformSearchOperation'], $operator->arguments);
+ return new SearchBinaryOperator($trimmedType, $arguments);
+ case Operator::OPERATION_EQUAL:
+ case Operator::OPERATION_GREATER_OR_EQUAL_THAN:
+ case Operator::OPERATION_GREATER_THAN:
+ case Operator::OPERATION_LESS_OR_EQUAL_THAN:
+ case Operator::OPERATION_LESS_THAN:
+ case Operator::OPERATION_IS_LIKE:
+ if (count($operator->arguments) !== 2) {
+ throw new \InvalidArgumentException('Invalid number of arguments for ' . $trimmedType . ' operation');
+ }
+ if (!is_string($operator->arguments[0])) {
+ throw new \InvalidArgumentException('Invalid argument 1 for ' . $trimmedType . ' operation, expected property');
+ }
+ if (!($operator->arguments[1] instanceof Literal)) {
+ throw new \InvalidArgumentException('Invalid argument 2 for ' . $trimmedType . ' operation, expected literal');
+ }
+ return new SearchComparison($trimmedType, $this->mapPropertyNameToColumn($operator->arguments[0]), $this->castValue($operator->arguments[0], $operator->arguments[1]->value));
+ case Operator::OPERATION_IS_COLLECTION:
+ return new SearchComparison('eq', 'mimetype', ICacheEntry::DIRECTORY_MIMETYPE);
+ default:
+ throw new \InvalidArgumentException('Unsupported operation ' . $trimmedType. ' (' . $operator->type . ')');
+ }
+ }
+
+ /**
+ * @param string $propertyName
+ * @return string
+ */
+ private function mapPropertyNameToColumn($propertyName) {
+ switch ($propertyName) {
+ case '{DAV:}displayname':
+ return 'name';
+ case '{DAV:}getcontenttype':
+ return 'mimetype';
+ case '{DAV:}getlastmodified':
+ return 'mtime';
+ case FilesPlugin::SIZE_PROPERTYNAME:
+ return 'size';
+ case TagsPlugin::FAVORITE_PROPERTYNAME:
+ return 'favorite';
+ case TagsPlugin::TAGS_PROPERTYNAME:
+ return 'tagname';
+ default:
+ throw new \InvalidArgumentException('Unsupported property for search or order: ' . $propertyName);
+ }
+ }
+
+ private function castValue($propertyName, $value) {
+ $allProps = $this->getPropertyDefinitionsForScope('', '');
+ foreach ($allProps as $prop) {
+ if ($prop->name === $propertyName) {
+ $dataType = $prop->dataType;
+ switch ($dataType) {
+ case SearchPropertyDefinition::DATATYPE_BOOLEAN:
+ return $value === 'yes';
+ case SearchPropertyDefinition::DATATYPE_DECIMAL:
+ case SearchPropertyDefinition::DATATYPE_INTEGER:
+ case SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER:
+ return 0 + $value;
+ case SearchPropertyDefinition::DATATYPE_DATETIME:
+ if (is_numeric($value)) {
+ return 0 + $value;
+ }
+ $date = \DateTime::createFromFormat(\DateTime::ATOM, $value);
+ return ($date instanceof \DateTime) ? $date->getTimestamp() : 0;
+ default:
+ return $value;
+ }
+ }
+ }
+ return $value;
+ }
+}
diff --git a/apps/dav/lib/Files/RootCollection.php b/apps/dav/lib/Files/RootCollection.php
index 345015530e2..c73d7c175ce 100644
--- a/apps/dav/lib/Files/RootCollection.php
+++ b/apps/dav/lib/Files/RootCollection.php
@@ -21,6 +21,7 @@
*/
namespace OCA\DAV\Files;
+use Sabre\DAV\INode;
use Sabre\DAVACL\AbstractPrincipalCollection;
use Sabre\HTTP\URLUtil;
use Sabre\DAV\SimpleCollection;
diff --git a/apps/dav/lib/HookManager.php b/apps/dav/lib/HookManager.php
index 26f3895a459..8148df2d37b 100644
--- a/apps/dav/lib/HookManager.php
+++ b/apps/dav/lib/HookManager.php
@@ -96,7 +96,7 @@ class HookManager {
$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);
+ $this->addressBooksToDelete = $this->cardDav->getUsersOwnAddressBooks('principals/users/' . $uid);
}
public function postDeleteUser($params) {
diff --git a/apps/dav/lib/Migration/ValueFix.php b/apps/dav/lib/Migration/ValueFix.php
new file mode 100644
index 00000000000..2ad043b409d
--- /dev/null
+++ b/apps/dav/lib/Migration/ValueFix.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\Migration;
+
+use OC\BackgroundJob\QueuedJob;
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCP\ILogger;
+use Sabre\VObject\InvalidDataException;
+
+class ValueFix extends QueuedJob {
+
+ /** @var CalDavBackend */
+ private $calDavBackend;
+
+ /** @var ILogger */
+ private $logger;
+
+ public function __construct(CalDavBackend $calDavBackend, ILogger $logger) {
+ $this->calDavBackend = $calDavBackend;
+ $this->logger = $logger;
+ }
+
+ public function run($argument) {
+ $user = $argument['user'];
+
+ $pattern = '/;VALUE=:/';
+ $principal = 'principals/users/' . $user;
+ $calendars = $this->calDavBackend->getCalendarsForUser($principal);
+ foreach ($calendars as $calendar) {
+ $objects = $this->calDavBackend->getCalendarObjects($calendar['id']);
+ foreach ($objects as $object) {
+ $calObject = $this->calDavBackend->getCalendarObject($calendar['id'], $object['uri']);
+ $data = preg_replace($pattern, ':', $calObject['calendardata']);
+ if ($data !== $calObject['calendardata']) {
+ try {
+ $this->calDavBackend->getDenormalizedData($data);
+ } catch (InvalidDataException $e) {
+ $this->logger->info('Calendar object for calendar {cal} with uri {uri} still invalid', [
+ 'app'=> 'dav',
+ 'cal' => $calendar['id'],
+ 'uri' => $object['uri'],
+ ]);
+ continue;
+ }
+ $this->calDavBackend->updateCalendarObject($calendar['id'], $object['uri'], $data);
+ }
+ }
+ }
+ }
+
+}
diff --git a/apps/dav/lib/Migration/ValueFixInsert.php b/apps/dav/lib/Migration/ValueFixInsert.php
new file mode 100644
index 00000000000..25917691b20
--- /dev/null
+++ b/apps/dav/lib/Migration/ValueFixInsert.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\Migration;
+
+use OCP\BackgroundJob\IJobList;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+class ValueFixInsert implements IRepairStep {
+
+ /** @var IUserManager */
+ private $userManager;
+
+ /** @var IJobList */
+ private $jobList;
+
+ /** @var IConfig */
+ private $config;
+
+ public function __construct(IUserManager $userManager,
+ IJobList $jobList,
+ IConfig $config) {
+ $this->userManager = $userManager;
+ $this->jobList = $jobList;
+ $this->config = $config;
+ }
+
+ public function getName() {
+ return 'Insert ValueFix background job for each user';
+ }
+
+ public function run(IOutput $output) {
+ if ($this->config->getAppValue('dav', self::class . '_ran', 'false') !== 'true') {
+ $this->userManager->callForSeenUsers(function (IUser $user) {
+ $this->jobList->add(ValueFix::class, ['user' => $user->getUID()]);
+ });
+ $this->config->setAppValue('dav', self::class . '_ran', 'true');
+ }
+ }
+}
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index 1205d018241..031bc1d3d81 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -33,11 +33,14 @@ use OCA\DAV\CardDAV\ImageExportPlugin;
use OCA\DAV\Comments\CommentsPlugin;
use OCA\DAV\Connector\Sabre\Auth;
use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin;
+use OCA\DAV\Connector\Sabre\CommentPropertiesPlugin;
use OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin;
use OCA\DAV\Connector\Sabre\DavAclPlugin;
use OCA\DAV\Connector\Sabre\DummyGetResponsePlugin;
use OCA\DAV\Connector\Sabre\FakeLockerPlugin;
use OCA\DAV\Connector\Sabre\FilesPlugin;
+use OCA\DAV\Connector\Sabre\FilesReportPlugin;
+use OCA\DAV\Connector\Sabre\SharesPlugin;
use OCA\DAV\DAV\PublicAuth;
use OCA\DAV\Connector\Sabre\QuotaPlugin;
use OCA\DAV\Files\BrowserErrorPagePlugin;
@@ -48,6 +51,7 @@ use OCP\SabrePluginEvent;
use Sabre\CardDAV\VCFExportPlugin;
use Sabre\DAV\Auth\Plugin;
use OCA\DAV\Connector\Sabre\TagsPlugin;
+use SearchDAV\DAV\SearchPlugin;
class Server {
@@ -85,7 +89,6 @@ class Server {
$this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig()));
$authPlugin = new Plugin();
- $authPlugin->addBackend($authBackend);
$authPlugin->addBackend(new PublicAuth());
$this->server->addPlugin($authPlugin);
@@ -153,6 +156,7 @@ class Server {
if($request->isUserAgent([
'/WebDAVFS/',
'/Microsoft Office OneNote 2013/',
+ '/^Microsoft-WebDAV/',// Microsoft-WebDAV-MiniRedir/6.1.7601
])) {
$this->server->addPlugin(new FakeLockerPlugin());
}
@@ -166,7 +170,7 @@ class Server {
// custom properties plugin must be the last one
$userSession = \OC::$server->getUserSession();
$user = $userSession->getUser();
- if (!is_null($user)) {
+ if ($user !== null) {
$view = \OC\Files\Filesystem::getView();
$this->server->addPlugin(
new FilesPlugin(
@@ -188,9 +192,10 @@ class Server {
)
)
);
- $this->server->addPlugin(
- new QuotaPlugin($view)
- );
+ if ($view !== null) {
+ $this->server->addPlugin(
+ new QuotaPlugin($view));
+ }
$this->server->addPlugin(
new TagsPlugin(
$this->server->tree, \OC::$server->getTagManager()
@@ -198,28 +203,36 @@ class Server {
);
// TODO: switch to LazyUserFolder
$userFolder = \OC::$server->getUserFolder();
- $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\SharesPlugin(
+ $this->server->addPlugin(new SharesPlugin(
$this->server->tree,
$userSession,
$userFolder,
\OC::$server->getShareManager()
));
- $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin(
+ $this->server->addPlugin(new CommentPropertiesPlugin(
\OC::$server->getCommentsManager(),
$userSession
));
- $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesReportPlugin(
- $this->server->tree,
- $view,
- \OC::$server->getSystemTagManager(),
- \OC::$server->getSystemTagObjectMapper(),
- \OC::$server->getTagManager(),
- $userSession,
- \OC::$server->getGroupManager(),
- $userFolder
- ));
+ if ($view !== null) {
+ $this->server->addPlugin(new FilesReportPlugin(
+ $this->server->tree,
+ $view,
+ \OC::$server->getSystemTagManager(),
+ \OC::$server->getSystemTagObjectMapper(),
+ \OC::$server->getTagManager(),
+ $userSession,
+ \OC::$server->getGroupManager(),
+ $userFolder
+ ));
+ $this->server->addPlugin(new SearchPlugin(new \OCA\DAV\Files\FileSearchBackend(
+ $this->server->tree,
+ $user,
+ \OC::$server->getRootFolder(),
+ \OC::$server->getShareManager(),
+ $view
+ )));
+ }
}
- $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin());
});
}
diff --git a/apps/dav/lib/SystemTag/SystemTagNode.php b/apps/dav/lib/SystemTag/SystemTagNode.php
index 36fddcd8240..bd21082f783 100644
--- a/apps/dav/lib/SystemTag/SystemTagNode.php
+++ b/apps/dav/lib/SystemTag/SystemTagNode.php
@@ -157,12 +157,13 @@ class SystemTagNode implements \Sabre\DAV\INode {
public function delete() {
try {
+ if (!$this->isAdmin) {
+ throw new Forbidden('No permission to delete tag ' . $this->tag->getId());
+ }
+
if (!$this->tagManager->canUserSeeTag($this->tag, $this->user)) {
throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found');
}
- if (!$this->tagManager->canUserAssignTag($this->tag, $this->user)) {
- throw new Forbidden('No permission to delete tag ' . $this->tag->getId());
- }
$this->tagManager->deleteTags($this->tag->getId());
} catch (TagNotFoundException $e) {
diff --git a/apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php b/apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php
index ab0b7734258..124ed6184c1 100644
--- a/apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php
+++ b/apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php
@@ -192,7 +192,7 @@ class SystemTagsObjectMappingCollection implements ICollection {
*
* @param ISystemTag $tag
*
- * @return SystemTagNode
+ * @return SystemTagMappingNode
*/
private function makeNode(ISystemTag $tag) {
return new SystemTagMappingNode(
diff --git a/apps/dav/tests/travis/caldav/script.sh b/apps/dav/tests/travis/caldav/script-new-endpoint.sh
index 636235349c5..c9bb7307c7c 100644
--- a/apps/dav/tests/travis/caldav/script.sh
+++ b/apps/dav/tests/travis/caldav/script-new-endpoint.sh
@@ -2,6 +2,9 @@
SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`
+# Move the endpoint to the serverinfo file
+cp "$SCRIPTPATH/../caldavtest/serverinfo-new-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml"
+
# start the server
php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." &
diff --git a/apps/dav/tests/travis/caldav/script-old-endpoint.sh b/apps/dav/tests/travis/caldav/script-old-endpoint.sh
new file mode 100644
index 00000000000..6e08f27310b
--- /dev/null
+++ b/apps/dav/tests/travis/caldav/script-old-endpoint.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+SCRIPT=`realpath $0`
+SCRIPTPATH=`dirname $SCRIPT`
+
+# Move the endpoint to the serverinfo file
+cp "$SCRIPTPATH/../caldavtest/serverinfo-old-caldav-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml"
+
+# start the server
+php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." &
+
+sleep 30
+
+# run the tests
+cd "$SCRIPTPATH/CalDAVTester"
+PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \
+ "CalDAV/current-user-principal.xml" \
+ "CalDAV/sync-report.xml"
+
+RESULT=$?
+
+tail "$/../../../../../data-autotest/nextcloud.log"
+
+exit $RESULT
diff --git a/apps/dav/tests/travis/caldavtest/serverinfo.xml b/apps/dav/tests/travis/caldavtest/serverinfo-new-endpoint.xml
index c3ba99ee03d..c3ba99ee03d 100644
--- a/apps/dav/tests/travis/caldavtest/serverinfo.xml
+++ b/apps/dav/tests/travis/caldavtest/serverinfo-new-endpoint.xml
diff --git a/apps/dav/tests/travis/caldavtest/serverinfo-old-caldav-endpoint.xml b/apps/dav/tests/travis/caldavtest/serverinfo-old-caldav-endpoint.xml
new file mode 100644
index 00000000000..8ac822d8e4e
--- /dev/null
+++ b/apps/dav/tests/travis/caldavtest/serverinfo-old-caldav-endpoint.xml
@@ -0,0 +1,850 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE serverinfo SYSTEM
+ "/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/serverinfo.dtd">
+
+<!--
+ Copyright (c) 2006-2015 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<serverinfo>
+ <host>localhost</host>
+ <nonsslport>8888</nonsslport>
+ <authtype>basic</authtype>
+ <!-- <unix>/tmp/caldavd_requests/unsecured.sock</unix> -->
+
+ <waitcount>120</waitcount>
+ <waitdelay>0.25</waitdelay>
+ <waitsuccess>30</waitsuccess>
+
+ <features>
+ <!-- Generic WebDAV extensions -->
+ <feature>COPY Method</feature> <!-- COPY method -->
+ <feature>MOVE Method</feature> <!-- MOVE method -->
+ <feature>Extended MKCOL</feature> <!-- Extended MKCOL -->
+
+ <!-- ACL related -->
+ <feature>ACL Method</feature> <!-- ACL method -->
+ <feature>acl-principal-prop-set REPORT</feature> <!-- ACL acl-principal-prop-set REPORT -->
+ <feature>principal-match REPORT</feature> <!-- ACL principal-match REPORT -->
+ <feature>principal-property-search REPORT</feature> <!-- ACL principal-property-search REPORT -->
+ <feature>principal-search-property-set REPORT</feature> <!-- ACL principal-search-property-set REPORT -->
+ <feature>calendarserver-principal-search REPORT</feature> <!-- ACL calendarserver-principal-search REPORT -->
+
+ <feature>add-member</feature> <!-- Add-member used to create resources -->
+ <!-- <feature>auth-on-root</feature> --> <!-- Whether the server requires authentication on the root URI -->
+ <feature>brief</feature> <!-- Brief header for PROPFIND, REPORT -->
+ <feature>bulk-post</feature> <!-- Bulk POST requests -->
+ <feature>ctag</feature> <!-- ctag extension -->
+ <feature>current-user-principal</feature> <!-- current-user-principal extension -->
+ <feature>directory listing</feature> <!-- GET on collection -->
+ <feature>extended-principal-search</feature> <!-- Extended principal-property-search REPORT extension -->
+ <feature>expand-property</feature> <!-- Expand property REPORT -->
+ <feature>only-proxy-groups</feature> <!-- Group-membership only includes delegated-to groups -->
+ <feature>limits</feature> <!-- max-collections and max-resources limits -->
+ <feature>own-root</feature> <!-- / is owned by this service -->
+ <feature>prefer</feature> <!-- Prefer header overall support -->
+ <feature>prefer-minimal</feature> <!-- Prefer header return=minimal -->
+ <feature>prefer-representation</feature> <!-- Prefer header return=representation -->
+ <feature>prefer-noroot</feature> <!-- Prefer header depth-noroot -->
+ <feature>quota</feature> <!-- WebDAV QUOTA -->
+ <!-- <feature>quota-on-resources</feature> --> <!-- WebDAV QUOTA on calendar and address book object resources -->
+ <feature>resource-id</feature> <!-- WebDAV BIND DAV:resource-id property -->
+ <feature>sync-report</feature> <!-- WebDAV collection sync REPORT -->
+ <!-- <feature>sync-report-limit</feature> --> <!-- WebDAV collection sync REPORT DAV:limit support -->
+ <!--<feature>sync-report-home</feature> &lt;!&ndash; WebDAV collection sync REPORT on Homes &ndash;&gt;-->
+ <feature>sync-report-config-token</feature> <!-- Sync REPORT token includes configuration component -->
+ <feature>well-known</feature> <!-- well-known feature -->
+
+ <!-- <feature>per-object-ACLs</feature> --> <!-- ACL for objects in calendar/address books -->
+ <!-- <feature>regular-collection</feature> --> <!-- Regular collections allowed in calendar/address book homes -->
+
+ <feature>json-data</feature> <!-- jCal and jCard support -->
+
+ <!-- CalendarServer specific extensions -->
+ <feature>control-api</feature> <!-- Control API support -->
+
+ <!-- CalDAV specific extension -->
+ <feature>caldav</feature> <!-- Basic CalDAV feature enabler -->
+ <feature>attachments-collection</feature> <!-- Server uses a collection in same WebDAV tree to store attachments -->
+ <feature>auto-accept</feature> <!-- Auto-accept for rooms & locations -->
+ <feature>auto-accept-modes</feature> <!-- Auto-accept modes -->
+ <feature>client-fix-TRANSP</feature> <!-- fix client TRANSP -->
+ <!-- <feature>dropbox</feature> --> <!-- dropbox extension -->
+ <feature>default-alarms</feature> <!-- default alarms extension -->
+ <feature>EMAIL parameter</feature> <!-- Server normalizes cuaddress and adds EMAIL parameter -->
+ <feature>extended-freebusy</feature> <!-- Extended freebusy response -->
+ <feature>freebusy-url</feature> <!-- Freebusy URL -->
+ <feature>group-attendee-expansion</feature> <!-- Auto-expansion of group attendees -->
+ <feature>implicit-scheduling</feature> <!-- CalDAV scheduling - implicit -->
+ <feature>location-resource-tracking</feature> <!-- Server tracks who makes unscheduled changes to locations and resources -->
+ <feature>managed-attachments</feature> <!-- CalDAV Managed Attachments -->
+ <feature>maskuid</feature> <!-- maskuid extension -->
+ <feature>no-duplicate-uids</feature> <!-- duplicate UIDs in same home not supported -->
+ <feature>partstat-timestamp</feature> <!-- Time stamps when PARTSTAT changes extension -->
+ <!-- <feature>podding</feature> --> <!-- Podded server -->
+ <feature>private-comments</feature> <!-- private-comments extension -->
+ <feature>private-events</feature> <!-- private-events extension -->
+ <feature>proxy</feature> <!-- calendar-user-proxy extension -->
+ <!-- <feature>proxy-authz</feature> --> <!-- sudo user extension -->
+ <feature>recurrence-splitting</feature> <!-- Recurring components can be split -->
+ <feature>remove-duplicate-alarms</feature> <!-- Server removes any duplicate alarms on PUT -->
+ <feature>query-extended</feature> <!-- calendar-query-extended extension -->
+ <feature>shared-calendars</feature> <!-- Shared calendars extension -->
+ <feature>share-calendars-to-groups</feature> <!-- Share calendars to groups extension -->
+ <feature>schedule-changes</feature> <!-- schedule-changes property extension -->
+ <feature>split-calendars</feature> <!-- Calendars are split by component type -->
+ <feature>supported-component-sets</feature> <!-- CALDAV:supported-calendar-component-sets on calendar homes -->
+ <feature>supported-component-sets-one</feature> <!-- Only single component calendars allowed to be created -->
+ <feature>timerange-low-limit</feature> <!-- Time-range only valid one year back -->
+ <feature>timerange-high-limit</feature> <!-- Time-range only valid 5 years ahead -->
+ <feature>timezones-by-reference</feature> <!-- Timezones by reference enabled -->
+ <feature>timezone-service</feature> <!-- Timezone service extension for Wiki -->
+ <feature>timezone-std-service</feature> <!-- Timezone standard service extension -->
+ <!-- <feature>trash-collection</feature> --> <!-- Trash collection enabled -->
+ <feature>travel-time-busy</feature> <!-- Travel time appears as busy -->
+ <feature>vavailability</feature> <!-- VAVAILABILITY on inbox -->
+ <!-- <feature>vpoll</feature> --> <!-- VPOLL support for store and scheduling -->
+ <feature>webcal</feature> <!-- Internet calendar subscription via GET on calendar collection -->
+
+ <!-- CardDAV specific extension -->
+ <feature>carddav</feature> <!-- Basic CardDAV feature enabler -->
+ <feature>default-addressbook</feature> <!-- Default address book behavior -->
+ <feature>shared-addressbooks</feature> <!-- Shared address books extension -->
+ <feature>shared-addressbook-groups</feature> <!-- Shared address book groups extension -->
+ <feature>directory-gateway</feature> <!-- Directory gateway extension -->
+
+ </features>
+
+ <substitutions>
+ <!-- Useful xpath shortcuts for verifiers -->
+ <substitution>
+ <key>$multistatus-response-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response</value>
+ </substitution>
+ <substitution>
+ <key>$multistatus-href-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}href</value>
+ </substitution>
+ <substitution>
+ <key>$verify-response-prefix:</key>
+ <value>{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-property-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-bad-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}status</value>
+ </substitution>
+ <substitution>
+ <key>$verify-error-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}error</value>
+ </substitution>
+ <substitution>
+ <key>$CALDAV:</key>
+ <value>urn:ietf:params:xml:ns:caldav</value>
+ </substitution>
+ <substitution>
+ <key>$CARDDAV:</key>
+ <value>urn:ietf:params:xml:ns:carddav</value>
+ </substitution>
+ <substitution>
+ <key>$CS:</key>
+ <value>http://calendarserver.org/ns/</value>
+ </substitution>
+
+ <!-- Server configuration settings -->
+ <!-- $host: and $hostssl: are implicitly added by CalDAVTester based
+ on the host/nonsslport/sslport values and ssl command line switch -->
+
+ <!-- relative path to caldav root-->
+ <substitution>
+ <key>$root:</key>
+ <value>/remote.php/caldav/</value>
+ </substitution>
+
+ <!-- relative path to main principal collection-->
+ <substitution>
+ <key>$principalcollection:</key>
+ <value>$root:principals/</value>
+ </substitution>
+
+ <!-- the core recored type collections-->
+ <substitution>
+ <key>$uidstype:</key>
+ <value>__uids__</value>
+ </substitution>
+ <substitution>
+ <key>$groupstype:</key>
+ <value>groups</value>
+ </substitution>
+ <substitution>
+ <key>$locationstype:</key>
+ <value>locations</value>
+ </substitution>
+ <substitution>
+ <key>$resourcestype:</key>
+ <value>resources</value>
+ </substitution>
+
+ <!-- relative path to record type principal collections-->
+ <substitution>
+ <key>$principals_uids:</key>
+ <value>$principalcollection:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_users:</key>
+ <value>$principalcollection:</value>
+ </substitution>
+ <substitution>
+ <key>$principals_groups:</key>
+ <value>$principalcollection:$groupstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_resources:</key>
+ <value>$principalcollection:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_locations:</key>
+ <value>$principalcollection:$locationstype:/</value>
+ </substitution>
+
+ <!-- relative path to calendars collection-->
+ <substitution>
+ <key>$calendars:</key>
+ <value>$root:calendars/</value>
+ </substitution>
+
+ <!-- relative path to record type calendar collections-->
+ <substitution>
+ <key>$calendars_uids:</key>
+ <value>$calendars:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_users:</key>
+ <value>$calendars:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_resources:</key>
+ <value>$calendars:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_locations:</key>
+ <value>$calendars:$locationstype:/</value>
+ </substitution>
+
+ <!-- primary calendar name-->
+ <substitution>
+ <key>$calendar:</key>
+ <value>calendar</value>
+ </substitution>
+
+ <!-- primary tasks-only calendar name-->
+ <substitution>
+ <key>$tasks:</key>
+ <value>tasks</value>
+ </substitution>
+
+ <!-- primary polls-only calendar name-->
+ <substitution>
+ <key>$polls:</key>
+ <value>polls</value>
+ </substitution>
+
+ <!-- inbox name-->
+ <substitution>
+ <key>$inbox:</key>
+ <value>inbox</value>
+ </substitution>
+
+ <!-- outbox name-->
+ <substitution>
+ <key>$outbox:</key>
+ <value>outbox</value>
+ </substitution>
+
+ <!-- dropbox name-->
+ <substitution>
+ <key>$dropbox:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- attachments name-->
+ <substitution>
+ <key>$attachments:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- notification name-->
+ <substitution>
+ <key>$notification:</key>
+ <value>notification</value>
+ </substitution>
+
+ <!-- freebusy name-->
+ <substitution>
+ <key>$freebusy:</key>
+ <value>freebusy</value>
+ </substitution>
+
+ <!-- Sync home collection items - use "-" to include the home resource-->
+ <substitution>
+ <key>$calendar_home_items_initial_sync:</key>
+ <value>[-,$calendar:/,$tasks:/,$inbox:/,$outbox:/,$freebusy:,$notification:/]</value>
+ </substitution>
+
+ <!-- Sync collection extra items - use "-" to include the collection-->
+ <substitution>
+ <key>$calendar_sync_extra_items:</key>
+ <value>[-]</value>
+ </substitution>
+
+ <!-- Sync collection extra count - gets added to the totalcount value-->
+ <substitution>
+ <key>$calendar_sync_extra_count:</key>
+ <value>1</value> <!-- the request-uri resource is returned when no token passed-->
+ </substitution>
+
+ <!-- server-to-server inbox-->
+ <substitution>
+ <key>$servertoserver:</key>
+ <value>$root:inbox</value>
+ </substitution>
+
+ <!-- timezone service-->
+ <substitution>
+ <key>$timezoneservice:</key>
+ <value>$root:timezones</value>
+ </substitution>
+
+ <!-- timezone std service-->
+ <substitution>
+ <key>$timezonestdservice:</key>
+ <value>$root:stdtimezones</value>
+ </substitution>
+
+ <!-- relative path to addressbooks collection-->
+ <substitution>
+ <key>$addressbooks:</key>
+ <value>$root:addressbooks/</value>
+ </substitution>
+
+ <!-- relative path to record type addressbook collections-->
+ <substitution>
+ <key>$addressbooks_uids:</key>
+ <value>$addressbooks:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$addressbooks_users:</key>
+ <value>$addressbooks:/</value>
+ </substitution>
+
+ <!-- primary addressbook name -->
+ <substitution>
+ <key>$addressbook:</key>
+ <value>addressbook</value>
+ </substitution>
+
+ <!-- directory name -->
+ <substitution>
+ <key>$directory:</key>
+ <value>$root:directory/</value>
+ </substitution>
+
+ <!-- POST add-member URI suffix -->
+ <substitution>
+ <key>$add-member:</key>
+ <value>;add-member</value>
+ </substitution>
+
+ <!-- user id for admin user -->
+ <substitution>
+ <key>$useradmin:</key>
+ <value>admin</value>
+ </substitution>
+ <!-- guid for admin user -->
+ <substitution>
+ <key>$useradminguid:</key>
+ <value>0C8BDE62-E600-4696-83D3-8B5ECABDFD2E</value>
+ </substitution>
+ <!-- password for admin user -->
+ <substitution>
+ <key>$pswdadmin:</key>
+ <value>admin</value>
+ </substitution>
+
+ <!-- relative path to admin principal resource-->
+ <substitution>
+ <key>$principal_admin:</key>
+ <value>$principals_users:$useradmin:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_admin:</key>
+ <value>$principals_uids:$useradminguid:/</value>
+ </substitution>
+
+ <!-- user id for apprentice user -->
+ <substitution>
+ <key>$userapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+ <!-- guid for apprentice user -->
+ <substitution>
+ <key>$userapprenticeguid:</key>
+ <value>29B6C503-11DF-43EC-8CCA-40C7003149CE</value>
+ </substitution>
+ <!-- password for admin user -->
+ <substitution>
+ <key>$pswdapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+
+ <!-- relative path to apprentice principal resource-->
+ <substitution>
+ <key>$principal_apprentice:</key>
+ <value>$principals_users:$userapprentice:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_apprentice:</key>
+ <value>$principals_uids:$userapprenticeguid:/</value>
+ </substitution>
+
+ <!-- user id for proxy user -->
+ <substitution>
+ <key>$userproxy:</key>
+ <value>superuser</value>
+ </substitution>
+ <!-- password for proxy user -->
+ <substitution>
+ <key>$pswdproxy:</key>
+ <value>superuser</value>
+ </substitution>
+
+ <!-- Forty user accounts -->
+ <repeat count="40">
+ <!-- user id -->
+ <substitution>
+ <key>$userid%d:</key>
+ <value>user%02d</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$userguid%d:</key>
+ <value>10000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$username%d:</key>
+ <value>User %02d</value>
+ </substitution>
+ <!-- user name URI encoded -->
+ <substitution>
+ <key>$username-encoded%d:</key>
+ <value>User%%20%02d</value>
+ </substitution>
+ <!-- first name -->
+ <substitution>
+ <key>$firstname%d:</key>
+ <value>User</value>
+ </substitution>
+ <!-- last name -->
+ <substitution>
+ <key>$lastname%d:</key>
+ <value>%02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$pswd%d:</key>
+ <value>user%02d</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$principal%d:</key>
+ <value>$principals_users:$userid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri%d:</key>
+ <value>$principals_users:$userid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principal%dnoslash:</key>
+ <value>$principals_users:$userid%d:</value>
+ </substitution>
+
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$calendarhome%d:</key>
+ <value>$calendars:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar home-->
+ <substitution>
+ <key>$calendarhomealt%d:</key>
+ <value>$calendars_users:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$calendarpath%d:</key>
+ <value>$calendarhome%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar-->
+ <substitution>
+ <key>$calendarpathalt%d:</key>
+ <value>$calendarhomealt%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user tasks calendar-->
+ <substitution>
+ <key>$taskspath%d:</key>
+ <value>$calendarhome%d:/$tasks:</value>
+ </substitution>
+ <!-- relative path to user polls calendar-->
+ <substitution>
+ <key>$pollspath%d:</key>
+ <value>$calendarhome%d:/$polls:</value>
+ </substitution>
+ <!-- relative path to user inbox-->
+ <substitution>
+ <key>$inboxpath%d:</key>
+ <value>$calendarhome%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to user outbox-->
+ <substitution>
+ <key>$outboxpath%d:</key>
+ <value>$calendarhome%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to user dropbox-->
+ <substitution>
+ <key>$dropboxpath%d:</key>
+ <value>$calendarhome%d:/$dropbox:</value>
+ </substitution>
+ <!-- relative path to user notification-->
+ <substitution>
+ <key>$notificationpath%d:</key>
+ <value>$calendarhome%d:/$notification:</value>
+ </substitution>
+ <!-- relative path to user freebusy-->
+ <substitution>
+ <key>$freebusypath%d:</key>
+ <value>$calendarhome%d:/$freebusy:</value>
+ </substitution>
+ <substitution>
+ <key>$email%d:</key>
+ <value>$userid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$cuaddr%d:</key>
+ <value>mailto:$email%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddralt%d:</key>
+ <value>$cuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddraltnoslash%d:</key>
+ <value>$cuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddrurn%d:</key>
+ <value>urn:x-uid:$userguid%d:</value>
+ </substitution>
+
+ <!-- relative path to user addressbook home-->
+ <substitution>
+ <key>$addressbookhome%d:</key>
+ <value>$addressbooks:users/$userid%d:</value>
+ </substitution>
+ <!-- relative path to user addressbook-->
+ <substitution>
+ <key>$addressbookpath%d:</key>
+ <value>$addressbookhome%d:/$addressbook:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Ten public accounts -->
+ <repeat count="10">
+ <!-- user id -->
+ <substitution>
+ <key>$publicuserid%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$publicuserguid%d:</key>
+ <value>50000000-0000-0000-0000-0000000000%02d</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$publicusername%d:</key>
+ <value>Public %02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$publicpswd%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$publicprincipal%d:</key>
+ <value>$principals_users:$publicuserid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$publicprincipaluri%d:</key>
+ <value>$principals_uids:$publicuserguid%d:/</value>
+ </substitution>
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$publiccalendarhome%d:</key>
+ <value>$calendars_uids:$publicuserguid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$publiccalendarpath%d:</key>
+ <value>$calendars_uids:$publicuserguid%d:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$publicemail%d:</key>
+ <value>$publicuserid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$publiccuaddr%d:</key>
+ <value>mailto:$publicemail%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddralt%d:</key>
+ <value>$publiccuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddrurn%d:</key>
+ <value>urn:x-uid:$publicuserguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Twenty resource accounts -->
+ <repeat count="20">
+ <substitution>
+ <key>$resourceid%d:</key>
+ <value>resource%02d</value>
+ </substitution>
+ <!-- resource guid-->
+ <substitution>
+ <key>$resourceguid%d:</key>
+ <value>40000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- resource name-->
+ <substitution>
+ <key>$resourcename%d:</key>
+ <value>Resource %02d</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarhome%d:</key>
+ <value>$calendars_uids:$resourceguid%d:</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first resource inbox-->
+ <substitution>
+ <key>$rinboxpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first resource outbox-->
+ <substitution>
+ <key>$routboxpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first resource principal resource-->
+ <substitution>
+ <key>$rprincipal%d:</key>
+ <value>$principals_resources:$resourceid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rprincipaluri%d:</key>
+ <value>$principals_uids:$resourceguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddralt%d:</key>
+ <value>$rcuaddrurn%d:</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddrurn%d:</key>
+ <value>urn:x-uid:$resourceguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Ten Location accounts -->
+ <repeat count="10">
+ <substitution>
+ <key>$locationid%d:</key>
+ <value>location%02d</value>
+ </substitution>
+ <!-- location guid-->
+ <substitution>
+ <key>$locationguid%d:</key>
+ <value>30000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- location name-->
+ <substitution>
+ <key>$locationname%d:</key>
+ <value>Location %02d</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarhome%d:</key>
+ <value>$calendars_uids:$locationguid%d:</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first location inbox-->
+ <substitution>
+ <key>$linboxpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first location outbox-->
+ <substitution>
+ <key>$loutboxpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first location principal resource-->
+ <substitution>
+ <key>$lprincipal%d:</key>
+ <value>$principals_resources:$locationid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lprincipaluri%d:</key>
+ <value>$principals_uids:$locationguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddralt%d:</key>
+ <value>$lprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddrurn%d:</key>
+ <value>urn:x-uid:$locationguid%d:</value>
+ </substitution>
+ </repeat>
+
+
+ <!-- Ten Group accounts -->
+ <repeat count="40">
+ <substitution>
+ <key>$groupid%d:</key>
+ <value>group%02d</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$groupguid%d:</key>
+ <value>20000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$groupname%d:</key>
+ <value>Group %02d</value>
+ </substitution>
+ <!-- relative path to first group principal resource-->
+ <substitution>
+ <key>$gprincipal%d:</key>
+ <value>$principals_resources:$groupid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gprincipaluri%d:</key>
+ <value>$principals_uids:$groupguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gemail%d:</key>
+ <value>$groupid%d:@example.com</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddralt%d:</key>
+ <value>$gprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddrurn%d:</key>
+ <value>urn:x-uid:$groupguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- User with non-ascii name -->
+ <substitution>
+ <key>$i18nid:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$i18nguid:</key>
+ <value>860B3EE9-6D7C-4296-9639-E6B998074A78</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$i18nname:</key>
+ <value>まだ</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$i18npswd:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$i18ncalendarpath:</key>
+ <value>$calendars_uids:$i18nguid:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$i18nemail:</key>
+ <value>$i18nid:@example.com</value>
+ </substitution>
+ <!-- CUAddrs -->
+ <substitution>
+ <key>$i18ncuaddr:</key>
+ <value>mailto:$i18nemail:</value>
+ </substitution>
+ <substitution>
+ <key>$i18ncuaddrurn:</key>
+ <value>urn:x-uid:$i18nguid:</value>
+ </substitution>
+
+ <!-- relative path to disabled group principal resource-->
+ <substitution>
+ <key>$principaldisabled:</key>
+ <value>$principals_groups:disabledgroup/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluridisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+ <!-- calendar user address of disabled group-->
+ <substitution>
+ <key>$cuaddrdisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+
+ <!-- Override some of the above definitions for special cases -->
+
+ <!-- calendar user address of second user-->
+ <substitution>
+ <key>$cuaddr2:</key>
+ <value>MAILTO:$email2:</value>
+ </substitution>
+
+ </substitutions>
+</serverinfo>
diff --git a/apps/dav/tests/travis/caldavtest/serverinfo-old-carddav-endpoint.xml b/apps/dav/tests/travis/caldavtest/serverinfo-old-carddav-endpoint.xml
new file mode 100644
index 00000000000..bd9f83a4814
--- /dev/null
+++ b/apps/dav/tests/travis/caldavtest/serverinfo-old-carddav-endpoint.xml
@@ -0,0 +1,850 @@
+<?xml version="1.0" standalone="no"?>
+
+<!DOCTYPE serverinfo SYSTEM
+ "/home/deepdiver/Development/ownCloud/master/apps/dav/tests/travis/caldavtest/serverinfo.dtd">
+
+<!--
+ Copyright (c) 2006-2015 Apple Inc. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<serverinfo>
+ <host>localhost</host>
+ <nonsslport>8888</nonsslport>
+ <authtype>basic</authtype>
+ <!-- <unix>/tmp/caldavd_requests/unsecured.sock</unix> -->
+
+ <waitcount>120</waitcount>
+ <waitdelay>0.25</waitdelay>
+ <waitsuccess>30</waitsuccess>
+
+ <features>
+ <!-- Generic WebDAV extensions -->
+ <feature>COPY Method</feature> <!-- COPY method -->
+ <feature>MOVE Method</feature> <!-- MOVE method -->
+ <feature>Extended MKCOL</feature> <!-- Extended MKCOL -->
+
+ <!-- ACL related -->
+ <feature>ACL Method</feature> <!-- ACL method -->
+ <feature>acl-principal-prop-set REPORT</feature> <!-- ACL acl-principal-prop-set REPORT -->
+ <feature>principal-match REPORT</feature> <!-- ACL principal-match REPORT -->
+ <feature>principal-property-search REPORT</feature> <!-- ACL principal-property-search REPORT -->
+ <feature>principal-search-property-set REPORT</feature> <!-- ACL principal-search-property-set REPORT -->
+ <feature>calendarserver-principal-search REPORT</feature> <!-- ACL calendarserver-principal-search REPORT -->
+
+ <feature>add-member</feature> <!-- Add-member used to create resources -->
+ <!-- <feature>auth-on-root</feature> --> <!-- Whether the server requires authentication on the root URI -->
+ <feature>brief</feature> <!-- Brief header for PROPFIND, REPORT -->
+ <feature>bulk-post</feature> <!-- Bulk POST requests -->
+ <feature>ctag</feature> <!-- ctag extension -->
+ <feature>current-user-principal</feature> <!-- current-user-principal extension -->
+ <feature>directory listing</feature> <!-- GET on collection -->
+ <feature>extended-principal-search</feature> <!-- Extended principal-property-search REPORT extension -->
+ <feature>expand-property</feature> <!-- Expand property REPORT -->
+ <feature>only-proxy-groups</feature> <!-- Group-membership only includes delegated-to groups -->
+ <feature>limits</feature> <!-- max-collections and max-resources limits -->
+ <feature>own-root</feature> <!-- / is owned by this service -->
+ <feature>prefer</feature> <!-- Prefer header overall support -->
+ <feature>prefer-minimal</feature> <!-- Prefer header return=minimal -->
+ <feature>prefer-representation</feature> <!-- Prefer header return=representation -->
+ <feature>prefer-noroot</feature> <!-- Prefer header depth-noroot -->
+ <feature>quota</feature> <!-- WebDAV QUOTA -->
+ <!-- <feature>quota-on-resources</feature> --> <!-- WebDAV QUOTA on calendar and address book object resources -->
+ <feature>resource-id</feature> <!-- WebDAV BIND DAV:resource-id property -->
+ <feature>sync-report</feature> <!-- WebDAV collection sync REPORT -->
+ <!-- <feature>sync-report-limit</feature> --> <!-- WebDAV collection sync REPORT DAV:limit support -->
+ <!--<feature>sync-report-home</feature> &lt;!&ndash; WebDAV collection sync REPORT on Homes &ndash;&gt;-->
+ <feature>sync-report-config-token</feature> <!-- Sync REPORT token includes configuration component -->
+ <feature>well-known</feature> <!-- well-known feature -->
+
+ <!-- <feature>per-object-ACLs</feature> --> <!-- ACL for objects in calendar/address books -->
+ <!-- <feature>regular-collection</feature> --> <!-- Regular collections allowed in calendar/address book homes -->
+
+ <feature>json-data</feature> <!-- jCal and jCard support -->
+
+ <!-- CalendarServer specific extensions -->
+ <feature>control-api</feature> <!-- Control API support -->
+
+ <!-- CalDAV specific extension -->
+ <feature>caldav</feature> <!-- Basic CalDAV feature enabler -->
+ <feature>attachments-collection</feature> <!-- Server uses a collection in same WebDAV tree to store attachments -->
+ <feature>auto-accept</feature> <!-- Auto-accept for rooms & locations -->
+ <feature>auto-accept-modes</feature> <!-- Auto-accept modes -->
+ <feature>client-fix-TRANSP</feature> <!-- fix client TRANSP -->
+ <!-- <feature>dropbox</feature> --> <!-- dropbox extension -->
+ <feature>default-alarms</feature> <!-- default alarms extension -->
+ <feature>EMAIL parameter</feature> <!-- Server normalizes cuaddress and adds EMAIL parameter -->
+ <feature>extended-freebusy</feature> <!-- Extended freebusy response -->
+ <feature>freebusy-url</feature> <!-- Freebusy URL -->
+ <feature>group-attendee-expansion</feature> <!-- Auto-expansion of group attendees -->
+ <feature>implicit-scheduling</feature> <!-- CalDAV scheduling - implicit -->
+ <feature>location-resource-tracking</feature> <!-- Server tracks who makes unscheduled changes to locations and resources -->
+ <feature>managed-attachments</feature> <!-- CalDAV Managed Attachments -->
+ <feature>maskuid</feature> <!-- maskuid extension -->
+ <feature>no-duplicate-uids</feature> <!-- duplicate UIDs in same home not supported -->
+ <feature>partstat-timestamp</feature> <!-- Time stamps when PARTSTAT changes extension -->
+ <!-- <feature>podding</feature> --> <!-- Podded server -->
+ <feature>private-comments</feature> <!-- private-comments extension -->
+ <feature>private-events</feature> <!-- private-events extension -->
+ <feature>proxy</feature> <!-- calendar-user-proxy extension -->
+ <!-- <feature>proxy-authz</feature> --> <!-- sudo user extension -->
+ <feature>recurrence-splitting</feature> <!-- Recurring components can be split -->
+ <feature>remove-duplicate-alarms</feature> <!-- Server removes any duplicate alarms on PUT -->
+ <feature>query-extended</feature> <!-- calendar-query-extended extension -->
+ <feature>shared-calendars</feature> <!-- Shared calendars extension -->
+ <feature>share-calendars-to-groups</feature> <!-- Share calendars to groups extension -->
+ <feature>schedule-changes</feature> <!-- schedule-changes property extension -->
+ <feature>split-calendars</feature> <!-- Calendars are split by component type -->
+ <feature>supported-component-sets</feature> <!-- CALDAV:supported-calendar-component-sets on calendar homes -->
+ <feature>supported-component-sets-one</feature> <!-- Only single component calendars allowed to be created -->
+ <feature>timerange-low-limit</feature> <!-- Time-range only valid one year back -->
+ <feature>timerange-high-limit</feature> <!-- Time-range only valid 5 years ahead -->
+ <feature>timezones-by-reference</feature> <!-- Timezones by reference enabled -->
+ <feature>timezone-service</feature> <!-- Timezone service extension for Wiki -->
+ <feature>timezone-std-service</feature> <!-- Timezone standard service extension -->
+ <!-- <feature>trash-collection</feature> --> <!-- Trash collection enabled -->
+ <feature>travel-time-busy</feature> <!-- Travel time appears as busy -->
+ <feature>vavailability</feature> <!-- VAVAILABILITY on inbox -->
+ <!-- <feature>vpoll</feature> --> <!-- VPOLL support for store and scheduling -->
+ <feature>webcal</feature> <!-- Internet calendar subscription via GET on calendar collection -->
+
+ <!-- CardDAV specific extension -->
+ <feature>carddav</feature> <!-- Basic CardDAV feature enabler -->
+ <feature>default-addressbook</feature> <!-- Default address book behavior -->
+ <feature>shared-addressbooks</feature> <!-- Shared address books extension -->
+ <feature>shared-addressbook-groups</feature> <!-- Shared address book groups extension -->
+ <feature>directory-gateway</feature> <!-- Directory gateway extension -->
+
+ </features>
+
+ <substitutions>
+ <!-- Useful xpath shortcuts for verifiers -->
+ <substitution>
+ <key>$multistatus-response-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response</value>
+ </substitution>
+ <substitution>
+ <key>$multistatus-href-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}href</value>
+ </substitution>
+ <substitution>
+ <key>$verify-response-prefix:</key>
+ <value>{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-property-prefix:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}propstat/{DAV:}prop</value>
+ </substitution>
+ <substitution>
+ <key>$verify-bad-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}status</value>
+ </substitution>
+ <substitution>
+ <key>$verify-error-response:</key>
+ <value>/{DAV:}multistatus/{DAV:}response/{DAV:}error</value>
+ </substitution>
+ <substitution>
+ <key>$CALDAV:</key>
+ <value>urn:ietf:params:xml:ns:caldav</value>
+ </substitution>
+ <substitution>
+ <key>$CARDDAV:</key>
+ <value>urn:ietf:params:xml:ns:carddav</value>
+ </substitution>
+ <substitution>
+ <key>$CS:</key>
+ <value>http://calendarserver.org/ns/</value>
+ </substitution>
+
+ <!-- Server configuration settings -->
+ <!-- $host: and $hostssl: are implicitly added by CalDAVTester based
+ on the host/nonsslport/sslport values and ssl command line switch -->
+
+ <!-- relative path to caldav root-->
+ <substitution>
+ <key>$root:</key>
+ <value>/remote.php/carddav/</value>
+ </substitution>
+
+ <!-- relative path to main principal collection-->
+ <substitution>
+ <key>$principalcollection:</key>
+ <value>$root:principals/</value>
+ </substitution>
+
+ <!-- the core recored type collections-->
+ <substitution>
+ <key>$uidstype:</key>
+ <value>__uids__</value>
+ </substitution>
+ <substitution>
+ <key>$groupstype:</key>
+ <value>groups</value>
+ </substitution>
+ <substitution>
+ <key>$locationstype:</key>
+ <value>locations</value>
+ </substitution>
+ <substitution>
+ <key>$resourcestype:</key>
+ <value>resources</value>
+ </substitution>
+
+ <!-- relative path to record type principal collections-->
+ <substitution>
+ <key>$principals_uids:</key>
+ <value>$principalcollection:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_users:</key>
+ <value>$principalcollection:</value>
+ </substitution>
+ <substitution>
+ <key>$principals_groups:</key>
+ <value>$principalcollection:$groupstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_resources:</key>
+ <value>$principalcollection:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$principals_locations:</key>
+ <value>$principalcollection:$locationstype:/</value>
+ </substitution>
+
+ <!-- relative path to calendars collection-->
+ <substitution>
+ <key>$calendars:</key>
+ <value>$root:calendars/</value>
+ </substitution>
+
+ <!-- relative path to record type calendar collections-->
+ <substitution>
+ <key>$calendars_uids:</key>
+ <value>$calendars:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_users:</key>
+ <value>$calendars:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_resources:</key>
+ <value>$calendars:$resourcestype:/</value>
+ </substitution>
+ <substitution>
+ <key>$calendars_locations:</key>
+ <value>$calendars:$locationstype:/</value>
+ </substitution>
+
+ <!-- primary calendar name-->
+ <substitution>
+ <key>$calendar:</key>
+ <value>calendar</value>
+ </substitution>
+
+ <!-- primary tasks-only calendar name-->
+ <substitution>
+ <key>$tasks:</key>
+ <value>tasks</value>
+ </substitution>
+
+ <!-- primary polls-only calendar name-->
+ <substitution>
+ <key>$polls:</key>
+ <value>polls</value>
+ </substitution>
+
+ <!-- inbox name-->
+ <substitution>
+ <key>$inbox:</key>
+ <value>inbox</value>
+ </substitution>
+
+ <!-- outbox name-->
+ <substitution>
+ <key>$outbox:</key>
+ <value>outbox</value>
+ </substitution>
+
+ <!-- dropbox name-->
+ <substitution>
+ <key>$dropbox:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- attachments name-->
+ <substitution>
+ <key>$attachments:</key>
+ <value>dropbox</value>
+ </substitution>
+
+ <!-- notification name-->
+ <substitution>
+ <key>$notification:</key>
+ <value>notification</value>
+ </substitution>
+
+ <!-- freebusy name-->
+ <substitution>
+ <key>$freebusy:</key>
+ <value>freebusy</value>
+ </substitution>
+
+ <!-- Sync home collection items - use "-" to include the home resource-->
+ <substitution>
+ <key>$calendar_home_items_initial_sync:</key>
+ <value>[-,$calendar:/,$tasks:/,$inbox:/,$outbox:/,$freebusy:,$notification:/]</value>
+ </substitution>
+
+ <!-- Sync collection extra items - use "-" to include the collection-->
+ <substitution>
+ <key>$calendar_sync_extra_items:</key>
+ <value>[-]</value>
+ </substitution>
+
+ <!-- Sync collection extra count - gets added to the totalcount value-->
+ <substitution>
+ <key>$calendar_sync_extra_count:</key>
+ <value>1</value> <!-- the request-uri resource is returned when no token passed-->
+ </substitution>
+
+ <!-- server-to-server inbox-->
+ <substitution>
+ <key>$servertoserver:</key>
+ <value>$root:inbox</value>
+ </substitution>
+
+ <!-- timezone service-->
+ <substitution>
+ <key>$timezoneservice:</key>
+ <value>$root:timezones</value>
+ </substitution>
+
+ <!-- timezone std service-->
+ <substitution>
+ <key>$timezonestdservice:</key>
+ <value>$root:stdtimezones</value>
+ </substitution>
+
+ <!-- relative path to addressbooks collection-->
+ <substitution>
+ <key>$addressbooks:</key>
+ <value>$root:addressbooks/</value>
+ </substitution>
+
+ <!-- relative path to record type addressbook collections-->
+ <substitution>
+ <key>$addressbooks_uids:</key>
+ <value>$addressbooks:$uidstype:/</value>
+ </substitution>
+ <substitution>
+ <key>$addressbooks_users:</key>
+ <value>$addressbooks:/</value>
+ </substitution>
+
+ <!-- primary addressbook name -->
+ <substitution>
+ <key>$addressbook:</key>
+ <value>addressbook</value>
+ </substitution>
+
+ <!-- directory name -->
+ <substitution>
+ <key>$directory:</key>
+ <value>$root:directory/</value>
+ </substitution>
+
+ <!-- POST add-member URI suffix -->
+ <substitution>
+ <key>$add-member:</key>
+ <value>;add-member</value>
+ </substitution>
+
+ <!-- user id for admin user -->
+ <substitution>
+ <key>$useradmin:</key>
+ <value>admin</value>
+ </substitution>
+ <!-- guid for admin user -->
+ <substitution>
+ <key>$useradminguid:</key>
+ <value>0C8BDE62-E600-4696-83D3-8B5ECABDFD2E</value>
+ </substitution>
+ <!-- password for admin user -->
+ <substitution>
+ <key>$pswdadmin:</key>
+ <value>admin</value>
+ </substitution>
+
+ <!-- relative path to admin principal resource-->
+ <substitution>
+ <key>$principal_admin:</key>
+ <value>$principals_users:$useradmin:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_admin:</key>
+ <value>$principals_uids:$useradminguid:/</value>
+ </substitution>
+
+ <!-- user id for apprentice user -->
+ <substitution>
+ <key>$userapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+ <!-- guid for apprentice user -->
+ <substitution>
+ <key>$userapprenticeguid:</key>
+ <value>29B6C503-11DF-43EC-8CCA-40C7003149CE</value>
+ </substitution>
+ <!-- password for admin user -->
+ <substitution>
+ <key>$pswdapprentice:</key>
+ <value>apprentice</value>
+ </substitution>
+
+ <!-- relative path to apprentice principal resource-->
+ <substitution>
+ <key>$principal_apprentice:</key>
+ <value>$principals_users:$userapprentice:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri_apprentice:</key>
+ <value>$principals_uids:$userapprenticeguid:/</value>
+ </substitution>
+
+ <!-- user id for proxy user -->
+ <substitution>
+ <key>$userproxy:</key>
+ <value>superuser</value>
+ </substitution>
+ <!-- password for proxy user -->
+ <substitution>
+ <key>$pswdproxy:</key>
+ <value>superuser</value>
+ </substitution>
+
+ <!-- Forty user accounts -->
+ <repeat count="40">
+ <!-- user id -->
+ <substitution>
+ <key>$userid%d:</key>
+ <value>user%02d</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$userguid%d:</key>
+ <value>10000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$username%d:</key>
+ <value>User %02d</value>
+ </substitution>
+ <!-- user name URI encoded -->
+ <substitution>
+ <key>$username-encoded%d:</key>
+ <value>User%%20%02d</value>
+ </substitution>
+ <!-- first name -->
+ <substitution>
+ <key>$firstname%d:</key>
+ <value>User</value>
+ </substitution>
+ <!-- last name -->
+ <substitution>
+ <key>$lastname%d:</key>
+ <value>%02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$pswd%d:</key>
+ <value>user%02d</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$principal%d:</key>
+ <value>$principals_users:$userid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluri%d:</key>
+ <value>$principals_users:$userid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$principal%dnoslash:</key>
+ <value>$principals_users:$userid%d:</value>
+ </substitution>
+
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$calendarhome%d:</key>
+ <value>$calendars:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar home-->
+ <substitution>
+ <key>$calendarhomealt%d:</key>
+ <value>$calendars_users:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$calendarpath%d:</key>
+ <value>$calendarhome%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user alternate calendar-->
+ <substitution>
+ <key>$calendarpathalt%d:</key>
+ <value>$calendarhomealt%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to user tasks calendar-->
+ <substitution>
+ <key>$taskspath%d:</key>
+ <value>$calendarhome%d:/$tasks:</value>
+ </substitution>
+ <!-- relative path to user polls calendar-->
+ <substitution>
+ <key>$pollspath%d:</key>
+ <value>$calendarhome%d:/$polls:</value>
+ </substitution>
+ <!-- relative path to user inbox-->
+ <substitution>
+ <key>$inboxpath%d:</key>
+ <value>$calendarhome%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to user outbox-->
+ <substitution>
+ <key>$outboxpath%d:</key>
+ <value>$calendarhome%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to user dropbox-->
+ <substitution>
+ <key>$dropboxpath%d:</key>
+ <value>$calendarhome%d:/$dropbox:</value>
+ </substitution>
+ <!-- relative path to user notification-->
+ <substitution>
+ <key>$notificationpath%d:</key>
+ <value>$calendarhome%d:/$notification:</value>
+ </substitution>
+ <!-- relative path to user freebusy-->
+ <substitution>
+ <key>$freebusypath%d:</key>
+ <value>$calendarhome%d:/$freebusy:</value>
+ </substitution>
+ <substitution>
+ <key>$email%d:</key>
+ <value>$userid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$cuaddr%d:</key>
+ <value>mailto:$email%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddralt%d:</key>
+ <value>$cuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddraltnoslash%d:</key>
+ <value>$cuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$cuaddrurn%d:</key>
+ <value>urn:x-uid:$userguid%d:</value>
+ </substitution>
+
+ <!-- relative path to user addressbook home-->
+ <substitution>
+ <key>$addressbookhome%d:</key>
+ <value>$addressbooks:$userid%d:</value>
+ </substitution>
+ <!-- relative path to user addressbook-->
+ <substitution>
+ <key>$addressbookpath%d:</key>
+ <value>$addressbookhome%d:/$addressbook:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Ten public accounts -->
+ <repeat count="10">
+ <!-- user id -->
+ <substitution>
+ <key>$publicuserid%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- user guid -->
+ <substitution>
+ <key>$publicuserguid%d:</key>
+ <value>50000000-0000-0000-0000-0000000000%02d</value>
+ </substitution>
+ <!-- user name -->
+ <substitution>
+ <key>$publicusername%d:</key>
+ <value>Public %02d</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$publicpswd%d:</key>
+ <value>public%02d</value>
+ </substitution>
+ <!-- relative path to user principal resource-->
+ <substitution>
+ <key>$publicprincipal%d:</key>
+ <value>$principals_users:$publicuserid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$publicprincipaluri%d:</key>
+ <value>$principals_uids:$publicuserguid%d:/</value>
+ </substitution>
+ <!-- relative path to user calendar home-->
+ <substitution>
+ <key>$publiccalendarhome%d:</key>
+ <value>$calendars_uids:$publicuserguid%d:</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$publiccalendarpath%d:</key>
+ <value>$calendars_uids:$publicuserguid%d:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$publicemail%d:</key>
+ <value>$publicuserid%d:@example.com</value>
+ </substitution>
+ <!-- calendar user address of user-->
+ <substitution>
+ <key>$publiccuaddr%d:</key>
+ <value>mailto:$publicemail%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddralt%d:</key>
+ <value>$publiccuaddr%d:</value>
+ </substitution>
+ <substitution>
+ <key>$publiccuaddrurn%d:</key>
+ <value>urn:x-uid:$publicuserguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Twenty resource accounts -->
+ <repeat count="20">
+ <substitution>
+ <key>$resourceid%d:</key>
+ <value>resource%02d</value>
+ </substitution>
+ <!-- resource guid-->
+ <substitution>
+ <key>$resourceguid%d:</key>
+ <value>40000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- resource name-->
+ <substitution>
+ <key>$resourcename%d:</key>
+ <value>Resource %02d</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarhome%d:</key>
+ <value>$calendars_uids:$resourceguid%d:</value>
+ </substitution>
+ <!-- relative path to first resource calendar home-->
+ <substitution>
+ <key>$rcalendarpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first resource inbox-->
+ <substitution>
+ <key>$rinboxpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first resource outbox-->
+ <substitution>
+ <key>$routboxpath%d:</key>
+ <value>$calendars_uids:$resourceguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first resource principal resource-->
+ <substitution>
+ <key>$rprincipal%d:</key>
+ <value>$principals_resources:$resourceid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rprincipaluri%d:</key>
+ <value>$principals_uids:$resourceguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddralt%d:</key>
+ <value>$rcuaddrurn%d:</value>
+ </substitution>
+ <substitution>
+ <key>$rcuaddrurn%d:</key>
+ <value>urn:x-uid:$resourceguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- Ten Location accounts -->
+ <repeat count="10">
+ <substitution>
+ <key>$locationid%d:</key>
+ <value>location%02d</value>
+ </substitution>
+ <!-- location guid-->
+ <substitution>
+ <key>$locationguid%d:</key>
+ <value>30000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- location name-->
+ <substitution>
+ <key>$locationname%d:</key>
+ <value>Location %02d</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarhome%d:</key>
+ <value>$calendars_uids:$locationguid%d:</value>
+ </substitution>
+ <!-- relative path to first location calendar home-->
+ <substitution>
+ <key>$lcalendarpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$calendar:</value>
+ </substitution>
+ <!-- relative path to first location inbox-->
+ <substitution>
+ <key>$linboxpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$inbox:</value>
+ </substitution>
+ <!-- relative path to first location outbox-->
+ <substitution>
+ <key>$loutboxpath%d:</key>
+ <value>$calendars_uids:$locationguid%d:/$outbox:</value>
+ </substitution>
+ <!-- relative path to first location principal resource-->
+ <substitution>
+ <key>$lprincipal%d:</key>
+ <value>$principals_resources:$locationid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lprincipaluri%d:</key>
+ <value>$principals_uids:$locationguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddralt%d:</key>
+ <value>$lprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$lcuaddrurn%d:</key>
+ <value>urn:x-uid:$locationguid%d:</value>
+ </substitution>
+ </repeat>
+
+
+ <!-- Ten Group accounts -->
+ <repeat count="40">
+ <substitution>
+ <key>$groupid%d:</key>
+ <value>group%02d</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$groupguid%d:</key>
+ <value>20000000-0000-0000-0000-000000000%03d</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$groupname%d:</key>
+ <value>Group %02d</value>
+ </substitution>
+ <!-- relative path to first group principal resource-->
+ <substitution>
+ <key>$gprincipal%d:</key>
+ <value>$principals_resources:$groupid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gprincipaluri%d:</key>
+ <value>$principals_uids:$groupguid%d:/</value>
+ </substitution>
+ <substitution>
+ <key>$gemail%d:</key>
+ <value>$groupid%d:@example.com</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddralt%d:</key>
+ <value>$gprincipaluri%d:</value>
+ </substitution>
+ <substitution>
+ <key>$gcuaddrurn%d:</key>
+ <value>urn:x-uid:$groupguid%d:</value>
+ </substitution>
+ </repeat>
+
+ <!-- User with non-ascii name -->
+ <substitution>
+ <key>$i18nid:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- group guid-->
+ <substitution>
+ <key>$i18nguid:</key>
+ <value>860B3EE9-6D7C-4296-9639-E6B998074A78</value>
+ </substitution>
+ <!-- group name-->
+ <substitution>
+ <key>$i18nname:</key>
+ <value>まだ</value>
+ </substitution>
+ <!-- password -->
+ <substitution>
+ <key>$i18npswd:</key>
+ <value>i18nuser</value>
+ </substitution>
+ <!-- relative path to user calendar-->
+ <substitution>
+ <key>$i18ncalendarpath:</key>
+ <value>$calendars_uids:$i18nguid:/$calendar:</value>
+ </substitution>
+ <substitution>
+ <key>$i18nemail:</key>
+ <value>$i18nid:@example.com</value>
+ </substitution>
+ <!-- CUAddrs -->
+ <substitution>
+ <key>$i18ncuaddr:</key>
+ <value>mailto:$i18nemail:</value>
+ </substitution>
+ <substitution>
+ <key>$i18ncuaddrurn:</key>
+ <value>urn:x-uid:$i18nguid:</value>
+ </substitution>
+
+ <!-- relative path to disabled group principal resource-->
+ <substitution>
+ <key>$principaldisabled:</key>
+ <value>$principals_groups:disabledgroup/</value>
+ </substitution>
+ <substitution>
+ <key>$principaluridisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+ <!-- calendar user address of disabled group-->
+ <substitution>
+ <key>$cuaddrdisabled:</key>
+ <value>$principals_uids:disabledgroup/</value>
+ </substitution>
+
+ <!-- Override some of the above definitions for special cases -->
+
+ <!-- calendar user address of second user-->
+ <substitution>
+ <key>$cuaddr2:</key>
+ <value>MAILTO:$email2:</value>
+ </substitution>
+
+ </substitutions>
+</serverinfo>
diff --git a/apps/dav/tests/travis/carddav/script-new-endpoint.sh b/apps/dav/tests/travis/carddav/script-new-endpoint.sh
new file mode 100644
index 00000000000..9140c37b45f
--- /dev/null
+++ b/apps/dav/tests/travis/carddav/script-new-endpoint.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+SCRIPT=`realpath $0`
+SCRIPTPATH=`dirname $SCRIPT`
+
+# Move the endpoint to the serverinfo file
+cp "$SCRIPTPATH/../caldavtest/serverinfo-new-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml"
+
+# start the server
+php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." &
+
+sleep 30
+
+# run the tests
+cd "$SCRIPTPATH/CalDAVTester"
+PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \
+ "CardDAV/current-user-principal.xml" \
+ "CardDAV/sync-report.xml" \
+ "CardDAV/sharing-addressbooks.xml"
+
+
+RESULT=$?
+
+tail "$/../../../../../data-autotest/nextcloud.log"
+
+exit $RESULT
diff --git a/apps/dav/tests/travis/carddav/script-old-endpoint.sh b/apps/dav/tests/travis/carddav/script-old-endpoint.sh
new file mode 100644
index 00000000000..216f2f5af31
--- /dev/null
+++ b/apps/dav/tests/travis/carddav/script-old-endpoint.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+SCRIPT=`realpath $0`
+SCRIPTPATH=`dirname $SCRIPT`
+
+# Move the endpoint to the serverinfo file
+cp "$SCRIPTPATH/../caldavtest/serverinfo-old-carddav-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml"
+
+# start the server
+php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." &
+
+
+# run the tests
+cd "$SCRIPTPATH/CalDAVTester"
+PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail --basedir "$SCRIPTPATH/../caldavtest/" -o cdt.txt \
+ "CardDAV/current-user-principal.xml" \
+ "CardDAV/sync-report.xml"
+
+RESULT=$?
+
+tail "$/../../../../../data-autotest/nextcloud.log"
+
+exit $RESULT
diff --git a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php
index d15be72c77b..ffdba9c5c8a 100644
--- a/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php
+++ b/apps/dav/tests/unit/CalDAV/AbstractCalDavBackendTest.php
@@ -55,6 +55,7 @@ abstract class AbstractCalDavBackendTest extends TestCase {
const UNIT_TEST_USER = 'principals/users/caldav-unit-test';
const UNIT_TEST_USER1 = 'principals/users/caldav-unit-test1';
const UNIT_TEST_GROUP = 'principals/groups/caldav-unit-test-group';
+ const UNIT_TEST_GROUP2 = 'principals/groups/caldav-unit-test-group2';
public function setUp() {
parent::setUp();
@@ -71,7 +72,7 @@ abstract class AbstractCalDavBackendTest extends TestCase {
]);
$this->principal->expects($this->any())->method('getGroupMembership')
->withAnyParameters()
- ->willReturn([self::UNIT_TEST_GROUP]);
+ ->willReturn([self::UNIT_TEST_GROUP, self::UNIT_TEST_GROUP2]);
$db = \OC::$server->getDatabaseConnection();
$this->random = \OC::$server->getSecureRandom();
diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
index bd6c9f27886..22ef232dac4 100644
--- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php
@@ -57,18 +57,18 @@ class CalDavBackendTest extends AbstractCalDavBackendTest {
$this->backend->updateCalendar($calendarId, $patch);
$patch->commit();
$this->assertEquals(1, $this->backend->getCalendarsForUserCount(self::UNIT_TEST_USER));
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($books));
- $this->assertEquals('Unit test', $books[0]['{DAV:}displayname']);
- $this->assertEquals('Calendar used for unit testing', $books[0]['{urn:ietf:params:xml:ns:caldav}calendar-description']);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertCount(1, $calendars);
+ $this->assertEquals('Unit test', $calendars[0]['{DAV:}displayname']);
+ $this->assertEquals('Calendar used for unit testing', $calendars[0]['{urn:ietf:params:xml:ns:caldav}calendar-description']);
// delete the address book
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar');
- $this->backend->deleteCalendar($books[0]['id']);
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(0, count($books));
+ $this->backend->deleteCalendar($calendars[0]['id']);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertCount(0, $calendars);
}
public function providesSharingData() {
@@ -83,6 +83,26 @@ class CalDavBackendTest extends AbstractCalDavBackendTest {
'readOnly' => true
]
]],
+ [true, true, true, false, [
+ [
+ 'href' => 'principal:' . self::UNIT_TEST_GROUP,
+ 'readOnly' => true,
+ ],
+ [
+ 'href' => 'principal:' . self::UNIT_TEST_GROUP2,
+ 'readOnly' => false,
+ ],
+ ]],
+ [true, true, true, true, [
+ [
+ 'href' => 'principal:' . self::UNIT_TEST_GROUP,
+ 'readOnly' => false,
+ ],
+ [
+ 'href' => 'principal:' . self::UNIT_TEST_GROUP2,
+ 'readOnly' => true,
+ ],
+ ]],
[true, false, false, false, [
[
'href' => 'principal:' . self::UNIT_TEST_USER1,
@@ -98,9 +118,8 @@ class CalDavBackendTest extends AbstractCalDavBackendTest {
*/
public function testCalendarSharing($userCanRead, $userCanWrite, $groupCanRead, $groupCanWrite, $add) {
- /** @var IL10N | \PHPUnit_Framework_MockObject_MockObject $l10n */
- $l10n = $this->getMockBuilder('\OCP\IL10N')
- ->disableOriginalConstructor()->getMock();
+ /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject $l10n */
+ $l10n = $this->createMock(IL10N::class);
$l10n
->expects($this->any())
->method('t')
@@ -109,16 +128,16 @@ class CalDavBackendTest extends AbstractCalDavBackendTest {
}));
$calendarId = $this->createTestCalendar();
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($books));
- $calendar = new Calendar($this->backend, $books[0], $l10n);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertCount(1, $calendars);
+ $calendar = new Calendar($this->backend, $calendars[0], $l10n);
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::updateShares');
$this->backend->updateShares($calendar, $add, []);
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
- $this->assertEquals(1, count($books));
- $calendar = new Calendar($this->backend, $books[0], $l10n);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
+ $this->assertCount(1, $calendars);
+ $calendar = new Calendar($this->backend, $calendars[0], $l10n);
$acl = $calendar->getACL();
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
$this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
@@ -129,7 +148,7 @@ class CalDavBackendTest extends AbstractCalDavBackendTest {
$this->assertEquals(self::UNIT_TEST_USER, $calendar->getOwner());
// test acls on the child
- $uri = $this->getUniqueID('calobj');
+ $uri = static::getUniqueID('calobj');
$calData = <<<'EOD'
BEGIN:VCALENDAR
VERSION:2.0
@@ -166,9 +185,9 @@ EOD;
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar');
- $this->backend->deleteCalendar($books[0]['id']);
- $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(0, count($books));
+ $this->backend->deleteCalendar($calendars[0]['id']);
+ $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
+ $this->assertCount(0, $calendars);
}
public function testCalendarObjectsOperations() {
@@ -176,7 +195,7 @@ EOD;
$calendarId = $this->createTestCalendar();
// create a card
- $uri = $this->getUniqueID('calobj');
+ $uri = static::getUniqueID('calobj');
$calData = <<<'EOD'
BEGIN:VCALENDAR
VERSION:2.0
@@ -201,7 +220,7 @@ EOD;
// get all the cards
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
- $this->assertEquals(1, count($calendarObjects));
+ $this->assertCount(1, $calendarObjects);
$this->assertEquals($calendarId, $calendarObjects[0]['calendarid']);
$this->assertArrayHasKey('classification', $calendarObjects[0]);
@@ -245,7 +264,7 @@ EOD;
->with('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject');
$this->backend->deleteCalendarObject($calendarId, $uri);
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
- $this->assertEquals(0, count($calendarObjects));
+ $this->assertCount(0, $calendarObjects);
}
public function testMultiCalendarObjects() {
@@ -269,17 +288,17 @@ CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
EOD;
- $uri0 = $this->getUniqueID('card');
+ $uri0 = static::getUniqueID('card');
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
$this->backend->createCalendarObject($calendarId, $uri0, $calData);
- $uri1 = $this->getUniqueID('card');
+ $uri1 = static::getUniqueID('card');
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
$this->backend->createCalendarObject($calendarId, $uri1, $calData);
- $uri2 = $this->getUniqueID('card');
+ $uri2 = static::getUniqueID('card');
$this->dispatcher->expects($this->at(0))
->method('dispatch')
->with('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject');
@@ -287,11 +306,11 @@ EOD;
// get all the cards
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
- $this->assertEquals(3, count($calendarObjects));
+ $this->assertCount(3, $calendarObjects);
// get the cards
$calendarObjects = $this->backend->getMultipleCalendarObjects($calendarId, [$uri1, $uri2]);
- $this->assertEquals(2, count($calendarObjects));
+ $this->assertCount(2, $calendarObjects);
foreach($calendarObjects as $card) {
$this->assertArrayHasKey('id', $card);
$this->assertArrayHasKey('uri', $card);
@@ -316,7 +335,7 @@ EOD;
->with('\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject');
$this->backend->deleteCalendarObject($calendarId, $uri2);
$calendarObjects = $this->backend->getCalendarObjects($calendarId);
- $this->assertEquals(0, count($calendarObjects));
+ $this->assertCount(0, $calendarObjects);
}
/**
@@ -385,15 +404,15 @@ EOD;
$calendarInfo = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER)[0];
- $l10n = $this->getMockBuilder('\OCP\IL10N')
- ->disableOriginalConstructor()->getMock();
+ /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject $l10n */
+ $l10n = $this->createMock(IL10N::class);
$calendar = new Calendar($this->backend, $calendarInfo, $l10n);
$calendar->setPublishStatus(true);
$this->assertNotEquals(false, $calendar->getPublishStatus());
$publicCalendars = $this->backend->getPublicCalendars();
- $this->assertEquals(1, count($publicCalendars));
+ $this->assertCount(1, $publicCalendars);
$this->assertEquals(true, $publicCalendars[0]['{http://owncloud.org/ns}public']);
$publicCalendarURI = $publicCalendars[0]['uri'];
@@ -415,7 +434,7 @@ EOD;
]);
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($subscriptions));
+ $this->assertCount(1, $subscriptions);
$this->assertEquals('#1C4587', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
$this->assertEquals(true, $subscriptions[0]['{http://calendarserver.org/ns/}subscribed-strip-todos']);
$this->assertEquals($id, $subscriptions[0]['id']);
@@ -428,21 +447,21 @@ EOD;
$patch->commit();
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($subscriptions));
+ $this->assertCount(1, $subscriptions);
$this->assertEquals($id, $subscriptions[0]['id']);
$this->assertEquals('Unit test', $subscriptions[0]['{DAV:}displayname']);
$this->assertEquals('#ac0606', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
$this->backend->deleteSubscription($id);
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
- $this->assertEquals(0, count($subscriptions));
+ $this->assertCount(0, $subscriptions);
}
public function testScheduling() {
$this->backend->createSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule', '');
$sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
- $this->assertEquals(1, count($sos));
+ $this->assertCount(1, $sos);
$so = $this->backend->getSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
$this->assertNotNull($so);
@@ -450,7 +469,7 @@ EOD;
$this->backend->deleteSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule');
$sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER);
- $this->assertEquals(0, count($sos));
+ $this->assertCount(0, $sos);
}
/**
diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php
index d0fb2d19243..70a072f04de 100644
--- a/apps/dav/tests/unit/CalDAV/CalendarTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php
@@ -334,17 +334,15 @@ EOD;
->willReturn($calObject1)->with(666, 'event-1');
$calendarInfo = [
+ '{http://owncloud.org/ns}owner-principal' => $isShared ? 'user1' : 'user2',
'principaluri' => 'user2',
'id' => 666,
'uri' => 'cal',
];
-
- if ($isShared) {
- $calendarInfo['{http://owncloud.org/ns}owner-principal'] = 'user1';
-
- }
$c = new Calendar($backend, $calendarInfo, $this->l10n);
+ $this->assertEquals(count($c->getChildren()), $expectedChildren);
+
// test private event
$privateEvent = $c->getChild('event-1');
$calData = $privateEvent->get();
diff --git a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
index 5eeb6772a60..72b3c57bea6 100644
--- a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
+++ b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
@@ -55,18 +55,18 @@ class BirthdayServiceTest extends TestCase {
/**
* @dataProvider providesVCards
- * @param boolean $nullExpected
+ * @param boolean $expectedSummary
* @param string | null $data
*/
- public function testBuildBirthdayFromContact($nullExpected, $data) {
+ public function testBuildBirthdayFromContact($expectedSummary, $data) {
$cal = $this->service->buildDateFromContact($data, 'BDAY', '*');
- if ($nullExpected) {
+ if ($expectedSummary === null) {
$this->assertNull($cal);
} else {
$this->assertInstanceOf('Sabre\VObject\Component\VCalendar', $cal);
$this->assertTrue(isset($cal->VEVENT));
$this->assertEquals('FREQ=YEARLY', $cal->VEVENT->RRULE->getValue());
- $this->assertEquals('12345 (*1900)', $cal->VEVENT->SUMMARY->getValue());
+ $this->assertEquals($expectedSummary, $cal->VEVENT->SUMMARY->getValue());
$this->assertEquals('TRANSPARENT', $cal->VEVENT->TRANSP->getValue());
}
}
@@ -126,9 +126,9 @@ class BirthdayServiceTest extends TestCase {
if ($expectedOp === 'create') {
$service->expects($this->exactly(3))->method('buildDateFromContact')->willReturn(new VCalendar());
$this->calDav->expects($this->exactly(3))->method('createCalendarObject')->withConsecutive(
- [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
+ [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
);
}
if ($expectedOp === 'update') {
@@ -136,9 +136,9 @@ class BirthdayServiceTest extends TestCase {
$service->expects($this->exactly(3))->method('birthdayEvenChanged')->willReturn(true);
$this->calDav->expects($this->exactly(3))->method('getCalendarObject')->willReturn(['calendardata' => '']);
$this->calDav->expects($this->exactly(3))->method('updateCalendarObject')->withConsecutive(
- [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
+ [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
);
}
@@ -233,14 +233,19 @@ class BirthdayServiceTest extends TestCase {
public function providesVCards() {
return [
- [true, null],
- [true, ''],
- [true, 'yasfewf'],
- [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
- [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
- [true, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
- [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:1900-01-01\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
- [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:1900-12-31\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ [null, null],
+ [null, ''],
+ [null, 'yasfewf'],
+ [null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ [null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ [null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:someday\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ['12345 (*1900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19000101\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ['12345 (*1900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ['12345 *', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:--1231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ['12345 *', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY;X-APPLE-OMIT-YEAR=1604:16041231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ [null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:;VALUE=text:circa 1800\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ [null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nN:12345;;;;\r\nBDAY:20031231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
+ ['12345 (*900)', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:09001231\r\nEND:VCARD\r\n", "Dr. Foo Bar"],
];
}
}
diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
index f4c321fa6d0..a4445217469 100644
--- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
+++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php
@@ -273,7 +273,7 @@ class CardDavBackendTest extends TestCase {
// create a new address book
$this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
- $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER);
+ $books = $this->backend->getUsersOwnAddressBooks(self::UNIT_TEST_USER);
$this->assertEquals(1, count($books));
$bookId = $books[0]['id'];
diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
index 74b85b8a1c9..dfcb7939799 100644
--- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
@@ -302,7 +302,7 @@ class AuthTest extends TestCase {
->with([
'/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
'/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
- '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) (ownCloud|Nextcloud)\-iOS.*$/',
])
->willReturn(false);
$this->session
@@ -352,7 +352,7 @@ class AuthTest extends TestCase {
->with([
'/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
'/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
- '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) (ownCloud|Nextcloud)\-iOS.*$/',
])
->willReturn(false);
$this->session
@@ -406,7 +406,7 @@ class AuthTest extends TestCase {
->with([
'/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
'/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
- '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) (ownCloud|Nextcloud)\-iOS.*$/',
])
->willReturn(false);
$this->session
@@ -452,7 +452,7 @@ class AuthTest extends TestCase {
->with([
'/^Mozilla\/5\.0 \([A-Za-z ]+\) (mirall|csyncoC)\/.*$/',
'/^Mozilla\/5\.0 \(Android\) ownCloud\-android.*$/',
- '/^Mozilla\/5\.0 \(iOS\) ownCloud\-iOS.*$/',
+ '/^Mozilla\/5\.0 \(iOS\) (ownCloud|Nextcloud)\-iOS.*$/',
])
->willReturn(true);
$this->session
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
index c6e833033d5..1c9ebdd09b6 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php
@@ -188,8 +188,6 @@ class FilesPluginTest extends TestCase {
$node->expects($this->exactly(2))
->method('getOwner')
->will($this->returnValue($user));
- $node->expects($this->never())
- ->method('getSize');
$this->plugin->handleGetProperties(
$propFind,
diff --git a/apps/dav/tests/unit/Connector/Sabre/MaintenancePluginTest.php b/apps/dav/tests/unit/Connector/Sabre/MaintenancePluginTest.php
index 56306e87136..43c32299523 100644
--- a/apps/dav/tests/unit/Connector/Sabre/MaintenancePluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/MaintenancePluginTest.php
@@ -48,27 +48,13 @@ class MaintenancePluginTest extends TestCase {
/**
* @expectedException \Sabre\DAV\Exception\ServiceUnavailable
- * @expectedExceptionMessage System in single user mode.
- */
- public function testSingleUserMode() {
- $this->config
- ->expects($this->once())
- ->method('getSystemValue')
- ->with('singleuser', false)
- ->will($this->returnValue(true));
-
- $this->maintenancePlugin->checkMaintenanceMode();
- }
-
- /**
- * @expectedException \Sabre\DAV\Exception\ServiceUnavailable
- * @expectedExceptionMessage System in single user mode.
+ * @expectedExceptionMessage System in maintenance mode.
*/
public function testMaintenanceMode() {
$this->config
->expects($this->exactly(1))
->method('getSystemValue')
- ->will($this->onConsecutiveCalls([false, true]));
+ ->will($this->returnValue(true));
$this->maintenancePlugin->checkMaintenanceMode();
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php
index 03856807026..8d7485769fa 100644
--- a/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/PrincipalTest.php
@@ -25,6 +25,8 @@
namespace OCA\DAV\Tests\unit\Connector\Sabre;
+use OC\User\User;
+use OCP\IGroup;
use OCP\IGroupManager;
use \Sabre\DAV\PropPatch;
use OCP\IUserManager;
@@ -39,10 +41,8 @@ class PrincipalTest extends TestCase {
private $groupManager;
public function setUp() {
- $this->userManager = $this->getMockBuilder('\OCP\IUserManager')
- ->disableOriginalConstructor()->getMock();
- $this->groupManager = $this->getMockBuilder('\OCP\IGroupManager')
- ->disableOriginalConstructor()->getMock();
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->groupManager = $this->createMock(IGroupManager::class);
$this->connector = new \OCA\DAV\Connector\Sabre\Principal(
$this->userManager,
@@ -56,8 +56,7 @@ class PrincipalTest extends TestCase {
}
public function testGetPrincipalsByPrefixWithUsers() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $fooUser = $this->createMock(User::class);
$fooUser
->expects($this->exactly(1))
->method('getUID')
@@ -70,8 +69,7 @@ class PrincipalTest extends TestCase {
->expects($this->exactly(1))
->method('getEMailAddress')
->will($this->returnValue(''));
- $barUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $barUser = $this->createMock(User::class);
$barUser
->expects($this->exactly(1))
->method('getUID')
@@ -113,8 +111,7 @@ class PrincipalTest extends TestCase {
}
public function testGetPrincipalsByPathWithoutMail() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $fooUser = $this->createMock(User::class);
$fooUser
->expects($this->exactly(1))
->method('getUID')
@@ -134,8 +131,7 @@ class PrincipalTest extends TestCase {
}
public function testGetPrincipalsByPathWithMail() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $fooUser = $this->createMock(User::class);
$fooUser
->expects($this->exactly(1))
->method('getEMailAddress')
@@ -171,8 +167,7 @@ class PrincipalTest extends TestCase {
}
public function testGetGroupMemberSet() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $fooUser = $this->createMock(User::class);
$fooUser
->expects($this->exactly(1))
->method('getUID')
@@ -202,13 +197,15 @@ class PrincipalTest extends TestCase {
}
public function testGetGroupMembership() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
- $group = $this->getMockBuilder('\OCP\IGroup')
- ->disableOriginalConstructor()->getMock();
- $group->expects($this->once())
+ $fooUser = $this->createMock(User::class);
+ $group1 = $this->createMock(IGroup::class);
+ $group1->expects($this->once())
->method('getGID')
->willReturn('group1');
+ $group2 = $this->createMock(IGroup::class);
+ $group2->expects($this->once())
+ ->method('getGID')
+ ->willReturn('foo/bar');
$this->userManager
->expects($this->once())
->method('get')
@@ -217,12 +214,15 @@ class PrincipalTest extends TestCase {
$this->groupManager
->expects($this->once())
->method('getUserGroups')
+ ->with($fooUser)
->willReturn([
- $group
+ $group1,
+ $group2,
]);
$expectedResponse = [
- 'principals/groups/group1'
+ 'principals/groups/group1',
+ 'principals/groups/foo%2Fbar',
];
$response = $this->connector->getGroupMembership('principals/users/foo');
$this->assertSame($expectedResponse, $response);
@@ -259,8 +259,7 @@ class PrincipalTest extends TestCase {
}
public function testFindByUri() {
- $fooUser = $this->getMockBuilder('\OC\User\User')
- ->disableOriginalConstructor()->getMock();
+ $fooUser = $this->createMock(User::class);
$fooUser
->expects($this->exactly(1))
->method('getUID')
diff --git a/apps/dav/tests/unit/DAV/GroupPrincipalTest.php b/apps/dav/tests/unit/DAV/GroupPrincipalTest.php
index e532ed164e9..180fc31040a 100644
--- a/apps/dav/tests/unit/DAV/GroupPrincipalTest.php
+++ b/apps/dav/tests/unit/DAV/GroupPrincipalTest.php
@@ -23,6 +23,7 @@
namespace OCA\DAV\Tests\unit\DAV;
+use OC\Group\Group;
use OCA\DAV\DAV\GroupPrincipalBackend;
use OCP\IGroupManager;
use PHPUnit_Framework_MockObject_MockObject;
@@ -37,8 +38,7 @@ class GroupPrincipalTest extends \Test\TestCase {
private $connector;
public function setUp() {
- $this->groupManager = $this->getMockBuilder('\OCP\IGroupManager')
- ->disableOriginalConstructor()->getMock();
+ $this->groupManager = $this->createMock(IGroupManager::class);
$this->connector = new GroupPrincipalBackend($this->groupManager);
parent::setUp();
@@ -126,6 +126,22 @@ class GroupPrincipalTest extends \Test\TestCase {
$this->assertSame(null, $response);
}
+ public function testGetPrincipalsByPathGroupWithSlash() {
+ $group1 = $this->mockGroup('foo/bar');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('get')
+ ->with('foo/bar')
+ ->will($this->returnValue($group1));
+
+ $expectedResponse = [
+ 'uri' => 'principals/groups/foo%2Fbar',
+ '{DAV:}displayname' => 'foo/bar'
+ ];
+ $response = $this->connector->getPrincipalByPath('principals/groups/foo/bar');
+ $this->assertSame($expectedResponse, $response);
+ }
+
public function testGetGroupMemberSet() {
$response = $this->connector->getGroupMemberSet('principals/groups/foo');
$this->assertSame([], $response);
@@ -153,15 +169,14 @@ class GroupPrincipalTest extends \Test\TestCase {
}
/**
- * @return PHPUnit_Framework_MockObject_MockObject
+ * @return Group|\PHPUnit_Framework_MockObject_MockObject
*/
private function mockGroup($gid) {
- $fooUser = $this->getMockBuilder('\OC\Group\Group')
- ->disableOriginalConstructor()->getMock();
- $fooUser
+ $fooGroup = $this->createMock(Group::class);
+ $fooGroup
->expects($this->exactly(1))
->method('getGID')
->will($this->returnValue($gid));
- return $fooUser;
+ return $fooGroup;
}
}
diff --git a/apps/dav/tests/unit/DAV/HookManagerTest.php b/apps/dav/tests/unit/DAV/HookManagerTest.php
index 9579ce1c6d3..375bda9f3c2 100644
--- a/apps/dav/tests/unit/DAV/HookManagerTest.php
+++ b/apps/dav/tests/unit/DAV/HookManagerTest.php
@@ -195,7 +195,7 @@ class HookManagerTest extends TestCase {
$card = $this->getMockBuilder(CardDavBackend::class)
->disableOriginalConstructor()
->getMock();
- $card->expects($this->once())->method('getAddressBooksForUser')->willReturn([
+ $card->expects($this->once())->method('getUsersOwnAddressBooks')->willReturn([
['id' => 'personal']
]);
$card->expects($this->once())->method('deleteAddressBook');
diff --git a/apps/dav/tests/unit/Files/FileSearchBackendTest.php b/apps/dav/tests/unit/Files/FileSearchBackendTest.php
new file mode 100644
index 00000000000..7de92c59763
--- /dev/null
+++ b/apps/dav/tests/unit/Files/FileSearchBackendTest.php
@@ -0,0 +1,304 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @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\Tests\Files;
+
+use OC\Files\Search\SearchComparison;
+use OC\Files\Search\SearchQuery;
+use OC\Files\View;
+use OCA\DAV\Connector\Sabre\Directory;
+use OCA\DAV\Connector\Sabre\File;
+use OCA\DAV\Connector\Sabre\FilesPlugin;
+use OCA\DAV\Files\FileSearchBackend;
+use OCP\Files\FileInfo;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\Search\ISearchComparison;
+use OCP\IUser;
+use OCP\Share\IManager;
+use Sabre\DAV\Tree;
+use SearchDAV\XML\BasicSearch;
+use SearchDAV\XML\Literal;
+use SearchDAV\XML\Operator;
+use SearchDAV\XML\Scope;
+use Test\TestCase;
+
+class FileSearchBackendTest extends TestCase {
+ /** @var Tree|\PHPUnit_Framework_MockObject_MockObject */
+ private $tree;
+
+ /** @var IUser */
+ private $user;
+
+ /** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */
+ private $rootFolder;
+
+ /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
+ private $shareManager;
+
+ /** @var View|\PHPUnit_Framework_MockObject_MockObject */
+ private $view;
+
+ /** @var Folder|\PHPUnit_Framework_MockObject_MockObject */
+ private $searchFolder;
+
+ /** @var FileSearchBackend */
+ private $search;
+
+ /** @var Directory|\PHPUnit_Framework_MockObject_MockObject */
+ private $davFolder;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->user = $this->createMock(IUser::class);
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('test');
+
+ $this->tree = $this->getMockBuilder(Tree::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->view = $this->getMockBuilder(View::class)
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->view->expects($this->any())
+ ->method('getRelativePath')
+ ->willReturnArgument(0);
+
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+
+ $this->shareManager = $this->createMock(IManager::class);
+
+ $this->searchFolder = $this->createMock(Folder::class);
+
+ $fileInfo = $this->createMock(FileInfo::class);
+
+ $this->davFolder = $this->createMock(Directory::class);
+
+ $this->davFolder->expects($this->any())
+ ->method('getFileInfo')
+ ->willReturn($fileInfo);
+
+ $this->rootFolder->expects($this->any())
+ ->method('get')
+ ->willReturn($this->searchFolder);
+
+ $this->search = new FileSearchBackend($this->tree, $this->user, $this->rootFolder, $this->shareManager, $this->view);
+ }
+
+ public function testSearchFilename() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->once())
+ ->method('search')
+ ->with(new SearchQuery(
+ new SearchComparison(
+ ISearchComparison::COMPARE_EQUAL,
+ 'name',
+ 'foo'
+ ),
+ 0,
+ 0,
+ [],
+ $this->user
+ ))
+ ->will($this->returnValue([
+ new \OC\Files\Node\Folder($this->rootFolder, $this->view, '/test/path')
+ ]));
+
+ $query = $this->getBasicQuery(Operator::OPERATION_EQUAL, '{DAV:}displayname', 'foo');
+ $result = $this->search->search($query);
+
+ $this->assertCount(1, $result);
+ $this->assertEquals('/files/test/test/path', $result[0]->href);
+ }
+
+ public function testSearchMimetype() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->once())
+ ->method('search')
+ ->with(new SearchQuery(
+ new SearchComparison(
+ ISearchComparison::COMPARE_EQUAL,
+ 'mimetype',
+ 'foo'
+ ),
+ 0,
+ 0,
+ [],
+ $this->user
+ ))
+ ->will($this->returnValue([
+ new \OC\Files\Node\Folder($this->rootFolder, $this->view, '/test/path')
+ ]));
+
+ $query = $this->getBasicQuery(Operator::OPERATION_EQUAL, '{DAV:}getcontenttype', 'foo');
+ $result = $this->search->search($query);
+
+ $this->assertCount(1, $result);
+ $this->assertEquals('/files/test/test/path', $result[0]->href);
+ }
+
+ public function testSearchSize() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->once())
+ ->method('search')
+ ->with(new SearchQuery(
+ new SearchComparison(
+ ISearchComparison::COMPARE_GREATER_THAN,
+ 'size',
+ 10
+ ),
+ 0,
+ 0,
+ [],
+ $this->user
+ ))
+ ->will($this->returnValue([
+ new \OC\Files\Node\Folder($this->rootFolder, $this->view, '/test/path')
+ ]));
+
+ $query = $this->getBasicQuery(Operator::OPERATION_GREATER_THAN, FilesPlugin::SIZE_PROPERTYNAME, 10);
+ $result = $this->search->search($query);
+
+ $this->assertCount(1, $result);
+ $this->assertEquals('/files/test/test/path', $result[0]->href);
+ }
+
+ public function testSearchMtime() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->once())
+ ->method('search')
+ ->with(new SearchQuery(
+ new SearchComparison(
+ ISearchComparison::COMPARE_GREATER_THAN,
+ 'mtime',
+ 10
+ ),
+ 0,
+ 0,
+ [],
+ $this->user
+ ))
+ ->will($this->returnValue([
+ new \OC\Files\Node\Folder($this->rootFolder, $this->view, '/test/path')
+ ]));
+
+ $query = $this->getBasicQuery(Operator::OPERATION_GREATER_THAN, '{DAV:}getlastmodified', 10);
+ $result = $this->search->search($query);
+
+ $this->assertCount(1, $result);
+ $this->assertEquals('/files/test/test/path', $result[0]->href);
+ }
+
+ public function testSearchIsCollection() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->once())
+ ->method('search')
+ ->with(new SearchQuery(
+ new SearchComparison(
+ ISearchComparison::COMPARE_EQUAL,
+ 'mimetype',
+ FileInfo::MIMETYPE_FOLDER
+ ),
+ 0,
+ 0,
+ [],
+ $this->user
+ ))
+ ->will($this->returnValue([
+ new \OC\Files\Node\Folder($this->rootFolder, $this->view, '/test/path')
+ ]));
+
+ $query = $this->getBasicQuery(Operator::OPERATION_IS_COLLECTION, 'yes');
+ $result = $this->search->search($query);
+
+ $this->assertCount(1, $result);
+ $this->assertEquals('/files/test/test/path', $result[0]->href);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testSearchInvalidProp() {
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($this->davFolder);
+
+ $this->searchFolder->expects($this->never())
+ ->method('search');
+
+ $query = $this->getBasicQuery(Operator::OPERATION_EQUAL, '{DAV:}getetag', 'foo');
+ $this->search->search($query);
+ }
+
+ private function getBasicQuery($type, $property, $value = null) {
+ $query = new BasicSearch();
+ $scope = new Scope('/', 'infinite');
+ $scope->path = '/';
+ $query->from = [$scope];
+ $query->orderBy = [];
+ $query->select = [];
+ if (is_null($value)) {
+ $query->where = new Operator(
+ $type,
+ [new Literal($property)]
+ );
+ } else {
+ $query->where = new Operator(
+ $type,
+ [$property, new Literal($value)]
+ );
+ }
+ return $query;
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testSearchNonFolder() {
+ $davNode = $this->createMock(File::class);
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->willReturn($davNode);
+
+ $query = $this->getBasicQuery(Operator::OPERATION_EQUAL, '{DAV:}displayname', 'foo');
+ $this->search->search($query);
+ }
+}
diff --git a/apps/dav/tests/unit/Migration/ValueFixInsertTest.php b/apps/dav/tests/unit/Migration/ValueFixInsertTest.php
new file mode 100644
index 00000000000..26152e7d01d
--- /dev/null
+++ b/apps/dav/tests/unit/Migration/ValueFixInsertTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\Tests\Unit\DAV\Migration;
+
+use OCA\DAV\Migration\ValueFix;
+use OCA\DAV\Migration\ValueFixInsert;
+use OCP\BackgroundJob\IJobList;
+use OCP\IConfig;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Migration\IOutput;
+use Test\TestCase;
+
+class ValueFixInsertTest extends TestCase {
+ /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
+ private $userManager;
+
+ /** @var IJobList|\PHPUnit_Framework_MockObject_MockObject */
+ private $jobList;
+
+ /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
+ private $config;
+
+ /** @var ValueFixInsert */
+ private $job;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->jobList = $this->createMock(IJobList::class);
+ $this->config = $this->createMock(IConfig::class);
+ $this->job = new ValueFixInsert(
+ $this->userManager,
+ $this->jobList,
+ $this->config
+ );
+ }
+
+ public function testGetName() {
+ $this->assertSame('Insert ValueFix background job for each user', $this->job->getName());
+ }
+
+ public function testRun() {
+ $user1 = $this->createMock(IUser::class);
+ $user1->method('getUID')->willReturn('user1');
+ $user2 = $this->createMock(IUser::class);
+ $user2->method('getUID')->willReturn('user2');
+
+ $this->config->method('getAppValue')
+ ->with(
+ $this->equalTo('dav'),
+ $this->equalTo(ValueFixInsert::class.'_ran'),
+ $this->anything()
+ )->will($this->returnCallback(function($app, $key, $value) {
+ return $value;
+ }));
+
+ $this->userManager->method('callForSeenUsers')
+ ->will($this->returnCallback(function(\Closure $function) use ($user1, $user2) {
+ $function($user1);
+ $function($user2);
+ }));
+
+ $this->jobList->expects($this->at(0))
+ ->method('add')
+ ->with(
+ $this->equalTo(ValueFix::class),
+ $this->equalTo(['user' => 'user1'])
+ );
+ $this->jobList->expects($this->at(1))
+ ->method('add')
+ ->with(
+ $this->equalTo(ValueFix::class),
+ $this->equalTo(['user' => 'user2'])
+ );
+
+ $this->job->run($this->createMock(IOutput::class));
+ }
+
+ public function testRunOnlyOnce() {
+ $this->config->method('getAppValue')
+ ->with(
+ $this->equalTo('dav'),
+ $this->equalTo(ValueFixInsert::class.'_ran'),
+ $this->anything()
+ )->willReturn('true');
+
+ $this->userManager->expects($this->never())
+ ->method($this->anything());;
+
+ $this->jobList->expects($this->never())
+ ->method($this->anything());
+
+ $this->job->run($this->createMock(IOutput::class));
+ }
+}
diff --git a/apps/dav/tests/unit/Migration/ValueFixTest.php b/apps/dav/tests/unit/Migration/ValueFixTest.php
new file mode 100644
index 00000000000..58b6f79621f
--- /dev/null
+++ b/apps/dav/tests/unit/Migration/ValueFixTest.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\Tests\Unit\DAV\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\DAV\Migration\ValueFix;
+use OCP\ILogger;
+use Sabre\VObject\InvalidDataException;
+use Test\TestCase;
+
+class ValueFixTest extends TestCase {
+
+ /** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
+ private $logger;
+
+ /** @var CalDavBackend|\PHPUnit_Framework_MockObject_MockObject */
+ private $backend;
+
+ /** @var string */
+ private $invalid = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.11.2//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;VALUE=:20151223T223000Z
+LAST-MODIFIED:20151214T091032Z
+ORGANIZER;CN="User 1":mailto:user1@example.com
+UID:1234567890@example.com
+DTSTAMP:20151214T091032Z
+STATUS:CONFIRMED
+SEQUENCE:0
+SUMMARY:Ein Geburtstag
+DTSTART;VALUE=:20151223T173000Z
+X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
+CREATED;VALUE=:20151214T091032Z
+END:VEVENT
+END:VCALENDAR';
+
+ /** @var string */
+ private $valid = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.11.2//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND:20151223T223000Z
+LAST-MODIFIED:20151214T091032Z
+ORGANIZER;CN="User 1":mailto:user1@example.com
+UID:1234567890@example.com
+DTSTAMP:20151214T091032Z
+STATUS:CONFIRMED
+SEQUENCE:0
+SUMMARY:Ein Geburtstag
+DTSTART:20151223T173000Z
+X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
+CREATED:20151214T091032Z
+END:VEVENT
+END:VCALENDAR';
+
+ /** @var ValueFix */
+ private $job;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->logger = $this->createMock(ILogger::class);
+ $this->backend = $this->createMock(CalDavBackend::class);
+ $this->job = new ValueFix(
+ $this->backend,
+ $this->logger
+ );
+ }
+
+ public function testRunInvalid() {
+ $calendars = [['id' => 42]];
+ $objects = [['uri' => 'myuri']];
+
+ $this->backend->method('getCalendarsForUser')
+ ->with($this->equalTo('principals/users/u1'))
+ ->willReturn($calendars);
+
+ $this->backend->method('getCalendarObjects')
+ ->with($this->equalTo(42))
+ ->willReturn($objects);
+
+ $this->backend->method('getCalendarObject')
+ ->with(
+ $this->equalTo(42),
+ $this->equalTo('myuri')
+ )->willReturn([
+ 'calendardata' => $this->invalid
+ ]);
+
+ $this->backend->expects($this->once())
+ ->method('getDenormalizedData')
+ ->with($this->valid);
+
+ $this->backend->expects($this->once())
+ ->method('updateCalendarObject')
+ ->with(
+ $this->equalTo(42),
+ $this->equalTo('myuri'),
+ $this->equalTo($this->valid)
+ );
+
+ $this->job->run(['user' => 'u1']);
+ }
+
+ public function testRunValid() {
+ $calendars = [['id' => 42]];
+ $objects = [['uri' => 'myuri']];
+
+ $this->backend->method('getCalendarsForUser')
+ ->with($this->equalTo('principals/users/u1'))
+ ->willReturn($calendars);
+
+ $this->backend->method('getCalendarObjects')
+ ->with($this->equalTo(42))
+ ->willReturn($objects);
+
+ $this->backend->method('getCalendarObject')
+ ->with(
+ $this->equalTo(42),
+ $this->equalTo('myuri')
+ )->willReturn([
+ 'calendardata' => $this->valid
+ ]);
+
+ $this->backend->expects($this->never())
+ ->method('getDenormalizedData');
+
+ $this->backend->expects($this->never())
+ ->method('updateCalendarObject');
+
+ $this->job->run(['user' => 'u1']);
+ }
+
+ public function testRunStillInvalid() {
+ $calendars = [['id' => 42]];
+ $objects = [['uri' => 'myuri']];
+
+ $this->backend->method('getCalendarsForUser')
+ ->with($this->equalTo('principals/users/u1'))
+ ->willReturn($calendars);
+
+ $this->backend->method('getCalendarObjects')
+ ->with($this->equalTo(42))
+ ->willReturn($objects);
+
+ $this->backend->method('getCalendarObject')
+ ->with(
+ $this->equalTo(42),
+ $this->equalTo('myuri')
+ )->willReturn([
+ 'calendardata' => $this->invalid
+ ]);
+
+ $this->backend->expects($this->once())
+ ->method('getDenormalizedData')
+ ->with($this->valid)
+ ->willThrowException(new InvalidDataException());
+
+ $this->logger->expects($this->once())
+ ->method('info')
+ ->with(
+ $this->equalTo('Calendar object for calendar {cal} with uri {uri} still invalid'),
+ $this->equalTo([
+ 'app'=> 'dav',
+ 'cal' => 42,
+ 'uri' => 'myuri',
+ ])
+ );
+
+ $this->backend->expects($this->never())
+ ->method('updateCalendarObject');
+
+ $this->job->run(['user' => 'u1']);
+ }
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php b/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php
index 43674f4b795..3722bd9d25a 100644
--- a/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php
+++ b/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php
@@ -24,19 +24,17 @@
namespace OCA\DAV\Tests\unit\SystemTag;
-use Sabre\DAV\Exception\NotFound;
-use Sabre\DAV\Exception\MethodNotAllowed;
-use Sabre\DAV\Exception\Conflict;
use OC\SystemTag\SystemTag;
use OCP\SystemTag\TagNotFoundException;
use OCP\SystemTag\TagAlreadyExistsException;
use OCP\SystemTag\ISystemTag;
+use Sabre\DAV\Exception\Forbidden;
class SystemTagNodeTest extends \Test\TestCase {
/**
- * @var \OCP\SystemTag\ISystemTagManager
+ * @var \OCP\SystemTag\ISystemTagManager|\PHPUnit_Framework_MockObject_MockObject
*/
private $tagManager;
@@ -113,7 +111,7 @@ class SystemTagNodeTest extends \Test\TestCase {
/**
* @dataProvider tagNodeProvider
*/
- public function testUpdateTag($isAdmin, $originalTag, $changedArgs) {
+ public function testUpdateTag($isAdmin, ISystemTag $originalTag, $changedArgs) {
$this->tagManager->expects($this->once())
->method('canUserSeeTag')
->with($originalTag)
@@ -173,7 +171,7 @@ class SystemTagNodeTest extends \Test\TestCase {
/**
* @dataProvider tagNodeProviderPermissionException
*/
- public function testUpdateTagPermissionException($originalTag, $changedArgs, $expectedException = null) {
+ public function testUpdateTagPermissionException(ISystemTag $originalTag, $changedArgs, $expectedException = null) {
$this->tagManager->expects($this->any())
->method('canUserSeeTag')
->with($originalTag)
@@ -242,17 +240,16 @@ class SystemTagNodeTest extends \Test\TestCase {
*/
public function testDeleteTag($isAdmin) {
$tag = new SystemTag(1, 'tag1', true, true);
- $this->tagManager->expects($this->once())
+ $this->tagManager->expects($isAdmin ? $this->once() : $this->never())
->method('canUserSeeTag')
->with($tag)
->will($this->returnValue(true));
- $this->tagManager->expects($this->once())
- ->method('canUserAssignTag')
- ->with($tag)
- ->will($this->returnValue(true));
- $this->tagManager->expects($this->once())
+ $this->tagManager->expects($isAdmin ? $this->once() : $this->never())
->method('deleteTags')
->with('1');
+ if (!$isAdmin) {
+ $this->setExpectedException(Forbidden::class);
+ }
$this->getTagNode($isAdmin, $tag)->delete();
}
@@ -261,7 +258,7 @@ class SystemTagNodeTest extends \Test\TestCase {
[
// cannot delete invisible tag
new SystemTag(1, 'Original', false, true),
- 'Sabre\DAV\Exception\NotFound',
+ 'Sabre\DAV\Exception\Forbidden',
],
[
// cannot delete non-assignable tag
@@ -279,20 +276,11 @@ class SystemTagNodeTest extends \Test\TestCase {
->method('canUserSeeTag')
->with($tag)
->will($this->returnValue($tag->isUserVisible()));
- $this->tagManager->expects($this->any())
- ->method('canUserAssignTag')
- ->with($tag)
- ->will($this->returnValue($tag->isUserAssignable()));
$this->tagManager->expects($this->never())
->method('deleteTags');
- try {
- $this->getTagNode(false, $tag)->delete();
- } catch (\Exception $e) {
- $thrown = $e;
- }
-
- $this->assertInstanceOf($expectedException, $thrown);
+ $this->setExpectedException($expectedException);
+ $this->getTagNode(false, $tag)->delete();
}
/**
@@ -304,14 +292,10 @@ class SystemTagNodeTest extends \Test\TestCase {
->method('canUserSeeTag')
->with($tag)
->will($this->returnValue($tag->isUserVisible()));
- $this->tagManager->expects($this->any())
- ->method('canUserAssignTag')
- ->with($tag)
- ->will($this->returnValue($tag->isUserAssignable()));
$this->tagManager->expects($this->once())
->method('deleteTags')
->with('1')
->will($this->throwException(new TagNotFoundException()));
- $this->getTagNode(false, $tag)->delete();
+ $this->getTagNode(true, $tag)->delete();
}
}