Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

check free space using folder's owner #12

Merged
merged 1 commit into from
Oct 23, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/files/ajax/upload.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
foreach($files['size'] as $size) {
$totalSize+=$size;
}
if($totalSize>OC_Filesystem::free_space('/')) {
if($totalSize>OC_Filesystem::free_space($dir)){
OCP\JSON::error(array("data" => array( "message" => "Not enough space available" )));
exit();
}
Expand Down
2 changes: 1 addition & 1 deletion apps/files/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size'));
$maxUploadFilesize = min($upload_max_filesize, $post_max_size);

$freeSpace=OC_Filesystem::free_space('/');
$freeSpace=OC_Filesystem::free_space($dir);
$freeSpace=max($freeSpace,0);
$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);

Expand Down
8 changes: 8 additions & 0 deletions apps/files_sharing/lib/sharedstorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,14 @@ private function getInternalPath($path) {
return $internalPath;
}

public function getOwner($target) {
$shared_item = OCP\Share::getItemSharedWith('folder', $target, OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
if ($shared_item) {
return $shared_item[0]["uid_owner"];
}
return null;
}

public function mkdir($path) {
if ($path == '' || $path == '/' || !$this->isCreatable(dirname($path))) {
return false;
Expand Down
54 changes: 30 additions & 24 deletions lib/fileproxy/quota.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,52 +27,58 @@

class OC_FileProxy_Quota extends OC_FileProxy{
static $rootView;
private $userQuota=-1;
private $userQuota=array();

/**
* get the quota for the current user
* get the quota for the user
* @param user
* @return int
*/
private function getQuota() {
if($this->userQuota!=-1) {
return $this->userQuota;
private function getQuota($user) {
if(in_array($user, $this->userQuota)) {
return $this->userQuota[$user];
}
$userQuota=OC_Preferences::getValue(OC_User::getUser(),'files','quota','default');
$userQuota=OC_Preferences::getValue($user,'files','quota','default');
if($userQuota=='default') {
$userQuota=OC_AppConfig::getValue('files','default_quota','none');
}
if($userQuota=='none') {
$this->userQuota=0;
$this->userQuota[$user]=0;
}else{
$this->userQuota=OC_Helper::computerFileSize($userQuota);
$this->userQuota[$user]=OC_Helper::computerFileSize($userQuota);
}
return $this->userQuota;
return $this->userQuota[$user];

}

/**
* get the free space in the users home folder
* get the free space in the path's owner home folder
* @param path
* @return int
*/
private function getFreeSpace() {
$rootInfo=OC_FileCache_Cached::get('');
private function getFreeSpace($path) {
$storage=OC_Filesystem::getStorage($path);
$owner=$storage->getOwner($path);

$totalSpace=$this->getQuota($owner);
if($totalSpace==0) {
return 0;
}

$rootInfo=OC_FileCache::get('', "/".$owner."/files");
// TODO Remove after merge of share_api
if (OC_FileCache::inCache('/Shared')) {
$sharedInfo=OC_FileCache_Cached::get('/Shared');
if (OC_FileCache::inCache('/Shared', "/".$owner."/files")) {
$sharedInfo=OC_FileCache::get('/Shared', "/".$owner."/files");
} else {
$sharedInfo = null;
}
$usedSpace=isset($rootInfo['size'])?$rootInfo['size']:0;
$usedSpace=isset($sharedInfo['size'])?$usedSpace-$sharedInfo['size']:$usedSpace;
$totalSpace=$this->getQuota();
if($totalSpace==0) {
return 0;
}
return $totalSpace-$usedSpace;
}

public function postFree_space($path,$space) {
$free=$this->getFreeSpace();
$free=$this->getFreeSpace($path);
if($free==0) {
return $space;
}
Expand All @@ -83,21 +89,21 @@ public function preFile_put_contents($path,$data) {
if (is_resource($data)) {
$data = '';//TODO: find a way to get the length of the stream without emptying it
}
return (strlen($data)<$this->getFreeSpace() or $this->getFreeSpace()==0);
return (strlen($data)<$this->getFreeSpace($path) or $this->getFreeSpace($path)==0);
}

public function preCopy($path1,$path2) {
if(!self::$rootView){
self::$rootView = new OC_FilesystemView('');
}
return (self::$rootView->filesize($path1)<$this->getFreeSpace() or $this->getFreeSpace()==0);
return (self::$rootView->filesize($path1)<$this->getFreeSpace($path2) or $this->getFreeSpace($path2)==0);
}

public function preFromTmpFile($tmpfile,$path) {
return (filesize($tmpfile)<$this->getFreeSpace() or $this->getFreeSpace()==0);
return (filesize($tmpfile)<$this->getFreeSpace($path) or $this->getFreeSpace($path)==0);
}

public function preFromUploadedFile($tmpfile,$path) {
return (filesize($tmpfile)<$this->getFreeSpace() or $this->getFreeSpace()==0);
return (filesize($tmpfile)<$this->getFreeSpace($path) or $this->getFreeSpace($path)==0);
}
}
1 change: 1 addition & 0 deletions lib/filestorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,5 @@ abstract public function getLocalFolder($path);// get a path to a local version
* returning true for other changes in the folder is optional
*/
abstract public function hasUpdated($path,$time);
abstract public function getOwner($path);
}
9 changes: 9 additions & 0 deletions lib/filestorage/common.php
Original file line number Diff line number Diff line change
Expand Up @@ -279,4 +279,13 @@ protected function searchInDir($query,$dir='') {
public function hasUpdated($path,$time) {
return $this->filemtime($path)>$time;
}

/**
* get the owner of a path
* @param $path The path to get the owner
* @return string uid or false
*/
public function getOwner($path) {
return OC_User::getUser();
}
}