server/tests/lib/tempmanager.php
Lukas Reschke 9622fbdf29 Filter potential dangerous characters in path name
We should not allow / or \ in the postfix here.
2015-03-26 23:17:18 +01:00

167 lines
4.6 KiB
PHP

<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace Test;
use OC\Log;
class NullLogger extends Log {
public function __construct($logger = null) {
//disable original constructor
}
public function log($level, $message, array $context = array()) {
//noop
}
}
class TempManager extends \Test\TestCase {
protected $baseDir;
protected function setUp() {
parent::setUp();
$this->baseDir = get_temp_dir() . $this->getUniqueID('/oc_tmp_test');
if (!is_dir($this->baseDir)) {
mkdir($this->baseDir);
}
}
protected function tearDown() {
\OC_Helper::rmdirr($this->baseDir);
parent::tearDown();
}
/**
* @param \OCP\ILogger $logger
* @return \OC\TempManager
*/
protected function getManager($logger = null) {
if (!$logger) {
$logger = new NullLogger();
}
return new \OC\TempManager($this->baseDir, $logger);
}
public function testGetFile() {
$manager = $this->getManager();
$file = $manager->getTemporaryFile('txt');
$this->assertStringEndsWith('.txt', $file);
$this->assertTrue(is_file($file));
$this->assertTrue(is_writable($file));
file_put_contents($file, 'bar');
$this->assertEquals('bar', file_get_contents($file));
}
public function testGetFolder() {
$manager = $this->getManager();
$folder = $manager->getTemporaryFolder();
$this->assertStringEndsWith('/', $folder);
$this->assertTrue(is_dir($folder));
$this->assertTrue(is_writable($folder));
file_put_contents($folder . 'foo.txt', 'bar');
$this->assertEquals('bar', file_get_contents($folder . 'foo.txt'));
}
public function testCleanFiles() {
$manager = $this->getManager();
$file1 = $manager->getTemporaryFile('txt');
$file2 = $manager->getTemporaryFile('txt');
$this->assertTrue(file_exists($file1));
$this->assertTrue(file_exists($file2));
$manager->clean();
$this->assertFalse(file_exists($file1));
$this->assertFalse(file_exists($file2));
}
public function testCleanFolder() {
$manager = $this->getManager();
$folder1 = $manager->getTemporaryFolder();
$folder2 = $manager->getTemporaryFolder();
touch($folder1 . 'foo.txt');
touch($folder1 . 'bar.txt');
$this->assertTrue(file_exists($folder1));
$this->assertTrue(file_exists($folder2));
$this->assertTrue(file_exists($folder1 . 'foo.txt'));
$this->assertTrue(file_exists($folder1 . 'bar.txt'));
$manager->clean();
$this->assertFalse(file_exists($folder1));
$this->assertFalse(file_exists($folder2));
$this->assertFalse(file_exists($folder1 . 'foo.txt'));
$this->assertFalse(file_exists($folder1 . 'bar.txt'));
}
public function testCleanOld() {
$manager = $this->getManager();
$oldFile = $manager->getTemporaryFile('txt');
$newFile = $manager->getTemporaryFile('txt');
$folder = $manager->getTemporaryFolder();
$nonOcFile = $this->baseDir . '/foo.txt';
file_put_contents($nonOcFile, 'bar');
$past = time() - 2 * 3600;
touch($oldFile, $past);
touch($folder, $past);
touch($nonOcFile, $past);
$manager2 = $this->getManager();
$manager2->cleanOld();
$this->assertFalse(file_exists($oldFile));
$this->assertFalse(file_exists($folder));
$this->assertTrue(file_exists($nonOcFile));
$this->assertTrue(file_exists($newFile));
}
public function testLogCantCreateFile() {
if (\OC_Util::runningOnWindows()) {
$this->markTestSkipped('[Windows] chmod() does not work as intended on Windows.');
}
$logger = $this->getMock('\Test\NullLogger');
$manager = $this->getManager($logger);
chmod($this->baseDir, 0500);
$logger->expects($this->once())
->method('warning')
->with($this->stringContains('Can not create a temporary file in directory'));
$this->assertFalse($manager->getTemporaryFile('txt'));
}
public function testLogCantCreateFolder() {
if (\OC_Util::runningOnWindows()) {
$this->markTestSkipped('[Windows] chmod() does not work as intended on Windows.');
}
$logger = $this->getMock('\Test\NullLogger');
$manager = $this->getManager($logger);
chmod($this->baseDir, 0500);
$logger->expects($this->once())
->method('warning')
->with($this->stringContains('Can not create a temporary folder in directory'));
$this->assertFalse($manager->getTemporaryFolder());
}
public function testGeneratePathTraversal() {
$logger = $this->getMock('\Test\NullLogger');
$tmpManager = \Test_Helper::invokePrivate(
$this->getManager($logger),
'generatePath',
['../Traversal\\../FileName']
);
$this->assertStringEndsNotWith('./Traversal\\../FileName', $tmpManager);
$this->assertStringEndsWith('.Traversal..FileName', $tmpManager);
}
}