aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs
diff options
context:
space:
mode:
Diffstat (limited to 'Zotlabs')
-rw-r--r--Zotlabs/Daemon/Convo.php2
-rw-r--r--Zotlabs/Lib/Activity.php161
-rw-r--r--Zotlabs/Lib/ActivityStreams.php232
-rw-r--r--Zotlabs/Lib/ZotURL.php14
-rw-r--r--Zotlabs/Module/Channel.php367
-rw-r--r--Zotlabs/Module/Profile.php117
-rw-r--r--Zotlabs/Module/Search.php14
7 files changed, 426 insertions, 481 deletions
diff --git a/Zotlabs/Daemon/Convo.php b/Zotlabs/Daemon/Convo.php
index f7478d778..940216b2c 100644
--- a/Zotlabs/Daemon/Convo.php
+++ b/Zotlabs/Daemon/Convo.php
@@ -49,7 +49,7 @@ class Convo {
// and that lets us use implied_create
$AS = new ActivityStreams($message);
if ($AS->is_valid() && is_array($AS->obj)) {
- $item = Activity::decode_note($AS, true);
+ $item = Activity::decode_note($AS);
Activity::store($channel, $contact['abook_xchan'], $AS, $item);
}
}
diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php
index 388d74d91..cedc9adc8 100644
--- a/Zotlabs/Lib/Activity.php
+++ b/Zotlabs/Lib/Activity.php
@@ -87,14 +87,16 @@ class Activity {
}
$headers = [
- 'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
+ 'Accept' => ActivityStreams::get_accept_header_string($channel),
'Host' => $m['host'],
'Date' => datetime_convert('UTC', 'UTC', 'now', 'D, d M Y H:i:s \\G\\M\\T'),
'(request-target)' => 'get ' . get_request_string($url)
];
+
if (isset($token)) {
$headers['Authorization'] = 'Bearer ' . $token;
}
+
$h = HTTPSig::create_sig($headers, $channel['channel_prvkey'], channel_url($channel), false);
$x = z_fetch_url($url, true, $redirects, ['headers' => $h]);
}
@@ -111,7 +113,6 @@ class Activity {
return null;
}
-
static function fetch_person($x) {
return self::fetch_profile($x);
}
@@ -177,7 +178,6 @@ class Activity {
}
}
-
static function fetch_image($x) {
$ret = [
'type' => 'Image',
@@ -302,7 +302,7 @@ class Activity {
$m = get_iconfig($i['id'], 'activitypub', 'rawmsg');
if ($m) {
if (is_string($m))
- $t = json_decode($m,true);
+ $t = json_decode($m, true);
else
$t = $m;
}
@@ -351,7 +351,6 @@ class Activity {
return $ret;
}
-
static function encode_item($i) {
$ret = [];
@@ -583,7 +582,6 @@ class Activity {
return $ret;
}
-
static function encode_taxonomy($item) {
$ret = [];
@@ -672,7 +670,6 @@ class Activity {
return $ret;
}
-
static function decode_attachment($item) {
$ret = [];
@@ -696,7 +693,6 @@ class Activity {
return $ret;
}
-
static function encode_activity($i, $recurse = false) {
$ret = [];
@@ -958,7 +954,6 @@ class Activity {
}
// Returns an array of URLS for any mention tags found in the item array $i.
-
static function map_mentions($i) {
if (!$i['term']) {
@@ -981,7 +976,6 @@ class Activity {
}
// Returns an array of all recipients targeted by private item array $i.
-
static function map_acl($i) {
$ret = [];
@@ -1064,6 +1058,7 @@ class Activity {
if ($p['xchan_addr'] && strpos($p['xchan_addr'], '@'))
$ret['preferredUsername'] = substr($p['xchan_addr'], 0, strpos($p['xchan_addr'], '@'));
+
$ret['name'] = $p['xchan_name'];
$ret['updated'] = datetime_convert('UTC', 'UTC', $p['xchan_name_date'], ATOM_TIME);
$ret['icon'] = [
@@ -1093,15 +1088,17 @@ class Activity {
'publicKeyPem' => $p['xchan_pubkey']
];
- $arr = ['xchan' => $p, 'encoded' => $ret];
+ $arr = [
+ 'xchan' => $p,
+ 'encoded' => $ret
+ ];
+
call_hooks('encode_person', $arr);
$ret = $arr['encoded'];
-
return $ret;
}
-
static function activity_mapper($verb) {
if (strpos($verb, '/') === false) {
@@ -1145,7 +1142,7 @@ class Activity {
if (strpos($verb, ACTIVITY_POKE) !== false)
return 'Activity';
- // We should return false, however this will trigger an uncaught execption and crash
+ // We should return false, however this will trigger an uncaught execption and crash
// the delivery system if encountered by the JSON-LDSignature library
logger('Unmapped activity: ' . $verb);
@@ -1153,7 +1150,6 @@ class Activity {
// return false;
}
-
static function activity_decode_mapper($verb) {
$acts = [
@@ -1225,7 +1221,6 @@ class Activity {
return 'Note';
}
-
static function activity_obj_mapper($obj) {
$objs = [
@@ -1272,17 +1267,16 @@ class Activity {
}
-
static function follow($channel, $act) {
$contact = null;
$their_follow_id = null;
/*
- *
- * if $act->type === 'Follow', actor is now following $channel
- * if $act->type === 'Accept', actor has approved a follow request from $channel
- *
+ *
+ * if $act->type === 'Follow', actor is now following $channel
+ * if $act->type === 'Accept', actor has approved a follow request from $channel
+ *
*/
$person_obj = $act->actor;
@@ -1297,7 +1291,7 @@ class Activity {
self::actor_store($person_obj['id'], $person_obj);
- // Find any existing abook record
+ // Find any existing abook record
$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($person_obj['id']),
@@ -1314,7 +1308,7 @@ class Activity {
if ($contact && $contact['abook_id']) {
- // A relationship of some form already exists on this site.
+ // A relationship of some form already exists on this site.
switch ($act->type) {
@@ -1469,7 +1463,6 @@ class Activity {
}
-
static function unfollow($channel, $act) {
$contact = null;
@@ -1495,7 +1488,6 @@ class Activity {
return;
}
-
static function actor_store($url, $person_obj) {
if (!is_array($person_obj))
@@ -1601,7 +1593,7 @@ class Activity {
else {
// Record exists. Cache existing records for one week at most
- // then refetch to catch updated profile photos, names, etc.
+ // then refetch to catch updated profile photos, names, etc.
$d = datetime_convert('UTC', 'UTC', 'now - 1 week');
if ($r[0]['xchan_name_date'] > $d)
@@ -1663,7 +1655,6 @@ class Activity {
}
-
static function create_action($channel, $observer_hash, $act) {
if (in_array($act->obj['type'], ['Note', 'Article', 'Video'])) {
@@ -1681,7 +1672,6 @@ class Activity {
}
-
static function like_action($channel, $observer_hash, $act) {
if (in_array($act->obj['type'], ['Note', 'Article', 'Video'])) {
@@ -1692,7 +1682,6 @@ class Activity {
}
// sort function width decreasing
-
static function vid_sort($a, $b) {
if ($a['width'] === $b['width'])
return 0;
@@ -1954,7 +1943,6 @@ class Activity {
}
-
static function update_poll($item, $post) {
$multi = false;
$mid = $post['mid'];
@@ -2047,7 +2035,6 @@ class Activity {
return false;
}
-
static function decode_note($act) {
$response_activity = false;
@@ -2506,9 +2493,6 @@ class Activity {
$item['item_private'] = 2;
}*/
- // TODO: remove
- // $is_parent = (($item['parent_mid'] && $item['parent_mid'] === $item['mid']) ? true : false);
-
if ($item['parent_mid'] && $item['parent_mid'] !== $item['mid']) {
$is_child_node = true;
}
@@ -2563,7 +2547,7 @@ class Activity {
$allowed = true;
// reject public stream comments that weren't sent by the conversation owner
- if ($is_sys_channel && $pubstream && $item['owner_xchan'] !== $observer_hash && ! $fetch_parents) { // TODO: check why? This would make it impossible to fetch externals via zotfeed where $observer_hash = sys channel
+ if ($is_sys_channel && $pubstream && $item['owner_xchan'] !== $observer_hash && !$fetch_parents) {
$allowed = false;
}
}
@@ -2587,12 +2571,6 @@ class Activity {
}*/
}
- // TODO: remove
- /*if ($is_parent && (!perm_is_allowed($channel['channel_id'], $observer_hash, 'send_stream') && !($is_sys_channel && $pubstream))) {
- logger('no permission');
- return;
- }*/
-
if (tgroup_check($channel['channel_id'], $item) && (!$is_child_node)) {
// for forum deliveries, make sure we keep a copy of the signed original
set_iconfig($item, 'activitypub', 'rawmsg', $act->raw, 1);
@@ -2642,15 +2620,6 @@ class Activity {
return;
}
- // TODO: remove
- /*if (is_array($act->obj)) {
- $content = self::get_content($act->obj);
- }
- if (!$content) {
- logger('no content');
- return;
- }*/
-
$item['aid'] = $channel['channel_account_id'];
$item['uid'] = $channel['channel_id'];
@@ -2717,54 +2686,6 @@ class Activity {
$parent = null;
- // TODO: remove
- /*if (!$is_parent) {
- $p = q("select parent_mid, id, obj_type from item where mid = '%s' and uid = %d limit 1",
- dbesc($item['parent_mid']),
- intval($item['uid'])
- );
- if (!$p) {
- $a = (($fetch_parents) ? self::fetch_and_store_parents($channel, $item) : false);
- if ($a) {
- $p = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
- dbesc($item['parent_mid']),
- intval($item['uid'])
- );
- }
- else {
- logger('could not fetch parents');
- return;
-
- // @TODO we maybe could accept these is we formatted the body correctly with share_bb()
- // or at least provided a link to the object
- // if(in_array($act->type,[ 'Like','Dislike' ])) {
- // return;
- // }
-
- // @TODO do we actually want that?
- // if no parent was fetched, turn into a top-level post
-
- // turn into a top level post
- // $s['parent_mid'] = $s['mid'];
- // $s['thr_parent'] = $s['mid'];
- }
- }
-
- if ($p[0]['obj_type'] === 'Question') {
- if ($item['obj_type'] === ACTIVITY_OBJ_NOTE && $item['title'] && (!$item['content'])) {
- $item['obj_type'] = 'Answer';
- }
- }
-
- if ($p[0]['parent_mid'] !== $item['parent_mid']) {
- $item['thr_parent'] = $item['parent_mid'];
- }
- else {
- $item['thr_parent'] = $p[0]['parent_mid'];
- }
- $item['parent_mid'] = $p[0]['parent_mid'];
- }*/
-
if ($is_child_node) {
$parent = q("select * from item where mid = '%s' and uid = %d limit 1",
@@ -2824,24 +2745,6 @@ class Activity {
$x = item_store($item);
}
- // TODO: remove
- /*$r = q("select id, created, edited from item where mid = '%s' and uid = %d limit 1",
- dbesc($item['mid']),
- intval($item['uid'])
- );
- if ($r) {
- if ($item['edited'] > $r[0]['edited']) {
- $item['id'] = $r[0]['id'];
- $x = item_store_update($item);
- }
- else {
- return;
- }
- }
- else {
- $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
@@ -2883,23 +2786,6 @@ class Activity {
sync_an_item($channel['channel_id'], $x['item_id']);
}
- // TODO: remove
- /*if (is_array($x) && $x['item_id']) {
- if ($is_parent) {
- if ($item['owner_xchan'] === $channel['channel_hash']) {
- // We are the owner of this conversation, so send all received comments back downstream
- Master::Summon(['Notifier', 'comment-import', $x['item_id']]);
- }
- $r = q("select * from item where id = %d limit 1",
- intval($x['item_id'])
- );
- if ($r) {
- send_status_notifications($x['item_id'], $r[0]);
- }
- }
- sync_an_item($channel['channel_id'], $x['item_id']);
- }*/
-
}
static public function fetch_and_store_parents($channel, $observer_hash, $item, $force = false) {
@@ -2963,7 +2849,7 @@ class Activity {
break;
}
- array_unshift($p,[ $a, $item ]);
+ array_unshift($p, [$a, $item]);
if ($item['parent_mid'] === $item['mid']) {
break;
@@ -3386,7 +3272,6 @@ class Activity {
return;
}
-
static function bb_attach($attach, $body) {
$ret = false;
@@ -3412,9 +3297,7 @@ class Activity {
return $ret;
}
-
// check for the existence of existing media link in body
-
static function media_not_in_body($s, $body) {
if ((strpos($body, ']' . $s . '[/img]') === false) &&
@@ -3426,7 +3309,6 @@ class Activity {
return false;
}
-
static function bb_content($content, $field) {
require_once('include/html2bbcode.php');
@@ -3455,7 +3337,6 @@ class Activity {
return $ret;
}
-
static function get_content($act) {
$content = [];
@@ -3511,7 +3392,6 @@ class Activity {
return $content;
}
-
static function get_textfield($act, $field) {
$content = false;
@@ -3528,7 +3408,6 @@ class Activity {
// Find either an Authorization: Bearer token or 'token' request variable
// in the current web request and return it
-
static function token_from_request() {
foreach (['REDIRECT_REMOTE_USER', 'HTTP_AUTHORIZATION'] as $s) {
diff --git a/Zotlabs/Lib/ActivityStreams.php b/Zotlabs/Lib/ActivityStreams.php
index f877fbb45..ba7ec0c65 100644
--- a/Zotlabs/Lib/ActivityStreams.php
+++ b/Zotlabs/Lib/ActivityStreams.php
@@ -7,25 +7,24 @@ namespace Zotlabs\Lib;
*
* Parses an ActivityStream JSON string.
*/
-
class ActivityStreams {
- public $raw = null;
- public $data = null;
- public $valid = false;
- public $deleted = false;
- public $id = '';
- public $parent_id = '';
- public $type = '';
- public $actor = null;
- public $obj = null;
- public $tgt = null;
- public $origin = null;
- public $owner = null;
- public $signer = null;
- public $ldsig = null;
- public $sigok = false;
- public $recips = null;
+ public $raw = null;
+ public $data = null;
+ public $valid = false;
+ public $deleted = false;
+ public $id = '';
+ public $parent_id = '';
+ public $type = '';
+ public $actor = null;
+ public $obj = null;
+ public $tgt = null;
+ public $origin = null;
+ public $owner = null;
+ public $signer = null;
+ public $ldsig = null;
+ public $sigok = false;
+ public $recips = null;
public $raw_recips = null;
/**
@@ -37,29 +36,29 @@ class ActivityStreams {
*/
function __construct($string) {
- $this->raw = $string;
+ $this->raw = $string;
- if(is_array($string)) {
+ if (is_array($string)) {
$this->data = $string;
}
else {
$this->data = json_decode($string, true);
}
- if($this->data) {
+ if ($this->data) {
// verify and unpack JSalmon signature if present
- if(is_array($this->data) && array_key_exists('signed',$this->data)) {
+ if (is_array($this->data) && array_key_exists('signed', $this->data)) {
$ret = JSalmon::verify($this->data);
$tmp = JSalmon::unpack($this->data['data']);
- if($ret && $ret['success']) {
- if($ret['signer']) {
- $saved = json_encode($this->data,JSON_UNESCAPED_SLASHES);
- $this->data = $tmp;
- $this->data['signer'] = $ret['signer'];
+ if ($ret && $ret['success']) {
+ if ($ret['signer']) {
+ $saved = json_encode($this->data, JSON_UNESCAPED_SLASHES);
+ $this->data = $tmp;
+ $this->data['signer'] = $ret['signer'];
$this->data['signed_data'] = $saved;
- if($ret['hubloc']) {
+ if ($ret['hubloc']) {
$this->data['hubloc'] = $ret['hubloc'];
}
}
@@ -68,57 +67,57 @@ class ActivityStreams {
$this->valid = true;
- if(array_key_exists('type',$this->data) && array_key_exists('actor',$this->data) && array_key_exists('object',$this->data)) {
- if($this->data['type'] === 'Delete' && $this->data['actor'] === $this->data['object']) {
+ if (array_key_exists('type', $this->data) && array_key_exists('actor', $this->data) && array_key_exists('object', $this->data)) {
+ if ($this->data['type'] === 'Delete' && $this->data['actor'] === $this->data['object']) {
$this->deleted = $this->data['actor'];
- $this->valid = false;
+ $this->valid = false;
}
}
}
- if($this->is_valid()) {
+ if ($this->is_valid()) {
$this->id = $this->get_property_obj('id');
$this->type = $this->get_primary_type();
- $this->actor = $this->get_actor('actor','','');
+ $this->actor = $this->get_actor('actor', '', '');
$this->obj = $this->get_compound_property('object');
$this->tgt = $this->get_compound_property('target');
$this->origin = $this->get_compound_property('origin');
$this->recips = $this->collect_recips();
$this->ldsig = $this->get_compound_property('signature');
- if($this->ldsig) {
- $this->signer = $this->get_compound_property('creator',$this->ldsig);
- if($this->signer && is_array($this->signer) && array_key_exists('publicKey',$this->signer) && is_array($this->signer['publicKey']) && $this->signer['publicKey']['publicKeyPem']) {
- $this->sigok = LDSignatures::verify($this->data,$this->signer['publicKey']['publicKeyPem']);
+ if ($this->ldsig) {
+ $this->signer = $this->get_compound_property('creator', $this->ldsig);
+ if ($this->signer && is_array($this->signer) && array_key_exists('publicKey', $this->signer) && is_array($this->signer['publicKey']) && $this->signer['publicKey']['publicKeyPem']) {
+ $this->sigok = LDSignatures::verify($this->data, $this->signer['publicKey']['publicKeyPem']);
}
}
- if(! $this->obj) {
- $this->obj = $this->data;
+ if (!$this->obj) {
+ $this->obj = $this->data;
$this->type = 'Create';
- if(! $this->actor) {
- $this->actor = $this->get_actor('attributedTo',$this->obj);
+ if (!$this->actor) {
+ $this->actor = $this->get_actor('attributedTo', $this->obj);
}
}
// fetch recursive or embedded activities
- if ($this->obj && is_array($this->obj) && array_key_exists('object',$this->obj)) {
+ if ($this->obj && is_array($this->obj) && array_key_exists('object', $this->obj)) {
$this->obj['object'] = $this->get_compound_property($this->obj['object']);
}
- if($this->obj && is_array($this->obj) && $this->obj['actor'])
- $this->obj['actor'] = $this->get_actor('actor',$this->obj);
- if($this->tgt && is_array($this->tgt) && $this->tgt['actor'])
- $this->tgt['actor'] = $this->get_actor('actor',$this->tgt);
+ if ($this->obj && is_array($this->obj) && $this->obj['actor'])
+ $this->obj['actor'] = $this->get_actor('actor', $this->obj);
+ if ($this->tgt && is_array($this->tgt) && $this->tgt['actor'])
+ $this->tgt['actor'] = $this->get_actor('actor', $this->tgt);
$this->parent_id = $this->get_property_obj('inReplyTo');
- if((! $this->parent_id) && is_array($this->obj)) {
+ if ((!$this->parent_id) && is_array($this->obj)) {
$this->parent_id = $this->obj['inReplyTo'];
}
- if((! $this->parent_id) && is_array($this->obj)) {
+ if ((!$this->parent_id) && is_array($this->obj)) {
$this->parent_id = $this->obj['id'];
}
}
@@ -147,19 +146,19 @@ class ActivityStreams {
function collect_recips($base = '', $namespace = '') {
$x = [];
- $fields = [ 'to', 'cc', 'bto', 'bcc', 'audience'];
- foreach($fields as $f) {
+ $fields = ['to', 'cc', 'bto', 'bcc', 'audience'];
+ foreach ($fields as $f) {
$y = $this->get_compound_property($f, $base, $namespace);
- if($y) {
- if (! is_array($this->raw_recips)) {
+ if ($y) {
+ if (!is_array($this->raw_recips)) {
$this->raw_recips = [];
}
- if (! is_array($y)) {
- $y = [ $y ];
+ if (!is_array($y)) {
+ $y = [$y];
}
$this->raw_recips[$f] = $y;
- $x = array_merge($x, $y);
+ $x = array_merge($x, $y);
}
}
// not yet ready for prime time
@@ -167,21 +166,21 @@ class ActivityStreams {
return $x;
}
- function expand($arr,$base = '',$namespace = '') {
+ function expand($arr, $base = '', $namespace = '') {
$ret = [];
// right now use a hardwired recursion depth of 5
- for($z = 0; $z < 5; $z ++) {
- if(is_array($arr) && $arr) {
- foreach($arr as $a) {
- if(is_array($a)) {
+ for ($z = 0; $z < 5; $z++) {
+ if (is_array($arr) && $arr) {
+ foreach ($arr as $a) {
+ if (is_array($a)) {
$ret[] = $a;
}
else {
- $x = $this->get_compound_property($a,$base,$namespace);
- if($x) {
- $ret = array_merge($ret,$x);
+ $x = $this->get_compound_property($a, $base, $namespace);
+ if ($x) {
+ $ret = array_merge($ret, $x);
}
}
}
@@ -202,33 +201,33 @@ class ActivityStreams {
*/
function get_namespace($base, $namespace) {
- if(! $namespace)
+ if (!$namespace)
return '';
$key = null;
- foreach( [ $this->data, $base ] as $b ) {
- if(! $b)
+ foreach ([$this->data, $base] as $b) {
+ if (!$b)
continue;
- if(array_key_exists('@context', $b)) {
- if(is_array($b['@context'])) {
- foreach($b['@context'] as $ns) {
- if(is_array($ns)) {
- foreach($ns as $k => $v) {
- if($namespace === $v)
+ if (array_key_exists('@context', $b)) {
+ if (is_array($b['@context'])) {
+ foreach ($b['@context'] as $ns) {
+ if (is_array($ns)) {
+ foreach ($ns as $k => $v) {
+ if ($namespace === $v)
$key = $k;
}
}
else {
- if($namespace === $ns) {
+ if ($namespace === $ns) {
$key = '';
}
}
}
}
else {
- if($namespace === $b['@context']) {
+ if ($namespace === $b['@context']) {
$key = '';
}
}
@@ -248,14 +247,14 @@ class ActivityStreams {
*/
function get_property_obj($property, $base = '', $namespace = '') {
$prefix = $this->get_namespace($base, $namespace);
- if($prefix === null)
+ if ($prefix === null)
return null;
- $base = (($base) ? $base : $this->data);
+ $base = (($base) ? $base : $this->data);
$propname = (($prefix) ? $prefix . ':' : '') . $property;
- if(! is_array($base)) {
- btlogger('not an array: ' . print_r($base,true));
+ if (!is_array($base)) {
+ btlogger('not an array: ' . print_r($base, true));
return null;
}
@@ -279,14 +278,14 @@ class ActivityStreams {
}
static function is_an_actor($s) {
- return (in_array($s, [ 'Application','Group','Organization','Person','Service' ]));
+ return (in_array($s, ['Application', 'Group', 'Organization', 'Person', 'Service']));
}
static function is_response_activity($s) {
- if (! $s) {
+ if (!$s) {
return false;
}
- return (in_array($s, [ 'Like', 'Dislike', 'Flag', 'Block', 'Accept', 'Reject', 'TentativeAccept', 'TentativeReject', 'emojiReaction', 'EmojiReaction', 'EmojiReact' ]));
+ return (in_array($s, ['Like', 'Dislike', 'Flag', 'Block', 'Accept', 'Reject', 'TentativeAccept', 'TentativeReject', 'emojiReaction', 'EmojiReaction', 'EmojiReact']));
}
/**
@@ -298,9 +297,9 @@ class ActivityStreams {
* @return NULL|mixed
*/
- function get_actor($property,$base='',$namespace = '') {
+ function get_actor($property, $base = '', $namespace = '') {
$x = $this->get_property_obj($property, $base, $namespace);
- if($this->is_url($x)) {
+ if ($this->is_url($x)) {
// SECURITY: If we have already stored the actor profile, re-generate it
// from cached data - don't refetch it from the network
@@ -308,15 +307,15 @@ class ActivityStreams {
$r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where hubloc_id_url = '%s' limit 1",
dbesc($x)
);
- if($r) {
- $y = Activity::encode_person($r[0]);
+ if ($r) {
+ $y = Activity::encode_person($r[0]);
$y['cached'] = true;
return $y;
}
}
- $actor = $this->get_compound_property($property,$base,$namespace,true);
- if(is_array($actor) && self::is_an_actor($actor['type'])) {
- if(array_key_exists('id',$actor) && (! array_key_exists('inbox',$actor))) {
+ $actor = $this->get_compound_property($property, $base, $namespace, true);
+ if (is_array($actor) && self::is_an_actor($actor['type'])) {
+ if (array_key_exists('id', $actor) && (!array_key_exists('inbox', $actor))) {
$actor = $this->fetch_property($actor['id']);
}
return $actor;
@@ -336,7 +335,7 @@ class ActivityStreams {
*/
function get_compound_property($property, $base = '', $namespace = '', $first = false) {
$x = $this->get_property_obj($property, $base, $namespace);
- if($this->is_url($x)) {
+ if ($this->is_url($x)) {
$y = $this->fetch_property($x);
if (is_array($y)) {
$x = $y;
@@ -345,22 +344,22 @@ class ActivityStreams {
// verify and unpack JSalmon signature if present
- if(is_array($x) && array_key_exists('signed',$x)) {
+ if (is_array($x) && array_key_exists('signed', $x)) {
$ret = JSalmon::verify($x);
$tmp = JSalmon::unpack($x['data']);
- if($ret && $ret['success']) {
- if($ret['signer']) {
- $saved = json_encode($x,JSON_UNESCAPED_SLASHES);
- $x = $tmp;
- $x['signer'] = $ret['signer'];
+ if ($ret && $ret['success']) {
+ if ($ret['signer']) {
+ $saved = json_encode($x, JSON_UNESCAPED_SLASHES);
+ $x = $tmp;
+ $x['signer'] = $ret['signer'];
$x['signed_data'] = $saved;
- if($ret['hubloc']) {
+ if ($ret['hubloc']) {
$x['hubloc'] = $ret['hubloc'];
}
}
}
}
- if($first && is_array($x) && array_key_exists(0,$x)) {
+ if ($first && is_array($x) && array_key_exists(0, $x)) {
return $x[0];
}
@@ -374,7 +373,7 @@ class ActivityStreams {
* @return boolean
*/
function is_url($url) {
- if(($url) && (! is_array($url)) && (strpos($url, 'http') === 0)) {
+ if (($url) && (!is_array($url)) && (strpos($url, 'http') === 0)) {
return true;
}
@@ -389,13 +388,13 @@ class ActivityStreams {
* @return NULL|mixed
*/
function get_primary_type($base = '', $namespace = '') {
- if(! $base)
+ if (!$base)
$base = $this->data;
$x = $this->get_property_obj('type', $base, $namespace);
- if(is_array($x)) {
- foreach($x as $y) {
- if(strpos($y, ':') === false) {
+ if (is_array($x)) {
+ foreach ($x as $y) {
+ if (strpos($y, ':') === false) {
return $y;
}
}
@@ -409,15 +408,32 @@ class ActivityStreams {
return $x;
}
- static function is_as_request() {
+ static function is_as_request($channel = null) {
+
+ $hookdata = [];
+ if ($channel)
+ $hookdata['channel'] = $channel;
+
+ $hookdata['data'] = ['application/x-zot-activity+json'];
+
+ call_hooks('is_as_request', $hookdata);
+
+ $x = getBestSupportedMimeType($hookdata['data']);
+ return (($x) ? true : false);
+
+ }
+
+ static function get_accept_header_string($channel = null) {
+
+ $hookdata = [];
+ if ($channel)
+ $hookdata['channel'] = $channel;
+
+ $hookdata['data'] = 'application/x-zot-activity+json';
- $x = getBestSupportedMimeType([
- 'application/ld+json;profile="https://www.w3.org/ns/activitystreams"',
- 'application/activity+json',
- 'application/ld+json;profile="http://www.w3.org/ns/activitystreams"'
- ]);
+ call_hooks('get_accept_header_string', $hookdata);
- return(($x) ? true : false);
+ return $hookdata['data'];
}
diff --git a/Zotlabs/Lib/ZotURL.php b/Zotlabs/Lib/ZotURL.php
index fa3959f69..6bb01fd7a 100644
--- a/Zotlabs/Lib/ZotURL.php
+++ b/Zotlabs/Lib/ZotURL.php
@@ -21,12 +21,10 @@ class ZotURL {
}
$portable_url = substr($url,6);
- $u = explode('/',$portable_url);
+ $u = explode('/',$portable_url);
$portable_id = $u[0];
- hz_syslog(print_r($u,true));
-
$hosts = self::lookup($portable_id);
- hz_syslog(print_r($hosts,true));
+
if(! $hosts) {
return $ret;
}
@@ -40,8 +38,8 @@ class ZotURL {
if($channel && $m) {
- $headers = [
- 'Accept' => 'application/x-zot+json',
+ $headers = [
+ 'Accept' => 'application/x-zot+json',
'Content-Type' => 'application/x-zot+json',
'X-Zot-Token' => random_string(),
'Digest' => HTTPSig::generate_digest_header($data),
@@ -51,9 +49,9 @@ class ZotURL {
$h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel),false);
}
else {
- $h = [ 'Accept: application/x-zot+json' ];
+ $h = [ 'Accept: application/x-zot+json' ];
}
-
+
$result = [];
$redirects = 0;
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 11f4d3a52..915e0ea60 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -4,10 +4,12 @@ namespace Zotlabs\Module;
use App;
-use Zotlabs\Web\Controller;
+use Zotlabs\Lib\Activity;
+use Zotlabs\Lib\ActivityStreams;
+use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\PermissionDescription;
+use Zotlabs\Web\Controller;
use Zotlabs\Web\HTTPSig;
-use Zotlabs\Lib\Libzot;
require_once('include/items.php');
require_once('include/security.php');
@@ -20,86 +22,116 @@ require_once('include/opengraph.php');
* @brief Channel Controller
*
*/
-
class Channel extends Controller {
function init() {
- if(in_array(substr($_GET['search'],0,1),[ '@', '!', '?']))
+ if (in_array(substr($_GET['search'], 0, 1), ['@', '!', '?']) || strpos($_GET['search'], 'https://') === 0)
goaway('search' . '?f=&search=' . $_GET['search']);
$which = null;
- if(argc() > 1)
+ if (argc() > 1)
$which = argv(1);
- if(! $which) {
- if(local_channel()) {
+ if (!$which) {
+ if (local_channel()) {
$channel = App::get_channel();
- if($channel && $channel['channel_address'])
- $which = $channel['channel_address'];
+ if ($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
}
}
- if(! $which) {
- notice( t('You must be logged in to see this page.') . EOL );
+ if (!$which) {
+ notice(t('You must be logged in to see this page.') . EOL);
return;
}
$profile = 0;
$channel = App::get_channel();
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
+ if ((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
$profile = argv(1);
}
$channel = channelx_by_nick($which);
- if(! $channel) {
+ if (!$channel) {
http_status_exit(404, 'Not found');
}
// handle zot6 channel discovery
- if(Libzot::is_zot_request()) {
+ if (Libzot::is_zot_request()) {
$sigdata = HTTPSig::verify(file_get_contents('php://input'), EMPTY_STR, 'zot6');
- if($sigdata && $sigdata['signer'] && $sigdata['header_valid']) {
- $data = json_encode(Libzot::zotinfo([ 'address' => $channel['channel_address'], 'target_url' => $sigdata['signer'] ]));
- $s = q("select site_crypto, hubloc_sitekey from site left join hubloc on hubloc_url = site_url where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
+ if ($sigdata && $sigdata['signer'] && $sigdata['header_valid']) {
+ $data = json_encode(Libzot::zotinfo(['address' => $channel['channel_address'], 'target_url' => $sigdata['signer']]));
+ $s = q("select site_crypto, hubloc_sitekey from site left join hubloc on hubloc_url = site_url where hubloc_id_url = '%s' and hubloc_network = 'zot6' limit 1",
dbesc($sigdata['signer'])
);
- if($s) {
- $data = json_encode(crypto_encapsulate($data,$s[0]['hubloc_sitekey'],Libzot::best_algorithm($s[0]['site_crypto'])));
+ if ($s) {
+ $data = json_encode(crypto_encapsulate($data, $s[0]['hubloc_sitekey'], Libzot::best_algorithm($s[0]['site_crypto'])));
}
}
else {
- $data = json_encode(Libzot::zotinfo([ 'guid_hash' => $channel['channel_hash'] ]));
+ $data = json_encode(Libzot::zotinfo(['guid_hash' => $channel['channel_hash']]));
}
$headers = [
'Content-Type' => 'application/x-zot+json',
'Digest' => HTTPSig::generate_digest_header($data),
'(request-target)' => strtolower($_SERVER['REQUEST_METHOD']) . ' ' . $_SERVER['REQUEST_URI']
- ];
- $h = HTTPSig::create_sig($headers,$channel['channel_prvkey'],channel_url($channel));
+ ];
+ $h = HTTPSig::create_sig($headers, $channel['channel_prvkey'], channel_url($channel));
HTTPSig::set_headers($h);
echo $data;
killme();
}
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
+ if (ActivityStreams::is_as_request($channel)) {
+
+ // Somebody may attempt an ActivityStreams fetch on one of our message permalinks
+ // Make it do the right thing.
+
+ $mid = ((x($_REQUEST, 'mid')) ? $_REQUEST['mid'] : '');
+ if ($mid && strpos($mid, 'b64.') === 0) {
+ $decoded = @base64url_decode(substr($mid, 4));
+ if ($decoded) {
+ $mid = $decoded;
+ }
+ }
+ if ($mid) {
+ $obj = null;
+ if (strpos($mid, z_root() . '/item/') === 0) {
+ App::$argc = 2;
+ App::$argv = ['item', basename($mid)];
+ $obj = new Item();
+ }
+ if (strpos($mid, z_root() . '/activity/') === 0) {
+ App::$argc = 2;
+ App::$argv = ['activity', basename($mid)];
+ $obj = new Activity();
+ }
+ if ($obj) {
+ $obj->init();
+ }
+ }
+ as_return_and_die(Activity::encode_person($channel, true), $channel);
+ }
+
+ if ((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
$profile = argv(1);
}
- head_add_link( [
+ head_add_link([
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Posts and comments'),
'href' => z_root() . '/feed/' . $which
]);
- head_add_link( [
+ head_add_link([
'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Only posts'),
@@ -109,18 +141,18 @@ class Channel extends Controller {
// Run profile_load() here to make sure the theme is set before
// we start loading content
- profile_load($which,$profile);
+ profile_load($which, $profile);
// Add Opengraph markup
- $mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : '');
- if(strpos($mid,'b64.') === 0)
- $mid = @base64url_decode(substr($mid,4));
-
- if($mid)
- $r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d AND item_private = 0 LIMIT 1",
- dbesc($mid),
- intval($channel['channel_id'])
- );
+ $mid = ((x($_REQUEST, 'mid')) ? $_REQUEST['mid'] : '');
+ if (strpos($mid, 'b64.') === 0)
+ $mid = @base64url_decode(substr($mid, 4));
+
+ if ($mid)
+ $r = q("SELECT * FROM item WHERE mid = '%s' AND uid = %d AND item_private = 0 LIMIT 1",
+ dbesc($mid),
+ intval($channel['channel_id'])
+ );
opengraph_add_meta($r ? $r[0] : [], $channel);
}
@@ -131,99 +163,99 @@ class Channel extends Controller {
$category = $datequery = $datequery2 = '';
- $mid = ((x($_REQUEST,'mid')) ? $_REQUEST['mid'] : '');
+ $mid = ((x($_REQUEST, 'mid')) ? $_REQUEST['mid'] : '');
- if(strpos($mid,'b64.') === 0)
- $decoded = @base64url_decode(substr($mid,4));
- if($decoded)
+ if (strpos($mid, 'b64.') === 0)
+ $decoded = @base64url_decode(substr($mid, 4));
+ if ($decoded)
$mid = $decoded;
- $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
- $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
+ $datequery = ((x($_GET, 'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
+ $datequery2 = ((x($_GET, 'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
- if(observer_prohibited(true)) {
+ if (observer_prohibited(true)) {
return login();
}
- $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
- $hashtags = ((x($_REQUEST,'tag')) ? $_REQUEST['tag'] : '');
- $order = ((x($_GET,'order')) ? notags($_GET['order']) : 'post');
- $search = ((x($_GET,'search')) ? $_GET['search'] : EMPTY_STR);
+ $category = ((x($_REQUEST, 'cat')) ? $_REQUEST['cat'] : '');
+ $hashtags = ((x($_REQUEST, 'tag')) ? $_REQUEST['tag'] : '');
+ $order = ((x($_GET, 'order')) ? notags($_GET['order']) : 'post');
+ $search = ((x($_GET, 'search')) ? $_GET['search'] : EMPTY_STR);
- $groups = array();
+ $groups = [];
$o = '';
- if($update) {
+ if ($update) {
// Ensure we've got a profile owner if updating.
App::$profile['profile_uid'] = App::$profile_uid = $update;
}
$is_owner = (((local_channel()) && (App::$profile['profile_uid'] == local_channel())) ? true : false);
- $channel = App::get_channel();
+ $channel = App::get_channel();
$observer = App::get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
- $perms = get_all_perms(App::$profile['profile_uid'],$ob_hash);
+ $perms = get_all_perms(App::$profile['profile_uid'], $ob_hash);
- if(! $perms['view_stream']) {
+ if (!$perms['view_stream']) {
// We may want to make the target of this redirect configurable
- if($perms['view_profile']) {
- notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
- goaway (z_root() . "/profile/" . App::$profile['channel_address']);
+ if ($perms['view_profile']) {
+ notice(t('Insufficient permissions. Request redirected to profile page.') . EOL);
+ goaway(z_root() . "/profile/" . App::$profile['channel_address']);
}
- notice( t('Permission denied.') . EOL);
+ notice(t('Permission denied.') . EOL);
return;
}
- if(! $update) {
+ if (!$update) {
nav_set_selected('Channel Home');
// search terms header
- if($search) {
- $o .= replace_macros(get_markup_template("section_title.tpl"),array(
- '$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8')
- ));
+ if ($search) {
+ $o .= replace_macros(get_markup_template("section_title.tpl"), [
+ '$title' => t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT, 'UTF-8')
+ ]);
}
- if($channel && $is_owner) {
- $channel_acl = array(
+ if ($channel && $is_owner) {
+ $channel_acl = [
'allow_cid' => $channel['channel_allow_cid'],
'allow_gid' => $channel['channel_allow_gid'],
- 'deny_cid' => $channel['channel_deny_cid'],
- 'deny_gid' => $channel['channel_deny_gid']
- );
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ ];
}
else {
- $channel_acl = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ];
+ $channel_acl = ['allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''];
}
- if($perms['post_wall']) {
-
- $x = array(
- 'is_owner' => $is_owner,
- 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(App::$profile['profile_uid'],'system','use_browser_location')))) ? true : false),
- 'default_location' => (($is_owner) ? App::$profile['channel_location'] : ''),
- 'nickname' => App::$profile['channel_address'],
- 'lockstate' => (((strlen(App::$profile['channel_allow_cid'])) || (strlen(App::$profile['channel_allow_gid'])) || (strlen(App::$profile['channel_deny_cid'])) || (strlen(App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel_acl,true, PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
- 'permissions' => $channel_acl,
- 'showacl' => (($is_owner) ? 'yes' : ''),
- 'bang' => '',
- 'visitor' => (($is_owner || $observer) ? true : false),
- 'profile_uid' => App::$profile['profile_uid'],
+ if ($perms['post_wall']) {
+
+ $x = [
+ 'is_owner' => $is_owner,
+ 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig(App::$profile['profile_uid'], 'system', 'use_browser_location')))) ? true : false),
+ 'default_location' => (($is_owner) ? App::$profile['channel_location'] : ''),
+ 'nickname' => App::$profile['channel_address'],
+ 'lockstate' => (((strlen(App::$profile['channel_allow_cid'])) || (strlen(App::$profile['channel_allow_gid'])) || (strlen(App::$profile['channel_deny_cid'])) || (strlen(App::$profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl, true, PermissionDescription::fromGlobalPermission('view_stream'), get_post_aclDialogDescription(), 'acl_dialog_post') : ''),
+ 'permissions' => $channel_acl,
+ 'showacl' => (($is_owner) ? 'yes' : ''),
+ 'bang' => '',
+ 'visitor' => (($is_owner || $observer) ? true : false),
+ 'profile_uid' => App::$profile['profile_uid'],
'editor_autocomplete' => true,
- 'bbco_autocomplete' => 'bbcode',
- 'bbcode' => true,
- 'jotnets' => true,
- 'reset' => t('Reset form')
- );
+ 'bbco_autocomplete' => 'bbcode',
+ 'bbcode' => true,
+ 'jotnets' => true,
+ 'reset' => t('Reset form')
+ ];
- $o .= status_editor($a,$x,false,'Channel');
+ $o .= status_editor($a, $x, false, 'Channel');
}
}
@@ -233,15 +265,15 @@ class Channel extends Controller {
* Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups
*/
- $item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_deleted = 0
+ $item_normal = " and item.item_hidden = 0 and item.item_type = 0 and item.item_deleted = 0
and item.item_unpublished = 0 and item.item_pending_remove = 0
and item.item_blocked = 0 ";
- if (! $is_owner)
- $item_normal .= "and item.item_delayed = 0 ";
+ if (!$is_owner)
+ $item_normal .= "and item.item_delayed = 0 ";
$item_normal_update = item_normal_update();
- $sql_extra = item_permissions_sql(App::$profile['profile_uid']);
+ $sql_extra = item_permissions_sql(App::$profile['profile_uid']);
- if(feature_enabled(App::$profile['profile_uid'], 'channel_list_mode') && (! $mid))
+ if (feature_enabled(App::$profile['profile_uid'], 'channel_list_mode') && (!$mid))
$page_mode = 'list';
else
$page_mode = 'client';
@@ -249,13 +281,13 @@ class Channel extends Controller {
$abook_uids = " and abook.abook_channel = " . intval(App::$profile['profile_uid']) . " ";
$simple_update = '';
- if($update && $_SESSION['loadtime'])
- $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC','UTC',$_SESSION['loadtime']) . "' ) ";
+ if ($update && $_SESSION['loadtime'])
+ $simple_update = " AND (( item_unseen = 1 AND item.changed > '" . datetime_convert('UTC', 'UTC', $_SESSION['loadtime']) . "' ) OR item.changed > '" . datetime_convert('UTC', 'UTC', $_SESSION['loadtime']) . "' ) ";
- if($search) {
+ if ($search) {
$search = escape_tags($search);
- if(strpos($search,'#') === 0) {
- $sql_extra .= term_query('item',substr($search,1),TERM_HASHTAG,TERM_COMMUNITYTAG);
+ if (strpos($search, '#') === 0) {
+ $sql_extra .= term_query('item', substr($search, 1), TERM_HASHTAG, TERM_COMMUNITYTAG);
}
else {
$sql_extra .= sprintf(" AND (item.body like '%s' OR item.title like '%s') ",
@@ -272,9 +304,9 @@ class Channel extends Controller {
'title' => 'oembed'
]);
- if(($update) && (! $load)) {
+ if (($update) && (!$load)) {
- if($mid) {
+ if ($mid) {
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal_update
AND item_wall = 1 $simple_update $sql_extra limit 1",
dbesc($mid . '%'),
@@ -295,40 +327,40 @@ class Channel extends Controller {
}
else {
- if(x($category)) {
- $sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
+ if (x($category)) {
+ $sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'], 'item', $category, TERM_CATEGORY));
}
- if(x($hashtags)) {
- $sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'],'item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
+ if (x($hashtags)) {
+ $sql_extra2 .= protect_sprintf(term_item_parent_query(App::$profile['profile_uid'], 'item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
- if($datequery) {
- $sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery))));
- $order = 'post';
+ if ($datequery) {
+ $sql_extra2 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery))));
+ $order = 'post';
}
- if($datequery2) {
- $sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
+ if ($datequery2) {
+ $sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery2))));
}
- if($order === 'post')
+ if ($order === 'post')
$ordering = "created";
else
$ordering = "commented";
- $itemspage = get_pconfig(local_channel(),'system','itemspage');
+ $itemspage = get_pconfig(local_channel(), 'system', 'itemspage');
App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 10));
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(App::$pager['itemspage']), intval(App::$pager['start']));
- if($noscript_content || $load) {
- if($mid) {
+ if ($noscript_content || $load) {
+ if ($mid) {
$r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal
AND item_wall = 1 $sql_extra limit 1",
dbesc($mid . '%'),
intval(App::$profile['profile_uid'])
);
- if (! $r) {
- notice( t('Permission denied.') . EOL);
+ if (!$r) {
+ notice(t('Permission denied.') . EOL);
}
}
else {
@@ -344,12 +376,12 @@ class Channel extends Controller {
}
}
else {
- $r = array();
+ $r = [];
}
}
- if($r) {
+ if ($r) {
- $parents_str = ids_to_querystr($r,'item_id');
+ $parents_str = ids_to_querystr($r, 'item_id');
$r = q("SELECT item.*, item.id AS item_id
FROM item
@@ -362,37 +394,38 @@ class Channel extends Controller {
xchan_query($r);
$items = fetch_post_tags($r, true);
- $items = conv_sort($items,$ordering);
+ $items = conv_sort($items, $ordering);
- if($load && $mid && (! count($items))) {
+ if ($load && $mid && (!count($items))) {
// This will happen if we don't have sufficient permissions
// to view the parent item (or the item itself if it is toplevel)
- notice( t('Permission denied.') . EOL);
+ notice(t('Permission denied.') . EOL);
}
- } else {
- $items = array();
+ }
+ else {
+ $items = [];
}
// Add pinned content
- if(! x($_REQUEST,'mid') && ! $search) {
+ if (!x($_REQUEST, 'mid') && !$search) {
$pinned = new \Zotlabs\Widget\Pinned;
- $r = $pinned->widget(intval(App::$profile['profile_uid']), [ITEM_TYPE_POST]);
- $o .= $r['html'];
+ $r = $pinned->widget(intval(App::$profile['profile_uid']), [ITEM_TYPE_POST]);
+ $o .= $r['html'];
}
$mode = (($search) ? 'search' : 'channel');
- if((! $update) && (! $load)) {
+ if ((!$update) && (!$load)) {
- if($decoded)
+ if ($decoded)
$mid = 'b64.' . base64url_encode($mid);
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
- $maxheight = get_pconfig(App::$profile['profile_uid'],'system','channel_divmore_height');
- if(! $maxheight)
+ $maxheight = get_pconfig(App::$profile['profile_uid'], 'system', 'channel_divmore_height');
+ if (!$maxheight)
$maxheight = 400;
$o .= '<div id="live-channel"></div>' . "\r\n";
@@ -400,48 +433,48 @@ class Channel extends Controller {
. "; var netargs = '?f='; var profile_page = " . App::$pager['page']
. "; divmore_height = " . intval($maxheight) . ";</script>\r\n";
- App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
- '$baseurl' => z_root(),
- '$pgtype' => 'channel',
- '$uid' => ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : '0'),
- '$gid' => '0',
- '$cid' => '0',
- '$cmin' => '(-1)',
- '$cmax' => '(-1)',
- '$star' => '0',
- '$liked' => '0',
- '$conv' => '0',
- '$spam' => '0',
- '$nouveau' => '0',
- '$wall' => '1',
- '$fh' => '0',
- '$dm' => '0',
- '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
- '$search' => $search,
- '$xchan' => '',
- '$order' => (($order) ? urlencode($order) : ''),
- '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
- '$file' => '',
- '$cats' => (($category) ? urlencode($category) : ''),
- '$tags' => (($hashtags) ? urlencode($hashtags) : ''),
- '$mid' => (($mid) ? urlencode($mid) : ''),
- '$verb' => '',
- '$net' => '',
- '$dend' => $datequery,
- '$dbegin' => $datequery2,
+ App::$page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"), [
+ '$baseurl' => z_root(),
+ '$pgtype' => 'channel',
+ '$uid' => ((App::$profile['profile_uid']) ? App::$profile['profile_uid'] : '0'),
+ '$gid' => '0',
+ '$cid' => '0',
+ '$cmin' => '(-1)',
+ '$cmax' => '(-1)',
+ '$star' => '0',
+ '$liked' => '0',
+ '$conv' => '0',
+ '$spam' => '0',
+ '$nouveau' => '0',
+ '$wall' => '1',
+ '$fh' => '0',
+ '$dm' => '0',
+ '$page' => ((App::$pager['page'] != 1) ? App::$pager['page'] : 1),
+ '$search' => $search,
+ '$xchan' => '',
+ '$order' => (($order) ? urlencode($order) : ''),
+ '$list' => ((x($_REQUEST, 'list')) ? intval($_REQUEST['list']) : 0),
+ '$file' => '',
+ '$cats' => (($category) ? urlencode($category) : ''),
+ '$tags' => (($hashtags) ? urlencode($hashtags) : ''),
+ '$mid' => (($mid) ? urlencode($mid) : ''),
+ '$verb' => '',
+ '$net' => '',
+ '$dend' => $datequery,
+ '$dbegin' => $datequery2,
'$conv_mode' => 'channel',
'$page_mode' => $page_mode
- ));
+ ]);
}
- if($update) {
- $o .= conversation($items,$mode,$update,$page_mode);
+ if ($update) {
+ $o .= conversation($items, $mode, $update, $page_mode);
}
else {
$o .= '<noscript>';
- if($noscript_content) {
- $o .= conversation($items,$mode,$update,'traditional');
+ if ($noscript_content) {
+ $o .= conversation($items, $mode, $update, 'traditional');
$o .= alt_pager(count($items));
}
else {
@@ -449,14 +482,14 @@ class Channel extends Controller {
}
$o .= '</noscript>';
- $o .= conversation($items,$mode,$update,$page_mode);
+ $o .= conversation($items, $mode, $update, $page_mode);
if ($mid && $items[0]['title'])
App::$page['title'] = $items[0]['title'] . " - " . App::$page['title'];
}
- if($mid)
+ if ($mid)
$o .= '<div id="content-complete"></div>';
$_SESSION['loadtime'] = datetime_convert();
diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php
index 0373630a9..118f11f64 100644
--- a/Zotlabs/Module/Profile.php
+++ b/Zotlabs/Module/Profile.php
@@ -1,5 +1,13 @@
<?php
-namespace Zotlabs\Module; /** @file */
+
+namespace Zotlabs\Module;
+
+use App;
+use Zotlabs\Lib\ActivityStreams;
+use Zotlabs\Lib\Activity;
+use Zotlabs\Web\Controller;
+
+/** @file */
require_once('include/contact_widgets.php');
require_once('include/items.php');
@@ -9,110 +17,115 @@ require_once('include/conversation.php');
require_once('include/acl_selectors.php');
-
-class Profile extends \Zotlabs\Web\Controller {
+class Profile extends Controller {
function init() {
-
- if(argc() > 1)
+
+ if (argc() > 1)
$which = argv(1);
else {
- notice( t('Requested profile is not available.') . EOL );
- \App::$error = 404;
+ notice(t('Requested profile is not available.') . EOL);
+ App::$error = 404;
return;
}
- nav_set_selected('Profile');
-
$profile = '';
- $channel = \App::get_channel();
-
- if((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
- $which = $channel['channel_address'];
- $profile = argv(1);
- $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
+ $channel = App::get_channel();
+
+ if (!$channel)
+ http_status_exit(404, 'Not found');
+
+ if (ActivityStreams::is_as_request()) {
+ $p = Activity::encode_person($channel, true);
+ as_return_and_die(['type' => 'Profile', 'describes' => $p], $channel);
+ }
+
+ nav_set_selected('Profile');
+
+ if ((local_channel()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
intval($profile),
intval(local_channel())
);
- if(! $r)
+ if (!$r)
$profile = '';
$profile = $r[0]['profile_guid'];
}
-
- head_add_link( [
- 'rel' => 'alternate',
+
+ head_add_link([
+ 'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Posts and comments'),
'href' => z_root() . '/feed/' . $which
]);
- head_add_link( [
- 'rel' => 'alternate',
+ head_add_link([
+ 'rel' => 'alternate',
'type' => 'application/atom+xml',
'title' => t('Only posts'),
'href' => z_root() . '/feed/' . $which . '?f=&top=1'
]);
- if(! $profile) {
+ if (!$profile) {
$x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
dbesc(argv(1))
);
- if($x) {
- \App::$profile = $x[0];
+ if ($x) {
+ App::$profile = $x[0];
}
}
-
- profile_load($which,$profile);
-
-
+
+ profile_load($which, $profile);
+
+
}
-
+
function get() {
-
- if(observer_prohibited(true)) {
+
+ if (observer_prohibited(true)) {
return login();
}
-
- $groups = array();
+ $groups = [];
$tab = 'profile';
- $o = '';
-
- if(! (perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(), 'view_profile'))) {
- notice( t('Permission denied.') . EOL);
+ $o = '';
+
+ if (!(perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_profile'))) {
+ notice(t('Permission denied.') . EOL);
return;
}
-
- if(argc() > 2 && argv(2) === 'vcard') {
+ if (argc() > 2 && argv(2) === 'vcard') {
header('Content-type: text/vcard');
- header('content-disposition: attachment; filename="' . t('vcard') . '-' . \App::$profile['channel_address'] . '.vcf"' );
- echo \App::$profile['profile_vcard'];
+ header('content-disposition: attachment; filename="' . t('vcard') . '-' . App::$profile['channel_address'] . '.vcf"');
+ echo App::$profile['profile_vcard'];
killme();
}
-
- $is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
-
- if(\App::$profile['hidewall'] && (! $is_owner) && (! remote_channel())) {
- notice( t('Permission denied.') . EOL);
+
+ $is_owner = ((local_channel()) && (local_channel() == App::$profile['profile_uid']) ? true : false);
+
+ if (App::$profile['hidewall'] && (!$is_owner) && (!remote_channel())) {
+ notice(t('Permission denied.') . EOL);
return;
}
-
- head_add_link([
+
+ head_add_link([
'rel' => 'alternate',
'type' => 'application/json+oembed',
- 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . \App::$query_string),
+ 'href' => z_root() . '/oep?f=&url=' . urlencode(z_root() . '/' . App::$query_string),
'title' => 'oembed'
]);
$o .= advanced_profile();
- call_hooks('profile_advanced',$o);
+ call_hooks('profile_advanced', $o);
return $o;
-
+
}
-
+
}
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
index 95510c349..eeeff9613 100644
--- a/Zotlabs/Module/Search.php
+++ b/Zotlabs/Module/Search.php
@@ -58,15 +58,13 @@ class Search extends Controller {
$o .= search($search, 'search-box', '/search', ((local_channel()) ? true : false));
- if (local_channel() && strpos($search, 'https://') === 0) {
+ if (local_channel() && strpos($search, 'https://') === 0 && !$update && !$load) {
$j = Activity::fetch($search, App::get_channel());
if ($j) {
$AS = new ActivityStreams($j);
-
if ($AS->is_valid()) {
// check if is_an_actor, otherwise import activity
if (is_array($AS->obj) && !ActivityStreams::is_an_actor($AS->obj)) {
- // The boolean flag enables html cache of the item
$item = Activity::decode_note($AS);
if ($item) {
logger('parsed_item: ' . print_r($item, true), LOGGER_DATA);
@@ -76,6 +74,14 @@ class Search extends Controller {
}
}
}
+ else {
+ // try other fetch providers (e.g. diaspora)
+ $hookdata = [
+ 'channel' => App::get_channel(),
+ 'data' => $search
+ ];
+ call_hooks('fetch_provider', $hookdata);
+ }
}
if (strpos($search, '#') === 0) {
@@ -120,7 +126,7 @@ class Search extends Controller {
// Here is the way permissions work in the search module...
// Only public posts can be shown
// OR your own posts if you are a logged in member
- // No items will be shown if the member has a blocked profile wall.
+ // No items will be shown if the member has a blocked profile wall.
if ((!$update) && (!$load)) {