]> 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)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Mon, 13 Dec 2021 14:26:21 +0000 (14:26 +0000)
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 e270b579e1fa7f2d4925917c915d9430c7a3bed1..6d95b0bc420edad733fa532708644acbc55512cc 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 d5c36096956dd27c76fc415c55bbb1b98b1ad5a2..634870dbaa1e1aefd47a5afa3ee7997fb6654afa 100644 (file)
@@ -1004,6 +1004,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 {
@@ -1042,6 +1043,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();
 
@@ -1083,7 +1085,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 240e16374d54c01657cb66f93d46cf8221d7b737..2f79a7977af2c44fe37ee2e8c3c1438b6ae2c4a1 100644 (file)
@@ -102,7 +102,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 4cdc3d48fffd1c041539c93b13919b5c37e88523..88256bcd88e89bf85ade5f02457d455d0b5ab3a4 100644 (file)
@@ -43,6 +43,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 eba3d604ca3b210ce53cec5b796b22b7d4e77eb4..86b98b706d2e02dc07f347505b74d772c547ddca 100644 (file)
@@ -99,6 +99,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 66723b4b2ed2ae3fc4f145febc991f55c46f352c..c2f06a49de4038c619f5f979ba379b534dd78df8 100644 (file)
@@ -73,6 +73,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:
                 *  [