aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs
diff options
context:
space:
mode:
Diffstat (limited to 'Zotlabs')
-rw-r--r--Zotlabs/Daemon/Cron.php5
-rw-r--r--Zotlabs/Daemon/Cron_daily.php2
-rw-r--r--Zotlabs/Daemon/Deliver.php4
-rw-r--r--Zotlabs/Daemon/Expire.php1
-rw-r--r--Zotlabs/Daemon/Notifier.php590
-rw-r--r--Zotlabs/Daemon/Onedirsync.php6
-rw-r--r--Zotlabs/Daemon/Onepoll.php30
-rw-r--r--Zotlabs/Daemon/Poller.php11
-rw-r--r--Zotlabs/Daemon/Queue.php17
-rw-r--r--Zotlabs/Daemon/Ratenotif.php126
-rw-r--r--Zotlabs/Daemon/Thumbnail.php1
-rw-r--r--Zotlabs/Lib/Activity.php5
-rw-r--r--Zotlabs/Lib/Apps.php2
-rw-r--r--Zotlabs/Lib/Connect.php2
-rw-r--r--Zotlabs/Lib/DReport.php3
-rw-r--r--Zotlabs/Lib/Libsync.php3
-rw-r--r--Zotlabs/Lib/Libzot.php99
-rw-r--r--Zotlabs/Lib/Libzotdir.php18
-rw-r--r--Zotlabs/Lib/MessageFilter.php2
-rw-r--r--Zotlabs/Lib/Queue.php92
-rw-r--r--Zotlabs/Module/Acl.php1
-rw-r--r--Zotlabs/Module/Admin.php1
-rw-r--r--Zotlabs/Module/Admin/Queue.php28
-rw-r--r--Zotlabs/Module/Authtest.php31
-rw-r--r--Zotlabs/Module/Connedit.php14
-rw-r--r--Zotlabs/Module/Directory.php1
-rw-r--r--Zotlabs/Module/Dirsearch.php198
-rw-r--r--Zotlabs/Module/Dreport.php51
-rw-r--r--Zotlabs/Module/Events.php750
-rw-r--r--Zotlabs/Module/Fhublocs.php18
-rw-r--r--Zotlabs/Module/Import.php71
-rw-r--r--Zotlabs/Module/Item.php2
-rw-r--r--Zotlabs/Module/Locs.php10
-rw-r--r--Zotlabs/Module/Manage.php11
-rw-r--r--Zotlabs/Module/Message.php108
-rw-r--r--Zotlabs/Module/Notes.php1
-rw-r--r--Zotlabs/Module/Notifications.php50
-rw-r--r--Zotlabs/Module/Photos.php2
-rw-r--r--Zotlabs/Module/Post.php34
-rw-r--r--Zotlabs/Module/Prate.php107
-rw-r--r--Zotlabs/Module/Probe.php60
-rw-r--r--Zotlabs/Module/Profiles.php1
-rw-r--r--Zotlabs/Module/Pubsites.php1
-rw-r--r--Zotlabs/Module/Rate.php174
-rw-r--r--Zotlabs/Module/Ratings.php109
-rw-r--r--Zotlabs/Module/Ratingsearch.php78
-rw-r--r--Zotlabs/Module/Rbmark.php67
-rw-r--r--Zotlabs/Module/Rpost.php5
-rw-r--r--Zotlabs/Module/Settings.php45
-rw-r--r--Zotlabs/Module/Sse_bs.php31
-rw-r--r--Zotlabs/Module/Webpages.php197
-rw-r--r--Zotlabs/Module/Well_known.php36
-rw-r--r--Zotlabs/Module/Wfinger.php8
-rw-r--r--Zotlabs/Module/Zfinger.php43
-rw-r--r--Zotlabs/Module/Zping.php33
-rw-r--r--Zotlabs/Widget/Conversations.php175
-rw-r--r--Zotlabs/Widget/Dirtags.php2
-rw-r--r--Zotlabs/Widget/Mailmenu.php4
-rw-r--r--Zotlabs/Widget/Notifications.php17
-rw-r--r--Zotlabs/Zot/Auth.php363
-rw-r--r--Zotlabs/Zot/Finger.php155
-rw-r--r--Zotlabs/Zot/IHandler.php24
-rw-r--r--Zotlabs/Zot/Receiver.php304
-rw-r--r--Zotlabs/Zot/ZotHandler.php39
-rw-r--r--Zotlabs/Zot6/Finger.php145
-rw-r--r--Zotlabs/Zot6/IHandler.php10
-rw-r--r--Zotlabs/Zot6/Receiver.php18
-rw-r--r--Zotlabs/Zot6/Zot6Handler.php97
68 files changed, 827 insertions, 3922 deletions
diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php
index 5c0330806..29a8902b0 100644
--- a/Zotlabs/Daemon/Cron.php
+++ b/Zotlabs/Daemon/Cron.php
@@ -165,11 +165,6 @@ class Cron {
}
}
-
- // check if any connections transitioned to zot6 and upgrade the connections to zot6 at this hub if so.
- require_once('include/connections.php');
- z6trans_connections();
-
require_once('include/attach.php');
attach_upgrade();
diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php
index bebccca9d..d1b74a032 100644
--- a/Zotlabs/Daemon/Cron_daily.php
+++ b/Zotlabs/Daemon/Cron_daily.php
@@ -95,8 +95,6 @@ class Cron_daily {
remove_obsolete_hublocs();
remove_duplicate_singleton_hublocs();
- z6_discover();
-
$date = datetime_convert();
call_hooks('cron_daily', $date);
diff --git a/Zotlabs/Daemon/Deliver.php b/Zotlabs/Daemon/Deliver.php
index f8149ee69..400ef697b 100644
--- a/Zotlabs/Daemon/Deliver.php
+++ b/Zotlabs/Daemon/Deliver.php
@@ -2,7 +2,7 @@
namespace Zotlabs\Daemon;
-require_once('include/queue_fn.php');
+use Zotlabs\Lib\Queue;
class Deliver {
@@ -23,7 +23,7 @@ class Deliver {
);
if ($r) {
- queue_deliver($r[0], true);
+ Queue::deliver($r[0], true);
}
}
diff --git a/Zotlabs/Daemon/Expire.php b/Zotlabs/Daemon/Expire.php
index c4ff8aec6..99fe68b6f 100644
--- a/Zotlabs/Daemon/Expire.php
+++ b/Zotlabs/Daemon/Expire.php
@@ -2,6 +2,7 @@
namespace Zotlabs\Daemon;
+require_once('include/items.php');
class Expire {
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 741078422..0f367103e 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -6,23 +6,14 @@ use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Activity;
use Zotlabs\Lib\Queue;
-require_once('include/queue_fn.php');
require_once('include/html2plain.php');
require_once('include/conversation.php');
-require_once('include/zot.php');
require_once('include/items.php');
require_once('include/bbcode.php');
/*
- * This file was at one time responsible for doing all deliveries, but this caused
- * big problems on shared hosting systems, where the process might get killed by the
- * hosting provider and nothing would get delivered.
- * It now only delivers one message under certain cases, and invokes a queued
- * delivery mechanism (include/deliver.php) to deliver individual contacts at
- * controlled intervals.
- * This has a much better chance of surviving random processes getting killed
- * by the hosting provider.
+ * Notifier - message dispatch and preparation for delivery
*
* The basic flow is:
* Identify the type of message
@@ -53,7 +44,6 @@ require_once('include/bbcode.php');
* event (in events.php)
* expire (in items.php)
* like (in like.php, poke.php)
- * mail (in message.php)
* tag (in photos.php, poke.php, tagger.php)
* tgroup (in items.php)
* wall-new (in photos.php, item.php)
@@ -63,7 +53,6 @@ require_once('include/bbcode.php');
* ZOT
* permission_create abook_id
* permission_accept abook_id
- * permission_reject abook_id
* permission_update abook_id
* refresh_all channel_id
* purge channel_id xchan_hash
@@ -71,7 +60,6 @@ require_once('include/bbcode.php');
* expire channel_id
* relay item_id (item was relayed to owner, we will deliver it as owner)
* single_activity item_id (deliver to a singleton network from the appropriate clone)
- * single_mail mail_id (deliver to a singleton network from the appropriate clone)
* location channel_id
* request channel_id xchan_hash message_id
* rating xlink_id
@@ -82,10 +70,20 @@ require_once('include/bbcode.php');
class Notifier {
+ static public $deliveries = [];
+ static public $recipients = [];
+ static public $env_recips = [];
+ static public $packet_type = 'activity';
+ static public $encoding = 'activitystreams';
+ static public $encoded_item = null;
+ static public $channel = null;
+ static public $private = false;
+
static public function run($argc, $argv) {
- if ($argc < 3)
+ if ($argc < 3) {
return;
+ }
logger('notifier: invoked: ' . print_r($argv, true), LOGGER_DEBUG);
@@ -93,64 +91,26 @@ class Notifier {
$item_id = $argv[2];
- if (!$item_id)
+ if (!$item_id) {
return;
-
- $sys = get_sys_channel();
-
- $deliveries = [];
-
- $request = false;
- $mail = false;
- $location = false;
- $recipients = [];
- $normal_mode = true;
- $packet_type = 'undefined';
-
- if ($cmd === 'mail' || $cmd === 'single_mail') {
- $normal_mode = false;
- $mail = true;
- $private = true;
- $message = q("SELECT * FROM mail WHERE id = %d LIMIT 1",
- intval($item_id)
- );
- if (!$message) {
- return;
- }
- xchan_mail_query($message[0]);
- $uid = $message[0]['channel_id'];
- $recipients[] = $message[0]['from_xchan']; // include clones
- $recipients[] = $message[0]['to_xchan'];
- $item = $message[0];
- $encoded_item = encode_mail($item);
-
- $s = q("select * from channel where channel_id = %d limit 1",
- intval($uid)
- );
- if ($s)
- $channel = $s[0];
-
}
- elseif ($cmd === 'request') {
- $channel_id = $item_id;
- $xchan = $argv[3];
- $request_message_id = $argv[4];
- $s = q("select * from channel where channel_id = %d limit 1",
- intval($channel_id)
- );
- if ($s)
- $channel = $s[0];
- $private = true;
- $recipients[] = $xchan;
- $packet_type = 'request';
- $normal_mode = false;
- }
- elseif ($cmd === 'keychange') {
- $channel = channelx_by_n($item_id);
+ self::$deliveries = [];
+ self::$recipients = [];
+ self::$env_recips = [];
+ self::$packet_type = 'activity';
+ self::$encoding = 'activitystreams';
+ self::$encoded_item = null;
+ self::$channel = null;
+ self::$private = false;
+
+ $sys = get_sys_channel();
+ $normal_mode = true;
- $r = q("select abook_xchan from abook where abook_channel = %d",
+ if ($cmd === 'keychange') {
+ self::$channel = channelx_by_n($item_id);
+ $r = q("select abook_xchan from abook where abook_channel = %d",
intval($item_id)
);
if ($r) {
@@ -158,30 +118,38 @@ class Notifier {
$recipients[] = $rr['abook_xchan'];
}
}
- $private = false;
- $packet_type = 'keychange';
- $normal_mode = false;
+ self::$private = false;
+ self::$packet_type = 'keychange';
+ self::$encoded_item = get_pconfig(self::$channel['channel_id'], 'system', 'keychange');
+ self::$encoding = 'zot';
+ $normal_mode = false;
}
- elseif (in_array($cmd, ['permission_update', 'permission_reject', 'permission_accept', 'permission_create'])) {
+ elseif (in_array($cmd, ['permission_update', 'permission_accept', 'permission_create'])) {
// Get the (single) recipient
$r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_self = 0",
intval($item_id)
);
if ($r) {
- $uid = $r[0]['abook_channel'];
+ $recip = $r[0];
+
// Get the sender
- $channel = channelx_by_n($uid);
- if ($channel) {
- $perm_update = ['sender' => $channel, 'recipient' => $r[0], 'success' => false, 'deliveries' => ''];
-
- if ($cmd === 'permission_create')
- call_hooks('permissions_create', $perm_update);
- elseif ($cmd === 'permission_accept')
- call_hooks('permissions_accept', $perm_update);
- elseif ($cmd === 'permission_reject')
- call_hooks('permissions_reject', $perm_update);
- else
- call_hooks('permissions_update', $perm_update);
+ self::$channel = channelx_by_n($recip['abook_channel']);
+ if (self::$channel) {
+ $perm_update = ['sender' => self::$channel, 'recipient' => $recip, 'success' => false, 'deliveries' => ''];
+
+ switch ($cmd) {
+ case 'permission_create':
+ call_hooks('permissions_create', $perm_update);
+ break;
+ case 'permission_accept':
+ call_hooks('permissions_accept', $perm_update);
+ break;
+ case 'permission_update':
+ call_hooks('permissions_update', $perm_update);
+ break;
+ default:
+ break;
+ }
if ($perm_update['success']) {
if ($perm_update['deliveries']) {
@@ -191,55 +159,29 @@ class Notifier {
return;
}
else {
- $recipients[] = $r[0]['abook_xchan'];
- $private = false;
- $packet_type = 'refresh';
- $packet_recips = [['guid' => $r[0]['xchan_guid'], 'guid_sig' => $r[0]['xchan_guid_sig'], 'hash' => $r[0]['xchan_hash']]];
+ self::$recipients[] = $recip['abook_xchan'];
+ self::$private = false;
+ self::$packet_type = 'refresh';
+ self::$env_recips = [$recip['xchan_hash']];
}
}
}
}
elseif ($cmd === 'refresh_all') {
logger('notifier: refresh_all: ' . $item_id);
- $uid = $item_id;
- $channel = channelx_by_n($item_id);
-
- $r = q("select abook_xchan from abook where abook_channel = %d",
- intval($uid)
- );
- if ($r) {
- foreach ($r as $rr) {
- $recipients[] = $rr['abook_xchan'];
- }
- }
- $private = false;
- $packet_type = 'refresh';
- }
- elseif ($cmd === 'location') {
- logger('notifier: location: ' . $item_id);
- $s = q("select * from channel where channel_id = %d limit 1",
- intval($item_id)
- );
- if ($s)
- $channel = $s[0];
- $uid = $item_id;
- $recipients = [];
+ self::$channel = channelx_by_n($item_id);
- $r = q("select abook_xchan from abook where abook_channel = %d",
- intval($uid)
+ $r = q("select abook_xchan from abook where abook_channel = %d",
+ intval($item_id)
);
if ($r) {
foreach ($r as $rr) {
- $recipients[] = $rr['abook_xchan'];
+ self::$recipients[] = $rr['abook_xchan'];
}
}
-
- $encoded_item = ['locations' => Libzot::encode_locations($channel), 'type' => 'location', 'encoding' => 'zot'];
- $target_item = ['aid' => $channel['channel_account_id'], 'uid' => $channel['channel_id']];
- $private = false;
- $packet_type = 'location';
- $location = true;
+ self::$private = false;
+ self::$packet_type = 'refresh';
}
elseif ($cmd === 'purge') {
$xchan = $argv[3];
@@ -248,33 +190,27 @@ class Notifier {
return;
}
- $channel = channelx_by_n($item_id);
- $recipients[] = $xchan;
- $private = true;
- $packet_type = 'purge';
- $packet_recips[] = ['hash' => $xchan];
+ self::$channel = channelx_by_n($item_id);
+ self::$recipients = [$xchan];
+ self::$private = true;
+ self::$packet_type = 'purge';
}
elseif ($cmd === 'purge_all') {
-
logger('notifier: purge_all: ' . $item_id);
- $channel = channelx_by_n($item_id);
+ self::$channel = channelx_by_n($item_id);
+ self::$recipients = [];
+ self::$private = false;
+ self::$packet_type = 'purge';
- $recipients = [];
- $r = q("select abook_xchan from abook where abook_channel = %d and abook_self = 0",
+ $r = q("select abook_xchan from abook where abook_channel = %d and abook_self = 0",
intval($item_id)
);
if (!$r) {
return;
}
foreach ($r as $rr) {
- $recipients[] = $rr['abook_xchan'];
- $packet_recips[] = ['hash' => $rr['abook_xchan']];
+ self::$recipients[] = $rr['abook_xchan'];
}
-
- $private = false;
- $packet_type = 'purge';
-
-
}
else {
@@ -282,15 +218,14 @@ class Notifier {
// Fetch the target item
- $r = q("SELECT * FROM item WHERE id = %d and parent != 0 LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d AND parent != 0",
intval($item_id)
);
-
- if (!$r)
+ if (!$r) {
return;
+ }
xchan_query($r);
-
$r = fetch_post_tags($r);
$target_item = $r[0];
@@ -345,11 +280,12 @@ class Notifier {
$s = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1",
intval($target_item['uid'])
);
- if ($s)
- $channel = $s[0];
+ if ($s) {
+ self::$channel = $s[0];
+ }
- if ($channel['channel_hash'] !== $target_item['author_xchan'] && $channel['channel_hash'] !== $target_item['owner_xchan']) {
- logger("notifier: Sending channel {$channel['channel_hash']} is not owner {$target_item['owner_xchan']} or author {$target_item['author_xchan']}", LOGGER_NORMAL, LOG_WARNING);
+ if (self::$channel['channel_hash'] !== $target_item['author_xchan'] && self::$channel['channel_hash'] !== $target_item['owner_xchan']) {
+ logger("notifier: Sending channel " . self::$channel['channel_hash'] . " is not owner {$target_item['owner_xchan']} or author {$target_item['author_xchan']}", LOGGER_NORMAL, LOG_WARNING);
return;
}
@@ -359,12 +295,13 @@ class Notifier {
}
else {
// fetch the parent item
- $r = q("SELECT * from item where id = %d order by id asc",
+ $r = q("SELECT * FROM item WHERE id = %d",
intval($target_item['parent'])
);
- if (!$r)
+ if (!$r) {
return;
+ }
if (strpos($r[0]['postopts'], 'nodeliver') !== false) {
logger('notifier: target item is undeliverable', LOGGER_DEBUG, LOG_NOTICE);
@@ -379,20 +316,17 @@ class Notifier {
}
// avoid looping of discover items 12/4/2014
-
- if ($sys && $parent_item['uid'] == $sys['channel_id'])
+ if ($sys && $parent_item['uid'] == $sys['channel_id']) {
return;
+ }
- $encoded_item = encode_item($target_item);
-
+ $m = get_iconfig($target_item, 'activitypub', 'signed_data');
// Re-use existing signature unless the activity type changed to a Tombstone, which won't verify.
- $m = ((intval($target_item['item_deleted'])) ? '' : get_iconfig($target_item, 'activitypub', 'signed_data'));
-
- if ($m) {
- $activity = json_decode($m, true);
+ if ($m && (!intval($target_item['item_deleted']))) {
+ self::$encoded_item = json_decode($m, true);
}
else {
- $activity = array_merge(['@context' => [
+ self::$encoded_item = array_merge(['@context' => [
ACTIVITYSTREAMS_JSONLD_REV,
'https://w3id.org/security/v1',
z_root() . ZOT_APSCHEMA_REV
@@ -401,7 +335,7 @@ class Notifier {
}
logger('target_item: ' . print_r($target_item, true), LOGGER_DEBUG);
- logger('encoded: ' . print_r($activity, true), LOGGER_DEBUG);
+ logger('encoded: ' . print_r(self::$encoded_item, true), LOGGER_DEBUG);
// Send comments to the owner to re-deliver to everybody in the conversation
// We only do this if the item in question originated on this site. This prevents looping.
@@ -412,9 +346,9 @@ class Notifier {
// flag on comments for an extended period. So we'll also call comment_local_origin() which looks at
// the hostname in the message_id and provides a second (fallback) opinion.
- $relay_to_owner = (((!$top_level_post) && (intval($target_item['item_origin'])) && comment_local_origin($target_item)) ? true : false);
-
- $uplink = false;
+ $relay_to_owner = (!$top_level_post && intval($target_item['item_origin']) && comment_local_origin($target_item));
+ $uplink = false;
+ $upstream = false;
// $cmd === 'relay' indicates the owner is sending it to the original recipients
// don't allow the item in the relay command to relay to owner under any circumstances, it will loop
@@ -426,27 +360,34 @@ class Notifier {
if (($cmd === 'uplink') && intval($parent_item['item_uplink']) && (!$top_level_post)) {
logger('notifier: uplink');
- $uplink = true;
+ $uplink = true;
+ self::$packet_type = 'response';
}
if (($relay_to_owner || $uplink) && ($cmd !== 'relay')) {
logger('notifier: followup relay', LOGGER_DEBUG);
- $recipients = [($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']];
- $private = true;
- if (!$encoded_item['flags'])
- $encoded_item['flags'] = [];
- $encoded_item['flags'][] = 'relay';
- $upstream = true;
+ $sendto = (($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']);
+ self::$recipients = [$sendto];
+ self::$private = true;
+ $upstream = true;
+ self::$packet_type = 'response';
}
else {
- logger('notifier: normal distribution', LOGGER_DEBUG);
- if ($cmd === 'relay')
- logger('notifier: owner relay');
- $upstream = false;
+ if ($cmd === 'relay') {
+ logger('owner relay (downstream delivery)');
+ }
+ else {
+ logger('normal (downstream) distribution', LOGGER_DEBUG);
+ }
+
+ if ($parent_item && $parent_item['item_private'] !== $target_item['item_private']) {
+ logger('conversation privacy mismatch - downstream delivery prevented');
+ return;
+ }
+
// if our parent is a tag_delivery recipient, uplink to the original author causing
// a delivery fork.
-
- if (($parent_item) && intval($parent_item['item_uplink']) && (!$top_level_post) && ($cmd !== 'uplink')) {
+ if ($parent_item && intval($parent_item['item_uplink']) && !$top_level_post && $cmd !== 'uplink') {
// don't uplink a relayed post to the relay owner
if ($parent_item['source_xchan'] !== $parent_item['owner_xchan']) {
logger('notifier: uplinking this item');
@@ -454,80 +395,70 @@ class Notifier {
}
}
- $private = false;
- $recipients = collect_recipients($parent_item, $private);
+ self::$private = false;
+ self::$recipients = collect_recipients($parent_item, self::$private);
+
+ // FIXME add any additional recipients such as mentions, etc.
if ($top_level_post) {
// remove clones who will receive the post via sync
- $recipients = array_diff($recipients, [$target_item['owner_xchan']]);
+ self::$recipients = array_values(array_diff(self::$recipients, [$target_item['owner_xchan']]));
}
- // FIXME add any additional recipients such as mentions, etc.
-
+ // don't send deletions onward for other people's stuff
+ if (intval($target_item['item_deleted']) && (!intval($target_item['item_wall']))) {
+ logger('notifier: ignoring delete notification for non-wall item', LOGGER_NORMAL, LOG_NOTICE);
+ return;
+ }
}
}
- $walltowall = (($top_level_post && $channel['xchan_hash'] === $target_item['author_xchan']) ? true : false);
-
// Generic delivery section, we have an encoded item and recipients
// Now start the delivery process
- $x = $encoded_item;
- $x['title'] = 'private';
- $x['body'] = 'private';
- logger('notifier: encoded item: ' . print_r($x, true), LOGGER_DATA, LOG_DEBUG);
-
- //logger('notifier: encoded activity: ' . print_r($activity,true), LOGGER_DATA, LOG_DEBUG);
+ logger('encoded item: ' . print_r(self::$encoded_item, true), LOGGER_DATA, LOG_DEBUG);
- stringify_array_elms($recipients);
- if (!$recipients) {
+ stringify_array_elms(self::$recipients);
+ if (!self::$recipients) {
logger('no recipients');
return;
}
- // logger('notifier: recipients: ' . print_r($recipients,true), LOGGER_NORMAL, LOG_DEBUG);
-
- $env_recips = (($private) ? [] : null);
+ // logger('recipients: ' . print_r(self::$recipients,true), LOGGER_NORMAL, LOG_DEBUG);
- $details = q("select xchan_hash, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . protect_sprintf(implode(',', $recipients)) . ")");
+ if (!count(self::$env_recips)) {
+ self::$env_recips = ((self::$private) ? [] : null);
+ }
$recip_list = [];
+ $details = dbq("select xchan_hash, xchan_network, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . protect_sprintf(implode(',', self::$recipients)) . ")");
+
if ($details) {
foreach ($details as $d) {
$recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')';
- if ($private) {
- $env_recips[] = [
- 'guid' => $d['xchan_guid'],
- 'guid_sig' => $d['xchan_guid_sig'],
- 'hash' => $d['xchan_hash']
- ];
+ if (self::$private) {
+ self::$env_recips[] = $d['xchan_hash'];
}
}
}
$narr = [
- 'channel' => $channel,
+ 'channel' => self::$channel,
'upstream' => $upstream,
- 'env_recips' => $env_recips,
- 'packet_recips' => $packet_recips,
- 'recipients' => $recipients,
- 'item' => $item,
+ 'env_recips' => self::$env_recips,
+ 'recipients' => self::$recipients,
'target_item' => $target_item,
'parent_item' => $parent_item,
'top_level_post' => $top_level_post,
- 'private' => $private,
+ 'private' => self::$private,
'relay_to_owner' => $relay_to_owner,
'uplink' => $uplink,
'cmd' => $cmd,
- 'mail' => $mail,
- 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
- 'location' => $location,
- 'request' => $request,
+ 'single' => ($cmd === 'single_activity'),
'normal_mode' => $normal_mode,
- 'packet_type' => $packet_type,
- 'walltowall' => $walltowall,
+ 'packet_type' => self::$packet_type,
'queued' => []
];
@@ -539,13 +470,13 @@ class Notifier {
// notifier_process can alter the recipient list
- $recipients = $narr['recipients'];
- $env_recips = $narr['env_recips'];
- $packet_recips = $narr['packet_recips'];
+ self::$recipients = $narr['recipients'];
+ self::$env_recips = $narr['env_recips'];
- if (($private) && (!$env_recips)) {
+ if (self::$private && !self::$env_recips) {
// shouldn't happen
logger('notifier: private message with no envelope recipients.' . print_r($argv, true), LOGGER_NORMAL, LOG_NOTICE);
+ return;
}
logger('notifier: recipients (may be delivered to more if public): ' . print_r($recip_list, true), LOGGER_DEBUG);
@@ -554,15 +485,15 @@ class Notifier {
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs; checking that the site is not dead.
- $hubs = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_version, site.site_project, site.site_dead from hubloc left join site on site_url = hubloc_url
- where hubloc_hash in (" . protect_sprintf(implode(',', $recipients)) . ")
+ $hubs = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_dead from hubloc left join site on site_url = hubloc_url
+ where hubloc_hash in (" . protect_sprintf(implode(',', self::$recipients)) . ")
and hubloc_error = 0 and hubloc_deleted = 0"
);
// public posts won't make it to the local public stream unless there's a recipient on this site.
// This code block sees if it's a public post and localhost is missing, and if so adds an entry for the local sys channel to the $hubs list
- if (!$private) {
+ if (!self::$private) {
$found_localhost = false;
if ($hubs) {
foreach ($hubs as $h) {
@@ -573,12 +504,12 @@ class Notifier {
}
}
if (!$found_localhost) {
- $localhub = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_version, site.site_project, site.site_dead from hubloc
- left join site on site_url = hubloc_url where hubloc_id_url = '%s' and hubloc_error = 0 and hubloc_deleted = 0",
+ $localhub = q("select hubloc.*, site.site_crypto, site.site_flags, site.site_dead from hubloc left join site on site_url = hubloc_url
+ where hubloc_id_url = '%s' and hubloc_error = 0 and hubloc_deleted = 0",
dbesc(z_root() . '/channel/sys')
);
if ($localhub) {
- $hubs = array_merge($hubs, $localhub);
+ $hubs = array_merge($localhub, $hubs);
}
}
}
@@ -603,33 +534,24 @@ class Notifier {
$dead = []; // known dead hubs - report them as undeliverable
foreach ($hubs as $hub) {
-
- if (intval($hub['site_dead'])) {
+ if (isset($hub['site_dead']) && intval($hub['site_dead'])) {
$dead[] = $hub;
continue;
}
- if ($env_recips) {
- foreach ($env_recips as $er) {
- if ($hub['hubloc_hash'] === $er['hash']) {
- if (!array_key_exists($hub['hubloc_host'] . $hub['hubloc_sitekey'], $hub_env)) {
- $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] = [];
+ if (self::$env_recips) {
+ foreach (self::$env_recips as $er) {
+ if ($hub['hubloc_hash'] === $er) {
+ if (!array_key_exists($hub['hubloc_site_id'], $hub_env)) {
+ $hub_env[$hub['hubloc_site_id']] = [];
}
- $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']][] = $er;
+ $hub_env[$hub['hubloc_site_id']][] = $er;
}
}
}
-
- if ($hub['hubloc_network'] == 'zot') {
+ if ($hub['hubloc_network'] === 'zot6') {
if (!in_array($hub['hubloc_sitekey'], $keys)) {
- $hublist[] = $hub['hubloc_host'] . ' ' . $hub['hubloc_network'];
- $dhubs[] = $hub;
- $keys[] = $hub['hubloc_sitekey'];
- }
- }
- else {
- if (!in_array($hub['hubloc_url'], $urls)) {
if ($hub['hubloc_url'] === z_root()) {
//deliver to local hub first
array_unshift($hublist, $hub['hubloc_host'] . ' ' . $hub['hubloc_network']);
@@ -639,7 +561,14 @@ class Notifier {
$hublist[] = $hub['hubloc_host'] . ' ' . $hub['hubloc_network'];
$dhubs[] = $hub;
}
- $urls[] = $hub['hubloc_url'];
+ $keys[] = $hub['hubloc_sitekey'];
+ }
+ }
+ else {
+ if (!in_array($hub['hubloc_url'], $urls)) {
+ $hublist[] = $hub['hubloc_host'] . ' ' . $hub['hubloc_network'];
+ $dhubs[] = $hub;
+ $urls[] = $hub['hubloc_url'];
}
}
}
@@ -650,33 +579,26 @@ class Notifier {
logger('notifier_hub: ' . $hub['hubloc_url'], LOGGER_DEBUG);
- if (!in_array($hub['hubloc_network'], ['zot', 'zot6'])) {
+ if ($hub['hubloc_network'] !== 'zot6') {
$narr = [
- 'channel' => $channel,
+ 'channel' => self::$channel,
'upstream' => $upstream,
- 'env_recips' => $env_recips,
- 'packet_recips' => $packet_recips,
- 'recipients' => $recipients,
- 'item' => $item,
+ 'env_recips' => self::$env_recips,
+ 'recipients' => self::$recipients,
'target_item' => $target_item,
'parent_item' => $parent_item,
'hub' => $hub,
'top_level_post' => $top_level_post,
- 'private' => $private,
+ 'private' => self::$private,
'relay_to_owner' => $relay_to_owner,
'uplink' => $uplink,
'cmd' => $cmd,
- 'mail' => $mail,
- 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
- 'location' => $location,
- 'request' => $request,
+ 'single' => $cmd === 'single_activity',
'normal_mode' => $normal_mode,
- 'packet_type' => $packet_type,
- 'walltowall' => $walltowall,
+ 'packet_type' => self::$packet_type,
'queued' => []
];
-
call_hooks('notifier_hub', $narr);
if ($narr['queued']) {
foreach ($narr['queued'] as $pq)
@@ -695,153 +617,62 @@ class Notifier {
// will invoke a delivery to those connections which are connected to just that
// hub instance.
- if ($cmd === 'single_mail' || $cmd === 'single_activity') {
- continue;
- }
-
- if (!in_array($hub['hubloc_network'], ['zot', 'zot6'])) {
+ if ($cmd === 'single_activity') {
continue;
}
- // Do not change this to a uuid as long as we have traditional zot servers
- // in the loop. The signature verification step can't handle dashes in the
- // hashes.
-
- $hash = random_string(48);
+ // default: zot protocol
- $packet = null;
- $pmsg = '';
+ $hash = new_uuid();
- if ($packet_type === 'refresh' || $packet_type === 'purge') {
- if ($hub['hubloc_network'] === 'zot6') {
- $packet = Libzot::build_packet($channel, $packet_type, ids_to_array($packet_recips, 'hash'));
- }
- else {
- $packet = zot_build_packet($channel, $packet_type, (($packet_recips) ? $packet_recips : null));
- }
- }
- if ($packet_type === 'keychange' && $hub['hubloc_network'] === 'zot') {
- $pmsg = get_pconfig($channel['channel_id'], 'system', 'keychange');
- $packet = zot_build_packet($channel, $packet_type, (($packet_recips) ? $packet_recips : null));
- }
- elseif ($packet_type === 'request' && $hub['hubloc_network'] === 'zot') {
- $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
- $packet = zot_build_packet($channel, $packet_type, $env, $hub['hubloc_sitekey'], $hub['site_crypto'],
- $hash, ['message_id' => $request_message_id]
- );
+ $env = (($hub_env && $hub_env[$hub['hubloc_site_id']]) ? $hub_env[$hub['hubloc_site_id']] : '');
+ if ((self::$private) && (!$env)) {
+ continue;
}
- if ($packet) {
- Queue::insert(
- [
- 'hash' => $hash,
- 'account_id' => $channel['channel_account_id'],
- 'channel_id' => $channel['channel_id'],
- 'posturl' => $hub['hubloc_callback'],
- 'driver' => $hub['hubloc_network'],
- 'notify' => $packet,
- 'msg' => (($pmsg) ? json_encode($pmsg) : '')
- ]
- );
- }
- else {
- $env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
+ $packet = Libzot::build_packet(self::$channel, self::$packet_type, $env, self::$encoded_item, self::$encoding, ((self::$private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto']);
- if ($hub['hubloc_network'] === 'zot6') {
- $zenv = [];
- if ($env) {
- foreach ($env as $e) {
- $zenv[] = $e['hash'];
- }
- }
-
- $packet_type = (($upstream || $uplink) ? 'response' : 'activity');
-
- // block zot private reshares from zot6, as this could cause a number of privacy issues
- // due to parenting differences between the reshare implementations. In zot a reshare is
- // a standalone parent activity and in zot6 it is a followup/child of the original activity.
- // For public reshares, some comments to the reshare on the zot fork will not make it to zot6
- // due to these different message models. This cannot be prevented at this time.
-
- if ($packet_type === 'activity' && $activity['type'] === 'Announce' && intval($target_item['item_private'])) {
- continue;
- }
-
- $packet = Libzot::build_packet($channel, $packet_type, $zenv, $activity, 'activitystreams', (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto']);
- }
- else {
- // currently zot6 delivery is only performed on normal items and not sync items or mail or anything else
- // Eventually we will do this for all deliveries, but for now ensure this is precisely what we are dealing
- // with before switching to zot6 as the primary zot6 handler checks for the existence of a message delivery report
- // to trigger dequeue'ing
-
- $z6 = (($encoded_item && $encoded_item['type'] === 'activity' && (!array_key_exists('allow_cid', $encoded_item))) ? true : false);
- if ($z6) {
- $packet = zot6_build_packet($channel, 'notify', $env, json_encode($encoded_item), (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'], $hash);
- }
- else {
- $packet = zot_build_packet($channel, 'notify', $env, (($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'], $hash);
-
- }
- }
-
-
- // remove this after most hubs have updated to version 5.0
- if (stripos($hub['site_project'], 'hubzilla') !== false && version_compare($hub['site_version'], '4.7.3', '<=')) {
- if ($encoded_item['type'] === 'mail') {
- $encoded_item['from']['network'] = 'zot';
- $encoded_item['from']['guid_sig'] = str_replace('sha256.', '', $encoded_item['from']['guid_sig']);
- }
- else {
- $encoded_item['owner']['network'] = 'zot';
- $encoded_item['owner']['guid_sig'] = str_replace('sha256.', '', $encoded_item['owner']['guid_sig']);
- if (strpos($encoded_item['author']['url'], z_root()) === 0) {
- $encoded_item['author']['network'] = 'zot';
- $encoded_item['author']['guid_sig'] = str_replace('sha256.', '', $encoded_item['author']['guid_sig']);
- }
- }
- }
+ Queue::insert(
+ [
+ 'hash' => $hash,
+ 'account_id' => self::$channel['channel_account_id'],
+ 'channel_id' => self::$channel['channel_id'],
+ 'posturl' => $hub['hubloc_callback'],
+ 'notify' => $packet,
+ 'msg' => EMPTY_STR
+ ]
+ );
- Queue::insert(
- [
- 'hash' => $hash,
- 'account_id' => $target_item['aid'],
- 'channel_id' => $target_item['uid'],
- 'posturl' => $hub['hubloc_callback'],
- 'driver' => $hub['hubloc_network'],
- 'notify' => $packet,
- 'msg' => json_encode($encoded_item)
- ]
+ // only create delivery reports for normal undeleted items
+ if (is_array($target_item) && (!$target_item['item_deleted']) && (!get_config('system', 'disable_dreport'))) {
+ q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan, dreport_queue )
+ values ( '%s', '%s','%s','%s','%s','%s','%s','%s' ) ",
+ dbesc($target_item['mid']),
+ dbesc($hub['hubloc_host']),
+ dbesc($hub['hubloc_host']),
+ dbesc($hub['hubloc_host']),
+ dbesc('queued'),
+ dbesc(datetime_convert()),
+ dbesc(self::$channel['channel_hash']),
+ dbesc($hash)
);
-
- // only create delivery reports for normal undeleted items
- if (is_array($target_item) && array_key_exists('postopts', $target_item) && (!$target_item['item_deleted']) && (!get_config('system', 'disable_dreport'))) {
- q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan, dreport_queue ) values ( '%s','%s','%s','%s','%s','%s','%s' ) ",
- dbesc($target_item['mid']),
- dbesc($hub['hubloc_host']),
- dbesc($hub['hubloc_host']),
- dbesc('queued'),
- dbesc(datetime_convert()),
- dbesc($channel['channel_hash']),
- dbesc($hash)
- );
- }
}
- $deliveries[] = $hash;
+ self::$deliveries[] = $hash;
+
}
if ($normal_mode) {
+ // This wastes a process if there are no delivery hooks configured, so check this before launching the new process
$x = q("select * from hook where hook = 'notifier_normal'");
if ($x) {
Master::Summon(['Deliver_hooks', $target_item['id']]);
}
}
- if ($deliveries)
- do_delivery($deliveries);
-
- logger('notifier: basic loop complete.', LOGGER_DEBUG);
+ if (self::$deliveries) {
+ do_delivery(self::$deliveries);
+ }
if ($dead) {
foreach ($dead as $deceased) {
@@ -854,8 +685,8 @@ class Notifier {
dbesc($deceased['hubloc_host']),
dbesc('undeliverable/unresponsive site'),
dbesc(datetime_convert()),
- dbesc($channel['channel_hash']),
- dbesc(random_string(48))
+ dbesc(self::$channel['channel_hash']),
+ dbesc(new_uuid())
);
}
}
@@ -864,6 +695,7 @@ class Notifier {
call_hooks('notifier_end', $target_item);
logger('notifer: complete.');
+
return;
}
diff --git a/Zotlabs/Daemon/Onedirsync.php b/Zotlabs/Daemon/Onedirsync.php
index f29fbe5b8..9ab8ebb54 100644
--- a/Zotlabs/Daemon/Onedirsync.php
+++ b/Zotlabs/Daemon/Onedirsync.php
@@ -5,10 +5,6 @@ namespace Zotlabs\Daemon;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\Libzotdir;
-require_once('include/zot.php');
-require_once('include/dir_fns.php');
-
-
class Onedirsync {
static public function run($argc, $argv) {
@@ -72,7 +68,7 @@ class Onedirsync {
// we might have to pull this out some day, but for now update_directory_entry()
// runs zot_finger() and is kind of zot specific
- if ($h && !in_array($h['hubloc_network'], ['zot6', 'zot']))
+ if ($h && $h['hubloc_network'] !== 'zot6')
return;
Libzotdir::update_directory_entry($r[0]);
diff --git a/Zotlabs/Daemon/Onepoll.php b/Zotlabs/Daemon/Onepoll.php
index d747e65f3..4aebf64b0 100644
--- a/Zotlabs/Daemon/Onepoll.php
+++ b/Zotlabs/Daemon/Onepoll.php
@@ -8,6 +8,7 @@ use Zotlabs\Lib\ASCollection;
use Zotlabs\Lib\Libzot;
require_once('include/socgraph.php');
+require_once('include/feedutils.php');
class Onepoll {
@@ -44,7 +45,7 @@ class Onepoll {
return;
}
- $contact = array_shift($contacts);
+ $contact = $contacts[0];
$importer_uid = $contact['abook_channel'];
$r = q("SELECT * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1",
@@ -75,16 +76,12 @@ class Onepoll {
return;
}
- if (!in_array($contact['xchan_network'], ['zot', 'zot6']))
+ if ($contact['xchan_network'] !== 'zot6')
return;
// update permissions
- if ($contact['xchan_network'] === 'zot6')
- $x = Libzot::refresh($contact, $importer);
-
- if ($contact['xchan_network'] === 'zot')
- $x = zot_refresh($contact, $importer);
+ $x = Libzot::refresh($contact, $importer);
$responded = false;
$updated = datetime_convert();
@@ -109,31 +106,30 @@ class Onepoll {
return;
$fetch_feed = true;
- $x = null;
// They haven't given us permission to see their stream
-
$can_view_stream = intval(get_abconfig($importer_uid, $contact['abook_xchan'], 'their_perms', 'view_stream'));
- if (!$can_view_stream)
+ if (!$can_view_stream) {
$fetch_feed = false;
+ }
// we haven't given them permission to send us their stream
-
$can_send_stream = intval(get_abconfig($importer_uid, $contact['abook_xchan'], 'my_perms', 'send_stream'));
- if (!$can_send_stream)
+ if (!$can_send_stream) {
$fetch_feed = false;
+ }
- if ($fetch_feed && $contact['xchan_network'] !== 'zot') {
+ if ($fetch_feed) {
$max = intval(get_config('system', 'max_imported_posts', 30));
if (intval($max)) {
$cl = get_xconfig($contact['abook_xchan'], 'activitypub', 'collections');
- if (is_array($cl) && $cl) {
- $url = ((array_key_exists('outbox', $cl)) ? $cl['outbox'] : '');
+ if (is_array($cl) && array_key_exists('outbox', $cl)) {
+ $url = $cl['outbox'];
}
else {
$url = str_replace('/poco/', '/zotfeed/', $contact['xchan_connurl']);
@@ -163,8 +159,10 @@ class Onepoll {
// update the poco details for this connection
$r = q("SELECT xlink_id from xlink where xlink_xchan = '%s' and xlink_updated > %s - INTERVAL %s and xlink_static = 0 limit 1",
intval($contact['xchan_hash']),
- db_utcnow(), db_quoteinterval('1 DAY')
+ db_utcnow(),
+ db_quoteinterval('1 DAY')
);
+
if (!$r) {
poco_load($contact['xchan_hash'], $contact['xchan_connurl']);
}
diff --git a/Zotlabs/Daemon/Poller.php b/Zotlabs/Daemon/Poller.php
index 762f1349c..88213a7c9 100644
--- a/Zotlabs/Daemon/Poller.php
+++ b/Zotlabs/Daemon/Poller.php
@@ -69,11 +69,11 @@ class Poller {
abook.abook_channel, abook.abook_id, abook.abook_archived, abook.abook_pending,
abook.abook_ignored, abook.abook_blocked,
xchan.xchan_network,
- account.account_lastlog, account.account_flags
- FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash
+ account.account_lastlog, account.account_flags
+ FROM abook LEFT JOIN xchan on abook_xchan = xchan_hash
LEFT JOIN account on abook_account = account_id
where abook_self = 0
- $sql_extra
+ $sql_extra
AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY $randfunc",
intval(ACCOUNT_OK),
intval(ACCOUNT_UNVERIFIED) // FIXME
@@ -102,8 +102,7 @@ class Poller {
continue;
}
-
- if (!in_array($contact['xchan_network'], ['zot', 'zot6']))
+ if ($contact['xchan_network'] !== 'zot6')
continue;
if ($c == $t) {
@@ -191,7 +190,7 @@ class Poller {
set_config('system', 'lastpoll', datetime_convert());
- //All done - clear the lockfile
+ //All done - clear the lockfile
@unlink($lockfile);
diff --git a/Zotlabs/Daemon/Queue.php b/Zotlabs/Daemon/Queue.php
index e1f4b73de..41aaf45ed 100644
--- a/Zotlabs/Daemon/Queue.php
+++ b/Zotlabs/Daemon/Queue.php
@@ -2,8 +2,7 @@
namespace Zotlabs\Daemon;
-require_once('include/queue_fn.php');
-require_once('include/zot.php');
+use Zotlabs\Lib\Queue as LibQueue;
class Queue {
@@ -48,17 +47,17 @@ class Queue {
else {
// For the first 12 hours we'll try to deliver every 15 minutes
- // After that, we'll only attempt delivery once per hour.
- // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl
+ // After that, we'll only attempt delivery once per hour.
+ // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl
// so that we don't start off a thousand deliveries for a couple of dead hubs.
// The zot driver will deliver everything destined for a single hub once contact is made (*if* contact is made).
// Other drivers will have to do something different here and may need their own query.
- // Note: this requires some tweaking as new posts to long dead hubs once a day will keep them in the
+ // Note: this requires some tweaking as new posts to long dead hubs once a day will keep them in the
// "every 15 minutes" category. We probably need to prioritise them when inserted into the queue
// or just prior to this query based on recent and long-term delivery history. If we have good reason to believe
- // the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once
- // or twice a day.
+ // the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once
+ // or twice a day.
$sqlrandfunc = db_getfunc('rand');
@@ -67,7 +66,7 @@ class Queue {
);
while ($r) {
foreach ($r as $rv) {
- queue_deliver($rv);
+ LibQueue::deliver($rv);
}
$r = q("SELECT *,$sqlrandfunc as rn FROM outq WHERE outq_delivered = 0 and outq_scheduled < %s order by rn limit 1",
db_utcnow()
@@ -78,7 +77,7 @@ class Queue {
return;
foreach ($r as $rv) {
- queue_deliver($rv);
+ LibQueue::deliver($rv);
}
}
}
diff --git a/Zotlabs/Daemon/Ratenotif.php b/Zotlabs/Daemon/Ratenotif.php
deleted file mode 100644
index 8afde2c4c..000000000
--- a/Zotlabs/Daemon/Ratenotif.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-
-namespace Zotlabs\Daemon;
-
-require_once('include/zot.php');
-require_once('include/queue_fn.php');
-
-
-class Ratenotif {
-
- static public function run($argc,$argv) {
-
-
- // Deprecated
- return;
-
-
- require_once("datetime.php");
- require_once('include/items.php');
-
- if($argc < 3)
- return;
-
-
- logger('ratenotif: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
-
- $cmd = $argv[1];
-
- $item_id = $argv[2];
-
-
- if($cmd === 'rating') {
- $r = q("select * from xlink where xlink_id = %d and xlink_static = 1 limit 1",
- intval($item_id)
- );
- if(! $r) {
- logger('rating not found');
- return;
- }
-
- $encoded_item = array(
- 'type' => 'rating',
- 'encoding' => 'zot',
- 'target' => $r[0]['xlink_link'],
- 'rating' => intval($r[0]['xlink_rating']),
- 'rating_text' => $r[0]['xlink_rating_text'],
- 'signature' => $r[0]['xlink_sig'],
- 'edited' => $r[0]['xlink_updated']
- );
- }
-
- $channel = channelx_by_hash($r[0]['xlink_xchan']);
- if(! $channel) {
- logger('no channel');
- return;
- }
-
-
- $primary = get_directory_primary();
-
- if(! $primary)
- return;
-
-
- $interval = ((get_config('system','delivery_interval') !== false)
- ? intval(get_config('system','delivery_interval')) : 2 );
-
- $deliveries_per_process = intval(get_config('system','delivery_batch_count'));
-
- if($deliveries_per_process <= 0)
- $deliveries_per_process = 1;
-
- $deliver = array();
-
- $x = z_fetch_url($primary . '/regdir');
- if($x['success']) {
- $j = json_decode($x['body'],true);
- if($j && $j['success'] && is_array($j['directories'])) {
-
- foreach($j['directories'] as $h) {
- if($h == z_root())
- continue;
-
- $hash = random_string();
- $n = zot_build_packet($channel,'notify',null,null,'',$hash);
-
- queue_insert(array(
- 'hash' => $hash,
- 'account_id' => $channel['channel_account_id'],
- 'channel_id' => $channel['channel_id'],
- 'posturl' => $h . '/post',
- 'notify' => $n,
- 'msg' => json_encode($encoded_item)
- ));
-
-
- $x = q("select count(outq_hash) as total from outq where outq_delivered = 0");
- if(intval($x[0]['total']) > intval(get_config('system','force_queue_threshold',300))) {
- logger('immediate delivery deferred.', LOGGER_DEBUG, LOG_INFO);
- update_queue_item($hash);
- continue;
- }
-
- $deliver[] = $hash;
-
- if(count($deliver) >= $deliveries_per_process) {
- Master::Summon(array('Deliver',$deliver));
- $deliver = array();
- if($interval)
- @time_sleep_until(microtime(true) + (float) $interval);
- }
- }
-
- // catch any stragglers
-
- if(count($deliver)) {
- Master::Summon(array('Deliver',$deliver));
- }
- }
- }
-
- logger('ratenotif: complete.');
- return;
-
- }
-}
diff --git a/Zotlabs/Daemon/Thumbnail.php b/Zotlabs/Daemon/Thumbnail.php
index 72034b870..3688e8ae5 100644
--- a/Zotlabs/Daemon/Thumbnail.php
+++ b/Zotlabs/Daemon/Thumbnail.php
@@ -45,7 +45,6 @@ class Thumbnail {
return;
}
-
$default_controller = null;
$files = glob('Zotlabs/Thumbs/*.php');
diff --git a/Zotlabs/Lib/Activity.php b/Zotlabs/Lib/Activity.php
index 6e8344def..41e394dbc 100644
--- a/Zotlabs/Lib/Activity.php
+++ b/Zotlabs/Lib/Activity.php
@@ -11,6 +11,7 @@ use Zotlabs\Web\HTTPSig;
require_once('include/event.php');
require_once('include/html2plain.php');
+require_once('include/items.php');
class Activity {
@@ -649,7 +650,7 @@ class Activity {
$atts = ((is_array($item['attach'])) ? $item['attach'] : json_decode($item['attach'], true));
if ($atts) {
foreach ($atts as $att) {
- if (strpos($att['type'], 'image')) {
+ if (isset($att['type']) && strpos($att['type'], 'image')) {
$ret[] = ['type' => 'Image', 'url' => $att['href']];
}
else {
@@ -3496,7 +3497,7 @@ class Activity {
static function find_best_identity($xchan) {
if (filter_var($xchan, FILTER_VALIDATE_URL)) {
- $r = q("select hubloc_hash, hubloc_network from hubloc where hubloc_id_url = '%s' and hubloc_network in ('zot6', 'zot') and hubloc_deleted = 0",
+ $r = q("select hubloc_hash, hubloc_network from hubloc where hubloc_id_url = '%s' and hubloc_network = 'zot6' and hubloc_deleted = 0",
dbesc($xchan)
);
if ($r) {
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index 5ef4ecc8d..bd51f0896 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -524,7 +524,7 @@ class Apps {
}
elseif(remote_channel()) {
$observer = \App::get_observer();
- if($observer && in_array($observer['xchan_network'], ['zot6', 'zot'])) {
+ if($observer && $observer['xchan_network'] === 'zot6') {
// some folks might have xchan_url redirected offsite, use the connurl
$x = parse_url($observer['xchan_connurl']);
if($x) {
diff --git a/Zotlabs/Lib/Connect.php b/Zotlabs/Lib/Connect.php
index 21bec171b..38fe69995 100644
--- a/Zotlabs/Lib/Connect.php
+++ b/Zotlabs/Lib/Connect.php
@@ -146,7 +146,7 @@ class Connect {
}
- $allowed = ((in_array($xchan['xchan_network'],['rss','zot','zot6'])) ? 1 : 0);
+ $allowed = ((in_array($xchan['xchan_network'],['rss', 'zot6'])) ? 1 : 0);
$hookdata = ['channel_id' => $uid, 'follow_address' => $url, 'xchan' => $xchan, 'allowed' => $allowed, 'singleton' => 0];
call_hooks('follow_allow',$hookdata);
diff --git a/Zotlabs/Lib/DReport.php b/Zotlabs/Lib/DReport.php
index 7515d3292..2263529b2 100644
--- a/Zotlabs/Lib/DReport.php
+++ b/Zotlabs/Lib/DReport.php
@@ -87,8 +87,7 @@ class DReport {
// Is the sender one of our channels?
- $c = q("select channel_id from channel where channel_hash = '%s' or channel_portable_id = '%s' limit 1",
- dbesc($dr['sender']),
+ $c = q("select channel_id from channel where channel_hash = '%s' limit 1",
dbesc($dr['sender'])
);
diff --git a/Zotlabs/Lib/Libsync.php b/Zotlabs/Lib/Libsync.php
index 5455aa2ea..67603a0e3 100644
--- a/Zotlabs/Lib/Libsync.php
+++ b/Zotlabs/Lib/Libsync.php
@@ -255,9 +255,6 @@ class Libsync {
if (array_key_exists('chatroom', $arr) && $arr['chatroom'])
sync_chatrooms($channel, $arr['chatroom']);
- if (array_key_exists('conv', $arr) && $arr['conv'])
- import_conv($channel, $arr['conv']);
-
if (array_key_exists('mail', $arr) && $arr['mail'])
sync_mail($channel, $arr['mail']);
diff --git a/Zotlabs/Lib/Libzot.php b/Zotlabs/Lib/Libzot.php
index c7d001d21..b04c0ea3c 100644
--- a/Zotlabs/Lib/Libzot.php
+++ b/Zotlabs/Lib/Libzot.php
@@ -1377,8 +1377,6 @@ class Libzot {
$check_mentions = true;
}
}
- elseif ($msg['type'] === 'mail')
- $perm = 'post_mail';
$r = [];
@@ -2210,90 +2208,6 @@ class Libzot {
return $post_id;
}
- static function process_mail_delivery($sender, $arr, $deliveries) {
-
- $result = [];
-
- if ($sender != $arr['from_xchan']) {
- logger('process_mail_delivery: sender is not mail author');
- return;
- }
-
- foreach ($deliveries as $d) {
-
- $DR = new DReport(z_root(), $sender, $d, $arr['mid']);
-
- $r = q("select * from channel where channel_hash = '%s' limit 1",
- dbesc($d['hash'])
- );
-
- if (!$r) {
- $DR->update('recipient not found');
- $result[] = $DR->get();
- continue;
- }
-
- $channel = $r[0];
- $DR->set_name($channel['channel_name'] . ' <' . channel_reddress($channel) . '>');
-
-
- if (!perm_is_allowed($channel['channel_id'], $sender, 'post_mail')) {
-
- /*
- * Always allow somebody to reply if you initiated the conversation. It's anti-social
- * and a bit rude to send a private message to somebody and block their ability to respond.
- * If you are being harrassed and want to put an end to it, delete the conversation.
- */
-
- $return = false;
- if ($arr['parent_mid']) {
- $return = q("select * from mail where mid = '%s' and channel_id = %d limit 1",
- dbesc($arr['parent_mid']),
- intval($channel['channel_id'])
- );
- }
- if (!$return) {
- logger("permission denied for mail delivery {$channel['channel_id']}");
- $DR->update('permission denied');
- $result[] = $DR->get();
- continue;
- }
- }
-
-
- $r = q("select id from mail where mid = '%s' and channel_id = %d limit 1",
- dbesc($arr['mid']),
- intval($channel['channel_id'])
- );
- if ($r) {
- if (intval($arr['mail_recalled'])) {
- $x = q("delete from mail where id = %d and channel_id = %d",
- intval($r[0]['id']),
- intval($channel['channel_id'])
- );
- $DR->update('mail recalled');
- $result[] = $DR->get();
- logger('mail_recalled');
- }
- else {
- $DR->update('duplicate mail received');
- $result[] = $DR->get();
- logger('duplicate mail received');
- }
- continue;
- }
- else {
- $arr['account_id'] = $channel['channel_account_id'];
- $arr['channel_id'] = $channel['channel_id'];
- $item_id = mail_store($arr);
- $DR->update('mail delivered');
- $result[] = $DR->get();
- }
- }
-
- return $result;
- }
-
/**
* @brief Processes delivery of profile.
@@ -2664,9 +2578,9 @@ class Libzot {
// we may only end up with one; which results in posts with no author name or photo and are a bit
// of a hassle to repair. If either or both are missing, do a full discovery probe.
- //if (!array_key_exists('id', $x)) {
- //return import_author_activitypub($x);
- //}
+ if(!isset($x['id']) && !isset($x['key']) && !isset($x['id_sig'])) {
+ return false;
+ }
$hash = self::make_xchan_hash($x['id'], $x['key']);
@@ -2927,7 +2841,7 @@ class Libzot {
$hookinfo = [
'channel_id' => $id,
- 'protocols' => ['zot6', 'zot']
+ 'protocols' => ['zot6']
];
/**
* @hooks channel_protocols
@@ -3231,11 +3145,6 @@ class Libzot {
return $v;
}
}
- foreach ($arr as $v) {
- if ($v[$check] === 'zot') {
- return $v;
- }
- }
return $arr[0];
diff --git a/Zotlabs/Lib/Libzotdir.php b/Zotlabs/Lib/Libzotdir.php
index 41c0a54e9..e095502dd 100644
--- a/Zotlabs/Lib/Libzotdir.php
+++ b/Zotlabs/Lib/Libzotdir.php
@@ -345,7 +345,7 @@ class Libzotdir {
logger('local_dir_update: uid: ' . $uid, LOGGER_DEBUG);
- $p = q("select channel.channel_hash, channel_address, channel_timezone, channel_portable_id, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
+ $p = q("select channel.channel_hash, channel_address, channel_timezone, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
intval($uid)
);
@@ -354,7 +354,6 @@ class Libzotdir {
if ($p) {
$hash = $p[0]['channel_hash'];
- $legacy_hash = $p[0]['channel_portable_id'];
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
@@ -393,10 +392,9 @@ class Libzotdir {
);
if(intval($r[0]['xchan_hidden']) != $hidden) {
- $r = q("update xchan set xchan_hidden = %d where xchan_hash in ('%s', '%s')",
+ $r = q("update xchan set xchan_hidden = %d where xchan_hash = '%s'",
intval($hidden),
- dbesc($hash),
- dbesc($legacy_hash)
+ dbesc($hash)
);
}
@@ -410,13 +408,11 @@ class Libzotdir {
}
else {
// they may have made it private
- q("delete from xprof where xprof_hash in ('%s', '%s')",
- dbesc($hash),
- dbesc($legacy_hash)
+ q("delete from xprof where xprof_hash = '%s'",
+ dbesc($hash)
);
- q("delete from xtag where xtag_hash in ('%s', '%s')",
- dbesc($hash),
- dbesc($legacy_hash)
+ q("delete from xtag where xtag_hash = '%s'",
+ dbesc($hash)
);
}
diff --git a/Zotlabs/Lib/MessageFilter.php b/Zotlabs/Lib/MessageFilter.php
index 750d6d424..21e6ca26a 100644
--- a/Zotlabs/Lib/MessageFilter.php
+++ b/Zotlabs/Lib/MessageFilter.php
@@ -11,8 +11,6 @@ class MessageFilter {
require_once('include/html2plain.php');
- unobscure($item);
-
$text = prepare_text($item['body'],$item['mimetype']);
$text = html2plain(($item['title']) ? $item['title'] . ' ' . $text : $text);
diff --git a/Zotlabs/Lib/Queue.php b/Zotlabs/Lib/Queue.php
index 373a7d304..35eb1e264 100644
--- a/Zotlabs/Lib/Queue.php
+++ b/Zotlabs/Lib/Queue.php
@@ -2,6 +2,9 @@
namespace Zotlabs\Lib;
+use Zotlabs\Zot6\Receiver;
+use Zotlabs\Zot6\Zot6Handler;
+
class Queue {
static function update($id, $add_priority = 0) {
@@ -28,19 +31,19 @@ class Queue {
$might_be_down = ((datetime_convert('UTC','UTC',$y[0]['earliest']) < datetime_convert('UTC','UTC','now - 2 days')) ? true : false);
- // Set all other records for this destination way into the future.
+ // Set all other records for this destination way into the future.
// The queue delivers by destination. We'll keep one queue item for
// this destination (this one) with a shorter delivery. If we succeed
// once, we'll try to deliver everything for that destination.
- // The delivery will be set to at most once per hour, and if the
+ // The delivery will be set to at most once per hour, and if the
// queue item is less than 12 hours old, we'll schedule for fifteen
- // minutes.
+ // minutes.
q("UPDATE outq SET outq_scheduled = '%s' WHERE outq_posturl = '%s'",
dbesc(datetime_convert('UTC','UTC','now + 5 days')),
dbesc($x[0]['outq_posturl'])
);
-
+
$since = datetime_convert('UTC','UTC',$x[0]['outq_created']);
if(($might_be_down) || ($since < datetime_convert('UTC','UTC','now - 12 hour'))) {
@@ -50,9 +53,9 @@ class Queue {
$next = datetime_convert('UTC','UTC','now + ' . intval($add_priority) . ' minutes');
}
- q("UPDATE outq SET outq_updated = '%s',
- outq_priority = outq_priority + %d,
- outq_scheduled = '%s'
+ q("UPDATE outq SET outq_updated = '%s',
+ outq_priority = outq_priority + %d,
+ outq_scheduled = '%s'
WHERE outq_hash = '%s'",
dbesc(datetime_convert()),
@@ -66,7 +69,7 @@ class Queue {
static function remove($id,$channel_id = 0) {
logger('queue: remove queue item ' . $id,LOGGER_DEBUG);
$sql_extra = (($channel_id) ? " and outq_channel = " . intval($channel_id) . " " : '');
-
+
q("DELETE FROM outq WHERE outq_hash = '%s' $sql_extra",
dbesc($id)
);
@@ -75,7 +78,7 @@ class Queue {
static function remove_by_posturl($posturl) {
logger('queue: remove queue posturl ' . $posturl,LOGGER_DEBUG);
-
+
q("DELETE FROM outq WHERE outq_posturl = '%s' ",
dbesc($posturl)
);
@@ -88,7 +91,7 @@ class Queue {
$sql_extra = (($channel['channel_id']) ? " and outq_channel = " . intval($channel['channel_id']) . " " : '');
// Set the next scheduled run date so far in the future that it will be expired
- // long before it ever makes it back into the delivery chain.
+ // long before it ever makes it back into the delivery chain.
q("update outq set outq_delivered = 1, outq_updated = '%s', outq_scheduled = '%s' where outq_hash = '%s' $sql_extra ",
dbesc(datetime_convert()),
@@ -108,7 +111,7 @@ class Queue {
}
$x = q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_priority,
- outq_created, outq_updated, outq_scheduled, outq_notify, outq_msg )
+ outq_created, outq_updated, outq_scheduled, outq_notify, outq_msg )
values ( '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s' )",
dbesc($arr['hash']),
intval($arr['account_id']),
@@ -133,7 +136,7 @@ class Queue {
$base = null;
$h = parse_url($outq['outq_posturl']);
- if($h !== false)
+ if($h !== false)
$base = $h['scheme'] . '://' . $h['host'] . (isset($h['port']) ? ':' . $h['port'] : '');
if(($base) && ($base !== z_root()) && ($immediate)) {
@@ -147,7 +150,7 @@ class Queue {
return;
}
if($y[0]['site_update'] < datetime_convert('UTC','UTC','now - 1 month')) {
- self::update($outq['outq_hash'],10);
+ self::update($outq['outq_hash'], 10);
logger('immediate delivery deferred for site ' . $base);
return;
}
@@ -158,12 +161,12 @@ class Queue {
// your site has existed. Since we don't know for sure what these sites are,
// call them unknown
- site_store_lowlevel(
+ site_store_lowlevel(
[
'site_url' => $base,
'site_update' => datetime_convert(),
'site_dead' => 0,
- 'site_type' => intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
+ 'site_type' => SITE_TYPE_UNKNOWN,
'site_crypto' => ''
]
);
@@ -171,65 +174,17 @@ class Queue {
}
$arr = array('outq' => $outq, 'base' => $base, 'handled' => false, 'immediate' => $immediate);
- call_hooks('queue_deliver',$arr);
+ call_hooks('queue_deliver', $arr);
if($arr['handled'])
return;
- // "post" queue driver - used for diaspora and friendica-over-diaspora communications.
-
- if($outq['outq_driver'] === 'post') {
- $result = z_post_url($outq['outq_posturl'],$outq['outq_msg']);
- if($result['success'] && $result['return_code'] < 300) {
- logger('deliver: queue post success to ' . $outq['outq_posturl'], LOGGER_DEBUG);
- if($base) {
- q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ",
- dbesc(datetime_convert()),
- dbesc($base)
- );
- }
- q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s'",
- dbesc('accepted for delivery'),
- dbesc(datetime_convert()),
- dbesc($outq['outq_hash'])
- );
- self::remove($outq['outq_hash']);
-
- // server is responding - see if anything else is going to this destination and is piled up
- // and try to send some more. We're relying on the fact that do_delivery() results in an
- // immediate delivery otherwise we could get into a queue loop.
-
- if(! $immediate) {
- $x = q("select outq_hash from outq where outq_posturl = '%s' and outq_delivered = 0",
- dbesc($outq['outq_posturl'])
- );
-
- $piled_up = array();
- if($x) {
- foreach($x as $xx) {
- $piled_up[] = $xx['outq_hash'];
- }
- }
- if($piled_up) {
- // call do_delivery() with the force flag
- do_delivery($piled_up, true);
- }
- }
- }
- else {
- logger('deliver: queue post returned ' . $result['return_code']
- . ' from ' . $outq['outq_posturl'],LOGGER_DEBUG);
- self::update($outq['outq_hash'],10);
- }
- return;
- }
-
// normal zot delivery
logger('deliver: dest: ' . $outq['outq_posturl'], LOGGER_DEBUG);
if($outq['outq_posturl'] === z_root() . '/zot') {
// local delivery
- $zot = new \Zotlabs\Zot6\Receiver(new \Zotlabs\Zot6\Zot6Handler(),$outq['outq_notify']);
+ $zot = new Receiver(new Zot6Handler(), $outq['outq_notify']);
$result = $zot->run();
logger('returned_json: ' . json_encode($result,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES), LOGGER_DATA);
logger('deliver: local zot delivery succeeded to ' . $outq['outq_posturl']);
@@ -246,7 +201,8 @@ class Queue {
$host_crypto = null;
if($channel && $base) {
- $h = q("select hubloc_sitekey, site_crypto from hubloc left join site on hubloc_url = site_url where site_url = '%s' and hubloc_sitekey != '' order by hubloc_id desc limit 1",
+ $h = q("SELECT hubloc_sitekey, site_crypto FROM hubloc LEFT JOIN site ON hubloc_url = site_url
+ WHERE site_url = '%s' AND hubloc_network = 'zot6' ORDER BY hubloc_id DESC LIMIT 1",
dbesc($base)
);
if($h) {
@@ -256,7 +212,7 @@ class Queue {
$msg = $outq['outq_notify'];
- $result = Libzot::zot($outq['outq_posturl'],$msg,$channel,$host_crypto);
+ $result = Libzot::zot($outq['outq_posturl'], $msg, $channel, $host_crypto);
if($result['success']) {
logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']);
@@ -265,7 +221,7 @@ class Queue {
else {
logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']);
logger('deliver: remote zot delivery fail data: ' . print_r($result,true), LOGGER_DATA);
- self::update($outq['outq_hash'],10);
+ self::update($outq['outq_hash'], 10);
}
}
return;
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index fb95b0504..862a97bdc 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -438,7 +438,6 @@ class Acl extends \Zotlabs\Web\Controller {
}
if(! $url) {
- require_once("include/dir_fns.php");
$directory = Libzotdir::find_upstream_directory($dirmode);
$url = $directory['url'] . '/dirsearch';
}
diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php
index 44c10b339..59a9e22b2 100644
--- a/Zotlabs/Module/Admin.php
+++ b/Zotlabs/Module/Admin.php
@@ -8,7 +8,6 @@
namespace Zotlabs\Module;
-require_once('include/queue_fn.php');
require_once('include/account.php');
/**
diff --git a/Zotlabs/Module/Admin/Queue.php b/Zotlabs/Module/Admin/Queue.php
index 5a47413ee..baa50591f 100644
--- a/Zotlabs/Module/Admin/Queue.php
+++ b/Zotlabs/Module/Admin/Queue.php
@@ -2,35 +2,35 @@
namespace Zotlabs\Module\Admin;
-
+use Zotlabs\Lib\Queue as LibQueue;
class Queue {
-
+
function get() {
$o = '';
-
+
$expert = ((array_key_exists('expert',$_REQUEST)) ? intval($_REQUEST['expert']) : 0);
-
+
if($_REQUEST['drophub']) {
hubloc_mark_as_down($_REQUEST['drophub']);
- remove_queue_by_posturl($_REQUEST['drophub']);
+ LibQueue::remove_by_posturl($_REQUEST['drophub']);
}
-
+
if($_REQUEST['emptyhub']) {
- remove_queue_by_posturl($_REQUEST['emptyhub']);
+ LibQueue::remove_by_posturl($_REQUEST['emptyhub']);
}
-
- $r = q("select count(outq_posturl) as total, max(outq_priority) as priority, outq_posturl from outq
+
+ $r = q("select count(outq_posturl) as total, max(outq_priority) as priority, outq_posturl from outq
where outq_delivered = 0 group by outq_posturl order by total desc");
-
+
for($x = 0; $x < count($r); $x ++) {
$r[$x]['eurl'] = urlencode($r[$x]['outq_posturl']);
$r[$x]['connected'] = datetime_convert('UTC',date_default_timezone_get(),$r[$x]['connected'],'Y-m-d');
}
-
+
$o = replace_macros(get_markup_template('admin_queue.tpl'), array(
'$banner' => t('Queue Statistics'),
'$numentries' => t('Total Entries'),
@@ -43,11 +43,11 @@ class Queue {
'$entries' => $r,
'$expert' => $expert
));
-
+
return $o;
}
-
-} \ No newline at end of file
+
+}
diff --git a/Zotlabs/Module/Authtest.php b/Zotlabs/Module/Authtest.php
index 239ae3bdb..d85af09dc 100644
--- a/Zotlabs/Module/Authtest.php
+++ b/Zotlabs/Module/Authtest.php
@@ -1,41 +1,38 @@
<?php
namespace Zotlabs\Module;
-require_once('include/zot.php');
-
-
class Authtest extends \Zotlabs\Web\Controller {
function get() {
-
-
+
+
$auth_success = false;
$o .= '<h3>Magic-Auth Diagnostic</h3>';
-
+
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return $o;
}
-
+
$o .= '<form action="authtest" method="get">';
$o .= 'Target URL: <input type="text" style="width: 250px;" name="dest" value="' . $_GET['dest'] .'" />';
- $o .= '<input type="submit" name="submit" value="Submit" /></form>';
-
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
$o .= '<br /><br />';
-
+
if(x($_GET,'dest')) {
if(strpos($_GET['dest'],'@')) {
$_GET['dest'] = $_REQUEST['dest'] = 'https://' . substr($_GET['dest'],strpos($_GET['dest'],'@')+1) . '/channel/' . substr($_GET['dest'],0,strpos($_GET['dest'],'@'));
}
-
+
$_REQUEST['test'] = 1;
$mod = new Magic();
$x = $mod->init($a);
$o .= 'Local Setup returns: ' . print_r($x,true);
-
-
-
+
+
+
if($x['url']) {
$z = z_fetch_url($x['url'] . '&test=1');
if($z['success']) {
@@ -50,12 +47,12 @@ class Authtest extends \Zotlabs\Web\Controller {
$o .= 'fetch url failure.' . print_r($z,true);
}
}
-
+
if(! $auth_success)
$o .= 'Authentication Failed!' . EOL;
}
-
+
return str_replace("\n",'<br />',$o);
}
-
+
}
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 44211c8b9..8910adfa8 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -220,9 +220,6 @@ class Connedit extends Controller {
if($z)
$record = $z[0]['xlink_id'];
}
- if($record) {
- Master::Summon(array('Ratenotif','rating',$record));
- }
}
if(($_REQUEST['pending']) && intval($orig_record[0]['abook_pending'])) {
@@ -478,16 +475,11 @@ class Connedit extends Controller {
}
if($cmd === 'refresh') {
- if($orig_record[0]['xchan_network'] === 'zot') {
- if(! zot_refresh($orig_record[0],App::get_channel()))
- notice( t('Refresh failed - channel is currently unavailable.') );
- }
- elseif($orig_record[0]['xchan_network'] === 'zot6') {
+ if($orig_record[0]['xchan_network'] === 'zot6') {
if(! Libzot::refresh($orig_record[0],App::get_channel()))
notice( t('Refresh failed - channel is currently unavailable.') );
}
else {
-
// if you are on a different network we'll force a refresh of the connection basic info
Master::Summon(array('Notifier','permission_update',$contact_id));
}
@@ -667,7 +659,7 @@ class Connedit extends Controller {
);
- if(in_array($contact['xchan_network'], ['zot6', 'zot'])) {
+ if($contact['xchan_network'] === 'zot6') {
$tools['fetchvc'] = [
'label' => t('Fetch Vcard'),
'url' => z_root() . '/connedit/' . $contact['abook_id'] . '/fetchvc',
@@ -841,7 +833,7 @@ class Connedit extends Controller {
$locstr = unpunify($contact['xchan_url']);
$clone_warn = '';
- $clonable = (in_array($contact['xchan_network'],['zot', 'zot6', 'rss']) ? true : false);
+ $clonable = in_array($contact['xchan_network'], ['zot6', 'rss']);
if(! $clonable) {
$clone_warn = '<strong>';
$clone_warn .= ((intval($contact['abook_not_here']))
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
index e1555fc2d..b39887c9e 100644
--- a/Zotlabs/Module/Directory.php
+++ b/Zotlabs/Module/Directory.php
@@ -8,7 +8,6 @@ use Zotlabs\Lib\Libzotdir;
require_once('include/socgraph.php');
-require_once('include/dir_fns.php');
require_once('include/bbcode.php');
require_once('include/html2plain.php');
diff --git a/Zotlabs/Module/Dirsearch.php b/Zotlabs/Module/Dirsearch.php
index 804d7af5c..3cccaca37 100644
--- a/Zotlabs/Module/Dirsearch.php
+++ b/Zotlabs/Module/Dirsearch.php
@@ -4,26 +4,22 @@ namespace Zotlabs\Module;
use App;
use Zotlabs\Web\Controller;
-require_once('include/dir_fns.php');
-
-
-
class Dirsearch extends Controller {
function init() {
App::set_pager_itemspage(30);
-
+
}
-
+
function get() {
-
+
$ret = array('success' => false);
-
+
// logger('request: ' . print_r($_REQUEST,true));
-
-
+
+
$dirmode = intval(get_config('system','directory_mode'));
-
+
if($dirmode == DIRECTORY_MODE_NORMAL) {
$ret['message'] = t('This site is not a directory server');
json_return_and_die($ret);
@@ -31,24 +27,24 @@ class Dirsearch extends Controller {
$access_token = $_REQUEST['t'];
-
+
$token = get_config('system','realm_token');
if($token && $access_token != $token) {
$ret['message'] = t('This directory server requires an access token');
json_return_and_die($ret);
}
-
-
+
+
if(argc() > 1 && argv(1) === 'sites') {
$ret = $this->list_public_sites();
json_return_and_die($ret);
}
-
+
$sql_extra = '';
-
-
+
+
$tables = array('name','address','locale','region','postcode','country','gender','marital','sexual','keywords');
-
+
if($_REQUEST['query']) {
$advanced = $this->dir_parse_query($_REQUEST['query']);
if($advanced) {
@@ -64,9 +60,9 @@ class Dirsearch extends Controller {
}
}
}
-
+
$hash = ((x($_REQUEST['hash'])) ? $_REQUEST['hash'] : '');
-
+
$name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
$hub = ((x($_REQUEST,'hub')) ? $_REQUEST['hub'] : '');
$address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
@@ -82,16 +78,16 @@ class Dirsearch extends Controller {
$agele = ((x($_REQUEST,'agele')) ? intval($_REQUEST['agele']) : 0 );
$kw = ((x($_REQUEST,'kw')) ? intval($_REQUEST['kw']) : 0 );
$forums = ((array_key_exists('pubforums',$_REQUEST)) ? intval($_REQUEST['pubforums']) : 0);
-
+
if(get_config('system','disable_directory_keywords'))
$kw = 0;
-
-
+
+
// by default use a safe search
$safe = ((x($_REQUEST,'safe'))); // ? intval($_REQUEST['safe']) : 1 );
if ($safe === false)
$safe = 1;
-
+
if(array_key_exists('sync',$_REQUEST)) {
if($_REQUEST['sync'])
$sync = datetime_convert('UTC','UTC',$_REQUEST['sync']);
@@ -100,7 +96,7 @@ class Dirsearch extends Controller {
}
else
$sync = false;
-
+
if(($dirmode == DIRECTORY_MODE_STANDALONE) && (! $hub)) {
$hub = \App::get_hostname();
}
@@ -109,13 +105,13 @@ class Dirsearch extends Controller {
$hub_query = " and xchan_hash in (select hubloc_hash from hubloc where hubloc_host = '" . protect_sprintf(dbesc($hub)) . "') ";
else
$hub_query = '';
-
+
$sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
-
+
$joiner = ' OR ';
if($_REQUEST['and'])
$joiner = ' AND ';
-
+
if($name)
$sql_extra .= $this->dir_query_build($joiner,'xchan_name',$name);
if($address)
@@ -136,58 +132,58 @@ class Dirsearch extends Controller {
$sql_extra .= $this->dir_query_build($joiner,'xprof_sexual',$sexual);
if($keywords)
$sql_extra .= $this->dir_query_build($joiner,'xprof_keywords',$keywords);
-
-
- // we only support an age range currently. You must set both agege
- // (greater than or equal) and agele (less than or equal)
-
+
+
+ // we only support an age range currently. You must set both agege
+ // (greater than or equal) and agele (less than or equal)
+
if($agele && $agege) {
$sql_extra .= " $joiner ( xprof_age <= " . intval($agele) . " ";
$sql_extra .= " AND xprof_age >= " . intval($agege) . ") ";
}
-
-
+
+
if($hash) {
$sql_extra = " AND xchan_hash like '" . dbesc($hash) . protect_sprintf('%') . "' ";
}
-
-
+
+
$perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 60);
$page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
$startrec = (($page+1) * $perpage) - $perpage;
$limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
$return_total = ((x($_REQUEST,'return_total')) ? intval($_REQUEST['return_total']) : 0);
-
+
// mtime is not currently working
-
+
$mtime = ((x($_REQUEST,'mtime')) ? datetime_convert('UTC','UTC',$_REQUEST['mtime']) : '');
-
- // ok a separate tag table won't work.
+
+ // ok a separate tag table won't work.
// merge them into xprof
-
+
$ret['success'] = true;
-
+
// If &limit=n, return at most n entries
// If &return_total=1, we count matching entries and return that as 'total_items' for use in pagination.
// By default we return one page (default 80 items maximum) and do not count total entries
-
+
$logic = ((strlen($sql_extra)) ? 'false' : 'true');
-
+
if($hash)
$logic = 'true';
-
+
if($dirmode == DIRECTORY_MODE_STANDALONE) {
$sql_extra .= " and xchan_addr like '%%" . \App::get_hostname() . "' ";
}
-
+
$safesql = (($safe > 0) ? " and xchan_censored = 0 and xchan_selfcensored = 0 " : '');
if($safe < 0)
$safesql = " and ( xchan_censored = 1 OR xchan_selfcensored = 1 ) ";
-
+
if($forums)
$safesql .= " and xchan_pubforum = " . ((intval($forums)) ? '1 ' : '0 ');
-
- if($limit)
+
+ if($limit)
$qlimit = " LIMIT $limit ";
else {
$qlimit = " LIMIT " . intval($perpage) . " OFFSET " . intval($startrec);
@@ -198,24 +194,24 @@ class Dirsearch extends Controller {
}
}
}
-
+
if($sort_order == 'normal') {
$order = " order by xchan_name asc ";
-
- // Start the alphabetic search at 'A'
+
+ // Start the alphabetic search at 'A'
// This will make a handful of channels whose names begin with
// punctuation un-searchable in this mode
-
+
$safesql .= " and ascii(substring(xchan_name FROM 1 FOR 1)) > 64 ";
}
elseif($sort_order == 'reverse')
$order = " order by xchan_name desc ";
elseif($sort_order == 'reversedate')
$order = " order by xchan_name_date asc ";
- else
+ else
$order = " order by xchan_name_date desc ";
-
-
+
+
if($sync) {
$spkt = array('transactions' => array());
$r = q("select * from updates where ud_date >= '%s' and ud_guid != '' order by ud_date desc",
@@ -228,7 +224,7 @@ class Dirsearch extends Controller {
$flags[] = 'deleted';
if($rr['ud_flags'] & UPDATE_FLAGS_FORCED)
$flags[] = 'forced';
-
+
$spkt['transactions'][] = array(
'hash' => $rr['ud_hash'],
'address' => $rr['ud_addr'],
@@ -245,7 +241,7 @@ class Dirsearch extends Controller {
$spkt['ratings'] = array();
foreach($r as $rr) {
$spkt['ratings'][] = array(
- 'type' => 'rating',
+ 'type' => 'rating',
'encoding' => 'zot',
'channel' => $rr['xlink_xchan'],
'target' => $rr['xlink_link'],
@@ -259,37 +255,37 @@ class Dirsearch extends Controller {
json_return_and_die($spkt);
}
else {
-
- $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash
- where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot6' and xchan_system = 0 and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0
+
+ $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash
+ where ( $logic $sql_extra ) $hub_query and xchan_network = 'zot6' and xchan_system = 0 and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0
$safesql $order $qlimit "
);
-
-
-
+
+
+
$ret['page'] = $page + 1;
- $ret['records'] = count($r);
+ $ret['records'] = count($r);
}
-
-
-
+
+
+
if($r) {
-
+
$entries = array();
-
+
foreach($r as $rr) {
-
+
$entry = array();
-
+
$pc = q("select count(xlink_rating) as total_ratings from xlink where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1 group by xlink_rating",
dbesc($rr['xchan_hash'])
);
-
+
if($pc)
$entry['total_ratings'] = intval($pc[0]['total_ratings']);
else
$entry['total_ratings'] = 0;
-
+
$entry['name'] = $rr['xchan_name'];
$entry['hash'] = $rr['xchan_hash'];
$entry['censored'] = $rr['xchan_censored'];
@@ -313,11 +309,11 @@ class Dirsearch extends Controller {
$entry['homepage'] = $rr['xprof_homepage'];
$entry['hometown'] = $rr['xprof_hometown'];
$entry['keywords'] = $rr['xprof_keywords'];
-
+
$entries[] = $entry;
-
+
}
-
+
$ret['results'] = $entries;
if($kw) {
$k = dir_tagadelic($kw, $hub);
@@ -328,30 +324,30 @@ class Dirsearch extends Controller {
}
}
}
- }
-
+ }
+
json_return_and_die($ret);
}
-
+
function dir_query_build($joiner,$field,$s) {
$ret = '';
if(trim($s))
$ret .= dbesc($joiner) . " " . dbesc($field) . " like '" . protect_sprintf( '%' . dbesc($s) . '%' ) . "' ";
return $ret;
}
-
+
function dir_flag_build($joiner,$field,$bit,$s) {
return dbesc($joiner) . " ( " . dbesc($field) . " & " . intval($bit) . " ) " . ((intval($s)) ? '>' : '=' ) . " 0 ";
}
-
-
+
+
function dir_parse_query($s) {
-
+
$ret = array();
$curr = array();
$all = explode(' ',$s);
$quoted_string = false;
-
+
if($all) {
foreach($all as $q) {
if($quoted_string === false) {
@@ -382,7 +378,7 @@ class Dirsearch extends Controller {
$ret[] = $curr;
$curr = array();
continue;
- }
+ }
else {
$ret[] = $curr;
$curr = array();
@@ -405,15 +401,15 @@ class Dirsearch extends Controller {
logger('dir_parse_query:' . print_r($ret,true),LOGGER_DATA);
return $ret;
}
-
-
-
-
-
-
-
+
+
+
+
+
+
+
function list_public_sites() {
-
+
$rand = db_getfunc('rand');
$realm = get_directory_realm();
if($realm == DIRECTORY_REALM) {
@@ -428,16 +424,16 @@ class Dirsearch extends Controller {
intval(SITE_TYPE_ZOT)
);
}
-
+
$ret = array('success' => false);
-
+
if($r) {
$ret['success'] = true;
$ret['sites'] = array();
$insecure = array();
-
+
foreach($r as $rr) {
-
+
if($rr['site_access'] == ACCESS_FREE)
$access = 'free';
elseif($rr['site_access'] == ACCESS_PAID)
@@ -446,14 +442,14 @@ class Dirsearch extends Controller {
$access = 'tiered';
else
$access = 'private';
-
+
if($rr['site_register'] == REGISTER_OPEN)
$register = 'open';
elseif($rr['site_register'] == REGISTER_APPROVE)
$register = 'approve';
else
$register = 'closed';
-
+
if(strpos($rr['site_url'],'https://') !== false)
$ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location'], 'project' => $rr['site_project'], 'version' => $rr['site_version']);
else
diff --git a/Zotlabs/Module/Dreport.php b/Zotlabs/Module/Dreport.php
index 0fc36dc29..50d1647c8 100644
--- a/Zotlabs/Module/Dreport.php
+++ b/Zotlabs/Module/Dreport.php
@@ -5,16 +5,16 @@ namespace Zotlabs\Module;
class Dreport extends \Zotlabs\Web\Controller {
function get() {
-
+
if(! local_channel()) {
notice( t('Permission denied') . EOL);
return;
}
-
+
$table = 'item';
-
+
$channel = \App::get_channel();
-
+
$mid = ((argc() > 1) ? argv(1) : '');
$encoded_mid = '';
@@ -31,7 +31,7 @@ class Dreport extends \Zotlabs\Web\Controller {
$mid = @base64url_decode(substr($mid,4));
}
- if($mid) {
+ if($mid) {
$i = q("select id from item where mid = '%s' and uid = %d and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
dbesc($mid),
intval($channel['channel_id']),
@@ -53,13 +53,13 @@ class Dreport extends \Zotlabs\Web\Controller {
$mid = @base64url_decode(substr($mid,4));
}
-
-
+
+
if(! $mid) {
notice( t('Invalid message') . EOL);
return;
}
-
+
switch($table) {
case 'item':
$i = q("select id from item where mid = '%s' and ( author_xchan = '%s' or ( owner_xchan = '%s' and item_wall = 1 )) ",
@@ -77,30 +77,29 @@ class Dreport extends \Zotlabs\Web\Controller {
default:
break;
}
-
+
if(! $i) {
notice( t('Permission denied') . EOL);
return;
}
-
- $r = q("select * from dreport where (dreport_xchan = '%s' or dreport_xchan = '%s') and dreport_mid = '%s'",
+
+ $r = q("select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s'",
dbesc($channel['channel_hash']),
- dbesc($channel['channel_portable_id']),
dbesc($mid)
);
-
+
if(! $r) {
notice( t('no results') . EOL);
// return;
}
-
+
for($x = 0; $x < count($r); $x++ ) {
-
+
// This has two purposes: 1. make the delivery report strings translateable, and
// 2. assign an ordering to item delivery results so we can group them and provide
// a readable report with more interesting events listed toward the top and lesser
// interesting items towards the bottom
-
+
switch($r[$x]['dreport_result']) {
case 'channel sync processed':
$r[$x]['gravity'] = 0;
@@ -146,13 +145,13 @@ class Dreport extends \Zotlabs\Web\Controller {
break;
}
}
-
+
usort($r,'self::dreport_gravity_sort');
$entries = array();
foreach($r as $rr) {
- $entries[] = [
- 'name' => escape_tags($rr['dreport_name'] ?: $rr['dreport_recip']),
+ $entries[] = [
+ 'name' => escape_tags($rr['dreport_name'] ?: $rr['dreport_recip']),
'result' => escape_tags($rr['dreport_result']),
'time' => escape_tags(datetime_convert('UTC',date_default_timezone_get(),$rr['dreport_time']))
];
@@ -167,14 +166,14 @@ class Dreport extends \Zotlabs\Web\Controller {
'$push' => t('Redeliver'),
'$entries' => $entries
));
-
-
+
+
return $o;
-
-
-
+
+
+
}
-
+
private static function dreport_gravity_sort($a,$b) {
if($a['gravity'] == $b['gravity']) {
if($a['dreport_name'] === $b['dreport_name'])
@@ -183,5 +182,5 @@ class Dreport extends \Zotlabs\Web\Controller {
}
return (($a['gravity'] > $b['gravity']) ? 1 : (-1));
}
-
+
}
diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php
deleted file mode 100644
index 681d6887d..000000000
--- a/Zotlabs/Module/Events.php
+++ /dev/null
@@ -1,750 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-require_once('include/conversation.php');
-require_once('include/bbcode.php');
-require_once('include/datetime.php');
-require_once('include/event.php');
-require_once('include/items.php');
-require_once('include/html2plain.php');
-
-class Events extends \Zotlabs\Web\Controller {
-
- function post() {
-
- // this module is deprecated
- return;
-
- logger('post: ' . print_r($_REQUEST,true), LOGGER_DATA);
-
- if(! local_channel())
- return;
-
- if(($_FILES) && array_key_exists('userfile',$_FILES) && intval($_FILES['userfile']['size'])) {
- $src = $_FILES['userfile']['tmp_name'];
- if($src) {
- $result = parse_ical_file($src,local_channel());
- if($result)
- info( t('Calendar entries imported.') . EOL);
- else
- notice( t('No calendar entries found.') . EOL);
- @unlink($src);
- }
- goaway(z_root() . '/events');
- }
-
-
- $event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
- $event_hash = ((x($_POST,'event_hash')) ? $_POST['event_hash'] : '');
-
- $xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
- $uid = local_channel();
-
- $start_text = escape_tags($_REQUEST['start_text']);
- $finish_text = escape_tags($_REQUEST['finish_text']);
-
- $adjust = intval($_POST['adjust']);
- $nofinish = intval($_POST['nofinish']);
-
- $timezone = ((x($_POST,'timezone_select')) ? notags(trim($_POST['timezone_select'])) : '');
-
- $tz = (($timezone) ? $timezone : date_default_timezone_get());
-
- $categories = escape_tags(trim($_POST['category']));
-
- // only allow editing your own events.
-
- if(($xchan) && ($xchan !== get_observer_hash()))
- return;
-
- if($start_text) {
- $start = $start_text;
- }
- else {
- $start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
- }
-
-
- if($finish_text) {
- $finish = $finish_text;
- }
- else {
- $finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
- }
-
- if($nofinish) {
- $finish = NULL_DATE;
- }
-
-
- if($adjust) {
- $start = datetime_convert($tz,'UTC',$start);
- if(! $nofinish)
- $finish = datetime_convert($tz,'UTC',$finish);
- }
- else {
- $start = datetime_convert('UTC','UTC',$start);
- if(! $nofinish)
- $finish = datetime_convert('UTC','UTC',$finish);
- }
-
- // Don't allow the event to finish before it begins.
- // It won't hurt anything, but somebody will file a bug report
- // and we'll waste a bunch of time responding to it. Time that
- // could've been spent doing something else.
-
-
- $summary = escape_tags(trim($_POST['summary']));
- $desc = escape_tags(trim($_POST['desc']));
- $location = escape_tags(trim($_POST['location']));
- $type = escape_tags(trim($_POST['type']));
-
- require_once('include/text.php');
- linkify_tags($desc, local_channel());
- linkify_tags($location, local_channel());
-
- //$action = ($event_hash == '') ? 'new' : "event/" . $event_hash;
-
- //fixme: this url gives a wsod if there is a linebreak detected in one of the variables ($desc or $location)
- //$onerror_url = z_root() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish&type=$type";
- $onerror_url = z_root() . "/events";
-
- if(strcmp($finish,$start) < 0 && !$nofinish) {
- notice( t('Event can not end before it has started.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- goaway($onerror_url);
- }
-
- if((! $summary) || (! $start)) {
- notice( t('Event title and start time are required.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- goaway($onerror_url);
- }
-
- // $share = ((intval($_POST['distr'])) ? intval($_POST['distr']) : 0);
-
- $share = 1;
-
- $channel = \App::get_channel();
-
- $acl = new \Zotlabs\Access\AccessList(false);
-
- if($event_id) {
- $x = q("select * from event where id = %d and uid = %d limit 1",
- intval($event_id),
- intval(local_channel())
- );
- if(! $x) {
- notice( t('Event not found.') . EOL);
- if(intval($_REQUEST['preview'])) {
- echo( t('Unable to generate preview.'));
- killme();
- }
- return;
- }
-
- $acl->set($x[0]);
-
- $created = $x[0]['created'];
- $edited = datetime_convert();
-
- if($x[0]['allow_cid'] === '<' . $channel['channel_hash'] . '>'
- && $x[0]['allow_gid'] === '' && $x[0]['deny_cid'] === '' && $x[0]['deny_gid'] === '') {
- $share = false;
- }
- else {
- $share = true;
- }
- }
- else {
- $created = $edited = datetime_convert();
- if($share) {
- $acl->set_from_array($_POST);
- }
- else {
- $acl->set(array('allow_cid' => '<' . $channel['channel_hash'] . '>', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => ''));
- }
- }
-
- $post_tags = array();
- $channel = \App::get_channel();
- $ac = $acl->get();
-
- if(strlen($categories)) {
- $cats = explode(',',$categories);
- foreach($cats as $cat) {
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'ttype' => TERM_CATEGORY,
- 'otype' => TERM_OBJ_POST,
- 'term' => trim($cat),
- 'url' => $channel['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
- );
- }
- }
-
- $datarray = array();
- $datarray['dtstart'] = $start;
- $datarray['dtend'] = $finish;
- $datarray['summary'] = $summary;
- $datarray['description'] = $desc;
- $datarray['location'] = $location;
- $datarray['etype'] = $type;
- $datarray['adjust'] = $adjust;
- $datarray['nofinish'] = $nofinish;
- $datarray['uid'] = local_channel();
- $datarray['account'] = get_account_id();
- $datarray['event_xchan'] = $channel['channel_hash'];
- $datarray['allow_cid'] = $ac['allow_cid'];
- $datarray['allow_gid'] = $ac['allow_gid'];
- $datarray['deny_cid'] = $ac['deny_cid'];
- $datarray['deny_gid'] = $ac['deny_gid'];
- $datarray['private'] = (($acl->is_private()) ? 1 : 0);
- $datarray['id'] = $event_id;
- $datarray['created'] = $created;
- $datarray['edited'] = $edited;
-
- if(intval($_REQUEST['preview'])) {
- $html = format_event_html($datarray);
- echo $html;
- killme();
- }
-
- $event = event_store_event($datarray);
-
- if($post_tags)
- $datarray['term'] = $post_tags;
-
- $item_id = event_store_item($datarray,$event);
-
- if($item_id) {
- $r = q("select * from item where id = %d",
- intval($item_id)
- );
- if($r) {
- xchan_query($r);
- $sync_item = fetch_post_tags($r);
- $z = q("select * from event where event_hash = '%s' and uid = %d limit 1",
- dbesc($r[0]['resource_id']),
- intval($channel['channel_id'])
- );
- if($z) {
- build_sync_packet($channel['channel_id'],array('event_item' => array(encode_item($sync_item[0],true)),'event' => $z));
- }
- }
- }
-
- if($share)
- \Zotlabs\Daemon\Master::Summon(array('Notifier','event',$item_id));
-
- }
-
-
-
- function get() {
-
- // this module is deprecated
- return;
-
- if(argc() > 2 && argv(1) == 'ical') {
- $event_id = argv(2);
-
- require_once('include/security.php');
- $sql_extra = permissions_sql(local_channel());
-
- $r = q("select * from event where event_hash = '%s' $sql_extra limit 1",
- dbesc($event_id)
- );
- if($r) {
- header('Content-type: text/calendar');
- header('content-disposition: attachment; filename="' . t('event') . '-' . $event_id . '.ics"' );
- echo ical_wrapper($r);
- killme();
- }
- else {
- notice( t('Event not found.') . EOL );
- return;
- }
- }
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- \App::$profile_uid = local_channel();
- nav_set_selected('Events');
-
-
- if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
- $r = q("update event set dismissed = 1 where id = %d and uid = %d",
- intval(argv(2)),
- intval(local_channel())
- );
- }
-
- if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
- $r = q("update event set dismissed = 0 where id = %d and uid = %d",
- intval(argv(2)),
- intval(local_channel())
- );
- }
-
- $first_day = feature_enabled(local_channel(), 'events_cal_first_day');
- $first_day = (($first_day) ? $first_day : 0);
-
- $htpl = get_markup_template('event_head.tpl');
- \App::$page['htmlhead'] .= replace_macros($htpl,array(
- '$baseurl' => z_root(),
- '$module_url' => '/events',
- '$modparams' => 1,
- '$lang' => \App::$language,
- '$first_day' => $first_day
- ));
-
- $o = '';
-
- $channel = \App::get_channel();
-
- $mode = 'view';
- $y = 0;
- $m = 0;
- $ignored = ((x($_REQUEST,'ignored')) ? " and dismissed = " . intval($_REQUEST['ignored']) . " " : '');
-
-
- // logger('args: ' . print_r(\App::$argv,true));
-
-
-
- if(argc() > 1) {
- if(argc() > 2 && argv(1) === 'add') {
- $mode = 'add';
- $item_id = intval(argv(2));
- }
- if(argc() > 2 && argv(1) === 'drop') {
- $mode = 'drop';
- $event_id = argv(2);
- }
- if(argc() > 2 && intval(argv(1)) && intval(argv(2))) {
- $mode = 'view';
- $y = intval(argv(1));
- $m = intval(argv(2));
- }
- if(argc() <= 2) {
- $mode = 'view';
- $event_id = argv(1);
- }
- }
-
- if($mode === 'add') {
- event_addtocal($item_id,local_channel());
- killme();
- }
-
- if($mode == 'view') {
-
- /* edit/create form */
- if($event_id) {
- $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
- dbesc($event_id),
- intval(local_channel())
- );
- if(count($r))
- $orig_event = $r[0];
- }
-
- $channel = \App::get_channel();
-
- // Passed parameters overrides anything found in the DB
- if(!x($orig_event))
- $orig_event = array();
-
- // In case of an error the browser is redirected back here, with these parameters filled in with the previous values
- /*
- if(x($_REQUEST,'nofinish')) $orig_event['nofinish'] = $_REQUEST['nofinish'];
- if(x($_REQUEST,'adjust')) $orig_event['adjust'] = $_REQUEST['adjust'];
- if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary'];
- if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description'];
- if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location'];
- if(x($_REQUEST,'start')) $orig_event['dtstart'] = $_REQUEST['start'];
- if(x($_REQUEST,'finish')) $orig_event['dtend'] = $_REQUEST['finish'];
- if(x($_REQUEST,'type')) $orig_event['etype'] = $_REQUEST['type'];
- */
-
- $n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
- $a_checked = ((x($orig_event) && $orig_event['adjust']) ? ' checked="checked" ' : '');
- $t_orig = ((x($orig_event)) ? $orig_event['summary'] : '');
- $d_orig = ((x($orig_event)) ? $orig_event['description'] : '');
- $l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
- $eid = ((x($orig_event)) ? $orig_event['id'] : 0);
- $event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
- $mid = ((x($orig_event)) ? $orig_event['mid'] : '');
-
- if(! x($orig_event)) {
- $sh_checked = '';
- $a_checked = ' checked="checked" ';
- }
- else {
- $sh_checked = ((($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' || (! $orig_event['allow_cid'])) && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
- }
-
- if($orig_event['event_xchan'])
- $sh_checked .= ' disabled="disabled" ';
-
- $sdt = ((x($orig_event)) ? $orig_event['dtstart'] : 'now');
-
- $fdt = ((x($orig_event)) ? $orig_event['dtend'] : '+1 hour');
-
- $tz = date_default_timezone_get();
- if(x($orig_event))
- $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
-
- $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
- $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
- $sday = datetime_convert('UTC', $tz, $sdt, 'd');
- $shour = datetime_convert('UTC', $tz, $sdt, 'H');
- $sminute = datetime_convert('UTC', $tz, $sdt, 'i');
-
- $stext = datetime_convert('UTC',$tz,$sdt);
- $stext = substr($stext,0,14) . "00:00";
-
- $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
- $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
- $fday = datetime_convert('UTC', $tz, $fdt, 'd');
- $fhour = datetime_convert('UTC', $tz, $fdt, 'H');
- $fminute = datetime_convert('UTC', $tz, $fdt, 'i');
-
- $ftext = datetime_convert('UTC',$tz,$fdt);
- $ftext = substr($ftext,0,14) . "00:00";
-
- $type = ((x($orig_event)) ? $orig_event['etype'] : 'event');
-
- $f = get_config('system','event_input_format');
- if(! $f)
- $f = 'ymd';
-
- $catsenabled = feature_enabled(local_channel(),'categories');
-
- $category = '';
-
- if($catsenabled && x($orig_event)){
- $itm = q("select * from item where resource_type = 'event' and resource_id = '%s' and uid = %d limit 1",
- dbesc($orig_event['event_hash']),
- intval(local_channel())
- );
- $itm = fetch_post_tags($itm);
- if($itm) {
- $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
- foreach ($cats as $cat) {
- if(strlen($category))
- $category .= ', ';
- $category .= $cat['term'];
- }
- }
- }
-
- require_once('include/acl_selectors.php');
-
- $acl = new \Zotlabs\Access\AccessList($channel);
- $perm_defaults = $acl->get();
-
- $permissions = ((x($orig_event)) ? $orig_event : $perm_defaults);
-
- $tpl = get_markup_template('event_form.tpl');
-
- $form = replace_macros($tpl,array(
- '$post' => z_root() . '/events',
- '$eid' => $eid,
- '$type' => $type,
- '$xchan' => $event_xchan,
- '$mid' => $mid,
- '$event_hash' => $event_id,
- '$summary' => array('summary', (($event_id) ? t('Edit event title') : t('Event title')), $t_orig, t('Required'), '*'),
- '$catsenabled' => $catsenabled,
- '$placeholdercategory' => t('Categories (comma-separated list)'),
- '$c_text' => (($event_id) ? t('Edit Category') : t('Category')),
- '$category' => $category,
- '$required' => '<span class="required" title="' . t('Required') . '">*</span>',
- '$s_dsel' => datetimesel($f,new \DateTime(),\DateTime::createFromFormat('Y',$syear+5),\DateTime::createFromFormat('Y-m-d H:i',"$syear-$smonth-$sday $shour:$sminute"), (($event_id) ? t('Edit start date and time') : t('Start date and time')), 'start_text',true,true,'','',true,$first_day),
- '$n_text' => t('Finish date and time are not known or not relevant'),
- '$n_checked' => $n_checked,
- '$f_dsel' => datetimesel($f,new \DateTime(),\DateTime::createFromFormat('Y',$fyear+5),\DateTime::createFromFormat('Y-m-d H:i',"$fyear-$fmonth-$fday $fhour:$fminute"), (($event_id) ? t('Edit finish date and time') : t('Finish date and time')),'finish_text',true,true,'start_text','',false,$first_day),
- '$nofinish' => array('nofinish', t('Finish date and time are not known or not relevant'), $n_checked, '', array(t('No'),t('Yes')), 'onclick="enableDisableFinishDate();"'),
- '$adjust' => array('adjust', t('Adjust for viewer timezone'), $a_checked, t('Important for events that happen in a particular place. Not practical for global holidays.'), array(t('No'),t('Yes'))),
- '$a_text' => t('Adjust for viewer timezone'),
- '$d_text' => (($event_id) ? t('Edit Description') : t('Description')),
- '$d_orig' => $d_orig,
- '$l_text' => (($event_id) ? t('Edit Location') : t('Location')),
- '$l_orig' => $l_orig,
- '$t_orig' => $t_orig,
- '$preview' => t('Preview'),
- '$perms_label' => t('Permission settings'),
- // populating the acl dialog was a permission description from view_stream because Cal.php, which
- // displays events, says "since we don't currently have an event permission - use the stream permission"
- '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults), false, \Zotlabs\Lib\PermissionDescription::fromGlobalPermission('view_stream'))),
-
- '$allow_cid' => acl2json($permissions['allow_cid']),
- '$allow_gid' => acl2json($permissions['allow_gid']),
- '$deny_cid' => acl2json($permissions['deny_cid']),
- '$deny_gid' => acl2json($permissions['deny_gid']),
- '$tz_choose' => feature_enabled(local_channel(),'event_tz_select'),
- '$timezone' => array('timezone_select' , t('Timezone:'), date_default_timezone_get(), '', get_timezones()),
-
- '$lockstate' => (($acl->is_private()) ? 'lock' : 'unlock'),
-
- '$submit' => t('Submit'),
- '$advanced' => t('Advanced Options')
-
- ));
- /* end edit/create form */
-
- $thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
- $thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
- if(! $y)
- $y = intval($thisyear);
- if(! $m)
- $m = intval($thismonth);
-
- $export = false;
- if(argc() === 4 && argv(3) === 'export')
- $export = true;
-
- // Put some limits on dates. The PHP date functions don't seem to do so well before 1900.
- // An upper limit was chosen to keep search engines from exploring links millions of years in the future.
-
- if($y < 1901)
- $y = 1900;
- if($y > 2099)
- $y = 2100;
-
- $nextyear = $y;
- $nextmonth = $m + 1;
- if($nextmonth > 12) {
- $nextmonth = 1;
- $nextyear ++;
- }
-
- $prevyear = $y;
- if($m > 1)
- $prevmonth = $m - 1;
- else {
- $prevmonth = 12;
- $prevyear --;
- }
-
- $dim = get_dim($y,$m);
- $start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
- $finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
-
-
- if (argv(1) === 'json'){
- if (x($_GET,'start')) $start = $_GET['start'];
- if (x($_GET,'end')) $finish = $_GET['end'];
- }
-
- $start = datetime_convert('UTC','UTC',$start);
- $finish = datetime_convert('UTC','UTC',$finish);
-
- $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
- $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
-
- if (x($_GET,'id')){
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
- intval(local_channel()),
- intval($_GET['id'])
- );
- } elseif($export) {
- $r = q("SELECT * from event where uid = %d
- AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
- OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
- intval(local_channel()),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
- }
- else {
- // fixed an issue with "nofinish" events not showing up in the calendar.
- // There's still an issue if the finish date crosses the end of month.
- // Noting this for now - it will need to be fixed here and in Friendica.
- // Ultimately the finish date shouldn't be involved in the query.
-
- $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
- from event left join item on event_hash = resource_id
- where resource_type = 'event' and event.uid = %d and event.uid = item.uid $ignored
- AND (( adjust = 0 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )
- OR ( adjust = 1 AND ( dtend >= '%s' or nofinish = 1 ) AND dtstart <= '%s' )) ",
- intval(local_channel()),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
- }
-
- $links = array();
-
- if($r && ! $export) {
- xchan_query($r);
- $r = fetch_post_tags($r,true);
-
- $r = sort_by_date($r);
- }
-
- if($r) {
- foreach($r as $rr) {
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
- if(! x($links,$j))
- $links[$j] = z_root() . '/' . \App::$cmd . '#link-' . $j;
- }
- }
-
- $events=array();
-
- $last_date = '';
- $fmt = t('l, F j');
-
- if($r) {
-
- foreach($r as $rr) {
-
- $j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'j') : datetime_convert('UTC','UTC',$rr['dtstart'],'j'));
- $d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], $fmt) : datetime_convert('UTC','UTC',$rr['dtstart'],$fmt));
- $d = day_translate($d);
-
- $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtstart'], 'c') : datetime_convert('UTC','UTC',$rr['dtstart'],'c'));
- if ($rr['nofinish']){
- $end = null;
- } else {
- $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['dtend'], 'c') : datetime_convert('UTC','UTC',$rr['dtend'],'c'));
-
- // give a fake end to birthdays so they get crammed into a
- // single day on the calendar
-
- if($rr['etype'] === 'birthday')
- $end = null;
- }
-
-
- $is_first = ($d !== $last_date);
-
- $last_date = $d;
-
- $edit = ((local_channel() && $rr['author_xchan'] == get_observer_hash()) ? array(z_root().'/events/'.$rr['event_hash'].'?expandform=1',t('Edit event'),'','') : false);
-
- $drop = array(z_root().'/events/drop/'.$rr['event_hash'],t('Delete event'),'','');
-
- $title = strip_tags(html_entity_decode(zidify_links(bbcode($rr['summary'])),ENT_QUOTES,'UTF-8'));
- if(! $title) {
- list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
- $title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
- }
- $html = format_event_html($rr);
- $rr['desc'] = zidify_links(smilies(bbcode($rr['desc'])));
- $rr['description'] = htmlentities(html2plain(bbcode($rr['description'])),ENT_COMPAT,'UTF-8',false);
- $rr['location'] = zidify_links(smilies(bbcode($rr['location'])));
- $events[] = array(
- 'id'=>$rr['id'],
- 'hash' => $rr['event_hash'],
- 'start'=> $start,
- 'end' => $end,
- 'drop' => $drop,
- 'allDay' => false,
- 'title' => $title,
-
- 'j' => $j,
- 'd' => $d,
- 'edit' => $edit,
- 'is_first'=>$is_first,
- 'item'=>$rr,
- 'html'=>$html,
- 'plink' => array($rr['plink'],t('Link to Source'),'',''),
- );
-
- }
- }
-
- if($export) {
- header('Content-type: text/calendar');
- header('content-disposition: attachment; filename="' . t('calendar') . '-' . $channel['channel_address'] . '.ics"' );
- echo ical_wrapper($r);
- killme();
- }
-
- if (\App::$argv[1] === 'json'){
- echo json_encode($events); killme();
- }
-
- // links: array('href', 'text', 'extra css classes', 'title')
- if (x($_GET,'id')){
- $tpl = get_markup_template("event.tpl");
- }
- else {
- $tpl = get_markup_template("events-js.tpl");
- }
-
- $o = replace_macros($tpl, array(
- '$baseurl' => z_root(),
- '$new_event' => array(z_root().'/events',(($event_id) ? t('Edit Event') : t('Create Event')),'',''),
- '$previus' => array(z_root()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
- '$next' => array(z_root()."/events/$nextyear/$nextmonth",t('Next'),'',''),
- '$export' => array(z_root()."/events/$y/$m/export",t('Export'),'',''),
- '$calendar' => cal($y,$m,$links, ' eventcal'),
- '$events' => $events,
- '$view_label' => t('View'),
- '$month' => t('Month'),
- '$week' => t('Week'),
- '$day' => t('Day'),
- '$prev' => t('Previous'),
- '$next' => t('Next'),
- '$today' => t('Today'),
- '$form' => $form,
- '$expandform' => ((x($_GET,'expandform')) ? true : false),
- ));
-
- if (x($_GET,'id')){ echo $o; killme(); }
-
- return $o;
- }
-
- if($mode === 'drop' && $event_id) {
- $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
- dbesc($event_id),
- intval(local_channel())
- );
-
- $sync_event = $r[0];
-
- if($r) {
- $r = q("delete from event where event_hash = '%s' and uid = %d",
- dbesc($event_id),
- intval(local_channel())
- );
- if($r) {
- $r = q("update item set resource_type = '', resource_id = '' where resource_type = 'event' and resource_id = '%s' and uid = %d",
- dbesc($event_id),
- intval(local_channel())
- );
- $sync_event['event_deleted'] = 1;
- build_sync_packet(0,array('event' => array($sync_event)));
-
- info( t('Event removed') . EOL);
- }
- else {
- notice( t('Failed to remove event' ) . EOL);
- }
- goaway(z_root() . '/events');
- }
- }
-
- }
-
-}
diff --git a/Zotlabs/Module/Fhublocs.php b/Zotlabs/Module/Fhublocs.php
index 42dac5b12..9dcece715 100644
--- a/Zotlabs/Module/Fhublocs.php
+++ b/Zotlabs/Module/Fhublocs.php
@@ -3,7 +3,6 @@ namespace Zotlabs\Module;
use Zotlabs\Lib\Libzot;
-require_once('include/zot.php');
require_once('include/crypto.php');
/* fix missing or damaged hublocs */
@@ -59,23 +58,6 @@ class Fhublocs extends \Zotlabs\Web\Controller {
// Create a verified hub location pointing to this site.
-/*
- $h = hubloc_store_lowlevel(
- [
- 'hubloc_guid' => $rr['channel_guid'],
- 'hubloc_guid_sig' => $rr['channel_guid_sig'],
- 'hubloc_hash' => $rr['channel_hash'],
- 'hubloc_addr' => channel_reddress($rr),
- 'hubloc_network' => 'zot',
- 'hubloc_primary' => $primary,
- 'hubloc_url' => z_root(),
- 'hubloc_url_sig' => base64url_encode(Crypto::sign(z_root(),$rr['channel_prvkey'])),
- 'hubloc_host' => \App::get_hostname(),
- 'hubloc_callback' => z_root() . '/post',
- 'hubloc_sitekey' => $sitekey
- ]
- );
-*/
$h = hubloc_store_lowlevel(
[
'hubloc_guid' => $rr['channel_guid'],
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index 4622a588d..77a9ec844 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -2,7 +2,6 @@
namespace Zotlabs\Module;
-require_once('include/zot.php');
require_once('include/channel.php');
require_once('include/import.php');
require_once('include/perm_upgrade.php');
@@ -212,35 +211,8 @@ class Import extends \Zotlabs\Web\Controller {
// create new hubloc for the new channel at this site
if(array_key_exists('channel',$data)) {
- if($channel['channel_portable_id']) {
- $r = hubloc_store_lowlevel(
- [
- 'hubloc_guid' => $channel['channel_guid'],
- 'hubloc_guid_sig' => $channel['channel_guid_sig'],
- 'hubloc_hash' => $channel['channel_portable_id'],
- 'hubloc_addr' => channel_reddress($channel),
- 'hubloc_network' => 'zot',
- 'hubloc_primary' => (($seize) ? 1 : 0),
- 'hubloc_url' => z_root(),
- 'hubloc_url_sig' => base64url_encode(Crypto::sign(z_root(),$channel['channel_prvkey'])),
- 'hubloc_host' => \App::get_hostname(),
- 'hubloc_callback' => z_root() . '/post',
- 'hubloc_sitekey' => get_config('system','pubkey'),
- 'hubloc_updated' => datetime_convert(),
- 'hubloc_id_url' => channel_url($channel)
- ]
- );
-
- // reset the original primary hubloc if it is being seized
- if($seize) {
- $r = q("update hubloc set hubloc_primary = 0 where hubloc_primary = 1 and hubloc_hash = '%s' and hubloc_url != '%s' ",
- dbesc($channel['channel_portable_id']),
- dbesc(z_root())
- );
- }
- }
- // create a new zot6 hubloc if we have got a channel_portable_id
+ // create a new zot6 hubloc
$r = hubloc_store_lowlevel(
[
@@ -280,33 +252,10 @@ class Import extends \Zotlabs\Web\Controller {
// replace any existing xchan we may have on this site if we're seizing control
- $r = q("delete from xchan where ( xchan_hash = '%s' or xchan_hash = '%s' ) ",
- dbesc($channel['channel_hash']),
- dbesc($channel['channel_portable_id'])
+ $r = q("delete from xchan where xchan_hash = '%s'",
+ dbesc($channel['channel_hash'])
);
- if($channel['channel_portable_id']) {
- $r = xchan_store_lowlevel(
- [
- 'xchan_hash' => $channel['channel_portable_id'],
- 'xchan_guid' => $channel['channel_guid'],
- 'xchan_guid_sig' => $channel['channel_guid_sig'],
- 'xchan_pubkey' => $channel['channel_pubkey'],
- 'xchan_photo_l' => z_root() . "/photo/profile/l/" . $channel['channel_id'],
- 'xchan_photo_m' => z_root() . "/photo/profile/m/" . $channel['channel_id'],
- 'xchan_photo_s' => z_root() . "/photo/profile/s/" . $channel['channel_id'],
- 'xchan_addr' => channel_reddress($channel),
- 'xchan_url' => z_root() . '/channel/' . $channel['channel_address'],
- 'xchan_connurl' => z_root() . '/poco/' . $channel['channel_address'],
- 'xchan_follow' => z_root() . '/follow?f=&url=%s',
- 'xchan_name' => $channel['channel_name'],
- 'xchan_network' => 'zot',
- 'xchan_photo_date' => datetime_convert(),
- 'xchan_name_date' => datetime_convert()
- ]
- );
- }
-
$r = xchan_store_lowlevel(
[
'xchan_hash' => $channel['channel_hash'],
@@ -336,14 +285,6 @@ class Import extends \Zotlabs\Web\Controller {
if($xchans) {
foreach($xchans as $xchan) {
- if($xchan['xchan_network'] === 'zot') {
- $hash = make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_guid_sig']);
- if($hash !== $xchan['xchan_hash']) {
- logger('forged xchan: ' . print_r($xchan,true));
- continue;
- }
- }
-
if($xchan['xchan_network'] === 'zot6') {
$zhash = Libzot::make_xchan_hash($xchan['xchan_guid'],$xchan['xchan_pubkey']);
if($zhash !== $xchan['xchan_hash']) {
@@ -553,12 +494,6 @@ class Import extends \Zotlabs\Web\Controller {
if(is_array($data['chatroom']))
import_chatrooms($channel,$data['chatroom']);
- if(is_array($data['conv']))
- import_conv($channel,$data['conv']);
-
- if(is_array($data['mail']))
- import_mail($channel,$data['mail']);
-
if(is_array($data['event']))
import_events($channel,$data['event']);
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index 73a943039..518352667 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -822,6 +822,8 @@ class Item extends Controller {
$post_tags = [];
+
+
if($mimetype === 'text/bbcode') {
require_once('include/text.php');
diff --git a/Zotlabs/Module/Locs.php b/Zotlabs/Module/Locs.php
index 2dd359c95..59b872982 100644
--- a/Zotlabs/Module/Locs.php
+++ b/Zotlabs/Module/Locs.php
@@ -28,9 +28,8 @@ class Locs extends Controller {
return;
}
- q("UPDATE hubloc SET hubloc_primary = 0 WHERE hubloc_primary = 1 AND (hubloc_hash = '%s' OR hubloc_hash = '%s')",
- dbesc($channel['channel_hash']),
- dbesc($channel['channel_portable_id'])
+ q("UPDATE hubloc SET hubloc_primary = 0 WHERE hubloc_primary = 1 AND hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
);
q("UPDATE hubloc SET hubloc_primary = 1 WHERE hubloc_id = %d AND hubloc_hash = '%s'",
@@ -81,10 +80,9 @@ class Locs extends Controller {
}
}
- q("UPDATE hubloc SET hubloc_deleted = 1 WHERE hubloc_id_url = '%s' AND (hubloc_hash = '%s' OR hubloc_hash = '%s')",
+ q("UPDATE hubloc SET hubloc_deleted = 1 WHERE hubloc_id_url = '%s' AND hubloc_hash = '%s'",
dbesc($r[0]['hubloc_id_url']),
- dbesc($channel['channel_hash']),
- dbesc($channel['channel_portable_id'])
+ dbesc($channel['channel_hash'])
);
Master::Summon( [ 'Notifier', 'refresh_all', $channel['channel_id'] ] );
return;
diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php
index bc2034b95..d67b47437 100644
--- a/Zotlabs/Module/Manage.php
+++ b/Zotlabs/Module/Manage.php
@@ -84,16 +84,6 @@ class Manage extends \Zotlabs\Web\Controller {
if($intr)
$channels[$x]['intros'] = intval($intr[0]['total']);
-
- $mails = q("SELECT count(id) as total from mail WHERE channel_id = %d AND mail_seen = 0 and from_xchan != '%s' ",
- intval($channels[$x]['channel_id']),
- dbesc($channels[$x]['channel_hash'])
- );
-
- if($mails)
- $channels[$x]['mail'] = intval($mails[0]['total']);
-
-
$events = q("SELECT etype, dtstart, adjust FROM event
WHERE event.uid = %d AND dtstart < '%s' AND dtstart > '%s' and dismissed = 0
ORDER BY dtstart ASC ",
@@ -175,7 +165,6 @@ class Manage extends \Zotlabs\Web\Controller {
'$msg_make_default' => t('Make Default'),
'$create' => $create,
'$all_channels' => $channels,
- '$mail_format' => t('%d new messages'),
'$intros_format' => t('%d new introductions'),
'$channel_usage_message' => $channel_usage_message,
'$delegated_desc' => t('Delegated Channel'),
diff --git a/Zotlabs/Module/Message.php b/Zotlabs/Module/Message.php
deleted file mode 100644
index 5856bfbdf..000000000
--- a/Zotlabs/Module/Message.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-require_once('include/acl_selectors.php');
-require_once('include/message.php');
-require_once('include/zot.php');
-require_once("include/bbcode.php");
-
-
-class Message extends \Zotlabs\Web\Controller {
-
- function get() {
-
- $o = '';
- nav_set_selected('messages');
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return login();
- }
-
- $channel = \App::get_channel();
- head_set_icon($channel['xchan_photo_s']);
-
- $cipher = get_pconfig(local_channel(),'system','default_cipher');
- if(! $cipher)
- $cipher = 'aes256';
-
- /*
- if((argc() == 3) && (argv(1) === 'dropconv')) {
- if(! intval(argv(2)))
- return;
- $cmd = argv(1);
- $r = private_messages_drop(local_channel(), argv(2), true);
- if($r)
- info( t('Conversation removed.') . EOL );
- goaway(z_root() . '/mail/combined' );
- }
-
- if(argc() == 2) {
-
- switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
- case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
- break;
- case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
- break;
- default:
- break;
- }
-
- // private_messages_list() can do other more complicated stuff, for now keep it simple
-
- $r = private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
-
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
- }
-
- $messages = array();
-
- foreach($r as $rr) {
-
- $messages[] = array(
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => zidify_links(smilies(bbcode($rr['body']))),
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
- 'seen' => $rr['seen']
- );
- }
-
-
- $tpl = get_markup_template('mail_head.tpl');
- $o = replace_macros($tpl, array(
- '$header' => $header,
- '$messages' => $messages
- ));
-
-
- $o .= alt_pager(count($r));
-
- return $o;
-
- return;
-
- }
- */
-
- return;
- }
-
-}
diff --git a/Zotlabs/Module/Notes.php b/Zotlabs/Module/Notes.php
index b448cff83..452e3df60 100644
--- a/Zotlabs/Module/Notes.php
+++ b/Zotlabs/Module/Notes.php
@@ -38,7 +38,6 @@ class Notes extends Controller {
// push updates to channel clones
if((argc() > 1) && (argv(1) === 'sync')) {
- require_once('include/zot.php');
Libsync::build_sync_packet();
}
diff --git a/Zotlabs/Module/Notifications.php b/Zotlabs/Module/Notifications.php
index 8ecf5760a..c08628b47 100644
--- a/Zotlabs/Module/Notifications.php
+++ b/Zotlabs/Module/Notifications.php
@@ -8,10 +8,58 @@ class Notifications extends \Zotlabs\Web\Controller {
function get() {
if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
return;
}
+ // ajax mark all unseen items read
+ if(x($_REQUEST, 'markRead')) {
+ switch($_REQUEST['markRead']) {
+ case 'dm':
+ $r = q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND item_unseen = 1 AND item_private = 2",
+ intval(local_channel())
+ );
+ break;
+ case 'network':
+ $r = q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND item_unseen = 1 AND item_private IN (0, 1)",
+ intval(local_channel())
+ );
+ break;
+ case 'home':
+ $r = q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND item_unseen = 1 AND item_wall = 1 AND item_private IN (0, 1)",
+ intval(local_channel())
+ );
+ break;
+ case 'all_events':
+ $evdays = intval(get_pconfig(local_channel(), 'system', 'evdays', 3));
+ $r = q("UPDATE event SET dismissed = 1 WHERE uid = %d AND dismissed = 0 AND dtstart < '%s' AND dtstart > '%s' ",
+ intval(local_channel()),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now + ' . intval($evdays) . ' days')),
+ dbesc(datetime_convert('UTC', date_default_timezone_get(), 'now - 1 days'))
+ );
+ break;
+ case 'notify':
+ $r = q("UPDATE notify SET seen = 1 WHERE seen = 0 AND uid = %d",
+ intval(local_channel())
+ );
+ break;
+ case 'pubs':
+ unset($_SESSION['static_loadtime']);
+ break;
+ default:
+ break;
+ }
+ killme();
+ }
+
+ // ajax mark all comments of a parent item read
+ if(x($_REQUEST, 'markItemRead') && local_channel()) {
+ $r = q("UPDATE item SET item_unseen = 0 WHERE uid = %d AND parent = %d",
+ intval(local_channel()),
+ intval($_REQUEST['markItemRead'])
+ );
+ killme();
+ }
+
nav_set_selected('Notifications');
$o = '';
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index e62accb06..3aad70d18 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -1178,10 +1178,8 @@ class Photos extends \Zotlabs\Web\Controller {
if($observer['xchan_hash'] === $item['author_xchan'] || $observer['xchan_hash'] === $item['owner_xchan'])
$drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
-
$name_e = $profile_name;
$title_e = $item['title'];
- unobscure($item);
$body_e = prepare_text($item['body'],$item['mimetype']);
$comments .= replace_macros($template,array(
diff --git a/Zotlabs/Module/Post.php b/Zotlabs/Module/Post.php
deleted file mode 100644
index f67cbf020..000000000
--- a/Zotlabs/Module/Post.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * @file Zotlabs/Module/Post.php
- *
- * @brief Zot endpoint.
- *
- */
-
-namespace Zotlabs\Module;
-
-require_once('include/zot.php');
-
-/**
- * @brief Post module.
- *
- */
-class Post extends \Zotlabs\Web\Controller {
-
- function init() {
- if(array_key_exists('auth', $_REQUEST)) {
- $x = new \Zotlabs\Zot\Auth($_REQUEST);
- exit;
- }
- }
-
- function post() {
- if(array_key_exists('data',$_REQUEST)) {
- $z = new \Zotlabs\Zot\Receiver($_REQUEST['data'], get_config('system', 'prvkey'), new \Zotlabs\Zot\ZotHandler());
- exit;
- }
-
- }
-
-}
diff --git a/Zotlabs/Module/Prate.php b/Zotlabs/Module/Prate.php
deleted file mode 100644
index 8b71657b8..000000000
--- a/Zotlabs/Module/Prate.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-use Zotlabs\Lib\Crypto;
-
-class Prate extends \Zotlabs\Web\Controller {
-
- function init() {
- if($_SERVER['REQUEST_METHOD'] === 'post')
- return;
-
- if(! local_channel())
- return;
-
- $channel = \App::get_channel();
-
- $target = argv(1);
- if(! $target)
- return;
-
- $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc($target)
- );
- if($r)
- json_return_and_die(array('rating' => $r[0]['xlink_rating'],'rating_text' => $r[0]['xlink_rating_text']));
- killme();
- }
-
- function post() {
-
- if(! local_channel())
- return;
-
- $channel = \App::get_channel();
-
- $target = trim($_REQUEST['target']);
- if(! $target)
- return;
-
- if($target === $channel['channel_hash'])
- return;
-
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
-
- $signed = $target . '.' . $rating . '.' . $rating_text;
-
- $sig = base64url_encode(Crypto::sign($signed,$channel['channel_prvkey']));
-
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($target)
- );
- if($z) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- else {
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc($target),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc($orig_record[0]['abook_xchan'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
- if($record) {
- \Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record));
- }
-
- json_return_and_die(array('result' => true));;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-}
diff --git a/Zotlabs/Module/Probe.php b/Zotlabs/Module/Probe.php
deleted file mode 100644
index 3bc4dac72..000000000
--- a/Zotlabs/Module/Probe.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-use App;
-use Zotlabs\Lib\Apps;
-use Zotlabs\Lib\Crypto;
-
-require_once('include/zot.php');
-
-class Probe extends \Zotlabs\Web\Controller {
-
- function get() {
-
- if(local_channel()) {
- if(! Apps::system_app_installed(local_channel(), 'Remote Diagnostics')) {
- //Do not display any associated widgets at this point
- App::$pdl = '';
-
- $o = '<b>' . t('Remote Diagnostics App') . ' (' . t('Not Installed') . '):</b><br>';
- $o .= t('Perform diagnostics on remote channels');
- return $o;
- }
- }
-
- nav_set_selected('Remote Diagnostics');
-
- $o .= '<h3>Remote Diagnostics</h3>';
-
- $o .= '<form action="probe" method="get">';
- $o .= 'Lookup address: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
- $o .= '<input type="submit" name="submit" value="Submit" /></form>';
-
- $o .= '<br /><br />';
-
- if(x($_GET,'addr')) {
- $channel = App::get_channel();
- $addr = trim($_GET['addr']);
- $do_import = ((intval($_GET['import']) && is_site_admin()) ? true : false);
-
- $j = \Zotlabs\Zot\Finger::run($addr,$channel,false);
-
- $o .= '<pre>';
- if(! $j['success']) {
- $o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
- $j = \Zotlabs\Zot\Finger::run($addr,$channel,true);
- if(! $j['success']) {
- return $o;
- }
- }
- if($do_import && $j)
- $x = import_xchan($j);
- if($j && $j['permissions'] && $j['permissions']['iv'])
- $j['permissions'] = json_decode(Crypto::unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
- $o .= str_replace("\n",'<br />',print_r($j,true));
- $o .= '</pre>';
- }
- return $o;
- }
-
-}
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index 9aa342223..452af4d78 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -600,7 +600,6 @@ class Profiles extends \Zotlabs\Web\Controller {
intval(local_channel())
);
if($r) {
- require_once('include/zot.php');
Libsync::build_sync_packet(local_channel(),array('profile' => $r));
}
diff --git a/Zotlabs/Module/Pubsites.php b/Zotlabs/Module/Pubsites.php
index 4b64d9af6..fd5aeaa72 100644
--- a/Zotlabs/Module/Pubsites.php
+++ b/Zotlabs/Module/Pubsites.php
@@ -6,7 +6,6 @@ use Zotlabs\Lib\Libzotdir;
class Pubsites extends \Zotlabs\Web\Controller {
function get() {
- require_once('include/dir_fns.php');
$dirmode = intval(get_config('system','directory_mode'));
if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
diff --git a/Zotlabs/Module/Rate.php b/Zotlabs/Module/Rate.php
deleted file mode 100644
index d29c370fc..000000000
--- a/Zotlabs/Module/Rate.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-
-use Zotlabs\Lib\Crypto;
-
-class Rate extends \Zotlabs\Web\Controller {
-
- function init() {
-
- if(! local_channel())
- return;
-
- $channel = \App::get_channel();
-
- $target = $_REQUEST['target'];
- if(! $target)
- return;
-
- \App::$data['target'] = $target;
-
- if($target) {
- $r = q("SELECT * FROM xchan where xchan_hash like '%s' LIMIT 1",
- dbesc($target)
- );
- if($r) {
- \App::$poi = $r[0];
- }
- else {
- $r = q("select * from site where site_url like '%s' and site_type = %d",
- dbesc('%' . $target),
- intval(SITE_TYPE_ZOT)
- );
- if($r) {
- \App::$data['site'] = $r[0];
- \App::$data['site']['site_url'] = strtolower($r[0]['site_url']);
- }
- }
- }
-
-
- return;
-
- }
-
-
- function post() {
-
- if(! local_channel())
- return;
-
- if(! \App::$data['target'])
- return;
-
- if(! $_REQUEST['execute'])
- return;
-
- $channel = \App::get_channel();
-
- $rating = intval($_POST['rating']);
- if($rating < (-10))
- $rating = (-10);
- if($rating > 10)
- $rating = 10;
-
- $rating_text = trim(escape_tags($_REQUEST['rating_text']));
-
- $signed = \App::$data['target'] . '.' . $rating . '.' . $rating_text;
-
- $sig = base64url_encode(Crypto::sign($signed,$channel['channel_prvkey']));
-
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc(\App::$data['target'])
- );
-
- if($z) {
- $record = $z[0]['xlink_id'];
- $w = q("update xlink set xlink_rating = '%d', xlink_rating_text = '%s', xlink_sig = '%s', xlink_updated = '%s'
- where xlink_id = %d",
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert()),
- intval($record)
- );
- }
- else {
- $w = q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_rating_text, xlink_sig, xlink_updated, xlink_static ) values ( '%s', '%s', %d, '%s', '%s', '%s', 1 ) ",
- dbesc($channel['channel_hash']),
- dbesc(\App::$data['target']),
- intval($rating),
- dbesc($rating_text),
- dbesc($sig),
- dbesc(datetime_convert())
- );
- $z = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1 limit 1",
- dbesc($channel['channel_hash']),
- dbesc(\App::$data['target'])
- );
- if($z)
- $record = $z[0]['xlink_id'];
- }
-
- if($record) {
- \Zotlabs\Daemon\Master::Summon(array('Ratenotif','rating',$record));
- }
-
- }
-
- function get() {
-
- if(! local_channel()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- // if(! \App::$data['target']) {
- // notice( t('No recipients.') . EOL);
- // return;
- // }
-
- $rating_enabled = get_config('system','rating_enabled');
- if(! $rating_enabled) {
- notice('Ratings are disabled on this site.');
- return;
- }
-
- $channel = \App::get_channel();
-
- $r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' and xlink_static = 1",
- dbesc($channel['channel_hash']),
- dbesc(\App::$data['target'])
- );
- if($r) {
- \App::$data['xlink'] = $r[0];
- $rating_val = $r[0]['xlink_rating'];
- $rating_text = $r[0]['xlink_rating_text'];
- }
- else {
- $rating_val = 0;
- $rating_text = '';
- }
-
- if($rating_enabled) {
- $rating = replace_macros(get_markup_template('rating_slider.tpl'),array(
- '$min' => -10,
- '$val' => $rating_val
- ));
- }
- else {
- $rating = false;
- }
-
- $o = replace_macros(get_markup_template('rating_form.tpl'),array(
- '$header' => t('Rating'),
- '$website' => t('Website:'),
- '$site' => ((\App::$data['site']) ? '<a href="' . \App::$data['site']['site_url'] . '" >' . \App::$data['site']['site_url'] . '</a>' : ''),
- 'target' => \App::$data['target'],
- '$tgt_name' => ((\App::$poi && \App::$poi['xchan_name']) ? \App::$poi['xchan_name'] : sprintf( t('Remote Channel [%s] (not yet known on this site)'), substr(\App::$data['target'],0,16))),
- '$lbl_rating' => t('Rating (this information is public)'),
- '$lbl_rating_txt' => t('Optionally explain your rating (this information is public)'),
- '$rating_txt' => $rating_text,
- '$rating' => $rating,
- '$rating_val' => $rating_val,
- '$slide' => $slide,
- '$submit' => t('Submit')
- ));
-
- return $o;
-
- }
-}
diff --git a/Zotlabs/Module/Ratings.php b/Zotlabs/Module/Ratings.php
deleted file mode 100644
index 055b16ca3..000000000
--- a/Zotlabs/Module/Ratings.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-require_once('include/dir_fns.php');
-
-
-class Ratings extends \Zotlabs\Web\Controller {
-
- function init() {
-
- if(observer_prohibited()) {
- return;
- }
-
- if(local_channel())
- load_contact_links(local_channel());
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- $x = find_upstream_directory($dirmode);
- if($x)
- $url = $x['url'];
-
- $rating_enabled = get_config('system','rating_enabled');
-
- if(! $rating_enabled)
- return;
-
- if(argc() > 1)
- $hash = argv(1);
-
- if(! $hash) {
- notice('Must supply a channel identififier.');
- return;
- }
-
- $results = false;
-
- $x = z_fetch_url($url . '/ratingsearch/' . urlencode($hash));
-
-
- if($x['success'])
- $results = json_decode($x['body'],true);
-
-
- if((! $results) || (! $results['success'])) {
-
- notice('No results.');
- return;
- }
-
- if(array_key_exists('xchan_hash',$results['target']))
- \App::$poi = $results['target'];
-
- $friends = array();
- $others = array();
-
- if($results['ratings']) {
- foreach($results['ratings'] as $n) {
- if(is_array(\App::$contacts) && array_key_exists($n['xchan_hash'],\App::$contacts))
- $friends[] = $n;
- else
- $others[] = $n;
- }
- }
-
- \App::$data = array('target' => $results['target'], 'results' => array_merge($friends,$others));
-
- if(! \App::$data['results']) {
- notice( t('No ratings') . EOL);
- }
-
- return;
- }
-
-
-
-
-
- function get() {
-
- if(observer_prohibited()) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- $rating_enabled = get_config('system','rating_enabled');
-
- if(! $rating_enabled)
- return;
-
- $site_target = ((array_key_exists('target',\App::$data) && array_key_exists('site_url',\App::$data['target'])) ?
- '<a href="' . \App::$data['target']['site_url'] . '" >' . \App::$data['target']['site_url'] . '</a>' : '');
-
-
- $o = replace_macros(get_markup_template('prep.tpl'),array(
- '$header' => t('Ratings'),
- '$rating_lbl' => t('Rating: ' ),
- '$website' => t('Website: '),
- '$site' => $site_target,
- '$rating_text_lbl' => t('Description: '),
- '$raters' => \App::$data['results']
- ));
-
- return $o;
- }
-
-
-}
diff --git a/Zotlabs/Module/Ratingsearch.php b/Zotlabs/Module/Ratingsearch.php
deleted file mode 100644
index dcbfd6a9b..000000000
--- a/Zotlabs/Module/Ratingsearch.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-
-class Ratingsearch extends \Zotlabs\Web\Controller {
-
- function init() {
-
- $ret = array('success' => false);
-
- $dirmode = intval(get_config('system','directory_mode'));
-
- if($dirmode == DIRECTORY_MODE_NORMAL) {
- $ret['message'] = 'This site is not a directory server.';
- json_return_and_die($ret);
- }
-
- if(argc() > 1)
- $hash = argv(1);
-
- if(! $hash) {
- $ret['message'] = 'No channel identifier';
- json_return_and_die($ret);
- }
-
- if(strpos($hash,'@')) {
- $r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
- dbesc($hash)
- );
- if($r)
- $hash = $r[0]['hubloc_hash'];
- }
-
- $p = q("select * from xchan where xchan_hash like '%s'",
- dbesc($hash . '%')
- );
-
- if($p)
- $target = $p[0]['xchan_hash'];
- else {
- $p = q("select * from site where site_url like '%s' and site_type = %d ",
- dbesc('%' . $hash),
- intval(SITE_TYPE_ZOT)
- );
- if($p) {
- $target = strtolower($hash);
- }
- else {
- $ret['message'] = 'Rating target not found';
- json_return_and_die($ret);
- }
- }
-
- if($p)
- $ret['target'] = $p[0];
-
- $ret['success'] = true;
-
- $r = q("select * from xlink left join xchan on xlink_xchan = xchan_hash
- where xlink_link = '%s' and xlink_rating != 0 and xlink_static = 1
- and xchan_hidden = 0 and xchan_orphan = 0 and xchan_deleted = 0
- order by xchan_name asc",
- dbesc($target)
- );
-
- if($r) {
- $ret['ratings'] = $r;
- }
- else
- $ret['ratings'] = array();
-
- json_return_and_die($ret);
-
- }
-
-
-}
diff --git a/Zotlabs/Module/Rbmark.php b/Zotlabs/Module/Rbmark.php
index 226cef69e..87b774495 100644
--- a/Zotlabs/Module/Rbmark.php
+++ b/Zotlabs/Module/Rbmark.php
@@ -6,12 +6,11 @@ require_once('include/crypto.php');
require_once('include/items.php');
require_once('include/taxonomy.php');
require_once('include/conversation.php');
-require_once('include/zot.php');
require_once('include/bookmarks.php');
/**
* remote bookmark
- *
+ *
* https://yoursite/rbmark?f=&title=&url=&private=&remote_return=
*
* This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
@@ -31,45 +30,45 @@ class Rbmark extends \Zotlabs\Web\Controller {
function post() {
if($_POST['submit'] !== t('Save'))
return;
-
+
logger('rbmark_post: ' . print_r($_REQUEST,true));
-
+
$channel = \App::get_channel();
-
+
$t = array('url' => escape_tags($_REQUEST['url']),'term' => escape_tags($_REQUEST['title']));
bookmark_add($channel,$channel,$t,((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
array('menu_id' => ((x($_REQUEST,'menu_id')) ? intval($_REQUEST['menu_id']) : 0),
'menu_name' => ((x($_REQUEST,'menu_name')) ? escape_tags($_REQUEST['menu_name']) : ''),
'ischat' => ((x($_REQUEST['ischat'])) ? intval($_REQUEST['ischat']) : 0)
));
-
+
goaway(z_root() . '/bookmarks');
-
+
}
-
-
+
+
function get() {
-
+
$o = '';
-
+
if(! local_channel()) {
-
+
// The login procedure is going to bugger our $_REQUEST variables
// so save them in the session.
-
+
if(array_key_exists('url',$_REQUEST)) {
$_SESSION['bookmark'] = $_REQUEST;
}
return login();
}
-
+
// If we have saved rbmark session variables, but nothing in the current $_REQUEST, recover the saved variables
-
+
if((! array_key_exists('url',$_REQUEST)) && (array_key_exists('bookmark',$_SESSION))) {
$_REQUEST = $_SESSION['bookmark'];
unset($_SESSION['bookmark']);
}
-
+
if($_REQUEST['remote_return']) {
$_SESSION['remote_return'] = $_REQUEST['remote_return'];
}
@@ -78,12 +77,12 @@ class Rbmark extends \Zotlabs\Web\Controller {
goaway($_SESSION['remote_return']);
goaway(z_root() . '/bookmarks');
}
-
+
$channel = \App::get_channel();
-
-
+
+
$m = menu_list($channel['channel_id'],'',MENU_BOOKMARK);
-
+
$menus = array();
if($m) {
$menus = array(0 => '');
@@ -92,10 +91,10 @@ class Rbmark extends \Zotlabs\Web\Controller {
}
}
$menu_select = array('menu_id',t('Select a bookmark folder'),false,'',$menus);
-
-
+
+
$o .= replace_macros(get_markup_template('rbmark.tpl'), array(
-
+
'$header' => t('Save Bookmark'),
'$url' => array('url',t('URL of bookmark'),escape_tags($_REQUEST['url'])),
'$title' => array('title',t('Description'),escape_tags($_REQUEST['title'])),
@@ -104,18 +103,18 @@ class Rbmark extends \Zotlabs\Web\Controller {
'$submit' => t('Save'),
'$menu_name' => array('menu_name',t('Or enter new bookmark folder name'),'',''),
'$menus' => $menu_select
-
+
));
-
-
-
-
-
-
+
+
+
+
+
+
return $o;
-
+
}
-
-
-
+
+
+
}
diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php
index 031270845..80ad289b2 100644
--- a/Zotlabs/Module/Rpost.php
+++ b/Zotlabs/Module/Rpost.php
@@ -1,12 +1,13 @@
<?php
namespace Zotlabs\Module; /** @file */
+use Zotlabs\Lib\Libzot;
+
require_once('include/acl_selectors.php');
require_once('include/crypto.php');
require_once('include/items.php');
require_once('include/taxonomy.php');
require_once('include/conversation.php');
-require_once('include/zot.php');
/**
* remote post
@@ -42,7 +43,7 @@ class Rpost extends \Zotlabs\Web\Controller {
// by the wretched beast called 'suhosin'. All the browsers now allow long GET requests, but suhosin
// blocks them.
- $url = get_rpost_path(\App::get_observer());
+ $url = Libzot::get_rpost_path(\App::get_observer());
// make sure we're not looping to our own hub
if(($url) && (! stristr($url, \App::get_hostname()))) {
foreach($_GET as $key => $arg) {
diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php
index 79031c98f..624cbb0c1 100644
--- a/Zotlabs/Module/Settings.php
+++ b/Zotlabs/Module/Settings.php
@@ -1,7 +1,6 @@
<?php
namespace Zotlabs\Module; /** @file */
-require_once('include/zot.php');
require_once('include/security.php');
class Settings extends \Zotlabs\Web\Controller {
@@ -11,68 +10,68 @@ class Settings extends \Zotlabs\Web\Controller {
function init() {
if(! local_channel())
return;
-
+
if($_SESSION['delegate'])
return;
-
+
\App::$profile_uid = local_channel();
-
+
// default is channel settings in the absence of other arguments
-
+
if(argc() == 1) {
// We are setting these values - don't use the argc(), argv() functions here
\App::$argc = 2;
\App::$argv[] = 'channel';
- }
+ }
$this->sm = new \Zotlabs\Web\SubModule();
}
-
-
+
+
function post() {
-
+
if(! local_channel())
return;
-
+
if($_SESSION['delegate'])
return;
-
+
// logger('mod_settings: ' . print_r($_REQUEST,true));
-
+
if(argc() > 1) {
if($this->sm->call('post') !== false) {
return;
}
}
-
+
goaway(z_root() . '/settings' );
return; // NOTREACHED
}
-
-
-
+
+
+
function get() {
-
+
nav_set_selected('Settings');
-
+
if((! local_channel()) || ($_SESSION['delegate'])) {
notice( t('Permission denied.') . EOL );
return login();
}
-
-
+
+
$channel = \App::get_channel();
if($channel)
head_set_icon($channel['xchan_photo_s']);
-
+
$o = $this->sm->call('get');
if($o !== false)
return $o;
$o = '';
-
- }
+
+ }
}
diff --git a/Zotlabs/Module/Sse_bs.php b/Zotlabs/Module/Sse_bs.php
index 109b043ad..3316a6beb 100644
--- a/Zotlabs/Module/Sse_bs.php
+++ b/Zotlabs/Module/Sse_bs.php
@@ -100,7 +100,6 @@ class Sse_bs extends Controller {
self::bs_forums(),
self::bs_pubs($pubs),
self::bs_files(),
- self::bs_mail(),
self::bs_all_events(),
self::bs_register(),
self::bs_info_notice()
@@ -634,36 +633,6 @@ class Sse_bs extends Controller {
}
- function bs_mail() {
-
- $result['mail']['notifications'] = [];
- $result['mail']['count'] = 0;
- $result['mail']['offset'] = -1;
-
- if(! self::$uid)
- return $result;
-
- if(! (self::$vnotify & VNOTIFY_MAIL))
- return $result;
-
- $r = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
- where channel_id = %d and mail_seen = 0 and mail_deleted = 0
- and from_xchan != '%s' order by created desc",
- intval(self::$uid),
- dbesc(self::$ob_hash)
- );
-
- if($r) {
- foreach($r as $rr) {
- $result['mail']['notifications'][] = Enotify::format_mail($rr);
- }
- $result['mail']['count'] = count($r);
- }
-
- return $result;
-
- }
-
function bs_all_events() {
$result['all_events']['notifications'] = [];
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
index 787ed5850..72deba305 100644
--- a/Zotlabs/Module/Webpages.php
+++ b/Zotlabs/Module/Webpages.php
@@ -15,26 +15,26 @@ require_once('include/acl_selectors.php');
class Webpages extends Controller {
function init() {
-
+
if(argc() > 1 && argv(1) === 'sys' && is_site_admin()) {
$sys = get_sys_channel();
if($sys && intval($sys['channel_id'])) {
App::$is_sys = true;
}
}
-
+
if(argc() > 1)
$which = argv(1);
else
return;
-
+
profile_load($which);
-
+
}
-
-
+
+
function get() {
-
+
if(! App::$profile) {
notice( t('Requested profile is not available.') . EOL );
App::$error = 404;
@@ -53,13 +53,13 @@ class Webpages extends Controller {
nav_set_selected('Webpages');
$which = argv(1);
-
+
$_SESSION['return_url'] = App::$query_string;
-
+
$uid = local_channel();
$owner = 0;
$observer = App::get_observer();
-
+
$channel = App::get_channel();
switch ($_SESSION['action']) {
@@ -74,7 +74,7 @@ class Webpages extends Controller {
'$blocks' => $_SESSION['blocks'],
));
return $o;
-
+
case 'importselected':
$_SESSION['action'] = null;
break;
@@ -85,7 +85,7 @@ class Webpages extends Controller {
break;
}
require_once('include/import.php');
-
+
$pages = get_webpage_elements($channel, 'pages');
$layouts = get_webpage_elements($channel, 'layouts');
$blocks = get_webpage_elements($channel, 'blocks');
@@ -99,13 +99,13 @@ class Webpages extends Controller {
));
$_SESSION['export'] = null;
return $o;
-
+
default :
$_SESSION['action'] = null;
break;
}
-
-
+
+
if(App::$is_sys && is_site_admin()) {
$sys = get_sys_channel();
if($sys && intval($sys['channel_id'])) {
@@ -114,7 +114,7 @@ class Webpages extends Controller {
$observer = $sys;
}
}
-
+
if(! $owner) {
// Figure out who the page owner is.
$r = q("select channel_id from channel where channel_address = '%s'",
@@ -124,24 +124,24 @@ class Webpages extends Controller {
$owner = intval($r[0]['channel_id']);
}
}
-
+
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
-
+
$perms = get_all_perms($owner,$ob_hash);
-
+
if(! $perms['write_pages']) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
$mimetype = (($_REQUEST['mimetype']) ? $_REQUEST['mimetype'] : get_pconfig($owner,'system','page_mimetype'));
-
+
$layout = (($_REQUEST['layout']) ? $_REQUEST['layout'] : get_pconfig($owner,'system','page_layout'));
-
+
// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
- // Nickname is set to the observers xchan, and profile_uid to the owner's.
+ // Nickname is set to the observers xchan, and profile_uid to the owner's.
// This lets you post pages at other people's channels.
-
+
if((! $channel) && ($uid) && ($uid == App::$profile_uid)) {
$channel = App::get_channel();
}
@@ -156,12 +156,12 @@ class Webpages extends Controller {
else {
$channel_acl = [ 'allow_cid' => '', 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '' ];
}
-
+
$is_owner = ($uid && $uid == $owner);
$o = '';
-
+
$x = array(
'webpage' => ITEM_TYPE_WEBPAGE,
'is_owner' => true,
@@ -183,23 +183,23 @@ class Webpages extends Controller {
'bbco_autocomplete' => 'bbcode',
'bbcode' => true
);
-
+
if($_REQUEST['title'])
$x['title'] = $_REQUEST['title'];
if($_REQUEST['body'])
$x['body'] = $_REQUEST['body'];
if($_REQUEST['pagetitle'])
$x['pagetitle'] = $_REQUEST['pagetitle'];
-
-
- // Get a list of webpages. We can't display all them because endless scroll makes that unusable,
+
+
+ // Get a list of webpages. We can't display all them because endless scroll makes that unusable,
// so just list titles and an edit link.
-
-
+
+
$sql_extra = item_permissions_sql($owner);
-
- $r = q("select * from iconfig left join item on iconfig.iid = item.id
- where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
+
+ $r = q("select * from iconfig left join item on iconfig.iid = item.id
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
$sql_extra order by item.created desc",
intval($owner),
intval(ITEM_TYPE_WEBPAGE)
@@ -211,14 +211,13 @@ class Webpages extends Controller {
$editor = status_editor($a,$x,false,'Webpages');
$pages = null;
-
+
if($r) {
$pages = array();
foreach($r as $rr) {
- unobscure($rr);
-
+
$lockstate = (($rr['allow_cid'] || $rr['allow_gid'] || $rr['deny_cid'] || $rr['deny_gid']) ? 'lock' : 'unlock');
-
+
$element_arr = array(
'type' => 'webpage',
'title' => $rr['title'],
@@ -243,11 +242,11 @@ class Webpages extends Controller {
);
}
}
-
-
+
+
//Build the base URL for edit links
$url = z_root() . '/editwebpage/' . $which;
-
+
$o .= replace_macros(get_markup_template('webpagelist.tpl'), array(
'$listtitle' => t('Webpages'),
'$baseurl' => $url,
@@ -266,19 +265,19 @@ class Webpages extends Controller {
'$created_txt' => t('Created'),
'$edited_txt' => t('Edited')
));
-
+
return $o;
}
-
+
function post() {
$action = $_REQUEST['action'];
if( $action ){
switch ($action) {
case 'scan':
-
+
// the state of this variable tracks whether website files have been scanned (null, true, false)
- $cloud = null;
-
+ $cloud = null;
+
// Website files are to be imported from an uploaded zip file
if(($_FILES) && array_key_exists('zip_file',$_FILES) && isset($_POST['w_upload'])) {
$source = $_FILES["zip_file"]["tmp_name"];
@@ -306,8 +305,8 @@ class Webpages extends Controller {
} else {
notice( t('Error opening zip file') . EOL);
return null;
- }
- }
+ }
+ }
// Website files are to be imported from the channel cloud files
if (($_POST) && array_key_exists('path',$_POST) && isset($_POST['cloudsubmit'])) {
@@ -321,7 +320,7 @@ class Webpages extends Controller {
$cloud = true;
}
-
+
// If the website files were uploaded or specified in the cloud files, then $cloud
// should be either true or false
if ($cloud !== null) {
@@ -345,24 +344,24 @@ class Webpages extends Controller {
notice( t('No webpage elements detected.') . EOL);
$_SESSION['action'] = null;
}
-
+
}
-
+
// If the website elements were imported from a zip file, delete the temporary decompressed files
if ($cloud === false && $website && $elements) {
$_SESSION['tempimportpath'] = $website;
//rrmdir($website); // Delete the temporary decompressed files
}
-
+
break;
-
+
case 'importselected':
require_once('include/import.php');
$channel = App::get_channel();
-
+
// Import layout first so that pages that reference new layouts will find
- // the mid of layout items in the database
-
+ // the mid of layout items in the database
+
// Obtain the user-selected layouts to import and import them
$checkedlayouts = $_POST['layout'];
$layouts = [];
@@ -380,7 +379,7 @@ class Webpages extends Controller {
}
}
$_SESSION['import_layouts'] = $layouts;
-
+
// Obtain the user-selected blocks to import and import them
$checkedblocks = $_POST['block'];
$blocks = [];
@@ -398,7 +397,7 @@ class Webpages extends Controller {
}
}
$_SESSION['import_blocks'] = $blocks;
-
+
// Obtain the user-selected pages to import and import them
$checkedpages = $_POST['page'];
$pages = [];
@@ -424,9 +423,9 @@ class Webpages extends Controller {
unset($_SESSION['tempimportpath']);
}
break;
-
+
case 'exportzipfile':
-
+
if(isset($_POST['w_download'])) {
$_SESSION['action'] = 'export_select_list';
$_SESSION['export'] = 'zipfile';
@@ -436,45 +435,45 @@ class Webpages extends Controller {
$filename = 'website.zip';
}
$_SESSION['zipfilename'] = $filename;
-
+
}
-
+
break;
-
+
case 'exportcloud':
if(isset($_POST['exportcloudpath']) && $_POST['exportcloudpath'] !== '') {
$_SESSION['action'] = 'export_select_list';
$_SESSION['export'] = 'cloud';
$_SESSION['exportcloudpath'] = filter_var($_POST['exportcloudpath'], FILTER_SANITIZE_ENCODED);
}
-
+
break;
-
+
case 'cloud':
case 'zipfile':
-
+
$channel = App::get_channel();
-
+
$tmp_folder_name = random_string(10);
$zip_folder_name = random_string(10);
$zip_filename = $_SESSION['zipfilename'];
$tmp_folderpath = '/tmp/' . $tmp_folder_name;
$zip_folderpath = '/tmp/' . $zip_folder_name;
- if (!mkdir($zip_folderpath, 0770, false)) {
+ if (!mkdir($zip_folderpath, 0770, false)) {
logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL);
json_return_and_die(array('message' => 'Error creating zip file export folder'));
}
$zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename;
-
+
$checkedblocks = $_POST['block'];
$blocks = [];
if (!empty($checkedblocks)) {
foreach ($checkedblocks as $mid) {
- $b = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
- left join item on item.id = iconfig.iid
+ $b = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
+ left join item on item.id = iconfig.iid
where mid = '%s' and item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'BUILDBLOCK' order by iconfig.v asc limit 1",
dbesc($mid),
- intval($channel['channel_id'])
+ intval($channel['channel_id'])
);
if($b) {
$b = $b[0];
@@ -514,25 +513,25 @@ class Webpages extends Controller {
$block_filepath = $tmp_blockfolder . '/' . $block_filename;
$blockinfo['json']['contentfile'] = $block_filename;
$block_jsonpath = $tmp_blockfolder . '/block.json';
- if (!is_dir($tmp_blockfolder) && !mkdir($tmp_blockfolder, 0770, true)) {
+ if (!is_dir($tmp_blockfolder) && !mkdir($tmp_blockfolder, 0770, true)) {
logger('Error creating temp export folder: ' . $tmp_blockfolder, LOGGER_NORMAL);
json_return_and_die(array('message' => 'Error creating temp export folder'));
}
file_put_contents($block_filepath, $blockinfo['body']);
- file_put_contents($block_jsonpath, json_encode($blockinfo['json'], JSON_UNESCAPED_SLASHES));
+ file_put_contents($block_jsonpath, json_encode($blockinfo['json'], JSON_UNESCAPED_SLASHES));
}
}
}
-
+
$checkedlayouts = $_POST['layout'];
$layouts = [];
if (!empty($checkedlayouts)) {
foreach ($checkedlayouts as $mid) {
- $l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
- left join item on item.id = iconfig.iid
+ $l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
+ left join item on item.id = iconfig.iid
where mid = '%s' and item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' order by iconfig.v asc limit 1",
dbesc($mid),
- intval($channel['channel_id'])
+ intval($channel['channel_id'])
);
if($l) {
$l = $l[0];
@@ -558,38 +557,38 @@ class Webpages extends Controller {
$layout_filepath = $tmp_layoutfolder . '/' . $layout_filename;
$layoutinfo['json']['contentfile'] = $layout_filename;
$layout_jsonpath = $tmp_layoutfolder . '/layout.json';
- if (!is_dir($tmp_layoutfolder) && !mkdir($tmp_layoutfolder, 0770, true)) {
+ if (!is_dir($tmp_layoutfolder) && !mkdir($tmp_layoutfolder, 0770, true)) {
logger('Error creating temp export folder: ' . $tmp_layoutfolder, LOGGER_NORMAL);
json_return_and_die(array('message' => 'Error creating temp export folder'));
}
file_put_contents($layout_filepath, $layoutinfo['body']);
- file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES));
+ file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES));
}
}
}
-
+
$checkedpages = $_POST['page'];
$pages = [];
if (!empty($checkedpages)) {
foreach ($checkedpages as $mid) {
-
- $p = q("select * from iconfig left join item on iconfig.iid = item.id
+
+ $p = q("select * from iconfig left join item on iconfig.iid = item.id
where item.uid = %d and item.mid = '%s' and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d",
intval($channel['channel_id']),
dbesc($mid),
intval(ITEM_TYPE_WEBPAGE)
);
-
+
if($p) {
foreach ($p as $pp) {
// Get the associated layout
$layoutinfo = array();
if($pp['layout_mid']) {
- $l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
- left join item on item.id = iconfig.iid
+ $l = q("select iconfig.v, iconfig.k, mimetype, title, body from iconfig
+ left join item on item.id = iconfig.iid
where mid = '%s' and item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' order by iconfig.v asc limit 1",
dbesc($pp['layout_mid']),
- intval($channel['channel_id'])
+ intval($channel['channel_id'])
);
if($l) {
$l = $l[0];
@@ -614,12 +613,12 @@ class Webpages extends Controller {
$layout_filepath = $tmp_layoutfolder . '/' . $layout_filename;
$layoutinfo['json']['contentfile'] = $layout_filename;
$layout_jsonpath = $tmp_layoutfolder . '/layout.json';
- if (!is_dir($tmp_layoutfolder) && !mkdir($tmp_layoutfolder, 0770, true)) {
+ if (!is_dir($tmp_layoutfolder) && !mkdir($tmp_layoutfolder, 0770, true)) {
logger('Error creating temp export folder: ' . $tmp_layoutfolder, LOGGER_NORMAL);
json_return_and_die(array('message' => 'Error creating temp export folder'));
}
file_put_contents($layout_filepath, $layoutinfo['body']);
- file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES));
+ file_put_contents($layout_jsonpath, json_encode($layoutinfo['json'], JSON_UNESCAPED_SLASHES));
}
}
switch ($pp['mimetype']) {
@@ -660,14 +659,14 @@ class Webpages extends Controller {
$page_filepath = $tmp_pagefolder . '/' . $page_filename;
$page_jsonpath = $tmp_pagefolder . '/page.json';
$pageinfo['json']['contentfile'] = $page_filename;
- if (!is_dir($tmp_pagefolder) && !mkdir($tmp_pagefolder, 0770, true)) {
+ if (!is_dir($tmp_pagefolder) && !mkdir($tmp_pagefolder, 0770, true)) {
logger('Error creating temp export folder: ' . $tmp_pagefolder, LOGGER_NORMAL);
json_return_and_die(array('message' => 'Error creating temp export folder'));
}
file_put_contents($page_filepath, $pageinfo['body']);
file_put_contents($page_jsonpath, json_encode($pageinfo['json'], JSON_UNESCAPED_SLASHES));
}
- }
+ }
}
}
if($action === 'zipfile') {
@@ -686,23 +685,23 @@ class Webpages extends Controller {
if(!$dirpath) {
$x = attach_mkdirp($channel, $channel['channel_hash'], array('pathname' => $cloudpath));
$folder_hash = (($x['success']) ? $x['data']['hash'] : '');
-
+
if (!$x['success']) {
logger('Failed to create cloud file folder', LOGGER_NORMAL);
}
$dirpath = get_dirpath_by_cloudpath($channel, $cloudpath);
if (!is_dir($dirpath)) {
logger('Failed to create cloud file folder', LOGGER_NORMAL);
- }
+ }
}
-
+
$success = copy_folder_to_cloudfiles($channel, $channel['channel_hash'], $tmp_folderpath, $cloudpath);
}
}
if(!$success) {
logger('Error exporting webpage elements', LOGGER_NORMAL);
}
-
+
rrmdir($zip_folderpath); rrmdir($tmp_folderpath); // delete temporary files
killme();
@@ -710,9 +709,9 @@ class Webpages extends Controller {
default :
break;
}
-
+
}
-
+
}
-
+
}
diff --git a/Zotlabs/Module/Well_known.php b/Zotlabs/Module/Well_known.php
index 0d7b222b8..af59b76e0 100644
--- a/Zotlabs/Module/Well_known.php
+++ b/Zotlabs/Module/Well_known.php
@@ -5,36 +5,28 @@ namespace Zotlabs\Module;
class Well_known extends \Zotlabs\Web\Controller {
function init(){
-
+
if(argc() > 1) {
-
+
$arr = array('server' => $_SERVER, 'request' => $_REQUEST);
call_hooks('well_known', $arr);
-
-
+
+
if(! check_siteallowed($_SERVER['REMOTE_ADDR'])) {
logger('well_known: site not allowed. ' . $_SERVER['REMOTE_ADDR']);
killme();
}
-
+
// from php.net re: REMOTE_HOST:
- // Note: Your web server must be configured to create this variable. For example in Apache
- // you'll need HostnameLookups On inside httpd.conf for it to exist. See also gethostbyaddr().
-
+ // Note: Your web server must be configured to create this variable. For example in Apache
+ // you'll need HostnameLookups On inside httpd.conf for it to exist. See also gethostbyaddr().
+
if(get_config('system','siteallowed_remote_host') && (! check_siteallowed($_SERVER['REMOTE_HOST']))) {
logger('well_known: site not allowed. ' . $_SERVER['REMOTE_HOST']);
killme();
}
-
+
switch(argv(1)) {
- case 'zot-info':
- \App::$argc -= 1;
- array_shift(\App::$argv);
- \App::$argv[0] = 'zfinger';
- $module = new \Zotlabs\Module\Zfinger();
- $module->init();
- break;
-
case 'webfinger':
\App::$argc -= 1;
array_shift(\App::$argv);
@@ -42,7 +34,7 @@ class Well_known extends \Zotlabs\Web\Controller {
$module = new \Zotlabs\Module\Wfinger();
$module->init();
break;
-
+
case 'host-meta':
\App::$argc -= 1;
array_shift(\App::$argv);
@@ -63,7 +55,7 @@ class Well_known extends \Zotlabs\Web\Controller {
case 'dnt-policy.txt':
echo file_get_contents('doc/dnt-policy.txt');
killme();
-
+
case 'caldav':
case 'carddav':
if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
@@ -73,16 +65,16 @@ class Well_known extends \Zotlabs\Web\Controller {
default:
if(file_exists(\App::$cmd)) {
- echo file_get_contents(\App::$cmd);
+ echo file_get_contents(\App::$cmd);
killme();
}
elseif(file_exists(\App::$cmd . '.php'))
require_once(\App::$cmd . '.php');
break;
-
+
}
}
-
+
http_status_exit(404);
}
}
diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php
index 46da7f007..6dedc1ef1 100644
--- a/Zotlabs/Module/Wfinger.php
+++ b/Zotlabs/Module/Wfinger.php
@@ -1,8 +1,6 @@
<?php
namespace Zotlabs\Module;
-require_once('include/zot.php');
-
use Zotlabs\Lib\Keyutils;
use Zotlabs\Lib\Libzot;
@@ -21,7 +19,7 @@ class Wfinger extends \Zotlabs\Web\Controller {
elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
$scheme = 'https';
elseif(x($_SERVER,'HTTP_X_FORWARDED_PROTO') && ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
- $scheme = 'https';
+ $scheme = 'https';
$zot = intval($_REQUEST['zot']);
@@ -69,7 +67,7 @@ class Wfinger extends \Zotlabs\Web\Controller {
$channel = substr($channel,1);
$channel = substr($channel,0,-1);
$pchan = true;
- $r = q("select * from pchan left join xchan on pchan_hash = xchan_hash
+ $r = q("select * from pchan left join xchan on pchan_hash = xchan_hash
where pchan_guid = '%s' limit 1",
dbesc($channel)
);
@@ -78,7 +76,7 @@ class Wfinger extends \Zotlabs\Web\Controller {
}
}
else {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash
where channel_address = '%s' limit 1",
dbesc($channel)
);
diff --git a/Zotlabs/Module/Zfinger.php b/Zotlabs/Module/Zfinger.php
deleted file mode 100644
index ce7117ad8..000000000
--- a/Zotlabs/Module/Zfinger.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-use Zotlabs\Web\HTTPSig;
-use Zotlabs\Lib\Libzot;
-
-class Zfinger extends \Zotlabs\Web\Controller {
-
- function init() {
-
- require_once('include/zot.php');
- require_once('include/crypto.php');
-
- $x = zotinfo($_REQUEST);
-
- if($x && $x['guid'] && $x['guid_sig']) {
- $chan_hash = make_xchan_hash($x['guid'],$x['guid_sig']);
- if($chan_hash) {
- $chan = channelx_by_hash($chan_hash);
- }
- }
-
- $headers = [];
- $headers['Content-Type'] = 'application/json' ;
- $ret = json_encode($x);
-
- if($chan) {
- $headers['Digest'] = HTTPSig::generate_digest_header($ret);
- $h = HTTPSig::create_sig($headers,$chan['channel_prvkey'], channel_url($chan));
- HTTPSig::set_headers($h);
- }
- else {
- foreach($headers as $k => $v) {
- header($k . ': ' . $v);
- }
- }
-
- echo $ret;
- killme();
-
- }
-
-}
diff --git a/Zotlabs/Module/Zping.php b/Zotlabs/Module/Zping.php
deleted file mode 100644
index d6128fa66..000000000
--- a/Zotlabs/Module/Zping.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-namespace Zotlabs\Module; /** @file */
-
-require_once('include/zot.php');
-
-
-class Zping extends \Zotlabs\Web\Controller {
-
- function get() {
-
- // This is just a test utility function and may go away once we build these tools into
- // the address book and directory to do dead site discovery.
-
- // The response packet include the current URL and key so we can discover if the server
- // has been re-installed and clean up (e.g. get rid of) any old hublocs and xchans.
-
- // Remember to add '/post' to the url
-
- if(! local_channel())
- return;
-
- $url = $_REQUEST['url'];
-
- if(! $url)
- return;
-
-
- $m = zot_build_packet(\App::get_channel(),'ping');
- $r = zot_zot($url,$m);
- return print_r($r,true);
-
- }
-}
diff --git a/Zotlabs/Widget/Conversations.php b/Zotlabs/Widget/Conversations.php
index 267d50fa0..3dc260b50 100644
--- a/Zotlabs/Widget/Conversations.php
+++ b/Zotlabs/Widget/Conversations.php
@@ -9,67 +9,154 @@ class Conversations {
if (! local_channel())
return;
- if(argc() > 1) {
+ switch(argv(1)) {
+ case 'inbox':
+ $mailbox = 'inbox';
+ $header = t('Received Messages');
+ break;
+ case 'outbox':
+ $mailbox = 'outbox';
+ $header = t('Sent Messages');
+ break;
+ default:
+ $mailbox = 'combined';
+ $header = t('Conversations');
+ break;
+ }
+
+ $o = '';
+
+ // private_messages_list() can do other more complicated stuff, for now keep it simple
+ $r = self::private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
+
+ if(! $r) {
+ info( t('No messages.') . EOL);
+ return $o;
+ }
+
+ $messages = [];
+
+ foreach($r as $rr) {
+
+ $selected = ((argc() == 3) ? intval(argv(2)) == intval($rr['id']) : $r[0]['id'] == $rr['id']);
+
+ $messages[] = [
+ 'mailbox' => $mailbox,
+ 'id' => $rr['id'],
+ 'from_name' => $rr['from']['xchan_name'],
+ 'from_url' => chanlink_hash($rr['from_xchan']),
+ 'from_photo' => $rr['from']['xchan_photo_s'],
+ 'to_name' => $rr['to']['xchan_name'],
+ 'to_url' => chanlink_hash($rr['to_xchan']),
+ 'to_photo' => $rr['to']['xchan_photo_s'],
+ 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
+ 'delete' => t('Delete conversation'),
+ 'body' => $rr['body'],
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
+ 'seen' => $rr['seen'],
+ 'selected' => ((argv(1) != 'new') ? $selected : '')
+ ];
+ }
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $o .= replace_macros($tpl, [
+ '$header' => $header,
+ '$messages' => $messages
+ ]);
+
+ return $o;
+ }
+
+ function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
+
+ $where = '';
+ $limit = '';
+
+ $t0 = dba_timer();
+
+ if($numitems)
+ $limit = " LIMIT " . intval($numitems) . " OFFSET " . intval($start);
+
+ if($mailbox !== '') {
+ $x = q("select channel_hash from channel where channel_id = %d limit 1",
+ intval($uid)
+ );
+
+ if(! $x)
+ return array();
+
+ $channel_hash = dbesc($x[0]['channel_hash']);
+ $local_channel = intval(local_channel());
+
+ switch($mailbox) {
- switch(argv(1)) {
case 'inbox':
- $mailbox = 'inbox';
- $header = t('Received Messages');
+ $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan != '$channel_hash' ORDER BY created DESC $limit";
break;
+
case 'outbox':
- $mailbox = 'outbox';
- $header = t('Sent Messages');
+ $sql = "SELECT * FROM mail WHERE channel_id = $local_channel AND from_xchan = '$channel_hash' ORDER BY created DESC $limit";
break;
+
+ case 'combined':
default:
- $mailbox = 'combined';
- $header = t('Conversations');
+ $parents = q("SELECT mail.parent_mid FROM mail LEFT JOIN conv ON mail.conv_guid = conv.guid WHERE mail.mid = mail.parent_mid AND mail.channel_id = %d ORDER BY conv.updated DESC $limit",
+ intval($local_channel)
+ );
break;
}
- require_once('include/message.php');
+ }
- $o = '';
+ $r = null;
- // private_messages_list() can do other more complicated stuff, for now keep it simple
- $r = private_messages_list(local_channel(), $mailbox, \App::$pager['start'], \App::$pager['itemspage']);
+ if($parents) {
+ foreach($parents as $parent) {
+ $all = q("SELECT * FROM mail WHERE parent_mid = '%s' AND channel_id = %d ORDER BY created DESC limit 1",
+ dbesc($parent['parent_mid']),
+ intval($local_channel)
+ );
- if(! $r) {
- info( t('No messages.') . EOL);
- return $o;
+ if($all) {
+ foreach($all as $single) {
+ $r[] = $single;
+ }
+ }
}
+ }
+ elseif($sql) {
+ $r = q($sql);
+ }
- $messages = [];
-
- foreach($r as $rr) {
-
- $selected = ((argc() == 3) ? intval(argv(2)) == intval($rr['id']) : $r[0]['id'] == $rr['id']);
-
- $messages[] = [
- 'mailbox' => $mailbox,
- 'id' => $rr['id'],
- 'from_name' => $rr['from']['xchan_name'],
- 'from_url' => chanlink_hash($rr['from_xchan']),
- 'from_photo' => $rr['from']['xchan_photo_s'],
- 'to_name' => $rr['to']['xchan_name'],
- 'to_url' => chanlink_hash($rr['to_xchan']),
- 'to_photo' => $rr['to']['xchan_photo_s'],
- 'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
- 'delete' => t('Delete conversation'),
- 'body' => $rr['body'],
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
- 'seen' => $rr['seen'],
- 'selected' => ((argv(1) != 'new') ? $selected : '')
- ];
- }
+ if(! $r) {
+ return array();
+ }
- $tpl = get_markup_template('mail_head.tpl');
- $o .= replace_macros($tpl, [
- '$header' => $header,
- '$messages' => $messages
- ]);
+ $chans = array();
+ foreach($r as $rr) {
+ $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ }
+ $c = q("select * from xchan where xchan_hash in (" . protect_sprintf(implode(',',$chans)) . ")");
+
+ foreach($r as $k => $rr) {
+ $r[$k]['from'] = find_xchan_in_array($rr['from_xchan'],$c);
+ $r[$k]['to'] = find_xchan_in_array($rr['to_xchan'],$c);
+ $r[$k]['seen'] = intval($rr['mail_seen']);
+ if(intval($r[$k]['mail_obscured'])) {
+ if($r[$k]['title'])
+ $r[$k]['title'] = base64url_decode(str_rot47($r[$k]['title']));
+ if($r[$k]['body'])
+ $r[$k]['body'] = base64url_decode(str_rot47($r[$k]['body']));
+ }
}
- return $o;
+
+ return $r;
}
}
diff --git a/Zotlabs/Widget/Dirtags.php b/Zotlabs/Widget/Dirtags.php
index f211d5942..246c47dde 100644
--- a/Zotlabs/Widget/Dirtags.php
+++ b/Zotlabs/Widget/Dirtags.php
@@ -2,8 +2,6 @@
namespace Zotlabs\Widget;
-require_once('include/dir_fns.php');
-
class Dirtags {
function widget($arr) {
diff --git a/Zotlabs/Widget/Mailmenu.php b/Zotlabs/Widget/Mailmenu.php
index 512f7d9c0..ca022c807 100644
--- a/Zotlabs/Widget/Mailmenu.php
+++ b/Zotlabs/Widget/Mailmenu.php
@@ -14,7 +14,7 @@ class Mailmenu {
'$combined' => array(
'label' => t('Combined View'),
'url' => z_root() . '/mail/combined',
- 'sel' => (argv(1) == 'combined'),
+ 'sel' => (argv(1) == 'combined' || argc() == 1),
),
'$inbox' => array(
'label' => t('Inbox'),
@@ -26,11 +26,13 @@ class Mailmenu {
'url' => z_root() . '/mail/outbox',
'sel' => (argv(1) == 'outbox'),
),
+/*
'$new' => array(
'label' => t('New Message'),
'url' => z_root() . '/mail/new',
'sel'=> (argv(1) == 'new'),
)
+*/
));
}
}
diff --git a/Zotlabs/Widget/Notifications.php b/Zotlabs/Widget/Notifications.php
index dd5a6cd46..d59312148 100644
--- a/Zotlabs/Widget/Notifications.php
+++ b/Zotlabs/Widget/Notifications.php
@@ -68,21 +68,6 @@ class Notifications {
];
$notifications[] = [
- 'type' => 'mail',
- 'icon' => 'envelope',
- 'severity' => 'danger',
- 'label' => t('New Mails'),
- 'title' => t('New Mails Notifications'),
- 'viewall' => [
- 'url' => 'mail/combined',
- 'label' => t('View your private mails')
- ],
- 'markall' => [
- 'label' => t('Mark all messages seen')
- ]
- ];
-
- $notifications[] = [
'type' => 'all_events',
'icon' => 'calendar',
'severity' => 'secondary',
@@ -187,4 +172,4 @@ class Notifications {
}
}
-
+
diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php
deleted file mode 100644
index 6ce2174f7..000000000
--- a/Zotlabs/Zot/Auth.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot;
-
-use Zotlabs\Lib\Crypto;
-
-class Auth {
-
- protected $test;
- protected $test_results;
- protected $debug_msg;
-
- protected $address;
- protected $desturl;
- protected $sec;
- protected $version;
- protected $delegate;
- protected $success;
- protected $delegate_success;
-
- protected $remote;
- protected $remote_service_class;
- protected $remote_level;
- protected $remote_hub;
- protected $dnt;
-
- function __construct($req) {
-
-
- $this->test = ((array_key_exists('test',$req)) ? intval($req['test']) : 0);
- $this->test_results = array('success' => false);
- $this->debug_msg = '';
-
- $this->success = false;
- $this->address = $req['auth'];
- $this->desturl = $req['dest'];
- $this->sec = $req['sec'];
- $this->version = $req['version'];
- $this->delegate = $req['delegate'];
-
- $c = get_sys_channel();
- if(! $c) {
- logger('unable to obtain response (sys) channel');
- $this->Debug('no local channels found.');
- $this->Finalise();
- }
-
- if(strpbrk($this->sec,'.:')) {
- logger('illegal security context');
- $this->Debug('illegal security context.');
- $this->Finalise();
- }
-
- $x = $this->GetHublocs($this->address);
-
- if($x) {
- foreach($x as $xx) {
- if($this->Verify($c,$xx))
- break;
- }
- }
-
- /**
- * @FIXME we really want to save the return_url in the session before we
- * visit rmagic. This does however prevent a recursion if you visit
- * rmagic directly, as it would otherwise send you back here again.
- * But z_root() probably isn't where you really want to go.
- */
-
- if(strstr($this->desturl,z_root() . '/rmagic'))
- goaway(z_root());
-
- $this->Finalise();
-
- }
-
- function GetHublocs($address) {
-
- // Try and find a hubloc for the person attempting to auth.
- // Since we're matching by address, we have to return all entries
- // some of which may be from re-installed hubs; and we'll need to
- // try each sequentially to see if one can pass the test
-
- $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash
- where hubloc_addr = '%s' order by hubloc_id desc",
- dbesc($address)
- );
-
- if(! $x) {
- // finger them if they can't be found.
- $j = Finger::run($address, null);
- if ($j['success']) {
- import_xchan($j);
- $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash
- where hubloc_addr = '%s' order by hubloc_id desc",
- dbesc($address)
- );
- }
- }
- if(! $x) {
- logger('mod_zot: auth: unable to finger ' . $address);
- $this->Debug('no hubloc found for ' . $address . ' and probing failed.');
- $this->Finalise();
- }
-
- return $x;
- }
-
-
- function Verify($channel,$hubloc) {
-
- logger('auth request received from ' . $hubloc['hubloc_addr'] );
-
- $this->remote = remote_channel();
- $this->remote_service_class = '';
- $this->remote_level = 0;
- $this->remote_hub = $hubloc['hubloc_url'];
- $this->dnt = 0;
-
- if(! $this->sec) {
- logger('missing security context.');
- if($this->test)
- $this->Debug('missing security context.');
- return false;
- }
-
-
- // check credentials and access
-
- // If they are already authenticated and haven't changed credentials,
- // we can save an expensive network round trip and improve performance.
-
- // Also check that they are coming from the same site as they authenticated with originally.
-
- $already_authed = (((remote_channel()) && ($hubloc['hubloc_hash'] == remote_channel())
- && ($hubloc['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false);
-
- if($this->delegate && $this->delegate !== $_SESSION['delegate_channel'])
- $already_authed = false;
-
- if($already_authed)
- return true;
-
- if(local_channel()) {
-
- // tell them to logout if they're logged in locally as anything but the target remote account
- // in which case just shut up because they don't need to be doing this at all.
-
- if (\App::$channel['channel_hash'] == $hubloc['xchan_hash']) {
- return true;
- }
- else {
- logger('already authenticated locally as somebody else.');
- notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL);
- if($this->test) {
- $this->Debug('already logged in locally with a conflicting identity.');
- return false;
- }
- }
- return false;
- }
-
- // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the
- // site private key
- // The actual channel sending the packet ($c[0]) is not important, but this provides a
- // generic zot packet with a sender which can be verified
-
- $x = q("select site_crypto from site where site_url = '%s' limit 1",
- dbesc($hubloc['hubloc_url'])
- );
-
- $p = zot_build_packet($channel,$type = 'auth_check',
- array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])),
- $hubloc['hubloc_sitekey'], (($x) ? $x[0]['site_crypto'] : ''), $this->sec);
-
- $this->Debug('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']);
- $this->Debug('packet contents: ' . $p);
-
- $result = zot_zot($hubloc['hubloc_callback'],$p);
- if(! $result['success']) {
- logger('auth_check callback failed.');
- if($this->test)
- $this->Debug('auth check request to your site returned .' . print_r($result, true));
- return false;
- }
-
- $j = json_decode($result['body'], true);
- if(! $j) {
- logger('auth_check json data malformed.');
- if($this->test)
- $this->Debug('json malformed: ' . $result['body']);
- return false;
- }
-
- $this->Debug('auth check request returned ' . print_r($j, true));
-
- if(! $j['success'])
- return false;
-
- // legit response, but we do need to check that this wasn't answered by a man-in-middle
-
- if (! Crypto::verify($this->sec . $hubloc['xchan_hash'],base64url_decode($j['confirm']),$hubloc['xchan_pubkey'])) {
- logger('final confirmation failed.');
- if($this->test)
- $this->Debug('final confirmation failed. ' . $sec . print_r($j,true) . print_r($hubloc,true));
- return false;
- }
-
- if (array_key_exists('service_class',$j))
- $this->remote_service_class = $j['service_class'];
- if (array_key_exists('level',$j))
- $this->remote_level = $j['level'];
- if (array_key_exists('DNT',$j))
- $this->dnt = $j['DNT'];
-
-
- // log them in
-
- if ($this->test) {
- // testing only - return the success result
- $this->test_results['success'] = true;
- $this->Debug('Authentication Success!');
- $this->Finalise();
- }
-
- $_SESSION['authenticated'] = 1;
-
- // check for delegation and if all is well, log them in locally with delegation restrictions
-
- $this->delegate_success = false;
-
- if($this->delegate) {
- $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1",
- dbesc($this->delegate)
- );
- if ($r && intval($r[0]['channel_id'])) {
- $allowed = perm_is_allowed($r[0]['channel_id'],$hubloc['xchan_hash'],'delegate');
- if($allowed) {
- $_SESSION['delegate_channel'] = $r[0]['channel_id'];
- $_SESSION['delegate'] = $hubloc['xchan_hash'];
- $_SESSION['account_id'] = intval($r[0]['channel_account_id']);
- require_once('include/security.php');
- // this will set the local_channel authentication in the session
- change_channel($r[0]['channel_id']);
- $this->delegate_success = true;
- }
- }
- }
-
- if (! $this->delegate_success) {
- // normal visitor (remote_channel) login session credentials
- $_SESSION['visitor_id'] = $hubloc['xchan_hash'];
- $_SESSION['my_url'] = $hubloc['xchan_url'];
- $_SESSION['my_address'] = $this->address;
- $_SESSION['remote_service_class'] = $this->remote_service_class;
- $_SESSION['remote_level'] = $this->remote_level;
- $_SESSION['remote_hub'] = $this->remote_hub;
- $_SESSION['DNT'] = $this->dnt;
- }
-
- $arr = array('xchan' => $hubloc, 'url' => $this->desturl, 'session' => $_SESSION);
- call_hooks('magic_auth_success',$arr);
- \App::set_observer($hubloc);
- require_once('include/security.php');
- \App::set_groups(init_groups_visitor($_SESSION['visitor_id']));
- info(sprintf( t('Welcome %s. Remote authentication successful.'),$hubloc['xchan_name']));
- logger('mod_zot: auth success from ' . $hubloc['xchan_addr']);
- $this->success = true;
- return true;
- }
-
- function Debug($msg) {
- $this->debug_msg .= $msg . EOL;
- }
-
-
- function Finalise() {
-
- if($this->test) {
- $this->test_results['message'] = $this->debug_msg;
- json_return_and_die($this->test_results);
- }
-
- goaway($this->desturl);
- }
-
-}
-
-
-/**
- *
- * Magic Auth
- * ==========
- *
- * So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite),
- * a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters.
- *
- * The endpoint is typically https://$remotesite/post - or whatever was specified as the callback url in prior communications
- * (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist)
- *
- * Five GET parameters are supplied:
- * * auth => the urlencoded webbie (channel@host.domain) of the channel requesting access
- * * dest => the desired destination URL (urlencoded)
- * * sec => a random string which is also stored on $mysite for use during the verification phase.
- * * version => the zot revision
- * * delegate => optional urlencoded webbie of a local channel to invoke delegation rights for
- *
- * * test => (optional 1 or 0 - debugs the authentication exchange and returns a json response instead of redirecting the browser session)
- *
- * When this packet is received, an "auth-check" zot message is sent to $mysite.
- * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post)
- * If no information has been recorded about the requesting identity a zot information packet will be retrieved before
- * continuing.
- *
- * The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding
- * to the guid and guid_sig we have associated with the requesting auth identity
- *
- * \code{.json}
- * {
- * "type":"auth_check",
- * "sender":{
- * "guid":"kgVFf_...",
- * "guid_sig":"PT9-TApz...",
- * "url":"http:\/\/podunk.edu",
- * "url_sig":"T8Bp7j...",
- * "sitekey":"aMtgKTiirXrICP..."
- * },
- * "recipients":{
- * {
- * "guid":"ZHSqb...",
- * "guid_sig":"JsAAXi..."
- * }
- * }
- * "callback":"\/post",
- * "version":1,
- * "secret":"1eaa661",
- * "secret_sig":"eKV968b1..."
- * }
- * \endcode
- *
- * auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see
- * if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the
- * destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:
- *
- * \code{.json}
- * {
- * "success":1,
- * "confirm":"q0Ysovd1u...",
- * "service_class":(optional)
- * "level":(optional)
- * "DNT": (optional do-not-track - 1 or 0)
- * }
- * \endcode
- *
- * 'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the
- * base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key.
- * This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful
- * verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login.
- * Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is
- * a string whose contents are not defined by protocol. Example: "basic" or "gold".
- *
- * @param[in,out] \App &$a
- */
diff --git a/Zotlabs/Zot/Finger.php b/Zotlabs/Zot/Finger.php
deleted file mode 100644
index cadde5415..000000000
--- a/Zotlabs/Zot/Finger.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot;
-
-use Zotlabs\Lib\Crypto;
-use Zotlabs\Web\HTTPSig;
-
-/**
- * @brief Finger
- *
- */
-class Finger {
-
- static private $token;
-
- /**
- * @brief Look up information about channel.
- *
- * @param string $webbie
- * does not have to be host qualified e.g. 'foo' is treated as 'foo\@thishub'
- * @param array $channel
- * (optional), if supplied permissions will be enumerated specifically for $channel
- * @param boolean $autofallback
- * fallback/failover to http if https connection cannot be established. Default is true.
- *
- * @return zotinfo array (with 'success' => true) or array('success' => false);
- */
-
- static public function run($webbie, $channel = null, $autofallback = true) {
-
- $ret = array('success' => false);
-
- self::$token = random_string();
-
- if (strpos($webbie, '@') === false) {
- $address = $webbie;
- $host = \App::get_hostname();
- } else {
- $address = substr($webbie,0,strpos($webbie,'@'));
- $host = substr($webbie,strpos($webbie,'@')+1);
- if(strpos($host,'/'))
- $host = substr($host,0,strpos($host,'/'));
- }
-
- $xchan_addr = $address . '@' . $host;
-
- if ((! $address) || (! $xchan_addr)) {
- logger('zot_finger: no address :' . $webbie);
-
- return $ret;
- }
-
- logger('using xchan_addr: ' . $xchan_addr, LOGGER_DATA, LOG_DEBUG);
-
- // potential issue here; the xchan_addr points to the primary hub.
- // The webbie we were called with may not, so it might not be found
- // unless we query for hubloc_addr instead of xchan_addr
-
- $r = q("select xchan.*, hubloc.* from xchan
- left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and hubloc_primary = 1 and hubloc_deleted = 0 and hubloc_network = 'zot' limit 1",
- dbesc($xchan_addr)
- );
-
- if($r) {
- $url = $r[0]['hubloc_url'];
-
- if($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') {
- logger('zot_finger: alternate network: ' . $webbie);
- logger('url: ' . $url . ', net: ' . var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG);
- return $ret;
- }
- } else {
- $url = 'https://' . $host;
- }
-
- $m = parse_url($url);
- if($m) {
- $parsed_host = strtolower($m['host']);
- }
-
- $rhs = '/.well-known/zot-info';
- $https = ((strpos($url,'https://') === 0) ? true : false);
-
- logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG);
-
- if ($channel) {
- $postvars = array(
- 'address' => $address,
- 'target' => $channel['channel_guid'],
- 'target_sig' => $channel['channel_guid_sig'],
- 'key' => $channel['channel_pubkey'],
- 'token' => self::$token
- );
-
- $headers = [];
- $headers['X-Zot-Channel'] = $channel['channel_address'] . '@' . \App::get_hostname();
- $headers['X-Zot-Nonce'] = random_string();
- $headers['Host'] = $parsed_host;
-
- $xhead = HTTPSig::create_sig($headers,$channel['channel_prvkey'],'acct:' . channel_reddress($channel));
-
- $retries = 0;
-
- $result = z_post_url($url . $rhs,$postvars,$retries, [ 'headers' => $xhead ]);
-
- if ((! $result['success']) && ($autofallback)) {
- if ($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_post_url('http://' . $host . $rhs,$postvars, $retries, [ 'headers' => $xhead ]);
- }
- }
- }
- else {
- $rhs .= '?f=&address=' . urlencode($address) . '&token=' . self::$token;
-
- $result = z_fetch_url($url . $rhs);
- if((! $result['success']) && ($autofallback)) {
- if($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_fetch_url('http://' . $host . $rhs);
- }
- }
- }
-
- if(! $result['success']) {
- logger('zot_finger: no results');
-
- return $ret;
- }
-
- $x = json_decode($result['body'], true);
-
- $verify = HTTPSig::verify($result,(($x) ? $x['key'] : ''));
-
- if($x && (! $verify['header_valid'])) {
- $signed_token = ((is_array($x) && array_key_exists('signed_token', $x)) ? $x['signed_token'] : null);
- if($signed_token) {
- $valid = Crypto::verify('token.' . self::$token, base64url_decode($signed_token), $x['key']);
- if(! $valid) {
- logger('invalid signed token: ' . $url . $rhs, LOGGER_NORMAL, LOG_ERR);
-
- return $ret;
- }
- }
- else {
- logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- return $ret;
- }
- }
-
- return $x;
- }
-
-}
diff --git a/Zotlabs/Zot/IHandler.php b/Zotlabs/Zot/IHandler.php
deleted file mode 100644
index dd82f5be6..000000000
--- a/Zotlabs/Zot/IHandler.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot;
-
-interface IHandler {
-
- function Ping();
-
- function Pickup($data);
-
- function Notify($data);
-
- function Request($data);
-
- function Rekey($sender,$data);
-
- function AuthCheck($data,$encrypted);
-
- function Purge($sender,$recipients);
-
- function Refresh($sender,$recipients);
-
-}
-
diff --git a/Zotlabs/Zot/Receiver.php b/Zotlabs/Zot/Receiver.php
deleted file mode 100644
index f0378b650..000000000
--- a/Zotlabs/Zot/Receiver.php
+++ /dev/null
@@ -1,304 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot;
-
-use Zotlabs\Lib\Crypto;
-
-class Receiver {
-
- protected $data;
- protected $encrypted;
- protected $error;
- protected $messagetype;
- protected $sender;
- protected $validated;
- protected $recipients;
- protected $response;
- protected $handler;
-
- function __construct($data,$prvkey,$handler) {
-
- $this->error = false;
- $this->validated = false;
- $this->messagetype = '';
- $this->response = array('success' => false);
-
- $this->handler = $handler;
-
- if(! is_array($data))
- $data = json_decode($data,true);
-
- if($data && is_array($data)) {
- $this->encrypted = ((array_key_exists('iv',$data)) ? true : false);
-
- if($this->encrypted) {
- $data['encrypted'] = true;
- $this->data = @json_decode(@Crypto::unencapsulate($data,$prvkey),true);
- }
- if(! $this->data)
- $this->data = $data;
-
- if($this->data && is_array($this->data) && array_key_exists('type',$this->data))
- $this->messagetype = $this->data['type'];
- }
- if(! $this->messagetype)
- $this->error = true;
-
- if($this->data) {
- $this->sender = ((array_key_exists('sender',$this->data)) ? $this->data['sender'] : null);
- $this->recipients = ((array_key_exists('recipients',$this->data)) ? $this->data['recipients'] : null);
- }
-
- if($this->sender)
- $this->ValidateSender();
-
- $this->Dispatch();
- }
-
- function ValidateSender() {
- $hubs = zot_gethub($this->sender,true);
- if (! $hubs) {
-
- /* Have never seen this guid or this guid coming from this location. Check it and register it. */
- /* (!!) this will validate the sender. */
-
- $result = zot_register_hub($this->sender);
-
- if ((! $result['success']) || (! ($hubs = zot_gethub($this->sender,true)))) {
- $this->response['message'] = 'Hub not available.';
- json_return_and_die($this->response);
- }
- }
- foreach($hubs as $hub) {
- update_hub_connected($hub,((array_key_exists('sitekey',$this->sender)) ? $this->sender['sitekey'] : ''));
- }
- $this->validated = true;
- }
-
-
- function Dispatch() {
-
- /* Handle tasks which don't require sender validation */
-
- switch($this->messagetype) {
- case 'ping':
- /* no validation needed */
- $this->handler->Ping();
- break;
- case 'pickup':
- /* perform site validation, as opposed to sender validation */
- $this->handler->Pickup($this->data);
- break;
-
- default:
- if(! $this->validated) {
- $this->response['message'] = 'Sender not valid';
- json_return_and_die($this->response);
- }
- break;
- }
-
- /* Now handle tasks which require sender validation */
-
- switch($this->messagetype) {
-
- case 'auth_check':
- $this->handler->AuthCheck($this->data,$this->encrypted);
- break;
-
- case 'request':
- $this->handler->Request($this->data);
- break;
-
- case 'purge':
- $this->handler->Purge($this->sender,$this->recipients);
- break;
-
- case 'refresh':
- case 'force_refresh':
- $this->handler->Refresh($this->sender,$this->recipients);
- break;
-
- case 'notify':
- $this->handler->Notify($this->data);
- break;
-
- case 'rekey':
- $this->handler->Rekey($this->sender, $this->data);
- break;
-
- default:
- $this->response['message'] = 'Not implemented';
- json_return_and_die($this->response);
- break;
- }
-
- }
-}
-
-
-
-/**
- * @brief zot communications and messaging.
- *
- * Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet.
- * This packet is optionally encrypted, which we will discover if the json has an 'iv' element.
- * $contents => array( 'alg' => 'aes256cbc', 'iv' => initialisation vector, 'key' => decryption key, 'data' => encrypted data);
- * $contents->iv and $contents->key are random strings encrypted with this site's RSA public key and then base64url encoded.
- *
- * Once decrypted, one will find the normal json_encoded zot message packet.
- *
- * Defined packet types are: notify, purge, refresh, force_refresh, auth_check, ping, and pickup
- *
- * Standard packet: (used by notify, purge, refresh, force_refresh, and auth_check)
- * \code{.json}
- * {
- * "type": "notify",
- * "sender":{
- * "guid":"kgVFf_1...",
- * "guid_sig":"PT9-TApzp...",
- * "url":"http:\/\/podunk.edu",
- * "url_sig":"T8Bp7j5...",
- * },
- * "recipients": { optional recipient array },
- * "callback":"\/post",
- * "version":"1.2",
- * "encryption":["aes256cbc"],
- * "secret":"1eaa...",
- * "secret_sig": "df89025470fac8..."
- * }
- * \endcode
- *
- * Signature fields are all signed with the sender channel private key and base64url encoded.
- * Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private
- * key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates
- * a public message or visible to all potential listeners on this site.
- *
- * "pickup" packet:
- * The pickup packet is sent in response to a notify packet from another site
- * \code{.json}
- * {
- * "type":"pickup",
- * "url":"http:\/\/example.com",
- * "callback":"http:\/\/example.com\/post",
- * "callback_sig":"teE1_fLI...",
- * "secret":"1eaa...",
- * "secret_sig":"O7nB4_..."
- * }
- * \endcode
- *
- * In the pickup packet, the sig fields correspond to the respective data
- * element signed with this site's system private key and then base64url encoded.
- * The "secret" is the same as the original secret from the notify packet.
- *
- * If verification is successful, a json structure is returned containing a
- * success indicator and an array of type 'pickup'.
- * Each pickup element contains the original notify request and a message field
- * whose contents are dependent on the message type.
- *
- * This JSON array is AES encapsulated using the site public key of the site
- * that sent the initial zot pickup packet.
- * Using the above example, this would be example.com.
- *
- * \code{.json}
- * {
- * "success":1,
- * "pickup":{
- * "notify":{
- * "type":"notify",
- * "sender":{
- * "guid":"kgVFf_...",
- * "guid_sig":"PT9-TApz...",
- * "url":"http:\/\/z.podunk.edu",
- * "url_sig":"T8Bp7j5D..."
- * },
- * "callback":"\/post",
- * "version":1,
- * "secret":"1eaa661..."
- * },
- * "message":{
- * "type":"activity",
- * "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
- * "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
- * "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
- * "created":"2012-11-20 04:04:16",
- * "edited":"2012-11-20 04:04:16",
- * "title":"",
- * "body":"Hi Nickordo",
- * "app":"",
- * "verb":"post",
- * "object_type":"",
- * "target_type":"",
- * "permalink":"",
- * "location":"",
- * "longlat":"",
- * "owner":{
- * "name":"Indigo",
- * "address":"indigo@podunk.edu",
- * "url":"http:\/\/podunk.edu",
- * "photo":{
- * "mimetype":"image\/jpeg",
- * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
- * },
- * "guid":"kgVFf_...",
- * "guid_sig":"PT9-TAp...",
- * },
- * "author":{
- * "name":"Indigo",
- * "address":"indigo@podunk.edu",
- * "url":"http:\/\/podunk.edu",
- * "photo":{
- * "mimetype":"image\/jpeg",
- * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
- * },
- * "guid":"kgVFf_...",
- * "guid_sig":"PT9-TAp..."
- * }
- * }
- * }
- * }
- * \endcode
- *
- * Currently defined message types are 'activity', 'mail', 'profile', 'location'
- * and 'channel_sync', which each have different content schemas.
- *
- * Ping packet:
- * A ping packet does not require any parameters except the type. It may or may
- * not be encrypted.
- *
- * \code{.json}
- * {
- * "type": "ping"
- * }
- * \endcode
- *
- * On receipt of a ping packet a ping response will be returned:
- *
- * \code{.json}
- * {
- * "success" : 1,
- * "site" {
- * "url": "http:\/\/podunk.edu",
- * "url_sig": "T8Bp7j5...",
- * "sitekey": "-----BEGIN PUBLIC KEY-----
- * MIICIjANBgkqhkiG9w0BAQE..."
- * }
- * }
- * \endcode
- *
- * The ping packet can be used to verify that a site has not been re-installed, and to
- * initiate corrective action if it has. The url_sig is signed with the site private key
- * and base64url encoded - and this should verify with the enclosed sitekey. Failure to
- * verify indicates the site is corrupt or otherwise unable to communicate using zot.
- * This return packet is not otherwise verified, so should be compared with other
- * results obtained from this site which were verified prior to taking action. For instance
- * if you have one verified result with this signature and key, and other records for this
- * url which have different signatures and keys, it indicates that the site was re-installed
- * and corrective action may commence (remove or mark invalid any entries with different
- * signatures).
- * If you have no records which match this url_sig and key - no corrective action should
- * be taken as this packet may have been returned by an imposter.
- *
- * @param[in,out] App &$a
- */
-
diff --git a/Zotlabs/Zot/ZotHandler.php b/Zotlabs/Zot/ZotHandler.php
deleted file mode 100644
index ab8815b3d..000000000
--- a/Zotlabs/Zot/ZotHandler.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot;
-
-class ZotHandler implements IHandler {
-
- function Ping() {
- zot_reply_ping();
- }
-
- function Pickup($data) {
- zot_reply_pickup($data);
- }
-
- function Notify($data) {
- zot_reply_notify($data);
- }
-
- function Request($data) {
- zot_reply_message_request($data);
- }
-
- function Rekey($sender,$data) {
- zot_rekey_request($sender,$data);
- }
-
- function AuthCheck($data,$encrypted) {
- zot_reply_auth_check($data,$encrypted);
- }
-
- function Purge($sender,$recipients) {
- zot_reply_purge($sender,$recipients);
- }
-
- function Refresh($sender,$recipients) {
- zot_reply_refresh($sender,$recipients);
- }
-
-}
diff --git a/Zotlabs/Zot6/Finger.php b/Zotlabs/Zot6/Finger.php
deleted file mode 100644
index cec3f98ab..000000000
--- a/Zotlabs/Zot6/Finger.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-
-namespace Zotlabs\Zot6;
-
-/**
- * @brief Finger
- *
- */
-class Finger {
-
- static private $token;
-
- /**
- * @brief Look up information about channel.
- *
- * @param string $webbie
- * does not have to be host qualified e.g. 'foo' is treated as 'foo\@thishub'
- * @param array $channel
- * (optional), if supplied permissions will be enumerated specifically for $channel
- * @param boolean $autofallback
- * fallback/failover to http if https connection cannot be established. Default is true.
- *
- * @return zotinfo array (with 'success' => true) or array('success' => false);
- */
-
- static public function run($webbie, $channel = null, $autofallback = true) {
-
- $ret = array('success' => false);
-
- self::$token = random_string();
-
- if (strpos($webbie, '@') === false) {
- $address = $webbie;
- $host = \App::get_hostname();
- } else {
- $address = substr($webbie,0,strpos($webbie,'@'));
- $host = substr($webbie,strpos($webbie,'@')+1);
- if(strpos($host,'/'))
- $host = substr($host,0,strpos($host,'/'));
- }
-
- $xchan_addr = $address . '@' . $host;
-
- if ((! $address) || (! $xchan_addr)) {
- logger('zot_finger: no address :' . $webbie);
-
- return $ret;
- }
-
- logger('using xchan_addr: ' . $xchan_addr, LOGGER_DATA, LOG_DEBUG);
-
- // potential issue here; the xchan_addr points to the primary hub.
- // The webbie we were called with may not, so it might not be found
- // unless we query for hubloc_addr instead of xchan_addr
-
- $r = q("select xchan.*, hubloc.* from xchan
- left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and hubloc_primary = 1 limit 1",
- dbesc($xchan_addr)
- );
-
- if($r) {
- $url = $r[0]['hubloc_url'];
-
- if($r[0]['hubloc_network'] && $r[0]['hubloc_network'] !== 'zot') {
- logger('zot_finger: alternate network: ' . $webbie);
- logger('url: ' . $url . ', net: ' . var_export($r[0]['hubloc_network'],true), LOGGER_DATA, LOG_DEBUG);
- return $ret;
- }
- } else {
- $url = 'https://' . $host;
- }
-
- $rhs = '/.well-known/zot-info';
- $https = ((strpos($url,'https://') === 0) ? true : false);
-
- logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG);
-
- if ($channel) {
- $postvars = array(
- 'address' => $address,
- 'target' => $channel['channel_guid'],
- 'target_sig' => $channel['channel_guid_sig'],
- 'key' => $channel['channel_pubkey'],
- 'token' => self::$token
- );
-
- $headers = [];
- $headers['X-Zot-Channel'] = $channel['channel_address'] . '@' . \App::get_hostname();
- $headers['X-Zot-Nonce'] = random_string();
- $xhead = HTTPSig::create_sig($headers,$channel['channel_prvkey'], channel_url($channel));
-
- $retries = 0;
-
- $result = z_post_url($url . $rhs,$postvars,$retries, [ 'headers' => $xhead ]);
-
- if ((! $result['success']) && ($autofallback)) {
- if ($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_post_url('http://' . $host . $rhs,$postvars, $retries, [ 'headers' => $xhead ]);
- }
- }
- }
- else {
- $rhs .= '?f=&address=' . urlencode($address) . '&token=' . self::$token;
-
- $result = z_fetch_url($url . $rhs);
- if((! $result['success']) && ($autofallback)) {
- if($https) {
- logger('zot_finger: https failed. falling back to http');
- $result = z_fetch_url('http://' . $host . $rhs);
- }
- }
- }
-
- if(! $result['success']) {
- logger('zot_finger: no results');
-
- return $ret;
- }
-
- $x = json_decode($result['body'], true);
-
- $verify = HTTPSig::verify($result,(($x) ? $x['key'] : ''));
-
- if($x && (! $verify['header_valid'])) {
- $signed_token = ((is_array($x) && array_key_exists('signed_token', $x)) ? $x['signed_token'] : null);
- if($signed_token) {
- $valid = zot_verify('token.' . self::$token, base64url_decode($signed_token), $x['key']);
- if(! $valid) {
- logger('invalid signed token: ' . $url . $rhs, LOGGER_NORMAL, LOG_ERR);
-
- return $ret;
- }
- }
- else {
- logger('No signed token from ' . $url . $rhs, LOGGER_NORMAL, LOG_WARNING);
- return $ret;
- }
- }
-
- return $x;
- }
-
-}
diff --git a/Zotlabs/Zot6/IHandler.php b/Zotlabs/Zot6/IHandler.php
index 53b6caa89..4e7738926 100644
--- a/Zotlabs/Zot6/IHandler.php
+++ b/Zotlabs/Zot6/IHandler.php
@@ -4,15 +4,13 @@ namespace Zotlabs\Zot6;
interface IHandler {
- function Notify($data,$hub);
+ function Notify($data, $hub);
- function Request($data,$hub);
+ function Rekey($sender, $data, $hub);
- function Rekey($sender,$data,$hub);
+ function Refresh($sender, $recipients, $hub, $force);
- function Refresh($sender,$recipients,$hub);
-
- function Purge($sender,$recipients,$hub);
+ function Purge($sender, $recipients, $hub);
}
diff --git a/Zotlabs/Zot6/Receiver.php b/Zotlabs/Zot6/Receiver.php
index 6440c5da5..964c61651 100644
--- a/Zotlabs/Zot6/Receiver.php
+++ b/Zotlabs/Zot6/Receiver.php
@@ -7,7 +7,6 @@ use Zotlabs\Lib\Crypto;
use Zotlabs\Lib\Libzot;
use Zotlabs\Web\HTTPSig;
-
class Receiver {
protected $data;
@@ -174,21 +173,20 @@ class Receiver {
function Dispatch() {
switch ($this->messagetype) {
-
- case 'request':
- $this->response = $this->handler->Request($this->data,$this->hub);
- break;
-
case 'purge':
- $this->response = $this->handler->Purge($this->sender,$this->recipients,$this->hub);
+ $this->response = $this->handler->Purge($this->sender, $this->recipients, $this->hub);
break;
case 'refresh':
- $this->response = $this->handler->Refresh($this->sender,$this->recipients,$this->hub);
+ $this->response = $this->handler->Refresh($this->sender, $this->recipients, $this->hub, false);
+ break;
+
+ case 'force_refresh':
+ $this->response = $this->handler->Refresh($this->sender, $this->recipients, $this->hub, true);
break;
case 'rekey':
- $this->response = $this->handler->Rekey($this->sender, $this->data,$this->hub);
+ $this->response = $this->handler->Rekey($this->sender, $this->data, $this->hub);
break;
case 'activity':
@@ -196,7 +194,7 @@ class Receiver {
case 'sync':
default:
if ($this->sender) {
- $this->response = $this->handler->Notify($this->data,$this->hub);
+ $this->response = $this->handler->Notify($this->data, $this->hub);
}
break;
diff --git a/Zotlabs/Zot6/Zot6Handler.php b/Zotlabs/Zot6/Zot6Handler.php
index bd321c4b1..779944bf0 100644
--- a/Zotlabs/Zot6/Zot6Handler.php
+++ b/Zotlabs/Zot6/Zot6Handler.php
@@ -7,24 +7,20 @@ use Zotlabs\Lib\Queue;
class Zot6Handler implements IHandler {
- function Notify($data,$hub) {
- return self::reply_notify($data,$hub);
+ function Notify($data, $hub) {
+ return self::reply_notify($data, $hub);
}
- function Request($data,$hub) {
- return self::reply_message_request($data,$hub);
+ function Rekey($sender, $data, $hub) {
+ return self::reply_rekey_request($sender, $data, $hub);
}
- function Rekey($sender,$data,$hub) {
- return self::reply_rekey_request($sender,$data,$hub);
+ function Refresh($sender, $recipients, $hub, $force) {
+ return self::reply_refresh($sender, $recipients, $hub, $force);
}
- function Refresh($sender,$recipients,$hub) {
- return self::reply_refresh($sender,$recipients,$hub);
- }
-
- function Purge($sender,$recipients,$hub) {
- return self::reply_purge($sender,$recipients,$hub);
+ function Purge($sender, $recipients, $hub) {
+ return self::reply_purge($sender, $recipients, $hub);
}
@@ -38,7 +34,7 @@ class Zot6Handler implements IHandler {
logger('notify received from ' . $hub['hubloc_url']);
- $x = Libzot::fetch($data);
+ $x = Libzot::fetch($data, $hub);
$ret['delivery_report'] = $x;
@@ -62,7 +58,7 @@ class Zot6Handler implements IHandler {
*
* @return array
*/
- static function reply_refresh($sender, $recipients, $hub) {
+ static function reply_refresh($sender, $recipients, $hub, $force) {
$ret = array('success' => false);
if($recipients) {
@@ -76,86 +72,19 @@ class Zot6Handler implements IHandler {
dbesc($recip)
);
/// @FIXME $msgtype is undefined
- $x = Libzot::refresh( [ 'hubloc_id_url' => $hub['hubloc_id_url'] ], $r[0], (($msgtype === 'force_refresh') ? true : false));
+ $x = Libzot::refresh([ 'hubloc_id_url' => $hub['hubloc_id_url']], $r[0], $force);
}
}
else {
// system wide refresh
/// @FIXME $msgtype is undefined
- $x = Libzot::refresh( [ 'hubloc_id_url' => $hub['hubloc_id_url'] ], null, (($msgtype === 'force_refresh') ? true : false));
+ $x = Libzot::refresh(['hubloc_id_url' => $hub['hubloc_id_url']], null, $force);
}
$ret['success'] = true;
return $ret;
}
-
-
- /**
- * @brief Process a message request.
- *
- * If a site receives a comment to a post but finds they have no parent to attach it with, they
- * may send a 'request' packet containing the message_id of the missing parent. This is the handler
- * for that packet. We will create a message_list array of the entire conversation starting with
- * the missing parent and invoke delivery to the sender of the packet.
- *
- * Zotlabs/Daemon/Deliver.php (for local delivery) and
- * mod/post.php???? @fixme (for web delivery) detect the existence of
- * this 'message_list' at the destination and split it into individual messages which are
- * processed/delivered in order.
- *
- * @param array $data
- * @param array $hub
- * @return array
- */
- static function reply_message_request($data, $hub) {
- $ret = [ 'success' => false ];
-
- $message_id = EMPTY_STR;
-
- if(array_key_exists('data',$data))
- $ptr = $data['data'];
- if(is_array($ptr) && array_key_exists(0,$ptr)) {
- $ptr = $ptr[0];
- }
- if(is_string($ptr)) {
- $message_id = $ptr;
- }
- if(is_array($ptr) && array_key_exists('id',$ptr)) {
- $message_id = $ptr['id'];
- }
-
- if (! $message_id) {
- $ret['message'] = 'no message_id';
- logger('no message_id');
- return $ret;
- }
-
- $sender = $hub['hubloc_hash'];
-
- /*
- * Find the local channel in charge of this post (the first and only recipient of the request packet)
- */
-
- $arr = $data['recipients'][0];
-
- $c = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_hash = '%s' limit 1",
- dbesc($arr['portable_id'])
- );
- if (! $c) {
- logger('recipient channel not found.');
- $ret['message'] .= 'recipient not found.' . EOL;
- return $ret;
- }
-
- /*
- * fetch the requested conversation
- */
- $messages = zot_feed($c[0]['channel_id'], $sender, [ 'message_id' => $data['message_id'], 'encoding' => 'activitystreams' ]);
-
- return (($messages) ? : [] );
- }
-
static function rekey_request($sender,$data,$hub) {
$ret = array('success' => false);
@@ -174,7 +103,7 @@ class Zot6Handler implements IHandler {
$old = null;
if(Libzot::verify($data['old_guid'],$data['old_guid_sig'],$data['old_key'])) {
- $oldhash = make_xchan_hash($data['old_guid'],$data['old_key']);
+ $oldhash = Libzot::make_xchan_hash($data['old_guid'],$data['old_key']);
$old = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($oldhash)
);