diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 7ad8d77..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: CI
-
-on: [push]
-
-jobs:
- build-test:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- php-versions: ['7.4', '8.0', '8.4']
-
- steps:
- - uses: actions/checkout@v2
- - name: Set up php${{ matrix.php-versons }}
- uses: shivammathur/setup-php@master
- with:
- php-version: ${{ matrix.php-versions }}
- - name: Install dependencies
- run: composer i
- - name: PHPUnit
- run: ./vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
deleted file mode 100644
index 2cd12eb..0000000
--- a/.github/workflows/lint.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-name: Php Lint
-on: [push, pull_request]
-
-jobs:
- php-linters:
- runs-on: ubuntu-20.04
- strategy:
- matrix:
- php-versions: ['7.4', '8.0', '8.4']
- name: php${{ matrix.php-versions }} lint
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Set up php${{ matrix.php-versons }}
- uses: shivammathur/setup-php@master
- with:
- php-version: ${{ matrix.php-versions }}
- coverage: none
- extensions: inotify
- - name: Install dependencies
- run: composer i
- - name: Lint
- run: composer run lint
-
- php-cs-fixer:
- name: php-cs check
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Set up php${{ matrix.php-versions }}
- uses: shivammathur/setup-php@master
- with:
- php-version: 7.4
- tools: composer:v1
- coverage: none
- extensions: inotify
- - name: Install dependencies
- run: composer i
- - name: Run coding standards check
- run: composer run cs:check
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
deleted file mode 100644
index b286401..0000000
--- a/.github/workflows/static-analysis.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Php Static analysis
-on: [push, pull_request]
-
-jobs:
- psalm:
- runs-on: ubuntu-20.04
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Set up php
- uses: shivammathur/setup-php@master
- with:
- php-version: 7.4
- tools: composer:v1
- coverage: none
- extensions: redis
- - name: Install dependencies
- run: composer i
- - name: Run coding standards check
- run: composer run psalm
- phpstan:
- runs-on: ubuntu-20.04
- steps:
- - name: Checkout
- uses: actions/checkout@master
- - name: Set up php
- uses: shivammathur/setup-php@master
- with:
- php-version: 7.4
- tools: composer:v1
- coverage: none
- extensions: redis
- - name: Install dependencies
- run: composer i
- - name: Run coding standards check
- run: composer run psalm
diff --git a/.gitignore b/.gitignore
index 3ca03c7..987e2a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,2 @@
composer.lock
vendor
-coverage.xml
-.phpunit.result.cache
-*.cache
diff --git a/.php_cs.dist b/.php_cs.dist
deleted file mode 100644
index a2fdf19..0000000
--- a/.php_cs.dist
+++ /dev/null
@@ -1,15 +0,0 @@
-exclude('vendor')
- ->in(__DIR__)
-;
-return PhpCsFixer\Config::create()
- ->setRules([
- '@PSR2' => true,
- 'array_syntax' => ['syntax' => 'short'],
- 'braces' => ['position_after_functions_and_oop_constructs' => 'same'],
- 'binary_operator_spaces' => ['align_double_arrow' => true, 'align_equals' => false],
- ])
- ->setIndent("\t")
- ->setFinder($finder)
- ;
diff --git a/.scrutinizer.yml b/.scrutinizer.yml
deleted file mode 100644
index 884d059..0000000
--- a/.scrutinizer.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-build:
- nodes:
- analysis:
- tests:
- override:
- - php-scrutinizer-run
diff --git a/.travis.yml b/.travis.yml
index 58f03a2..5d7c956 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,9 @@
language: php
php:
+ - '5.6'
+ - '7.0'
+ - '7.1'
- '7.2'
- - '7.3'
- - '7.4'
cache:
directories:
diff --git a/composer.json b/composer.json
index 25e7143..242db29 100644
--- a/composer.json
+++ b/composer.json
@@ -9,31 +9,16 @@
}
],
"require": {
- "php": ">=7.3 || >=8.0",
- "sabre/dav": "^4.0.0"
+ "php": ">=5.6",
+ "sabre/dav": "^3.2.0"
},
"require-dev": {
- "php-parallel-lint/php-parallel-lint": "^1.0",
- "friendsofphp/php-cs-fixer": "^2",
- "phpstan/phpstan": "^0.12",
- "psalm/phar": "^4.3",
- "phpunit/phpunit": "^8"
+ "phpunit/phpunit": "^4.8"
},
"autoload": {
"psr-4": {
- "SearchDAV\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
+ "SearchDAV\\": "src/",
"SearchDAV\\Test\\": "tests/"
}
- },
- "scripts": {
- "lint": "parallel-lint --exclude src --exclude vendor --exclude target --exclude build .",
- "cs:check": "php-cs-fixer fix --dry-run --diff",
- "cs:fix": "php-cs-fixer fix",
- "psalm": "psalm.phar",
- "phpstan": "phpstan analyse --level 5 src"
}
}
diff --git a/psalm.xml b/psalm.xml
deleted file mode 100644
index 30258a7..0000000
--- a/psalm.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/Backend/ISearchBackend.php b/src/Backend/ISearchBackend.php
index 277f284..665666c 100644
--- a/src/Backend/ISearchBackend.php
+++ b/src/Backend/ISearchBackend.php
@@ -1,4 +1,4 @@
-
*
@@ -21,14 +21,13 @@
namespace SearchDAV\Backend;
-use Sabre\DAV\INode;
use SearchDAV\Query\Query;
interface ISearchBackend {
/**
* Get the path of the search arbiter of this backend
*
- * The search arbiter is the URI that the client will send its SEARCH requests to
+ * The search arbiter is the URI that the client will send it's SEARCH requests to
* Note that this is not required to be the same as the search scopes which determine what to search in
*
* The returned value should be a path relative the root of the dav server.
@@ -38,10 +37,10 @@ interface ISearchBackend {
*
* @return string
*/
- public function getArbiterPath(): string;
+ public function getArbiterPath();
/**
- * Whether the search backend supports search requests on this scope
+ * Whether or not the search backend supports search requests on this scope
*
* The scope defines the resource that it being searched, such as a folder or address book.
*
@@ -55,7 +54,7 @@ interface ISearchBackend {
* @param string|null $path the path of the search scope relative to the dav server, or null if the scope is outside the dav server
* @return bool
*/
- public function isValidScope(string $href, $depth, ?string $path): bool;
+ public function isValidScope($href, $depth, $path);
/**
* List the available properties that can be used in search
@@ -69,7 +68,7 @@ interface ISearchBackend {
* @param string|null $path the path of the search scope relative to the dav server, or null if the scope is outside the dav server
* @return SearchPropertyDefinition[]
*/
- public function getPropertyDefinitionsForScope(string $href, ?string $path): array;
+ public function getPropertyDefinitionsForScope($href, $path);
/**
* Preform the search request
@@ -81,14 +80,5 @@ interface ISearchBackend {
* @param Query $query
* @return SearchResult[]
*/
- public function search(Query $query): array;
-
- /**
- * Called by the search plugin once the nodes to be returned have been found.
- * This can be used to more efficiently load the requested properties for the results.
- *
- * @param INode[] $nodes
- * @param string[] $requestProperties
- */
- public function preloadPropertyFor(array $nodes, array $requestProperties): void;
+ public function search(Query $query);
}
diff --git a/src/Backend/SearchPropertyDefinition.php b/src/Backend/SearchPropertyDefinition.php
index 4dca05b..d7de46a 100644
--- a/src/Backend/SearchPropertyDefinition.php
+++ b/src/Backend/SearchPropertyDefinition.php
@@ -1,4 +1,4 @@
-
*
@@ -26,7 +26,6 @@ class SearchPropertyDefinition {
const DATATYPE_STRING = self::XS . 'string';
const DATATYPE_INTEGER = self::XS . 'integer';
const DATATYPE_NONNEGATIVE_INTEGER = self::XS . 'nonNegativeInteger';
- const DATATYPE_NON_NEGATIVE_INTEGER = self::XS . 'nonNegativeInteger';
const DATATYPE_DECIMAL = self::XS . 'decimal';
const DATATYPE_DATETIME = self::XS . 'dateTime';
const DATATYPE_BOOLEAN = self::XS . 'boolean';
@@ -49,13 +48,13 @@ class SearchPropertyDefinition {
* SearchProperty constructor.
*
* @param string $name the name and namespace of the property in clark notation
- * @param bool $searchable whether this property can be used as part of a search query
- * @param bool $selectable whether this property can be returned as part of a search result
- * @param bool $sortable whether this property can be used to sort the search result
+ * @param bool $searchable whether or not this property can be used as part of a search query
+ * @param bool $selectable whether or not this property can be returned as part of a search result
+ * @param bool $sortable whether or not this property can be used to sort the search result
* @param string $dataType the datatype of the property, one of the SearchProperty::DATATYPE_ constants or any XSD datatype in clark notation
- * @param bool $caseSensitive whether comparisons on the property are case-sensitive, only applies to string properties
+ * @param bool $caseSensitive whether or not comparisons on the property are case sensitive, only applies to string propertries
*/
- public function __construct(string $name, bool $selectable, bool $searchable, bool $sortable, string $dataType = self::DATATYPE_STRING, bool $caseSensitive = true) {
+ public function __construct($name, $searchable, $selectable, $sortable, $dataType = self::DATATYPE_STRING, $caseSensitive = true) {
$this->searchable = $searchable;
$this->selectable = $selectable;
$this->sortable = $sortable;
diff --git a/src/Backend/SearchResult.php b/src/Backend/SearchResult.php
index af48506..32f99a7 100644
--- a/src/Backend/SearchResult.php
+++ b/src/Backend/SearchResult.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Backend;
+
use Sabre\DAV\INode;
class SearchResult {
@@ -35,7 +36,7 @@ class SearchResult {
* @param INode $node
* @param string $href
*/
- public function __construct(INode $node, string $href) {
+ public function __construct(INode $node, $href) {
$this->node = $node;
$this->href = $href;
}
diff --git a/src/DAV/DiscoverHandler.php b/src/DAV/DiscoverHandler.php
index 811cfc7..675fd6a 100644
--- a/src/DAV/DiscoverHandler.php
+++ b/src/DAV/DiscoverHandler.php
@@ -1,4 +1,4 @@
-
*
@@ -54,7 +54,7 @@ class DiscoverHandler {
$this->queryParser = $queryParser;
}
- public function handelDiscoverRequest($xml, RequestInterface $request, ResponseInterface $response): bool {
+ public function handelDiscoverRequest($xml, RequestInterface $request, ResponseInterface $response) {
if (!isset($xml['{DAV:}basicsearch'])) {
$response->setStatus(400);
$response->setBody('Unexpected xml content for query-schema-discovery, expected basicsearch');
@@ -80,7 +80,7 @@ class DiscoverHandler {
return false;
}
- private function hashDefinition(SearchPropertyDefinition $definition): string {
+ private function hashDefinition(SearchPropertyDefinition $definition) {
return $definition->dataType
. (($definition->searchable) ? '1' : '0')
. (($definition->sortable) ? '1' : '0')
@@ -91,13 +91,18 @@ class DiscoverHandler {
* @param SearchPropertyDefinition[] $propertyDefinitions
* @return BasicSearchSchema
*/
- private function getBasicSearchForProperties(array $propertyDefinitions): BasicSearchSchema {
+ private function getBasicSearchForProperties(array $propertyDefinitions) {
/** @var PropDesc[] $groups */
$groups = [];
foreach ($propertyDefinitions as $propertyDefinition) {
$key = $this->hashDefinition($propertyDefinition);
if (!isset($groups[$key])) {
- $groups[$key] = new PropDesc($propertyDefinition);
+ $desc = new PropDesc();
+ $desc->dataType = $propertyDefinition->dataType;
+ $desc->sortable = $propertyDefinition->sortable;
+ $desc->selectable = $propertyDefinition->selectable;
+ $desc->searchable = $propertyDefinition->searchable;
+ $groups[$key] = $desc;
}
$groups[$key]->properties[] = $propertyDefinition->name;
}
diff --git a/src/DAV/PathHelper.php b/src/DAV/PathHelper.php
index 04098c7..de7ea6a 100644
--- a/src/DAV/PathHelper.php
+++ b/src/DAV/PathHelper.php
@@ -1,4 +1,4 @@
-
*
@@ -37,7 +37,7 @@ class PathHelper {
$this->server = $server;
}
- public function getPathFromUri(string $uri): ?string {
+ public function getPathFromUri($uri) {
if (strpos($uri, '://') === false) {
return $uri;
}
diff --git a/src/DAV/QueryParser.php b/src/DAV/QueryParser.php
index 915184e..592b620 100644
--- a/src/DAV/QueryParser.php
+++ b/src/DAV/QueryParser.php
@@ -1,4 +1,4 @@
-
*
@@ -30,31 +30,29 @@ use SearchDAV\XML\Literal;
use SearchDAV\XML\Operator;
use SearchDAV\XML\Order;
use SearchDAV\XML\Scope;
-use function Sabre\Xml\Deserializer\keyValue;
-use function Sabre\Xml\Deserializer\repeatingElements;
class QueryParser extends Service {
public $namespaceMap = [
- 'DAV:' => 'd',
- 'http://sabredav.org/ns' => 's',
+ 'DAV:' => 'd',
+ 'http://sabredav.org/ns' => 's',
'http://www.w3.org/2001/XMLSchema' => 'xs',
- SearchPlugin::SEARCHDAV_NS => 'sd'
+ SearchPlugin::SEARCHDAV_NS => 'sd'
];
public function __construct() {
$this->elementMap = [
- '{DAV:}literal' => Literal::class,
- '{DAV:}searchrequest' => Element\KeyValue::class,
+ '{DAV:}literal' => Literal::class,
+ '{DAV:}searchrequest' => Element\KeyValue::class,
'{DAV:}query-schema-discovery' => Element\KeyValue::class,
- '{DAV:}basicsearch' => BasicSearch::class,
- '{DAV:}select' => function (Reader $reader) {
- return keyValue($reader, '{DAV:}scope')['{DAV:}prop'];
+ '{DAV:}basicsearch' => BasicSearch::class,
+ '{DAV:}select' => function (Reader $reader) {
+ return \Sabre\Xml\Deserializer\keyValue($reader, '{DAV:}scope')['{DAV:}prop'];
},
'{DAV:}from' => function (Reader $reader) {
- return repeatingElements($reader, '{DAV:}scope');
+ return \Sabre\Xml\Deserializer\repeatingElements($reader, '{DAV:}scope');
},
'{DAV:}orderby' => function (Reader $reader) {
- return repeatingElements($reader, '{DAV:}order');
+ return \Sabre\Xml\Deserializer\repeatingElements($reader, '{DAV:}order');
},
'{DAV:}scope' => Scope::class,
'{DAV:}where' => function (Reader $reader) {
@@ -63,21 +61,20 @@ class QueryParser extends Service {
}, $reader->parseGetElements());
return (isset($operators[0])) ? $operators[0] : null;
},
- '{DAV:}prop' => Element\Elements::class,
- '{DAV:}order' => Order::class,
- '{DAV:}eq' => Operator::class,
- '{DAV:}gt' => Operator::class,
- '{DAV:}gte' => Operator::class,
- '{DAV:}lt' => Operator::class,
- '{DAV:}lte' => Operator::class,
- '{DAV:}and' => Operator::class,
- '{DAV:}or' => Operator::class,
- '{DAV:}like' => Operator::class,
- '{DAV:}contains' => Operator::class,
- '{DAV:}not' => Operator::class,
+ '{DAV:}prop' => Element\Elements::class,
+ '{DAV:}order' => Order::class,
+ '{DAV:}eq' => Operator::class,
+ '{DAV:}gt' => Operator::class,
+ '{DAV:}gte' => Operator::class,
+ '{DAV:}lt' => Operator::class,
+ '{DAV:}lte' => Operator::class,
+ '{DAV:}and' => Operator::class,
+ '{DAV:}or' => Operator::class,
+ '{DAV:}like' => Operator::class,
+ '{DAV:}contains' => Operator::class,
+ '{DAV:}not' => Operator::class,
'{DAV:}is-collection' => Operator::class,
- '{DAV:}is-defined' => Operator::class,
- '{DAV:}limit' => Limit::class,
+ '{DAV:}limit' => Limit::class,
];
}
}
diff --git a/src/DAV/SearchHandler.php b/src/DAV/SearchHandler.php
index a1fa5a7..132e793 100644
--- a/src/DAV/SearchHandler.php
+++ b/src/DAV/SearchHandler.php
@@ -1,4 +1,4 @@
-
*
@@ -22,7 +22,6 @@
namespace SearchDAV\DAV;
use Sabre\DAV\Exception\BadRequest;
-use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\HTTP\ResponseInterface;
@@ -55,14 +54,19 @@ class SearchHandler {
$this->server = $server;
}
- public function handleSearchRequest($xml, ResponseInterface $response): bool {
+ public function handleSearchRequest($xml, ResponseInterface $response) {
if (!isset($xml['{DAV:}basicsearch'])) {
$response->setStatus(400);
- $response->setBody('Unexpected xml content for search request, expected basicsearch');
+ $response->setBody('Unexpected xml content for searchrequest, expected basicsearch');
return false;
}
/** @var BasicSearch $query */
$query = $xml['{DAV:}basicsearch'];
+ if (!$query->where) {
+ $response->setStatus(400);
+ $response->setBody('Parse error: Missing {DAV:}where from {DAV:}basicsearch');
+ return false;
+ }
if (!$query->select) {
$response->setStatus(400);
$response->setBody('Parse error: Missing {DAV:}select from {DAV:}basicsearch');
@@ -85,10 +89,7 @@ class SearchHandler {
$response->setBody($e->getMessage());
return false;
}
- $data = $this->server->generateMultiStatus(iterator_to_array($this->getPropertiesIteratorResults(
- $results,
- $query->select
- )), false);
+ $data = $this->server->generateMultiStatus(iterator_to_array($this->getPropertiesIteratorResults($results, $query->select)), false);
$response->setBody($data);
return false;
}
@@ -97,9 +98,8 @@ class SearchHandler {
* @param BasicSearch $xml
* @param SearchPropertyDefinition[] $allProps
* @return Query
- * @throws BadRequest
*/
- private function getQueryForXML(BasicSearch $xml, array $allProps): Query {
+ private function getQueryForXML(BasicSearch $xml, array $allProps) {
$orderBy = array_map(function (\SearchDAV\XML\Order $order) use ($allProps) {
if (!isset($allProps[$order->property])) {
throw new BadRequest('requested order by property is not a valid property for this scope');
@@ -112,7 +112,7 @@ class SearchHandler {
}, $xml->orderBy);
$select = array_map(function ($propName) use ($allProps) {
if (!isset($allProps[$propName])) {
- return null;
+ throw new BadRequest('requested property is not a valid property for this scope');
}
$prop = $allProps[$propName];
if (!$prop->selectable) {
@@ -120,20 +120,13 @@ class SearchHandler {
}
return $prop;
}, $xml->select);
- $select = array_filter($select);
- $where = $xml->where ? $this->transformOperator($xml->where, $allProps) : null;
+ $where = $this->transformOperator($xml->where, $allProps);
return new Query($select, $xml->from, $where, $orderBy, $xml->limit);
}
- /**
- * @param \SearchDAV\XML\Operator $operator
- * @param SearchPropertyDefinition[] $allProps
- * @return Operator
- * @throws BadRequest
- */
- private function transformOperator(\SearchDAV\XML\Operator $operator, array $allProps): Operator {
+ private function transformOperator(\SearchDAV\XML\Operator $operator, array $allProps) {
$arguments = array_map(function ($argument) use ($allProps) {
if (is_string($argument)) {
if (!isset($allProps[$argument])) {
@@ -144,12 +137,10 @@ class SearchHandler {
throw new BadRequest('requested search property is not searchable');
}
return $prop;
+ } else if ($argument instanceof \SearchDAV\XML\Operator) {
+ return $this->transformOperator($argument, $allProps);
} else {
- if ($argument instanceof \SearchDAV\XML\Operator) {
- return $this->transformOperator($argument, $allProps);
- } else {
- return $argument;
- }
+ return $argument;
}
}, $operator->arguments);
@@ -166,20 +157,16 @@ class SearchHandler {
* If a depth of 1 is requested child elements will also be returned.
*
* @param SearchResult[] $results
- * @param string[] $propertyNames
+ * @param array $propertyNames
* @param int $depth
- * @return \Iterator
+ * @return \Iterator
*/
- private function getPropertiesIteratorResults(array $results, array $propertyNames = [], int $depth = 0): \Iterator {
+ private function getPropertiesIteratorResults($results, $propertyNames = [], $depth = 0) {
$propFindType = $propertyNames ? PropFind::NORMAL : PropFind::ALLPROPS;
- $this->searchBackend->preloadPropertyFor(array_map(function (SearchResult $result): INode {
- return $result->node;
- }, $results), $propertyNames);
-
foreach ($results as $result) {
$node = $result->node;
- $propFind = new PropFind($result->href, $propertyNames, $depth, $propFindType);
+ $propFind = new PropFind($result->href, (array)$propertyNames, $depth, $propFindType);
$r = $this->server->getPropertiesByNode($propFind, $node);
if ($r) {
$result = $propFind->getResultForMultiStatus();
diff --git a/src/DAV/SearchPlugin.php b/src/DAV/SearchPlugin.php
index 7c03b5a..98c3ae9 100644
--- a/src/DAV/SearchPlugin.php
+++ b/src/DAV/SearchPlugin.php
@@ -1,4 +1,4 @@
-
*
@@ -34,6 +34,9 @@ use SearchDAV\XML\SupportedQueryGrammar;
class SearchPlugin extends ServerPlugin {
const SEARCHDAV_NS = 'https://github.com/icewind1991/SearchDAV/ns';
+ /** @var Server */
+ private $server;
+
/** @var ISearchBackend */
private $searchBackend;
@@ -54,7 +57,8 @@ class SearchPlugin extends ServerPlugin {
$this->queryParser = new QueryParser();
}
- public function initialize(Server $server): void {
+ public function initialize(Server $server) {
+ $this->server = $server;
$this->pathHelper = new PathHelper($server);
$this->search = new SearchHandler($this->searchBackend, $this->pathHelper, $server);
$this->discover = new DiscoverHandler($this->searchBackend, $this->pathHelper, $this->queryParser);
@@ -63,7 +67,7 @@ class SearchPlugin extends ServerPlugin {
$server->on('propFind', [$this, 'propFindHandler']);
}
- public function propFindHandler(PropFind $propFind, INode $node): void {
+ public function propFindHandler(PropFind $propFind, INode $node) {
if ($propFind->getPath() === $this->searchBackend->getArbiterPath()) {
$propFind->handle('{DAV:}supported-query-grammar-set', new SupportedQueryGrammar());
}
@@ -72,11 +76,11 @@ class SearchPlugin extends ServerPlugin {
/**
* SEARCH is allowed for users files
*
- * @param string $path
- * @return string[]
+ * @param string $uri
+ * @return array
*/
- public function getHTTPMethods($path): array {
- $path = $this->pathHelper->getPathFromUri($path);
+ public function getHTTPMethods($uri) {
+ $path = $this->pathHelper->getPathFromUri($uri);
if ($this->searchBackend->getArbiterPath() === $path) {
return ['SEARCH'];
} else {
@@ -84,16 +88,16 @@ class SearchPlugin extends ServerPlugin {
}
}
- public function optionHandler(RequestInterface $request, ResponseInterface $response): void {
+ public function optionHandler(RequestInterface $request, ResponseInterface $response) {
if ($request->getPath() === $this->searchBackend->getArbiterPath()) {
$response->addHeader('DASL', '');
}
}
- public function searchHandler(RequestInterface $request, ResponseInterface $response): bool {
- $contentType = $request->getHeader('Content-Type') ?? '';
+ public function searchHandler(RequestInterface $request, ResponseInterface $response) {
+ $contentType = $request->getHeader('Content-Type');
- // Currently, we only support xml search queries
+ // Currently we only support xml search queries
if ((strpos($contentType, 'text/xml') === false) && (strpos($contentType, 'application/xml') === false)) {
return true;
}
@@ -104,7 +108,7 @@ class SearchPlugin extends ServerPlugin {
try {
$xml = $this->queryParser->parse(
- $request->getBodyAsString(),
+ $request->getBody(),
$request->getUrl(),
$documentType
);
diff --git a/src/Query/Limit.php b/src/Query/Limit.php
index f59550f..0619e02 100644
--- a/src/Query/Limit.php
+++ b/src/Query/Limit.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Query;
+
class Limit {
/**
* @var integer
diff --git a/src/Query/Literal.php b/src/Query/Literal.php
index 99ce07a..58b2fdd 100644
--- a/src/Query/Literal.php
+++ b/src/Query/Literal.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Query;
+
class Literal {
/**
* @var string|boolean|\DateTime|integer
diff --git a/src/Query/Operator.php b/src/Query/Operator.php
index 182f264..868557b 100644
--- a/src/Query/Operator.php
+++ b/src/Query/Operator.php
@@ -1,4 +1,4 @@
-
*
@@ -41,15 +41,14 @@ class Operator {
* The type of operation, one of the Operator::OPERATION_* constants
*/
public $type;
-
/**
- * @var (Literal|\SearchDAV\Backend\SearchPropertyDefinition|Operator)[]
+ * @var (Literal|SearchPropDefinition|Operation)[]
*
* The list of arguments for the operation
*
* - SearchPropDefinition: property for comparison
* - Literal: literal value for comparison
- * - Operator: nested operation for and/or/not operations
+ * - Operation: nested operation for and/or/not operations
*
* Which type and what number of argument an Operator takes depends on the operator type.
*/
@@ -59,9 +58,9 @@ class Operator {
* Operator constructor.
*
* @param string $type
- * @param (Literal|\SearchDAV\Backend\SearchPropertyDefinition|Operator)[] $arguments
+ * @param array $arguments
*/
- public function __construct(string $type = '', array $arguments = []) {
+ public function __construct($type = '', array $arguments = []) {
$this->type = $type;
$this->arguments = $arguments;
}
diff --git a/src/Query/Order.php b/src/Query/Order.php
index 20f69f6..5266658 100644
--- a/src/Query/Order.php
+++ b/src/Query/Order.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Query;
+
use SearchDAV\Backend\SearchPropertyDefinition;
class Order {
@@ -45,7 +46,7 @@ class Order {
* @param SearchPropertyDefinition $property
* @param string $order
*/
- public function __construct(SearchPropertyDefinition $property, string $order) {
+ public function __construct(SearchPropertyDefinition $property, $order) {
$this->property = $property;
$this->order = $order;
}
diff --git a/src/Query/Query.php b/src/Query/Query.php
index 82f237c..85fc1ed 100644
--- a/src/Query/Query.php
+++ b/src/Query/Query.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Query;
+
use SearchDAV\Backend\SearchPropertyDefinition;
class Query {
@@ -37,7 +38,7 @@ class Query {
*/
public $from;
/**
- * @var ?Operator
+ * @var Operator
*
* The search operator, either a comparison ('gt', 'eq', ...) or a boolean operator ('and', 'or', 'not')
*/
@@ -48,7 +49,7 @@ class Query {
* The list of order operations that should be used to order the results.
*
* Each order operations consists of a property to sort on and a sort direction.
- * If more than one order operations are specified, the comparisons for ordering should
+ * If more then one order operations are specified, the comparisons for ordering should
* be applied in the order that the order operations are defined in with the earlier comparisons being
* more significant.
*/
@@ -64,11 +65,11 @@ class Query {
* Query constructor.
* @param SearchPropertyDefinition[] $select
* @param Scope[] $from
- * @param Operator|null $where
+ * @param Operator $where
* @param Order[] $orderBy
* @param Limit $limit
*/
- public function __construct(array $select, array $from, ?Operator $where, array $orderBy, Limit $limit) {
+ public function __construct(array $select, array $from, Operator $where, array $orderBy, Limit $limit) {
$this->select = $select;
$this->from = $from;
$this->where = $where;
diff --git a/src/Query/Scope.php b/src/Query/Scope.php
index 76b41ae..ebc778d 100644
--- a/src/Query/Scope.php
+++ b/src/Query/Scope.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\Query;
+
class Scope {
/**
* @var string
@@ -51,7 +52,7 @@ class Scope {
* @param int|string $depth
* @param string|null $path
*/
- public function __construct(string $href = '', $depth = 1, ?string $path = null) {
+ public function __construct($href = '', $depth = 1, $path = null) {
$this->href = $href;
$this->depth = $depth;
$this->path = $path;
diff --git a/src/XML/BasicSearch.php b/src/XML/BasicSearch.php
index c5451ca..8af30f4 100644
--- a/src/XML/BasicSearch.php
+++ b/src/XML/BasicSearch.php
@@ -1,4 +1,4 @@
-
*
@@ -24,7 +24,6 @@ namespace SearchDAV\XML;
use Sabre\Xml\ParseException;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use function Sabre\Xml\Deserializer\keyValue;
/**
* The object representation of a search query made by the client
@@ -43,7 +42,7 @@ class BasicSearch implements XmlDeserializable {
*/
public $from;
/**
- * @var ?Operator
+ * @var Operator
*
* The search operator, either a comparison ('gt', 'eq', ...) or a boolean operator ('and', 'or', 'not')
*/
@@ -66,33 +65,26 @@ class BasicSearch implements XmlDeserializable {
*/
public $limit;
- public function __construct(array $select, array $from, ?Operator $where, array $orderBy, Limit $limit) {
- $this->select = $select;
- $this->from = $from;
- $this->where = $where;
- $this->orderBy = $orderBy;
- $this->limit = $limit;
- }
-
-
/**
* @param Reader $reader
* @return BasicSearch
* @throws ParseException
*/
- public static function xmlDeserialize(Reader $reader): BasicSearch {
- $elements = keyValue($reader);
+ static function xmlDeserialize(Reader $reader) {
+ $search = new self();
+
+ $elements = \Sabre\Xml\Deserializer\keyValue($reader);
if (!isset($elements['{DAV:}from'])) {
throw new ParseException('Missing {DAV:}from when parsing {DAV:}basicsearch');
}
- return new BasicSearch(
- $elements['{DAV:}select'] ?? [],
- $elements['{DAV:}from'],
- $elements['{DAV:}where'] ?? null,
- $elements['{DAV:}orderby'] ?? [],
- $elements['{DAV:}limit'] ?? new Limit()
- );
+ $search->select = isset($elements['{DAV:}select']) ? $elements['{DAV:}select'] : [];
+ $search->from = $elements['{DAV:}from'];
+ $search->where = isset($elements['{DAV:}where']) ? $elements['{DAV:}where'] : null;
+ $search->orderBy = isset($elements['{DAV:}orderby']) ? $elements['{DAV:}orderby'] : [];
+ $search->limit = isset($elements['{DAV:}limit']) ? $elements['{DAV:}limit'] : new Limit();
+
+ return $search;
}
}
diff --git a/src/XML/BasicSearchSchema.php b/src/XML/BasicSearchSchema.php
index c68aabe..0e4c30d 100644
--- a/src/XML/BasicSearchSchema.php
+++ b/src/XML/BasicSearchSchema.php
@@ -1,4 +1,4 @@
-
*
@@ -21,6 +21,7 @@
namespace SearchDAV\XML;
+
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
@@ -37,10 +38,10 @@ class BasicSearchSchema implements XmlSerializable {
$this->properties = $properties;
}
- public function xmlSerialize(Writer $writer): void {
- $childs = array_map(function (PropDesc $propDesc) {
+ function xmlSerialize(Writer $writer) {
+ $childs = array_map(function(PropDesc $propDesc) {
return [
- 'name' => '{DAV:}propdesc',
+ 'name' => '{DAV:}propdesc',
'value' => $propDesc
];
}, $this->properties);
diff --git a/src/XML/Limit.php b/src/XML/Limit.php
index b00809f..0179d40 100644
--- a/src/XML/Limit.php
+++ b/src/XML/Limit.php
@@ -1,4 +1,4 @@
-
*
@@ -24,16 +24,15 @@ namespace SearchDAV\XML;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
use SearchDAV\DAV\SearchPlugin;
-use function Sabre\Xml\Deserializer\keyValue;
/**
* The limit and offset of a search query
*/
class Limit extends \SearchDAV\Query\Limit implements XmlDeserializable {
- public static function xmlDeserialize(Reader $reader): Limit {
+ static function xmlDeserialize(Reader $reader) {
$limit = new self();
- $elements = keyValue($reader);
+ $elements = \Sabre\Xml\Deserializer\keyValue($reader);
$namespace = SearchPlugin::SEARCHDAV_NS;
$limit->maxResults = isset($elements['{DAV:}nresults']) ? $elements['{DAV:}nresults'] : 0;
diff --git a/src/XML/Literal.php b/src/XML/Literal.php
index dc1f69d..03d167f 100644
--- a/src/XML/Literal.php
+++ b/src/XML/Literal.php
@@ -1,4 +1,4 @@
-
*
@@ -21,19 +21,15 @@
namespace SearchDAV\XML;
+
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
class Literal extends \SearchDAV\Query\Literal implements XmlDeserializable {
- public static function xmlDeserialize(Reader $reader): Literal {
+ static function xmlDeserialize(Reader $reader) {
$literal = new self();
- if ($reader->isEmptyElement) {
- $literal->value = '';
- } else {
- $literal->value = $reader->readText();
- }
-
+ $literal->value = $reader->readText();
$reader->read();
return $literal;
diff --git a/src/XML/Operator.php b/src/XML/Operator.php
index fb44ba8..6439ff6 100644
--- a/src/XML/Operator.php
+++ b/src/XML/Operator.php
@@ -1,4 +1,4 @@
-
*
@@ -23,7 +23,6 @@ namespace SearchDAV\XML;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use SearchDAV\Query\Operator as QueryOperator;
class Operator implements XmlDeserializable {
/**
@@ -33,7 +32,7 @@ class Operator implements XmlDeserializable {
*/
public $type;
/**
- * @var (Literal|string|Operator)[]
+ * @var (Literal|string|Operation)[]
*
* The list of arguments for the operation
*
@@ -49,41 +48,32 @@ class Operator implements XmlDeserializable {
* Operator constructor.
*
* @param string $type
- * @param (Literal|string|Operator)[] $arguments
+ * @param array $arguments
*/
- public function __construct(string $type = '', array $arguments = []) {
+ public function __construct($type = '', array $arguments = []) {
$this->type = $type;
$this->arguments = $arguments;
}
- public static function xmlDeserialize(Reader $reader): Operator {
+ static function xmlDeserialize(Reader $reader) {
$operator = new self();
- $operator->type = $reader->getClark() ?? '';
+ $operator->type = $reader->getClark();
if ($reader->isEmptyElement) {
$reader->next();
return $operator;
}
-
- if ($operator->type === QueryOperator::OPERATION_CONTAINS) {
- $operator->arguments[] = $reader->readString();
- $reader->next();
- return $operator;
- }
-
$reader->read();
do {
if ($reader->nodeType === Reader::ELEMENT) {
$argument = $reader->parseCurrentElement();
if ($argument['name'] === '{DAV:}prop') {
- $operator->arguments[] = $argument['value'][0] ?? '';
+ $operator->arguments[] = $argument['value'][0];
} else {
$operator->arguments[] = $argument['value'];
}
} else {
- if (!$reader->read()) {
- break;
- }
+ $reader->read();
}
} while ($reader->nodeType !== Reader::END_ELEMENT);
diff --git a/src/XML/Order.php b/src/XML/Order.php
index 74eab7e..6573473 100644
--- a/src/XML/Order.php
+++ b/src/XML/Order.php
@@ -1,4 +1,4 @@
-
*
@@ -21,9 +21,9 @@
namespace SearchDAV\XML;
+
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use function Sabre\Xml\Deserializer\keyValue;
class Order implements XmlDeserializable {
/**
@@ -45,15 +45,15 @@ class Order implements XmlDeserializable {
* @param string $property
* @param string $order
*/
- public function __construct(string $property = '', string $order = \SearchDAV\Query\Order::ASC) {
+ public function __construct($property = '', $order = \SearchDAV\Query\Order::ASC) {
$this->property = $property;
$this->order = $order;
}
- public static function xmlDeserialize(Reader $reader): Order {
+ static function xmlDeserialize(Reader $reader) {
$order = new self();
- $childs = keyValue($reader);
+ $childs = \Sabre\Xml\Deserializer\keyValue($reader);
$order->order = array_key_exists('{DAV:}descending', $childs) ? \SearchDAV\Query\Order::DESC : \SearchDAV\Query\Order::ASC;
$order->property = $childs['{DAV:}prop'][0];
diff --git a/src/XML/PropDesc.php b/src/XML/PropDesc.php
index 43ada6a..85e0c63 100644
--- a/src/XML/PropDesc.php
+++ b/src/XML/PropDesc.php
@@ -1,4 +1,4 @@
-
*
@@ -21,9 +21,9 @@
namespace SearchDAV\XML;
+
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
-use SearchDAV\Backend\SearchPropertyDefinition;
class PropDesc implements XmlSerializable {
/**
@@ -47,14 +47,7 @@ class PropDesc implements XmlSerializable {
*/
public $sortable;
- public function __construct(SearchPropertyDefinition $propertyDefinition) {
- $this->dataType = $propertyDefinition->dataType;
- $this->sortable = $propertyDefinition->sortable;
- $this->selectable = $propertyDefinition->selectable;
- $this->searchable = $propertyDefinition->searchable;
- }
-
- public function xmlSerialize(Writer $writer): void {
+ function xmlSerialize(Writer $writer) {
$data = [
'{DAV:}dataType' => [$this->dataType => null]
];
@@ -69,7 +62,7 @@ class PropDesc implements XmlSerializable {
}
$writer->write(array_map(function ($propName) {
return [
- 'name' => '{DAV:}prop',
+ 'name' => '{DAV:}prop',
'value' => $propName
];
}, $this->properties));
diff --git a/src/XML/QueryDiscoverResponse.php b/src/XML/QueryDiscoverResponse.php
index 0d8b6a2..b564b3b 100644
--- a/src/XML/QueryDiscoverResponse.php
+++ b/src/XML/QueryDiscoverResponse.php
@@ -1,4 +1,4 @@
-
*
@@ -21,9 +21,9 @@
namespace SearchDAV\XML;
+
use Sabre\DAV\Xml\Element\Response;
use Sabre\Xml\Writer;
-use function Sabre\HTTP\encodePath;
class QueryDiscoverResponse extends Response {
/**
@@ -38,23 +38,21 @@ class QueryDiscoverResponse extends Response {
* @param BasicSearchSchema|null $schema
* @param null|int|string $httpStatus
*/
- public function __construct($href, ?BasicSearchSchema $schema = null, $httpStatus = null) {
- if ($httpStatus !== null) {
- $httpStatus = (string)$httpStatus;
- }
+ function __construct($href, BasicSearchSchema $schema = null, $httpStatus = null) {
parent::__construct($href, [], $httpStatus);
$this->schema = $schema;
+
}
- public function xmlSerialize(Writer $writer): void {
+ function xmlSerialize(Writer $writer) {
if ($status = $this->getHTTPStatus()) {
$writer->writeElement('{DAV:}status', 'HTTP/1.1 ' . $status . ' ' . \Sabre\HTTP\Response::$statusCodes[$status]);
}
- $writer->writeElement('{DAV:}href', encodePath($this->getHref()));
+ $writer->writeElement('{DAV:}href', \Sabre\HTTP\encodePath($this->getHref()));
if ($this->schema) {
$writer->writeElement('{DAV:}query-schema', [
- '{DAV:}basicsearchschema' => $this->schema
+ '{DAV:}basicsearchschema' => $this->schema
]);
}
}
diff --git a/src/XML/Scope.php b/src/XML/Scope.php
index 90a2384..905e140 100644
--- a/src/XML/Scope.php
+++ b/src/XML/Scope.php
@@ -1,4 +1,4 @@
-
*
@@ -23,13 +23,12 @@ namespace SearchDAV\XML;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use function Sabre\Xml\Deserializer\keyValue;
class Scope extends \SearchDAV\Query\Scope implements XmlDeserializable {
- public static function xmlDeserialize(Reader $reader): Scope {
+ static function xmlDeserialize(Reader $reader) {
$scope = new self();
- $values = keyValue($reader);
+ $values = \Sabre\Xml\Deserializer\keyValue($reader);
$scope->href = $values['{DAV:}href'];
$scope->depth = $values['{DAV:}depth'];
diff --git a/src/XML/SupportedQueryGrammar.php b/src/XML/SupportedQueryGrammar.php
index a24e7b1..9b17a9b 100644
--- a/src/XML/SupportedQueryGrammar.php
+++ b/src/XML/SupportedQueryGrammar.php
@@ -1,4 +1,4 @@
-
*
@@ -21,16 +21,19 @@
namespace SearchDAV\XML;
+
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
class SupportedQueryGrammar implements XmlSerializable {
- const GRAMMAR_BASIC_SEARCH = '{DAV:}basicsearch';
+ const GRAMMAR_BASICSEARCH = '{DAV:}basicsearch';
- public function xmlSerialize(Writer $writer): void {
+ public $grammar = self::GRAMMAR_BASICSEARCH;
+
+ function xmlSerialize(Writer $writer) {
$writer->startElement('{DAV:}supported-query-grammar');
$writer->startElement('{DAV:}grammar');
- $writer->startElement(self::GRAMMAR_BASIC_SEARCH);
+ $writer->startElement($this->grammar);
$writer->endElement();
$writer->endElement();
$writer->endElement();
diff --git a/tests/DummyBackend.php b/tests/DummyBackend.php
index 822a392..f5da86c 100644
--- a/tests/DummyBackend.php
+++ b/tests/DummyBackend.php
@@ -21,6 +21,7 @@
namespace SearchDAV\Test;
+
use Sabre\DAV\INode;
use Sabre\DAV\SimpleFile;
use SearchDAV\Backend\ISearchBackend;
@@ -30,29 +31,26 @@ use SearchDAV\XML\BasicSearch;
use SearchDAV\Backend\SearchPropertyDefinition;
class DummyBackend implements ISearchBackend {
- public function getArbiterPath(): string {
+ public function getArbiterPath() {
return '';
}
- public function isValidScope(string $href, $depth, ?string $path): bool {
+ public function isValidScope($href, $depth, $path) {
return true;
}
- public function getPropertyDefinitionsForScope($href, $path): array {
+ public function getPropertyDefinitionsForScope($href, $path) {
return [
- new SearchPropertyDefinition('{DAV:}getcontentlength', true, true, true, SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER),
+ new SearchPropertyDefinition('{DAV:}getcontentlength', true, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
new SearchPropertyDefinition('{DAV:}getcontenttype', true, true, true),
new SearchPropertyDefinition('{DAV:}displayname', true, true, true),
- new SearchPropertyDefinition('{http://ns.nextcloud.com:}fileid', false, true, true, SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER),
+ new SearchPropertyDefinition('{http://ns.nextcloud.com:}fileid', false, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
];
}
- public function search(Query $query): array {
+ public function search(Query $query) {
return [
new SearchResult(new SimpleFile('foo.txt', 'foobar', 'text/plain'), '/bar/foo.txt')
];
}
-
- public function preloadPropertyFor(array $nodes, array $requestProperties): void {
- }
}
diff --git a/tests/PathHelperTest.php b/tests/PathHelperTest.php
index 1a83a6a..259ab2f 100644
--- a/tests/PathHelperTest.php
+++ b/tests/PathHelperTest.php
@@ -21,12 +21,11 @@
namespace SearchDAV\Test;
-use PHPUnit\Framework\TestCase;
use Sabre\DAV\Server;
use SearchDAV\DAV\PathHelper;
-class PathHelperTest extends TestCase {
- public function uriProvider() {
+class PathHelperTest extends \PHPUnit_Framework_TestCase {
+ public function uriProvider(){
return [
['/', '', ''],
['/index.php/', 'foo', 'foo'],
diff --git a/tests/QueryParserTest.php b/tests/QueryParserTest.php
index 84e6b8c..2ff8543 100644
--- a/tests/QueryParserTest.php
+++ b/tests/QueryParserTest.php
@@ -21,8 +21,7 @@
namespace SearchDAV\Test;
-use PHPUnit\Framework\TestCase;
-use Sabre\Xml\ParseException;
+
use Sabre\Xml\Service;
use SearchDAV\DAV\QueryParser;
use SearchDAV\XML\BasicSearch;
@@ -33,7 +32,8 @@ use SearchDAV\XML\Order;
use SearchDAV\XML\Scope;
use SearchDAV\XML\SupportedQueryGrammar;
-class QueryParserTest extends TestCase {
+
+class QueryParserTest extends \PHPUnit_Framework_TestCase {
public function testParseBasicQuery() {
$query = file_get_contents(__DIR__ . '/basicquery.xml');
$parser = new QueryParser();
@@ -48,14 +48,14 @@ class QueryParserTest extends TestCase {
$this->assertEquals(['{DAV:}getcontentlength'], $search->select);
$this->assertEquals([
- new Scope('/container1/', 'infinity'),
+ new Scope('/container1/', 'infinity')
], $search->from);
$this->assertEquals(new Operator(\SearchDAV\Query\Operator::OPERATION_GREATER_THAN, [
'{DAV:}getcontentlength',
- new Literal(10000),
+ new Literal(10000)
]), $search->where);
$this->assertEquals([
- new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::ASC),
+ new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::ASC)
], $search->orderBy);
}
@@ -73,14 +73,14 @@ class QueryParserTest extends TestCase {
$this->assertEquals(['{DAV:}getcontentlength'], $search->select);
$this->assertEquals([
- new Scope('/container1/', 'infinity'),
+ new Scope('/container1/', 'infinity')
], $search->from);
$this->assertEquals(new Operator(\SearchDAV\Query\Operator::OPERATION_GREATER_THAN, [
'{DAV:}getcontentlength',
- new Literal(10000),
+ new Literal(10000)
]), $search->where);
$this->assertEquals([
- new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::DESC),
+ new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::DESC)
], $search->orderBy);
}
@@ -105,10 +105,12 @@ class QueryParserTest extends TestCase {
$this->assertEquals([], $search->orderBy);
}
+ /**
+ * @expectedException \Sabre\XML\ParseException
+ */
public function testParseNoFrom() {
$query = file_get_contents(__DIR__ . '/nofrom.xml');
$parser = new QueryParser();
- $this->expectException(ParseException::class);
$parser->parse($query, null, $rootElementName);
}
@@ -140,44 +142,4 @@ class QueryParserTest extends TestCase {
$limit->maxResults = 10;
$this->assertEquals($limit, $search->limit);
}
-
- public function testParseComplexQuery() {
- $query = file_get_contents(__DIR__ . '/complexquery.xml');
- $parser = new QueryParser();
- $xml = $parser->parse($query, null, $rootElementName);
-
- $this->assertEquals('{DAV:}searchrequest', $rootElementName);
- $this->assertArrayHasKey('{DAV:}basicsearch', $xml);
-
- /** @var BasicSearch $search */
- $search = $xml['{DAV:}basicsearch'];
- $this->assertInstanceOf(BasicSearch::class, $search);
-
- $this->assertEquals(['{DAV:}getcontentlength'], $search->select);
- $this->assertEquals([
- new Scope('/container1/', 'infinity'),
- ], $search->from);
- $this->assertEquals(new Operator(\SearchDAV\Query\Operator::OPERATION_AND, [
- new Operator(\SearchDAV\Query\Operator::OPERATION_GREATER_THAN, [
- '{DAV:}getcontentlength',
- new Literal(10000),
- ]),
- new Operator(\SearchDAV\Query\Operator::OPERATION_LESS_THAN, [
- '{DAV:}getcontentlength',
- new Literal(90000),
- ]),
- new Operator(\SearchDAV\Query\Operator::OPERATION_CONTAINS, [
- 'Peter Forsberg',
- ]),
- ]), $search->where);
- $this->assertEquals([
- new Order('{DAV:}getcontentlength', \SearchDAV\Query\Order::ASC),
- ], $search->orderBy);
- }
-
- public function testParseWhereBroken() {
- $query = file_get_contents(__DIR__ . '/invalidwherebroken.xml');
- $this->expectException(ParseException::class);
- (new QueryParser())->parse($query, null, $rootElementName);
- }
}
diff --git a/tests/SearchPluginTest.php b/tests/SearchPluginTest.php
index 7ce28d6..351fafe 100644
--- a/tests/SearchPluginTest.php
+++ b/tests/SearchPluginTest.php
@@ -21,7 +21,7 @@
namespace SearchDAV\Test;
-use PHPUnit\Framework\TestCase;
+
use Sabre\DAV\FS\Directory;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
@@ -29,21 +29,25 @@ use Sabre\DAV\Server;
use Sabre\DAV\Xml\Service;
use Sabre\HTTP\Request;
use Sabre\HTTP\Response;
+use Sabre\VObject\Parser\XML;
use SearchDAV\Backend\ISearchBackend;
use SearchDAV\Backend\SearchPropertyDefinition;
use SearchDAV\Backend\SearchResult;
use SearchDAV\DAV\SearchPlugin;
use SearchDAV\Query\Query;
+use SearchDAV\XML\BasicSearch;
use SearchDAV\XML\Limit;
use SearchDAV\XML\Literal;
+use SearchDAV\XML\Operator;
+use SearchDAV\XML\Order;
use SearchDAV\XML\Scope;
use SearchDAV\XML\SupportedQueryGrammar;
-class SearchPluginTest extends TestCase {
+class SearchPluginTest extends \PHPUnit_Framework_TestCase {
/** @var ISearchBackend|\PHPUnit_Framework_MockObject_MockObject */
private $searchBackend;
- protected function setUp(): void {
+ protected function setUp() {
parent::setUp();
$this->searchBackend = $this->getMockBuilder(ISearchBackend::class)
@@ -56,7 +60,7 @@ class SearchPluginTest extends TestCase {
->willReturn('foo');
$request = new Request('SEARCH', 'foo', [
- 'Content-Type' => 'text/plain',
+ 'Content-Type' => 'text/plain'
], fopen(__DIR__ . '/nofrom.xml', 'r'));
$response = new Response();
@@ -71,7 +75,7 @@ class SearchPluginTest extends TestCase {
->willReturn('foo');
$request = new Request('SEARCH', 'bar', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
], fopen(__DIR__ . '/nofrom.xml', 'r'));
$response = new Response();
@@ -86,7 +90,7 @@ class SearchPluginTest extends TestCase {
->willReturn('foo');
$request = new Request('SEARCH', 'foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
], fopen(__DIR__ . '/invalidtype.xml', 'r'));
$response = new Response();
@@ -103,7 +107,7 @@ class SearchPluginTest extends TestCase {
->willReturn('foo');
$request = new Request('SEARCH', 'foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
], fopen(__DIR__ . '/nofrom.xml', 'r'));
$response = new Response();
@@ -167,7 +171,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/discover.xml', 'r'));
@@ -180,22 +184,10 @@ class SearchPluginTest extends TestCase {
$this->searchBackend->expects($this->once())
->method('getPropertyDefinitionsForScope')
->willReturn([
- new SearchPropertyDefinition(
- '{DAV:}getcontentlength',
- true,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
+ new SearchPropertyDefinition('{DAV:}getcontentlength', true, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
new SearchPropertyDefinition('{DAV:}getcontenttype', true, true, true),
new SearchPropertyDefinition('{DAV:}displayname', true, true, true),
- new SearchPropertyDefinition(
- '{http://ns.nextcloud.com:}fileid',
- false,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
+ new SearchPropertyDefinition('{http://ns.nextcloud.com:}fileid', false, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
]);
$plugin->searchHandler($request, $response);
@@ -216,7 +208,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/discover.xml', 'r'));
@@ -247,7 +239,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/invaliddiscover.xml', 'r'));
@@ -274,7 +266,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/basicquery.xml', 'r'));
@@ -284,23 +276,17 @@ class SearchPluginTest extends TestCase {
->method('isValidScope')
->willReturn(true);
- $lengthProp = new SearchPropertyDefinition(
- '{DAV:}getcontentlength',
- true,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- );
+ $lengthProp = new SearchPropertyDefinition('{DAV:}getcontentlength', true, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER);
$orderBy = [
- new \SearchDAV\Query\Order($lengthProp, \SearchDAV\Query\Order::ASC),
+ new \SearchDAV\Query\Order($lengthProp, \SearchDAV\Query\Order::ASC)
];
$select = [$lengthProp];
$from = [
- new Scope('/container1/', 'infinity', '/container1/'),
+ new Scope('/container1/', 'infinity', '/container1/')
];
$where = new \SearchDAV\Query\Operator(\SearchDAV\Query\Operator::OPERATION_GREATER_THAN, [
$lengthProp,
- new Literal(10000),
+ new Literal(10000)
]);
$limit = new Limit();
$query = new Query($select, $from, $where, $orderBy, $limit);
@@ -312,13 +298,13 @@ class SearchPluginTest extends TestCase {
new SearchResult(
new Directory('/foo'),
'/foo'
- ),
+ )
]);
$this->searchBackend->expects($this->any())
->method('getPropertyDefinitionsForScope')
->willReturn([
- $lengthProp,
+ $lengthProp
]);
$plugin->searchHandler($request, $response);
@@ -339,7 +325,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/nofrom.xml', 'r'));
@@ -362,19 +348,12 @@ class SearchPluginTest extends TestCase {
->method('getArbiterPath')
->willReturn('foo');
- $lengthProp = new SearchPropertyDefinition(
- '{DAV:}getcontentlength',
- true,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- );
$plugin = new SearchPlugin($this->searchBackend);
$server = new Server();
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/nowhere.xml', 'r'));
@@ -384,20 +363,12 @@ class SearchPluginTest extends TestCase {
->method('isValidScope')
->willReturn(true);
- $this->searchBackend->expects($this->any())
- ->method('getPropertyDefinitionsForScope')
- ->willReturn([$lengthProp]);
-
- $this->searchBackend->expects($this->once())
- ->method('search')
- ->willReturnCallback(function (Query $query) {
- $this->assertNull($query->where);
- return [];
- });
+ $this->searchBackend->expects($this->never())
+ ->method('search');
$plugin->searchHandler($request, $response);
- $this->assertEquals(207, $response->getStatus());
+ $this->assertEquals(400, $response->getStatus());
}
public function testSearchQueryNoSelect() {
@@ -410,7 +381,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/noselect.xml', 'r'));
@@ -438,7 +409,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/invalid.xml', 'r'));
@@ -487,7 +458,7 @@ class SearchPluginTest extends TestCase {
$plugin->initialize($server);
$request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
+ 'Content-Type' => 'text/xml'
]);
$request->setBaseUrl('/index.php');
$request->setBody(fopen(__DIR__ . '/invalidwhere.xml', 'r'));
@@ -503,13 +474,7 @@ class SearchPluginTest extends TestCase {
$this->searchBackend->expects($this->once())
->method('getPropertyDefinitionsForScope')
->willReturn([
- new SearchPropertyDefinition(
- '{http://ns.nextcloud.com:}fileid',
- false,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
+ new SearchPropertyDefinition('{http://ns.nextcloud.com:}fileid', false, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER),
]);
$plugin->searchHandler($request, $response);
@@ -517,97 +482,4 @@ class SearchPluginTest extends TestCase {
$this->assertEquals(400, $response->getStatus());
}
- public function testSearchQueryInvalidWhereNoProp() {
- $this->searchBackend->expects($this->any())
- ->method('getArbiterPath')
- ->willReturn('foo');
-
- $plugin = new SearchPlugin($this->searchBackend);
- $server = new Server();
- $plugin->initialize($server);
-
- $request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
- ]);
- $request->setBaseUrl('/index.php');
- $request->setBody(fopen(__DIR__ . '/invalidwherenoprop.xml', 'r'));
- $response = new Response();
-
- $this->searchBackend->expects($this->any())
- ->method('isValidScope')
- ->willReturn(true);
-
- $this->searchBackend->expects($this->never())
- ->method('search');
-
- $this->searchBackend->expects($this->any())
- ->method('getPropertyDefinitionsForScope')
- ->willReturn([
- new SearchPropertyDefinition(
- '{http://ns.nextcloud.com:}fileid',
- false,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
- new SearchPropertyDefinition(
- '{DAV:}getcontentlength',
- true,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
- ]);
-
- $plugin->searchHandler($request, $response);
-
- $this->assertEquals(400, $response->getStatus());
- }
-
- public function testSearchQueryInfiniteLoopEmptyLiteral() {
- $this->searchBackend->expects($this->any())
- ->method('getArbiterPath')
- ->willReturn('foo');
-
- $plugin = new SearchPlugin($this->searchBackend);
- $server = new Server();
- $plugin->initialize($server);
-
- $request = new Request('SEARCH', '/index.php/foo', [
- 'Content-Type' => 'text/xml',
- ]);
- $request->setBaseUrl('/index.php');
- $request->setBody(fopen(__DIR__ . '/infiniteloopemptyliteral.xml', 'r'));
- $response = new Response();
-
- $this->searchBackend->expects($this->any())
- ->method('isValidScope')
- ->willReturn(true);
-
- $this->searchBackend->expects($this->never())
- ->method('search');
-
- $this->searchBackend->expects($this->any())
- ->method('getPropertyDefinitionsForScope')
- ->willReturn([
- new SearchPropertyDefinition(
- '{http://ns.nextcloud.com:}fileid',
- false,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
- new SearchPropertyDefinition(
- '{DAV:}getcontentlength',
- true,
- true,
- true,
- SearchPropertyDefinition::DATATYPE_NON_NEGATIVE_INTEGER
- ),
- ]);
-
- $plugin->searchHandler($request, $response);
-
- $this->assertEquals(400, $response->getStatus());
- }
}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index d21c14d..52135e2 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,3 +1,3 @@
-
-
-
-
-
-
-
-
-
- /container1/
- infinity
-
-
-
-
-
-
-
-
- 10000
-
-
-
-
-
- 90000
-
- Peter Forsberg
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/infiniteloopemptyliteral.xml b/tests/infiniteloopemptyliteral.xml
deleted file mode 100644
index 7fa428a..0000000
--- a/tests/infiniteloopemptyliteral.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- /files/naofumi
- infinity
-
-
-
-
-
-
\ No newline at end of file
diff --git a/tests/invalidwherebroken.xml b/tests/invalidwherebroken.xml
deleted file mode 100644
index 04025dd..0000000
--- a/tests/invalidwherebroken.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- /container1/
- infinity
-
-
-
-
-
- 5
-
-
-
-
diff --git a/tests/invalidwherenoprop.xml b/tests/invalidwherenoprop.xml
deleted file mode 100644
index 8613100..0000000
--- a/tests/invalidwherenoprop.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- /container1/
- infinity
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file