]> source.dussan.org Git - nextcloud-server.git/commitdiff
add LDAP integr. test for receiving share candidates with group limitation
authorArthur Schiwon <blizzz@arthur-schiwon.de>
Mon, 3 Jun 2019 13:24:26 +0000 (15:24 +0200)
committerBackportbot <backportbot-noreply@rullzer.com>
Mon, 17 Jun 2019 13:35:37 +0000 (13:35 +0000)
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
build/integration/config/behat.yml
build/integration/features/bootstrap/AppConfiguration.php
build/integration/features/bootstrap/BasicStructure.php
build/integration/features/bootstrap/CalDavContext.php
build/integration/features/bootstrap/LDAPContext.php
build/integration/features/bootstrap/ShareesContext.php
build/integration/features/bootstrap/Sharing.php
build/integration/features/bootstrap/WebDav.php
build/integration/ldap_features/openldap-uid-username.feature

index 7fd3686b8bb13c0ed5e20bc8908344b019d04c0f..51b749360e322d9d0f0e890ec920125dff6be837 100644 (file)
@@ -84,7 +84,7 @@ default:
             admin:
               - admin
               - admin
-            regular_user_password: what_for
+            regular_user_password: 123456
     remoteapi:
       paths:
         - "%paths.base%/../remoteapi_features"
index faf80d85e1104ff48b8ed8e9c3679869130ad10c..d39c51e387ad26824d8771c102c66b4bbcd14fad 100644 (file)
@@ -23,8 +23,8 @@
  */
 use Behat\Behat\Hook\Scope\AfterScenarioScope;
 use Behat\Behat\Hook\Scope\BeforeScenarioScope;
-use GuzzleHttp\Message\ResponseInterface;
 use PHPUnit\Framework\Assert;
+use Psr\Http\Message\ResponseInterface;
 
 require __DIR__ . '/../../vendor/autoload.php';
 
index f6c93aa5174d6a04a02166eea777c888de3371c8..3f4f70115bff2040c3f256a7a3eea681d3932c1c 100644 (file)
@@ -29,6 +29,7 @@
  *
  */
 
+use Behat\Gherkin\Node\TableNode;
 use GuzzleHttp\Client;
 use GuzzleHttp\Cookie\CookieJar;
 use GuzzleHttp\Exception\ClientException;
@@ -165,7 +166,7 @@ trait BasicStructure {
         * @When /^sending "([^"]*)" to "([^"]*)" with$/
         * @param string $verb
         * @param string $url
-        * @param \Behat\Gherkin\Node\TableNode $body
+        * @param TableNode $body
         */
        public function sendingToWith($verb, $url, $body) {
                $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
@@ -179,7 +180,7 @@ trait BasicStructure {
                $options['headers'] = [
                        'OCS_APIREQUEST' => 'true'
                ];
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+               if ($body instanceof TableNode) {
                        $fd = $body->getRowsHash();
                        $options['form_params'] = $fd;
                }
@@ -216,7 +217,7 @@ trait BasicStructure {
                } else {
                        $options['auth'] = [$this->currentUser, $this->regularUser];
                }
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+               if ($body instanceof TableNode) {
                        $fd = $body->getRowsHash();
                        $options['form_params'] = $fd;
                }
@@ -504,4 +505,27 @@ trait BasicStructure {
        public function cookiesAreReset() {
                $this->cookieJar = new CookieJar();
        }
+
+       /**
+        * @Then The following headers should be set
+        * @param TableNode $table
+        * @throws \Exception
+        */
+       public function theFollowingHeadersShouldBeSet(TableNode $table) {
+               foreach($table->getTable() as $header) {
+                       $headerName = $header[0];
+                       $expectedHeaderValue = $header[1];
+                       $returnedHeader = $this->response->getHeader($headerName)[0];
+                       if($returnedHeader !== $expectedHeaderValue) {
+                               throw new \Exception(
+                                       sprintf(
+                                               "Expected value '%s' for header '%s', got '%s'",
+                                               $expectedHeaderValue,
+                                               $headerName,
+                                               $returnedHeader
+                                       )
+                               );
+                       }
+               }
+       }
 }
index cbd29a4fbff439683f5ef14c12cde83daea4fcdc..1c64c74c036e534ba04a0f6860722cfd5648bd97 100644 (file)
@@ -25,7 +25,7 @@
 require __DIR__ . '/../../vendor/autoload.php';
 
 use GuzzleHttp\Client;
-use GuzzleHttp\Message\ResponseInterface;
+use Psr\Http\Message\ResponseInterface;
 
 class CalDavContext implements \Behat\Behat\Context\Context {
        /** @var string  */
index 2ad737bf8b86451106ab128ab212399a9efea883..4932eaa36a50ce10af1a60188242d057eed030e5 100644 (file)
@@ -26,8 +26,9 @@ use Behat\Gherkin\Node\TableNode;
 use PHPUnit\Framework\Assert;
 
 class LDAPContext implements Context {
-       use BasicStructure;
-       use CommandLine;
+       use AppConfiguration,
+               CommandLine,
+               Sharing; // Pulls in BasicStructure
 
        protected $configID;
 
@@ -204,4 +205,8 @@ class LDAPContext implements Context {
                $configKey = $this->configID . 'ldap_configuration_active';
                $this->invokingTheCommand('config:app:set user_ldap ' . $configKey . ' --value="0"');
        }
+
+       protected function resetAppConfigs() {
+               // not implemented
+       }
 }
index 41980e2cd21c98e4f6e6eabdcd608cca3bfd76c1..ee4d9420581035b761458fb91b86b6bce1db4d41 100644 (file)
@@ -33,60 +33,9 @@ require __DIR__ . '/../../vendor/autoload.php';
  * Features context.
  */
 class ShareesContext implements Context, SnippetAcceptingContext {
-       use Provisioning;
+       use Sharing;
        use AppConfiguration;
 
-       /**
-        * @When /^getting sharees for$/
-        * @param \Behat\Gherkin\Node\TableNode $body
-        */
-       public function whenGettingShareesFor($body) {
-               $url = '/apps/files_sharing/api/v1/sharees';
-               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
-                       $parameters = [];
-                       foreach ($body->getRowsHash() as $key => $value) {
-                               $parameters[] = $key . '=' . $value;
-                       }
-                       if (!empty($parameters)) {
-                               $url .= '?' . implode('&', $parameters);
-                       }
-               }
-
-               $this->sendingTo('GET', $url);
-       }
-
-       /**
-        * @Then /^"([^"]*)" sharees returned (are|is empty)$/
-        * @param string $shareeType
-        * @param string $isEmpty
-        * @param \Behat\Gherkin\Node\TableNode|null $shareesList
-        */
-       public function thenListOfSharees($shareeType, $isEmpty, $shareesList = null) {
-               if ($isEmpty !== 'is empty') {
-                       $sharees = $shareesList->getRows();
-                       $respondedArray = $this->getArrayOfShareesResponded($this->response, $shareeType);
-                       Assert::assertEquals($sharees, $respondedArray);
-               } else {
-                       $respondedArray = $this->getArrayOfShareesResponded($this->response, $shareeType);
-                       Assert::assertEmpty($respondedArray);
-               }
-       }
-
-       public function getArrayOfShareesResponded(ResponseInterface $response, $shareeType) {
-               $elements = simplexml_load_string($response->getBody())->data;
-               $elements = json_decode(json_encode($elements), 1);
-               if (strpos($shareeType, 'exact ') === 0) {
-                       $elements = $elements['exact'];
-                       $shareeType = substr($shareeType, 6);
-               }
-
-               $sharees = [];
-               foreach ($elements[$shareeType] as $element) {
-                       $sharees[] = [$element['label'], $element['value']['shareType'], $element['value']['shareWith']];
-               }
-               return $sharees;
-       }
-
        protected function resetAppConfigs() {
                $this->modifyServerConfig('core', 'shareapi_only_share_with_group_members', 'no');
                $this->modifyServerConfig('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes');
index 9a3c00af48948ae137032a21c805343b0ec3f0a3..efacc6e41548ae8df9718431af8da0f0a21cf198 100644 (file)
@@ -26,8 +26,8 @@
  *
  */
 use GuzzleHttp\Client;
-use GuzzleHttp\Message\ResponseInterface;
 use PHPUnit\Framework\Assert;
+use Psr\Http\Message\ResponseInterface;
 
 require __DIR__ . '/../../vendor/autoload.php';
 
@@ -45,7 +45,7 @@ trait Sharing {
        /** @var int */
        private $savedShareId = null;
 
-       /** @var \Psr\Http\Message\ResponseInterface */
+       /** @var ResponseInterface */
        private $response;
 
        /**
@@ -529,26 +529,54 @@ trait Sharing {
        }
 
        /**
-        * @Then The following headers should be set
-        * @param \Behat\Gherkin\Node\TableNode $table
-        * @throws \Exception
+        * @When /^getting sharees for$/
+        * @param \Behat\Gherkin\Node\TableNode $body
         */
-       public function theFollowingHeadersShouldBeSet(\Behat\Gherkin\Node\TableNode $table) {
-               foreach($table->getTable() as $header) {
-                       $headerName = $header[0];
-                       $expectedHeaderValue = $header[1];
-                       $returnedHeader = $this->response->getHeader($headerName)[0];
-                       if($returnedHeader !== $expectedHeaderValue) {
-                               throw new \Exception(
-                                       sprintf(
-                                               "Expected value '%s' for header '%s', got '%s'",
-                                               $expectedHeaderValue,
-                                               $headerName,
-                                               $returnedHeader
-                                       )
-                               );
+       public function whenGettingShareesFor($body) {
+               $url = '/apps/files_sharing/api/v1/sharees';
+               if ($body instanceof \Behat\Gherkin\Node\TableNode) {
+                       $parameters = [];
+                       foreach ($body->getRowsHash() as $key => $value) {
+                               $parameters[] = $key . '=' . $value;
                        }
+                       if (!empty($parameters)) {
+                               $url .= '?' . implode('&', $parameters);
+                       }
+               }
+
+               $this->sendingTo('GET', $url);
+       }
+
+       /**
+        * @Then /^"([^"]*)" sharees returned (are|is empty)$/
+        * @param string $shareeType
+        * @param string $isEmpty
+        * @param \Behat\Gherkin\Node\TableNode|null $shareesList
+        */
+       public function thenListOfSharees($shareeType, $isEmpty, $shareesList = null) {
+               if ($isEmpty !== 'is empty') {
+                       $sharees = $shareesList->getRows();
+                       $respondedArray = $this->getArrayOfShareesResponded($this->response, $shareeType);
+                       Assert::assertEquals($sharees, $respondedArray);
+               } else {
+                       $respondedArray = $this->getArrayOfShareesResponded($this->response, $shareeType);
+                       Assert::assertEmpty($respondedArray);
+               }
+       }
+
+       public function getArrayOfShareesResponded(ResponseInterface $response, $shareeType) {
+               $elements = simplexml_load_string($response->getBody())->data;
+               $elements = json_decode(json_encode($elements), 1);
+               if (strpos($shareeType, 'exact ') === 0) {
+                       $elements = $elements['exact'];
+                       $shareeType = substr($shareeType, 6);
+               }
+
+               $sharees = [];
+               foreach ($elements[$shareeType] as $element) {
+                       $sharees[] = [$element['label'], $element['value']['shareType'], $element['value']['shareWith']];
                }
+               return $sharees;
        }
 }
 
index b36cdfaea68c250f29cc1da30a5e63f9a1f34f64..6bc808c3bcbc096fb7ae446715e67ae7a3b5bfea 100644 (file)
@@ -226,29 +226,6 @@ trait WebDav {
                }
        }
 
-       /**
-        * @Then The following headers should be set
-        * @param \Behat\Gherkin\Node\TableNode $table
-        * @throws \Exception
-        */
-       public function theFollowingHeadersShouldBeSet(\Behat\Gherkin\Node\TableNode $table) {
-               foreach ($table->getTable() as $header) {
-                       $headerName = $header[0];
-                       $expectedHeaderValue = $header[1];
-                       $returnedHeader = $this->response->getHeader($headerName)[0];
-                       if ($returnedHeader !== $expectedHeaderValue) {
-                               throw new \Exception(
-                                       sprintf(
-                                               "Expected value '%s' for header '%s', got '%s'",
-                                               $expectedHeaderValue,
-                                               $headerName,
-                                               $returnedHeader
-                                       )
-                               );
-                       }
-               }
-       }
-
        /**
         * @Then Downloaded content should start with :start
         * @param int $start
index e120d0316de6045f97df652250e1cb1ef590c2ad..1790106ad561d703dcdbeb2361345990a27e7960 100644 (file)
@@ -118,3 +118,24 @@ Feature: LDAP
     And the command output contains the text "Clean up the user's remnants by"
     And invoking occ with "user:delete alice"
     Then the command output contains the text "The specified user was deleted"
+
+  Scenario: Search only with group members - allowed
+    Given modify LDAP configuration
+      | ldapGroupFilter               | cn=Orcharding |
+      | ldapGroupMemberAssocAttr      | member |
+      | ldapBaseGroups                | ou=OtherGroups,dc=nextcloud,dc=ci  |
+      | ldapAttributesForUserSearch   | employeeNumber                  |
+      | useMemberOfToDetectMembership | 1 |
+    And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
+    And As an "alice"
+    When getting sharees for
+      # "5" is part of the employee number of some LDAP records
+      | search | 5 |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned are
+      | Elisa | 0 | elisa |
+    And "exact groups" sharees returned is empty
+