]> source.dussan.org Git - nextcloud-server.git/commitdiff
Only wildcard search if enumeration is allowed
authorJoas Schilling <coding@schilljs.com>
Wed, 8 Dec 2021 15:40:39 +0000 (16:40 +0100)
committerJoas Schilling <coding@schilljs.com>
Mon, 13 Dec 2021 12:48:41 +0000 (13:48 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
apps/dav/lib/CardDAV/AddressBookImpl.php
apps/dav/lib/CardDAV/CardDavBackend.php
lib/private/Collaboration/Collaborators/MailPlugin.php
lib/private/ContactsManager.php
lib/public/Contacts/IManager.php
lib/public/IAddressBook.php

index 8b0d494fd016712034cfae8a527d3941e650f559..1b74f329f1fa9a4515ea94528078a2ccafb19f1c 100644 (file)
@@ -107,6 +107,7 @@ class AddressBookImpl implements IAddressBook {
         *      - 'escape_like_param' - If set to false wildcards _ and % are not escaped
         *      - 'limit' - Set a numeric limit for the search results
         *      - 'offset' - Set the offset for the limited search results
+        *      - 'wildcard' - Whether the search should use wildcards
         * @return array an array of contacts which are arrays of key-value-pairs
         *  example result:
         *  [
index 13926ef12ce38d0d5ec9b66048ae7fa0110d0e2b..403c4646e4784f788bff3223d390e9996159f2f5 100644 (file)
@@ -1024,6 +1024,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
         *    - 'escape_like_param' - If set to false wildcards _ and % are not escaped, otherwise they are
         *    - 'limit' - Set a numeric limit for the search results
         *    - 'offset' - Set the offset for the limited search results
+        *    - 'wildcard' - Whether the search should use wildcards
         * @return array an array of contacts which are arrays of key-value-pairs
         */
        public function search($addressBookId, $pattern, $searchProperties, $options = []): array {
@@ -1062,6 +1063,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
                                                                                        array $searchProperties,
                                                                                        array $options = []): array {
                $escapePattern = !\array_key_exists('escape_like_param', $options) || $options['escape_like_param'] !== false;
+               $useWildcards = !\array_key_exists('wildcard', $options) || $options['wildcard'] !== false;
 
                $query2 = $this->db->getQueryBuilder();
 
@@ -1103,7 +1105,9 @@ class CardDavBackend implements BackendInterface, SyncSupport {
 
                // No need for like when the pattern is empty
                if ('' !== $pattern) {
-                       if (!$escapePattern) {
+                       if (!$useWildcards) {
+                               $query2->andWhere($query2->expr()->eq('cp.value', $query2->createNamedParameter($pattern)));
+                       } elseif (!$escapePattern) {
                                $query2->andWhere($query2->expr()->ilike('cp.value', $query2->createNamedParameter($pattern)));
                        } else {
                                $query2->andWhere($query2->expr()->ilike('cp.value', $query2->createNamedParameter('%' . $this->db->escapeLikeParameter($pattern) . '%')));
index 7245501a8bf7d974fa2767e20234f529487abdfe..59861247ced6d8676db30c6ddfac247fcb982a94 100644 (file)
@@ -101,7 +101,15 @@ class MailPlugin implements ISearchPlugin {
                $emailType = new SearchResultType('emails');
 
                // Search in contacts
-               $addressBookContacts = $this->contactsManager->search($search, ['EMAIL', 'FN'], ['limit' => $limit, 'offset' => $offset]);
+               $addressBookContacts = $this->contactsManager->search(
+                       $search,
+                       ['EMAIL', 'FN'],
+                       [
+                               'limit' => $limit,
+                               'offset' => $offset,
+                               'wildcard' => $this->shareeEnumeration,
+                       ]
+               );
                $lowerSearch = strtolower($search);
                foreach ($addressBookContacts as $contact) {
                        if (isset($contact['EMAIL'])) {
index e702a4391538f16c1a0ea3da0813850142a28df5..7bdb8293857e6757e003dae7ea97d7a1302e4aa7 100644 (file)
@@ -42,6 +42,7 @@ class ContactsManager implements IManager {
         *      - 'escape_like_param' - If set to false wildcards _ and % are not escaped
         *      - 'limit' - Set a numeric limit for the search results
         *      - 'offset' - Set the offset for the limited search results
+        *      - 'wildcard' - Whether the search should use wildcards
         * @return array an array of contacts which are arrays of key-value-pairs
         */
        public function search($pattern, $searchProperties = [], $options = []) {
index 8d24249e997064aa584179c12cdbe07b23d3b53d..6bf569e9bbd4dc40430e827a579df197697f6aac 100644 (file)
@@ -93,6 +93,7 @@ interface IManager {
         *      - 'escape_like_param' - If set to false wildcards _ and % are not escaped
         *      - 'limit' - Set a numeric limit for the search results
         *      - 'offset' - Set the offset for the limited search results
+        *      - 'wildcard' - Whether the search should use wildcards
         * @return array an array of contacts which are arrays of key-value-pairs
         * @since 6.0.0
         */
index b0196764be34fb59d96d300efc13b569992dd628..738745376d3e1ebcea948fb412e457c80fa2095f 100644 (file)
@@ -67,6 +67,7 @@ namespace OCP {
                 *      - 'escape_like_param' - If set to false wildcards _ and % are not escaped
                 *      - 'limit' - Set a numeric limit for the search results
                 *      - 'offset' - Set the offset for the limited search results
+                *      - 'wildcard' - Whether the search should use wildcards
                 * @return array an array of contacts which are arrays of key-value-pairs
                 *  example result:
                 *  [