From d1cbca15fce9e2dc72ac5b84900a219bd35539a3 Mon Sep 17 00:00:00 2001 From: Dominik Meyer Date: Tue, 6 Oct 2020 21:06:44 +0200 Subject: [PATCH 1/4] =?UTF-8?q?Improve=20user=20sharee:=20searching=20for?= =?UTF-8?q?=20Bj=20Schi=20should=20bring=20up=20Bj=C3=B6rn=20Schi=20as=20w?= =?UTF-8?q?ell?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit keep whitespace for more excat search. Signed-off-by: Dominik Meyer --- lib/private/User/Database.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index 2353aeeb26e4c..d29bfea19d668 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -265,6 +265,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $query = $this->dbConn->getQueryBuilder(); + $nameSearch = '%' . str_replace(' ', '% ', $this->dbConn->escapeLikeParameter($search)) . '%'; $query->select('uid', 'displayname') ->from($this->table, 'u') ->leftJoin('u', 'preferences', 'p', $query->expr()->andX( @@ -273,8 +274,8 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $query->expr()->eq('configkey', $query->expr()->literal('email'))) ) // sqlite doesn't like re-using a single named parameter here - ->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) - ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) + ->where($query->expr()->iLike('uid', $query->createPositionalParameter($nameSearch))) + ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter($nameSearch))) ->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) ->orderBy($query->func()->lower('displayname'), 'ASC') ->orderBy('uid_lower', 'ASC') From bf5da7fdc4a7305f890d3aa07ff1c38c0eaf69c2 Mon Sep 17 00:00:00 2001 From: kinimodmeyer Date: Wed, 7 Oct 2020 21:06:20 +0200 Subject: [PATCH 2/4] adding federation share suggestion Signed-off-by: Dominik Meyer --- lib/private/User/Database.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index d29bfea19d668..0cfa6fcc41b18 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -265,7 +265,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $query = $this->dbConn->getQueryBuilder(); - $nameSearch = '%' . str_replace(' ', '% ', $this->dbConn->escapeLikeParameter($search)) . '%'; + $displayNameParameter = '%' . str_replace(' ', '% ', $this->dbConn->escapeLikeParameter($search)) . '%'; $query->select('uid', 'displayname') ->from($this->table, 'u') ->leftJoin('u', 'preferences', 'p', $query->expr()->andX( @@ -274,10 +274,21 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $query->expr()->eq('configkey', $query->expr()->literal('email'))) ) // sqlite doesn't like re-using a single named parameter here - ->where($query->expr()->iLike('uid', $query->createPositionalParameter($nameSearch))) - ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter($nameSearch))) - ->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) - ->orderBy($query->func()->lower('displayname'), 'ASC') + ->where($query->expr()->iLike('uid', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))) + ->orWhere($query->expr()->iLike('displayname', $query->createPositionalParameter($displayNameParameter))) + ->orWhere($query->expr()->iLike('configvalue', $query->createPositionalParameter('%' . $this->dbConn->escapeLikeParameter($search) . '%'))); + + $serverAbsolutePath = \OC::$server->getURLGenerator()->getAbsoluteURL('/'); + $serverFederationPath = rtrim(\OC\Share\Share::removeProtocolFromUrl($serverAbsolutePath), '/'); + + /* + * the given search looks like a local federation. + */ + if (mb_strpos($search, '@'.$serverFederationPath) !== false) { + $query->orWhere($query->expr()->eq('uid', $query->createPositionalParameter(explode('@', $search)[0]))); + } + + $query->orderBy($query->func()->lower('displayname'), 'ASC') ->orderBy('uid_lower', 'ASC') ->setMaxResults($limit) ->setFirstResult($offset); From 561b5f4bc8ced9e1768ced64249149d3fc755c91 Mon Sep 17 00:00:00 2001 From: Dominik Meyer Date: Wed, 7 Oct 2020 23:10:36 +0200 Subject: [PATCH 3/4] adding unit test for cloudid and wildcard name Signed-off-by: Dominik Meyer --- tests/lib/User/DatabaseTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/lib/User/DatabaseTest.php b/tests/lib/User/DatabaseTest.php index 6eb4466c69d35..81583acedfd2e 100644 --- a/tests/lib/User/DatabaseTest.php +++ b/tests/lib/User/DatabaseTest.php @@ -140,6 +140,12 @@ public function testSearch() { $result = $this->backend->getDisplayNames('display'); $this->assertCount(1, $result); + $result = $this->backend->getDisplayNames('Use Dis'); + $this->assertCount(1, $result); + + $result = $this->backend->getDisplayNames($user1Obj->getCloudId()); + $this->assertCount(1, $result); + $result = $this->backend->getDisplayNames(strtoupper($user1)); $this->assertCount(1, $result); From e64dafe225e73dcce0b5c7f40236b724b60c2540 Mon Sep 17 00:00:00 2001 From: Dominik Meyer Date: Tue, 13 Oct 2020 14:06:10 +0200 Subject: [PATCH 4/4] use multiple escapeLikeParameter for displayNameParameter. Signed-off-by: Dominik Meyer --- lib/private/User/Database.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index 0cfa6fcc41b18..0b062224eaa81 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -265,7 +265,7 @@ public function getDisplayNames($search = '', $limit = null, $offset = null) { $query = $this->dbConn->getQueryBuilder(); - $displayNameParameter = '%' . str_replace(' ', '% ', $this->dbConn->escapeLikeParameter($search)) . '%'; + $displayNameParameter = '%' . implode('% %', array_map([$this->dbConn, 'escapeLikeParameter'], explode(' ', $search))) . '%'; $query->select('uid', 'displayname') ->from($this->table, 'u') ->leftJoin('u', 'preferences', 'p', $query->expr()->andX(