fix sharing of folders. First we need to collect all files. Than we need to find all users with access to the file because this can vary from file to file and than we can encrypt it for all recipients

remotes/origin/stable6
Björn Schießle 2013-04-22 11:58:39 +07:00
parent 12785b93f1
commit a2ba3c8a43
2 changed files with 47 additions and 31 deletions

@ -166,8 +166,8 @@ class Hooks {
/**
* @brief
*/
public static function postShared( $params ) {
public static function postShared($params) {
// NOTE: $params has keys:
// [itemType] => file
// itemSource -> int, filecache file ID
@ -183,50 +183,46 @@ class Hooks {
// [fileSource] => 13
// [fileTarget] => /test8
// [id] => 10
// [token] =>
// [token] =>
// TODO: Should other kinds of item be encrypted too?
if ( $params['itemType'] === 'file' ) {
$view = new \OC_FilesystemView( '/' );
if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
$view = new \OC_FilesystemView('/');
$session = new Session($view);
$userId = \OCP\User::getUser();
$util = new Util( $view, $userId );
$path = $util->fileIdToPath( $params['itemSource'] );
$util = new Util($view, $userId);
$path = $util->fileIdToPath($params['itemSource']);
$sharingEnabled = \OCP\Share::isEnabled();
$usersSharing = $util->getSharingUsersArray( $sharingEnabled, $path);
// Recursively expand path to include subfiles
$allPaths = $util->getPaths( $path );
$failed = array();
// Loop through all subfiles
foreach ( $allPaths as $path ) {
if ($params['itemType'] === 'folder') {
//list($owner, $ownerPath) = $util->getUidAndFilename($filePath);
$allFiles = $util->getAllFiles($path);
} else {
$allFiles = array($path);
}
foreach ($allFiles as $path) {
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $path);
$failed = array();
// Attempt to set shareKey
if ( ! $util->setSharedFileKeyfiles( $session, $usersSharing, $path ) ) {
if (!$util->setSharedFileKeyfiles($session, $usersSharing, $path)) {
$failed[] = $path;
}
}
// If no attempts to set keyfiles failed
if ( empty( $failed ) ) {
if (empty($failed)) {
return true;
} else {
return false;
}
}
}
/**

@ -939,4 +939,24 @@ class Util {
}
/**
*@ brief geo recursively through a dir and collect all files and sub files.
* @param type $dir relative to the users files folder
* @return array with list of files relative to the users files folder
*/
public function getAllFiles($dir) {
$result = array();
$path = $this->view->getLocalFile();
$content = $this->view->getDirectoryContent("/".$this->userFilesDir.'/'.$this->filesFolderName.$dir);
foreach ($content as $c) {
if ($c['type'] === "dir" ) {
$result = array_merge($result, $this->getAllFiles(substr($c['path'],5)));
} else {
$result[] = substr($c['path'], 5);
}
}
return $result;
}
}