Fixed quota wrapper to not wrap failed fopen streams

When calling fopen() on some storage types, these return false instead
of throwing an exception.

This fix makes sure that in case the stream wasn't opened (for example
when a file doesn't exist any more) the stream isn't wrapped.

Also added 'rb' as another case that doesn't need to be wrapped.

Fixes #6832
remotes/origin/ldap_group_count
Vincent Petry 11 years ago
parent 903b330ccc
commit 1af7dab535
  1. 2
      lib/private/files/storage/wrapper/quota.php
  2. 19
      tests/lib/files/storage/wrapper/quota.php

@ -95,7 +95,7 @@ class Quota extends Wrapper {
public function fopen($path, $mode) {
$source = $this->storage->fopen($path, $mode);
$free = $this->free_space('');
if ($free >= 0 && $mode !== 'r') {
if ($source && $free >= 0 && $mode !== 'r' && $mode !== 'rb') {
return \OC\Files\Stream\Quota::wrap($source, $free);
} else {
return $source;

@ -59,6 +59,20 @@ class Quota extends \Test\Files\Storage\Storage {
$this->assertEquals('foobarqwe', $instance->file_get_contents('foo'));
}
public function testReturnFalseWhenFopenFailed(){
$failStorage = $this->getMock(
'\OC\Files\Storage\Local',
array('fopen'),
array(array('datadir' => $this->tmpDir)));
$failStorage->expects($this->any())
->method('fopen')
->will($this->returnValue(false));
$instance = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $failStorage, 'quota' => 1000));
$this->assertFalse($instance->fopen('failedfopen', 'r'));
}
public function testReturnRegularStreamOnRead(){
$instance = $this->getLimitedStorage(9);
@ -71,6 +85,11 @@ class Quota extends \Test\Files\Storage\Storage {
$meta = stream_get_meta_data($stream);
$this->assertEquals('plainfile', $meta['wrapper_type']);
fclose($stream);
$stream = $instance->fopen('foo', 'rb');
$meta = stream_get_meta_data($stream);
$this->assertEquals('plainfile', $meta['wrapper_type']);
fclose($stream);
}
public function testReturnQuotaStreamOnWrite(){

Loading…
Cancel
Save