2015-11-24 07:48:06 -05:00
< ? php
2025-06-30 09:04:05 -04:00
2016-07-21 12:13:36 -04:00
/**
2024-05-10 09:09:14 -04:00
* SPDX - FileCopyrightText : 2016 - 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX - FileCopyrightText : 2016 ownCloud , Inc .
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2016-07-21 12:13:36 -04:00
*/
2019-10-24 19:13:23 -04:00
use Behat\Gherkin\Node\TableNode ;
2015-11-24 07:48:06 -05:00
use GuzzleHttp\Client ;
2018-06-13 01:15:42 -04:00
use PHPUnit\Framework\Assert ;
2019-06-03 09:24:26 -04:00
use Psr\Http\Message\ResponseInterface ;
2015-11-24 07:48:06 -05:00
2025-11-26 10:13:47 -05:00
require __DIR__ . '/autoload.php' ;
2015-11-24 07:48:06 -05:00
2016-03-15 09:24:51 -04:00
trait Sharing {
2016-03-11 04:23:11 -05:00
use Provisioning ;
2015-11-24 07:48:06 -05:00
2025-12-03 10:46:57 -05:00
private int $sharingApiVersion = 1 ;
private ? SimpleXMLElement $lastShareData = null ;
2015-11-24 07:48:06 -05:00
2019-04-15 06:22:34 -04:00
/** @var SimpleXMLElement[] */
2025-12-03 10:46:57 -05:00
private array $storedShareData = [];
private ? string $savedShareId = null ;
2019-06-03 09:24:26 -04:00
/** @var ResponseInterface */
2018-02-09 07:19:39 -05:00
private $response ;
2015-11-24 07:48:06 -05:00
/**
2016-02-24 04:39:04 -05:00
* @ Given /^ as " ([^ " ] * ) " creating a share with $ /
2015-11-24 07:48:06 -05:00
*/
2025-12-03 10:46:57 -05:00
public function asCreatingAShareWith ( string $user , ? TableNode $body ) : void {
2016-03-11 04:05:26 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares " ;
2015-11-24 07:48:06 -05:00
$client = new Client ();
2016-08-01 02:33:49 -04:00
$options = [
'headers' => [
'OCS-APIREQUEST' => 'true' ,
],
];
2016-02-24 04:39:04 -05:00
if ( $user === 'admin' ) {
2015-11-24 07:48:06 -05:00
$options [ 'auth' ] = $this -> adminUser ;
} else {
2016-02-24 04:39:04 -05:00
$options [ 'auth' ] = [ $user , $this -> regularUser ];
2015-11-24 07:48:06 -05:00
}
2019-10-24 19:13:23 -04:00
if ( $body instanceof TableNode ) {
2015-11-24 07:48:06 -05:00
$fd = $body -> getRowsHash ();
if ( array_key_exists ( 'expireDate' , $fd )) {
$dateModification = $fd [ 'expireDate' ];
2025-04-09 05:14:23 -04:00
if ( $dateModification === 'null' ) {
$fd [ 'expireDate' ] = null ;
} elseif ( ! empty ( $dateModification )) {
2024-05-22 09:17:24 -04:00
$fd [ 'expireDate' ] = date ( 'Y-m-d' , strtotime ( $dateModification ));
2025-04-09 05:14:23 -04:00
} else {
$fd [ 'expireDate' ] = '' ;
2024-05-22 09:17:24 -04:00
}
2015-11-24 07:48:06 -05:00
}
2018-02-09 07:19:39 -05:00
$options [ 'form_params' ] = $fd ;
2015-11-24 07:48:06 -05:00
}
try {
2018-02-09 07:19:39 -05:00
$this -> response = $client -> request ( 'POST' , $fullUrl , $options );
2015-11-24 07:48:06 -05:00
} catch ( \GuzzleHttp\Exception\ClientException $ex ) {
$this -> response = $ex -> getResponse ();
}
2018-02-09 07:19:39 -05:00
$this -> lastShareData = simplexml_load_string ( $this -> response -> getBody ());
2015-11-24 07:48:06 -05:00
}
2019-04-15 06:22:34 -04:00
/**
* @ When /^ save the last share data as " ([^ " ] * ) " $ /
*/
2025-12-03 10:46:57 -05:00
public function saveLastShareData ( string $name ) : void {
2019-04-15 06:22:34 -04:00
$this -> storedShareData [ $name ] = $this -> lastShareData ;
}
/**
* @ When /^ restore the last share data from " ([^ " ] * ) " $ /
*/
2025-12-03 10:46:57 -05:00
public function restoreLastShareData ( string $name ) : void {
2019-04-15 06:22:34 -04:00
$this -> lastShareData = $this -> storedShareData [ $name ];
}
2016-02-24 04:39:04 -05:00
/**
* @ When /^ creating a share with $ /
*/
2025-12-03 10:46:57 -05:00
public function creatingShare ( ? TableNode $body ) : void {
2016-03-11 04:04:25 -05:00
$this -> asCreatingAShareWith ( $this -> currentUser , $body );
2016-02-24 04:39:04 -05:00
}
2019-11-20 09:41:15 -05:00
/**
* @ When /^ accepting last share $ /
*/
2025-12-03 10:46:57 -05:00
public function acceptingLastShare () : void {
2019-11-20 09:41:15 -05:00
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
$url = " /apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/pending/ $share_id " ;
$this -> sendingToWith ( 'POST' , $url , null );
$this -> theHTTPStatusCodeShouldBe ( '200' );
}
/**
* @ When /^ user " ([^ " ] * ) " accepts last share $ /
*/
2025-12-03 10:46:57 -05:00
public function userAcceptsLastShare ( string $user ) : void {
2019-11-20 09:41:15 -05:00
// "As userXXX" and "user userXXX accepts last share" steps are not
// expected to be used in the same scenario, but restore the user just
// in case.
$previousUser = $this -> currentUser ;
$this -> currentUser = $user ;
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
$url = " /apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/pending/ $share_id " ;
$this -> sendingToWith ( 'POST' , $url , null );
$this -> currentUser = $previousUser ;
$this -> theHTTPStatusCodeShouldBe ( '200' );
}
2015-11-24 07:48:06 -05:00
/**
2020-05-28 14:46:33 -04:00
* @ Then /^ last link share can be downloaded $ /
2015-11-24 07:48:06 -05:00
*/
2025-12-03 10:46:57 -05:00
public function lastLinkShareCanBeDownloaded () : void {
2015-11-24 07:48:06 -05:00
if ( count ( $this -> lastShareData -> data -> element ) > 0 ) {
$url = $this -> lastShareData -> data [ 0 ] -> url ;
} else {
$url = $this -> lastShareData -> data -> url ;
}
$fullUrl = $url . '/download' ;
2017-01-24 01:32:47 -05:00
$this -> checkDownload ( $fullUrl , null , 'text/plain' );
2015-11-24 07:48:06 -05:00
}
/**
2020-05-28 14:50:02 -04:00
* @ Then /^ last share can be downloaded $ /
2015-11-24 07:48:06 -05:00
*/
2025-12-03 10:46:57 -05:00
public function lastShareCanBeDownloaded () : void {
2020-05-28 14:50:02 -04:00
if ( count ( $this -> lastShareData -> data -> element ) > 0 ) {
$token = $this -> lastShareData -> data [ 0 ] -> token ;
} else {
$token = $this -> lastShareData -> data -> token ;
}
$fullUrl = substr ( $this -> baseUrl , 0 , - 4 ) . 'index.php/s/' . $token . '/download' ;
$this -> checkDownload ( $fullUrl , null , 'text/plain' );
}
/**
* @ Then /^ last share with password " ([^ " ] * ) " can be downloaded $ /
*/
public function lastShareWithPasswordCanBeDownloaded ( $password ) {
2015-11-24 07:48:06 -05:00
if ( count ( $this -> lastShareData -> data -> element ) > 0 ) {
$token = $this -> lastShareData -> data [ 0 ] -> token ;
} else {
$token = $this -> lastShareData -> data -> token ;
}
2022-10-28 09:05:07 -04:00
$fullUrl = substr ( $this -> baseUrl , 0 , - 4 ) . " public.php/dav/files/ $token / " ;
$this -> checkDownload ( $fullUrl , [ '' , $password ], 'text/plain' );
2017-01-24 01:32:47 -05:00
}
private function checkDownload ( $url , $auth = null , $mimeType = null ) {
if ( $auth !== null ) {
$options [ 'auth' ] = $auth ;
}
$options [ 'stream' ] = true ;
$client = new Client ();
$this -> response = $client -> get ( $url , $options );
2018-06-13 01:15:42 -04:00
Assert :: assertEquals ( 200 , $this -> response -> getStatusCode ());
2017-01-24 01:32:47 -05:00
$buf = '' ;
$body = $this -> response -> getBody ();
while ( ! $body -> eof ()) {
// read everything
$buf .= $body -> read ( 8192 );
}
$body -> close ();
if ( $mimeType !== null ) {
$finfo = new finfo ;
2018-06-13 01:15:42 -04:00
Assert :: assertEquals ( $mimeType , $finfo -> buffer ( $buf , FILEINFO_MIME_TYPE ));
2015-11-24 07:48:06 -05:00
}
}
/**
* @ When /^ Adding expiration date to last share $ /
*/
public function addingExpirationDate () {
2016-03-11 04:23:11 -05:00
$share_id = ( string ) $this -> lastShareData -> data [ 0 ] -> id ;
2015-11-24 07:48:06 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/ $share_id " ;
$client = new Client ();
$options = [];
if ( $this -> currentUser === 'admin' ) {
$options [ 'auth' ] = $this -> adminUser ;
} else {
$options [ 'auth' ] = [ $this -> currentUser , $this -> regularUser ];
}
$date = date ( 'Y-m-d' , strtotime ( '+3 days' ));
2018-02-09 07:19:39 -05:00
$options [ 'form_params' ] = [ 'expireDate' => $date ];
$this -> response = $this -> response = $client -> request ( 'PUT' , $fullUrl , $options );
2018-06-13 01:15:42 -04:00
Assert :: assertEquals ( 200 , $this -> response -> getStatusCode ());
2015-11-24 07:48:06 -05:00
}
/**
* @ When /^ Updating last share with $ /
2019-10-24 19:13:23 -04:00
* @ param TableNode | null $body
2015-11-24 07:48:06 -05:00
*/
public function updatingLastShare ( $body ) {
2016-03-11 04:23:11 -05:00
$share_id = ( string ) $this -> lastShareData -> data [ 0 ] -> id ;
2015-11-24 07:48:06 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/ $share_id " ;
$client = new Client ();
2016-08-01 02:33:49 -04:00
$options = [
'headers' => [
'OCS-APIREQUEST' => 'true' ,
],
];
2015-11-24 07:48:06 -05:00
if ( $this -> currentUser === 'admin' ) {
$options [ 'auth' ] = $this -> adminUser ;
} else {
$options [ 'auth' ] = [ $this -> currentUser , $this -> regularUser ];
}
2019-10-24 19:13:23 -04:00
if ( $body instanceof TableNode ) {
2015-11-24 07:48:06 -05:00
$fd = $body -> getRowsHash ();
if ( array_key_exists ( 'expireDate' , $fd )) {
$dateModification = $fd [ 'expireDate' ];
$fd [ 'expireDate' ] = date ( 'Y-m-d' , strtotime ( $dateModification ));
}
2018-02-09 07:19:39 -05:00
$options [ 'form_params' ] = $fd ;
2015-11-24 07:48:06 -05:00
}
try {
2018-02-09 07:19:39 -05:00
$this -> response = $client -> request ( 'PUT' , $fullUrl , $options );
2015-11-24 07:48:06 -05:00
} catch ( \GuzzleHttp\Exception\ClientException $ex ) {
$this -> response = $ex -> getResponse ();
}
}
public function createShare ( $user ,
$path = null ,
$shareType = null ,
$shareWith = null ,
$publicUpload = null ,
$password = null ,
2022-08-26 04:26:14 -04:00
$permissions = null ,
$viewOnly = false ) {
2015-11-24 07:48:06 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares " ;
$client = new Client ();
2016-08-01 02:33:49 -04:00
$options = [
'headers' => [
'OCS-APIREQUEST' => 'true' ,
],
];
2015-11-24 07:48:06 -05:00
if ( $user === 'admin' ) {
$options [ 'auth' ] = $this -> adminUser ;
} else {
$options [ 'auth' ] = [ $user , $this -> regularUser ];
}
2018-02-09 07:19:39 -05:00
$body = [];
2015-11-24 07:48:06 -05:00
if ( ! is_null ( $path )) {
2018-02-09 07:19:39 -05:00
$body [ 'path' ] = $path ;
2015-11-24 07:48:06 -05:00
}
if ( ! is_null ( $shareType )) {
2018-02-09 07:19:39 -05:00
$body [ 'shareType' ] = $shareType ;
2015-11-24 07:48:06 -05:00
}
if ( ! is_null ( $shareWith )) {
2018-02-09 07:19:39 -05:00
$body [ 'shareWith' ] = $shareWith ;
2015-11-24 07:48:06 -05:00
}
if ( ! is_null ( $publicUpload )) {
2018-02-09 07:19:39 -05:00
$body [ 'publicUpload' ] = $publicUpload ;
2015-11-24 07:48:06 -05:00
}
if ( ! is_null ( $password )) {
2018-02-09 07:19:39 -05:00
$body [ 'password' ] = $password ;
2015-11-24 07:48:06 -05:00
}
if ( ! is_null ( $permissions )) {
2018-02-09 07:19:39 -05:00
$body [ 'permissions' ] = $permissions ;
2015-11-24 07:48:06 -05:00
}
2022-08-26 04:26:14 -04:00
if ( $viewOnly === true ) {
2024-07-12 04:41:41 -04:00
$body [ 'attributes' ] = json_encode ([[ 'scope' => 'permissions' , 'key' => 'download' , 'value' => false ]]);
2022-08-26 04:26:14 -04:00
}
2018-02-09 07:19:39 -05:00
$options [ 'form_params' ] = $body ;
2015-11-24 07:48:06 -05:00
try {
2018-02-09 07:19:39 -05:00
$this -> response = $client -> request ( 'POST' , $fullUrl , $options );
$this -> lastShareData = simplexml_load_string ( $this -> response -> getBody ());
2015-11-24 07:48:06 -05:00
} catch ( \GuzzleHttp\Exception\ClientException $ex ) {
$this -> response = $ex -> getResponse ();
2018-02-09 07:19:39 -05:00
throw new \Exception ( $this -> response -> getBody ());
2015-11-24 07:48:06 -05:00
}
}
2025-10-29 11:50:50 -04:00
public function getFieldValueInResponse ( $field ) {
$data = simplexml_load_string ( $this -> response -> getBody ()) -> data [ 0 ];
if ( count ( $data -> element ) > 0 ) {
foreach ( $data as $element ) {
return ( string ) $element -> $field ;
}
return false ;
}
return $data -> $field ;
}
2020-04-09 07:53:40 -04:00
public function isFieldInResponse ( $field , $contentExpected ) {
2018-02-09 07:19:39 -05:00
$data = simplexml_load_string ( $this -> response -> getBody ()) -> data [ 0 ];
2015-11-24 07:48:06 -05:00
if (( string ) $field == 'expiration' ) {
2024-05-22 09:17:24 -04:00
if ( ! empty ( $contentExpected )) {
2026-02-05 18:46:22 -05:00
$contentExpected = date ( 'Y-m-d' , strtotime ( $contentExpected )) . ' 23:59:59' ;
2024-05-22 09:17:24 -04:00
}
2015-11-24 07:48:06 -05:00
}
if ( count ( $data -> element ) > 0 ) {
foreach ( $data as $element ) {
if ( $contentExpected == 'A_TOKEN' ) {
return ( strlen (( string ) $element -> $field ) == 15 );
} elseif ( $contentExpected == 'A_NUMBER' ) {
return is_numeric (( string ) $element -> $field );
} elseif ( $contentExpected == 'AN_URL' ) {
return $this -> isExpectedUrl (( string ) $element -> $field , 'index.php/s/' );
} elseif (( string ) $element -> $field == $contentExpected ) {
2020-03-25 16:53:04 -04:00
return true ;
2016-02-19 09:13:19 -05:00
} else {
print ( $element -> $field );
}
2015-11-24 07:48:06 -05:00
}
2020-03-25 16:53:04 -04:00
return false ;
2015-11-24 07:48:06 -05:00
} else {
if ( $contentExpected == 'A_TOKEN' ) {
return ( strlen (( string ) $data -> $field ) == 15 );
} elseif ( $contentExpected == 'A_NUMBER' ) {
return is_numeric (( string ) $data -> $field );
} elseif ( $contentExpected == 'AN_URL' ) {
return $this -> isExpectedUrl (( string ) $data -> $field , 'index.php/s/' );
2024-03-28 11:13:19 -04:00
} elseif ( $contentExpected == $data -> $field ) {
2020-03-25 16:53:04 -04:00
return true ;
2025-05-12 12:40:35 -04:00
} else {
print ( $data -> $field );
2015-11-24 07:48:06 -05:00
}
2020-03-25 16:53:04 -04:00
return false ;
2015-11-24 07:48:06 -05:00
}
}
/**
* @ Then /^ File " ([^ " ] * ) " should be included in the response $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $filename
2015-11-24 07:48:06 -05:00
*/
2020-04-09 07:53:40 -04:00
public function checkSharedFileInResponse ( $filename ) {
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( true , $this -> isFieldInResponse ( 'file_target' , " / $filename " ));
2015-11-24 07:48:06 -05:00
}
/**
* @ Then /^ File " ([^ " ] * ) " should not be included in the response $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $filename
2015-11-24 07:48:06 -05:00
*/
2020-04-09 07:53:40 -04:00
public function checkSharedFileNotInResponse ( $filename ) {
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( false , $this -> isFieldInResponse ( 'file_target' , " / $filename " ));
2015-11-24 07:48:06 -05:00
}
/**
* @ Then /^ User " ([^ " ] * ) " should be included in the response $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $user
2015-11-24 07:48:06 -05:00
*/
2020-04-09 07:53:40 -04:00
public function checkSharedUserInResponse ( $user ) {
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( true , $this -> isFieldInResponse ( 'share_with' , " $user " ));
2015-11-24 07:48:06 -05:00
}
/**
* @ Then /^ User " ([^ " ] * ) " should not be included in the response $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $user
2015-11-24 07:48:06 -05:00
*/
2020-04-09 07:53:40 -04:00
public function checkSharedUserNotInResponse ( $user ) {
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( false , $this -> isFieldInResponse ( 'share_with' , " $user " ));
2015-11-24 07:48:06 -05:00
}
2020-04-09 07:53:40 -04:00
public function isUserOrGroupInSharedData ( $userOrGroup , $permissions = null ) {
2018-02-09 07:19:39 -05:00
$data = simplexml_load_string ( $this -> response -> getBody ()) -> data [ 0 ];
2015-11-24 07:48:06 -05:00
foreach ( $data as $element ) {
2016-07-11 11:33:24 -04:00
if ( $element -> share_with == $userOrGroup && ( $permissions === null || $permissions == $element -> permissions )) {
2020-03-25 16:53:04 -04:00
return true ;
2015-11-24 07:48:06 -05:00
}
}
2020-03-25 16:53:04 -04:00
return false ;
2015-11-24 07:48:06 -05:00
}
/**
2022-08-26 04:26:14 -04:00
* @ Given /^ ( file | folder | entry ) " ([^ " ] * ) " of user " ([ ^ " ]*) " is shared with user " ([^ " ] * ) " ( with permissions ([ \ d]*))?( view-only)? $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $filepath
* @ param string $user1
* @ param string $user2
2015-11-24 07:48:06 -05:00
*/
2022-08-26 04:26:14 -04:00
public function assureFileIsShared ( $entry , $filepath , $user1 , $user2 , $withPerms = null , $permissions = null , $viewOnly = null ) {
// when view-only is set, permissions is empty string instead of null...
if ( $permissions === '' ) {
$permissions = null ;
}
2015-11-24 07:48:06 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares " . " ?path= $filepath " ;
$client = new Client ();
$options = [];
if ( $user1 === 'admin' ) {
$options [ 'auth' ] = $this -> adminUser ;
} else {
$options [ 'auth' ] = [ $user1 , $this -> regularUser ];
}
2016-08-01 02:33:49 -04:00
$options [ 'headers' ] = [
'OCS-APIREQUEST' => 'true' ,
];
2015-11-24 07:48:06 -05:00
$this -> response = $client -> get ( $fullUrl , $options );
2016-07-11 11:33:24 -04:00
if ( $this -> isUserOrGroupInSharedData ( $user2 , $permissions )) {
2015-11-24 07:48:06 -05:00
return ;
} else {
2022-08-26 04:26:14 -04:00
$this -> createShare ( $user1 , $filepath , 0 , $user2 , null , null , $permissions , $viewOnly !== null );
2015-11-24 07:48:06 -05:00
}
$this -> response = $client -> get ( $fullUrl , $options );
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( true , $this -> isUserOrGroupInSharedData ( $user2 , $permissions ));
2015-11-24 07:48:06 -05:00
}
/**
2022-08-26 04:30:26 -04:00
* @ Given /^ ( file | folder | entry ) " ([^ " ] * ) " of user " ([ ^ " ]*) " is shared with group " ([^ " ] * ) " ( with permissions ([ \ d]*))?( view-only)? $ /
2016-03-11 04:04:06 -05:00
*
* @ param string $filepath
* @ param string $user
* @ param string $group
2015-11-24 07:48:06 -05:00
*/
2022-08-26 04:26:14 -04:00
public function assureFileIsSharedWithGroup ( $entry , $filepath , $user , $group , $withPerms = null , $permissions = null , $viewOnly = null ) {
// when view-only is set, permissions is empty string instead of null...
if ( $permissions === '' ) {
$permissions = null ;
}
2015-11-24 07:48:06 -05:00
$fullUrl = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares " . " ?path= $filepath " ;
$client = new Client ();
$options = [];
if ( $user === 'admin' ) {
$options [ 'auth' ] = $this -> adminUser ;
} else {
$options [ 'auth' ] = [ $user , $this -> regularUser ];
}
2016-08-01 02:33:49 -04:00
$options [ 'headers' ] = [
'OCS-APIREQUEST' => 'true' ,
];
2015-11-24 07:48:06 -05:00
$this -> response = $client -> get ( $fullUrl , $options );
2016-07-11 11:33:24 -04:00
if ( $this -> isUserOrGroupInSharedData ( $group , $permissions )) {
2015-11-24 07:48:06 -05:00
return ;
} else {
2022-08-26 04:26:14 -04:00
$this -> createShare ( $user , $filepath , 1 , $group , null , null , $permissions , $viewOnly !== null );
2015-11-24 07:48:06 -05:00
}
$this -> response = $client -> get ( $fullUrl , $options );
2020-03-25 16:53:04 -04:00
Assert :: assertEquals ( true , $this -> isUserOrGroupInSharedData ( $group , $permissions ));
2015-11-24 07:48:06 -05:00
}
/**
* @ When /^ Deleting last share $ /
*/
2020-04-09 07:53:40 -04:00
public function deletingLastShare () {
2015-11-24 07:48:06 -05:00
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
$url = " /apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/ $share_id " ;
$this -> sendingToWith ( 'DELETE' , $url , null );
}
/**
* @ When /^ Getting info of last share $ /
*/
2020-04-09 07:53:40 -04:00
public function gettingInfoOfLastShare () {
2015-11-24 07:48:06 -05:00
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
$url = " /apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/ $share_id " ;
$this -> sendingToWith ( 'GET' , $url , null );
}
/**
* @ Then /^ last share_id is included in the answer $ /
*/
2020-04-09 07:53:40 -04:00
public function checkingLastShareIDIsIncluded () {
2015-11-24 07:48:06 -05:00
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
if ( ! $this -> isFieldInResponse ( 'id' , $share_id )) {
2018-06-13 01:15:42 -04:00
Assert :: fail ( " Share id $share_id not found in response " );
2015-11-24 07:48:06 -05:00
}
}
/**
* @ Then /^ last share_id is not included in the answer $ /
*/
2020-04-09 07:53:40 -04:00
public function checkingLastShareIDIsNotIncluded () {
2015-11-24 07:48:06 -05:00
$share_id = $this -> lastShareData -> data [ 0 ] -> id ;
if ( $this -> isFieldInResponse ( 'id' , $share_id )) {
2018-06-13 01:15:42 -04:00
Assert :: fail ( " Share id $share_id has been found in response " );
2015-11-24 07:48:06 -05:00
}
}
/**
* @ Then /^ Share fields of last share match with $ /
2019-10-24 19:13:23 -04:00
* @ param TableNode | null $body
2015-11-24 07:48:06 -05:00
*/
2020-04-09 07:53:40 -04:00
public function checkShareFields ( $body ) {
2019-10-24 19:13:23 -04:00
if ( $body instanceof TableNode ) {
2015-11-24 07:48:06 -05:00
$fd = $body -> getRowsHash ();
foreach ( $fd as $field => $value ) {
2020-04-09 10:07:47 -04:00
if ( substr ( $field , 0 , 10 ) === 'share_with' ) {
2016-02-19 09:13:19 -05:00
$value = str_replace ( 'REMOTE' , substr ( $this -> remoteBaseUrl , 0 , - 5 ), $value );
$value = str_replace ( 'LOCAL' , substr ( $this -> localBaseUrl , 0 , - 5 ), $value );
}
2020-04-09 10:07:47 -04:00
if ( substr ( $field , 0 , 6 ) === 'remote' ) {
2016-02-19 09:13:19 -05:00
$value = str_replace ( 'REMOTE' , substr ( $this -> remoteBaseUrl , 0 , - 4 ), $value );
$value = str_replace ( 'LOCAL' , substr ( $this -> localBaseUrl , 0 , - 4 ), $value );
}
2015-11-24 07:48:06 -05:00
if ( ! $this -> isFieldInResponse ( $field , $value )) {
2018-06-13 01:15:42 -04:00
Assert :: fail ( " $field " . " doesn't have value " . " $value " );
2015-11-24 07:48:06 -05:00
}
}
}
}
2019-10-24 19:54:17 -04:00
/**
* @ Then the list of returned shares has : count shares
*/
2025-12-03 10:46:57 -05:00
public function theListOfReturnedSharesHasShares ( int $count ) : void {
2019-10-24 19:54:17 -04:00
$this -> theHTTPStatusCodeShouldBe ( '200' );
$this -> theOCSStatusCodeShouldBe ( '100' );
$returnedShares = $this -> getXmlResponse () -> data [ 0 ];
Assert :: assertEquals ( $count , count ( $returnedShares -> element ));
}
/**
* @ Then share : count is returned with
*
* @ param int $number
* @ param TableNode $body
*/
public function shareXIsReturnedWith ( int $number , TableNode $body ) {
$this -> theHTTPStatusCodeShouldBe ( '200' );
$this -> theOCSStatusCodeShouldBe ( '100' );
if ( ! ( $body instanceof TableNode )) {
return ;
}
$returnedShare = $this -> getXmlResponse () -> data [ 0 ];
if ( $returnedShare -> element ) {
$returnedShare = $returnedShare -> element [ $number ];
}
$defaultExpectedFields = [
'id' => 'A_NUMBER' ,
'permissions' => '19' ,
'stime' => 'A_NUMBER' ,
'parent' => '' ,
'expiration' => '' ,
'token' => '' ,
'storage' => 'A_NUMBER' ,
'item_source' => 'A_NUMBER' ,
'file_source' => 'A_NUMBER' ,
'file_parent' => 'A_NUMBER' ,
'mail_send' => '0'
];
$expectedFields = array_merge ( $defaultExpectedFields , $body -> getRowsHash ());
if ( ! array_key_exists ( 'uid_file_owner' , $expectedFields )
&& array_key_exists ( 'uid_owner' , $expectedFields )) {
$expectedFields [ 'uid_file_owner' ] = $expectedFields [ 'uid_owner' ];
}
if ( ! array_key_exists ( 'displayname_file_owner' , $expectedFields )
&& array_key_exists ( 'displayname_owner' , $expectedFields )) {
$expectedFields [ 'displayname_file_owner' ] = $expectedFields [ 'displayname_owner' ];
}
if ( array_key_exists ( 'share_type' , $expectedFields )
&& $expectedFields [ 'share_type' ] == 10 /* IShare::TYPE_ROOM */
&& array_key_exists ( 'share_with' , $expectedFields )) {
if ( $expectedFields [ 'share_with' ] === 'private_conversation' ) {
$expectedFields [ 'share_with' ] = 'REGEXP /^private_conversation_[0-9a-f]{6}$/' ;
} else {
$expectedFields [ 'share_with' ] = FeatureContext :: getTokenForIdentifier ( $expectedFields [ 'share_with' ]);
}
}
foreach ( $expectedFields as $field => $value ) {
$this -> assertFieldIsInReturnedShare ( $field , $value , $returnedShare );
}
}
/**
* @ return SimpleXMLElement
*/
private function getXmlResponse () : \SimpleXMLElement {
return simplexml_load_string ( $this -> response -> getBody ());
}
/**
* @ param string $field
* @ param string $contentExpected
* @ param \SimpleXMLElement $returnedShare
*/
2020-04-09 07:53:40 -04:00
private function assertFieldIsInReturnedShare ( string $field , string $contentExpected , \SimpleXMLElement $returnedShare ) {
2019-10-24 19:54:17 -04:00
if ( $contentExpected === 'IGNORE' ) {
return ;
}
2023-01-12 06:21:21 -05:00
if ( ! property_exists ( $returnedShare , $field )) {
2019-10-24 19:54:17 -04:00
Assert :: fail ( " $field was not found in response " );
}
if ( $field === 'expiration' && ! empty ( $contentExpected )) {
2026-02-05 18:46:22 -05:00
$contentExpected = date ( 'Y-m-d' , strtotime ( $contentExpected )) . ' 23:59:59' ;
2019-10-24 19:54:17 -04:00
}
if ( $contentExpected === 'A_NUMBER' ) {
Assert :: assertTrue ( is_numeric (( string ) $returnedShare -> $field ), " Field ' $field ' is not a number: " . $returnedShare -> $field );
2020-04-10 04:35:09 -04:00
} elseif ( $contentExpected === 'A_TOKEN' ) {
2019-10-24 19:54:17 -04:00
// A token is composed by 15 characters from
// ISecureRandom::CHAR_HUMAN_READABLE.
2026-03-10 07:19:56 -04:00
Assert :: assertMatchesRegularExpression ( '/^[abcdefgijkmnopqrstwxyzABCDEFGHJKLMNPQRSTWXYZ23456789]{15}$/' , ( string ) $returnedShare -> $field , " Field ' $field ' is not a token " );
2020-04-10 04:35:09 -04:00
} elseif ( strpos ( $contentExpected , 'REGEXP ' ) === 0 ) {
2026-03-10 07:19:56 -04:00
Assert :: assertMatchesRegularExpression ( substr ( $contentExpected , strlen ( 'REGEXP ' )), ( string ) $returnedShare -> $field , " Field ' $field ' does not match " );
2019-10-24 19:54:17 -04:00
} else {
Assert :: assertEquals ( $contentExpected , ( string ) $returnedShare -> $field , " Field ' $field ' does not match " );
}
}
2016-02-18 17:07:41 -05:00
/**
* @ Then As : user remove all shares from the file named : fileName
*/
public function asRemoveAllSharesFromTheFileNamed ( $user , $fileName ) {
2016-03-11 04:05:26 -05:00
$url = $this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares?format=json " ;
2016-02-18 17:07:41 -05:00
$client = new \GuzzleHttp\Client ();
$res = $client -> get (
$url ,
[
'auth' => [
$user ,
'123456' ,
],
'headers' => [
'Content-Type' => 'application/json' ,
2016-08-01 02:33:49 -04:00
'OCS-APIREQUEST' => 'true' ,
2016-02-18 17:07:41 -05:00
],
]
);
$json = json_decode ( $res -> getBody () -> getContents (), true );
$deleted = false ;
foreach ( $json [ 'ocs' ][ 'data' ] as $data ) {
if ( stripslashes ( $data [ 'path' ]) === $fileName ) {
$id = $data [ 'id' ];
$client -> delete (
2016-03-11 04:05:26 -05:00
$this -> baseUrl . " v { $this -> apiVersion } .php/apps/files_sharing/api/v { $this -> sharingApiVersion } /shares/ { $id } " ,
2016-02-18 17:07:41 -05:00
[
'auth' => [
$user ,
'123456' ,
],
'headers' => [
'Content-Type' => 'application/json' ,
2016-08-01 02:33:49 -04:00
'OCS-APIREQUEST' => 'true' ,
2016-02-18 17:07:41 -05:00
],
]
);
$deleted = true ;
}
}
if ( $deleted === false ) {
throw new \Exception ( " Could not delete file $fileName " );
}
}
2016-02-29 08:20:36 -05:00
/**
* @ When save last share id
*/
public function saveLastShareId () {
2022-01-04 04:51:08 -05:00
$this -> savedShareId = ( $this -> lastShareData [ 'data' ][ 'id' ] ? ? null );
2016-02-29 08:20:36 -05:00
}
/**
* @ Then share ids should match
*/
public function shareIdsShouldMatch () {
2022-01-04 04:51:08 -05:00
if ( $this -> savedShareId !== ( $this -> lastShareData [ 'data' ][ 'id' ] ? ? null )) {
2016-03-11 04:05:54 -05:00
throw new \Exception ( 'Expected the same link share to be returned' );
2016-02-29 08:20:36 -05:00
}
}
2016-09-15 06:41:39 -04:00
/**
2019-06-03 09:24:26 -04:00
* @ When /^ getting sharees for $ /
2019-10-24 19:13:23 -04:00
* @ param TableNode $body
2016-09-15 06:41:39 -04:00
*/
2019-06-03 09:24:26 -04:00
public function whenGettingShareesFor ( $body ) {
$url = '/apps/files_sharing/api/v1/sharees' ;
2019-10-24 19:13:23 -04:00
if ( $body instanceof TableNode ) {
2019-06-03 09:24:26 -04:00
$parameters = [];
foreach ( $body -> getRowsHash () as $key => $value ) {
2025-03-20 03:34:50 -04:00
if ( $key === 'shareTypes' ) {
foreach ( explode ( ' ' , $value ) as $shareType ) {
$parameters [] = 'shareType[]=' . $shareType ;
}
} else {
$parameters [] = $key . '=' . $value ;
}
2016-09-15 06:41:39 -04:00
}
2019-06-03 09:24:26 -04:00
if ( ! empty ( $parameters )) {
$url .= '?' . implode ( '&' , $parameters );
}
}
$this -> sendingTo ( 'GET' , $url );
}
/**
* @ Then /^ " ([^ " ] * ) " sharees returned (are|is empty) $ /
* @ param string $shareeType
* @ param string $isEmpty
2019-10-24 19:13:23 -04:00
* @ param TableNode | null $shareesList
2019-06-03 09:24:26 -04:00
*/
public function thenListOfSharees ( $shareeType , $isEmpty , $shareesList = null ) {
if ( $isEmpty !== 'is empty' ) {
$sharees = $shareesList -> getRows ();
$respondedArray = $this -> getArrayOfShareesResponded ( $this -> response , $shareeType );
Assert :: assertEquals ( $sharees , $respondedArray );
} else {
$respondedArray = $this -> getArrayOfShareesResponded ( $this -> response , $shareeType );
Assert :: assertEmpty ( $respondedArray );
}
}
public function getArrayOfShareesResponded ( ResponseInterface $response , $shareeType ) {
$elements = simplexml_load_string ( $response -> getBody ()) -> data ;
$elements = json_decode ( json_encode ( $elements ), 1 );
if ( strpos ( $shareeType , 'exact ' ) === 0 ) {
$elements = $elements [ 'exact' ];
$shareeType = substr ( $shareeType , 6 );
}
2025-03-20 03:15:05 -04:00
// "simplexml_load_string" creates a SimpleXMLElement object for each
// XML element with child elements. In turn, each child is indexed by
// its tag in the SimpleXMLElement object. However, when there are
// several child XML elements with the same tag, an array with all the
// children with the same tag is indexed instead. Therefore, when the
// XML contains
// <XXX>
// <element>
// <label>...</label>
// <value>...</value>
// </element>
// </XXX>
// the "$elements[$shareeType]" variable contains an "element" key which
// in turn contains "label" and "value" keys, but when the XML contains
// <XXX>
// <element>
// <label>...</label>
// <value>...</value>
// </element>
// <element>
// <label>...</label>
// <value>...</value>
// </element>
// </XXX>
// the "$elements[$shareeType]" variable contains an "element" key which
// in turn contains "0" and "1" keys, and in turn each one contains
// "label" and "value" keys.
if ( array_key_exists ( 'element' , $elements [ $shareeType ]) && is_int ( array_keys ( $elements [ $shareeType ][ 'element' ])[ 0 ])) {
$elements [ $shareeType ] = $elements [ $shareeType ][ 'element' ];
}
2019-06-03 09:24:26 -04:00
$sharees = [];
foreach ( $elements [ $shareeType ] as $element ) {
2025-03-20 03:06:38 -04:00
$sharee = [ $element [ 'label' ], $element [ 'value' ][ 'shareType' ], $element [ 'value' ][ 'shareWith' ]];
if ( array_key_exists ( 'shareWithDisplayNameUnique' , $element )) {
$sharee [] = $element [ 'shareWithDisplayNameUnique' ];
}
$sharees [] = $sharee ;
2016-09-15 06:41:39 -04:00
}
2019-06-03 09:24:26 -04:00
return $sharees ;
2016-09-15 06:41:39 -04:00
}
2015-11-24 07:48:06 -05:00
}