]> source.dussan.org Git - nextcloud-server.git/commitdiff
if we have a exact match, either for the federated cloud id or for the
authorBjoern Schiessle <bjoern@schiessle.org>
Tue, 25 Oct 2016 15:13:10 +0000 (17:13 +0200)
committerBjoern Schiessle <bjoern@schiessle.org>
Tue, 1 Nov 2016 18:54:40 +0000 (19:54 +0100)
email address we only return the exact match. It is highly unlikely
that the exact same email address and federated cloud id exists

Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
apps/files_sharing/lib/Controller/ShareesAPIController.php

index 1e5bca468214fc2a2fbaf46dac2fdcff05cdd851..06878f04c35fa2c6a33303192f02ffdd017a7c3b 100644 (file)
@@ -273,15 +273,15 @@ class ShareesAPIController extends OCSController {
 
        /**
         * @param string $search
-        * @return bool (true if a exact match was found, false otherwise)
+        * @return array
         */
        protected function getRemote($search) {
-               $this->result['remotes'] = [];
+               $result = ['results' => [], 'exact' => []];
 
                // Search in contacts
                //@todo Pagination missing
                $addressBookContacts = $this->contactsManager->search($search, ['CLOUD', 'FN']);
-               $foundRemoteById = false;
+               $result['exactIdMatch'] = false;
                foreach ($addressBookContacts as $contact) {
                        if (isset($contact['isLocalSystemBook'])) {
                                continue;
@@ -295,9 +295,9 @@ class ShareesAPIController extends OCSController {
                                        list(, $serverUrl) = $this->splitUserRemote($cloudId);
                                        if (strtolower($contact['FN']) === strtolower($search) || strtolower($cloudId) === strtolower($search)) {
                                                if (strtolower($cloudId) === strtolower($search)) {
-                                                       $foundRemoteById = true;
+                                                       $result['exactIdMatch'] = true;
                                                }
-                                               $this->result['exact']['remotes'][] = [
+                                               $result['exact'][] = [
                                                        'label' => $contact['FN'] . " ($cloudId)",
                                                        'value' => [
                                                                'shareType' => Share::SHARE_TYPE_REMOTE,
@@ -306,7 +306,7 @@ class ShareesAPIController extends OCSController {
                                                        ],
                                                ];
                                        } else {
-                                               $this->result['remotes'][] = [
+                                               $result['results'][] = [
                                                        'label' => $contact['FN'] . " ($cloudId)",
                                                        'value' => [
                                                                'shareType' => Share::SHARE_TYPE_REMOTE,
@@ -320,11 +320,11 @@ class ShareesAPIController extends OCSController {
                }
 
                if (!$this->shareeEnumeration) {
-                       $this->result['remotes'] = [];
+                       $result['results'] = [];
                }
 
-               if (!$foundRemoteById && substr_count($search, '@') >= 1 && $this->offset === 0) {
-                       $this->result['exact']['remotes'][] = [
+               if (!$result['exactIdMatch'] && substr_count($search, '@') >= 1 && $this->offset === 0) {
+                       $result['exact'][] = [
                                'label' => $search,
                                'value' => [
                                        'shareType' => Share::SHARE_TYPE_REMOTE,
@@ -335,7 +335,7 @@ class ShareesAPIController extends OCSController {
 
                $this->reachedEndFor[] = 'remotes';
 
-               return $foundRemoteById;
+               return $result;
        }
 
        /**
@@ -504,15 +504,30 @@ class ShareesAPIController extends OCSController {
                }
 
                // Get remote
-               $foundExactCloudID = false;
+               $remoteResults = ['results' => [], 'exact' => []];
                if (in_array(Share::SHARE_TYPE_REMOTE, $shareTypes)) {
-                       $foundExactCloudID = $this->getRemote($search);
+                       $remoteResults = $this->getRemote($search);
                }
 
-               // if we have a exact match for the cloud ID we don't show the email option,
-               // it is extremely unlikely that a identical email address and cloud id exists
-               if (!$foundExactCloudID && in_array(Share::SHARE_TYPE_EMAIL, $shareTypes)) {
-                       $this->getEmail($search);
+               $mailResults = ['results' => [], 'exact' => []];
+               if (in_array(Share::SHARE_TYPE_EMAIL, $shareTypes)) {
+                       $mailResults = $this->getEmail($search);
+               }
+
+               // 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
+               // that the exact same email address and federated cloud id exists
+               if ($mailResults['exactIdMatch'] && !$remoteResults['exactIdMatch']) {
+                       $this->result['emails'] = $mailResults['results'];
+                       $this->result['exact']['emails'] = $mailResults['exact'];
+               } else if (!$mailResults['exactIdMatch'] && $remoteResults['exactIdMatch']) {
+                       $this->result['remotes'] = $remoteResults['results'];
+                       $this->result['exact']['remotes'] = $remoteResults['exact'];
+               } else {
+                       $this->result['remotes'] = $remoteResults['results'];
+                       $this->result['exact']['remotes'] = $remoteResults['exact'];
+                       $this->result['emails'] = $mailResults['results'];
+                       $this->result['exact']['emails'] = $mailResults['exact'];
                }
 
                $response = new Http\DataResponse($this->result);
@@ -531,16 +546,15 @@ class ShareesAPIController extends OCSController {
 
        /**
         * @param string $search
-        * @return bool (true if a exact match was found, false otherwise)
+        * @return array
         */
        protected function getEmail($search) {
-
-               $this->result['emails'] = [];
+               $result = ['results' => [], 'exact' => []];
 
                // Search in contacts
                //@todo Pagination missing
                $addressBookContacts = $this->contactsManager->search($search, ['EMAIL', 'FN']);
-               $foundEmailByAddress = false;
+               $result['exactIdMatch'] = false;
                foreach ($addressBookContacts as $contact) {
                        if (isset($contact['isLocalSystemBook'])) {
                                continue;
@@ -553,9 +567,10 @@ class ShareesAPIController extends OCSController {
                                foreach ($emailAddresses as $emailAddress) {
                                        if (strtolower($contact['FN']) === strtolower($search) || strtolower($emailAddress) === strtolower($search)) {
                                                if (strtolower($emailAddress) === strtolower($search)) {
+                                                       $result['exactIdMatch'] = true;
                                                        $foundEmailByAddress = true;
                                                }
-                                               $this->result['exact']['emails'][] = [
+                                               $result['exact'][] = [
                                                        'label' => $contact['FN'] . " ($emailAddress)",
                                                        'value' => [
                                                                'shareType' => Share::SHARE_TYPE_EMAIL,
@@ -563,7 +578,7 @@ class ShareesAPIController extends OCSController {
                                                        ],
                                                ];
                                        } else {
-                                               $this->result['emails'][] = [
+                                               $result['results'][] = [
                                                        'label' => $contact['FN'] . " ($emailAddress)",
                                                        'value' => [
                                                                'shareType' => Share::SHARE_TYPE_EMAIL,
@@ -576,11 +591,11 @@ class ShareesAPIController extends OCSController {
                }
 
                if (!$this->shareeEnumeration) {
-                       $this->result['emails'] = [];
+                       $result['results'] = [];
                }
 
-               if (!$foundEmailByAddress && filter_var($search, FILTER_VALIDATE_EMAIL)) {
-                       $this->result['exact']['emails'][] = [
+               if (!$result['exactIdMatch'] && filter_var($search, FILTER_VALIDATE_EMAIL)) {
+                       $result['exact'][] = [
                                'label' => $search,
                                'value' => [
                                        'shareType' => Share::SHARE_TYPE_EMAIL,
@@ -591,7 +606,7 @@ class ShareesAPIController extends OCSController {
 
                $this->reachedEndFor[] = 'emails';
 
-               return $foundEmailByAddress;
+               return $result;
        }
 
        /**