$timestamp = time();
$userTrashSize = self::getTrashbinSize($user);
- if ($userTrashSize === false || $userTrashSize < 0) {
- $userTrashSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
// disable proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
$userTrashSize += $size;
$userTrashSize -= self::expire($userTrashSize, $user);
- self::setTrashbinSize($user, $userTrashSize);
// if owner !== user we also need to update the owners trash size
if($owner !== $user) {
$ownerTrashSize = self::getTrashbinSize($owner);
- if ($ownerTrashSize === false || $ownerTrashSize < 0) {
- $ownerTrashSize = self::calculateSize(new \OC\Files\View('/' . $owner . '/files_trashbin'));
- }
$ownerTrashSize += $size;
$ownerTrashSize -= self::expire($ownerTrashSize, $owner);
- self::setTrashbinSize($owner, $ownerTrashSize);
}
}
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
- $trashbinSize = self::getTrashbinSize($user);
- if ($trashbinSize === false || $trashbinSize < 0) {
- $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
$location = '';
if ($timestamp) {
$query = \OC_DB::prepare('SELECT `location` FROM `*PREFIX*files_trash`'
$view->chroot($fakeRoot);
\OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_restore', array('filePath' => \OC\Files\Filesystem::normalizePath('/' . $location . '/' . $uniqueFilename),
'trashPath' => \OC\Files\Filesystem::normalizePath($file)));
- if ($view->is_dir($target)) {
- $trashbinSize -= self::calculateSize(new \OC\Files\View('/' . $user . '/' . $target));
- } else {
- $trashbinSize -= $view->filesize($target);
- }
- $trashbinSize -= self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
- $trashbinSize -= self::restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp);
+ self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
+ self::restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp);
if ($timestamp) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
$query->execute(array($user, $filename, $timestamp));
}
- self::setTrashbinSize($user, $trashbinSize);
-
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
* @param $location location if file
* @param $timestamp deleteion time
*
- * @return size of restored versions
*/
private static function restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp) {
- $size = 0;
if (\OCP\App::isEnabled('files_versions')) {
// disable proxy to prevent recursive calls
}
if ($view->is_dir('/files_trashbin/versions/' . $file)) {
- $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . 'files_trashbin/versions/' . $file));
$rootView->rename(\OC\Files\Filesystem::normalizePath($user . '/files_trashbin/versions/' . $file), \OC\Files\Filesystem::normalizePath($owner . '/files_versions/' . $ownerPath));
} else if ($versions = self::getVersionsFromTrash($versionedFile, $timestamp)) {
foreach ($versions as $v) {
if ($timestamp) {
- $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp);
$rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp, $owner . '/files_versions/' . $ownerPath . '.v' . $v);
} else {
- $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v);
$rootView->rename($user . '/files_trashbin/versions/' . $versionedFile . '.v' . $v, $owner . '/files_versions/' . $ownerPath . '.v' . $v);
}
}
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
}
- return $size;
}
/**
* @param $location location of file
* @param $timestamp deleteion time
*
- * @return size of restored encrypted file
*/
private static function restoreEncryptionKeys($view, $file, $filename, $uniqueFilename, $location, $timestamp) {
// Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!)
- $size = 0;
if (\OCP\App::isEnabled('files_encryption')) {
$user = \OCP\User::getUser();
$rootView = new \OC\Files\View('/');
if ($rootView->is_dir($keyfile)) {
// handle keyfiles
- $size += self::calculateSize(new \OC\Files\View($keyfile));
$rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath);
// handle share-keys
if ($timestamp) {
$sharekey .= '.d' . $timestamp;
}
- $size += self::calculateSize(new \OC\Files\View($sharekey));
$rootView->rename($sharekey, $baseDir . '/share-keys/' . $ownerPath);
} else {
// handle keyfiles
- $size += $rootView->filesize($keyfile);
$rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath . '.key');
// handle share-keys
$ownerShareKey .= '.d' . $timestamp;
}
- $size += $rootView->filesize($ownerShareKey);
-
// move only owners key
$rootView->rename($ownerShareKey, $baseDir . '/share-keys/' . $ownerPath . '.' . $user . '.shareKey');
// enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
}
- return $size;
}
/**
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
$view->deleteAll('files_trashbin');
- self::setTrashbinSize($user, 0);
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=?');
$query->execute(array($user));
$view = new \OC\Files\View('/' . $user);
$size = 0;
- $trashbinSize = self::getTrashbinSize($user);
- if ($trashbinSize === false || $trashbinSize < 0) {
- $trashbinSize = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
-
if ($timestamp) {
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
$query->execute(array($user, $filename, $timestamp));
}
$view->unlink('/files_trashbin/files/' . $file);
\OC_Hook::emit('\OCP\Trashbin', 'delete', array('path' => '/files_trashbin/files/' . $file));
- $trashbinSize -= $size;
- self::setTrashbinSize($user, $trashbinSize);
return $size;
}
$size = self::getTrashbinSize($user);
- if ($size === false || $size < 0) {
- $size = self::calculateSize(new \OC\Files\View('/' . $user . '/files_trashbin'));
- }
-
$freeSpace = self::calculateFreeSpace($size);
if ($freeSpace < 0) {
- $newSize = $size - self::expire($size, $user);
- if ($newSize !== $size) {
- self::setTrashbinSize($user, $newSize);
- }
+ self::expire($size, $user);
}
}
* @return mixed trash bin size or false if no trash bin size is stored
*/
private static function getTrashbinSize($user) {
- $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*files_trashsize` WHERE `user`=?');
- $result = $query->execute(array($user))->fetchAll();
-
- if ($result) {
- return (int)$result[0]['size'];
- }
- return false;
- }
-
- /**
- * write to the database how much space is in use for the trash bin
- *
- * @param $user owner of the trash bin
- * @param $size size of the trash bin
- */
- private static function setTrashbinSize($user, $size) {
- if (self::getTrashbinSize($user) === false) {
- $query = \OC_DB::prepare('INSERT INTO `*PREFIX*files_trashsize` (`size`, `user`) VALUES (?, ?)');
- } else {
- $query = \OC_DB::prepare('UPDATE `*PREFIX*files_trashsize` SET `size`=? WHERE `user`=?');
- }
- $query->execute(array($size, $user));
+ $view = new \OC\Files\View('/' . $user);
+ $fileInfo = $view->getFileInfo('/files_trashbin');
+ return $fileInfo['size'];
}
/**