use preShare hook only to check if all pub keys are available and the postShare hook to finaly update the shareKeys if the file was shared successfully

remotes/origin/stable6
Björn Schießle 2013-05-13 14:28:45 +07:00
parent 8e004cc3e1
commit a6ef25ba08
3 changed files with 57 additions and 112 deletions

@ -179,11 +179,40 @@ class Hooks {
}
}
/*
* @brief check if files can be encrypted to every user.
*/
public static function preShared($params) {
$users = array();
$view = new \OC\Files\View('/public-keys/');
switch ($params['shareType']) {
case \OCP\Share::SHARE_TYPE_USER:
$users[] = $params['shareWith'];
break;
case \OCP\Share::SHARE_TYPE_GROUP:
$users = \OC_Group::usersInGroup($params['shareWith']);
break;
}
foreach ($users as $user) {
if (!$view->file_exists($user . '.public.key')) {
// Set flag var 'run' to notify emitting
// script that hook execution failed
$params['run']->run = false;
// TODO: Make sure files_sharing provides user
// feedback on failed share
break;
}
}
}
/**
* @brief
*/
public static function preShared( $params ) {
public static function postShared($params) {
// NOTE: $params has keys:
// [itemType] => file
@ -203,29 +232,28 @@ class Hooks {
// [token] =>
// [run] => whether emitting script should continue to run
// TODO: Should other kinds of item be encrypted too?
if ( $params['itemType'] === 'file' || $params['itemType'] === 'folder' ) {
$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'] );
$path = $util->fileIdToPath($params['itemSource']);
//if parent is set, then this is a re-share action
if( $params['parent'] ) {
if ($params['parent']) {
// get the parent from current share
$parent = $util->getShareParent( $params['parent'] );
$parent = $util->getShareParent($params['parent']);
// if parent is file the it is an 1:1 share
if($parent['item_type'] === 'file') {
// prefix path with Shared
$path = '/Shared'.$parent['file_target'];
if ($parent['item_type'] === 'file') {
// prefix path with Shared
$path = '/Shared' . $parent['file_target'];
} else {
// NOTE: parent is folder but shared was a file!
// we try to rebuild the missing path
// some examples we face here
@ -237,38 +265,29 @@ class Hooks {
// so our path should be
// /Shared/subfolder1/subsubfolder1/somefile.txt
// while user3 is sharing
if ( $params['itemType'] === 'file' ) {
if ($params['itemType'] === 'file') {
// get target path
$targetPath = $util->fileIdToPath( $params['fileSource'] );
$targetPathSplit = array_reverse( explode( '/', $targetPath ) );
$targetPath = $util->fileIdToPath($params['fileSource']);
$targetPathSplit = array_reverse(explode('/', $targetPath));
// init values
$path = '';
$sharedPart = ltrim( $parent['file_target'], '/' );
$sharedPart = ltrim($parent['file_target'], '/');
// rebuild path
foreach ( $targetPathSplit as $pathPart ) {
if ( $pathPart !== $sharedPart ) {
foreach ($targetPathSplit as $pathPart) {
if ($pathPart !== $sharedPart) {
$path = '/' . $pathPart . $path;
} else {
break;
}
}
// prefix path with Shared
$path = '/Shared'.$parent['file_target'].$path;
$path = '/Shared' . $parent['file_target'] . $path;
} else {
// prefix path with Shared
$path = '/Shared'.$parent['file_target'].$params['fileTarget'];
$path = '/Shared' . $parent['file_target'] . $params['fileTarget'];
}
}
}
@ -276,52 +295,15 @@ class Hooks {
$sharingEnabled = \OCP\Share::isEnabled();
// if a folder was shared, get a list if all (sub-)folders
if ( $params['itemType'] === 'folder' ) {
$allFiles = $util->getAllFiles( $path );
if ($params['itemType'] === 'folder') {
$allFiles = $util->getAllFiles($path);
} else {
$allFiles = array( $path );
$allFiles = array($path);
}
// Set array for collecting paths which can't be shared
$failed = array();
foreach ( $allFiles as $path ) {
$usersSharing = $util->getSharingUsersArray( $sharingEnabled, $path );
// check if we share to a group
if($params['shareType'] === \OCP\Share::SHARE_TYPE_GROUP) {
$usersSharing[] = reset(\OC_Group::usersInGroup($params['shareWith']));
// check if we share with link
} else if($params['shareType'] === \OCP\Share::SHARE_TYPE_LINK) {
$usersSharing[] = 'owncloud';
} else {
// Because this is a pre_share hook, the user
// being shared to is not yet included; add them
$usersSharing[] = $params['shareWith'];
}
// Attempt to set shareKey
if ( ! $util->setSharedFileKeyfiles( $session, $usersSharing, $path ) ) {
$failed[] = $path;
}
}
// If some attempts to set keyfiles failed
if ( ! empty( $failed ) ) {
// Set flag var 'run' to notify emitting
// script that hook execution failed
$params['run']->run = false;
// TODO: Make sure files_sharing provides user
// feedback on failed share
foreach ($allFiles as $path) {
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $path);
$util->setSharedFileKeyfiles( $session, $usersSharing, $path );
}
}
}

@ -35,6 +35,7 @@ class Helper {
public static function registerShareHooks() {
\OCP\Util::connectHook( 'OCP\Share', 'pre_shared', 'OCA\Encryption\Hooks', 'preShared' );
\OCP\Util::connectHook( 'OCP\Share', 'post_shared', 'OCA\Encryption\Hooks', 'postShared' );
\OCP\Util::connectHook( 'OCP\Share', 'post_unshare', 'OCA\Encryption\Hooks', 'postUnshare' );
\OCP\Util::connectHook( 'OCP\Share', 'post_unshareAll', 'OCA\Encryption\Hooks', 'postUnshareAll' );
}

@ -164,45 +164,7 @@ class Proxy extends \OC_FileProxy {
return true;
}
public function postFile_put_contents( $path, $length ) {
$userId = \OCP\USER::getUser();
$view = new \OC_FilesystemView( '/' );
$util = new Util( $view, $userId );
// Check if recoveryAdmin is enabled for system and user
// TODO: Consider storing recoveryAdmin status for user in session
if (
\OC_Appconfig::getValue( 'files_encryption', 'recoveryAdminEnabled' )
&& $util->recoveryEnabledForUser()
) {
// Get owner UID and filepath
list( $owner, $ownerPath ) = $util->getUidAndFilename( $path );
$recoveryAdminUid = \OC_Appconfig::getValue( 'files_encryption', 'recoveryAdminEnabled' );
$usersSharing = \OCP\Share::getUsersSharingFile( $ownerPath, $owner,true, true, true );
// Check if file is already shared to recoveryAdmin
if ( ! in_array( $recoveryAdminUid, $usersSharing ) ) {
$relPath = $util->stripFilesPath( $path );
// Get file info from filecache
$fileInfo = \OC\Files\Filesystem::getFileInfo( $path );
// Register share to recoveryAdmin with share API
// FIXME: Some of these vars aren't set
// FIXME: What should the permission number be to grant all rights?
// \OCP\Share::shareItem( $itemType, $itemSource, 0, $recoveryAdminUid, 17 );
}
}
}
/**
* @param string $path Path of file from which has been read
* @param string $data Data that has been read from file