diff --git a/.travis.yml b/.travis.yml index 5e22defc8a0d..fffd5c47381c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,6 +60,10 @@ matrix: env: DB=sqlite;TC=carddav - php: 5.6 env: DB=sqlite;TC=caldav + - php: 5.6 + env: DB=sqlite;TC=caldav-old-endpoint + - php: 5.6 + env: DB=sqlite;TC=carddav-old-endpoint - php: 5.6 env: DB=pgsql;TC=selenium;TEST_DAV=0 - php: 5.6 diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php index 1059b7f96daf..1209a25c76e8 100644 --- a/apps/dav/appinfo/v1/caldav.php +++ b/apps/dav/appinfo/v1/caldav.php @@ -48,7 +48,7 @@ $db = \OC::$server->getDatabaseConnection(); $config = \OC::$server->getConfig(); $random = \OC::$server->getSecureRandom(); -$calDavBackend = new CalDavBackend($db, $principalBackend, $config, $random); +$calDavBackend = new CalDavBackend($db, $principalBackend, $config, $random, true); $debugging = \OC::$server->getConfig()->getSystemValue('debug', false); @@ -79,8 +79,9 @@ $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\Plugin()); $server->addPlugin(new OCA\DAV\CalDAV\Schedule\IMipPlugin( \OC::$server->getMailer(), \OC::$server->getLogger())); $server->addPlugin(new ExceptionLoggerPlugin('caldav', \OC::$server->getLogger())); diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index d68be5e60071..8f2d09bea694 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -46,7 +46,7 @@ 'principals/' ); $db = \OC::$server->getDatabaseConnection(); -$cardDavBackend = new CardDavBackend($db, $principalBackend); +$cardDavBackend = new CardDavBackend($db, $principalBackend, null, true); $debugging = \OC::$server->getConfig()->getSystemValue('debug', false); @@ -76,6 +76,7 @@ $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/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 2e5d287661a4..41f5cd1cecf9 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -24,6 +24,7 @@ namespace OCA\DAV\CalDAV; +use Doctrine\DBAL\Connection; use OCA\DAV\DAV\Sharing\IShareable; use OCP\DB\QueryBuilder\IQueryBuilder; use OCA\DAV\Connector\Sabre\Principal; @@ -116,6 +117,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription /** @var ISecureRandom */ private $random; + /** @var bool */ + private $legacyMode; /** * CalDavBackend constructor. @@ -127,12 +130,14 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription public function __construct(IDBConnection $db, Principal $principalBackend, IConfig $config, - ISecureRandom $random) { + ISecureRandom $random, + $legacyMode = false) { $this->db = $db; $this->principalBackend = $principalBackend; $this->sharingBackend = new Backend($this->db, $principalBackend, 'calendar'); $this->config = $config; $this->random = $random; + $this->legacyMode = $legacyMode; } /** @@ -189,7 +194,7 @@ function getCalendarsForUser($principalUri) { $calendar = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $this->convertPrincipal($row['principaluri'], false), + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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), @@ -226,7 +231,7 @@ function getCalendarsForUser($principalUri) { ->where($query->expr()->in('s.principaluri', $query->createParameter('principaluri'))) ->andWhere($query->expr()->eq('s.type', $query->createParameter('type'))) ->setParameter('type', 'calendar') - ->setParameter('principaluri', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY) + ->setParameter('principaluri', $principals, Connection::PARAM_STR_ARRAY) ->execute(); while($row = $result->fetch()) { @@ -240,12 +245,12 @@ function getCalendarsForUser($principalUri) { $calendar = [ 'id' => $row['id'], 'uri' => $uri, - 'principaluri' => $principalUri, + 'principaluri' => $this->convertPrincipal($principalUri), '{' . 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']), '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}read-only' => (int)$row['access'] === Backend::ACCESS_READ, ]; @@ -290,7 +295,7 @@ public function getUsersOwnCalendars($principalUri) { $calendar = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $this->convertPrincipal($row['principaluri'], false), + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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), @@ -343,12 +348,12 @@ public function getPublicCalendars() { $calendar = [ 'id' => $row['id'], 'uri' => $row['publicuri'], - 'principaluri' => $row['principaluri'], + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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']), '{' . \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, ]; @@ -407,12 +412,12 @@ public function getPublicCalendar($uri) { $calendar = [ 'id' => $row['id'], 'uri' => $row['publicuri'], - 'principaluri' => $row['principaluri'], + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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']), '{' . \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, ]; @@ -461,7 +466,7 @@ public function getCalendarByUri($principal, $uri) { $calendar = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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), @@ -505,7 +510,7 @@ public function getCalendarById($calendarId) { $calendar = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{' . 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), @@ -529,8 +534,10 @@ public function getCalendarById($calendarId) { * @param string $calendarUri * @param array $properties * @return int + * @throws DAV\Exception */ function createCalendar($principalUri, $calendarUri, array $properties) { + $principalUri = $this->convertPrincipal($principalUri, true); $values = [ 'principaluri' => $principalUri, 'uri' => $calendarUri, @@ -580,6 +587,7 @@ function createCalendar($principalUri, $calendarUri, array $properties) { * * Read the PropPatch documentation for more info and examples. * + * @param mixed $calendarId * @param PropPatch $propPatch * @return void */ @@ -639,11 +647,11 @@ function deleteCalendar($calendarId) { /** * Delete all of an user's shares * - * @param string $principaluri + * @param string $principalUri * @return void */ - function deleteAllSharesForUser($principaluri) { - $this->sharingBackend->deleteAllSharesByUser($principaluri); + function deleteAllSharesForUser($principalUri) { + $this->sharingBackend->deleteAllSharesByUser($principalUri); } /** @@ -1657,10 +1665,11 @@ public function applyShareAcl($resourceId, $acl) { return $this->sharingBackend->applyShareAcl($resourceId, $acl); } - private function convertPrincipal($principalUri, $toV2) { + private function convertPrincipal($principalUri, $toV2 = null) { if ($this->principalBackend->getPrincipalPrefix() === 'principals') { list(, $name) = URLUtil::splitPath($principalUri); - if ($toV2 === true) { + $toV2 = $toV2 === null ? !$this->legacyMode : $toV2; + if ($toV2) { return "principals/users/$name"; } return "principals/$name"; diff --git a/apps/dav/lib/CalDAV/Schedule/Plugin.php b/apps/dav/lib/CalDAV/Schedule/Plugin.php new file mode 100644 index 000000000000..b5e4ce8c90bd --- /dev/null +++ b/apps/dav/lib/CalDAV/Schedule/Plugin.php @@ -0,0 +1,37 @@ + + * + * @copyright Copyright (c) 2017, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\CalDAV\Schedule; + + +class Plugin extends \Sabre\CalDAV\Schedule\Plugin { + + public function getAddressesForPrincipal($principal) { + $result = parent::getAddressesForPrincipal($principal); + if ($result === null) { + return []; + } + + return $result; + } + +} diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index fdf82ca74dd7..e3987f172fc1 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -66,6 +66,8 @@ class CardDavBackend implements BackendInterface, SyncSupport { /** @var EventDispatcherInterface */ private $dispatcher; + /** @var bool */ + private $legacyMode; /** * CardDavBackend constructor. @@ -76,11 +78,13 @@ class CardDavBackend implements BackendInterface, SyncSupport { */ public function __construct(IDBConnection $db, Principal $principalBackend, - EventDispatcherInterface $dispatcher = null) { + EventDispatcherInterface $dispatcher = null, + $legacyMode = false) { $this->db = $db; $this->principalBackend = $principalBackend; $this->dispatcher = $dispatcher; $this->sharingBackend = new Backend($this->db, $principalBackend, 'addressbook'); + $this->legacyMode = $legacyMode; } /** @@ -114,7 +118,7 @@ function getUsersOwnAddressBooks($principalUri) { $addressBooks[$row['id']] = [ 'id' => $row['id'], 'uri' => $row['uri'], - 'principaluri' => $this->convertPrincipal($row['principaluri'], false), + 'principaluri' => $this->convertPrincipal($row['principaluri']), '{DAV:}displayname' => $row['displayname'], '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], @@ -999,10 +1003,11 @@ public function applyShareAcl($addressBookId, $acl) { return $this->sharingBackend->applyShareAcl($addressBookId, $acl); } - private function convertPrincipal($principalUri, $toV2) { + private function convertPrincipal($principalUri, $toV2 = null) { if ($this->principalBackend->getPrincipalPrefix() === 'principals') { list(, $name) = URLUtil::splitPath($principalUri); - if ($toV2 === true) { + $toV2 = $toV2 === null ? !$this->legacyMode : $toV2; + if ($toV2) { return "principals/users/$name"; } return "principals/$name"; diff --git a/apps/dav/lib/Connector/LegacyDAVACL.php b/apps/dav/lib/Connector/LegacyDAVACL.php index b4a6f0f5a28a..b7e1fd3c456f 100644 --- a/apps/dav/lib/Connector/LegacyDAVACL.php +++ b/apps/dav/lib/Connector/LegacyDAVACL.php @@ -32,24 +32,9 @@ class LegacyDAVACL extends DavAclPlugin { /** - * Converts the v1 principal `principal/` to the new v2 - * `principal/users/` 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 []; @@ -72,7 +57,7 @@ private function convertPrincipal($principal, $toV2) { 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()) { @@ -81,6 +66,6 @@ function propFind(PropFind $propFind, INode $node) { return new Principal(Principal::UNAUTHENTICATED); } }); - parent::propFind($propFind, $node); + return parent::propFind($propFind, $node); } } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 7c51eeb36aa7..9f7761033397 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -111,7 +111,7 @@ public function __construct(IRequest $request, $baseUri) { // calendar plugins $this->server->addPlugin(new \OCA\DAV\CalDAV\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); - $this->server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin()); + $this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin()); $this->server->addPlugin(new IMipPlugin($mailer, $logger)); $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin()); diff --git a/apps/dav/tests/travis/caldav-old-endpoint/install.sh b/apps/dav/tests/travis/caldav-old-endpoint/install.sh new file mode 100644 index 000000000000..e0ac30c9e46b --- /dev/null +++ b/apps/dav/tests/travis/caldav-old-endpoint/install.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + + +cd "$SCRIPTPATH" +if [ ! -f CalDAVTester/testcaldav.py ]; then + git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester +fi +if [ ! -f pycalendar/setup.py ]; then + git clone https://github.com/apple/ccs-pycalendar.git pycalendar +fi + +# create test user +cd "$SCRIPTPATH/../../../../../" +OC_PASS=user01 php occ user:add --password-from-env user01 +php occ dav:create-calendar user01 calendar +php occ dav:create-calendar user01 shared +OC_PASS=user02 php occ user:add --password-from-env user02 +php occ dav:create-calendar user02 calendar +cd "$SCRIPTPATH/../../../../../" diff --git a/apps/dav/tests/travis/caldav-old-endpoint/script.sh b/apps/dav/tests/travis/caldav-old-endpoint/script.sh new file mode 100644 index 000000000000..a40a4d6cec94 --- /dev/null +++ b/apps/dav/tests/travis/caldav-old-endpoint/script.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + +# Move the endpoint to the serverinfo file +rm "$SCRIPTPATH/../caldavtest/serverinfo.xml" +cp "$SCRIPTPATH/../caldavtest/serverinfo-caldav-old-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml" + +# start the server +php -S 127.0.0.1:8889 -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 "$SCRIPTPATH/../../../../../data/owncloud.log" + +exit $RESULT diff --git a/apps/dav/tests/travis/caldav/script.sh b/apps/dav/tests/travis/caldav/script.sh index 7259372567cd..d4d453e551e8 100644 --- a/apps/dav/tests/travis/caldav/script.sh +++ b/apps/dav/tests/travis/caldav/script.sh @@ -3,7 +3,7 @@ SCRIPT=`realpath $0` SCRIPTPATH=`dirname $SCRIPT` # start the server -php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." & +php -S 127.0.0.1:8889 -t "$SCRIPTPATH/../../../../.." & sleep 30 @@ -16,6 +16,6 @@ PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onf RESULT=$? -tail "$/../../../../../data-autotest/owncloud.log" +tail "$SCRIPTPATH/../../../../../data/owncloud.log" exit $RESULT diff --git a/apps/dav/tests/travis/caldavtest/serverinfo-caldav-old-endpoint.xml b/apps/dav/tests/travis/caldavtest/serverinfo-caldav-old-endpoint.xml new file mode 100644 index 000000000000..fda243953acf --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/serverinfo-caldav-old-endpoint.xml @@ -0,0 +1,849 @@ + + + + + + + + localhost + 8889 + basic + + + 120 + 0.25 + 30 + + + + COPY Method + MOVE Method + Extended MKCOL + + + ACL Method + acl-principal-prop-set REPORT + principal-match REPORT + principal-property-search REPORT + principal-search-property-set REPORT + calendarserver-principal-search REPORT + + add-member + + brief + bulk-post + ctag + current-user-principal + directory listing + extended-principal-search + expand-property + only-proxy-groups + limits + own-root + prefer + prefer-minimal + prefer-representation + prefer-noroot + quota + + resource-id + sync-report + + + sync-report-config-token + well-known + + + + + json-data + + + control-api + + + caldav + attachments-collection + auto-accept + auto-accept-modes + client-fix-TRANSP + + default-alarms + EMAIL parameter + extended-freebusy + freebusy-url + group-attendee-expansion + implicit-scheduling + location-resource-tracking + managed-attachments + maskuid + no-duplicate-uids + partstat-timestamp + + private-comments + private-events + proxy + + recurrence-splitting + remove-duplicate-alarms + query-extended + shared-calendars + share-calendars-to-groups + schedule-changes + split-calendars + supported-component-sets + supported-component-sets-one + timerange-low-limit + timerange-high-limit + timezones-by-reference + timezone-service + timezone-std-service + + travel-time-busy + vavailability + + webcal + + + carddav + default-addressbook + shared-addressbooks + shared-addressbook-groups + directory-gateway + + + + + + + $multistatus-response-prefix: + /{DAV:}multistatus/{DAV:}response + + + $multistatus-href-prefix: + /{DAV:}multistatus/{DAV:}response/{DAV:}href + + + $verify-response-prefix: + {DAV:}response/{DAV:}propstat/{DAV:}prop + + + $verify-property-prefix: + /{DAV:}multistatus/{DAV:}response/{DAV:}propstat/{DAV:}prop + + + $verify-bad-response: + /{DAV:}multistatus/{DAV:}response/{DAV:}status + + + $verify-error-response: + /{DAV:}multistatus/{DAV:}response/{DAV:}error + + + $CALDAV: + urn:ietf:params:xml:ns:caldav + + + $CARDDAV: + urn:ietf:params:xml:ns:carddav + + + $CS: + http://calendarserver.org/ns/ + + + + + + + + $root: + /remote.php/caldav/ + + + + + $principalcollection: + $root:principals/ + + + + + $uidstype: + __uids__ + + + $groupstype: + groups + + + $locationstype: + locations + + + $resourcestype: + resources + + + + + $principals_uids: + $principalcollection:$uidstype:/ + + + $principals_users: + $principalcollection: + + + $principals_groups: + $principalcollection:$groupstype:/ + + + $principals_resources: + $principalcollection:$resourcestype:/ + + + $principals_locations: + $principalcollection:$locationstype:/ + + + + + $calendars: + $root:calendars/ + + + + + $calendars_uids: + $calendars:$uidstype:/ + + + $calendars_users: + $calendars: + + + $calendars_resources: + $calendars:$resourcestype:/ + + + $calendars_locations: + $calendars:$locationstype:/ + + + + + $calendar: + calendar + + + + + $tasks: + tasks + + + + + $polls: + polls + + + + + $inbox: + inbox + + + + + $outbox: + outbox + + + + + $dropbox: + dropbox + + + + + $attachments: + dropbox + + + + + $notification: + notification + + + + + $freebusy: + freebusy + + + + + $calendar_home_items_initial_sync: + [-,$calendar:/,$tasks:/,$inbox:/,$outbox:/,$freebusy:,$notification:/] + + + + + $calendar_sync_extra_items: + [-] + + + + + $calendar_sync_extra_count: + 1 + + + + + $servertoserver: + $root:inbox + + + + + $timezoneservice: + $root:timezones + + + + + $timezonestdservice: + $root:stdtimezones + + + + + $addressbooks: + $root:addressbooks/ + + + + + $addressbooks_uids: + $addressbooks:$uidstype:/ + + + $addressbooks_users: + $addressbooks: + + + + + $addressbook: + addressbook + + + + + $directory: + $root:directory/ + + + + + $add-member: + ;add-member + + + + + $useradmin: + admin + + + + $useradminguid: + 0C8BDE62-E600-4696-83D3-8B5ECABDFD2E + + + + $pswdadmin: + admin + + + + + $principal_admin: + $principals_users:$useradmin:/ + + + $principaluri_admin: + $principals_uids:$useradminguid:/ + + + + + $userapprentice: + apprentice + + + + $userapprenticeguid: + 29B6C503-11DF-43EC-8CCA-40C7003149CE + + + + $pswdapprentice: + apprentice + + + + + $principal_apprentice: + $principals_users:$userapprentice:/ + + + $principaluri_apprentice: + $principals_uids:$userapprenticeguid:/ + + + + + $userproxy: + superuser + + + + $pswdproxy: + superuser + + + + + + + $userid%d: + user%02d + + + + $userguid%d: + 10000000-0000-0000-0000-000000000%03d + + + + $username%d: + User %02d + + + + $username-encoded%d: + User%%20%02d + + + + $firstname%d: + User + + + + $lastname%d: + %02d + + + + $pswd%d: + user%02d + + + + $principal%d: + $principals_users:$userid%d:/ + + + $principaluri%d: + $principals_users:$userid%d:/ + + + $principal%dnoslash: + $principals_users:$userid%d: + + + + + $calendarhome%d: + $calendars:$userid%d: + + + + $calendarhomealt%d: + $calendars_users:$userid%d: + + + + $calendarpath%d: + $calendarhome%d:/$calendar: + + + + $calendarpathalt%d: + $calendarhomealt%d:/$calendar: + + + + $taskspath%d: + $calendarhome%d:/$tasks: + + + + $pollspath%d: + $calendarhome%d:/$polls: + + + + $inboxpath%d: + $calendarhome%d:/$inbox: + + + + $outboxpath%d: + $calendarhome%d:/$outbox: + + + + $dropboxpath%d: + $calendarhome%d:/$dropbox: + + + + $notificationpath%d: + $calendarhome%d:/$notification: + + + + $freebusypath%d: + $calendarhome%d:/$freebusy: + + + $email%d: + $userid%d:@example.com + + + + $cuaddr%d: + mailto:$email%d: + + + $cuaddralt%d: + $cuaddr%d: + + + $cuaddraltnoslash%d: + $cuaddr%d: + + + $cuaddrurn%d: + urn:x-uid:$userguid%d: + + + + + $addressbookhome%d: + $addressbooks:users/$userid%d: + + + + $addressbookpath%d: + $addressbookhome%d:/$addressbook: + + + + + + + + $publicuserid%d: + public%02d + + + + $publicuserguid%d: + 50000000-0000-0000-0000-0000000000%02d + + + + $publicusername%d: + Public %02d + + + + $publicpswd%d: + public%02d + + + + $publicprincipal%d: + $principals_users:$publicuserid%d:/ + + + $publicprincipaluri%d: + $principals_uids:$publicuserguid%d:/ + + + + $publiccalendarhome%d: + $calendars_uids:$publicuserguid%d: + + + + $publiccalendarpath%d: + $calendars_uids:$publicuserguid%d:/$calendar: + + + $publicemail%d: + $publicuserid%d:@example.com + + + + $publiccuaddr%d: + mailto:$publicemail%d: + + + $publiccuaddralt%d: + $publiccuaddr%d: + + + $publiccuaddrurn%d: + urn:x-uid:$publicuserguid%d: + + + + + + + $resourceid%d: + resource%02d + + + + $resourceguid%d: + 40000000-0000-0000-0000-000000000%03d + + + + $resourcename%d: + Resource %02d + + + + $rcalendarhome%d: + $calendars_uids:$resourceguid%d: + + + + $rcalendarpath%d: + $calendars_uids:$resourceguid%d:/$calendar: + + + + $rinboxpath%d: + $calendars_uids:$resourceguid%d:/$inbox: + + + + $routboxpath%d: + $calendars_uids:$resourceguid%d:/$outbox: + + + + $rprincipal%d: + $principals_resources:$resourceid%d:/ + + + $rprincipaluri%d: + $principals_uids:$resourceguid%d:/ + + + $rcuaddralt%d: + $rcuaddrurn%d: + + + $rcuaddrurn%d: + urn:x-uid:$resourceguid%d: + + + + + + + $locationid%d: + location%02d + + + + $locationguid%d: + 30000000-0000-0000-0000-000000000%03d + + + + $locationname%d: + Location %02d + + + + $lcalendarhome%d: + $calendars_uids:$locationguid%d: + + + + $lcalendarpath%d: + $calendars_uids:$locationguid%d:/$calendar: + + + + $linboxpath%d: + $calendars_uids:$locationguid%d:/$inbox: + + + + $loutboxpath%d: + $calendars_uids:$locationguid%d:/$outbox: + + + + $lprincipal%d: + $principals_resources:$locationid%d:/ + + + $lprincipaluri%d: + $principals_uids:$locationguid%d:/ + + + $lcuaddralt%d: + $lprincipaluri%d: + + + $lcuaddrurn%d: + urn:x-uid:$locationguid%d: + + + + + + + + $groupid%d: + group%02d + + + + $groupguid%d: + 20000000-0000-0000-0000-000000000%03d + + + + $groupname%d: + Group %02d + + + + $gprincipal%d: + $principals_resources:$groupid%d:/ + + + $gprincipaluri%d: + $principals_uids:$groupguid%d:/ + + + $gemail%d: + $groupid%d:@example.com + + + $gcuaddralt%d: + $gprincipaluri%d: + + + $gcuaddrurn%d: + urn:x-uid:$groupguid%d: + + + + + + $i18nid: + i18nuser + + + + $i18nguid: + 860B3EE9-6D7C-4296-9639-E6B998074A78 + + + + $i18nname: + まだ + + + + $i18npswd: + i18nuser + + + + $i18ncalendarpath: + $calendars_uids:$i18nguid:/$calendar: + + + $i18nemail: + $i18nid:@example.com + + + + $i18ncuaddr: + mailto:$i18nemail: + + + $i18ncuaddrurn: + urn:x-uid:$i18nguid: + + + + + $principaldisabled: + $principals_groups:disabledgroup/ + + + $principaluridisabled: + $principals_uids:disabledgroup/ + + + + $cuaddrdisabled: + $principals_uids:disabledgroup/ + + + + + + + $cuaddr2: + MAILTO:$email2: + + + + diff --git a/apps/dav/tests/travis/caldavtest/serverinfo-carddav-old-endpoint.xml b/apps/dav/tests/travis/caldavtest/serverinfo-carddav-old-endpoint.xml new file mode 100644 index 000000000000..9e3cfa7090a1 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/serverinfo-carddav-old-endpoint.xml @@ -0,0 +1,849 @@ + + + + + + + + localhost + 8889 + basic + + + 120 + 0.25 + 30 + + + + COPY Method + MOVE Method + Extended MKCOL + + + ACL Method + acl-principal-prop-set REPORT + principal-match REPORT + principal-property-search REPORT + principal-search-property-set REPORT + calendarserver-principal-search REPORT + + add-member + + brief + bulk-post + ctag + current-user-principal + directory listing + extended-principal-search + expand-property + only-proxy-groups + limits + own-root + prefer + prefer-minimal + prefer-representation + prefer-noroot + quota + + resource-id + sync-report + + + sync-report-config-token + well-known + + + + + json-data + + + control-api + + + caldav + attachments-collection + auto-accept + auto-accept-modes + client-fix-TRANSP + + default-alarms + EMAIL parameter + extended-freebusy + freebusy-url + group-attendee-expansion + implicit-scheduling + location-resource-tracking + managed-attachments + maskuid + no-duplicate-uids + partstat-timestamp + + private-comments + private-events + proxy + + recurrence-splitting + remove-duplicate-alarms + query-extended + shared-calendars + share-calendars-to-groups + schedule-changes + split-calendars + supported-component-sets + supported-component-sets-one + timerange-low-limit + timerange-high-limit + timezones-by-reference + timezone-service + timezone-std-service + + travel-time-busy + vavailability + + webcal + + + carddav + default-addressbook + shared-addressbooks + shared-addressbook-groups + directory-gateway + + + + + + + $multistatus-response-prefix: + /{DAV:}multistatus/{DAV:}response + + + $multistatus-href-prefix: + /{DAV:}multistatus/{DAV:}response/{DAV:}href + + + $verify-response-prefix: + {DAV:}response/{DAV:}propstat/{DAV:}prop + + + $verify-property-prefix: + /{DAV:}multistatus/{DAV:}response/{DAV:}propstat/{DAV:}prop + + + $verify-bad-response: + /{DAV:}multistatus/{DAV:}response/{DAV:}status + + + $verify-error-response: + /{DAV:}multistatus/{DAV:}response/{DAV:}error + + + $CALDAV: + urn:ietf:params:xml:ns:caldav + + + $CARDDAV: + urn:ietf:params:xml:ns:carddav + + + $CS: + http://calendarserver.org/ns/ + + + + + + + + $root: + /remote.php/carddav/ + + + + + $principalcollection: + $root:principals/ + + + + + $uidstype: + __uids__ + + + $groupstype: + groups + + + $locationstype: + locations + + + $resourcestype: + resources + + + + + $principals_uids: + $principalcollection:$uidstype:/ + + + $principals_users: + $principalcollection: + + + $principals_groups: + $principalcollection:$groupstype:/ + + + $principals_resources: + $principalcollection:$resourcestype:/ + + + $principals_locations: + $principalcollection:$locationstype:/ + + + + + $calendars: + $root:calendars/ + + + + + $calendars_uids: + $calendars:$uidstype:/ + + + $calendars_users: + $calendars: + + + $calendars_resources: + $calendars:$resourcestype:/ + + + $calendars_locations: + $calendars:$locationstype:/ + + + + + $calendar: + calendar + + + + + $tasks: + tasks + + + + + $polls: + polls + + + + + $inbox: + inbox + + + + + $outbox: + outbox + + + + + $dropbox: + dropbox + + + + + $attachments: + dropbox + + + + + $notification: + notification + + + + + $freebusy: + freebusy + + + + + $calendar_home_items_initial_sync: + [-,$calendar:/,$tasks:/,$inbox:/,$outbox:/,$freebusy:,$notification:/] + + + + + $calendar_sync_extra_items: + [-] + + + + + $calendar_sync_extra_count: + 1 + + + + + $servertoserver: + $root:inbox + + + + + $timezoneservice: + $root:timezones + + + + + $timezonestdservice: + $root:stdtimezones + + + + + $addressbooks: + $root:addressbooks/ + + + + + $addressbooks_uids: + $addressbooks:$uidstype:/ + + + $addressbooks_users: + $addressbooks: + + + + + $addressbook: + addressbook + + + + + $directory: + $root:directory/ + + + + + $add-member: + ;add-member + + + + + $useradmin: + admin + + + + $useradminguid: + 0C8BDE62-E600-4696-83D3-8B5ECABDFD2E + + + + $pswdadmin: + admin + + + + + $principal_admin: + $principals_users:$useradmin:/ + + + $principaluri_admin: + $principals_uids:$useradminguid:/ + + + + + $userapprentice: + apprentice + + + + $userapprenticeguid: + 29B6C503-11DF-43EC-8CCA-40C7003149CE + + + + $pswdapprentice: + apprentice + + + + + $principal_apprentice: + $principals_users:$userapprentice:/ + + + $principaluri_apprentice: + $principals_uids:$userapprenticeguid:/ + + + + + $userproxy: + superuser + + + + $pswdproxy: + superuser + + + + + + + $userid%d: + user%02d + + + + $userguid%d: + 10000000-0000-0000-0000-000000000%03d + + + + $username%d: + User %02d + + + + $username-encoded%d: + User%%20%02d + + + + $firstname%d: + User + + + + $lastname%d: + %02d + + + + $pswd%d: + user%02d + + + + $principal%d: + $principals_users:$userid%d:/ + + + $principaluri%d: + $principals_users:$userid%d:/ + + + $principal%dnoslash: + $principals_users:$userid%d: + + + + + $calendarhome%d: + $calendars:$userid%d: + + + + $calendarhomealt%d: + $calendars_users:$userid%d: + + + + $calendarpath%d: + $calendarhome%d:/$calendar: + + + + $calendarpathalt%d: + $calendarhomealt%d:/$calendar: + + + + $taskspath%d: + $calendarhome%d:/$tasks: + + + + $pollspath%d: + $calendarhome%d:/$polls: + + + + $inboxpath%d: + $calendarhome%d:/$inbox: + + + + $outboxpath%d: + $calendarhome%d:/$outbox: + + + + $dropboxpath%d: + $calendarhome%d:/$dropbox: + + + + $notificationpath%d: + $calendarhome%d:/$notification: + + + + $freebusypath%d: + $calendarhome%d:/$freebusy: + + + $email%d: + $userid%d:@example.com + + + + $cuaddr%d: + mailto:$email%d: + + + $cuaddralt%d: + $cuaddr%d: + + + $cuaddraltnoslash%d: + $cuaddr%d: + + + $cuaddrurn%d: + urn:x-uid:$userguid%d: + + + + + $addressbookhome%d: + $addressbooks:$userid%d: + + + + $addressbookpath%d: + $addressbookhome%d:/$addressbook: + + + + + + + + $publicuserid%d: + public%02d + + + + $publicuserguid%d: + 50000000-0000-0000-0000-0000000000%02d + + + + $publicusername%d: + Public %02d + + + + $publicpswd%d: + public%02d + + + + $publicprincipal%d: + $principals_users:$publicuserid%d:/ + + + $publicprincipaluri%d: + $principals_uids:$publicuserguid%d:/ + + + + $publiccalendarhome%d: + $calendars_uids:$publicuserguid%d: + + + + $publiccalendarpath%d: + $calendars_uids:$publicuserguid%d:/$calendar: + + + $publicemail%d: + $publicuserid%d:@example.com + + + + $publiccuaddr%d: + mailto:$publicemail%d: + + + $publiccuaddralt%d: + $publiccuaddr%d: + + + $publiccuaddrurn%d: + urn:x-uid:$publicuserguid%d: + + + + + + + $resourceid%d: + resource%02d + + + + $resourceguid%d: + 40000000-0000-0000-0000-000000000%03d + + + + $resourcename%d: + Resource %02d + + + + $rcalendarhome%d: + $calendars_uids:$resourceguid%d: + + + + $rcalendarpath%d: + $calendars_uids:$resourceguid%d:/$calendar: + + + + $rinboxpath%d: + $calendars_uids:$resourceguid%d:/$inbox: + + + + $routboxpath%d: + $calendars_uids:$resourceguid%d:/$outbox: + + + + $rprincipal%d: + $principals_resources:$resourceid%d:/ + + + $rprincipaluri%d: + $principals_uids:$resourceguid%d:/ + + + $rcuaddralt%d: + $rcuaddrurn%d: + + + $rcuaddrurn%d: + urn:x-uid:$resourceguid%d: + + + + + + + $locationid%d: + location%02d + + + + $locationguid%d: + 30000000-0000-0000-0000-000000000%03d + + + + $locationname%d: + Location %02d + + + + $lcalendarhome%d: + $calendars_uids:$locationguid%d: + + + + $lcalendarpath%d: + $calendars_uids:$locationguid%d:/$calendar: + + + + $linboxpath%d: + $calendars_uids:$locationguid%d:/$inbox: + + + + $loutboxpath%d: + $calendars_uids:$locationguid%d:/$outbox: + + + + $lprincipal%d: + $principals_resources:$locationid%d:/ + + + $lprincipaluri%d: + $principals_uids:$locationguid%d:/ + + + $lcuaddralt%d: + $lprincipaluri%d: + + + $lcuaddrurn%d: + urn:x-uid:$locationguid%d: + + + + + + + + $groupid%d: + group%02d + + + + $groupguid%d: + 20000000-0000-0000-0000-000000000%03d + + + + $groupname%d: + Group %02d + + + + $gprincipal%d: + $principals_resources:$groupid%d:/ + + + $gprincipaluri%d: + $principals_uids:$groupguid%d:/ + + + $gemail%d: + $groupid%d:@example.com + + + $gcuaddralt%d: + $gprincipaluri%d: + + + $gcuaddrurn%d: + urn:x-uid:$groupguid%d: + + + + + + $i18nid: + i18nuser + + + + $i18nguid: + 860B3EE9-6D7C-4296-9639-E6B998074A78 + + + + $i18nname: + まだ + + + + $i18npswd: + i18nuser + + + + $i18ncalendarpath: + $calendars_uids:$i18nguid:/$calendar: + + + $i18nemail: + $i18nid:@example.com + + + + $i18ncuaddr: + mailto:$i18nemail: + + + $i18ncuaddrurn: + urn:x-uid:$i18nguid: + + + + + $principaldisabled: + $principals_groups:disabledgroup/ + + + $principaluridisabled: + $principals_uids:disabledgroup/ + + + + $cuaddrdisabled: + $principals_uids:disabledgroup/ + + + + + + + $cuaddr2: + MAILTO:$email2: + + + + diff --git a/apps/dav/tests/travis/caldavtest/serverinfo.xml b/apps/dav/tests/travis/caldavtest/serverinfo.xml index c3ba99ee03d3..fea009a6ee39 100644 --- a/apps/dav/tests/travis/caldavtest/serverinfo.xml +++ b/apps/dav/tests/travis/caldavtest/serverinfo.xml @@ -1,7 +1,6 @@ - + diff --git a/apps/dav/tests/travis/carddav-old-endpoint/install.sh b/apps/dav/tests/travis/carddav-old-endpoint/install.sh new file mode 100644 index 000000000000..db8b53bc8617 --- /dev/null +++ b/apps/dav/tests/travis/carddav-old-endpoint/install.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + + +cd "$SCRIPTPATH" +if [ ! -f CalDAVTester/testcaldav.py ]; then + git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester +fi +if [ ! -f pycalendar/setup.py ]; then + git clone https://github.com/apple/ccs-pycalendar.git pycalendar +fi + +# create test user +cd "$SCRIPTPATH/../../../../../" +OC_PASS=user01 php occ user:add --password-from-env user01 +php occ dav:create-addressbook user01 addressbook +OC_PASS=user02 php occ user:add --password-from-env user02 +php occ dav:create-addressbook user02 addressbook +cd "$SCRIPTPATH/../../../../../" diff --git a/apps/dav/tests/travis/carddav-old-endpoint/script.sh b/apps/dav/tests/travis/carddav-old-endpoint/script.sh new file mode 100644 index 000000000000..943ecd622df1 --- /dev/null +++ b/apps/dav/tests/travis/carddav-old-endpoint/script.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +SCRIPT=`realpath $0` +SCRIPTPATH=`dirname $SCRIPT` + +# Move the endpoint to the serverinfo file +rm "$SCRIPTPATH/../caldavtest/serverinfo.xml" +cp "$SCRIPTPATH/../caldavtest/serverinfo-carddav-old-endpoint.xml" "$SCRIPTPATH/../caldavtest/serverinfo.xml" + +# start the server +php -S 127.0.0.1:8889 -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" + +RESULT=$? + +tail "$SCRIPTPATH/../../../../../data/owncloud.log" + +exit $RESULT diff --git a/apps/dav/tests/travis/carddav/script.sh b/apps/dav/tests/travis/carddav/script.sh index a8bd9f11b38d..104be3162ef6 100644 --- a/apps/dav/tests/travis/carddav/script.sh +++ b/apps/dav/tests/travis/carddav/script.sh @@ -3,7 +3,7 @@ SCRIPT=`realpath $0` SCRIPTPATH=`dirname $SCRIPT` # start the server -php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." & +php -S 127.0.0.1:8889 -t "$SCRIPTPATH/../../../../.." & sleep 30 @@ -17,6 +17,6 @@ PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onf RESULT=$? -tail "$/../../../../../data-autotest/owncloud.log" +tail "$SCRIPTPATH/../../../../../data/owncloud.log" exit $RESULT diff --git a/apps/dav/tests/travis/litmus-v1/script.sh b/apps/dav/tests/travis/litmus-v1/script.sh index cba305683b2b..e75c3bab5792 100644 --- a/apps/dav/tests/travis/litmus-v1/script.sh +++ b/apps/dav/tests/travis/litmus-v1/script.sh @@ -4,10 +4,10 @@ SCRIPTPATH=`dirname $SCRIPT` # start the server -php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." & +php -S 127.0.0.1:8889 -t "$SCRIPTPATH/../../../../.." & sleep 30 # run the tests cd /tmp/litmus/litmus-0.13 -make URL=http://127.0.0.1:8888/remote.php/webdav CREDS="admin admin" TESTS="basic copymove props locks" check +make URL=http://127.0.0.1:8889/remote.php/webdav CREDS="admin admin" TESTS="basic copymove props locks" check diff --git a/apps/dav/tests/travis/litmus-v2/script.sh b/apps/dav/tests/travis/litmus-v2/script.sh index 966ed5a20528..707f52d90008 100644 --- a/apps/dav/tests/travis/litmus-v2/script.sh +++ b/apps/dav/tests/travis/litmus-v2/script.sh @@ -4,10 +4,10 @@ SCRIPTPATH=`dirname $SCRIPT` # start the server -php -S 127.0.0.1:8888 -t "$SCRIPTPATH/../../../../.." & +php -S 127.0.0.1:8889 -t "$SCRIPTPATH/../../../../.." & sleep 30 # run the tests cd /tmp/litmus/litmus-0.13 -make URL=http://127.0.0.1:8888/remote.php/dav/files/admin CREDS="admin admin" TESTS="basic copymove props locks" check +make URL=http://127.0.0.1:8889/remote.php/dav/files/admin CREDS="admin admin" TESTS="basic copymove props locks" check