Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/3rdparty.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Petry <vincent@nextcloud.com>2022-04-12 20:42:08 +0300
committerGitHub <noreply@github.com>2022-04-12 20:42:08 +0300
commit6176112be9428026897d958dc2b558d1bde4fec2 (patch)
tree184a66b4f53d75d901cd988c80cc1512d80c430d
parentd80ec1fa2dad1c3ede272583e3c4f1f77f40141b (diff)
parentccc26ff9d787acddeb6a63c614317d19cb453c39 (diff)
Merge pull request #1023 from nextcloud/metadata-patchv24.0.1rc1v24.0.1v24.0.0rc3v24.0.0rc2v24.0.0rc1v24.0.0
update icewind/searchdav to add api required for metadata feature
-rw-r--r--autoload.php5
-rw-r--r--composer.json2
-rw-r--r--composer.lock24
-rw-r--r--composer/autoload_real.php2
-rw-r--r--composer/installed.json24
-rw-r--r--composer/installed.php10
-rw-r--r--icewind/searchdav/.gitignore1
-rw-r--r--icewind/searchdav/psalm.xml15
-rw-r--r--icewind/searchdav/src/Backend/ISearchBackend.php22
-rw-r--r--icewind/searchdav/src/Backend/SearchPropertyDefinition.php11
-rw-r--r--icewind/searchdav/src/Backend/SearchResult.php3
-rw-r--r--icewind/searchdav/src/DAV/DiscoverHandler.php9
-rw-r--r--icewind/searchdav/src/DAV/PathHelper.php2
-rw-r--r--icewind/searchdav/src/DAV/QueryParser.php48
-rw-r--r--icewind/searchdav/src/DAV/SearchHandler.php25
-rw-r--r--icewind/searchdav/src/DAV/SearchPlugin.php24
-rw-r--r--icewind/searchdav/src/Query/Limit.php1
-rw-r--r--icewind/searchdav/src/Query/Literal.php1
-rw-r--r--icewind/searchdav/src/Query/Operator.php7
-rw-r--r--icewind/searchdav/src/Query/Order.php1
-rw-r--r--icewind/searchdav/src/Query/Query.php5
-rw-r--r--icewind/searchdav/src/Query/Scope.php1
-rw-r--r--icewind/searchdav/src/XML/BasicSearch.php32
-rw-r--r--icewind/searchdav/src/XML/BasicSearchSchema.php7
-rw-r--r--icewind/searchdav/src/XML/Limit.php5
-rw-r--r--icewind/searchdav/src/XML/Literal.php3
-rw-r--r--icewind/searchdav/src/XML/Operator.php8
-rw-r--r--icewind/searchdav/src/XML/Order.php6
-rw-r--r--icewind/searchdav/src/XML/PropDesc.php13
-rw-r--r--icewind/searchdav/src/XML/QueryDiscoverResponse.php14
-rw-r--r--icewind/searchdav/src/XML/Scope.php5
-rw-r--r--icewind/searchdav/src/XML/SupportedQueryGrammar.php9
32 files changed, 201 insertions, 144 deletions
diff --git a/autoload.php b/autoload.php
index 7558d271..abdc5a52 100644
--- a/autoload.php
+++ b/autoload.php
@@ -2,6 +2,11 @@
// autoload.php @generated by Composer
+if (PHP_VERSION_ID < 50600) {
+ echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+ exit(1);
+}
+
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit2f23f73bc0cc116b4b1eee1521aa8652::getLoader();
diff --git a/composer.json b/composer.json
index 5de38bea..8cfae63f 100644
--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,7 @@
"egulias/email-validator": "3.1.1",
"giggsey/libphonenumber-for-php": "^8.12.37",
"guzzlehttp/guzzle": "^7.4.0",
- "icewind/searchdav": "^2.0.0",
+ "icewind/searchdav": "^3.0",
"icewind/streams": "v0.7.5",
"microsoft/azure-storage-blob": "^1.5",
"nextcloud/lognormalizer": "^1.0",
diff --git a/composer.lock b/composer.lock
index c6d50c8f..c3e53f9e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "12dfbaaccdc9fc5b73f19ae713510c28",
+ "content-hash": "2cbb12f8ea31eccc0d3c21c9df7c11f5",
"packages": [
{
"name": "aws/aws-sdk-php",
@@ -1603,24 +1603,28 @@
},
{
"name": "icewind/searchdav",
- "version": "v2.0.0",
+ "version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/SearchDAV.git",
- "reference": "c69806d900c2c9a5954bfabc80178d6eb0d63df4"
+ "reference": "52c8cfc21bd69271f224671c4924d260b0a8d4fb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SearchDAV/zipball/c69806d900c2c9a5954bfabc80178d6eb0d63df4",
- "reference": "c69806d900c2c9a5954bfabc80178d6eb0d63df4",
+ "url": "https://api.github.com/repos/icewind1991/SearchDAV/zipball/52c8cfc21bd69271f224671c4924d260b0a8d4fb",
+ "reference": "52c8cfc21bd69271f224671c4924d260b0a8d4fb",
"shasum": ""
},
"require": {
- "php": ">=7.1",
+ "php": ">=7.3 || >=8.0",
"sabre/dav": "^4.0.0"
},
"require-dev": {
- "phpunit/phpunit": "^8"
+ "friendsofphp/php-cs-fixer": "^2",
+ "php-parallel-lint/php-parallel-lint": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^8",
+ "psalm/phar": "^4.3"
},
"type": "library",
"autoload": {
@@ -1639,7 +1643,11 @@
}
],
"description": "sabre/dav plugin to implement rfc5323 SEARCH",
- "time": "2020-02-06T13:56:26+00:00"
+ "support": {
+ "issues": "https://github.com/icewind1991/SearchDAV/issues",
+ "source": "https://github.com/icewind1991/SearchDAV/tree/v3.0.1"
+ },
+ "time": "2022-04-11T13:02:49+00:00"
},
{
"name": "icewind/streams",
diff --git a/composer/autoload_real.php b/composer/autoload_real.php
index 5ed00812..2703bd36 100644
--- a/composer/autoload_real.php
+++ b/composer/autoload_real.php
@@ -33,7 +33,7 @@ class ComposerAutoloaderInit2f23f73bc0cc116b4b1eee1521aa8652
set_include_path(implode(PATH_SEPARATOR, $includePaths));
require __DIR__ . '/autoload_static.php';
- \Composer\Autoload\ComposerStaticInit2f23f73bc0cc116b4b1eee1521aa8652::getInitializer($loader)();
+ call_user_func(\Composer\Autoload\ComposerStaticInit2f23f73bc0cc116b4b1eee1521aa8652::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
diff --git a/composer/installed.json b/composer/installed.json
index a7d07aa9..3c3007f1 100644
--- a/composer/installed.json
+++ b/composer/installed.json
@@ -1663,27 +1663,31 @@
},
{
"name": "icewind/searchdav",
- "version": "v2.0.0",
- "version_normalized": "2.0.0.0",
+ "version": "v3.0.1",
+ "version_normalized": "3.0.1.0",
"source": {
"type": "git",
"url": "https://github.com/icewind1991/SearchDAV.git",
- "reference": "c69806d900c2c9a5954bfabc80178d6eb0d63df4"
+ "reference": "52c8cfc21bd69271f224671c4924d260b0a8d4fb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SearchDAV/zipball/c69806d900c2c9a5954bfabc80178d6eb0d63df4",
- "reference": "c69806d900c2c9a5954bfabc80178d6eb0d63df4",
+ "url": "https://api.github.com/repos/icewind1991/SearchDAV/zipball/52c8cfc21bd69271f224671c4924d260b0a8d4fb",
+ "reference": "52c8cfc21bd69271f224671c4924d260b0a8d4fb",
"shasum": ""
},
"require": {
- "php": ">=7.1",
+ "php": ">=7.3 || >=8.0",
"sabre/dav": "^4.0.0"
},
"require-dev": {
- "phpunit/phpunit": "^8"
+ "friendsofphp/php-cs-fixer": "^2",
+ "php-parallel-lint/php-parallel-lint": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^8",
+ "psalm/phar": "^4.3"
},
- "time": "2020-02-06T13:56:26+00:00",
+ "time": "2022-04-11T13:02:49+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -1702,6 +1706,10 @@
}
],
"description": "sabre/dav plugin to implement rfc5323 SEARCH",
+ "support": {
+ "issues": "https://github.com/icewind1991/SearchDAV/issues",
+ "source": "https://github.com/icewind1991/SearchDAV/tree/v3.0.1"
+ },
"install-path": "../icewind/searchdav"
},
{
diff --git a/composer/installed.php b/composer/installed.php
index d863325e..54a4f046 100644
--- a/composer/installed.php
+++ b/composer/installed.php
@@ -5,7 +5,7 @@
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
- 'reference' => '609d7c54d2b9a6e39e7ec1e19a126fa3011a624a',
+ 'reference' => '94cc96de7a8f34b4da8e165ec7308a0024a1d9d6',
'name' => 'nextcloud/3rdparty',
'dev' => false,
),
@@ -209,12 +209,12 @@
'dev_requirement' => false,
),
'icewind/searchdav' => array(
- 'pretty_version' => 'v2.0.0',
- 'version' => '2.0.0.0',
+ 'pretty_version' => 'v3.0.1',
+ 'version' => '3.0.1.0',
'type' => 'library',
'install_path' => __DIR__ . '/../icewind/searchdav',
'aliases' => array(),
- 'reference' => 'c69806d900c2c9a5954bfabc80178d6eb0d63df4',
+ 'reference' => '52c8cfc21bd69271f224671c4924d260b0a8d4fb',
'dev_requirement' => false,
),
'icewind/streams' => array(
@@ -286,7 +286,7 @@
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
- 'reference' => '609d7c54d2b9a6e39e7ec1e19a126fa3011a624a',
+ 'reference' => '94cc96de7a8f34b4da8e165ec7308a0024a1d9d6',
'dev_requirement' => false,
),
'nextcloud/lognormalizer' => array(
diff --git a/icewind/searchdav/.gitignore b/icewind/searchdav/.gitignore
index 1c769fc2..3ca03c7d 100644
--- a/icewind/searchdav/.gitignore
+++ b/icewind/searchdav/.gitignore
@@ -2,3 +2,4 @@ composer.lock
vendor
coverage.xml
.phpunit.result.cache
+*.cache
diff --git a/icewind/searchdav/psalm.xml b/icewind/searchdav/psalm.xml
new file mode 100644
index 00000000..30258a70
--- /dev/null
+++ b/icewind/searchdav/psalm.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<psalm
+ errorLevel="3"
+ resolveFromConfigFile="true"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="https://getpsalm.org/schema/config"
+ xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
+>
+ <projectFiles>
+ <directory name="src" />
+ <ignoreFiles>
+ <directory name="vendor" />
+ </ignoreFiles>
+ </projectFiles>
+</psalm>
diff --git a/icewind/searchdav/src/Backend/ISearchBackend.php b/icewind/searchdav/src/Backend/ISearchBackend.php
index 21d577b7..277f2840 100644
--- a/icewind/searchdav/src/Backend/ISearchBackend.php
+++ b/icewind/searchdav/src/Backend/ISearchBackend.php
@@ -21,13 +21,14 @@
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 it's SEARCH requests to
+ * The search arbiter is the URI that the client will send its 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.
@@ -37,10 +38,10 @@ interface ISearchBackend {
*
* @return string
*/
- public function getArbiterPath();
+ public function getArbiterPath(): string;
/**
- * Whether or not the search backend supports search requests on this scope
+ * Whether 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.
*
@@ -54,7 +55,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($href, $depth, $path);
+ public function isValidScope(string $href, $depth, ?string $path): bool;
/**
* List the available properties that can be used in search
@@ -68,7 +69,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($href, $path);
+ public function getPropertyDefinitionsForScope(string $href, ?string $path): array;
/**
* Preform the search request
@@ -80,5 +81,14 @@ interface ISearchBackend {
* @param Query $query
* @return SearchResult[]
*/
- public function search(Query $query);
+ 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;
}
diff --git a/icewind/searchdav/src/Backend/SearchPropertyDefinition.php b/icewind/searchdav/src/Backend/SearchPropertyDefinition.php
index daa22bd3..4dca05b9 100644
--- a/icewind/searchdav/src/Backend/SearchPropertyDefinition.php
+++ b/icewind/searchdav/src/Backend/SearchPropertyDefinition.php
@@ -26,6 +26,7 @@ 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';
@@ -48,13 +49,13 @@ class SearchPropertyDefinition {
* SearchProperty constructor.
*
* @param string $name the name and namespace of the property in clark notation
- * @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 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 string $dataType the datatype of the property, one of the SearchProperty::DATATYPE_ constants or any XSD datatype in clark notation
- * @param bool $caseSensitive whether or not comparisons on the property are case sensitive, only applies to string propertries
+ * @param bool $caseSensitive whether comparisons on the property are case-sensitive, only applies to string properties
*/
- public function __construct($name, $searchable, $selectable, $sortable, $dataType = self::DATATYPE_STRING, $caseSensitive = true) {
+ public function __construct(string $name, bool $selectable, bool $searchable, bool $sortable, string $dataType = self::DATATYPE_STRING, bool $caseSensitive = true) {
$this->searchable = $searchable;
$this->selectable = $selectable;
$this->sortable = $sortable;
diff --git a/icewind/searchdav/src/Backend/SearchResult.php b/icewind/searchdav/src/Backend/SearchResult.php
index 43ee3334..af485063 100644
--- a/icewind/searchdav/src/Backend/SearchResult.php
+++ b/icewind/searchdav/src/Backend/SearchResult.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Backend;
-
use Sabre\DAV\INode;
class SearchResult {
@@ -36,7 +35,7 @@ class SearchResult {
* @param INode $node
* @param string $href
*/
- public function __construct(INode $node, $href) {
+ public function __construct(INode $node, string $href) {
$this->node = $node;
$this->href = $href;
}
diff --git a/icewind/searchdav/src/DAV/DiscoverHandler.php b/icewind/searchdav/src/DAV/DiscoverHandler.php
index e5a48a1b..811cfc78 100644
--- a/icewind/searchdav/src/DAV/DiscoverHandler.php
+++ b/icewind/searchdav/src/DAV/DiscoverHandler.php
@@ -54,7 +54,7 @@ class DiscoverHandler {
$this->queryParser = $queryParser;
}
- public function handelDiscoverRequest($xml, RequestInterface $request, ResponseInterface $response) {
+ public function handelDiscoverRequest($xml, RequestInterface $request, ResponseInterface $response): bool {
if (!isset($xml['{DAV:}basicsearch'])) {
$response->setStatus(400);
$response->setBody('Unexpected xml content for query-schema-discovery, expected basicsearch');
@@ -97,12 +97,7 @@ class DiscoverHandler {
foreach ($propertyDefinitions as $propertyDefinition) {
$key = $this->hashDefinition($propertyDefinition);
if (!isset($groups[$key])) {
- $desc = new PropDesc();
- $desc->dataType = $propertyDefinition->dataType;
- $desc->sortable = $propertyDefinition->sortable;
- $desc->selectable = $propertyDefinition->selectable;
- $desc->searchable = $propertyDefinition->searchable;
- $groups[$key] = $desc;
+ $groups[$key] = new PropDesc($propertyDefinition);
}
$groups[$key]->properties[] = $propertyDefinition->name;
}
diff --git a/icewind/searchdav/src/DAV/PathHelper.php b/icewind/searchdav/src/DAV/PathHelper.php
index 2c0faef4..04098c78 100644
--- a/icewind/searchdav/src/DAV/PathHelper.php
+++ b/icewind/searchdav/src/DAV/PathHelper.php
@@ -37,7 +37,7 @@ class PathHelper {
$this->server = $server;
}
- public function getPathFromUri($uri): ?string {
+ public function getPathFromUri(string $uri): ?string {
if (strpos($uri, '://') === false) {
return $uri;
}
diff --git a/icewind/searchdav/src/DAV/QueryParser.php b/icewind/searchdav/src/DAV/QueryParser.php
index 44c594b5..440b6442 100644
--- a/icewind/searchdav/src/DAV/QueryParser.php
+++ b/icewind/searchdav/src/DAV/QueryParser.php
@@ -30,29 +30,31 @@ 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 \Sabre\Xml\Deserializer\keyValue($reader, '{DAV:}scope')['{DAV:}prop'];
+ '{DAV:}basicsearch' => BasicSearch::class,
+ '{DAV:}select' => function (Reader $reader) {
+ return keyValue($reader, '{DAV:}scope')['{DAV:}prop'];
},
'{DAV:}from' => function (Reader $reader) {
- return \Sabre\Xml\Deserializer\repeatingElements($reader, '{DAV:}scope');
+ return repeatingElements($reader, '{DAV:}scope');
},
'{DAV:}orderby' => function (Reader $reader) {
- return \Sabre\Xml\Deserializer\repeatingElements($reader, '{DAV:}order');
+ return repeatingElements($reader, '{DAV:}order');
},
'{DAV:}scope' => Scope::class,
'{DAV:}where' => function (Reader $reader) {
@@ -61,20 +63,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:}limit' => Limit::class,
+ '{DAV:}limit' => Limit::class,
];
}
}
diff --git a/icewind/searchdav/src/DAV/SearchHandler.php b/icewind/searchdav/src/DAV/SearchHandler.php
index 85fe43b8..a1fa5a75 100644
--- a/icewind/searchdav/src/DAV/SearchHandler.php
+++ b/icewind/searchdav/src/DAV/SearchHandler.php
@@ -22,6 +22,7 @@
namespace SearchDAV\DAV;
use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\HTTP\ResponseInterface;
@@ -54,10 +55,10 @@ class SearchHandler {
$this->server = $server;
}
- public function handleSearchRequest($xml, ResponseInterface $response) {
+ public function handleSearchRequest($xml, ResponseInterface $response): bool {
if (!isset($xml['{DAV:}basicsearch'])) {
$response->setStatus(400);
- $response->setBody('Unexpected xml content for searchrequest, expected basicsearch');
+ $response->setBody('Unexpected xml content for search request, expected basicsearch');
return false;
}
/** @var BasicSearch $query */
@@ -84,8 +85,10 @@ 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;
}
@@ -126,7 +129,7 @@ class SearchHandler {
/**
* @param \SearchDAV\XML\Operator $operator
- * @param array $allProps
+ * @param SearchPropertyDefinition[] $allProps
* @return Operator
* @throws BadRequest
*/
@@ -163,16 +166,20 @@ class SearchHandler {
* If a depth of 1 is requested child elements will also be returned.
*
* @param SearchResult[] $results
- * @param array $propertyNames
+ * @param string[] $propertyNames
* @param int $depth
- * @return \Iterator
+ * @return \Iterator<array>
*/
- private function getPropertiesIteratorResults($results, $propertyNames = [], $depth = 0): \Iterator {
+ private function getPropertiesIteratorResults(array $results, array $propertyNames = [], int $depth = 0): \Iterator {
$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, (array)$propertyNames, $depth, $propFindType);
+ $propFind = new PropFind($result->href, $propertyNames, $depth, $propFindType);
$r = $this->server->getPropertiesByNode($propFind, $node);
if ($r) {
$result = $propFind->getResultForMultiStatus();
diff --git a/icewind/searchdav/src/DAV/SearchPlugin.php b/icewind/searchdav/src/DAV/SearchPlugin.php
index 17d44cc8..7c03b5a5 100644
--- a/icewind/searchdav/src/DAV/SearchPlugin.php
+++ b/icewind/searchdav/src/DAV/SearchPlugin.php
@@ -34,9 +34,6 @@ 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;
@@ -57,8 +54,7 @@ class SearchPlugin extends ServerPlugin {
$this->queryParser = new QueryParser();
}
- public function initialize(Server $server) {
- $this->server = $server;
+ public function initialize(Server $server): void {
$this->pathHelper = new PathHelper($server);
$this->search = new SearchHandler($this->searchBackend, $this->pathHelper, $server);
$this->discover = new DiscoverHandler($this->searchBackend, $this->pathHelper, $this->queryParser);
@@ -67,7 +63,7 @@ class SearchPlugin extends ServerPlugin {
$server->on('propFind', [$this, 'propFindHandler']);
}
- public function propFindHandler(PropFind $propFind, INode $node) {
+ public function propFindHandler(PropFind $propFind, INode $node): void {
if ($propFind->getPath() === $this->searchBackend->getArbiterPath()) {
$propFind->handle('{DAV:}supported-query-grammar-set', new SupportedQueryGrammar());
}
@@ -76,11 +72,11 @@ class SearchPlugin extends ServerPlugin {
/**
* SEARCH is allowed for users files
*
- * @param string $uri
- * @return array
+ * @param string $path
+ * @return string[]
*/
- public function getHTTPMethods($uri) {
- $path = $this->pathHelper->getPathFromUri($uri);
+ public function getHTTPMethods($path): array {
+ $path = $this->pathHelper->getPathFromUri($path);
if ($this->searchBackend->getArbiterPath() === $path) {
return ['SEARCH'];
} else {
@@ -88,16 +84,16 @@ class SearchPlugin extends ServerPlugin {
}
}
- public function optionHandler(RequestInterface $request, ResponseInterface $response) {
+ public function optionHandler(RequestInterface $request, ResponseInterface $response): void {
if ($request->getPath() === $this->searchBackend->getArbiterPath()) {
$response->addHeader('DASL', '<DAV:basicsearch>');
}
}
- public function searchHandler(RequestInterface $request, ResponseInterface $response) {
- $contentType = $request->getHeader('Content-Type');
+ public function searchHandler(RequestInterface $request, ResponseInterface $response): bool {
+ $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;
}
diff --git a/icewind/searchdav/src/Query/Limit.php b/icewind/searchdav/src/Query/Limit.php
index e6b4867e..f59550f3 100644
--- a/icewind/searchdav/src/Query/Limit.php
+++ b/icewind/searchdav/src/Query/Limit.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Query;
-
class Limit {
/**
* @var integer
diff --git a/icewind/searchdav/src/Query/Literal.php b/icewind/searchdav/src/Query/Literal.php
index 862a4124..99ce07a7 100644
--- a/icewind/searchdav/src/Query/Literal.php
+++ b/icewind/searchdav/src/Query/Literal.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Query;
-
class Literal {
/**
* @var string|boolean|\DateTime|integer
diff --git a/icewind/searchdav/src/Query/Operator.php b/icewind/searchdav/src/Query/Operator.php
index 198d1fbf..182f264c 100644
--- a/icewind/searchdav/src/Query/Operator.php
+++ b/icewind/searchdav/src/Query/Operator.php
@@ -41,14 +41,15 @@ class Operator {
* The type of operation, one of the Operator::OPERATION_* constants
*/
public $type;
+
/**
- * @var (Literal|SearchPropDefinition|Operation)[]
+ * @var (Literal|\SearchDAV\Backend\SearchPropertyDefinition|Operator)[]
*
* The list of arguments for the operation
*
* - SearchPropDefinition: property for comparison
* - Literal: literal value for comparison
- * - Operation: nested operation for and/or/not operations
+ * - Operator: nested operation for and/or/not operations
*
* Which type and what number of argument an Operator takes depends on the operator type.
*/
@@ -58,7 +59,7 @@ class Operator {
* Operator constructor.
*
* @param string $type
- * @param array $arguments
+ * @param (Literal|\SearchDAV\Backend\SearchPropertyDefinition|Operator)[] $arguments
*/
public function __construct(string $type = '', array $arguments = []) {
$this->type = $type;
diff --git a/icewind/searchdav/src/Query/Order.php b/icewind/searchdav/src/Query/Order.php
index c6afceee..20f69f6a 100644
--- a/icewind/searchdav/src/Query/Order.php
+++ b/icewind/searchdav/src/Query/Order.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Query;
-
use SearchDAV\Backend\SearchPropertyDefinition;
class Order {
diff --git a/icewind/searchdav/src/Query/Query.php b/icewind/searchdav/src/Query/Query.php
index 613c3698..82f237ce 100644
--- a/icewind/searchdav/src/Query/Query.php
+++ b/icewind/searchdav/src/Query/Query.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Query;
-
use SearchDAV\Backend\SearchPropertyDefinition;
class Query {
@@ -38,7 +37,7 @@ class Query {
*/
public $from;
/**
- * @var Operator
+ * @var ?Operator
*
* The search operator, either a comparison ('gt', 'eq', ...) or a boolean operator ('and', 'or', 'not')
*/
@@ -49,7 +48,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 then one order operations are specified, the comparisons for ordering should
+ * If more than 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.
*/
diff --git a/icewind/searchdav/src/Query/Scope.php b/icewind/searchdav/src/Query/Scope.php
index 9c342c85..faded1c3 100644
--- a/icewind/searchdav/src/Query/Scope.php
+++ b/icewind/searchdav/src/Query/Scope.php
@@ -21,7 +21,6 @@
namespace SearchDAV\Query;
-
class Scope {
/**
* @var string
diff --git a/icewind/searchdav/src/XML/BasicSearch.php b/icewind/searchdav/src/XML/BasicSearch.php
index 269edb02..c5451caf 100644
--- a/icewind/searchdav/src/XML/BasicSearch.php
+++ b/icewind/searchdav/src/XML/BasicSearch.php
@@ -24,6 +24,7 @@ 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
@@ -42,7 +43,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')
*/
@@ -65,26 +66,33 @@ 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
*/
- static function xmlDeserialize(Reader $reader): BasicSearch {
- $search = new self();
-
- $elements = \Sabre\Xml\Deserializer\keyValue($reader);
+ public static function xmlDeserialize(Reader $reader): BasicSearch {
+ $elements = keyValue($reader);
if (!isset($elements['{DAV:}from'])) {
throw new ParseException('Missing {DAV:}from when parsing {DAV:}basicsearch');
}
- $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;
+ return new BasicSearch(
+ $elements['{DAV:}select'] ?? [],
+ $elements['{DAV:}from'],
+ $elements['{DAV:}where'] ?? null,
+ $elements['{DAV:}orderby'] ?? [],
+ $elements['{DAV:}limit'] ?? new Limit()
+ );
}
}
diff --git a/icewind/searchdav/src/XML/BasicSearchSchema.php b/icewind/searchdav/src/XML/BasicSearchSchema.php
index edda3729..c68aabe7 100644
--- a/icewind/searchdav/src/XML/BasicSearchSchema.php
+++ b/icewind/searchdav/src/XML/BasicSearchSchema.php
@@ -21,7 +21,6 @@
namespace SearchDAV\XML;
-
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
@@ -38,10 +37,10 @@ class BasicSearchSchema implements XmlSerializable {
$this->properties = $properties;
}
- function xmlSerialize(Writer $writer) {
- $childs = array_map(function(PropDesc $propDesc) {
+ public function xmlSerialize(Writer $writer): void {
+ $childs = array_map(function (PropDesc $propDesc) {
return [
- 'name' => '{DAV:}propdesc',
+ 'name' => '{DAV:}propdesc',
'value' => $propDesc
];
}, $this->properties);
diff --git a/icewind/searchdav/src/XML/Limit.php b/icewind/searchdav/src/XML/Limit.php
index 26d7866d..b00809fc 100644
--- a/icewind/searchdav/src/XML/Limit.php
+++ b/icewind/searchdav/src/XML/Limit.php
@@ -24,15 +24,16 @@ 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 {
- static function xmlDeserialize(Reader $reader): Limit {
+ public static function xmlDeserialize(Reader $reader): Limit {
$limit = new self();
- $elements = \Sabre\Xml\Deserializer\keyValue($reader);
+ $elements = keyValue($reader);
$namespace = SearchPlugin::SEARCHDAV_NS;
$limit->maxResults = isset($elements['{DAV:}nresults']) ? $elements['{DAV:}nresults'] : 0;
diff --git a/icewind/searchdav/src/XML/Literal.php b/icewind/searchdav/src/XML/Literal.php
index 92c76ca5..dc1f69d1 100644
--- a/icewind/searchdav/src/XML/Literal.php
+++ b/icewind/searchdav/src/XML/Literal.php
@@ -21,12 +21,11 @@
namespace SearchDAV\XML;
-
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
class Literal extends \SearchDAV\Query\Literal implements XmlDeserializable {
- static function xmlDeserialize(Reader $reader): Literal {
+ public static function xmlDeserialize(Reader $reader): Literal {
$literal = new self();
if ($reader->isEmptyElement) {
diff --git a/icewind/searchdav/src/XML/Operator.php b/icewind/searchdav/src/XML/Operator.php
index 36721c33..fb44ba86 100644
--- a/icewind/searchdav/src/XML/Operator.php
+++ b/icewind/searchdav/src/XML/Operator.php
@@ -33,7 +33,7 @@ class Operator implements XmlDeserializable {
*/
public $type;
/**
- * @var (Literal|string|Operation)[]
+ * @var (Literal|string|Operator)[]
*
* The list of arguments for the operation
*
@@ -49,17 +49,17 @@ class Operator implements XmlDeserializable {
* Operator constructor.
*
* @param string $type
- * @param array $arguments
+ * @param (Literal|string|Operator)[] $arguments
*/
public function __construct(string $type = '', array $arguments = []) {
$this->type = $type;
$this->arguments = $arguments;
}
- static function xmlDeserialize(Reader $reader): Operator {
+ public static function xmlDeserialize(Reader $reader): Operator {
$operator = new self();
- $operator->type = $reader->getClark();
+ $operator->type = $reader->getClark() ?? '';
if ($reader->isEmptyElement) {
$reader->next();
return $operator;
diff --git a/icewind/searchdav/src/XML/Order.php b/icewind/searchdav/src/XML/Order.php
index 7aae1620..74eab7eb 100644
--- a/icewind/searchdav/src/XML/Order.php
+++ b/icewind/searchdav/src/XML/Order.php
@@ -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 {
/**
@@ -50,10 +50,10 @@ class Order implements XmlDeserializable {
$this->order = $order;
}
- static function xmlDeserialize(Reader $reader): Order {
+ public static function xmlDeserialize(Reader $reader): Order {
$order = new self();
- $childs = \Sabre\Xml\Deserializer\keyValue($reader);
+ $childs = 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/icewind/searchdav/src/XML/PropDesc.php b/icewind/searchdav/src/XML/PropDesc.php
index ab503b3f..43ada6a4 100644
--- a/icewind/searchdav/src/XML/PropDesc.php
+++ b/icewind/searchdav/src/XML/PropDesc.php
@@ -21,9 +21,9 @@
namespace SearchDAV\XML;
-
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
+use SearchDAV\Backend\SearchPropertyDefinition;
class PropDesc implements XmlSerializable {
/**
@@ -47,7 +47,14 @@ class PropDesc implements XmlSerializable {
*/
public $sortable;
- function xmlSerialize(Writer $writer) {
+ 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 {
$data = [
'{DAV:}dataType' => [$this->dataType => null]
];
@@ -62,7 +69,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/icewind/searchdav/src/XML/QueryDiscoverResponse.php b/icewind/searchdav/src/XML/QueryDiscoverResponse.php
index 802fdcda..c50dea98 100644
--- a/icewind/searchdav/src/XML/QueryDiscoverResponse.php
+++ b/icewind/searchdav/src/XML/QueryDiscoverResponse.php
@@ -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,21 +38,23 @@ class QueryDiscoverResponse extends Response {
* @param BasicSearchSchema|null $schema
* @param null|int|string $httpStatus
*/
- function __construct($href, BasicSearchSchema $schema = null, $httpStatus = null) {
+ public function __construct($href, BasicSearchSchema $schema = null, $httpStatus = null) {
+ if ($httpStatus !== null) {
+ $httpStatus = (string)$httpStatus;
+ }
parent::__construct($href, [], $httpStatus);
$this->schema = $schema;
-
}
- function xmlSerialize(Writer $writer) {
+ public function xmlSerialize(Writer $writer): void {
if ($status = $this->getHTTPStatus()) {
$writer->writeElement('{DAV:}status', 'HTTP/1.1 ' . $status . ' ' . \Sabre\HTTP\Response::$statusCodes[$status]);
}
- $writer->writeElement('{DAV:}href', \Sabre\HTTP\encodePath($this->getHref()));
+ $writer->writeElement('{DAV:}href', encodePath($this->getHref()));
if ($this->schema) {
$writer->writeElement('{DAV:}query-schema', [
- '{DAV:}basicsearchschema' => $this->schema
+ '{DAV:}basicsearchschema' => $this->schema
]);
}
}
diff --git a/icewind/searchdav/src/XML/Scope.php b/icewind/searchdav/src/XML/Scope.php
index 78d4ba4e..90a2384d 100644
--- a/icewind/searchdav/src/XML/Scope.php
+++ b/icewind/searchdav/src/XML/Scope.php
@@ -23,12 +23,13 @@ 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 {
- static function xmlDeserialize(Reader $reader): Scope {
+ public static function xmlDeserialize(Reader $reader): Scope {
$scope = new self();
- $values = \Sabre\Xml\Deserializer\keyValue($reader);
+ $values = keyValue($reader);
$scope->href = $values['{DAV:}href'];
$scope->depth = $values['{DAV:}depth'];
diff --git a/icewind/searchdav/src/XML/SupportedQueryGrammar.php b/icewind/searchdav/src/XML/SupportedQueryGrammar.php
index ddb4e33e..a24e7b1f 100644
--- a/icewind/searchdav/src/XML/SupportedQueryGrammar.php
+++ b/icewind/searchdav/src/XML/SupportedQueryGrammar.php
@@ -21,19 +21,16 @@
namespace SearchDAV\XML;
-
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
class SupportedQueryGrammar implements XmlSerializable {
- const GRAMMAR_BASICSEARCH = '{DAV:}basicsearch';
-
- public $grammar = self::GRAMMAR_BASICSEARCH;
+ const GRAMMAR_BASIC_SEARCH = '{DAV:}basicsearch';
- function xmlSerialize(Writer $writer) {
+ public function xmlSerialize(Writer $writer): void {
$writer->startElement('{DAV:}supported-query-grammar');
$writer->startElement('{DAV:}grammar');
- $writer->startElement($this->grammar);
+ $writer->startElement(self::GRAMMAR_BASIC_SEARCH);
$writer->endElement();
$writer->endElement();
$writer->endElement();