Merge pull request #3443 from nextcloud/add-integration-tests-for-dav

Add integration tests for legacy DAV endpoints
This commit is contained in:
blizzz 2017-02-10 19:00:17 +01:00 committed by GitHub
commit b8f08f1585
8 changed files with 90 additions and 31 deletions

View File

@ -67,6 +67,7 @@ $nodes = array(
// Fire up server // Fire up server
$server = new \Sabre\DAV\Server($nodes); $server = new \Sabre\DAV\Server($nodes);
$server::$exposeVersion = false;
$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri()); $server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
$server->setBaseUri($baseuri); $server->setBaseUri($baseuri);

View File

@ -66,6 +66,7 @@ $nodes = array(
// Fire up server // Fire up server
$server = new \Sabre\DAV\Server($nodes); $server = new \Sabre\DAV\Server($nodes);
$server::$exposeVersion = false;
$server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri()); $server->httpRequest->setUrl(\OC::$server->getRequest()->getRequestUri());
$server->setBaseUri($baseuri); $server->setBaseUri($baseuri);
// Add plugins // Add plugins

View File

@ -67,6 +67,7 @@ class LegacyDAVACL extends DavAclPlugin {
return new Principal(Principal::UNAUTHENTICATED); return new Principal(Principal::UNAUTHENTICATED);
} }
}); });
parent::propFind($propFind, $node);
return parent::propFind($propFind, $node);
} }
} }

View File

@ -23,6 +23,7 @@
namespace OCA\DAV\Connector\Sabre; namespace OCA\DAV\Connector\Sabre;
use Sabre\CalDAV\Principal\User;
use Sabre\DAV\Exception\NotFound; use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile; use Sabre\DAV\IFile;
use Sabre\DAV\INode; use Sabre\DAV\INode;
@ -72,4 +73,20 @@ class DavAclPlugin extends \Sabre\DAVACL\Plugin {
return $access; 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);
}
} }

View File

@ -72,16 +72,18 @@ class CalDavContext implements \Behat\Behat\Context\Context {
} }
/** /**
* @When :user requests calendar :calendar * @When :user requests calendar :calendar on the endpoint :endpoint
* @param string $user * @param string $user
* @param string $calendar * @param string $calendar
* @param string $endpoint
*/ */
public function requestsCalendar($user, $calendar) { public function requestsCalendar($user, $calendar, $endpoint) {
$davUrl = $this->baseUrl . '/remote.php/dav/calendars/'.$calendar; $davUrl = $this->baseUrl . $endpoint . $calendar;
$password = ($user === 'admin') ? 'admin' : '123456'; $password = ($user === 'admin') ? 'admin' : '123456';
try { try {
$this->response = $this->client->get( $request = $this->client->createRequest(
'PROPFIND',
$davUrl, $davUrl,
[ [
'auth' => [ 'auth' => [
@ -90,6 +92,7 @@ class CalDavContext implements \Behat\Behat\Context\Context {
] ]
] ]
); );
$this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) { } catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse(); $this->response = $e->getResponse();
} }

View File

@ -72,20 +72,21 @@ class CardDavContext implements \Behat\Behat\Context\Context {
} catch (\GuzzleHttp\Exception\ClientException $e) {} } catch (\GuzzleHttp\Exception\ClientException $e) {}
} }
/** /**
* @When :user requests addressbook :addressBook with statuscode :statusCode * @When :user requests addressbook :addressBook with statuscode :statusCode on the endpoint :endpoint
* @param string $user * @param string $user
* @param string $addressBook * @param string $addressBook
* @param int $statusCode * @param int $statusCode
* @param string $endpoint
* @throws \Exception * @throws \Exception
*/ */
public function requestsAddressbookWithStatuscode($user, $addressBook, $statusCode) { public function requestsAddressbookWithStatuscodeOnTheEndpoint($user, $addressBook, $statusCode, $endpoint) {
$davUrl = $this->baseUrl . '/remote.php/dav/addressbooks/users/'.$addressBook; $davUrl = $this->baseUrl . $endpoint . $addressBook;
$password = ($user === 'admin') ? 'admin' : '123456'; $password = ($user === 'admin') ? 'admin' : '123456';
try { try {
$this->response = $this->client->get( $request = $this->client->createRequest(
'PROPFIND',
$davUrl, $davUrl,
[ [
'auth' => [ 'auth' => [
@ -94,6 +95,7 @@ class CardDavContext implements \Behat\Behat\Context\Context {
], ],
] ]
); );
$this->response = $this->client->send($request);
} catch (\GuzzleHttp\Exception\ClientException $e) { } catch (\GuzzleHttp\Exception\ClientException $e) {
$this->response = $e->getResponse(); $this->response = $e->getResponse();
} }

View File

@ -1,31 +1,52 @@
Feature: caldav Feature: caldav
Scenario: Accessing a not existing calendar of another user Scenario: Accessing a not existing calendar of another user
Given user "user0" exists Given user "user0" exists
When "admin" requests calendar "user0/MyCalendar" When "admin" requests calendar "user0/MyCalendar" on the endpoint "/remote.php/dav/calendars/"
Then The CalDAV HTTP status code should be "404" Then The CalDAV HTTP status code should be "404"
And The exception is "Sabre\DAV\Exception\NotFound" And The exception is "Sabre\DAV\Exception\NotFound"
And The error message is "Node with name 'MyCalendar' could not be found" And The error message is "Node with name 'MyCalendar' could not be found"
# Blocked by https://github.com/php/php-src/pull/1417 Scenario: Accessing a not shared calendar of another user
#Scenario: Accessing a not shared calendar of another user Given user "user0" exists
# Given user "user0" exists Given "admin" creates a calendar named "MyCalendar"
# Given "admin" creates a calendar named "MyCalendar" Given The CalDAV HTTP status code should be "201"
# Given The CalDAV HTTP status code should be "201" When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/"
# When "user0" requests calendar "admin/MyCalendar" Then The CalDAV HTTP status code should be "404"
# Then The CalDAV HTTP status code should be "404" And The exception is "Sabre\DAV\Exception\NotFound"
# And The exception is "Sabre\DAV\Exception\NotFound" And The error message is "Node with name 'MyCalendar' could not be found"
# And The error message is "Node with name 'MyCalendar' could not be found"
Scenario: Accessing a not shared calendar of another user via the legacy endpoint
Given user "user0" exists
Given "admin" creates a calendar named "MyCalendar"
Given The CalDAV HTTP status code should be "201"
When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/caldav/calendars/"
Then The CalDAV HTTP status code should be "404"
And The exception is "Sabre\DAV\Exception\NotFound"
And The error message is "Node with name 'MyCalendar' could not be found"
Scenario: Accessing a not existing calendar of another user
Given user "user0" exists
When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/"
Then The CalDAV HTTP status code should be "404"
And The exception is "Sabre\DAV\Exception\NotFound"
And The error message is "Node with name 'MyCalendar' could not be found"
Scenario: Accessing a not existing calendar of another user via the legacy endpoint
Given user "user0" exists
When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/caldav/calendars/"
Then The CalDAV HTTP status code should be "404"
And The exception is "Sabre\DAV\Exception\NotFound"
And The error message is "Node with name 'MyCalendar' could not be found"
Scenario: Accessing a not existing calendar of myself Scenario: Accessing a not existing calendar of myself
Given user "user0" exists Given user "user0" exists
When "user0" requests calendar "admin/MyCalendar" When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/"
Then The CalDAV HTTP status code should be "404" Then The CalDAV HTTP status code should be "404"
And The exception is "Sabre\DAV\Exception\NotFound" And The exception is "Sabre\DAV\Exception\NotFound"
And The error message is "Node with name 'MyCalendar' could not be found" And The error message is "Node with name 'MyCalendar' could not be found"
# Blocked by https://github.com/php/php-src/pull/1417 Scenario: Creating a new calendar
#Scenario: Creating a new calendar When "admin" creates a calendar named "MyCalendar"
# When "admin" creates a calendar named "MyCalendar" Then The CalDAV HTTP status code should be "201"
# Then The CalDAV HTTP status code should be "201" And "admin" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/"
# And "admin" requests calendar "admin/MyCalendar" Then The CalDAV HTTP status code should be "207"
# Then The CalDAV HTTP status code should be "200"

View File

@ -1,26 +1,39 @@
Feature: carddav Feature: carddav
Scenario: Accessing a not existing addressbook of another user Scenario: Accessing a not existing addressbook of another user
Given user "user0" exists Given user "user0" exists
When "admin" requests addressbook "user0/MyAddressbook" with statuscode "404" When "admin" requests addressbook "user0/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/"
And The CardDAV exception is "Sabre\DAV\Exception\NotFound" And The CardDAV exception is "Sabre\DAV\Exception\NotFound"
And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found"
Scenario: Accessing a not shared addressbook of another user Scenario: Accessing a not shared addressbook of another user
Given user "user0" exists Given user "user0" exists
Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201" Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201"
When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/"
And The CardDAV exception is "Sabre\DAV\Exception\NotFound"
And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found"
Scenario: Accessing a not existing addressbook of another user via legacy endpoint
Given user "user0" exists
When "admin" requests addressbook "user0/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/carddav/addressbooks/"
And The CardDAV exception is "Sabre\DAV\Exception\NotFound"
And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found"
Scenario: Accessing a not shared addressbook of another user via legacy endpoint
Given user "user0" exists
Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201"
When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/carddav/addressbooks/"
And The CardDAV exception is "Sabre\DAV\Exception\NotFound" And The CardDAV exception is "Sabre\DAV\Exception\NotFound"
And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found"
Scenario: Accessing a not existing addressbook of myself Scenario: Accessing a not existing addressbook of myself
Given user "user0" exists Given user "user0" exists
When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/"
And The CardDAV exception is "Sabre\DAV\Exception\NotFound" And The CardDAV exception is "Sabre\DAV\Exception\NotFound"
And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found"
Scenario: Creating a new addressbook Scenario: Creating a new addressbook
When "admin" creates an addressbook named "MyAddressbook" with statuscode "201" When "admin" creates an addressbook named "MyAddressbook" with statuscode "201"
Then "admin" requests addressbook "admin/MyAddressbook" with statuscode "200" Then "admin" requests addressbook "admin/MyAddressbook" with statuscode "207" on the endpoint "/remote.php/dav/addressbooks/users/"
Scenario: Accessing ones own contact Scenario: Accessing ones own contact
Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201" Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201"