diff options
-rw-r--r-- | include/attach.php | 10 | ||||
-rw-r--r-- | include/reddav.php | 9 | ||||
-rw-r--r-- | mod/attach.php | 9 | ||||
-rw-r--r-- | mod/filestorage.php | 4 | ||||
-rw-r--r-- | view/tpl/filestorage.tpl | 8 |
5 files changed, 29 insertions, 11 deletions
diff --git a/include/attach.php b/include/attach.php index e602af984..b48dd211a 100644 --- a/include/attach.php +++ b/include/attach.php @@ -188,13 +188,13 @@ function attach_by_hash($hash,$rev = 0) { $sql_extra = permissions_sql($r[0]['uid']); // Now we'll see if we can access the attachment -dbg(1); + $r = q("SELECT * FROM attach WHERE hash = '%s' and uid = %d $sql_extra LIMIT 1", dbesc($hash), intval($r[0]['uid']) ); -dbg(0); + if(! $r) { $ret['message'] = t('Permission denied.'); return $ret; @@ -672,3 +672,9 @@ function attach_change_permissions($channel_id,$resource,$allow_cid,$allow_gid,$ } +function pipe_streams($in, $out) { + $size = 0; + while (!feof($in)) + $size += fwrite($out,fread($in,8192)); + return $size; +}
\ No newline at end of file diff --git a/include/reddav.php b/include/reddav.php index 543cdfeac..05a93b9f8 100644 --- a/include/reddav.php +++ b/include/reddav.php @@ -376,11 +376,16 @@ class RedFile extends DAV\Node implements DAV\IFile { function get() { logger('RedFile::get: ' . basename($this->name)); - $r = q("select data from attach where hash = '%s' and uid = %d limit 1", + $r = q("select data, flags from attach where hash = '%s' and uid = %d limit 1", dbesc($this->data['hash']), intval($this->data['uid']) ); - if($r) return $r[0]['data']; + if($r) { + if($r[0]['flags'] & ATTACH_FLAG_OS ) { + return fopen($r[0]['data'],'rb'); + } + return $r[0]['data']; + } } diff --git a/mod/attach.php b/mod/attach.php index a5f9d1a6b..8676baa58 100644 --- a/mod/attach.php +++ b/mod/attach.php @@ -19,8 +19,13 @@ function attach_init(&$a) { header('Content-type: ' . $r['data']['filetype']); header('Content-disposition: attachment; filename=' . $r['data']['filename']); - if($r['data']['flags'] & ATTACH_FLAG_OS ) - echo @file_get_contents($r['data']['data']); + if($r['data']['flags'] & ATTACH_FLAG_OS ) { + $stream = fopen($r['data']['data'],'rb'); + if($stream) { + pipe_stream($stream,STDOUT); + fclose($stream); + } + } else echo $r['data']['data']; killme(); diff --git a/mod/filestorage.php b/mod/filestorage.php index 152b449c2..1063de256 100644 --- a/mod/filestorage.php +++ b/mod/filestorage.php @@ -137,7 +137,9 @@ function filestorage_content(&$a) { 'id' => $rr['id'], 'download' => $rr['hash'], 'title' => $rr['filename'], - 'size' => $rr['filesize'] + 'size' => $rr['filesize'], + 'rev' => $rr['revision'] + ); } } diff --git a/view/tpl/filestorage.tpl b/view/tpl/filestorage.tpl index a3eab83d5..7decd5ea6 100644 --- a/view/tpl/filestorage.tpl +++ b/view/tpl/filestorage.tpl @@ -7,10 +7,10 @@ {{foreach $files as $key => $items}} {{foreach $items as $item}} <div class="files-list-item"> - <a href="attach/{{$item.download}}">{{$download}}</a> | - <a href="{{$baseurl}}/{{$item.id}}/edit">{{$edit}} | - <a href="{{$baseurl}}/{{$item.id}}/delete">{{$delete}} - <a href="page/{{$channel}}/{{$item.title}}">{{$title}}</a> {{$item.title}} | + <a href="{{$baseurl}}/{{$item.id}}/edit">{{$edit}}</a> | + <a href="{{$baseurl}}/{{$item.id}}/delete">{{$delete}}</a> | + [attachment]{{$item.download}},{{$item.rev}}[/attachment] | + <a href="attach/{{$item.download}}">{{$item.title}}</a> | {{$item.size}} bytes </div> |