1
0
mirror of https://github.com/owncloud/ocis.git synced 2025-04-18 23:44:07 +03:00
prashant-gurung899 d8d7b700cd
reorganize test folders within the acceptance directory
Signed-off-by: prashant-gurung899 <prasantgrg777@gmail.com>
2024-08-28 14:54:45 +05:45

3816 lines
110 KiB
PHP
Executable File

<?php declare(strict_types=1);
/**
* ownCloud
*
* @author Joas Schilling <coding@schilljs.com>
* @author Sergio Bertolin <sbertolin@owncloud.com>
* @author Phillip Davis <phil@jankaritech.com>
* @copyright Copyright (c) 2018, ownCloud GmbH
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License,
* as published by the Free Software Foundation;
* either version 3 of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Psr\Http\Message\ResponseInterface;
use PHPUnit\Framework\Assert;
use PHPUnit\Framework\ExpectationFailedException;
use TestHelpers\OcsApiHelper;
use TestHelpers\SharingHelper;
use TestHelpers\HttpRequestHelper;
use TestHelpers\TranslationHelper;
use GuzzleHttp\Exception\GuzzleException;
/**
* Sharing trait
*/
trait Sharing {
private int $sharingApiVersion = 1;
/**
* @var array
*/
private array $createdUserGroupShares = [];
private ?float $localLastShareTime = null;
/**
* Defines the fields that can be provided in a share request.
*/
private array $shareFields = [
'path', 'name', 'publicUpload', 'password', 'expireDate',
'expireDateAsString', 'permissions', 'shareWith', 'shareType'
];
/**
* Defines the fields that are known and can be tested in a share response.
* Note that ownCloud10 also provides file_parent in responses.
* file_parent is not provided by OCIS/reva.
* There are no known clients that use file_parent.
* The acceptance tests do not test for file_parent.
*
* @var array fields that are possible in a share response
*/
private array $shareResponseFields = [
'id', 'share_type', 'uid_owner', 'displayname_owner', 'stime', 'parent',
'expiration', 'token', 'uid_file_owner', 'displayname_file_owner', 'path',
'item_type', 'mimetype', 'storage_id', 'storage', 'item_source',
'file_source', 'file_target', 'name', 'url', 'mail_send',
'attributes', 'permissions', 'share_with', 'share_with_displayname', 'share_with_additional_info'
];
/**
* @var array
*/
private array $createdPublicShares = [];
/**
* @var array
*/
private array $shareNgCreatedLinkShares = [];
/**
* @var array
*/
private array $shareNgCreatedUserGroupShares = [];
/**
* @return string
*/
public function getLastCreatedPublicShareToken():string {
return (string) $this->getLastCreatedPublicShare()->token;
}
/**
* @return SimpleXMLElement|null
*/
public function getLastCreatedPublicShare():?SimpleXMLElement {
return \end($this->createdPublicShares);
}
/**
* @param SimpleXMLElement $shareData
*
* @return void
*/
public function addToCreatedPublicShares(SimpleXMLElement $shareData): void {
$this->createdPublicShares[] = $shareData;
}
/**
* @param ResponseInterface $response
*
* @return void
*/
public function shareNgAddToCreatedLinkShares(ResponseInterface $response): void {
$this->shareNgCreatedLinkShares[] = $response;
}
/**
* @return ResponseInterface|null
*/
public function shareNgGetLastCreatedLinkShare():?ResponseInterface {
return \end($this->shareNgCreatedLinkShares);
}
/**
* @param ResponseInterface $response
*
* @return void
*/
public function shareNgAddToCreatedUserGroupShares(ResponseInterface $response): void {
$this->shareNgCreatedUserGroupShares[] = $response;
}
/**
* @return ResponseInterface|null
*/
public function shareNgGetLastCreatedUserGroupShare():?ResponseInterface {
return \end($this->shareNgCreatedUserGroupShares);
}
/**
* @param string $sharer
* @param SimpleXMLElement $shareData
*
* @return void
*/
public function addToCreatedUserGroupShares(string $sharer, SimpleXMLElement $shareData): void {
$this->createdUserGroupShares["$sharer"] = $shareData;
}
/**
* @return array
*/
public function getCreatedUserGroupShares(): array {
return $this->createdUserGroupShares;
}
/**
* @return SimpleXMLElement
*/
public function getLastCreatedUserGroupShare(): SimpleXMLElement {
return \end($this->createdUserGroupShares);
}
/**
* @return void
*/
public function emptyCreatedPublicShares():void {
$this->createdPublicShares = [];
}
/**
* @return void
*/
public function emptyCreatedUserGroupShares(): void {
$this->createdUserGroupShares = [];
}
/**
* @return float|null
*/
public function getLocalLastShareTime():?float {
return $this->localLastShareTime;
}
/**
* @param string|null $postfix string to append to the end of the path
*
* @return string
*/
public function getSharesEndpointPath(?string $postfix = ''):string {
return "/apps/files_sharing/api/v$this->sharingApiVersion/shares$postfix";
}
/**
* @return string
*/
public function shareNgGetLastCreatedLinkShareID(): string {
$lastResponse = $this->shareNgGetLastCreatedLinkShare();
if (!isset($this->getJsonDecodedResponse($lastResponse)['id'])) {
throw new Error('Response did not contain share id for the created public link');
}
return $this->getJsonDecodedResponse($lastResponse)['id'];
}
/**
* @return string
*/
public function shareNgGetLastCreatedLinkShareToken(): string {
$lastResponse = $this->shareNgGetLastCreatedLinkShare();
if (!isset($this->getJsonDecodedResponse($lastResponse)['link']['webUrl'])) {
throw new Error('Response did not contain share id ' . $this->getJsonDecodedResponse($lastResponse)['link']['webUrl'] . ' for the created public link');
}
$last_created_link_webURL = $this->getJsonDecodedResponse($lastResponse)['link']['webUrl'];
return substr(strrchr($last_created_link_webURL, "/"), 1);
}
/**
* @return string
*/
public function shareNgGetLastCreatedUserGroupShareID(): string {
$lastResponse = $this->shareNgGetLastCreatedUserGroupShare();
if (!isset($this->getJsonDecodedResponse($lastResponse)['value'][0]['id'])) {
throw new Error('Response did not contain share id for the last created share.');
}
return $this->getJsonDecodedResponse($lastResponse)['value'][0]['id'];
}
/**
* Split given permissions string each separated with "," into an array of strings
*
* @param string $str
*
* @return string[]
*/
private function splitPermissionsString(string $str):array {
$str = \trim($str);
$permissions = \array_map('trim', \explode(',', $str));
/* We use 'all', 'uploadwriteonly' and 'change' in feature files
for readability. Parse into appropriate permissions and return them
without any duplications.*/
if (\in_array('all', $permissions, true)) {
$permissions = \array_keys(SharingHelper::PERMISSION_TYPES);
}
if (\in_array('uploadwriteonly', $permissions, true)) {
// remove 'uploadwriteonly' from $permissions
$permissions = \array_diff($permissions, ['uploadwriteonly']);
$permissions = \array_merge($permissions, ['create']);
}
if (\in_array('change', $permissions, true)) {
// remove 'change' from $permissions
$permissions = \array_diff($permissions, ['change']);
$permissions = \array_merge(
$permissions,
['create', 'delete', 'read', 'update']
);
}
return \array_unique($permissions);
}
/**
*
* @return int
*
* @throws Exception
*/
public function getServerShareTimeFromLastResponse():int {
$stime = $this->getResponseXml(null, __METHOD__)->xpath("//stime");
if ($stime) {
return (int) $stime[0];
}
throw new Exception("Last share time (i.e. 'stime') could not be found in the response.");
}
/**
* @return void
*/
private function waitToCreateShare():void {
if (($this->localLastShareTime !== null)
&& ((\microtime(true) - $this->localLastShareTime) < 1)
) {
// prevent creating two shares with the same "stime" which is
// based on seconds, this affects share merging order and could
// affect expected test result order
\sleep(1);
}
}
/**
* @param string $user
* @param TableNode|null $body
* TableNode $body should not have any heading and can have the following rows |
* | path | The folder or file path to be shared |
* | name | A (human-readable) name for the share, |
* | | which can be up to 64 characters in length. |
* | publicUpload | Whether to allow public upload to a public |
* | | shared folder. Write true for allowing. |
* | password | The password to protect the public link share with. |
* | expireDate | An expire date for public link shares. |
* | | This argument takes a date string in any format |
* | | that can be passed to strtotime(), for example: |
* | | 'YYYY-MM-DD' or '+ x days'. It will be converted to |
* | | 'YYYY-MM-DD' format before sending |
* | expireDateAsString | An expire date string for public link shares. |
* | | Whatever string is provided will be sent as the |
* | | expire date. For example, use this to test sending |
* | | invalid date strings. |
* | permissions | The permissions to set on the share. |
* | | 1 = read; 2 = update; 4 = create; |
* | | 8 = delete; 16 = share; 31 = all |
* | | 15 = change; 0 = invite |
* | | 4 = uploadwriteonly |
* | | (default: 31, for public shares: 1) |
* | | Pass either the (total) number, |
* | | or the keyword, |
* | | or a comma separated list of keywords |
* | shareWith | The user or group id with which the file should |
* | | be shared. |
* | shareType | The type of the share. This can be one of: |
* | | 0 = user, 1 = group, 3 = public_link, |
* | | 6 = federated (cloud share). |
* | | Pass either the number or the keyword. |
*
* @return ResponseInterface
* @throws Exception
*/
public function createShareWithSettings(string $user, ?TableNode $body): ResponseInterface {
$user = $this->getActualUsername($user);
$this->verifyTableNodeRows(
$body,
['path'],
$this->shareFields
);
$bodyRows = $body->getRowsHash();
$bodyRows['name'] = \array_key_exists('name', $bodyRows) ? $bodyRows['name'] : null;
$bodyRows['shareWith'] = \array_key_exists('shareWith', $bodyRows) ? $bodyRows['shareWith'] : null;
$bodyRows['shareWith'] = $this->getActualUsername($bodyRows['shareWith']);
$bodyRows['publicUpload'] = \array_key_exists('publicUpload', $bodyRows) ? $bodyRows['publicUpload'] === 'true' : null;
$bodyRows['password'] = \array_key_exists('password', $bodyRows) ? $this->getActualPassword($bodyRows['password']) : null;
if (\array_key_exists('permissions', $bodyRows)) {
if (\is_numeric($bodyRows['permissions'])) {
$bodyRows['permissions'] = (int) $bodyRows['permissions'];
} else {
$bodyRows['permissions'] = $this->splitPermissionsString($bodyRows['permissions']);
}
} else {
$bodyRows['permissions'] = null;
}
if (\array_key_exists('shareType', $bodyRows)) {
if (\is_numeric($bodyRows['shareType'])) {
$bodyRows['shareType'] = (int) $bodyRows['shareType'];
}
} else {
$bodyRows['shareType'] = null;
}
Assert::assertFalse(
isset($bodyRows['expireDate'], $bodyRows['expireDateAsString']),
'expireDate and expireDateAsString cannot be set at the same time.'
);
$needToParse = \array_key_exists('expireDate', $bodyRows);
$expireDate = $bodyRows['expireDate'] ?? $bodyRows['expireDateAsString'] ?? null;
$bodyRows['expireDate'] = $needToParse ? \date('Y-m-d', \strtotime($expireDate)) : $expireDate;
return $this->createShare(
$user,
$bodyRows['path'],
$bodyRows['shareType'],
$bodyRows['shareWith'],
$bodyRows['publicUpload'],
$bodyRows['password'],
$bodyRows['permissions'],
$bodyRows['name'],
$bodyRows['expireDate']
);
}
/**
* @When /^user "([^"]*)" creates a share using the sharing API with settings$/
*
* @param string $user
* @param TableNode|null $body {@link createShareWithSettings}
*
* @return void
* @throws Exception
*/
public function userCreatesAShareWithSettings(string $user, ?TableNode $body):void {
$user = $this->getActualUsername($user);
$response = $this->createShareWithSettings(
$user,
$body
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^user "([^"]*)" has created a share with settings$/
*
* @param string $user
* @param TableNode|null $body {@link createShareWithSettings}
*
* @return void
* @throws Exception
*/
public function userHasCreatedAShareWithSettings(string $user, ?TableNode $body) {
$response = $this->createShareWithSettings(
$user,
$body
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @param string $user
* @param TableNode $body
*
* @return ResponseInterface
*/
public function createPublicLinkShare(string $user, TableNode $body): ResponseInterface {
$rows = $body->getRows();
// A public link share is shareType 3
$rows[] = ['shareType', 'public_link'];
$newBody = new TableNode($rows);
return $this->createShareWithSettings($user, $newBody);
}
/**
* @When /^user "([^"]*)" creates a public link share using the sharing API with settings$/
*
* @param string $user
* @param TableNode $body
*
* @return void
* @throws Exception
*/
public function userCreatesAPublicLinkShareWithSettings(string $user, TableNode $body):void {
$this->setResponse($this->createPublicLinkShare($user, $body));
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^user "([^"]*)" has created a public link share with settings$/
*
* @param string $user
* @param TableNode $body
*
* @return void
* @throws Exception
*/
public function userHasCreatedAPublicLinkShareWithSettings(string $user, TableNode $body):void {
$response = $this->createPublicLinkShare($user, $body);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
$this->clearStatusCodeArrays();
}
/**
* @When /^the user creates a public link share using the sharing API with settings$/
*
* @param TableNode $body
*
* @return void
* @throws Exception
*/
public function theUserCreatesAPublicLinkShareWithSettings(TableNode $body):void {
$this->setResponse($this->createPublicLinkShare($this->currentUser, $body));
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^the user has created a public link share with settings$/
*
* @param TableNode $body
*
* @return void
* @throws Exception
*/
public function theUserHasCreatedAPublicLinkShareWithSettings(TableNode $body):void {
$response = $this->createPublicLinkShare($this->currentUser, $body);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @param string $user
* @param string $path
* @param boolean $publicUpload
* @param string|null $sharePassword
* @param string|int|string[]|int[]|null $permissions
* @param string|null $linkName
* @param string|null $expireDate
*
* @return ResponseInterface
*/
public function createAPublicShare(
string $user,
string $path,
bool $publicUpload = false,
string $sharePassword = null,
$permissions = null,
?string $linkName = null,
?string $expireDate = null
): ResponseInterface {
return $this->createShare(
$user,
$path,
'public_link',
null, // shareWith
$publicUpload,
$sharePassword,
$permissions,
$linkName,
$expireDate
);
}
/**
* @When /^user "([^"]*)" creates a public link share of (?:file|folder) "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userCreatesAPublicLinkShareOf(string $user, string $path):void {
$response = $this->createAPublicShare($user, $path);
$this->setResponse($response);
}
/**
* @Given /^user "([^"]*)" has created a public link share of (?:file|folder) "([^"]*)"$/
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userHasCreatedAPublicLinkShareOf(string $user, string $path):void {
$response = $this->createAPublicShare($user, $path);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @When /^user "([^"]*)" creates a public link share of (?:file|folder) "([^"]*)" using the sharing API with (read|update|create|delete|change|uploadwriteonly|share|all) permission(?:s|)$/
*
* @param string $user
* @param string $path
* @param string|int|string[]|int[]|null $permissions
*
* @return void
*/
public function userCreatesAPublicLinkShareOfWithPermission(
string $user,
string $path,
$permissions
):void {
$response = $this->createAPublicShare($user, $path, true, null, $permissions);
$this->setResponse($response);
}
/**
* @Given /^user "([^"]*)" has created a public link share of (?:file|folder) "([^"]*)" with (read|update|create|delete|change|uploadwriteonly|share|all) permission(?:s|)$/
*
* @param string $user
* @param string $path
* @param string|int|string[]|int[]|null $permissions
*
* @return void
*/
public function userHasCreatedAPublicLinkShareOfWithPermission(
string $user,
string $path,
$permissions
):void {
$response = $this->createAPublicShare($user, $path, true, null, $permissions);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @param string $user
* @param string $path
* @param string $expiryDate in a valid date format, e.g. "+30 days"
*
* @return void
*/
public function createPublicLinkShareOfResourceWithExpiry(
string $user,
string $path,
string $expiryDate
):void {
$this->createAPublicShare(
$user,
$path,
true,
null,
null,
null,
$expiryDate
);
}
/**
* @When /^user "([^"]*)" creates a public link share of (?:file|folder) "([^"]*)" using the sharing API with expiry "([^"]*)"$/
*
* @param string $user
* @param string $path
* @param string $expiryDate in a valid date format, e.g. "+30 days"
*
* @return void
*/
public function userCreatesAPublicLinkShareOfWithExpiry(
string $user,
string $path,
string $expiryDate
):void {
$this->createPublicLinkShareOfResourceWithExpiry(
$user,
$path,
$expiryDate
);
}
/**
* @Given /^user "([^"]*)" has created a public link share of (?:file|folder) "([^"]*)" with expiry "([^"]*)"$/
*
* @param string $user
* @param string $path
* @param string $expiryDate in a valid date format, e.g. "+30 days"
*
* @return void
*/
public function userHasCreatedAPublicLinkShareOfWithExpiry(
string $user,
string $path,
string $expiryDate
):void {
$this->createPublicLinkShareOfResourceWithExpiry(
$user,
$path,
$expiryDate
);
$this->theHTTPStatusCodeShouldBeSuccess();
}
/**
* @Then /^user "([^"]*)" should not be able to create a public link share of (?:file|folder) "([^"]*)" using the sharing API$/
*
* @param string $sharer
* @param string $filepath
*
* @return void
* @throws Exception
*/
public function shouldNotBeAbleToCreatePublicLinkShare(string $sharer, string $filepath):void {
$this->createAPublicShare($sharer, $filepath);
Assert::assertEquals(
404,
$this->ocsContext->getOCSResponseStatusCode($this->response),
__METHOD__
. " Expected response status code is '404' but got '"
. $this->ocsContext->getOCSResponseStatusCode($this->response)
. "'"
);
}
/**
* @param TableNode|null $body
*
* @return ResponseInterface
* @throws Exception
*/
public function updateLastShareByCurrentUser(?TableNode $body):ResponseInterface {
return $this->updateLastShareWithSettings($this->currentUser, $body);
}
/**
* @When /^the user updates the last share using the sharing API with$/
*
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function theUserUpdatesTheLastShareWith(?TableNode $body):void {
$this->setResponse($this->updateLastShareByCurrentUser($body));
}
/**
* @Given /^the user has updated the last share with$/
*
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function theUserHasUpdatedTheLastShareWith(?TableNode $body):void {
$response = $this->updateLastShareByCurrentUser($body);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* Gets the last user share id using the sharer's name
*
* @param string|null $user
*
* @return string
* @throws Exception
*/
public function getLastCreatedUserGroupShareId(?string $user = null): string {
if ($user === null) {
$shareId = $this->isUsingSharingNG() ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShare()->id;
return (string) $shareId;
}
$createdShares = $this->getCreatedUserGroupShares();
if (isset($createdShares[$user])) {
return (string) $createdShares[$user]->id;
}
throw new Exception(__METHOD__ . " user '$user' doesn't have a share in the created shares list");
}
/**
* @param string $user
* @param TableNode|null $body
* @param string|null $shareOwner
* @param bool $updateLastPublicLink
*
* @return ResponseInterface
* @throws Exception
*/
public function updateLastShareWithSettings(
string $user,
?TableNode $body,
?string $shareOwner = null,
?bool $updateLastPublicLink = false
):ResponseInterface {
$user = $this->getActualUsername($user);
if ($updateLastPublicLink) {
$share_id = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareID() : (string) $this->getLastCreatedPublicShare()->id;
} else {
if ($shareOwner === null) {
$share_id = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
} else {
$share_id = $this->getLastCreatedUserGroupShareId($shareOwner);
}
}
$this->verifyTableNodeRows(
$body,
[],
$this->shareFields
);
$bodyRows = $body->getRowsHash();
if (\array_key_exists('password', $bodyRows)) {
$bodyRows['password'] = $this->getActualPassword($bodyRows['password']);
}
if (\array_key_exists('permissions', $bodyRows)) {
if (\is_numeric($bodyRows['permissions'])) {
$bodyRows['permissions'] = (int) $bodyRows['permissions'];
} else {
$bodyRows['permissions'] = $this->splitPermissionsString($bodyRows['permissions']);
$bodyRows['permissions'] = SharingHelper::getPermissionSum($bodyRows['permissions']);
}
}
return OcsApiHelper::sendRequest(
$this->getBaseUrl(),
$user,
$this->getPasswordForUser($user),
"PUT",
$this->getSharesEndpointPath("/$share_id"),
$this->getStepLineRef(),
$bodyRows,
$this->ocsApiVersion
);
}
/**
* @When /^user "([^"]*)" updates the last share using the sharing API with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userUpdatesTheLastShareWith(string $user, ?TableNode $body):void {
$this->setResponse($this->updateLastShareWithSettings($user, $body));
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" updates the last public link share using the sharing API with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userUpdatesTheLastPublicLinkShareWith(string $user, ?TableNode $body):void {
$this->response = $this->updateLastShareWithSettings($user, $body, null, true);
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^user "([^"]*)" has updated the last share with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userHasUpdatedTheLastShareWith(string $user, ?TableNode $body):void {
$response = $this->updateLastShareWithSettings($user, $body);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @Given /^user "([^"]*)" has updated the last public link share with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userHasUpdatedTheLastPublicLinkShareWith(string $user, ?TableNode $body):void {
$response = $this->updateLastShareWithSettings($user, $body, null, true);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @Given /^user "([^"]*)" has updated the last share of "([^"]*)" with$/
*
* @param string $user
* @param string $shareOwner
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userHasUpdatedTheLastShareOfWith(string $user, string $shareOwner, ?TableNode $body):void {
$response = $this->updateLastShareWithSettings($user, $body, $shareOwner);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
if ($this->ocsApiVersion == 1) {
$this->ocsContext->theOCSStatusCodeShouldBe("100", "", $response);
} elseif ($this->ocsApiVersion === 2) {
$this->ocsContext->theOCSStatusCodeShouldBe("200", "", $response);
} else {
throw new Exception('Invalid ocs api version used');
}
}
/**
* @param string $user
* @param string|null $path
* @param string|null $shareType
* @param string|null $shareWith
* @param bool|null $publicUpload
* @param string|null $sharePassword
* @param string|int|string[]|int[]|null $permissions
* @param string|null $linkName
* @param string|null $expireDate
* @param string|null $space_ref
* @param string $sharingApp
*
* @return ResponseInterface
* @throws JsonException
* @throws Exception
*/
public function createShare(
string $user,
?string $path = null,
?string $shareType = null,
?string $shareWith = null,
?bool $publicUpload = null,
?string $sharePassword = null,
$permissions = null,
?string $linkName = null,
?string $expireDate = null,
?string $space_ref = null,
string $sharingApp = 'files_sharing'
): ResponseInterface {
$userActual = $this->getActualUsername($user);
if (\is_string($permissions) && !\is_numeric($permissions)) {
$permissions = $this->splitPermissionsString($permissions);
}
$this->waitToCreateShare();
$response = SharingHelper::createShare(
$this->getBaseUrl(),
$userActual,
$this->getPasswordForUser($user),
$path,
$shareType,
$this->getStepLineRef(),
$shareWith,
$publicUpload,
$sharePassword,
$permissions,
$linkName,
$expireDate,
$space_ref,
$this->ocsApiVersion,
$this->sharingApiVersion,
$sharingApp
);
// save the created share data
if (($response->getStatusCode() === 200)
&& \in_array($this->ocsContext->getOCSResponseStatusCode($response), ['100', '200'])
) {
$xmlResponse = $this->getResponseXml($response);
if (isset($xmlResponse->data)) {
$shareData = $xmlResponse->data;
if ($shareType === 'public_link') {
$this->addToCreatedPublicShares($shareData);
} else {
$sharer = (string) $xmlResponse->data->uid_owner;
$this->addToCreatedUserGroupshares($sharer, $shareData);
}
}
}
$this->localLastShareTime = \microtime(true);
return $response;
}
/**
* @param string $field
* @param string $value
* @param string $contentExpected
* @param bool $expectSuccess if true then the caller expects that the field
* has the expected content
* emit debugging information if the field is not as expected
*
* @return bool
*/
public function doesFieldValueMatchExpectedContent(
string $field,
string $value,
string $contentExpected,
bool $expectSuccess = true
):bool {
if (($contentExpected === "ANY_VALUE")
|| (($contentExpected === "A_TOKEN") && (\strlen($value) === 15))
|| (($contentExpected === "A_NUMBER") && \is_numeric($value))
|| (($contentExpected === "A_STRING") && $value !== "")
|| (($contentExpected === "AN_URL") && $this->isAPublicLinkUrl($value))
|| (($field === 'remote') && (\rtrim($value, "/") === $contentExpected))
|| ($contentExpected === $value)
) {
if (!$expectSuccess) {
echo $field . " is unexpectedly set with value '" . $value . "'\n";
}
return true;
}
return false;
}
/**
* @param string $field
* @param string|null $contentExpected
* @param bool $expectSuccess if true then the caller expects that the field
* is in the response with the expected content
* so emit debugging information if the field is not correct
* @param SimpleXMLElement|null $data
*
* @return bool
* @throws Exception
*/
public function isFieldInResponse(string $field, ?string $contentExpected, bool $expectSuccess = true, ?SimpleXMLElement $data = null):bool {
if ($data === null) {
$data = $this->getResponseXml(null, __METHOD__)->data[0];
}
Assert::assertIsObject($data, __METHOD__ . " data not found in response XML");
$dateFieldsArrayToConvert = ['original_date', 'new_date'];
//do not try to convert empty date
if ((string) \in_array($field, \array_merge($dateFieldsArrayToConvert)) && !empty($contentExpected)) {
$timestamp = \strtotime($contentExpected, $this->getServerShareTimeFromLastResponse());
// strtotime returns false if it failed to parse, just leave it as it is in that condition
if ($timestamp !== false) {
$contentExpected
= \date(
'Y-m-d',
$timestamp
) . " 00:00:00";
}
}
$contentExpected = (string) $contentExpected;
if (\count($data->element) > 0) {
$fieldIsSet = false;
$value = "";
foreach ($data as $element) {
if (isset($element->$field)) {
$fieldIsSet = true;
$value = (string) $element->$field;
// convert expiration to Y-m-d format. bug #5424
if ($field === "expiration") {
$value = (preg_split("/[\sT]+/", $value))[0];
}
if ($this->doesFieldValueMatchExpectedContent(
$field,
$value,
$contentExpected,
$expectSuccess
)
) {
return true;
}
}
}
} else {
$fieldIsSet = isset($data->$field);
if ($fieldIsSet) {
$value = (string) $data->$field;
if ($this->doesFieldValueMatchExpectedContent(
$field,
$value,
$contentExpected,
$expectSuccess
)
) {
return true;
}
}
}
if ($expectSuccess) {
if ($fieldIsSet) {
echo $field . " has unexpected value '" . $value . "'\n";
} else {
echo $field . " is not set in response\n";
}
}
return false;
}
/**
* @Then no files or folders should be included in the response
*
* @return void
*/
public function checkNoFilesFoldersInResponse():void {
$data = $this->getResponseXml(null, __METHOD__)->data[0];
Assert::assertIsObject($data, __METHOD__ . " data not found in response XML");
Assert::assertCount(0, $data);
}
/**
* @Then exactly :count file/files or folder/folders should be included in the response
*
* @param string $count
*
* @return void
*/
public function checkCountFilesFoldersInResponse(string $count):void {
$count = (int) $count;
$data = $this->getResponseXml(null, __METHOD__)->data[0];
Assert::assertIsObject($data, __METHOD__ . " data not found in response XML");
Assert::assertCount($count, $data, __METHOD__ . " the response does not contain $count entries");
}
/**
* @Then /^(?:file|folder|entry) "([^"]*)" should be included in the response$/
*
* @param string $filename
*
* @return void
* @throws Exception
*/
public function checkSharedFileInResponse(string $filename):void {
$filename = "/" . \ltrim($filename, '/');
Assert::assertTrue(
$this->isFieldInResponse('file_target', "$filename"),
"'file_target' value '$filename' was not found in response"
);
}
/**
* @Then /^(?:file|folder|entry) "([^"]*)" should not be included in the response$/
*
* @param string $filename
*
* @return void
* @throws Exception
*/
public function checkSharedFileNotInResponse(string $filename):void {
$filename = "/" . \ltrim($filename, '/');
Assert::assertFalse(
$this->isFieldInResponse('file_target', "$filename", false),
"'file_target' value '$filename' was unexpectedly found in response"
);
}
/**
* @Then /^(?:file|folder|entry) "([^"]*)" should be included as path in the response$/
*
* @param string $filename
*
* @return void
* @throws Exception
*/
public function checkSharedFileAsPathInResponse(string $filename):void {
$filename = "/" . \ltrim($filename, '/');
Assert::assertTrue(
$this->isFieldInResponse('path', "$filename"),
"'path' value '$filename' was not found in response"
);
}
/**
* @Then /^(?:file|folder|entry) "([^"]*)" should not be included as path in the response$/
*
* @param string $filename
*
* @return void
* @throws Exception
*/
public function checkSharedFileAsPathNotInResponse(string $filename):void {
$filename = "/" . \ltrim($filename, '/');
Assert::assertFalse(
$this->isFieldInResponse('path', "$filename", false),
"'path' value '$filename' was unexpectedly found in response"
);
}
/**
* @Then /^(user|group) "([^"]*)" should be included in the response$/
*
* @param string $type
* @param string $user
*
* @return void
* @throws Exception
*/
public function checkSharedUserOrGroupInResponse(string $type, string $user):void {
if ($type === 'user') {
$user = $this->getActualUsername($user);
}
Assert::assertTrue(
$this->isFieldInResponse('share_with', "$user"),
"'share_with' value '$user' was not found in response"
);
}
/**
* @Then /^user "([^"]*)" should not be included in the response$/
* @Then /^group "([^"]*)" should not be included in the response$/
*
* @param string $userOrGroup
*
* @return void
* @throws Exception
*/
public function checkSharedUserOrGroupNotInResponse(string $userOrGroup):void {
Assert::assertFalse(
$this->isFieldInResponse('share_with', "$userOrGroup", false),
"'share_with' value '$userOrGroup' was unexpectedly found in response"
);
}
/**
*
* @param string $sharer
* @param string $filepath
* @param string $sharee
* @param string|int|string[]|int[] $permissions
*
* @return ResponseInterface
*/
public function createAUserShare(
string $sharer,
string $filepath,
string $sharee,
$permissions = null
): ResponseInterface {
return $this->createShare(
$sharer,
$filepath,
'0',
$this->getActualUsername($sharee),
null,
null,
$permissions
);
}
/**
* @When /^user "([^"]*)" shares (?:file|folder|entry) "([^"]*)" with user "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @When /^user "([^"]*)" shares (?:file|folder|entry) "([^"]*)" with user "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $sharer
* @param string $filepath
* @param string $sharee
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function userSharesFileWithUserUsingTheSharingApi(
string $sharer,
string $filepath,
string $sharee,
$permissions = null
):void {
$response = $this->createAUserShare(
$sharer,
$filepath,
$this->getActualUsername($sharee),
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" shares the following (?:files|folders|entries) with user "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @When /^user "([^"]*)" shares the following (?:files|folders|entries) with user "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $sharer
* @param string $sharee
* @param TableNode $table
* @param string|int|string[]|int[] $permissions
*
* @return void
* @throws Exception
*/
public function userSharesTheFollowingFilesWithUserUsingTheSharingApi(
string $sharer,
string $sharee,
TableNode $table,
$permissions = null
):void {
$this->verifyTableNodeColumns($table, ["path"]);
$paths = $table->getHash();
foreach ($paths as $filepath) {
$response = $this->createAUserShare(
$sharer,
$filepath["path"],
$this->getActualUsername($sharee),
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
}
/**
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with user "([^"]*)"(?: with permissions (\d+))?$/
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with user "([^"]*)" with permissions "([^"]*)"$/
*
* @param string $sharer
* @param string $filepath
* @param string $sharee
* @param string|int|string[]|int[] $permissions
*
* @return void
* @throws Exception
*/
public function userHasSharedFileWithUserUsingTheSharingApi(
string $sharer,
string $filepath,
string $sharee,
$permissions = null
):void {
$response = $this->createAUserShare(
$sharer,
$filepath,
$this->getActualUsername($sharee),
$permissions
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with the administrator(?: with permissions (\d+))?$/
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with the administrator with permissions "([^"]*)"$/
*
* @param string $sharer
* @param string $filepath
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function userHasSharedFileWithTheAdministrator(
string $sharer,
string $filepath,
$permissions = null
):void {
$admin = $this->getAdminUsername();
$response = $this->createAUserShare(
$sharer,
$filepath,
$this->getActualUsername($admin),
$permissions
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @When /^the user shares (?:file|folder|entry) "([^"]*)" with user "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @When /^the user shares (?:file|folder|entry) "([^"]*)" with user "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $filepath
* @param string $user2
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function theUserSharesFileWithUserUsingTheSharingApi(
string $filepath,
string $user2,
$permissions = null
) {
$response = $this->createAUserShare(
$this->getCurrentUser(),
$filepath["path"],
$this->getActualUsername($user2),
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^the user has shared (?:file|folder|entry) "([^"]*)" with user "([^"]*)"(?: with permissions (\d+))?$/
* @Given /^the user has shared (?:file|folder|entry) "([^"]*)" with user "([^"]*)" with permissions "([^"]*)"$/
*
* @param string $filepath
* @param string $user2
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function theUserHasSharedFileWithUserUsingTheSharingApi(
string $filepath,
string $user2,
$permissions = null
):void {
$user2 = $this->getActualUsername($user2);
$response = $this->createAUserShare(
$this->getCurrentUser(),
$filepath,
$this->getActualUsername($user2),
$permissions
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @When /^the user shares (?:file|folder|entry) "([^"]*)" with group "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @When /^the user shares (?:file|folder|entry) "([^"]*)" with group "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $filepath
* @param string $group
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function theUserSharesFileWithGroupUsingTheSharingApi(
string $filepath,
string $group,
$permissions = null
):void {
$response = $this->createAGroupShare(
$this->currentUser,
$filepath,
$group,
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^the user has shared (?:file|folder|entry) "([^"]*)" with group "([^"]*)"(?: with permissions (\d+))?$/
* @Given /^the user has shared (?:file|folder|entry) "([^"]*)" with group "([^"]*)" with permissions "([^"]*)"$/
*
* @param string $filepath
* @param string $group
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function theUserHasSharedFileWithGroupUsingTheSharingApi(
string $filepath,
string $group,
$permissions = null
):void {
$response = $this->createAGroupShare(
$this->currentUser,
$filepath,
$group,
$permissions
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
*
* @param string $user
* @param string $filepath
* @param string $group
* @param string|int|string[]|int[] $permissions
*
* @return ResponseInterface
*/
public function createAGroupShare(
string $user,
string $filepath,
string$group,
$permissions = null
): ResponseInterface {
return $this->createShare(
$user,
$filepath,
'1',
$group,
null,
null,
$permissions
);
}
/**
* @When /^user "([^"]*)" shares (?:file|folder|entry) "([^"]*)" with group "([^"]*)" with permissions "([^"]*)" using the sharing API$/
* @When /^user "([^"]*)" shares (?:file|folder|entry) "([^"]*)" with group "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
*
* @param string $user
* @param string $filepath
* @param string $group
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function userSharesFileWithGroupUsingTheSharingApi(
string $user,
string $filepath,
string $group,
$permissions = null
) {
$response = $this->createAGroupShare(
$user,
$filepath,
$group,
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" shares the following (?:files|folders|entries) with group "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @When /^user "([^"]*)" shares the following (?:files|folders|entries) with group "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $group
* @param TableNode $table
* @param string|int|string[]|int[] $permissions
*
* @return void
* @throws Exception
*/
public function userSharesTheFollowingFilesWithGroupUsingTheSharingApi(
string $user,
string $group,
TableNode $table,
$permissions = null
) {
$this->verifyTableNodeColumns($table, ["path"]);
$paths = $table->getHash();
foreach ($paths as $filepath) {
$response = $this->createAGroupShare(
$user,
$filepath["path"],
$group,
$permissions
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
}
/**
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with group "([^"]*)" with permissions "([^"]*)"$/
* @Given /^user "([^"]*)" has shared (?:file|folder|entry) "([^"]*)" with group "([^"]*)"(?: with permissions (\d+))?$/
*
* @param string $user
* @param string $filepath
* @param string $group
* @param string|int|string[]|int[] $permissions
*
* @return void
*/
public function userHasSharedFileWithGroupUsingTheSharingApi(
string $user,
string $filepath,
string $group,
$permissions = null
) {
$response = $this->createAGroupShare(
$user,
$filepath,
$group,
$permissions
);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @When /^user "([^"]*)" tries to update the last share using the sharing API with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userTriesToUpdateTheLastShareUsingTheSharingApiWith(string $user, ?TableNode $body):void {
$this->response = $this->updateLastShareWithSettings($user, $body);
}
/**
* @When /^user "([^"]*)" tries to update the last public link share using the sharing API with$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function userTriesToUpdateTheLastPublicLinkShareUsingTheSharingApiWith(string $user, ?TableNode $body):void {
$this->response = $this->updateLastShareWithSettings($user, $body, null, true);
}
/**
* @Then /^user "([^"]*)" should not be able to share (?:file|folder|entry) "([^"]*)" with (user|group) "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @Then /^user "([^"]*)" should not be able to share (?:file|folder|entry) "([^"]*)" with (user|group) "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $sharer
* @param string $filepath
* @param string $userOrGroupShareType
* @param string $sharee
* @param string|int|string[]|int[] $permissions
*
* @return void
* @throws Exception
*/
public function userTriesToShareFileUsingTheSharingApi(
string $sharer,
string $filepath,
string $userOrGroupShareType,
string $sharee,
$permissions = null
):void {
$sharee = $this->getActualUsername($sharee);
$response = $this->createShare(
$sharer,
$filepath,
$userOrGroupShareType,
$sharee,
null,
null,
$permissions
);
$statusCode = $this->ocsContext->getOCSResponseStatusCode($response);
Assert::assertTrue(
($statusCode == 404) || ($statusCode == 403),
"Sharing should have failed with status code 403 or 404 but got status code $statusCode"
);
}
/**
* @Then /^user "([^"]*)" should be able to share (?:file|folder|entry) "([^"]*)" with (user|group) "([^"]*)"(?: with permissions (\d+))? using the sharing API$/
* @Then /^user "([^"]*)" should be able to share (?:file|folder|entry) "([^"]*)" with (user|group) "([^"]*)" with permissions "([^"]*)" using the sharing API$/
*
* @param string $sharer
* @param string $filepath
* @param string $userOrGroupShareType
* @param string $sharee
* @param string|int|string[]|int[] $permissions
*
* @return void
* @throws Exception
*/
public function userShouldBeAbleToShareUsingTheSharingApi(
string $sharer,
string $filepath,
string $userOrGroupShareType,
string $sharee,
$permissions = null
):void {
$sharee = $this->getActualUsername($sharee);
$response = $this->createShare(
$sharer,
$filepath,
$userOrGroupShareType,
$sharee,
null,
null,
$permissions
);
$statusCode = $this->ocsContext->getOCSResponseStatusCode($response);
Assert::assertTrue(
($statusCode == 100) || ($statusCode == 200),
"Sharing should be successful but got ocs status code $statusCode"
);
}
/**
* @When /^the user deletes the last share using the sharing API$/
*
* @return void
*/
public function theUserDeletesLastShareUsingTheSharingAPI():void {
$this->setResponse($this->deleteLastShareUsingSharingApiByCurrentUser());
}
/**
* @Given /^the user has deleted the last share$/
*
* @return void
*/
public function theUserHasDeletedLastShareUsingTheSharingAPI():void {
$response = $this->deleteLastShareUsingSharingApiByCurrentUser();
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @param string $user the user who will do the delete request
* @param string|null $sharer the specific user whose share will be deleted (if specified)
* @param bool $deleteLastPublicLink
*
* @return ResponseInterface
*/
public function deleteLastShareUsingSharingApi(string $user, string $sharer = null, bool $deleteLastPublicLink = false):ResponseInterface {
$user = $this->getActualUsername($user);
if ($deleteLastPublicLink) {
$shareId = (string) $this->getLastCreatedPublicShare()->id;
} else {
if ($sharer === null) {
$shareId = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
} else {
$shareId = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId($sharer);
}
}
$url = $this->getSharesEndpointPath("/$shareId");
return $this->ocsContext->sendRequestToOcsEndpoint(
$user,
"DELETE",
$url
);
}
/**
* @return ResponseInterface
*/
public function deleteLastShareUsingSharingApiByCurrentUser():ResponseInterface {
return $this->deleteLastShareUsingSharingApi($this->currentUser);
}
/**
* @When /^user "([^"]*)" deletes the last share using the sharing API$/
* @When /^user "([^"]*)" tries to delete the last share using the sharing API$/
*
* @param string $user
*
* @return void
*/
public function userDeletesLastShareUsingTheSharingApi(string $user):void {
$this->setResponse($this->deleteLastShareUsingSharingApi($user));
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" deletes the last public link share using the sharing API$/
* @When /^user "([^"]*)" tries to delete the last public link share using the sharing API$/
*
* @param string $user
*
* @return void
*/
public function userDeletesLastPublicLinkShareUsingTheSharingApi(string $user):void {
$this->setResponse($this->deleteLastShareUsingSharingApi($user, null, true));
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" deletes the last share of user "([^"]*)" using the sharing API$/
* @When /^user "([^"]*)" tries to delete the last share of user "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $sharer
*
* @return void
*/
public function userDeletesLastShareOfUserUsingTheSharingApi(string $user, string $sharer):void {
$this->setResponse($this->deleteLastShareUsingSharingApi($user, $sharer));
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^user "([^"]*)" has deleted the last share$/
*
* @param string $user
*
* @return void
*/
public function userHasDeletedLastShareUsingTheSharingApi(string $user):void {
$response = $this->deleteLastShareUsingSharingApi($user);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @param string $user
* @param string $shareType user|group|link
* @param string|null $language
*
* @return ResponseInterface
*/
public function getLastShareInfo(string $user, string $shareType, ?string $language = null): ResponseInterface {
if ($shareType !== "link") {
$shareId = $this->isUsingSharingNg() ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
} else {
$shareId = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareID() : (string) $this->getLastCreatedPublicShare()->id;
}
if ($shareId === null) {
throw new Exception(
__METHOD__ . " last public link share data was not found"
);
}
$language = TranslationHelper::getLanguage($language);
return $this->getShareData($user, $shareId, $language);
}
/**
* @When /^user "([^"]*)" gets the info of the last share in language "([^"]*)" using the sharing API$/
* @When /^user "([^"]*)" gets the info of the last share using the sharing API$/
*
* @param string $user username that requests the information (might not be the user that has initiated the share)
*
* @return void
* @throws Exception
*/
public function userGetsInfoOfLastShareUsingTheSharingApi(string $user):void {
$response = $this->getLastShareInfo($user, "user");
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" gets the info of the last public link share in language "([^"]*)" using the sharing API$/
* @When /^user "([^"]*)" gets the info of the last public link share using the sharing API$/
*
* @param string $user username that requests the information (might not be the user that has initiated the share)
*
* @return void
* @throws Exception
*/
public function userGetsInfoOfLastPublicLinkShareUsingTheSharingApi(string $user):void {
$response = $this->getLastShareInfo($user, "link");
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @Then /^as "([^"]*)" the info about the last share by user "([^"]*)" with user "([^"]*)" should include$/
*
* @param string $requester
* @param string $sharer
* @param string $sharee
* @param TableNode $table
*
* @return void
* @throws Exception
*/
public function asLastShareInfoAboutUserSharingWithUserShouldInclude(
string $requester,
string $sharer,
string $sharee,
TableNode $table
) {
$response = $this->getLastShareInfo($requester, "user");
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
$this->checkTheFieldsOfLastResponseToUser($sharer, $sharee, $table);
}
/**
* Get share data of specific share_id
*
* @param string $user
* @param string $share_id
* @param string|null $language
*
* @return ResponseInterface
*/
public function getShareData(string $user, string $share_id, ?string $language = null):ResponseInterface {
$user = $this->getActualUsername($user);
$url = $this->getSharesEndpointPath("/$share_id");
$headers = [];
if ($language !== null) {
$headers['Accept-Language'] = $language;
}
return $this->ocsContext->sendRequestToOcsEndpoint(
$user,
"GET",
$url,
null,
null,
$headers
);
}
/**
* @param string $user
*
* @return ResponseInterface
*/
public function getSharedWithMeShares(string $user):ResponseInterface {
$user = $this->getActualUsername($user);
$url = "/apps/files_sharing/api/v1/shares?shared_with_me=true";
return $this->ocsContext->sendRequestToOcsEndpoint(
$user,
'GET',
$url
);
}
/**
* @When user :user gets all the shares shared with him/her using the sharing API
*
* @param string $user
*
* @return void
*/
public function userGetsAllTheSharesSharedWithHimUsingTheSharingApi(string $user):void {
$this->setResponse($this->getSharedWithMeShares($user));
}
/**
* @Then the information about the last share for user :user should include
*
* @param string $user
* @param TableNode $table
*
* @return void
* @throws Exception
*/
public function userGetsTheLastShareSharedWithHimUsingTheSharingApi(string $user, TableNode $table):void {
$user = $this->getActualUsername($user);
$shareId = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
$response = $this->getShareData($user, $shareId);
$this->checkTheFields($user, $table, $response);
}
/**
* @When /^user "([^"]*)" gets the (|pending)\s?(user|group|user and group|public link) shares shared with (?:him|her) using the sharing API$/
*
* @param string $user
* @param string $pending
* @param string $shareType
*
* @return void
*/
public function userGetsFilteredSharesSharedWithHimUsingTheSharingApi(string $user, string $pending, string $shareType):void {
$user = $this->getActualUsername($user);
if ($pending === "pending") {
$pendingClause = "&state=" . SharingHelper::SHARE_STATES['pending'];
} else {
$pendingClause = "";
}
if ($shareType === 'public link') {
$shareType = 'public_link';
}
if ($shareType === 'user and group') {
$rawShareTypes = SharingHelper::SHARE_TYPES['user'] . "," . SharingHelper::SHARE_TYPES['group'];
} else {
$rawShareTypes = SharingHelper::SHARE_TYPES[$shareType];
}
$response = $this->ocsContext->sendRequestToOcsEndpoint(
$user,
'GET',
$this->getSharesEndpointPath(
"?shared_with_me=true" . $pendingClause . "&share_types=" . $rawShareTypes
)
);
$this->setResponse($response);
}
/**
* @When /^user "([^"]*)" gets all the shares shared with (?:him|her|them) that are received as (?:file|folder|entry) "([^"]*)" using the provisioning API$/
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userGetsAllSharesSharedWithHimFromFileOrFolderUsingTheProvisioningApi(string $user, string $path):void {
$user = $this->getActualUsername($user);
$url = "/apps/files_sharing/api/"
. "v$this->sharingApiVersion/shares?shared_with_me=true&path=$path";
$response = $this->ocsContext->sendRequestToOcsEndpoint(
$user,
'GET',
$url
);
$this->setResponse($response);
}
/**
* @param string $user
* @param string|null $endpointPath
*
* @return ResponseInterface
* @throws JsonException
* @throws GuzzleException
*/
public function getAllShares(
string $user,
?string $endpointPath = null
): ResponseInterface {
$user = $this->getActualUsername($user);
return OcsApiHelper::sendRequest(
$this->getBaseUrl(),
$user,
$this->getPasswordForUser($user),
"GET",
$this->getSharesEndpointPath($endpointPath),
$this->getStepLineRef(),
[],
$this->ocsApiVersion
);
}
/**
* @When /^user "([^"]*)" gets all shares shared by (?:him|her) using the sharing API$/
*
* @param string $user
*
* @return void
*/
public function userGetsAllSharesSharedByHimUsingTheSharingApi(string $user):void {
$this->setResponse($this->getAllshares($user));
}
/**
* @When /^the administrator gets all shares shared by (?:him|her) using the sharing API$/
*
* @return void
*/
public function theAdministratorGetsAllSharesSharedByHimUsingTheSharingApi():void {
$this->setResponse($this->getAllShares($this->getAdminUsername()));
}
/**
* @When /^user "([^"]*)" gets the (user|group|user and group|public link) shares shared by (?:him|her) using the sharing API$/
*
* @param string $user
* @param string $shareType
*
* @return void
*/
public function userGetsFilteredSharesSharedByHimUsingTheSharingApi(string $user, string $shareType):void {
if ($shareType === 'public link') {
$shareType = 'public_link';
}
if ($shareType === 'user and group') {
$rawShareTypes = SharingHelper::SHARE_TYPES['user'] . "," . SharingHelper::SHARE_TYPES['group'];
} else {
$rawShareTypes = SharingHelper::SHARE_TYPES[$shareType];
}
$this->setResponse($this->getAllShares($user, "?share_types=" . $rawShareTypes));
}
/**
* @When user :user gets all the shares of the file :path using the sharing API
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userGetsAllTheSharesFromTheFileUsingTheSharingApi(string $user, string $path):void {
$this->setResponse($this->getAllShares($user, "?path=$path"));
}
/**
* @When user :user gets all the shares with reshares of the file :path using the sharing API
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userGetsAllTheSharesWithResharesFromTheFileUsingTheSharingApi(
string $user,
string $path
):void {
$this->setResponse($this->getAllShares($user, "?reshares=true&path=$path"));
}
/**
* @When user :user gets all the shares inside the folder :path using the sharing API
*
* @param string $user
* @param string $path
*
* @return void
*/
public function userGetsAllTheSharesInsideTheFolderUsingTheSharingApi(string $user, string $path):void {
$this->setResponse($this->getAllShares($user, "?path=$path&subfiles=true"));
}
/**
* @Then /^the response when user "([^"]*)" gets the info of the last share should include$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function theResponseWhenUserGetsInfoOfLastShareShouldInclude(
string $user,
?TableNode $body
):void {
$user = $this->getActualUsername($user);
$this->verifyTableNodeRows($body, [], $this->shareResponseFields);
$share_id = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
$response = $this->getShareData($user, $share_id);
$this->theHTTPStatusCodeShouldBe(
200,
"Error getting info of last share for user $user",
$response
);
$this->ocsContext->assertOCSResponseIndicatesSuccess(
__METHOD__ .
' Error getting info of last share for user $user\n' .
$this->ocsContext->getOCSResponseStatusMessage(
$response
) . '"',
$response
);
$this->checkTheFields($user, $body, $response);
}
/**
* @Then /^the response when user "([^"]*)" gets the info of the last public link share should include$/
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function theResponseWhenUserGetsInfoOfLastPublicLinkShareShouldInclude(
string $user,
?TableNode $body
):void {
$user = $this->getActualUsername($user);
$this->verifyTableNodeRows($body, [], $this->shareResponseFields);
$this->getShareData($user, (string) $this->getLastCreatedPublicShare()->id);
$this->theHTTPStatusCodeShouldBe(
200,
"Error getting info of last public link share for user $user"
);
$this->ocsContext->assertOCSResponseIndicatesSuccess(
__METHOD__ .
' Error getting info of last public link share for user $user\n' .
$this->ocsContext->getOCSResponseStatusMessage(
$this->getResponse()
) . '"'
);
$this->checkTheFields($user, $body);
}
/**
* @Then the information of the last share of user :user should include
*
* @param string $user
* @param TableNode $body
*
* @return void
* @throws Exception
*/
public function informationOfLastShareShouldInclude(
string $user,
TableNode $body
):void {
$user = $this->getActualUsername($user);
$shareId = $this->getLastCreatedUserGroupShareId($user);
$this->getShareData($user, $shareId);
$this->theHTTPStatusCodeShouldBe(
200,
"Error getting info of last share for user $user with share id $shareId"
);
$this->verifyTableNodeRows($body, [], $this->shareResponseFields);
$this->checkTheFields($user, $body);
}
/**
* @Then /^the information for user "((?:[^']*)|(?:[^"]*))" about the received share of (file|folder) "((?:[^']*)|(?:[^"]*))" shared with a (user|group) should include$/
*
* @param string $user
* @param string $fileOrFolder
* @param string $fileName
* @param string $type
* @param TableNode $body should provide share_type
*
* @return void
* @throws Exception
*/
public function theFieldsOfTheResponseForUserForResourceShouldInclude(
string $user,
string $fileOrFolder,
string $fileName,
string $type,
TableNode $body
):void {
$user = $this->getActualUsername($user);
$this->verifyTableNodeColumnsCount($body, 2);
$fileName = $fileName[0] === "/" ? $fileName : '/' . $fileName;
$data = $this->getAllSharesSharedWithUser($user);
Assert::assertNotEmpty($data, 'No shares found for ' . $user);
$bodyRows = $body->getRowsHash();
Assert::assertArrayHasKey('share_type', $bodyRows, 'share_type is not provided');
$share_id = null;
foreach ($data as $share) {
if ($share['file_target'] === $fileName && $share['item_type'] === $fileOrFolder) {
if (($share['share_type'] === SharingHelper::getShareType($bodyRows['share_type']))
) {
$share_id = $share['id'];
}
}
}
Assert::assertNotNull($share_id, "Could not find share id for " . $user);
if (\array_key_exists('expiration', $bodyRows) && $bodyRows['expiration'] !== '') {
$bodyRows['expiration'] = \date('d-m-Y', \strtotime($bodyRows['expiration']));
}
$this->getShareData($user, $share_id);
foreach ($bodyRows as $field => $value) {
if ($type === "user" && $field == "share_with") {
$value = $this->getActualUsername($value);
}
if ($field == "uid_owner") {
$value = $this->getActualUsername($value);
}
$value = $this->replaceValuesFromTable($field, $value);
Assert::assertTrue(
$this->isFieldInResponse($field, $value),
"$field doesn't have value '$value'"
);
}
}
/**
* @Then /^the last share_id should be included in the response/
*
* @return void
* @throws Exception
*/
public function checkingLastShareIDIsIncluded():void {
$shareId = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
if (!$this->isFieldInResponse('id', $shareId)) {
Assert::fail(
"Share id $shareId not found in response"
);
}
}
/**
* @Then /^the last share id should not be included in the response/
*
* @return void
* @throws Exception
*/
public function checkLastShareIDIsNotIncluded():void {
$shareId = $this->isUsingSharingNG() ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
if ($this->isFieldInResponse('id', $shareId, false)) {
Assert::fail(
"Share id $shareId has been found in response"
);
}
}
/**
* @Then /^the last public link share id should not be included in the response/
*
* @return void
* @throws Exception
*/
public function checkLastPublicLinkShareIDIsNotIncluded():void {
$shareId = (string) $this->getLastCreatedPublicShare()->id;
if ($this->isFieldInResponse('id', $shareId, false)) {
Assert::fail(
"Public link share id $shareId has been found in response"
);
}
}
/**
*
* @param ResponseInterface $response
*
* @return void
*/
public function responseShouldNotContainAnyShareIds(ResponseInterface $response):void {
$data = $this->getResponseXml($response, __METHOD__)->data[0];
$fieldIsSet = false;
$receivedShareCount = 0;
if (\count($data->element) > 0) {
foreach ($data as $element) {
if (isset($element->id)) {
$fieldIsSet = true;
$receivedShareCount += 1;
}
}
} else {
if (isset($data->id)) {
$fieldIsSet = true;
$receivedShareCount += 1;
}
}
Assert::assertFalse(
$fieldIsSet,
"response contains $receivedShareCount share ids but should not contain any share ids"
);
}
/**
* @Then user :user should not see the share id of the last share
*
* @param string $user
*
* @return void
* @throws Exception
*/
public function userShouldNotSeeShareIdOfLastShare(string $user):void {
$response = $this->getSharedWithMeShares($user);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$shareId = $this->isUsingSharingNG() ? $this->shareNgGetLastCreatedUserGroupShareID() : $this->getLastCreatedUserGroupShareId();
if ($this->isFieldInResponse('id', $shareId, false)) {
Assert::fail(
"Share id $shareId has been found in response"
);
}
}
/**
* @Then user :user should not have any received shares
*
* @param string $user
*
* @return void
*/
public function userShouldNotHaveAnyReceivedShares(string $user):void {
$response = $this->getSharedWithMeShares($user);
$this->theHTTPStatusCodeShouldBe(200, "", $response);
$this->responseShouldNotContainAnyShareIds($response);
}
/**
* @Then /^the response should contain ([0-9]+) entries$/
*
* @param int $count
*
* @return void
*/
public function checkingTheResponseEntriesCount(int $count):void {
$actualCount = \count($this->getResponseXml(null, __METHOD__)->data[0]);
Assert::assertEquals(
$count,
$actualCount,
"Expected that the response should contain '$count' entries but got '$actualCount' entries"
);
}
/**
* @Then the fields of the last response to user :user should include
*
* @param string $user
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function checkFields(string $user, ?TableNode $body):void {
$this->checkTheFields($user, $body);
}
/**
* @param string $user
* @param TableNode|null $body
* @param ResponseInterface|null $response
*
* @return void
*/
public function checkTheFields(string $user, ?TableNode $body, ?ResponseInterface $response = null):void {
$response = $response ?? $this->getResponse();
$data = $this->getResponseXml($response, __METHOD__)->data[0];
$this->verifyTableNodeColumnsCount($body, 2);
$bodyRows = $body->getRowsHash();
$userRelatedFieldNames = [
"owner",
"user",
"uid_owner",
"uid_file_owner",
"share_with",
"displayname_file_owner",
"displayname_owner",
"additional_info_owner",
"additional_info_file_owner"
];
foreach ($bodyRows as $field => $value) {
if (\in_array($field, $userRelatedFieldNames)) {
$value = $this->substituteInLineCodes($value, $user);
}
$value = $this->getActualUsername($value);
$value = $this->replaceValuesFromTable($field, $value);
Assert::assertTrue(
$this->isFieldInResponse($field, $value, true, $data),
"$field doesn't have value '$value'",
);
}
}
/**
* @Then the fields of the last response to user :user and space :space should include
*
* @param string $user
* @param string $space
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function checkFieldsOfSpaceSharingResponse(string $user, string $space, ?TableNode $body):void {
$this->verifyTableNodeColumnsCount($body, 2);
$bodyRows = $body->getRowsHash();
$userRelatedFieldNames = [
"owner",
"user",
"uid_owner",
"uid_file_owner",
"share_with",
"displayname_file_owner",
"displayname_owner",
"additional_info_owner",
"additional_info_file_owner",
"space_id"
];
$response = $this->getResponseXml(null, __METHOD__);
$this->addToCreatedPublicShares($response->data);
foreach ($bodyRows as $field => $value) {
if (\in_array($field, $userRelatedFieldNames)) {
$value = $this->substituteInLineCodes(
$value,
$user,
[],
[
[
"code" => "%space_id%",
"function" =>
[$this->spacesContext, "getSpaceIdByName"],
"parameter" => [$user, $space]
],
],
null,
null
);
if ($field === "uid_file_owner") {
$value = (explode("$", $value))[1];
}
if ($field === "space_id") {
$explodedSpaceId = explode("$", $value);
$value = $explodedSpaceId[0] . "$" . $explodedSpaceId[1] . "!" . $explodedSpaceId[1];
}
}
$value = $this->getActualUsername($value);
$value = $this->replaceValuesFromTable($field, $value);
Assert::assertTrue(
$this->isFieldInResponse($field, $value, true, $this->getLastCreatedPublicShare()),
"$field doesn't have value '$value'"
);
}
}
/**
* @Then /^the fields of the last response (?:to|about) user "([^"]*)" sharing with (?:user|group) "([^"]*)" should include$/
*
* @param string $sharer
* @param string $sharee
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function checkFieldsOfLastResponseToUser(string $sharer, string $sharee, ?TableNode $body):void {
$this->checkTheFieldsOfLastResponseToUser($sharer, $sharee, $body);
}
/**
* @param string $sharer
* @param string $sharee
* @param TableNode|null $body
*
* @return void
*/
public function checkTheFieldsOfLastResponseToUser(string $sharer, string $sharee, ?TableNode $body):void {
$this->verifyTableNodeColumnsCount($body, 2);
$bodyRows = $body->getRowsHash();
foreach ($bodyRows as $field => $value) {
if (\in_array($field, ["displayname_owner", "displayname_file_owner", "owner", "uid_owner", "uid_file_owner", "additional_info_owner", "additional_info_file_owner"])) {
$value = $this->substituteInLineCodes($value, $sharer);
} elseif (\in_array($field, ["share_with", "share_with_displayname", "user", "share_with_additional_info"])) {
$value = $this->substituteInLineCodes($value, $sharee);
}
$value = $this->replaceValuesFromTable($field, $value);
Assert::assertTrue(
$this->isFieldInResponse($field, $value),
"$field doesn't have value '$value'"
);
}
}
/**
* @Then the last response should be empty
*
* @return void
*/
public function theFieldsOfTheLastResponseShouldBeEmpty():void {
$data = $this->getResponseXml(null, __METHOD__)->data[0];
Assert::assertEquals(
\count($data->element),
0,
"last response contains data but was expected to be empty"
);
}
/**
*
* @return string
*
* @throws Exception
*/
public function getSharingAttributesFromLastResponse():string {
$responseXml = $this->getResponseXml(null, __METHOD__)->data[0];
$actualAttributesElement = $responseXml->xpath('//attributes');
if ($actualAttributesElement) {
$actualAttributes = (array) $actualAttributesElement[0];
if (empty($actualAttributes)) {
throw new Exception(
"No data inside 'attributes' element in the last response."
);
}
return $actualAttributes[0];
}
throw new Exception("No 'attributes' found inside the response of the last share.");
}
/**
* @Then the additional sharing attributes for the response should include
*
* @param TableNode $attributes
*
* @return void
* @throws Exception
*/
public function checkingAttributesInLastShareResponse(TableNode $attributes):void {
$this->verifyTableNodeColumns($attributes, ['scope', 'key', 'enabled']);
$attributes = $attributes->getHash();
// change string "true"/"false" to boolean inside array
\array_walk_recursive(
$attributes,
function (&$value, $key) {
if ($key !== 'enabled') {
return;
}
if ($value === 'true') {
$value = true;
}
if ($value === 'false') {
$value = false;
}
}
);
$actualAttributes = $this->getSharingAttributesFromLastResponse();
// parse json to array
$actualAttributesArray = \json_decode($actualAttributes, true);
if (\json_last_error() !== JSON_ERROR_NONE) {
$errMsg = \strtolower(\json_last_error_msg());
throw new Exception(
"JSON decoding failed because of $errMsg in json\n" .
'Expected data to be json with array of objects. ' .
"\nReceived:\n $actualAttributes"
);
}
// check if the expected attributes received from table match actualAttributes
foreach ($attributes as $row) {
$foundRow = false;
foreach ($actualAttributesArray as $item) {
if (($item['scope'] === $row['scope'])
&& ($item['key'] === $row['key'])
&& ($item['enabled'] === $row['enabled'])
) {
$foundRow = true;
}
}
Assert::assertTrue(
$foundRow,
"Could not find expected attribute with scope '" . $row['scope'] . "' and key '" . $row['key'] . "'"
);
}
}
/**
* @Then the downloading of file :fileName for user :user should fail with error message
*
* @param string $fileName
* @param string $user
* @param PyStringNode $errorMessage
*
* @return void
* @throws Exception
*/
public function userDownloadsFailWithMessage(string $fileName, string $user, PyStringNode $errorMessage):void {
$user = $this->getActualUsername($user);
$response = $this->downloadFileAsUserUsingPassword($user, $fileName);
$receivedErrorMessage = $this->getResponseXml($response, __METHOD__)->xpath('//s:message');
Assert::assertEquals(
$errorMessage,
(string) $receivedErrorMessage[0],
"Expected error message was '$errorMessage' but got '"
. $receivedErrorMessage[0]
. "'"
);
}
/**
* @Then the fields of the last response should not include
*
* @param TableNode|null $body
*
* @return void
* @throws Exception
*/
public function checkFieldsNotInResponse(?TableNode $body):void {
$this->verifyTableNodeColumnsCount($body, 2);
$bodyRows = $body->getRowsHash();
foreach ($bodyRows as $field => $value) {
$value = $this->replaceValuesFromTable($field, $value);
Assert::assertFalse(
$this->isFieldInResponse($field, $value, false),
"$field has value $value but should not"
);
}
}
/**
* Returns shares of a file or folder as a SimpleXMLElement
*
* Note: the "single" SimpleXMLElement may contain one or more actual
* shares (to users, groups or public links etc.). If you access an item directly,
* for example, getShares()->id, then the value of "id" for the first element
* will be returned. To access all the elements, you can loop through the
* returned SimpleXMLElement with "foreach" - it will act like a PHP array
* of elements.
*
* @param string $user
* @param string $path
*
* @return SimpleXMLElement
*/
public function getShares(string $user, string $path):SimpleXMLElement {
$response = OcsApiHelper::sendRequest(
$this->getBaseUrl(),
$user,
$this->getPasswordForUser($user),
"GET",
$this->getSharesEndpointPath("?path=$path"),
$this->getStepLineRef(),
[],
$this->ocsApiVersion
);
return $this->getResponseXml($response, __METHOD__)->data->element;
}
/**
* @Then /^as user "([^"]*)" the public shares of (?:file|folder) "([^"]*)" should be$/
*
* @param string $user
* @param string $path
* @param TableNode|null $TableNode
*
* @return void
* @throws Exception
*/
public function checkPublicShares(string $user, string $path, ?TableNode $TableNode):void {
$user = $this->getActualUsername($user);
$response = $this->getShares($user, $path);
$this->verifyTableNodeColumns($TableNode, ['path', 'permissions', 'name']);
if ($TableNode instanceof TableNode) {
$elementRows = $TableNode->getHash();
foreach ($elementRows as $expectedElementsArray) {
$nameFound = false;
foreach ($response as $elementResponded) {
if ((string) $elementResponded->name[0] === $expectedElementsArray['name']) {
Assert::assertEquals(
$expectedElementsArray['path'],
(string) $elementResponded->path[0],
__METHOD__
. " Expected '{$expectedElementsArray['path']}' but got '"
. $elementResponded->path[0]
. "'"
);
Assert::assertEquals(
$expectedElementsArray['permissions'],
(string) $elementResponded->permissions[0],
__METHOD__
. " Expected '{$expectedElementsArray['permissions']}' but got '"
. $elementResponded->permissions[0]
. "'"
);
$nameFound = true;
break;
}
}
Assert::assertTrue(
$nameFound,
"Shared link name {$expectedElementsArray['name']} not found"
);
}
}
}
/**
* @Then /^as user "([^"]*)" the (?:file|folder) "([^"]*)" should not have any shares$/
*
* @param string $user
* @param string $path
*
* @return void
* @throws Exception
*/
public function checkPublicSharesAreEmpty(string $user, string $path):void {
$user = $this->getActualUsername($user);
$response = $this->getShares($user, $path);
//It shouldn't have public shares
Assert::assertEquals(
0,
\count($response),
__METHOD__
. " As '$user', '$path' was expected to have no shares, but got '"
. \count($response)
. "' shares present"
);
}
/**
* @param string $user
* @param string $path to share
* @param string $name of share
*
* @return string|null
*/
public function getPublicShareIDByName(string $user, string $path, string $name):?string {
$response = $this->getShares($user, $path);
foreach ($response as $elementResponded) {
if ((string) $elementResponded->name[0] === $name) {
return (string) $elementResponded->id[0];
}
}
return null;
}
/**
* @param string $user
* @param string $name
* @param string $path
*
* @return ResponseInterface
*/
public function deletePublicLinkShareUsingTheSharingApi(
string $user,
string $name,
string $path
):ResponseInterface {
$user = $this->getActualUsername($user);
$share_id = $this->getPublicShareIDByName($user, $path, $name);
$url = $this->getSharesEndpointPath("/$share_id");
return $this->ocsContext->sendRequestToOcsEndpoint(
$user,
"DELETE",
$url
);
}
/**
* @When /^user "([^"]*)" deletes public link share named "([^"]*)" in (?:file|folder) "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $name
* @param string $path
*
* @return void
*/
public function userDeletesPublicLinkShareNamedUsingTheSharingApi(
string $user,
string $name,
string $path
):void {
$response = $this->deletePublicLinkShareUsingTheSharingApi(
$user,
$name,
$path
);
$this->setResponse($response);
}
/**
* @Given /^user "([^"]*)" has deleted public link share named "([^"]*)" in (?:file|folder) "([^"]*)"$/
*
* @param string $user
* @param string $name
* @param string $path
*
* @return void
*/
public function userHasDeletedPublicLinkShareNamedUsingTheSharingApi(
string $user,
string $name,
string $path
):void {
$response = $this->deletePublicLinkShareUsingTheSharingApi(
$user,
$name,
$path
);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @param string $user
* @param string $action
* @param string $share
* @param string $offeredBy
* @param string|null $state
*
* @return ResponseInterface
*/
public function reactToShareOfferedBy(string $user, string $action, string $share, string $offeredBy, ?string $state = ''):ResponseInterface {
$user = $this->getActualUsername($user);
$offeredBy = $this->getActualUsername($offeredBy);
$response = $this->getAllSharesSharedWithUser($user);
$shareId = null;
foreach ($response as $shareElement) {
// SharingHelper::SHARE_STATES has the mapping between the words for share states
// like "accepted", "pending",... and the integer constants 0, 1,... that are in
// the "state" field of the share data.
if ($state === '') {
// Any share state is OK
$matchesShareState = true;
} else {
$requiredStateCode = SharingHelper::SHARE_STATES[$state];
if ($shareElement['state'] === $requiredStateCode) {
$matchesShareState = true;
} else {
$matchesShareState = false;
}
}
if ($matchesShareState
&& (string) $shareElement['uid_owner'] === $offeredBy
&& (string) $shareElement['path'] === $share
) {
$shareId = (string) $shareElement['id'];
break;
}
}
Assert::assertNotNull(
$shareId,
__METHOD__ . " could not find share $share, offered by $offeredBy to $user"
);
$url = "/apps/files_sharing/api/v$this->sharingApiVersion" .
"/shares/pending/$shareId";
if (\substr($action, 0, 7) === "decline") {
$httpRequestMethod = "DELETE";
} else {
// do a POST to accept the share
$httpRequestMethod = "POST";
}
return $this->ocsContext->sendRequestToOcsEndpoint(
$user,
$httpRequestMethod,
$url
);
}
/**
* @When /^user "([^"]*)" (declines|accepts) share "([^"]*)" offered by user "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $action
* @param string $share
* @param string $offeredBy
* @param string|null $state specify 'accepted', 'pending', 'rejected' or 'declined' to only consider shares in that state
*
* @return void
* @throws Exception
*/
public function userReactsToShareOfferedBy(string $user, string $action, string $share, string $offeredBy, ?string $state = ''):void {
$response = $this->reactToShareOfferedBy(
$user,
$action,
$share,
$offeredBy
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" (declines|accepts) the already (?:accepted|declined) share "([^"]*)" offered by user "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $action
* @param string $share
* @param string $offeredBy
* @param string|null $state specify 'accepted', 'pending', 'rejected' or 'declined' to only consider shares in that state
*
* @return void
* @throws Exception
*/
public function userAcceptsTheAlreadyAcceptedShareOfferedByUsingTheSharingApi(string $user, string $action, string $share, string $offeredBy, ?string $state = ''):void {
$response = $this->reactToShareOfferedBy(
$user,
$action,
"/Shares/" . \trim($share, "/"),
$offeredBy
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" (declines|accepts) the following shares offered by user "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $action
* @param string $offeredBy
* @param TableNode $table
*
* @return void
* @throws Exception
*/
public function userReactsToTheFollowingSharesOfferedBy(string $user, string $action, string $offeredBy, TableNode $table):void {
$this->verifyTableNodeColumns($table, ["path"]);
$paths = $table->getHash();
foreach ($paths as $share) {
$response = $this->reactToShareOfferedBy(
$user,
$action,
$share["path"],
$offeredBy
);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
$this->pushToLastStatusCodesArrays();
}
/**
* @When /^user "([^"]*)" (declines|accepts) share with ID "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $action
* @param string $share_id
*
* @return void
* @throws Exception
*/
public function userReactsToShareWithShareIDOfferedBy(string $user, string $action, string $share_id):void {
$user = $this->getActualUsername($user);
$shareId = $this->substituteInLineCodes($share_id, $user);
$url = "/apps/files_sharing/api/v$this->sharingApiVersion" .
"/shares/pending/$shareId";
if (\substr($action, 0, 7) === "decline") {
$httpRequestMethod = "DELETE";
} else {
// do a POST to accept the share
$httpRequestMethod = "POST";
}
$response = $this->ocsContext->sendRequestToOcsEndpoint(
$user,
$httpRequestMethod,
$url
);
$this->setResponse($response);
}
/**
* @Given /^user "([^"]*)" has (declined|accepted) share "([^"]*)" offered by user "([^"]*)"$/
*
* @param string $user
* @param string $action
* @param string $share
* @param string $offeredBy
*
* @return void
* @throws Exception
*/
public function userHasReactedToShareOfferedBy(string $user, string $action, string $share, string $offeredBy):void {
$response = $this->reactToShareOfferedBy(
$user,
$action,
$share,
$offeredBy
);
if ($action === 'declined') {
$actionText = 'decline';
} else {
$actionText = 'accept';
}
$this->theHTTPStatusCodeShouldBe(
200,
__METHOD__ . " could not $actionText share $share to $user by $offeredBy",
$response
);
$this->emptyLastHTTPStatusCodesArray();
$this->emptyLastOCSStatusCodesArray();
}
/**
* @When /^user "([^"]*)" accepts the (?:first|next|) pending share "([^"]*)" offered by user "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $share
* @param string $offeredBy
*
* @return void
* @throws Exception
*/
public function userAcceptsThePendingShareOfferedBy(string $user, string $share, string $offeredBy):void {
$response = $this->reactToShareOfferedBy($user, 'accepts', $share, $offeredBy, 'pending');
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @Given /^user "([^"]*)" has accepted the (?:first|next|) pending share "([^"]*)" offered by user "([^"]*)"$/
*
* @param string $user
* @param string $share
* @param string $offeredBy
*
* @return void
* @throws Exception
*/
public function userHasAcceptedThePendingShareOfferedBy(string $user, string $share, string $offeredBy) {
$response = $this->reactToShareOfferedBy($user, 'accepts', $share, $offeredBy, 'pending');
$this->theHTTPStatusCodeShouldBe(
200,
__METHOD__ . " could not accept the pending share $share to $user by $offeredBy",
$response
);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
}
/**
* @Then /^user "([^"]*)" should be able to (decline|accept) pending share "([^"]*)" offered by user "([^"]*)"$/
*
* @param string $user
* @param string $action
* @param string $share
* @param string $offeredBy
*
* @return void
* @throws Exception
*/
public function userShouldBeAbleToAcceptShareOfferedBy(
string $user,
string $action,
string $share,
string $offeredBy
) {
if ($action === 'accept') {
$response = $this->reactToShareOfferedBy($user, 'accepts', $share, $offeredBy, 'pending');
$this->theHTTPStatusCodeShouldBe(
200,
__METHOD__ . " could not accept the pending share $share to $user by $offeredBy",
$response
);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
// $this->ocsContext->assertOCSResponseIndicatesSuccess();
} elseif ($action === 'decline') {
$response = $this->reactToShareOfferedBy($user, 'declined', $share, $offeredBy);
$this->theHTTPStatusCodeShouldBe(
200,
__METHOD__ . " could not decline share $share to $user by $offeredBy",
$response
);
$this->ocsContext->theOCSStatusCodeShouldBe("100,200", "", $response);
// $this->emptyLastHTTPStatusCodesArray();
// $this->emptyLastOCSStatusCodesArray();
}
}
/**
*
* @Then /^the sharing API should report to user "([^"]*)" that these shares are in the (pending|accepted|declined) state$/
*
* @param string $user
* @param string $state
* @param TableNode $table table with headings that correspond to the attributes
* of the share e.g. "|path|uid_owner|"
*
* @return void
* @throws Exception
*/
public function assertSharesOfUserAreInState(string $user, string $state, TableNode $table):void {
$this->verifyTableNodeColumns($table, ["path"], $this->shareResponseFields);
$usersShares = $this->getAllSharesSharedWithUser($user, $state);
foreach ($table as $row) {
$found = false;
//the API returns the path without trailing slash, but we want to
//be able to accept leading and/or trailing slashes in the step definition
$row['path'] = "/" . \trim($row['path'], "/");
foreach ($usersShares as $share) {
try {
Assert::assertArrayHasKey('path', $share);
Assert::assertEquals($row['path'], $share['path']);
$found = true;
break;
} catch (ExpectationFailedException $e) {
}
}
if (!$found) {
Assert::fail(
"could not find the share with this attributes " .
\print_r($row, true)
);
}
}
}
/**
*
* @Then /^the sharing API should report to user "([^"]*)" that no shares are in the (pending|accepted|declined) state$/
*
* @param string $user
* @param string $state
*
* @return void
* @throws Exception
*/
public function assertNoSharesOfUserAreInState(string $user, string $state):void {
$usersShares = $this->getAllSharesSharedWithUser($user, $state);
Assert::assertEmpty(
$usersShares,
"user has " . \count($usersShares) . " share(s) in the $state state"
);
}
/**
* @param string $sharer
* @param string $path
* @param string $sharee
*
* @return ResponseInterface
*/
public function unshareResourceSharedTo(string $sharer, string $path, string $sharee): ResponseInterface {
$sharer = $this->getActualUsername($sharer);
$sharee = $this->getActualUsername($sharee);
$response = $this->getShares($sharer, "$path&share_types=0");
$shareId = null;
foreach ($response as $shareElement) {
if ((string)$shareElement->share_with[0] === $sharee) {
$shareId = (string) $shareElement->id;
break;
}
}
Assert::assertNotNull(
$shareId,
__METHOD__ . " could not find share, offered by $sharer to $sharee"
);
return $this->ocsContext->sendRequestToOcsEndpoint(
$sharer,
'DELETE',
'/apps/files_sharing/api/v' . $this->sharingApiVersion . '/shares/' . $shareId
);
}
/**
* @When /^user "([^"]*)" unshares (?:folder|file|entity) "([^"]*)" shared to "([^"]*)"$/
*
* @param string $sharer
* @param string $path
* @param string $sharee
*
* @return void
* @throws JsonException
*/
public function userUnsharesResourceSharedTo(string $sharer, string $path, string $sharee): void {
$response = $this->unshareResourceSharedTo($sharer, $path, $sharee);
$this->setResponse($response);
}
/**
* @Then the sharing API should report that no shares are shared with user :user
*
* @param string $user
*
* @return void
* @throws Exception
*/
public function assertThatNoSharesAreSharedWithUser(string $user):void {
$usersShares = $this->getAllSharesSharedWithUser($user);
Assert::assertEmpty(
$usersShares,
"user has " . \count($usersShares) . " share(s)"
);
}
/**
* @When user :user gets share with id :share using the sharing API
*
* @param string $user
* @param string $share_id
*
* @return ResponseInterface|null
*/
public function userGetsTheLastShareWithTheShareIdUsingTheSharingApi(string $user, string $share_id): ?ResponseInterface {
$user = $this->getActualUsername($user);
$share_id = $this->substituteInLineCodes($share_id, $user);
$url = $this->getSharesEndpointPath("/$share_id");
$this->response = OcsApiHelper::sendRequest(
$this->getBaseUrl(),
$user,
$this->getPasswordForUser($user),
"GET",
$url,
$this->getStepLineRef(),
[],
$this->ocsApiVersion
);
return $this->response;
}
/**
*
* @param string $user
* @param string|null $state pending|accepted|declined|rejected|all
*
* @return array of shares that are shared with this user
* @throws Exception
*/
private function getAllSharesSharedWithUser(string $user, ?string $state = "all"): array {
switch ($state) {
case 'pending':
case 'accepted':
case 'declined':
case 'rejected':
$stateCode = SharingHelper::SHARE_STATES[$state];
break;
case 'all':
$stateCode = "all";
break;
default:
throw new InvalidArgumentException(
__METHOD__ . ' invalid "state" given'
);
}
$url = $this->getSharesEndpointPath("?format=json&shared_with_me=true&state=$stateCode");
$response = $this->ocsContext->sendRequestToOcsEndpoint(
$user,
"GET",
$url
);
if ($response->getStatusCode() !== 200) {
throw new Exception(
__METHOD__ . " could not retrieve information about shares"
);
}
$result = $response->getBody()->getContents();
$usersShares = \json_decode($result, true);
if (!\is_array($usersShares)) {
throw new Exception(
__METHOD__ . " API result about shares is not valid JSON"
);
}
return $usersShares['ocs']['data'];
}
/**
* Send request for preview of a file in a public link
*
* @param string $fileName
* @param string $token
*
* @return ResponseInterface
*/
public function getPublicPreviewOfFile(string $fileName, string $token):ResponseInterface {
$url = $this->getBaseUrl() .
"/remote.php/dav/public-files/$token/$fileName?preview=1";
return HttpRequestHelper::get(
$url,
$this->getStepLineRef()
);
}
/**
* @When the public accesses the preview of file :path from the last shared public link using the sharing API
*
* @param string $path
*
* @return void
*/
public function thePublicAccessesThePreviewOfTheSharedFileUsingTheSharingApi(string $path):void {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
$response = $this->getPublicPreviewOfFile($path, $token);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
/**
* @When the public accesses the preview of the following files from the last shared public link using the sharing API
*
* @param TableNode $table
*
* @throws Exception
* @return void
*/
public function thePublicAccessesThePreviewOfTheFollowingSharedFileUsingTheSharingApi(
TableNode $table
):void {
$this->verifyTableNodeColumns($table, ["path"]);
$paths = $table->getHash();
$this->emptyLastHTTPStatusCodesArray();
$this->emptyLastOCSStatusCodesArray();
foreach ($paths as $path) {
$token = ($this->isUsingSharingNG()) ? $this->shareNgGetLastCreatedLinkShareToken() : $this->getLastCreatedPublicShareToken();
$response = $this->getPublicPreviewOfFile($path["path"], $token);
$this->setResponse($response);
$this->pushToLastStatusCodesArrays();
}
}
/**
* @param string $user
* @param string $shareServer
* @param string|null $password
*
* @return ResponseInterface
*/
public function saveLastSharedPublicLinkShare(
string $user,
string $shareServer,
?string $password = ""
):ResponseInterface {
$user = $this->getActualUsername($user);
$userPassword = $this->getPasswordForUser($user);
$shareData = $this->getLastCreatedPublicShare();
$owner = (string) $shareData->uid_owner;
$name = $this->encodePath((string) $shareData->file_target);
$name = \trim($name, "/");
$ownerDisplayName = (string) $shareData->displayname_owner;
$token = (string) $shareData->token;
if (\strtolower($shareServer) == "remote") {
$remote = $this->getRemoteBaseUrl();
} else {
$remote = $this->getLocalBaseUrl();
}
$body['remote'] = $remote;
$body['token'] = $token;
$body['owner'] = $owner;
$body['ownerDisplayName'] = $ownerDisplayName;
$body['name'] = $name;
$body['password'] = $password;
Assert::assertNotNull(
$token,
__METHOD__ . " could not find any public share"
);
$url = $this->getBaseUrl() . "/index.php/apps/files_sharing/external";
$response = HttpRequestHelper::post(
$url,
$this->getStepLineRef(),
$user,
$userPassword,
null,
$body
);
return $response;
}
/**
* @Given /^user "([^"]*)" has added the public share created from server "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $shareServer
*
* @return void
*/
public function userHasAddedPublicShareCreatedByUser(string $user, string $shareServer):void {
$this->saveLastSharedPublicLinkShare($user, $shareServer);
$resBody = json_decode($this->response->getBody()->getContents());
$status = '';
$message = '';
if ($resBody) {
$status = $resBody->status;
$message = $resBody->data->message;
}
Assert::assertEquals(
200,
$this->response->getStatusCode(),
__METHOD__
. " Expected status code is '200' but got '"
. $this->response->getStatusCode()
. "'"
);
Assert::assertNotEquals(
'error',
$status,
__METHOD__
. "\nFailed to save public share.\n'$message'"
);
}
/**
* @param string $user
* @param string $path
* @param string $type
* @param int $permissions
*
* @return array
*/
public function preparePublicQuickLinkPayload(string $user, string $path, string $type, int $permissions = 1): array {
return [
"permissions" => $permissions,
"expireDate" => "",
"shareType" => 3,
"itemType" => $type,
"itemSource" => $this->getFileIdForPath($user, $path),
"name" => "Public quick link",
"attributes" => [
[
"scope" => "files_sharing",
"key" => "isQuickLink",
"value" => true
]
],
"path" => $path
];
}
/**
* @Given /^user "([^"]*)" has created a read only public link for (file|folder) "([^"]*)"$/
*
* @param string $user
* @param string $type
* @param string $path
*
* @return void
* @throws Exception
*/
public function theUserHasCreatedAReadOnlyPublicLinkForFileFolder(string $user, string $type, string $path):void {
$user = $this->getActualUsername($user);
$userPassword = $this->getPasswordForUser($user);
$requestPayload = $this->preparePublicQuickLinkPayload($user, $path, $type);
$url = $this->getBaseUrl() . "/ocs/v2.php/apps/files_sharing/api/v1/shares?format=json";
$response = HttpRequestHelper::post(
$url,
$this->getStepLineRef(),
$user,
$userPassword,
null,
$requestPayload
);
$this->theHTTPStatusCodeShouldBeBetween(200, 299, $response);
}
/**
* @When /^user "([^"]*)" adds the public share created from server "([^"]*)" using the sharing API$/
*
* @param string $user
* @param string $shareServer
*
* @return void
*/
public function userAddsPublicShareCreatedByUser(string $user, string $shareServer):void {
$this->setResponse($this->saveLastSharedPublicLinkShare($user, $shareServer));
}
/**
* Expires last created public link share using the testing API
*
* @return void
* @throws ResponseInterface
*/
public function expireLastCreatedPublicLinkShare():ResponseInterface {
$shareId = (string) $this->getLastCreatedPublicShare()->id;
return $this->expireShare($shareId);
}
/**
* Expires a share using the testing API
*
* @param string|null $shareId optional share id, if null then expire the last share that was created.
*
* @return ResponseInterface
* @throws GuzzleException
*/
public function expireShare(string $shareId = null):ResponseInterface {
$adminUser = $this->getAdminUsername();
if ($shareId === null) {
$shareId = $this->getLastCreatedUserGroupShareId();
}
$response = OcsApiHelper::sendRequest(
$this->getBaseUrl(),
$adminUser,
$this->getAdminPassword(),
'POST',
"/apps/testing/api/v1/expire-share/$shareId",
$this->getStepLineRef(),
[],
$this->getOcsApiVersion()
);
return $response;
}
/**
* @Given the administrator has expired the last created share using the testing API
*
* @return void
* @throws GuzzleException
*/
public function theAdministratorHasExpiredTheLastCreatedShare():void {
$this->expireShare();
$httpStatus = $this->getResponse()->getStatusCode();
Assert::assertSame(
200,
$httpStatus,
"Request to expire last share failed. HTTP status was '$httpStatus'"
);
$ocsStatusMessage = $this->ocsContext->getOCSResponseStatusMessage($this->getResponse());
if ($this->getOcsApiVersion() === 1) {
$expectedOcsStatusCode = "100";
} else {
$expectedOcsStatusCode = "200";
}
$this->ocsContext->theOCSStatusCodeShouldBe(
$expectedOcsStatusCode,
"Request to expire last share failed: '$ocsStatusMessage'"
);
}
/**
* @Given the administrator has expired the last created public link share using the testing API
*
* @return void
* @throws GuzzleException
*/
public function theAdministratorHasExpiredTheLastCreatedPublicLinkShare():void {
$this->expireLastCreatedPublicLinkShare();
$httpStatus = $this->getResponse()->getStatusCode();
Assert::assertSame(
200,
$this->getResponse()->getStatusCode(),
"Request to expire last public link share failed. HTTP status was '$httpStatus'"
);
$ocsStatusMessage = $this->ocsContext->getOCSResponseStatusMessage($this->getResponse());
if ($this->getOcsApiVersion() === 1) {
$expectedOcsStatusCode = "100";
} else {
$expectedOcsStatusCode = "200";
}
$this->ocsContext->theOCSStatusCodeShouldBe(
$expectedOcsStatusCode,
"Request to expire last public link share failed: '$ocsStatusMessage'"
);
}
/**
* @When the administrator expires the last created share using the testing API
*
* @return void
* @throws GuzzleException
*/
public function theAdministratorExpiresTheLastCreatedShare():void {
$this->setResponse($this->expireShare());
}
/**
* @When the administrator expires the last created public link share using the testing API
*
* @return void
* @throws GuzzleException
*/
public function theAdministratorExpiresTheLastCreatedPublicLinkShare():void {
$this->setResponse($this->expireLastCreatedPublicLinkShare());
}
/**
* replace values from table
*
* @param string $field
* @param string $value
*
* @return string
*/
public function replaceValuesFromTable(string $field, string $value):string {
if (\substr($field, 0, 10) === "share_with") {
$value = \str_replace(
"REMOTE",
$this->getRemoteBaseUrl(),
$value
);
$value = \str_replace(
"LOCAL",
$this->getLocalBaseUrl(),
$value
);
}
if (\substr($field, 0, 6) === "remote") {
$value = \str_replace(
"REMOTE",
$this->getRemoteBaseUrl(),
$value
);
$value = \str_replace(
"LOCAL",
$this->getLocalBaseUrl(),
$value
);
}
if ($field === "permissions") {
if (\is_string($value) && !\is_numeric($value)) {
$value = $this->splitPermissionsString($value);
}
$value = (string)SharingHelper::getPermissionSum($value);
}
if ($field === "share_type") {
$value = (string)SharingHelper::getShareType($value);
}
return $value;
}
/**
* @return array of common sharing capability settings for testing
*/
protected function getCommonSharingConfigs():array {
return [
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'auto_accept_share',
'testingApp' => 'core',
'testingParameter' => 'shareapi_auto_accept_share',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'api_enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_enabled',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_links',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@upload',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_public_upload',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'group_sharing',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_group_sharing',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'share_with_group_members_only',
'testingApp' => 'core',
'testingParameter' => 'shareapi_only_share_with_group_members',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'share_with_membership_groups_only',
'testingApp' => 'core',
'testingParameter' => 'shareapi_only_share_with_membership_groups',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'exclude_groups_from_sharing',
'testingApp' => 'core',
'testingParameter' => 'shareapi_exclude_groups',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'exclude_groups_from_sharing_list',
'testingApp' => 'core',
'testingParameter' => 'shareapi_exclude_groups_list',
'testingState' => ''
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' =>
'user_enumeration@@@enabled',
'testingApp' => 'core',
'testingParameter' =>
'shareapi_allow_share_dialog_user_enumeration',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' =>
'user_enumeration@@@group_members_only',
'testingApp' => 'core',
'testingParameter' =>
'shareapi_share_dialog_user_enumeration_group_members',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'resharing',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_resharing',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' =>
'public@@@password@@@enforced_for@@@read_only',
'testingApp' => 'core',
'testingParameter' =>
'shareapi_enforce_links_password_read_only',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' =>
'public@@@password@@@enforced_for@@@read_write',
'testingApp' => 'core',
'testingParameter' =>
'shareapi_enforce_links_password_read_write',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' =>
'public@@@password@@@enforced_for@@@upload_only',
'testingApp' => 'core',
'testingParameter' =>
'shareapi_enforce_links_password_write_only',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@send_mail',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_public_notification',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@social_share',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_social_share',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@expire_date@@@enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_default_expire_date',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'public@@@expire_date@@@enforced',
'testingApp' => 'core',
'testingParameter' => 'shareapi_enforce_expire_date',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'user@@@send_mail',
'testingApp' => 'core',
'testingParameter' => 'shareapi_allow_mail_notification',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'user@@@expire_date@@@enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_default_expire_date_user_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'user@@@expire_date@@@enforced',
'testingApp' => 'core',
'testingParameter' => 'shareapi_enforce_expire_date_user_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'group@@@expire_date@@@enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_default_expire_date_group_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'group@@@expire_date@@@enforced',
'testingApp' => 'core',
'testingParameter' => 'shareapi_enforce_expire_date_group_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'remote@@@expire_date@@@enabled',
'testingApp' => 'core',
'testingParameter' => 'shareapi_default_expire_date_remote_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'remote@@@expire_date@@@enforced',
'testingApp' => 'core',
'testingParameter' => 'shareapi_enforce_expire_date_remote_share',
'testingState' => false
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'federation@@@outgoing',
'testingApp' => 'files_sharing',
'testingParameter' => 'outgoing_server2server_share_enabled',
'testingState' => true
],
[
'capabilitiesApp' => 'files_sharing',
'capabilitiesParameter' => 'federation@@@incoming',
'testingApp' => 'files_sharing',
'testingParameter' => 'incoming_server2server_share_enabled',
'testingState' => true
]
];
}
}