diff options
Diffstat (limited to 'apps/dav')
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> <!– WebDAV collection sync REPORT on Homes –>--> + <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> <!– WebDAV collection sync REPORT on Homes –>--> + <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(); } } |