This should be approaching completion for file OS storage. May be a few minor bugs remaining due to some late-breaking fixes but I've been testing it as I go.

This commit is contained in:
friendica 2014-01-08 18:06:52 -08:00
parent c4be3450bf
commit 6eda806444
3 changed files with 71 additions and 49 deletions

View File

@ -679,6 +679,12 @@ function attach_change_permissions($channel_id,$resource,$allow_cid,$allow_gid,$
function attach_delete($channel_id,$resource) {
$c = q("select channel_address from channel where channel_id = %d limit 1",
intval($channel_id)
);
$channel_address = (($c) ? $c[0]['channel_address'] : 'notfound');
$r = q("select hash, flags from attach where hash = '%s' and uid = %d limit 1",
dbesc($resource),
intval($channel_id)
@ -705,10 +711,11 @@ function attach_delete($channel_id,$resource) {
);
if($y) {
if(is_dir($y[0]['data']))
@rmdir($y[0]['data']);
elseif(file_exists($y[0]['data']))
unlink($y[0]['data']);
$f = 'store/' . $channel_address . '/' . $y[0]['data'];
if(is_dir($f))
@rmdir($f);
elseif(file_exists($f))
unlink($f);
}
}

View File

@ -115,17 +115,18 @@ class RedDirectory extends DAV\Node implements DAV\ICollection {
$filesize = 0;
$hash = random_string();
$r = q("INSERT INTO attach ( aid, uid, hash, filename, folder, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
$r = q("INSERT INTO attach ( aid, uid, hash, filename, folder, flags, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
intval($c[0]['channel_account_id']),
intval($c[0]['channel_id']),
dbesc($hash),
dbesc($name),
dbesc($this->folder_hash),
dbesc(ATTACH_FLAG_OS),
dbesc($mimetype),
intval($filesize),
intval(0),
dbesc(stream_get_contents($data)),
dbesc($this->os_path . '/' . $hash),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc($c[0]['channel_allow_cid']),
@ -136,25 +137,22 @@ class RedDirectory extends DAV\Node implements DAV\ICollection {
);
$r = q("update attach set filesize = length(data) where hash = '%s' and uid = %d limit 1",
$f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $hash;
file_put_contents($f, $data);
$size = filesize($f);
$r = q("update attach set filesize = '%s' where hash = '%s' and uid = %d limit 1",
dbesc($size),
dbesc($hash),
intval($c[0]['channel_id'])
);
$r = q("select filesize from attach where hash = '%s' and uid = %d limit 1",
dbesc($hash),
intval($c[0]['channel_id'])
);
// FIXME - delete attached file resource if using OS storage
$maxfilesize = get_config('system','maxfilesize');
if(($maxfilesize) && ($r[0]['filesize'] > $maxfilesize)) {
q("delete from attach where hash = '%s' and uid = %d limit 1",
dbesc($hash),
intval($c[0]['channel_id'])
);
if(($maxfilesize) && ($size > $maxfilesize)) {
attach_delete($c[0]['channel_id'],$hash);
return;
}
@ -163,11 +161,8 @@ class RedDirectory extends DAV\Node implements DAV\ICollection {
$x = q("select sum(filesize) as total from attach where aid = %d ",
intval($c[0]['channel_account_id'])
);
if(($x) && ($x[0]['total'] + $r[0]['filesize'] > $limit)) {
q("delete from attach where hash = '%s' and uid = %d limit 1",
dbesc($hash),
intval($c[0]['channel_id'])
);
if(($x) && ($x[0]['total'] + $size > $limit)) {
attach_delete($c[0]['channel_id'],$hash);
return;
}
}
@ -251,6 +246,7 @@ class RedDirectory extends DAV\Node implements DAV\ICollection {
$channel_id = $r[0]['channel_id'];
$this->auth->owner_id = $channel_id;
$this->auth->owner_nick = $channel_name;
$path = '/' . $channel_name;
@ -328,32 +324,45 @@ class RedFile extends DAV\Node implements DAV\IFile {
}
function put($data) {
logger('RedFile::put: ' . basename($this->name));
$r = q("select flags, data from attach where hash = '%s' and uid = %d limit 1",
dbesc($hash),
intval($c[0]['channel_id'])
);
if($r) {
if($r[0]['flags'] & ATTACH_FLAG_OS) {
@file_put_contents($r[0]['data'], $data);
$size = @filesize($r[0]['data']);
}
else {
$r = q("update attach set data = '%s' where hash = '%s' and uid = %d limit 1",
dbesc(stream_get_contents($data)),
dbesc($this->data['hash']),
intval($this->data['uid'])
);
$r = q("update attach set filesize = length(data) where hash = '%s' and uid = %d limit 1",
$r = q("select length(data) as fsize from attach where hash = '%s' and uid = %d limit 1",
dbesc($this->data['hash']),
intval($this->data['uid'])
);
if($r)
$size = $r[0]['fsize'];
}
}
$r = q("select filesize from attach where hash = '%s' and uid = %d limit 1",
dbesc($this->data['hash']),
$r = q("update attach set filesize = '%s' where hash = '%s' and uid = %d limit 1",
dbesc($size),
dbesc($hash),
intval($c[0]['channel_id'])
);
$maxfilesize = get_config('system','maxfilesize');
if(($maxfilesize) && ($r[0]['filesize'] > $maxfilesize)) {
q("delete from attach where hash = '%s' and uid = %d limit 1",
dbesc($this->data['hash']),
intval($c[0]['channel_id'])
);
if(($maxfilesize) && ($size > $maxfilesize)) {
attach_delete($c[0]['channel_id'],$hash);
return;
}
@ -362,11 +371,8 @@ class RedFile extends DAV\Node implements DAV\IFile {
$x = q("select sum(filesize) as total from attach where aid = %d ",
intval($c[0]['channel_account_id'])
);
if(($x) && ($x[0]['total'] + $r[0]['filesize'] > $limit)) {
q("delete from attach where hash = '%s' and uid = %d limit 1",
dbesc($this->data['hash']),
intval($c[0]['channel_id'])
);
if(($x) && ($x[0]['total'] + $size > $limit)) {
attach_delete($c[0]['channel_id'],$hash);
return;
}
}
@ -382,7 +388,8 @@ class RedFile extends DAV\Node implements DAV\IFile {
);
if($r) {
if($r[0]['flags'] & ATTACH_FLAG_OS ) {
return fopen($r[0]['data'],'rb');
$f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $r[0]['data'];
return fopen($f,'rb');
}
return $r[0]['data'];
}
@ -690,6 +697,7 @@ class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
public $observer = '';
public $browser;
public $owner_id;
public $owner_nick = '';
protected function validateUserPass($username, $password) {
require_once('include/auth.php');

View File

@ -17,10 +17,17 @@ function attach_init(&$a) {
return;
}
$c = q("select channel_address from channel where channel_id = %d limit 1",
intval($r[0]['uid'])
);
if(! $c)
return;
header('Content-type: ' . $r['data']['filetype']);
header('Content-disposition: attachment; filename=' . $r['data']['filename']);
if($r['data']['flags'] & ATTACH_FLAG_OS ) {
$stream = fopen($r['data']['data'],'rb');
$stream = fopen('store/' . $c[0]['channel_address'] . '/' . $r['data']['data'],'rb');
if($stream) {
pipe_stream($stream,STDOUT);
fclose($stream);