Skip to content

Commit 5a08b83

Browse files
committed
feat(UserPlugin): Also full match on additional email addresses
Signed-off-by: provokateurin <kate@provokateurin.de>
1 parent ff937ae commit 5a08b83

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

build/integration/sharees_features/sharees_user.feature

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,3 +475,23 @@ Feature: sharees_user
475475
And "exact users" sharees returned are
476476
| Test One | 0 | test1 | test@example.com |
477477
And "users" sharees returned is empty
478+
479+
Scenario: Search for exact additional email returns exact user
480+
Given user "test1" with displayname "Test One" exists
481+
And As an "admin"
482+
And sending "PUT" to "/cloud/users/test1" with
483+
| key | email |
484+
| value | test@example.com |
485+
And sending "PUT" to "/cloud/users/test1" with
486+
| key | additional_mail |
487+
| value | test@example.org |
488+
And user "user1" exists
489+
And As an "user1"
490+
When getting sharees for
491+
| search | test@example.org |
492+
| itemType | file |
493+
Then the OCS status code should be "100"
494+
And the HTTP status code should be "200"
495+
And "exact users" sharees returned are
496+
| Test One (test@example.org) | 0 | test1 | test@example.org |
497+
And "users" sharees returned is empty

lib/private/Collaboration/Collaborators/UserPlugin.php

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use OCP\Collaboration\Collaborators\ISearchPlugin;
1111
use OCP\Collaboration\Collaborators\ISearchResult;
1212
use OCP\Collaboration\Collaborators\SearchResultType;
13+
use OCP\DB\QueryBuilder\IQueryBuilder;
1314
use OCP\IAppConfig;
1415
use OCP\IDBConnection;
1516
use OCP\IGroupManager;
@@ -106,14 +107,16 @@ public function search($search, $limit, $offset, ISearchResult $searchResult): b
106107
if ($shareeEnumerationFullMatchEmail) {
107108
$qb = $this->connection->getQueryBuilder();
108109
$qb
109-
->selectDistinct('uid')
110+
->select('uid', 'value', 'name')
110111
->from('accounts_data')
111112
->where($qb->expr()->eq($qb->func()->lower('value'), $qb->createNamedParameter($lowerSearch)))
112-
->andWhere($qb->expr()->eq('name', $qb->createNamedParameter('email')));
113+
->andWhere($qb->expr()->in('name', $qb->createNamedParameter(['email', 'additional_mail'], IQueryBuilder::PARAM_STR_ARRAY)));
113114
$result = $qb->executeQuery();
114-
while ($uid = $result->fetchOne()) {
115-
/** @var string $uid */
116-
$users[$uid] = ['exact', $this->userManager->get($uid)];
115+
while ($row = $result->fetch()) {
116+
$uid = $row['uid'];
117+
$email = $row['value'];
118+
$isAdditional = $row['name'] === 'additional_mail';
119+
$users[$uid] = ['exact', $this->userManager->get($uid), $isAdditional ? $email : null];
117120
}
118121
$result->closeCursor();
119122
}
@@ -144,17 +147,25 @@ public function search($search, $limit, $offset, ISearchResult $searchResult): b
144147

145148
$result = ['wide' => [], 'exact' => []];
146149
foreach ($users as $match) {
147-
[$type, $user] = $match;
150+
$match[2] ??= null;
151+
[$type, $user, $uniqueDisplayName] = $match;
152+
153+
$displayName = $user->getDisplayName();
154+
if ($uniqueDisplayName !== null) {
155+
$displayName .= ' (' . $uniqueDisplayName . ')';
156+
}
157+
148158
$status = $userStatuses[$user->getUID()] ?? [];
159+
149160
$result[$type][] = [
150-
'label' => $user->getDisplayName(),
161+
'label' => $displayName,
151162
'subline' => $status['message'] ?? '',
152163
'icon' => 'icon-user',
153164
'value' => [
154165
'shareType' => IShare::TYPE_USER,
155166
'shareWith' => $user->getUID(),
156167
],
157-
'shareWithDisplayNameUnique' => $user->getSystemEMailAddress() ?: $user->getUID(),
168+
'shareWithDisplayNameUnique' => $uniqueDisplayName ?? $user->getSystemEMailAddress() ?: $user->getUID(),
158169
'status' => $status,
159170
];
160171
}

0 commit comments

Comments
 (0)