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

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorArthur Schiwon <blizzz@arthur-schiwon.de>2021-04-13 23:49:42 +0300
committerArthur Schiwon <blizzz@arthur-schiwon.de>2021-04-20 15:02:35 +0300
commitf8d1ee5cfac5405713cc3fdc194cb98d748ec79f (patch)
tree7f9dae5802e63f4c073bc7ac6ad758efa7fd197d /lib
parent9d1e2c50823fc2a2a1763e1153c0c18bce8fbddd (diff)
ignore mail shares of related remote share results
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Collaboration/Collaborators/Search.php36
-rw-r--r--lib/private/Collaboration/Collaborators/SearchResult.php20
-rw-r--r--lib/public/Collaboration/Collaborators/ISearchResult.php8
3 files changed, 62 insertions, 2 deletions
diff --git a/lib/private/Collaboration/Collaborators/Search.php b/lib/private/Collaboration/Collaborators/Search.php
index 79dfd5e1d82..87463572944 100644
--- a/lib/private/Collaboration/Collaborators/Search.php
+++ b/lib/private/Collaboration/Collaborators/Search.php
@@ -81,8 +81,8 @@ class Search implements ISearch {
// sanitizing, could go into the plugins as well
- // if we have a exact match, either for the federated cloud id or for the
- // email address we only return the exact match. It is highly unlikely
+ // if we have an exact match, either for the federated cloud id or for the
+ // email address, we only return the exact match. It is highly unlikely
// that the exact same email address and federated cloud id exists
$emailType = new SearchResultType('emails');
$remoteType = new SearchResultType('remotes');
@@ -92,6 +92,8 @@ class Search implements ISearch {
$searchResult->unsetResult($emailType);
}
+ $this->dropMailSharesWhereRemoteShareIsPossible($searchResult);
+
// if we have an exact local user match with an email-a-like query,
// there is no need to show the remote and email matches.
$userType = new SearchResultType('users');
@@ -110,4 +112,34 @@ class Search implements ISearch {
}
$this->pluginList[$shareType][] = $pluginInfo['class'];
}
+
+ protected function dropMailSharesWhereRemoteShareIsPossible(ISearchResult $searchResult): void {
+ $allResults = $searchResult->asArray();
+
+ $emailType = new SearchResultType('emails');
+ $remoteType = new SearchResultType('remotes');
+
+ if (!isset($allResults[$remoteType->getLabel()])
+ || !isset($allResults[$emailType->getLabel()])) {
+ return;
+ }
+
+ $mailIdMap = [];
+ foreach ($allResults[$emailType->getLabel()] as $mailRow) {
+ // sure, array_reduce looks nicer, but foreach needs less resources and is faster
+ if (!isset($mailRow['uuid'])) {
+ continue;
+ }
+ $mailIdMap[$mailRow['uuid']] = $mailRow['value']['shareWith'];
+ }
+
+ foreach ($allResults[$remoteType->getLabel()] as $resultRow) {
+ if (!isset($resultRow['uuid'])) {
+ continue;
+ }
+ if (isset($mailIdMap[$resultRow['uuid']])) {
+ $searchResult->removeCollaboratorResult($emailType, $mailIdMap[$resultRow['uuid']]);
+ }
+ }
+ }
}
diff --git a/lib/private/Collaboration/Collaborators/SearchResult.php b/lib/private/Collaboration/Collaborators/SearchResult.php
index 8e2c5a1ff39..e9511f869fa 100644
--- a/lib/private/Collaboration/Collaborators/SearchResult.php
+++ b/lib/private/Collaboration/Collaborators/SearchResult.php
@@ -85,4 +85,24 @@ class SearchResult implements ISearchResult {
$this->result['exact'][$type] = [];
}
}
+
+ public function removeCollaboratorResult(SearchResultType $type, string $collaboratorId): bool {
+ $type = $type->getLabel();
+ if (!isset($this->result[$type])) {
+ return false;
+ }
+
+ $actionDone = false;
+ $resultArrays = [&$this->result['exact'][$type], &$this->result[$type]];
+ foreach ($resultArrays as &$resultArray) {
+ foreach ($resultArray as $k => $result) {
+ if ($result['value']['shareWith'] === $collaboratorId) {
+ unset($resultArray[$k]);
+ $actionDone = true;
+ }
+ }
+ }
+
+ return $actionDone;
+ }
}
diff --git a/lib/public/Collaboration/Collaborators/ISearchResult.php b/lib/public/Collaboration/Collaborators/ISearchResult.php
index d0d61ccfb28..a559892bb47 100644
--- a/lib/public/Collaboration/Collaborators/ISearchResult.php
+++ b/lib/public/Collaboration/Collaborators/ISearchResult.php
@@ -46,6 +46,14 @@ interface ISearchResult {
public function hasResult(SearchResultType $type, $collaboratorId);
/**
+ * Removes all result where $collaborationId exactly matches shareWith of
+ * any of wide and exact result matches of the given type.
+ *
+ * @since 22.0.0
+ */
+ public function removeCollaboratorResult(SearchResultType $type, string $collaboratorId): bool;
+
+ /**
* @param SearchResultType $type
* @since 13.0.0
*/