$error = array(); $success = array(); $i = 0; foreach ($list as $file) { $path = $dir . '/' . $file; if ($dir === '/') { $file = ltrim($file, '/'); $delimiter = strrpos($file, '.d'); $filename = substr($file, 0, $delimiter); $timestamp = substr($file, $delimiter + 2); } else { $path_parts = pathinfo($file); $filename = $path_parts['basename']; $timestamp = null; } if (!OCA\Files_Trashbin\Trashbin::restore($path, $filename, $timestamp)) { $error[] = $filename; \OCP\Util::writeLog('trashbin', 'can\'t restore ' . $filename, \OCP\Util::ERROR); } else { $success[$i]['filename'] = $file; $success[$i]['timestamp'] = $timestamp; $i++; } } if ($error) { $filelist = ''; foreach ($error as $e) { $filelist .= $e . ', '; } $l = OC::$server->getL10N('files_trashbin'); $message = $l->t("Couldn't restore %s", array(rtrim($filelist, ', ')));
/** * Test restoring a file into a read-only folder, will restore * the file to root instead */ public function testRestoreFileIntoReadOnlySourceFolder() { $userFolder = \OC::$server->getUserFolder(); $folder = $userFolder->newFolder('folder'); $file = $folder->newFile('file1.txt'); $file->putContent('foo'); $this->assertTrue($userFolder->nodeExists('folder/file1.txt')); $file->delete(); $this->assertFalse($userFolder->nodeExists('folder/file1.txt')); $filesInTrash = OCA\Files_Trashbin\Helper::getTrashFiles('/', self::TEST_TRASHBIN_USER1, 'mtime'); $this->assertCount(1, $filesInTrash); /** @var \OCP\Files\FileInfo */ $trashedFile = $filesInTrash[0]; // delete source folder list($storage, $internalPath) = $this->rootView->resolvePath('/' . self::TEST_TRASHBIN_USER1 . '/files/folder'); if ($storage instanceof \OC\Files\Storage\Local) { $folderAbsPath = $storage->getSourcePath($internalPath); // make folder read-only chmod($folderAbsPath, 0555); $this->assertTrue(OCA\Files_Trashbin\Trashbin::restore('file1.txt.d' . $trashedFile->getMtime(), $trashedFile->getName(), $trashedFile->getMtime())); $file = $userFolder->get('file1.txt'); $this->assertEquals('foo', $file->getContent()); chmod($folderAbsPath, 0755); } }