also find users with access to the file if a folder above the actual file was already shared
This commit is contained in:
parent
1e5d03da80
commit
d1bbb30385
|
@ -164,21 +164,7 @@ class Hooks {
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief get path of a file.
|
||||
* @param $fileId id of the file
|
||||
* @return path of the file
|
||||
*/
|
||||
private static function getFilePath($fileId) {
|
||||
$query = \OC_DB::prepare('SELECT `path`'
|
||||
.' FROM `*PREFIX*filecache`'
|
||||
.' WHERE `fileid` = ?');
|
||||
$result = $query->execute(array($fileId));
|
||||
$row = $result->fetchRow();
|
||||
return $row['path'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @brief get all users with access to the file and encrypt the file key to each of them
|
||||
*/
|
||||
public static function postShared( $params ) {
|
||||
|
||||
|
@ -194,9 +180,11 @@ class Hooks {
|
|||
$userId = \OCP\User::getUser();
|
||||
$util = new Util( $view, $userId );
|
||||
|
||||
$shares = \OCP\Share::getUsersSharingFile( $params['itemSource'], 1 );
|
||||
$path = Util::getFilePath($params['itemSource']);
|
||||
|
||||
$shares = \OCP\Share::getUsersSharingFile( $path, 1 );
|
||||
|
||||
return Crypt::encKeyfileToMultipleUsers($shares, self::getFilePath($params['itemSource']));
|
||||
return Crypt::encKeyfileToMultipleUsers($shares, $path);
|
||||
|
||||
}
|
||||
|
||||
|
@ -204,18 +192,20 @@ class Hooks {
|
|||
* @brief
|
||||
*/
|
||||
public static function preUnshare( $params ) {
|
||||
$shares = \OCP\Share::getUsersSharingFile( $params['itemSource'], 1 );
|
||||
|
||||
$path = Util::getFilePath($params['itemSource']);
|
||||
$shares = \OCP\Share::getUsersSharingFile( $path, 1 );
|
||||
// remove the user from the list from which the file will be unshared
|
||||
unset($shares[$params['shareWith']]);
|
||||
|
||||
return Crypt::encKeyfileToMultipleUsers($shares, self::getFilePath($params['itemSource']));
|
||||
return Crypt::encKeyfileToMultipleUsers($shares, $path );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*/
|
||||
public static function preUnshareAll( $params ) {
|
||||
return Crypt::encKeyfileToMultipleUsers(array(\OCP\User::getUser()), self::getFilePath($params['itemSource']));
|
||||
return Crypt::encKeyfileToMultipleUsers(array(\OCP\User::getUser()), Util::getFilePath($params['itemSource']));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -450,9 +450,7 @@ class Crypt {
|
|||
* @returns encrypted file
|
||||
*/
|
||||
public static function keyEncrypt( $plainContent, $publicKey ) {
|
||||
|
||||
openssl_public_encrypt( $plainContent, $encryptedContent, $publicKey );
|
||||
|
||||
return $encryptedContent;
|
||||
|
||||
}
|
||||
|
|
|
@ -472,5 +472,19 @@ class Util {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get path of a file.
|
||||
* @param $fileId id of the file
|
||||
* @return path of the file
|
||||
*/
|
||||
public static function getFilePath($fileId) {
|
||||
$query = \OC_DB::prepare('SELECT `path`'
|
||||
.' FROM `*PREFIX*filecache`'
|
||||
.' WHERE `fileid` = ?');
|
||||
$result = $query->execute(array($fileId));
|
||||
$row = $result->fetchRow();
|
||||
return substr($row['path'], 5);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -149,64 +149,69 @@ class Share {
|
|||
* @note $path needs to be relative to user data dir, e.g. 'file.txt'
|
||||
* not '/admin/data/file.txt'
|
||||
*/
|
||||
public static function getUsersSharingFile( $source, $includeOwner = 0 ) {
|
||||
//TODO get also the recipients from folders which are shared above the current file
|
||||
// Fetch all shares of this file path from DB
|
||||
$query = \OC_DB::prepare(
|
||||
'SELECT share_with
|
||||
FROM
|
||||
`*PREFIX*share`
|
||||
WHERE
|
||||
item_source = ? AND share_type = ? AND uid_owner = ?'
|
||||
);
|
||||
|
||||
$result = $query->execute( array( $source, self::SHARE_TYPE_USER, \OCP\User::getUser() ) );
|
||||
|
||||
if ( \OC_DB::isError( $result ) ) {
|
||||
\OC_Log::write( 'OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR );
|
||||
}
|
||||
|
||||
public static function getUsersSharingFile( $path, $includeOwner = 0 ) {
|
||||
|
||||
$user = \OCP\User::getUser();
|
||||
$path_parts = explode(DIRECTORY_SEPARATOR, trim($path, DIRECTORY_SEPARATOR));
|
||||
$path = '';
|
||||
$shares = array();
|
||||
|
||||
while( $row = $result->fetchRow() ) {
|
||||
$shares[] = $row['share_with'];
|
||||
}
|
||||
|
||||
// We also need to take group shares into account
|
||||
|
||||
$query = \OC_DB::prepare(
|
||||
'SELECT share_with
|
||||
FROM
|
||||
`*PREFIX*share`
|
||||
WHERE
|
||||
item_source = ? AND share_type = ? AND uid_owner = ?'
|
||||
);
|
||||
foreach ($path_parts as $p) {
|
||||
$path .= '/'.$p;
|
||||
$meta = \OC\Files\Filesystem::getFileInfo(\OC_Filesystem::normalizePath($path));
|
||||
$source = $meta['fileid'];
|
||||
|
||||
$result = $query->execute( array( $source, self::SHARE_TYPE_GROUP, \OCP\User::getUser() ) );
|
||||
|
||||
if ( \OC_DB::isError( $result ) ) {
|
||||
\OC_Log::write( 'OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR );
|
||||
// Fetch all shares of this file path from DB
|
||||
$query = \OC_DB::prepare(
|
||||
'SELECT share_with
|
||||
FROM
|
||||
`*PREFIX*share`
|
||||
WHERE
|
||||
item_source = ? AND share_type = ? AND uid_owner = ?'
|
||||
);
|
||||
|
||||
$result = $query->execute( array( $source, self::SHARE_TYPE_USER, $user ) );
|
||||
|
||||
if ( \OC_DB::isError( $result ) ) {
|
||||
\OC_Log::write( 'OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR );
|
||||
}
|
||||
|
||||
while( $row = $result->fetchRow() ) {
|
||||
$shares[] = $row['share_with'];
|
||||
}
|
||||
|
||||
// We also need to take group shares into account
|
||||
|
||||
$query = \OC_DB::prepare(
|
||||
'SELECT share_with
|
||||
FROM
|
||||
`*PREFIX*share`
|
||||
WHERE
|
||||
item_source = ? AND share_type = ? AND uid_owner = ?'
|
||||
);
|
||||
|
||||
$result = $query->execute( array( $source, self::SHARE_TYPE_GROUP, $user ) );
|
||||
|
||||
if ( \OC_DB::isError( $result ) ) {
|
||||
\OC_Log::write( 'OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR );
|
||||
}
|
||||
|
||||
while( $row = $result->fetchRow() ) {
|
||||
$usersInGroup = \OC_Group::usersInGroup($row['share_with']);
|
||||
$shares = array_merge($shares, $usersInGroup);
|
||||
}
|
||||
}
|
||||
|
||||
while( $row = $result->fetchRow() ) {
|
||||
$usersInGroup = \OC_Group::usersInGroup($row['share_with']);
|
||||
$shares = array_merge($shares, $usersInGroup);
|
||||
}
|
||||
|
||||
|
||||
if ( ! empty( $shares ) ) {
|
||||
// Include owner in list of users, if requested
|
||||
if ( $includeOwner == 1 ) {
|
||||
$shares[] = \OCP\User::getUser();
|
||||
$shares[] = $user;
|
||||
}
|
||||
|
||||
return array_unique($shares);
|
||||
|
||||
} else {
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue