Merge branch 'dev' of /home/macgirvin/z into dev

This commit is contained in:
nobody 2021-01-26 15:03:14 -08:00
commit 38c2ebd29c
8 changed files with 160 additions and 85 deletions

View file

@ -0,0 +1,31 @@
<?php
namespace Zotlabs\Daemon;
class Channel_purge {
static public function run($argc,$argv) {
cli_startup();
$channel_id = intval($argv[1]);
$channel = q("select * from channel where channel_id = %d and channel_removed = 1");
if (! $channel) {
return;
}
do {
$r = q("select id from item where uid = %d and item_deleted = 0 limit 1000",
intval($channel_id)
);
if ($r) {
foreach ($r as $rv) {
drop_item($rv['id'],false);
}
}
} while ($r);
}
}

View file

@ -3071,30 +3071,30 @@ class Activity {
$x = item_store($item);
}
if ($fetch_parents && $parent && ! intval($parent[0]['item_private'])) {
logger('topfetch', LOGGER_DEBUG);
// if the thread owner is a connnection, we will already receive any additional comments to their posts
// but if they are not we can try to fetch others in the background
$x = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and abook_xchan = '%s' LIMIT 1",
intval($channel['channel_id']),
dbesc($parent[0]['owner_xchan'])
);
if (! $x) {
// determine if the top-level post provides a replies collection
if ($parent[0]['obj']) {
$parent[0]['obj'] = json_decode($parent[0]['obj'],true);
}
logger('topfetch: ' . print_r($parent[0],true), LOGGER_ALL);
$id = ((array_path_exists('obj/replies/id',$parent[0])) ? $parent[0]['obj']['replies']['id'] : false);
if (! $id) {
$id = ((array_path_exists('obj/replies',$parent[0]) && is_string($parent[0]['obj']['replies'])) ? $parent[0]['obj']['replies'] : false);
}
if ($id) {
Run::Summon( [ 'Convo', $id, $channel['channel_id'], $observer_hash ] );
}
}
}
// if ($fetch_parents && $parent && ! intval($parent[0]['item_private'])) {
// logger('topfetch', LOGGER_DEBUG);
// // if the thread owner is a connnection, we will already receive any additional comments to their posts
// // but if they are not we can try to fetch others in the background
// $x = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
// WHERE abook_channel = %d and abook_xchan = '%s' LIMIT 1",
// intval($channel['channel_id']),
// dbesc($parent[0]['owner_xchan'])
// );
// if (! $x) {
// // determine if the top-level post provides a replies collection
// if ($parent[0]['obj']) {
// $parent[0]['obj'] = json_decode($parent[0]['obj'],true);
// }
// logger('topfetch: ' . print_r($parent[0],true), LOGGER_ALL);
// $id = ((array_path_exists('obj/replies/id',$parent[0])) ? $parent[0]['obj']['replies']['id'] : false);
// if (! $id) {
// $id = ((array_path_exists('obj/replies',$parent[0]) && is_string($parent[0]['obj']['replies'])) ? $parent[0]['obj']['replies'] : false);
// }
// if ($id) {
// Run::Summon( [ 'Convo', $id, $channel['channel_id'], $observer_hash ] );
// }
// }
// }
if (is_array($x) && $x['item_id']) {
if ($is_child_node) {

View file

@ -21,6 +21,7 @@ class ActivityPub {
// logger('notifier_array: ' . print_r($arr,true), LOGGER_ALL, LOG_INFO);
$purge_all = (($arr['packet_type'] === 'purge' && (! intval($arr['private']))) ? true : false);
$signed_msg = null;
@ -47,36 +48,13 @@ class ActivityPub {
}
$target_item = $arr['target_item'];
if ($purge_all) {
if (! $target_item['mid']) {
return;
}
$prv_recips = $arr['env_recips'];
if ($signed_msg) {
$jmsg = $signed_msg;
}
else {
$ti = Activity::encode_activity($target_item, true);
if (! $ti) {
return;
}
$token = IConfig::get($target_item['id'],'ocap','relay');
if ($token) {
if (defined('USE_BEARCAPS')) {
$ti['id'] = 'bear:?u=' . $ti['id'] . '&t=' . $token;
}
else {
$ti['id'] = $ti['id'] . '?token=' . $token;
}
if ($ti['url'] && is_string($ti['url'])) {
$ti['url'] .= '?token=' . $token;
}
}
$ti = [
'id' => channel_url($channel) . '#delete',
'type' => 'Delete',
'obj' => channel_url($channel)
];
$msg = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
@ -86,11 +64,56 @@ class ActivityPub {
$msg['signature'] = LDSignatures::sign($msg,$arr['channel']);
logger('ActivityPub_encoded: ' . json_encode($msg,JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
logger('ActivityPub_encoded (purge_all): ' . json_encode($msg,JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
$jmsg = json_encode($msg, JSON_UNESCAPED_SLASHES);
}
}
else {
$target_item = $arr['target_item'];
if (! $target_item['mid']) {
return;
}
$prv_recips = $arr['env_recips'];
if ($signed_msg) {
$jmsg = $signed_msg;
}
else {
$ti = Activity::encode_activity($target_item, true);
if (! $ti) {
return;
}
$token = IConfig::get($target_item['id'],'ocap','relay');
if ($token) {
if (defined('USE_BEARCAPS')) {
$ti['id'] = 'bear:?u=' . $ti['id'] . '&t=' . $token;
}
else {
$ti['id'] = $ti['id'] . '?token=' . $token;
}
if ($ti['url'] && is_string($ti['url'])) {
$ti['url'] .= '?token=' . $token;
}
}
$msg = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
Activity::ap_schema()
]], $ti);
$msg['signature'] = LDSignatures::sign($msg,$arr['channel']);
logger('ActivityPub_encoded: ' . json_encode($msg,JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
$jmsg = json_encode($msg, JSON_UNESCAPED_SLASHES);
}
}
if ($prv_recips) {
$hashes = [];

View file

@ -243,7 +243,7 @@ class Activity extends Controller {
$items = fetch_post_tags($r,false);
if ($portable_id && (! intval($items[0]['item_private']))) {
$c = q("select abook_id from abook where abook_channel = %d andd abook_xchan = '%s'",
$c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s'",
intval($items[0]['uid']),
dbesc($portable_id)
);

View file

@ -249,7 +249,7 @@ class Item extends Controller {
}
if ($portable_id && (! intval($items[0]['item_private']))) {
$c = q("select abook_id from abook where abook_channel = %d andd abook_xchan = '%s'",
$c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s'",
intval($items[0]['uid']),
dbesc($portable_id)
);

View file

@ -848,7 +848,6 @@ class App {
self::$query_string = '';
startup();
set_include_path(
@ -857,27 +856,30 @@ class App {
. '.'
);
self::$scheme = 'http';
if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
self::$scheme = 'https';
elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
self::$scheme = 'https';
// normally self::$hostname (also scheme and port) will be filled in during startup.
// Set it manually from $_SERVER variables only if it wasn't.
if(x($_SERVER,'SERVER_NAME')) {
self::$hostname = punify($_SERVER['SERVER_NAME']);
if (! self::$hostname) {
self::$hostname = punify(get_host());
self::$scheme = 'http';
if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
self::$scheme = 'https';
elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
self::$scheme = 'https';
if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
self::$hostname .= ':' . $_SERVER['SERVER_PORT'];
/*
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
*/
$path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
if(isset($path) && strlen($path) && ($path != self::$path))
self::$path = $path;
}
/*
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
*/
$path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
if(isset($path) && strlen($path) && ($path != self::$path))
self::$path = $path;
if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'], 0, 4) === "req=") {
self::$query_string = str_replace(['<','>'],['&lt;','&gt;'],substr($_SERVER['QUERY_STRING'], 4));
// removing trailing / - maybe a nginx problem
@ -2505,3 +2507,23 @@ function get_safemode() {
function supported_imagetype($x) {
return in_array($x, [ IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_WEBP ]);
}
function get_host() {
if ($host = $_SERVER['HTTP_X_FORWARDED_HOST']) {
$elements = explode(',', $host);
$host = trim(end($elements));
}
else {
if (! $host = $_SERVER['HTTP_HOST']) {
if (! $host = $_SERVER['SERVER_NAME']) {
$host = ((! empty($_SERVER['SERVER_ADDR'])) ? $_SERVER['SERVER_ADDR'] : '');
}
}
}
// Remove port number from host
if (strpos($host,':') !== false) {
$host = substr($host,0,strpos($host,':'));
}
return trim($host);
}

View file

@ -2173,12 +2173,6 @@ function channel_remove($channel_id, $local = true, $unset_session = false) {
}
}
$r = q("select id from item where uid = %d", intval($channel_id));
if ($r) {
foreach ($r as $rv) {
drop_item($rv['id'],false);
}
}
q("delete from abook where abook_xchan = '%s' and abook_self = 1 ",
dbesc($channel['channel_hash'])
@ -2189,6 +2183,10 @@ function channel_remove($channel_id, $local = true, $unset_session = false) {
intval($channel_id)
);
// remove items
Run::Summon( [ 'Channel_purge', $channel_id ] );
// if this was the default channel, set another one as default
if (App::$account['account_default_channel'] == $channel_id) {

View file

@ -228,11 +228,12 @@ abstract class dba_driver {
// Procedural functions
//
function printable($s) {
function printable($s, $escape = true) {
$s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
$s = str_replace("\x00",'.',$s);
if(x($_SERVER,'SERVER_NAME'))
if ($escape) {
$s = escape_tags($s);
}
return $s;
}