diff options
-rw-r--r-- | apps/files_encryption/hooks/hooks.php | 35 | ||||
-rwxr-xr-x | apps/files_encryption/lib/crypt.php | 30 | ||||
-rw-r--r-- | lib/public/share.php | 65 |
3 files changed, 63 insertions, 67 deletions
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index 17bcb9238ac..c14ce3e91db 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -167,44 +167,21 @@ class Hooks { * @brief
*/
public static function postShared( $params ) {
- error_log("post shared triggered!");
+
// NOTE: $params is an array with these keys:
// itemSource -> int, filecache file ID
// shareWith -> string, uid of user being shared to
// fileTarget -> path of file being shared
// uidOwner -> owner of the original file being shared
+ //TODO: We don't deal with shared folder yet, need to recursively update every file in the folder
+
$view = new \OC_FilesystemView( '/' );
$userId = \OCP\User::getUser();
$util = new Util( $view, $userId );
- $shares = \OCP\Share::getUsersSharingFile( $params['fileTarget'], 1 );
-
- $userIds = array();
-
- foreach ( $shares as $share ) {
-
- $util = new Util( $view, $share['userId'] );
-
- // Check that the user is encryption capable
- // TODO create encryption key when user gets created
- if ( $util->ready() ) {
-
- // Construct array of just UIDs for Keymanager{}
- $userIds[] = $share['userId'];
-
- } else {
-
- // Log warning; we can't do necessary setup here
- // because we don't have the user passphrase
- // TODO: Provide user feedback indicating that
- // sharing failed
- \OC_Log::write( 'Encryption library', 'File cannot be shared: user "'.$share['userId'].'" is not setup for encryption', \OC_Log::WARN );
-
- }
+ $shares = \OCP\Share::getUsersSharingFile( $params['itemSource'], 1 );
- }
-
return Crypt::encKeyfileToMultipleUsers($shares, $params['fileTarget']);
}
@@ -213,11 +190,11 @@ class Hooks { * @brief
*/
public static function preUnshare( $params ) {
- $items = \OCP\Share::getItemSharedWithBySource($params['itemType'], $params['itemSource']);
- $shares = \OCP\Share::getUsersSharingFile( $item[0]['file_target'], 1 );
+ $shares = \OCP\Share::getUsersSharingFile( $params['itemSource'], 1 );
$userIds = array();
foreach ( $shares as $share ) {
+ error_log("keek user id: " . $share['userId']);
$userIds[] = $share['userId'];
}
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index 6704ea6bf18..a8cc2b3726d 100755 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -752,16 +752,40 @@ class Crypt { */
public static function encKeyfileToMultipleUsers($users, $fileTarget) {
$view = new \OC_FilesystemView( '/' );
- $userId = \OCP\User::getUser();
+ $owner = \OCP\User::getUser();
$util = new Util( $view, $userId );
$session = new Session();
+
+ $userIds = array();
+
+ foreach ( $users as $user ) {
+
+ $util = new Util( $view, $user );
+
+ // Check that the user is encryption capable
+ if ( $util->ready() ) {
+ // Construct array of just UIDs for Keymanager{}
+ $userIds[] = $user;
+
+ } else {
+
+ // Log warning; we can't do necessary setup here
+ // because we don't have the user passphrase
+ // TODO: Provide user feedback indicating that
+ // sharing failed
+ \OC_Log::write( 'Encryption library', 'File cannot be shared: user "'.$user.'" is not setup for encryption', \OC_Log::WARN );
+
+ }
+
+ }
+
- $userPubKeys = Keymanager::getPublicKeys( $view, $users );
+ $userPubKeys = Keymanager::getPublicKeys( $view, $userIds );
\OC_FileProxy::$enabled = false;
// get the keyfile
- $encKeyfile = Keymanager::getFileKey( $view, $userId, $fileTarget );
+ $encKeyfile = Keymanager::getFileKey( $view, $owner, $fileTarget );
$privateKey = $session->getPrivateKey();
diff --git a/lib/public/share.php b/lib/public/share.php index 4170783d71e..841240692d8 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -149,62 +149,57 @@ 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( $path, $includeOwner = 0 ) { - - $fPath = self::prepFileTarget( $path ); - + 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_type - , share_with - , uid_owner - , permissions + 'SELECT share_with FROM `*PREFIX*share` WHERE - file_target = ?' + item_source = ? AND share_type = ? AND uid_owner = ?' ); - $result = $query->execute( array( $fPath ) ); + $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) . ', path=' . $fPath, \OC_Log::ERROR ); - + \OC_Log::write( 'OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR ); } $shares = array(); while( $row = $result->fetchRow() ) { + $shares[] = $row['share_with']; + } - // Set helpful array keys - $shares[] = array( - 'userId' => $row['share_with'] - , 'owner' => $row['uid_owner'] // we just set this so it can be used once, hugly hack :/ - , 'shareType' => $row['share_type'] - , 'permissions' => $row['permissions'] - ); + // 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, \OCP\User::getUser() ) ); + + 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); + } + if ( ! empty( $shares ) ) { - // Include owner in list of users, if requested if ( $includeOwner == 1 ) { - - // NOTE: The values are incorrect for shareType and - // permissions of the owner; we just include them for - // optional convenience - $shares[] = array( - 'userId' => $shares[0]['owner'] - , 'shareType' => 0 - , 'permissions' => 0 - ); - + $shares[] = \OCP\User::getUser(); } - - return $shares; + + return array_unique($shares); } else { @@ -235,7 +230,7 @@ class Share { public static function getItemSharedWith($itemType, $itemTarget, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { return self::getItems($itemType, $itemTarget, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, $format, $parameters, 1, $includeCollections); } - + /** * @brief Get the item of item type shared with the current user by source * @param string Item type |