diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-09-16 12:51:18 +0200 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-09-28 13:18:23 +0200 |
commit | d66e16b07efb5e2b315e36cfb01228b428660df1 (patch) | |
tree | e5f713bfc87d331e367b710e6697098efc2237a2 /build | |
parent | c470ef0fd7130eb9ab282cbc294ef03059599d80 (diff) | |
download | nextcloud-server-d66e16b07efb5e2b315e36cfb01228b428660df1.tar.gz nextcloud-server-d66e16b07efb5e2b315e36cfb01228b428660df1.zip |
feat(dav): New `ZipFolderPlugin` which allows to download folders using GET requests
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'build')
-rw-r--r-- | build/integration/dav_features/dav-v2-public.feature | 20 | ||||
-rw-r--r-- | build/integration/dav_features/dav-v2.feature | 15 | ||||
-rw-r--r-- | build/integration/features/bootstrap/Download.php | 20 | ||||
-rw-r--r-- | build/integration/features/bootstrap/WebDav.php | 27 |
4 files changed, 80 insertions, 2 deletions
diff --git a/build/integration/dav_features/dav-v2-public.feature b/build/integration/dav_features/dav-v2-public.feature index e35f7b9101f..1a167ed4ceb 100644 --- a/build/integration/dav_features/dav-v2-public.feature +++ b/build/integration/dav_features/dav-v2-public.feature @@ -20,3 +20,23 @@ Feature: dav-v2-public Given using new public dav path When Requesting share note on dav endpoint Then the single response should contain a property "{http://nextcloud.org/ns}note" with value "Hello" + + Scenario: Download a folder + Given using new dav path + And As an "admin" + And user "user0" exists + And user "user0" created a folder "/testshare" + And user "user0" created a folder "/testshare/testFolder" + When User "user0" uploads file "data/textfile.txt" to "/testshare/testFolder/text.txt" + When User "user0" uploads file "data/green-square-256.png" to "/testshare/testFolder/image.png" + And as "user0" creating a share with + | path | testshare | + | shareType | 3 | + | permissions | 1 | + And As an "user1" + Given using new public dav path + When Downloading public folder "testFolder" + Then the downloaded file is a zip file + Then the downloaded zip file contains a folder named "testFolder/" + And the downloaded zip file contains a file named "testFolder/text.txt" with the contents of "/testshare/testFolder/text.txt" from "user0" data + And the downloaded zip file contains a file named "testFolder/image.png" with the contents of "/testshare/testFolder/image.png" from "user0" data diff --git a/build/integration/dav_features/dav-v2.feature b/build/integration/dav_features/dav-v2.feature index d62f7d8fa94..02d90242a05 100644 --- a/build/integration/dav_features/dav-v2.feature +++ b/build/integration/dav_features/dav-v2.feature @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors # SPDX-License-Identifier: AGPL-3.0-or-later + Feature: dav-v2 Background: Given using api version "1" @@ -45,6 +46,20 @@ Feature: dav-v2 Then Downloaded content should start with "Welcome to your Nextcloud account!" Then the HTTP status code should be "200" + Scenario: Download a folder + Given using new dav path + And As an "admin" + And user "user0" exists + And user "user0" created a folder "/testFolder" + When User "user0" uploads file "data/textfile.txt" to "/testFolder/text.txt" + When User "user0" uploads file "data/green-square-256.png" to "/testFolder/image.png" + And As an "user0" + When Downloading folder "/testFolder" + Then the downloaded file is a zip file + Then the downloaded zip file contains a folder named "testFolder/" + And the downloaded zip file contains a file named "testFolder/text.txt" with the contents of "/testFolder/text.txt" from "user0" data + And the downloaded zip file contains a file named "testFolder/image.png" with the contents of "/testFolder/image.png" from "user0" data + Scenario: Doing a PROPFIND with a web login should not work without CSRF token on the new backend Given Logging in using web as "admin" When Sending a "PROPFIND" to "/remote.php/dav/files/admin/welcome.txt" without requesttoken diff --git a/build/integration/features/bootstrap/Download.php b/build/integration/features/bootstrap/Download.php index ec3b79363e4..1434e182e7d 100644 --- a/build/integration/features/bootstrap/Download.php +++ b/build/integration/features/bootstrap/Download.php @@ -4,6 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ use PHPUnit\Framework\Assert; +use Psr\Http\Message\StreamInterface; require __DIR__ . '/../../vendor/autoload.php'; @@ -23,13 +24,12 @@ trait Download { $this->asAn($user); $this->sendingToDirectUrl('GET', '/index.php/apps/files/ajax/download.php?dir=' . $folder . '&files=[' . $entries . ']'); $this->theHTTPStatusCodeShouldBe('200'); - - $this->getDownloadedFile(); } private function getDownloadedFile() { $this->downloadedFile = ''; + /** @var StreamInterface */ $body = $this->response->getBody(); while (!$body->eof()) { $this->downloadedFile .= $body->read(8192); @@ -38,9 +38,23 @@ trait Download { } /** + * @Then the downloaded file is a zip file + */ + public function theDownloadedFileIsAZipFile() { + $this->getDownloadedFile(); + + Assert::assertTrue( + strpos($this->downloadedFile, "\x50\x4B\x01\x02") !== false, + 'File does not contain the central directory file header' + ); + } + + /** * @Then the downloaded zip file is a zip32 file */ public function theDownloadedZipFileIsAZip32File() { + $this->theDownloadedFileIsAZipFile(); + // assertNotContains is not used to prevent the whole file from being // printed in case of error. Assert::assertTrue( @@ -53,6 +67,8 @@ trait Download { * @Then the downloaded zip file is a zip64 file */ public function theDownloadedZipFileIsAZip64File() { + $this->theDownloadedFileIsAZipFile(); + // assertNotContains is not used to prevent the whole file from being // printed in case of error. Assert::assertTrue( diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 6c0c1767e73..4388c7c8eeb 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -239,6 +239,33 @@ trait WebDav { } /** + * @When Downloading folder :folderName + */ + public function downloadingFolder(string $folderName) { + try { + $this->response = $this->makeDavRequest($this->currentUser, 'GET', $folderName, ['Accept' => 'application/zip']); + } catch (\GuzzleHttp\Exception\ClientException $e) { + $this->response = $e->getResponse(); + } + } + + /** + * @When Downloading public folder :folderName + */ + public function downloadPublicFolder(string $folderName) { + $token = $this->lastShareData->data->token; + $fullUrl = substr($this->baseUrl, 0, -4) . "public.php/dav/files/$token/$folderName"; + + $client = new GClient(); + $options = []; + $options['headers'] = [ + 'Accept' => 'application/zip' + ]; + + $this->response = $client->request('GET', $fullUrl, $options); + } + + /** * @When Downloading file :fileName * @param string $fileName */ |