2013-09-04 15:25:15 +00:00
< ? php
/**
2015-03-26 10:44:34 +00:00
* @ author Björn Schießle < schiessle @ owncloud . com >
2015-10-05 18:54:56 +00:00
* @ author Joas Schilling < nickvergessen @ owncloud . com >
2015-03-26 10:44:34 +00:00
* @ author Morris Jobke < hey @ morrisjobke . de >
* @ author Robin Appelman < icewind @ owncloud . com >
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
* @ author Vincent Petry < pvince81 @ owncloud . com >
2013-09-04 15:25:15 +00:00
*
2015-03-26 10:44:34 +00:00
* @ copyright Copyright ( c ) 2015 , ownCloud , Inc .
* @ license AGPL - 3.0
2013-09-04 15:25:15 +00:00
*
2015-03-26 10:44:34 +00:00
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
2013-09-04 15:25:15 +00:00
*
2015-03-26 10:44:34 +00:00
* This program is distributed in the hope that it will be useful ,
2013-09-04 15:25:15 +00:00
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-03-26 10:44:34 +00:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
2013-09-04 15:25:15 +00:00
*
2015-03-26 10:44:34 +00:00
* You should have received a copy of the GNU Affero General Public License , version 3 ,
* along with this program . If not , see < http :// www . gnu . org / licenses />
2013-09-04 15:25:15 +00:00
*
*/
2015-02-26 10:37:37 +00:00
2014-11-24 14:31:52 +00:00
namespace OCA\Files_Sharing\API ;
2013-09-04 15:25:15 +00:00
2015-06-18 10:46:52 +00:00
use OC\HintException ;
2014-11-24 14:31:52 +00:00
class Local {
2013-09-04 15:25:15 +00:00
2013-09-17 09:53:06 +00:00
/**
2014-05-19 15:50:53 +00:00
* get all shares
2013-09-17 09:53:06 +00:00
*
2013-09-17 13:27:10 +00:00
* @ param array $params option 'file' to limit the result to a specific file / folder
2013-09-17 09:53:06 +00:00
* @ return \OC_OCS_Result share information
*/
2013-09-19 12:39:51 +00:00
public static function getAllShares ( $params ) {
2014-05-05 13:02:49 +00:00
if ( isset ( $_GET [ 'shared_with_me' ]) && $_GET [ 'shared_with_me' ] !== 'false' ) {
return self :: getFilesSharedWithMe ();
}
2013-09-17 13:27:10 +00:00
// if a file is specified, get the share for this file
2013-10-04 10:10:11 +00:00
if ( isset ( $_GET [ 'path' ])) {
2013-10-17 09:10:31 +00:00
if ( isset ( $_GET [ 'reshares' ]) && $_GET [ 'reshares' ] !== 'false' ) {
2015-05-22 20:16:35 +00:00
$reshares = true ;
2013-10-17 09:10:31 +00:00
} else {
2015-05-22 20:16:35 +00:00
$reshares = false ;
2013-10-17 09:10:31 +00:00
}
if ( isset ( $_GET [ 'subfiles' ]) && $_GET [ 'subfiles' ] !== 'false' ) {
2015-05-22 20:16:35 +00:00
return self :: getSharesFromFolder ( $_GET [ 'path' ]);
2013-09-19 14:41:29 +00:00
}
2015-05-22 20:16:35 +00:00
return self :: collectShares ( self :: getFileId ( $_GET [ 'path' ]),
self :: getItemType ( $_GET [ 'path' ]),
false ,
$_GET [ 'path' ],
$reshares );
2013-09-17 13:27:10 +00:00
}
2014-05-20 11:11:06 +00:00
$shares = \OCP\Share :: getItemShared ( 'file' , null );
2013-09-17 09:53:06 +00:00
2014-05-20 11:11:06 +00:00
if ( $shares === false ) {
2013-09-30 11:05:34 +00:00
return new \OC_OCS_Result ( null , 404 , 'could not get shares' );
2013-09-17 09:53:06 +00:00
} else {
2014-05-20 11:11:06 +00:00
foreach ( $shares as & $share ) {
2014-06-04 09:26:03 +00:00
if ( $share [ 'item_type' ] === 'file' && isset ( $share [ 'path' ])) {
$share [ 'mimetype' ] = \OC_Helper :: getFileNameMimeType ( $share [ 'path' ]);
2014-07-04 09:10:54 +00:00
if ( \OC :: $server -> getPreviewManager () -> isMimeSupported ( $share [ 'mimetype' ])) {
$share [ 'isPreviewAvailable' ] = true ;
}
2014-05-20 11:11:06 +00:00
}
2015-05-22 12:42:57 +00:00
if ( ! is_null ( $share [ 'token' ])) {
$share [ 'url' ] = \OC :: $server -> getURLGenerator () -> linkToRouteAbsolute ( 'files_sharing.sharecontroller.showShare' , [ 'token' => $share [ 'token' ]]);
}
2014-05-20 11:11:06 +00:00
}
return new \OC_OCS_Result ( $shares );
2013-09-17 09:53:06 +00:00
}
2013-09-30 11:05:34 +00:00
2013-09-17 09:53:06 +00:00
}
2013-09-04 15:25:15 +00:00
/**
2014-05-19 15:50:53 +00:00
* get share information for a given share
2013-09-04 15:25:15 +00:00
*
2013-09-17 13:27:10 +00:00
* @ param array $params which contains a 'id'
2013-09-04 15:25:15 +00:00
* @ return \OC_OCS_Result share information
*/
public static function getShare ( $params ) {
2013-10-17 09:10:31 +00:00
$s = self :: getShareFromId ( $params [ 'id' ]);
2015-05-22 20:16:35 +00:00
return self :: collectShares ( $s [ 'file_source' ], $s [ 'item_type' ], true , null , false , ( int ) $params [ 'id' ]);
2013-10-17 09:10:31 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* collect all share information , either of a specific share or all
2013-10-17 09:10:31 +00:00
* shares for a given path
2015-05-22 20:16:35 +00:00
*
* @ param string $itemSource
* @ param string $itemType
* @ param bool $getSpecificShare
* @ param string $path
* @ param bool $reshares
* @ param int $id
*
2013-10-17 09:10:31 +00:00
* @ return \OC_OCS_Result
*/
2015-05-22 20:16:35 +00:00
private static function collectShares ( $itemSource , $itemType , $getSpecificShare = false , $path = null , $reshares = false , $id = null ) {
2013-09-17 13:27:10 +00:00
if ( $itemSource !== null ) {
2013-10-10 17:46:45 +00:00
$shares = \OCP\Share :: getItemShared ( $itemType , $itemSource );
2013-10-17 09:10:31 +00:00
$receivedFrom = \OCP\Share :: getItemSharedWithBySource ( $itemType , $itemSource );
2013-09-17 13:27:10 +00:00
// if a specific share was specified only return this one
2013-10-17 09:10:31 +00:00
if ( $getSpecificShare === true ) {
2013-09-17 13:27:10 +00:00
foreach ( $shares as $share ) {
2015-05-22 20:16:35 +00:00
if ( $share [ 'id' ] === $id ) {
2013-09-17 13:27:10 +00:00
$shares = array ( 'element' => $share );
break ;
}
}
2014-03-12 10:00:30 +00:00
} else {
foreach ( $shares as $key => $share ) {
$shares [ $key ][ 'path' ] = $path ;
}
2013-09-17 13:27:10 +00:00
}
2013-10-17 09:10:31 +00:00
2014-03-12 10:00:30 +00:00
2013-10-17 09:10:31 +00:00
// include also reshares in the lists. This means that the result
// will contain every user with access to the file.
2015-05-22 20:16:35 +00:00
if ( $reshares === true ) {
2013-10-17 09:10:31 +00:00
$shares = self :: addReshares ( $shares , $itemSource );
}
if ( $receivedFrom ) {
2014-03-12 10:00:30 +00:00
foreach ( $shares as $key => $share ) {
$shares [ $key ][ 'received_from' ] = $receivedFrom [ 'uid_owner' ];
$shares [ $key ][ 'received_from_displayname' ] = \OCP\User :: getDisplayName ( $receivedFrom [ 'uid_owner' ]);
}
2013-10-10 17:46:45 +00:00
}
2013-09-17 13:27:10 +00:00
} else {
$shares = null ;
}
if ( $shares === null || empty ( $shares )) {
2013-09-29 20:16:48 +00:00
return new \OC_OCS_Result ( null , 404 , 'share doesn\'t exist' );
2013-09-06 08:49:21 +00:00
} else {
2015-05-22 12:42:57 +00:00
foreach ( $shares as & $share ) {
if ( ! is_null ( $share [ 'token' ])) {
$share [ 'url' ] = \OC :: $server -> getURLGenerator () -> linkToRouteAbsolute ( 'files_sharing.sharecontroller.showShare' , [ 'token' => $share [ 'token' ]]);
}
}
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( $shares );
2013-09-06 08:49:21 +00:00
}
}
2013-10-17 09:10:31 +00:00
/**
2014-05-19 15:50:53 +00:00
* add reshares to a array of shares
2013-10-17 09:10:31 +00:00
* @ param array $shares array of shares
* @ param int $itemSource item source ID
* @ return array new shares array which includes reshares
*/
private static function addReshares ( $shares , $itemSource ) {
// if there are no shares than there are also no reshares
2013-10-18 08:23:34 +00:00
$firstShare = reset ( $shares );
if ( $firstShare ) {
2013-10-17 13:47:36 +00:00
$path = $firstShare [ 'path' ];
2013-10-17 09:10:31 +00:00
} else {
return $shares ;
}
2014-06-03 15:57:56 +00:00
$select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `*PREFIX*share`.`permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`' ;
2015-04-08 13:21:52 +00:00
$getReshares = \OCP\DB :: prepare ( 'SELECT ' . $select . ' FROM `*PREFIX*share` INNER JOIN `*PREFIX*filecache` ON `file_source` = `*PREFIX*filecache`.`fileid` WHERE `*PREFIX*share`.`file_source` = ? AND `*PREFIX*share`.`item_type` IN (\'file\', \'folder\') AND `uid_owner` != ?' );
2013-10-18 08:23:34 +00:00
$reshares = $getReshares -> execute ( array ( $itemSource , \OCP\User :: getUser ())) -> fetchAll ();
2013-10-17 09:10:31 +00:00
foreach ( $reshares as $key => $reshare ) {
if ( isset ( $reshare [ 'share_with' ]) && $reshare [ 'share_with' ] !== '' ) {
$reshares [ $key ][ 'share_with_displayname' ] = \OCP\User :: getDisplayName ( $reshare [ 'share_with' ]);
}
// add correct path to the result
$reshares [ $key ][ 'path' ] = $path ;
}
return array_merge ( $shares , $reshares );
}
2013-09-19 14:41:29 +00:00
/**
2014-05-19 15:50:53 +00:00
* get share from all files in a given folder ( non - recursive )
2015-05-22 20:16:35 +00:00
* @ param string $path
2013-09-19 14:41:29 +00:00
* @ return \OC_OCS_Result
*/
2015-05-22 20:16:35 +00:00
private static function getSharesFromFolder ( $path ) {
2013-09-19 14:41:29 +00:00
$view = new \OC\Files\View ( '/' . \OCP\User :: getUser () . '/files' );
if ( ! $view -> is_dir ( $path )) {
2014-01-28 10:25:12 +00:00
return new \OC_OCS_Result ( null , 400 , " not a directory " );
2013-09-19 14:41:29 +00:00
}
$content = $view -> getDirectoryContent ( $path );
$result = array ();
foreach ( $content as $file ) {
2013-10-10 17:46:45 +00:00
// workaround because folders are named 'dir' in this context
$itemType = $file [ 'type' ] === 'file' ? 'file' : 'folder' ;
$share = \OCP\Share :: getItemShared ( $itemType , $file [ 'fileid' ]);
2014-02-26 11:52:35 +00:00
if ( $share ) {
$receivedFrom = \OCP\Share :: getItemSharedWithBySource ( $itemType , $file [ 'fileid' ]);
2014-03-12 10:00:30 +00:00
reset ( $share );
$key = key ( $share );
2014-02-26 11:52:35 +00:00
if ( $receivedFrom ) {
2014-03-11 11:59:37 +00:00
$share [ $key ][ 'received_from' ] = $receivedFrom [ 'uid_owner' ];
$share [ $key ][ 'received_from_displayname' ] = \OCP\User :: getDisplayName ( $receivedFrom [ 'uid_owner' ]);
2014-02-26 11:52:35 +00:00
}
2014-01-30 12:34:41 +00:00
$result = array_merge ( $result , $share );
2013-09-19 14:41:29 +00:00
}
}
return new \OC_OCS_Result ( $result );
}
2014-05-05 13:02:49 +00:00
/**
* get files shared with the user
* @ return \OC_OCS_Result
*/
private static function getFilesSharedWithMe () {
try {
$shares = \OCP\Share :: getItemsSharedWith ( 'file' );
2014-05-20 11:11:06 +00:00
foreach ( $shares as & $share ) {
if ( $share [ 'item_type' ] === 'file' ) {
$share [ 'mimetype' ] = \OC_Helper :: getFileNameMimeType ( $share [ 'file_target' ]);
2014-07-04 09:10:54 +00:00
if ( \OC :: $server -> getPreviewManager () -> isMimeSupported ( $share [ 'mimetype' ])) {
$share [ 'isPreviewAvailable' ] = true ;
}
2014-05-20 11:11:06 +00:00
}
}
2014-05-05 13:02:49 +00:00
$result = new \OC_OCS_Result ( $shares );
} catch ( \Exception $e ) {
$result = new \OC_OCS_Result ( null , 403 , $e -> getMessage ());
}
return $result ;
}
2013-09-06 08:49:21 +00:00
/**
2014-05-19 15:50:53 +00:00
* create a new share
2013-09-19 12:39:51 +00:00
* @ param array $params
2013-09-17 09:53:06 +00:00
* @ return \OC_OCS_Result
2013-09-06 08:49:21 +00:00
*/
2013-09-17 09:53:06 +00:00
public static function createShare ( $params ) {
$path = isset ( $_POST [ 'path' ]) ? $_POST [ 'path' ] : null ;
if ( $path === null ) {
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 400 , " please specify a file or folder path " );
2013-09-17 09:53:06 +00:00
}
2013-09-06 08:49:21 +00:00
$itemSource = self :: getFileId ( $path );
2015-06-01 13:05:04 +00:00
$itemSourceName = $itemSource ;
2013-09-06 08:49:21 +00:00
$itemType = self :: getItemType ( $path );
2015-08-29 10:39:47 +00:00
$expirationDate = null ;
2013-09-06 08:49:21 +00:00
2013-09-06 14:00:01 +00:00
if ( $itemSource === null ) {
return new \OC_OCS_Result ( null , 404 , " wrong path, file/folder doesn't exist. " );
}
2013-09-06 08:49:21 +00:00
$shareWith = isset ( $_POST [ 'shareWith' ]) ? $_POST [ 'shareWith' ] : null ;
$shareType = isset ( $_POST [ 'shareType' ]) ? ( int ) $_POST [ 'shareType' ] : null ;
2013-09-06 14:00:01 +00:00
switch ( $shareType ) {
2015-05-23 16:26:23 +00:00
case \OCP\Share :: SHARE_TYPE_REMOTE :
$shareWith = rtrim ( $shareWith , '/' );
2015-06-01 13:05:04 +00:00
$itemSourceName = basename ( $path );
2013-09-06 14:00:01 +00:00
case \OCP\Share :: SHARE_TYPE_USER :
case \OCP\Share :: SHARE_TYPE_GROUP :
2013-09-17 09:53:06 +00:00
$permissions = isset ( $_POST [ 'permissions' ]) ? ( int ) $_POST [ 'permissions' ] : 31 ;
2013-09-06 14:00:01 +00:00
break ;
case \OCP\Share :: SHARE_TYPE_LINK :
2013-09-16 15:04:49 +00:00
//allow password protection
$shareWith = isset ( $_POST [ 'password' ]) ? $_POST [ 'password' ] : null ;
2013-09-16 15:42:56 +00:00
//check public link share
2014-02-13 15:28:49 +00:00
$publicUploadEnabled = \OC :: $server -> getAppConfig () -> getValue ( 'core' , 'shareapi_allow_public_upload' , 'yes' );
2014-01-28 16:28:20 +00:00
if ( isset ( $_POST [ 'publicUpload' ]) && $publicUploadEnabled !== 'yes' ) {
2014-01-28 10:25:12 +00:00
return new \OC_OCS_Result ( null , 403 , " public upload disabled by the administrator " );
2013-09-16 15:42:56 +00:00
}
2013-10-04 10:16:47 +00:00
$publicUpload = isset ( $_POST [ 'publicUpload' ]) ? $_POST [ 'publicUpload' ] : 'false' ;
2013-09-16 15:42:56 +00:00
// read, create, update (7) if public upload is enabled or
// read (1) if public upload is disabled
2013-10-04 10:16:47 +00:00
$permissions = $publicUpload === 'true' ? 7 : 1 ;
2015-08-29 10:39:47 +00:00
// Get the expiration date
try {
$expirationDate = isset ( $_POST [ 'expireDate' ]) ? self :: parseDate ( $_POST [ 'expireDate' ]) : null ;
} catch ( \Exception $e ) {
2015-08-29 11:31:18 +00:00
return new \OC_OCS_Result ( null , 404 , 'Invalid Date. Format must be YYYY-MM-DD.' );
2015-08-29 10:39:47 +00:00
}
2013-09-06 14:00:01 +00:00
break ;
2013-09-19 08:33:04 +00:00
default :
2014-01-28 10:25:12 +00:00
return new \OC_OCS_Result ( null , 400 , " unknown share type " );
2013-09-06 08:49:21 +00:00
}
2015-02-27 12:15:56 +00:00
if (( $permissions & \OCP\Constants :: PERMISSION_READ ) === 0 ) {
return new \OC_OCS_Result ( null , 400 , 'invalid permissions' );
}
2013-09-16 15:04:49 +00:00
try {
$token = \OCP\Share :: shareItem (
2013-09-06 08:49:21 +00:00
$itemType ,
$itemSource ,
$shareType ,
$shareWith ,
2015-06-01 13:05:04 +00:00
$permissions ,
2015-08-29 10:39:47 +00:00
$itemSourceName ,
$expirationDate
);
2015-06-18 10:46:52 +00:00
} catch ( HintException $e ) {
2015-08-29 11:31:18 +00:00
if ( $e -> getCode () === 0 ) {
return new \OC_OCS_Result ( null , 400 , $e -> getHint ());
} else {
return new \OC_OCS_Result ( null , $e -> getCode (), $e -> getHint ());
}
2013-09-16 15:04:49 +00:00
} catch ( \Exception $e ) {
2014-01-28 10:25:12 +00:00
return new \OC_OCS_Result ( null , 403 , $e -> getMessage ());
2013-09-16 15:04:49 +00:00
}
2013-09-06 08:49:21 +00:00
if ( $token ) {
2013-09-19 14:52:44 +00:00
$data = array ();
$data [ 'id' ] = 'unknown' ;
2013-10-10 17:46:45 +00:00
$shares = \OCP\Share :: getItemShared ( $itemType , $itemSource );
2013-09-06 08:49:21 +00:00
if ( is_string ( $token )) { //public link share
2013-09-17 13:27:10 +00:00
foreach ( $shares as $share ) {
if ( $share [ 'token' ] === $token ) {
2013-09-19 14:52:44 +00:00
$data [ 'id' ] = $share [ 'id' ];
2013-09-17 13:27:10 +00:00
break ;
}
}
2015-03-18 13:29:01 +00:00
$data [ 'url' ] = \OC :: $server -> getURLGenerator () -> linkToRouteAbsolute ( 'files_sharing.sharecontroller.showShare' , [ 'token' => $token ]);
2013-09-19 14:52:44 +00:00
$data [ 'token' ] = $token ;
2013-09-17 13:27:10 +00:00
} else {
foreach ( $shares as $share ) {
if ( $share [ 'share_with' ] === $shareWith && $share [ 'share_type' ] === $shareType ) {
2013-09-19 14:52:44 +00:00
$data [ 'id' ] = $share [ 'id' ];
2013-09-17 13:27:10 +00:00
break ;
}
}
2013-09-06 08:49:21 +00:00
}
2015-08-28 15:44:40 +00:00
$data [ 'permissions' ] = $share [ 'permissions' ];
$data [ 'expiration' ] = $share [ 'expiration' ];
2013-09-06 08:49:21 +00:00
return new \OC_OCS_Result ( $data );
} else {
2013-09-06 14:00:01 +00:00
return new \OC_OCS_Result ( null , 404 , " couldn't share file " );
2013-09-06 08:49:21 +00:00
}
}
2013-09-17 09:53:06 +00:00
2013-09-06 14:00:01 +00:00
/**
2013-09-17 13:27:10 +00:00
* update shares , e . g . password , permissions , etc
* @ param array $params shareId 'id' and the parameter we want to update
* currently supported : permissions , password , publicUpload
2013-09-06 14:00:01 +00:00
* @ return \OC_OCS_Result
*/
2013-09-17 09:53:06 +00:00
public static function updateShare ( $params ) {
2013-09-17 13:27:10 +00:00
$share = self :: getShareFromId ( $params [ 'id' ]);
2013-09-06 14:00:01 +00:00
2014-03-10 10:16:09 +00:00
if ( ! isset ( $share [ 'file_source' ])) {
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 404 , " wrong share Id, share doesn't exist. " );
2013-09-06 14:00:01 +00:00
}
2013-09-17 09:53:06 +00:00
try {
if ( isset ( $params [ '_put' ][ 'permissions' ])) {
2013-09-17 13:27:10 +00:00
return self :: updatePermissions ( $share , $params );
2013-09-17 09:53:06 +00:00
} elseif ( isset ( $params [ '_put' ][ 'password' ])) {
2015-03-13 11:29:13 +00:00
return self :: updatePassword ( $params [ 'id' ], ( int ) $share [ 'share_type' ], $params [ '_put' ][ 'password' ]);
2013-09-17 13:27:10 +00:00
} elseif ( isset ( $params [ '_put' ][ 'publicUpload' ])) {
return self :: updatePublicUpload ( $share , $params );
2014-07-23 14:42:33 +00:00
} elseif ( isset ( $params [ '_put' ][ 'expireDate' ])) {
return self :: updateExpireDate ( $share , $params );
2013-09-17 09:53:06 +00:00
}
} catch ( \Exception $e ) {
2014-01-09 13:25:48 +00:00
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 400 , $e -> getMessage ());
2013-09-17 09:53:06 +00:00
}
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 400 , " Wrong or no update parameter given " );
2013-09-17 09:53:06 +00:00
}
/**
2014-05-19 15:50:53 +00:00
* update permissions for a share
2013-09-17 13:27:10 +00:00
* @ param array $share information about the share
* @ param array $params contains 'permissions'
2013-09-17 09:53:06 +00:00
* @ return \OC_OCS_Result
*/
2013-09-17 13:27:10 +00:00
private static function updatePermissions ( $share , $params ) {
2013-09-17 09:53:06 +00:00
2013-09-17 13:27:10 +00:00
$itemSource = $share [ 'item_source' ];
$itemType = $share [ 'item_type' ];
$shareWith = $share [ 'share_with' ];
$shareType = $share [ 'share_type' ];
2013-09-17 09:53:06 +00:00
$permissions = isset ( $params [ '_put' ][ 'permissions' ]) ? ( int ) $params [ '_put' ][ 'permissions' ] : null ;
2013-09-06 14:00:01 +00:00
2014-02-13 15:28:49 +00:00
$publicUploadStatus = \OC :: $server -> getAppConfig () -> getValue ( 'core' , 'shareapi_allow_public_upload' , 'yes' );
2014-01-28 16:28:20 +00:00
$publicUploadEnabled = ( $publicUploadStatus === 'yes' ) ? true : false ;
2013-09-17 13:27:10 +00:00
// only change permissions for public shares if public upload is enabled
// and we want to set permissions to 1 (read only) or 7 (allow upload)
if ( ( int ) $shareType === \OCP\Share :: SHARE_TYPE_LINK ) {
if ( $publicUploadEnabled === false || ( $permissions !== 7 && $permissions !== 1 )) {
return new \OC_OCS_Result ( null , 400 , " can't change permission for public link share " );
}
}
2015-02-27 12:15:56 +00:00
if (( $permissions & \OCP\Constants :: PERMISSION_READ ) === 0 ) {
return new \OC_OCS_Result ( null , 400 , 'invalid permissions' );
}
2013-09-16 15:04:49 +00:00
try {
$return = \OCP\Share :: setPermissions (
$itemType ,
$itemSource ,
$shareType ,
$shareWith ,
2013-09-17 09:53:06 +00:00
$permissions
2013-09-16 15:04:49 +00:00
);
} catch ( \Exception $e ) {
return new \OC_OCS_Result ( null , 404 , $e -> getMessage ());
2013-09-06 14:00:01 +00:00
}
if ( $return ) {
return new \OC_OCS_Result ();
} else {
return new \OC_OCS_Result ( null , 404 , " couldn't set permissions " );
}
}
2013-09-17 13:27:10 +00:00
/**
2014-05-19 15:50:53 +00:00
* enable / disable public upload
2013-09-17 13:27:10 +00:00
* @ param array $share information about the share
* @ param array $params contains 'publicUpload' which can be 'yes' or 'no'
* @ return \OC_OCS_Result
*/
private static function updatePublicUpload ( $share , $params ) {
2014-02-13 15:28:49 +00:00
$publicUploadEnabled = \OC :: $server -> getAppConfig () -> getValue ( 'core' , 'shareapi_allow_public_upload' , 'yes' );
2014-01-28 16:28:20 +00:00
if ( $publicUploadEnabled !== 'yes' ) {
2014-01-28 10:25:12 +00:00
return new \OC_OCS_Result ( null , 403 , " public upload disabled by the administrator " );
2013-09-17 13:27:10 +00:00
}
if ( $share [ 'item_type' ] !== 'folder' ||
( int ) $share [ 'share_type' ] !== \OCP\Share :: SHARE_TYPE_LINK ) {
2014-07-28 10:39:22 +00:00
return new \OC_OCS_Result ( null , 400 , " public upload is only possible for public shared folders " );
2013-09-17 13:27:10 +00:00
}
// read, create, update (7) if public upload is enabled or
// read (1) if public upload is disabled
2013-10-04 10:16:47 +00:00
$params [ '_put' ][ 'permissions' ] = $params [ '_put' ][ 'publicUpload' ] === 'true' ? 7 : 1 ;
2013-09-17 13:27:10 +00:00
return self :: updatePermissions ( $share , $params );
}
2014-07-23 14:42:33 +00:00
/**
* set expire date for public link share
* @ param array $share information about the share
* @ param array $params contains 'expireDate' which needs to be a well formated date string , e . g DD - MM - YYYY
* @ return \OC_OCS_Result
*/
private static function updateExpireDate ( $share , $params ) {
// only public links can have a expire date
if (( int ) $share [ 'share_type' ] !== \OCP\Share :: SHARE_TYPE_LINK ) {
2014-07-28 10:39:22 +00:00
return new \OC_OCS_Result ( null , 400 , " expire date only exists for public link shares " );
2014-07-23 14:42:33 +00:00
}
try {
$expireDateSet = \OCP\Share :: setExpirationDate ( $share [ 'item_type' ], $share [ 'item_source' ], $params [ '_put' ][ 'expireDate' ], ( int ) $share [ 'stime' ]);
$result = ( $expireDateSet ) ? new \OC_OCS_Result () : new \OC_OCS_Result ( null , 404 , " couldn't set expire date " );
} catch ( \Exception $e ) {
$result = new \OC_OCS_Result ( null , 404 , $e -> getMessage ());
}
return $result ;
}
2013-09-06 14:00:01 +00:00
/**
2014-05-19 15:50:53 +00:00
* update password for public link share
2015-03-13 11:29:13 +00:00
* @ param int $shareId
* @ param int $shareType
* @ param string $password
2013-09-06 14:00:01 +00:00
* @ return \OC_OCS_Result
*/
2015-03-13 11:29:13 +00:00
private static function updatePassword ( $shareId , $shareType , $password ) {
if ( $shareType !== \OCP\Share :: SHARE_TYPE_LINK ) {
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 400 , " password protection is only supported for public shares " );
}
2015-03-13 11:29:13 +00:00
if ( $password === '' ) {
$password = null ;
2013-09-17 09:53:06 +00:00
}
2013-09-18 08:11:20 +00:00
2014-05-12 10:19:07 +00:00
try {
2015-03-13 11:29:13 +00:00
$result = \OCP\Share :: setPassword ( $shareId , $password );
2014-05-12 10:19:07 +00:00
} catch ( \Exception $e ) {
return new \OC_OCS_Result ( null , 403 , $e -> getMessage ());
}
2013-09-17 09:53:06 +00:00
if ( $result ) {
return new \OC_OCS_Result ();
2013-09-06 14:00:01 +00:00
}
2013-09-17 09:53:06 +00:00
return new \OC_OCS_Result ( null , 404 , " couldn't set password " );
}
2013-09-16 15:04:49 +00:00
/**
2014-05-19 15:50:53 +00:00
* unshare a file / folder
2013-09-17 13:27:10 +00:00
* @ param array $params contains the shareID 'id' which should be unshared
2013-09-16 15:04:49 +00:00
* @ return \OC_OCS_Result
*/
2013-09-17 09:53:06 +00:00
public static function deleteShare ( $params ) {
2013-09-17 13:27:10 +00:00
$share = self :: getShareFromId ( $params [ 'id' ]);
2014-03-10 10:16:09 +00:00
$fileSource = isset ( $share [ 'file_source' ]) ? $share [ 'file_source' ] : null ;
2013-09-17 13:27:10 +00:00
$itemType = isset ( $share [ 'item_type' ]) ? $share [ 'item_type' ] : null ;;
2013-09-06 14:00:01 +00:00
2014-03-10 10:16:09 +00:00
if ( $fileSource === null ) {
2013-09-17 13:27:10 +00:00
return new \OC_OCS_Result ( null , 404 , " wrong share ID, share doesn't exist. " );
2013-09-16 15:04:49 +00:00
}
2013-09-17 13:27:10 +00:00
$shareWith = isset ( $share [ 'share_with' ]) ? $share [ 'share_with' ] : null ;
$shareType = isset ( $share [ 'share_type' ]) ? ( int ) $share [ 'share_type' ] : null ;
2013-09-16 15:04:49 +00:00
2013-09-17 13:27:10 +00:00
if ( $shareType === \OCP\Share :: SHARE_TYPE_LINK ) {
2013-09-16 15:04:49 +00:00
$shareWith = null ;
}
try {
$return = \OCP\Share :: unshare (
$itemType ,
2014-03-10 10:16:09 +00:00
$fileSource ,
2013-09-16 15:04:49 +00:00
$shareType ,
$shareWith );
} catch ( \Exception $e ) {
return new \OC_OCS_Result ( null , 404 , $e -> getMessage ());
}
if ( $return ) {
return new \OC_OCS_Result ();
} else {
$msg = " Unshare Failed " ;
return new \OC_OCS_Result ( null , 404 , $msg );
}
}
2015-08-29 10:39:47 +00:00
/**
* Make sure that the passed date is valid ISO 8601
* So YYYY - MM - DD
* If not throw an exception
*
* @ param string $expireDate
*
* @ throws \Exception
* @ return \DateTime
*/
private static function parseDate ( $expireDate ) {
if ( preg_match ( '/^\d{4}-\d{2}-\d{2}$/' , $expireDate ) === 0 ) {
2015-08-29 11:31:18 +00:00
throw new \Exception ( 'Invalid date. Format must be YYYY-MM-DD' );
2015-08-29 10:39:47 +00:00
}
$date = new \DateTime ( $expireDate );
if ( $date === false ) {
2015-08-29 11:31:18 +00:00
throw new \Exception ( 'Invalid date. Format must be YYYY-MM-DD' );
2015-08-29 10:39:47 +00:00
}
return $date ;
}
2013-09-06 08:49:21 +00:00
/**
2014-05-19 15:50:53 +00:00
* get file ID from a given path
2013-09-06 08:49:21 +00:00
* @ param string $path
* @ return string fileID or null
*/
private static function getFileId ( $path ) {
2013-09-19 12:39:51 +00:00
2013-09-04 15:25:15 +00:00
$view = new \OC\Files\View ( '/' . \OCP\User :: getUser () . '/files' );
2013-09-06 08:49:21 +00:00
$fileId = null ;
2013-09-04 15:25:15 +00:00
$fileInfo = $view -> getFileInfo ( $path );
if ( $fileInfo ) {
2013-09-06 08:49:21 +00:00
$fileId = $fileInfo [ 'fileid' ];
}
return $fileId ;
}
/**
2014-05-19 15:50:53 +00:00
* get itemType
2013-09-06 08:49:21 +00:00
* @ param string $path
* @ return string type 'file' , 'folder' or null of file / folder doesn ' t exists
*/
private static function getItemType ( $path ) {
$view = new \OC\Files\View ( '/' . \OCP\User :: getUser () . '/files' );
$itemType = null ;
if ( $view -> is_dir ( $path )) {
$itemType = " folder " ;
} elseif ( $view -> is_file ( $path )) {
$itemType = " file " ;
2013-09-04 15:25:15 +00:00
}
2013-09-06 08:49:21 +00:00
return $itemType ;
2013-09-04 15:25:15 +00:00
}
2013-09-17 13:27:10 +00:00
/**
2014-05-19 15:50:53 +00:00
* get some information from a given share
2013-09-17 13:27:10 +00:00
* @ param int $shareID
* @ return array with : item_source , share_type , share_with , item_type , permissions
*/
private static function getShareFromId ( $shareID ) {
2014-07-23 14:42:33 +00:00
$sql = 'SELECT `file_source`, `item_source`, `share_type`, `share_with`, `item_type`, `permissions`, `stime` FROM `*PREFIX*share` WHERE `id` = ?' ;
2013-09-17 13:27:10 +00:00
$args = array ( $shareID );
$query = \OCP\DB :: prepare ( $sql );
$result = $query -> execute ( $args );
if ( \OCP\DB :: isError ( $result )) {
2015-04-08 13:21:52 +00:00
\OCP\Util :: writeLog ( 'files_sharing' , \OCP\DB :: getErrorMessage (), \OCP\Util :: ERROR );
2013-09-29 20:16:48 +00:00
return null ;
}
if ( $share = $result -> fetchRow ()) {
return $share ;
2013-09-17 13:27:10 +00:00
}
2013-09-29 20:16:48 +00:00
return null ;
2013-09-17 13:27:10 +00:00
}
2013-09-16 15:28:17 +00:00
}