diff options
-rw-r--r-- | include/RedDAV/RedBrowser.php | 5 | ||||
-rw-r--r-- | include/RedDAV/RedFile.php | 2 | ||||
-rw-r--r-- | include/attach.php | 109 | ||||
-rw-r--r-- | include/conversation.php | 2 | ||||
-rw-r--r-- | mod/filestorage.php | 9 | ||||
-rw-r--r-- | mod/sharedwithme.php | 114 | ||||
-rw-r--r-- | view/tpl/attach_edit.tpl | 7 | ||||
-rw-r--r-- | view/tpl/cloud_header.tpl | 5 |
8 files changed, 246 insertions, 7 deletions
diff --git a/include/RedDAV/RedBrowser.php b/include/RedDAV/RedBrowser.php index 9ea2b9808..93a546086 100644 --- a/include/RedDAV/RedBrowser.php +++ b/include/RedDAV/RedBrowser.php @@ -249,7 +249,10 @@ class RedBrowser extends DAV\Browser\Plugin { '$header' => t('Files') . ": " . $this->escapeHTML($path) . "/", '$quota' => $quota, '$total' => t('Total'), - '$actionspanel' => $output + '$actionspanel' => $output, + '$shared' => t('Shared'), + '$create' => t('Create'), + 'upload' => t('Upload') )); $html .= replace_macros(get_markup_template('cloud_directory.tpl'), array( diff --git a/include/RedDAV/RedFile.php b/include/RedDAV/RedFile.php index 3a5230dc1..f2ee071b8 100644 --- a/include/RedDAV/RedFile.php +++ b/include/RedDAV/RedFile.php @@ -276,4 +276,4 @@ class RedFile extends DAV\Node implements DAV\IFile { attach_delete($this->auth->owner_id, $this->data['hash']); } -}
\ No newline at end of file +} diff --git a/include/attach.php b/include/attach.php index a76dd4b28..ec175fcb3 100644 --- a/include/attach.php +++ b/include/attach.php @@ -753,14 +753,17 @@ function attach_delete($channel_id, $resource) { $channel_address = (($c) ? $c[0]['channel_address'] : 'notfound'); - $r = q("SELECT hash, flags, folder FROM attach WHERE hash = '%s' AND uid = %d limit 1", + $r = q("SELECT hash, filename, flags, folder FROM attach WHERE hash = '%s' AND uid = %d limit 1", dbesc($resource), intval($channel_id) ); + if(! $r) return; + $url = get_parent_cloudpath($channel_id, $channel_address, $resource) . $r[0]['filename']; + // If resource is a directory delete everything in the directory recursive if($r[0]['flags'] & ATTACH_FLAG_DIR) { $x = q("SELECT hash, flags FROM attach WHERE folder = '%s' AND uid = %d", @@ -802,6 +805,8 @@ function attach_delete($channel_id, $resource) { dbesc($r[0]['folder']), intval($channel_id) ); + + file_activity($channel_id, $resource, $allow_cid='', $allow_gid='', $deny_cid='', $deny_gid='', $url, 'drop', $no_activity=false); } /** @@ -934,3 +939,105 @@ function pipe_streams($in, $out) { $size += fwrite($out, fread($in, 8192)); return $size; } + +function file_activity($channel_id, $hash, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $url, $action, $no_activity) { + + require_once('include/items.php'); + + $url = rawurlencode($url); + + $poster = get_app()->get_observer(); + + $verb = ACTIVITY_FILE . '/' . $action . '/' . $hash; + + $mid = item_message_id(); + + $item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_UNSEEN; + + if($action == 'post') { + //check if activity item exists + //if yes send drop activity and create a new one + + $r = q("SELECT * FROM item WHERE verb = '%s'", + dbesc($verb) + ); + + if($r) { + + $dmid = item_message_id(); + $updateverb = ACTIVITY_FILE . '/drop/' . $hash . '#' . $mid; + + $arr = array(); + + $arr['aid'] = get_account_id(); + $arr['uid'] = $channel_id; + $arr['mid'] = $dmid; + $arr['parent_mid'] = $dmid; + $arr['item_flags'] = $item_flags; + $arr['author_xchan'] = $poster['xchan_hash']; + $arr['owner_xchan'] = $poster['xchan_hash']; + $arr['title'] = ''; + $arr['allow_cid'] = $allow_cid; + $arr['allow_gid'] = $allow_gid; + $arr['deny_cid'] = $deny_cid; + $arr['deny_gid'] = $deny_gid; + $arr['item_restrict'] = ITEM_HIDDEN; + $arr['item_private'] = 0; + $arr['verb'] = $updateverb; + $arr['body'] = $url; + + $post = item_store($arr); + $item_id = $post['item_id']; + + if($item_id) { + proc_run('php',"include/notifier.php","activity",$item_id); + } + + //call_hooks('post_local_end', $arr); + + //notice( t('File activity updated') . EOL); + + if($no_activity) { + return; + } + + } + } + + if($no_activity) { + return; + } + + $arr = array(); + + $arr['aid'] = get_account_id(); + $arr['uid'] = $channel_id; + $arr['mid'] = $mid; + $arr['parent_mid'] = $mid; + $arr['item_flags'] = $item_flags; + $arr['author_xchan'] = $poster['xchan_hash']; + $arr['owner_xchan'] = $poster['xchan_hash']; + $arr['title'] = ''; + $arr['allow_cid'] = $allow_cid; + $arr['allow_gid'] = $allow_gid; + $arr['deny_cid'] = $deny_cid; + $arr['deny_gid'] = $deny_gid; + $arr['item_restrict'] = ITEM_HIDDEN; + $arr['item_private'] = 0; + $arr['verb'] = $verb; + $arr['body'] = $url; + + $post = item_store($arr); + $item_id = $post['item_id']; + + if($item_id) { + proc_run('php',"include/notifier.php","activity",$item_id); + } + + //call_hooks('post_local_end', $arr); + + //(($action === 'post') ? notice( t('File activity posted') . EOL) : notice( t('File activity dropped') . EOL)); + + return; + +} diff --git a/include/conversation.php b/include/conversation.php index 0d59ff92e..25c844fef 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1572,7 +1572,7 @@ function profile_tabs($a, $is_owner=False, $nickname=Null){ $tabs[] = array( 'label' => t('Files'), 'url' => $a->get_baseurl() . '/cloud/' . $nickname . ((get_observer_hash()) ? '' : '?f=&davguest=1'), - 'sel' => ((argv(0) == 'cloud') ? 'active' : ''), + 'sel' => ((argv(0) == 'cloud' || argv(0) == 'sharedwithme') ? 'active' : ''), 'title' => t('Files and Storage'), 'id' => 'files-tab', ); diff --git a/mod/filestorage.php b/mod/filestorage.php index 0a25617f0..67abc2eab 100644 --- a/mod/filestorage.php +++ b/mod/filestorage.php @@ -22,6 +22,8 @@ function filestorage_post(&$a) { $recurse = ((x($_POST, 'recurse')) ? intval($_POST['recurse']) : 0); $resource = ((x($_POST, 'filehash')) ? notags($_POST['filehash']) : ''); + $no_activity = ((x($_POST, 'no_activity')) ? intval($_POST['no_activity']) : 0); + if(! $resource) { notice(t('Item not found.') . EOL); return; @@ -37,6 +39,12 @@ function filestorage_post(&$a) { //Build directory tree and redirect $channel = $a->get_channel(); $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource); + + $filename = find_filename_by_hash($channel_id, $resource); + $url = $cloudPath . $filename; + + file_activity($channel_id, $resource, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny, $url, 'post', $no_activity); + goaway($cloudPath); } @@ -150,6 +158,7 @@ function filestorage_content(&$a) { '$submit' => t('Submit'), '$attach_btn_title' => t('Attach this file to a new post'), '$link_btn_title' => t('Show URL to this file'), + '$activity_btn_title' => t('Do not show in shared with me folder of your connections') )); echo $o; diff --git a/mod/sharedwithme.php b/mod/sharedwithme.php new file mode 100644 index 000000000..fe5a2b62e --- /dev/null +++ b/mod/sharedwithme.php @@ -0,0 +1,114 @@ +<?php +require_once('include/text.php'); +require_once('include/conversation.php'); + +function sharedwithme_content(&$a) { + if(! local_user()) { + notice( t('Permission denied.') . EOL); + return; + } + + $channel = $a->get_channel(); + + $is_owner = (local_user() && (local_user() == $channel['channel_id'])); + + $postverb = ACTIVITY_FILE . '/post/'; + $dropverb = ACTIVITY_FILE . '/drop/'; + + //maintenance - see if a file got dropped and remove it systemwide + $x = q("SELECT * FROM item WHERE verb LIKE '%s' AND uid = %d", + dbesc($dropverb . '%'), + intval(local_user()) + ); + + if($x) { + + foreach($x as $xx) { + + $hash = substr($xx['verb'], 39); + + $update = strpos($hash, '#'); + + if($update === false) { + q("DELETE FROM item WHERE verb = '%s' OR verb = '%s'", + dbesc($postverb . $hash), + dbesc($dropverb . $hash) + ); + } + + else { + + $arr = explode('#', $hash); + + q("DELETE FROM item WHERE mid != '%s' AND verb = '%s' OR verb = '%s'", + dbesc($arr[1]), + dbesc($postverb . $arr[0]), + dbesc($dropverb . $hash) + ); + + } + + } + + } + + //drop single file - localuser + if((argc() > 2) && (argv(2) === 'drop')) { + + $id = intval(argv(1)); + + q("DELETE FROM item WHERE id = %d AND uid = %d", + intval($id), + intval(local_user()) + ); + + goaway(z_root() . '/sharedfiles'); + } + + //drop all files - localuser + if((argc() > 1) && (argv(1) === 'dropall')) { + + q("DELETE FROM item WHERE verb LIKE '%s' AND uid = %d", + dbesc($postverb . '%'), + intval(local_user()) + ); + + goaway(z_root() . '/sharedfiles'); + } + + //list files + $r = q("SELECT * FROM item WHERE verb LIKE '%s' AND uid = %d", + dbesc($postverb . '%'), + intval(local_user()) + ); + + $o = profile_tabs($a, $is_owner, $channel['channel_id']); + + $o .= '<div class="section-title-wrapper">'; + + $o .= '<a href="/sharedfiles/dropall" onclick="return confirmDelete();" class="btn btn-xs btn-default pull-right"><i class="icon-trash"></i> ' . t('Remove all entries') . '</a>'; + + $o .= '<h2>' . t('Files shared with me') . '</h2>'; + + $o .= '</div>'; + + $o .= '<div class="section-content-wrapper">'; + + if($r) { + foreach($r as $rr) { + //don't display the files we shared with others + if($rr['owner_xchan'] != $channel['channel_hash']) { + unobscure($rr); + $url = rawurldecode($rr['body']); + $o .= '<a href="' . $url . '?f=&zid=' . $channel['xchan_addr'] . '">' . $url . '</a> <a href="/sharedfiles/' . $rr['id'] . '/drop" onclick="return confirmDelete();"><i class="icon-trash drop-icons"></i></a><br><br>'; + } + } + } + + $o .= '</div>'; + + return $o; + + +} + diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl index 0147d35ba..5a8743919 100644 --- a/view/tpl/attach_edit.tpl +++ b/view/tpl/attach_edit.tpl @@ -14,7 +14,7 @@ <i class="icon-share jot-icons"></i> </button> </div> - <div id="attach-edit-tools-perms" class="form-group pull-right{{if $isadir}} btn-group{{/if}}"> + <div id="attach-edit-tools-perms" class="form-group pull-right btn-group"> {{if $isadir}} <div id="attach-edit-perms-recurse" class="btn-group" data-toggle="buttons"> <label class="btn btn-default btn-xs" title="{{$recurse}}"> @@ -22,6 +22,11 @@ </label> </div> {{/if}} + <div id="attach-edit-activity" class="btn-group" data-toggle="buttons"> + <label class="btn btn-default btn-xs" title="{{$activity_btn_title}}"> + <input type="checkbox" autocomplete="off" name="no_activity" value="1"><i class="icon-ban-circle jot-icons"></i> + </label> + </div> <div id="attach-edit-perms" class="btn-group"> <button id="dbtn-acl" class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" onclick="return false;"> <i id="jot-perms-icon" class="icon-{{$lockstate}} jot-icons"></i> diff --git a/view/tpl/cloud_header.tpl b/view/tpl/cloud_header.tpl index f5f123edb..403323085 100644 --- a/view/tpl/cloud_header.tpl +++ b/view/tpl/cloud_header.tpl @@ -1,8 +1,9 @@ <div class="section-title-wrapper"> {{if $actionspanel}} <div class="pull-right"> - <button id="files-create-btn"class="btn btn-xs btn-primary" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="icon-folder-close-alt"></i> Create</button> - <button id="files-upload-btn" class="btn btn-xs btn-success" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="icon-upload"></i> Upload</button> + <a href="/sharedwithme" class="btn btn-xs btn-default"><i class="icon-cloud-download"></i> {{$shared}}</a> + <button id="files-create-btn" class="btn btn-xs btn-primary" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-mkdir-tools'); closeMenu('files-upload-tools');"><i class="icon-folder-close-alt"></i> {{$create}}</button> + <button id="files-upload-btn" class="btn btn-xs btn-success" title="{{if $quota.limit || $quota.used}}{{$quota.desc}}{{/if}}" onclick="openClose('files-upload-tools'); closeMenu('files-mkdir-tools');"><i class="icon-upload"></i> {{$upload}}</button> </div> {{/if}} <h2>{{$header}}</h2> |