|
|
|
|
@ -273,96 +273,20 @@ class Proxy extends \OC_FileProxy { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @brief When a file is renamed, rename its keyfile also |
|
|
|
|
* @return bool Result of rename() |
|
|
|
|
* @note This is pre rather than post because using post didn't work |
|
|
|
|
*/ |
|
|
|
|
public function preRename( $oldPath, $newPath ) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
// Disable encryption proxy to prevent recursive calls |
|
|
|
|
$proxyStatus = \OC_FileProxy::$enabled; |
|
|
|
|
\OC_FileProxy::$enabled = false; |
|
|
|
|
|
|
|
|
|
$view = new \OC_FilesystemView('/'); |
|
|
|
|
|
|
|
|
|
$userId = \OCP\USER::getUser(); |
|
|
|
|
|
|
|
|
|
// Format paths to be relative to user files dir |
|
|
|
|
$oldTrimmed = ltrim($oldPath, '/'); |
|
|
|
|
$oldSplit = explode('/', $oldTrimmed); |
|
|
|
|
$oldSliced = array_slice($oldSplit, 2); |
|
|
|
|
$oldRelPath = implode('/', $oldSliced); |
|
|
|
|
$oldKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $oldRelPath; |
|
|
|
|
|
|
|
|
|
$newTrimmed = ltrim($newPath, '/'); |
|
|
|
|
$newSplit = explode('/', $newTrimmed); |
|
|
|
|
$newSliced = array_slice($newSplit, 2); |
|
|
|
|
$newRelPath = implode('/', $newSliced); |
|
|
|
|
$newKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $newRelPath; |
|
|
|
|
|
|
|
|
|
// add key ext if this is not an folder |
|
|
|
|
if (!$view->is_dir($oldKeyfilePath)) { |
|
|
|
|
$oldKeyfilePath .= '.key'; |
|
|
|
|
$newKeyfilePath .= '.key'; |
|
|
|
|
|
|
|
|
|
// handle share-keys |
|
|
|
|
$localKeyPath = $view->getLocalFile($userId.'/files_encryption/share-keys/'.$oldRelPath); |
|
|
|
|
$matches = glob(preg_quote($localKeyPath).'*.shareKey'); |
|
|
|
|
foreach ($matches as $src) { |
|
|
|
|
$dst = str_replace($oldRelPath, $newRelPath, $src); |
|
|
|
|
rename($src, $dst); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
// handle share-keys folders |
|
|
|
|
$oldShareKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $oldRelPath; |
|
|
|
|
$newShareKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $newRelPath; |
|
|
|
|
$view->rename($oldShareKeyfilePath, $newShareKeyfilePath); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Rename keyfile so it isn't orphaned |
|
|
|
|
$result = $view->rename($oldKeyfilePath, $newKeyfilePath); |
|
|
|
|
|
|
|
|
|
\OC_FileProxy::$enabled = $proxyStatus; |
|
|
|
|
|
|
|
|
|
return $result; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @brief When a file is renamed, rename its keyfile also |
|
|
|
|
* @return bool Result of rename() |
|
|
|
|
* @note This is pre rather than post because using post didn't work |
|
|
|
|
*/ |
|
|
|
|
public function postRename( $oldPath, $newPath ) |
|
|
|
|
public function postWrite( $path ) |
|
|
|
|
{ |
|
|
|
|
$this->handleFile($path); |
|
|
|
|
|
|
|
|
|
// Disable encryption proxy to prevent recursive calls |
|
|
|
|
$proxyStatus = \OC_FileProxy::$enabled; |
|
|
|
|
\OC_FileProxy::$enabled = false; |
|
|
|
|
|
|
|
|
|
$view = new \OC_FilesystemView('/'); |
|
|
|
|
$session = new Session($view); |
|
|
|
|
$userId = \OCP\User::getUser(); |
|
|
|
|
$util = new Util( $view, $userId ); |
|
|
|
|
|
|
|
|
|
// Reformat path for use with OC_FSV |
|
|
|
|
$newPathSplit = explode( '/', $newPath ); |
|
|
|
|
$newPathRelative = implode( '/', array_slice( $newPathSplit, 3 ) ); |
|
|
|
|
|
|
|
|
|
if($util->fixFileSize($newPath)) { |
|
|
|
|
// get sharing app state |
|
|
|
|
$sharingEnabled = \OCP\Share::isEnabled(); |
|
|
|
|
|
|
|
|
|
// get users |
|
|
|
|
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $newPathRelative); |
|
|
|
|
|
|
|
|
|
// update sharing-keys |
|
|
|
|
$util->setSharedFileKeyfiles($session, $usersSharing, $newPathRelative); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
\OC_FileProxy::$enabled = $proxyStatus; |
|
|
|
|
public function postTouch( $path ) |
|
|
|
|
{ |
|
|
|
|
$this->handleFile($path); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
@ -480,25 +404,28 @@ class Proxy extends \OC_FileProxy { |
|
|
|
|
return $data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function postStat( $path, $data ) { |
|
|
|
|
public function postStat($path, $data) |
|
|
|
|
{ |
|
|
|
|
// check if file is encrypted |
|
|
|
|
if (Crypt::isCatfileContent($path)) { |
|
|
|
|
|
|
|
|
|
if ( Crypt::isCatfileContent( $path ) ) { |
|
|
|
|
|
|
|
|
|
$cached = \OC\Files\Filesystem::getFileInfo( $path, '' ); |
|
|
|
|
|
|
|
|
|
$data['size'] = $cached['unencrypted_size']; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $data; |
|
|
|
|
} |
|
|
|
|
// get file info from cache |
|
|
|
|
$cached = \OC\Files\Filesystem::getFileInfo($path, ''); |
|
|
|
|
|
|
|
|
|
public function postFileSize( $path, $size ) { |
|
|
|
|
// set the real file size |
|
|
|
|
$data['size'] = $cached['unencrypted_size']; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$view = new \OC_FilesystemView( '/' ); |
|
|
|
|
return $data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function postFileSize($path, $size) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
$view = new \OC_FilesystemView('/'); |
|
|
|
|
|
|
|
|
|
// if path is a folder do nothing |
|
|
|
|
if($view->is_dir($path)) { |
|
|
|
|
if ($view->is_dir($path)) { |
|
|
|
|
return $size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -510,10 +437,41 @@ class Proxy extends \OC_FileProxy { |
|
|
|
|
$fileInfo = \OC\Files\Filesystem::getFileInfo($path_f); |
|
|
|
|
|
|
|
|
|
// if file is encrypted return real file size |
|
|
|
|
if(is_array($fileInfo) && $fileInfo['encrypted'] == 1) { |
|
|
|
|
if (is_array($fileInfo) && $fileInfo['encrypted'] == 1) { |
|
|
|
|
return $fileInfo['unencrypted_size']; |
|
|
|
|
} else { |
|
|
|
|
return $size; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function handleFile($path) { |
|
|
|
|
|
|
|
|
|
// Disable encryption proxy to prevent recursive calls |
|
|
|
|
$proxyStatus = \OC_FileProxy::$enabled; |
|
|
|
|
\OC_FileProxy::$enabled = false; |
|
|
|
|
|
|
|
|
|
$view = new \OC_FilesystemView('/'); |
|
|
|
|
$session = new Session($view); |
|
|
|
|
$userId = \OCP\User::getUser(); |
|
|
|
|
$util = new Util( $view, $userId ); |
|
|
|
|
|
|
|
|
|
// Reformat path for use with OC_FSV |
|
|
|
|
$path_split = explode( '/', $path ); |
|
|
|
|
$path_f = implode( '/', array_slice( $path_split, 3 ) ); |
|
|
|
|
|
|
|
|
|
// only if file is on 'files' folder fix file size and sharing |
|
|
|
|
if($path_split[2] == 'files' && $util->fixFileSize($path)) { |
|
|
|
|
|
|
|
|
|
// get sharing app state |
|
|
|
|
$sharingEnabled = \OCP\Share::isEnabled(); |
|
|
|
|
|
|
|
|
|
// get users |
|
|
|
|
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $path_f); |
|
|
|
|
|
|
|
|
|
// update sharing-keys |
|
|
|
|
$util->setSharedFileKeyfiles($session, $usersSharing, $path_f); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
\OC_FileProxy::$enabled = $proxyStatus; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|