aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Lib/ThreadItem.php6
-rwxr-xr-xinclude/items.php74
2 files changed, 58 insertions, 22 deletions
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 426f88688..fadc38b38 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -150,9 +150,11 @@ class ThreadItem {
$edpost = false;
- if($observer['xchan_hash'] == $this->get_data_value('author_xchan')
+ if($observer && $observer['xchan_hash']
+ && ($observer['xchan_hash'] == $this->get_data_value('author_xchan')
|| $observer['xchan_hash'] == $this->get_data_value('owner_xchan')
- || $this->get_data_value('uid') == local_channel())
+ || $observer['xchan_hash'] == $this->get_data_value('source_xchan')
+ || $this->get_data_value('uid') == local_channel()))
$dropping = true;
diff --git a/include/items.php b/include/items.php
index f2db7288f..7df5e35fe 100755
--- a/include/items.php
+++ b/include/items.php
@@ -2660,21 +2660,23 @@ function tag_deliver($uid, $item_id) {
$item = $i[0];
- if(($item['source_xchan']) && intval($item['item_uplink'])
+ if(intval($item['item_uplink']) && $item['source_xchan']
&& intval($item['item_thread_top']) && ($item['edited'] != $item['created'])) {
// this is an update (edit) to a post which was already processed by us and has a second delivery chain
// Just start the second delivery chain to deliver the updated post
// after resetting ownership and permission bits
logger('updating edited tag_deliver post for ' . $u[0]['channel_address']);
- start_delivery_chain($u[0], $item, $item_id, 0, true);
+ start_delivery_chain($u[0], $item, $item_id, 0, false, true);
return;
}
if ($is_group && intval($item['item_private']) === 2 && intval($item['item_thread_top'])) {
// group delivery via DM
- logger('group DM delivery for ' . $u[0]['channel_address']);
- start_delivery_chain($u[0], $item, $item_id, 0, false);
+ if(perm_is_allowed($uid,$item['owner_xchan'],'post_wall') || perm_is_allowed($uid,$item['owner_xchan'],'tag_deliver')) {
+ logger('group DM delivery for ' . $u[0]['channel_address']);
+ start_delivery_chain($u[0], $item, $item_id, 0, true, (($item['edited'] != $item['created']) || $item['item_deleted']));
+ }
return;
}
@@ -2686,7 +2688,7 @@ function tag_deliver($uid, $item_id) {
}
// group delivery via W2W
logger('rewriting W2W post for ' . $u[0]['channel_address']);
- start_delivery_chain($u[0], $item, $item_id, 0, false);
+ start_delivery_chain($u[0], $item, $item_id, 0, true, (($item['edited'] != $item['created']) || $item['item_deleted']));
q("update item set item_wall = 0 where id = %d",
intval($item_id)
);
@@ -3136,7 +3138,7 @@ function tgroup_check($uid, $item) {
* @param boolean $edit (optional) default false
* @return void
*/
-function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false) {
+function start_delivery_chain($channel, $item, $item_id, $parent, $group = false, $edit = false) {
$sourced = check_item_source($channel['channel_id'],$item);
@@ -3183,28 +3185,56 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false)
}
}
- // @todo handle edit and parent correctly
-
- if(! $parent) {
-
- if ($edit) {
- return;
- }
+ if ($group && (! $parent)) {
$arr = [];
+
+ if ($edit) {
+ // process edit or delete action
+ $r = q("select * from item where source_xchan = '%s' and body like '%s' and uid = %d limit 1",
+ dbesc($item['owner_xchan']),
+ dbesc("%message_id='" . $item['mid'] . "'%"),
+ intval($channel['channel_id'])
+ );
+ if ($r) {
+ if (intval($item['item_deleted'])) {
+ drop_item($r[0]['id'],false,DROPITEM_PHASE1);
+ Master::Summon([ 'Notifier','drop',$r[0]['id'] ]);
+ return;
+ }
+ $arr['id'] = intval($r[0]['id']);
+ $arr['parent'] = intval($r[0]['parent']);
+ $arr['uuid'] = $r[0]['uuid'];
+ $arr['mid'] = $r[0]['mid'];
+ $arr['parent_mid'] = $r[0]['parent_mid'];
+ $arr['edited'] = datetime_convert();
+ }
+ else {
+ logger('unable to locate original group post ' . $item['mid']);
+ return;
+ }
+ }
+ else {
+ $arr['uuid'] = item_message_id();
+ $arr['mid'] = z_root() . '/activity/' . $arr['uuid'];
+ $arr['parent_mid'] = $arr['mid'];
+ }
+
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
+ // WARNING: the presence of both source_xchan and non-zero item_uplink here will cause a delivery loop
+
+ $arr['item_uplink'] = 0;
+ $arr['source_xchan'] = $item['owner_xchan'];
+
$arr['item_private'] = (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
|| $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 1 : 0);
$arr['item_origin'] = 1;
$arr['item_wall'] = 1;
- $arr['uuid'] = item_message_id();
- $arr['mid'] = z_root() . '/activity/' . $arr['uuid'];
- $arr['parent_mid'] = $arr['mid'];
$arr['item_thread_top'] = 1;
if (strpos($item['body'], "[/share]") !== false) {
@@ -3226,12 +3256,11 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false)
$bb .= "[/share]";
}
- $mention = '@[zrl=' . $item['author']['xchan_url'] . ']' . $item['author']['xchan_name'] . '[/zrl]';
$arr['body'] = $bb;
$arr['author_xchan'] = $channel['channel_hash'];
$arr['owner_xchan'] = $channel['channel_hash'];
- // $arr['obj'] = $item['obj'];
+
$arr['obj_type'] = $item['obj_type'];
$arr['verb'] = ACTIVITY_POST;
@@ -3241,7 +3270,12 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false)
$arr['deny_gid'] = $channel['channel_deny_gid'];
$arr['comment_policy'] = map_scope(PermissionLimits::Get($channel['channel_id'],'post_comments'));
- $post = item_store($arr);
+ if ($arr['id']) {
+ $post = item_store_update($arr);
+ }
+ else {
+ $post = item_store($arr);
+ }
$post_id = $post['item_id'];
@@ -3341,7 +3375,7 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $edit = false)
function check_item_source($uid, $item) {
logger('source: uid: ' . $uid, LOGGER_DEBUG);
- $xchan = (($item['source_xchan']) ? $item['source_xchan'] : $item['owner_xchan']);
+ $xchan = (($item['source_xchan'] && intval($item['item_uplink'])) ? $item['source_xchan'] : $item['owner_xchan']);
$r = q("select * from source where src_channel_id = %d and ( src_xchan = '%s' or src_xchan = '*' ) limit 1",
intval($uid),