aboutsummaryrefslogtreecommitdiffstats
path: root/include/zot.php
diff options
context:
space:
mode:
Diffstat (limited to 'include/zot.php')
-rw-r--r--include/zot.php199
1 files changed, 137 insertions, 62 deletions
diff --git a/include/zot.php b/include/zot.php
index d031b4a96..b99eeb1ec 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -174,7 +174,7 @@ function zot_build_packet($channel, $type = 'notify', $recipients = null, $remot
* packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'keychange', 'force_refresh', 'notify', 'auth_check'
* @param array $recipients
* envelope information, array ( 'guid' => string, 'guid_sig' => string ); empty for public posts
- * @param string msg
+ * @param string $msg
* optional message
* @param string $remote_key
* optional public site key of target hub used to encrypt entire packet
@@ -925,46 +925,62 @@ function import_xchan($arr, $ud_flags = UPDATE_FLAGS_UPDATED, $ud_arr = null) {
$local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
dbesc($xchan_hash)
);
+
if($local) {
+ // @FIXME This should be removed in future when profile photo update by file sync procedure will be applied
+ // on most hubs in the network
+ // <---
$ph = z_fetch_url($arr['photo'], true);
+
if($ph['success']) {
+
+ // Do not fetch already received thumbnails
+ $x = q("SELECT resource_id FROM photo WHERE uid = %d AND imgscale = %d AND filesize = %d LIMIT 1",
+ intval($local[0]['channel_id']),
+ intval(PHOTO_RES_PROFILE_300),
+ strlen($ph['body'])
+ );
+
+ if($x)
+ $hash = $x[0]['resource_id'];
+ else
+ $hash = import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'], $local[0]['channel_id']);
+ }
+
+ if($hash) {
+ // unless proven otherwise
+ $is_default_profile = 1;
+
+ $profile = q("select is_default from profile where aid = %d and uid = %d limit 1",
+ intval($local[0]['channel_account_id']),
+ intval($local[0]['channel_id'])
+ );
+ if($profile) {
+ if(! intval($profile[0]['is_default']))
+ $is_default_profile = 0;
+ }
- $hash = import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'], $local[0]['channel_id']);
-
- if($hash) {
- // unless proven otherwise
- $is_default_profile = 1;
-
- $profile = q("select is_default from profile where aid = %d and uid = %d limit 1",
+ // If setting for the default profile, unset the profile photo flag from any other photos I own
+ if($is_default_profile) {
+ q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND resource_id != '%s' AND aid = %d AND uid = %d",
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
+ dbesc($hash),
intval($local[0]['channel_account_id']),
intval($local[0]['channel_id'])
);
- if($profile) {
- if(! intval($profile[0]['is_default']))
- $is_default_profile = 0;
- }
-
- // If setting for the default profile, unset the profile photo flag from any other photos I own
- if($is_default_profile) {
- q("UPDATE photo SET photo_usage = %d WHERE photo_usage = %d AND resource_id != '%s' AND aid = %d AND uid = %d",
- intval(PHOTO_NORMAL),
- intval(PHOTO_PROFILE),
- dbesc($hash),
- intval($local[0]['channel_account_id']),
- intval($local[0]['channel_id'])
- );
- }
}
-
- // reset the names in case they got messed up when we had a bug in this function
- $photos = array(
- z_root() . '/photo/profile/l/' . $local[0]['channel_id'],
- z_root() . '/photo/profile/m/' . $local[0]['channel_id'],
- z_root() . '/photo/profile/s/' . $local[0]['channel_id'],
- $arr['photo_mimetype'],
- false
- );
}
+ // --->
+
+ // reset the names in case they got messed up when we had a bug in this function
+ $photos = array(
+ z_root() . '/photo/profile/l/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/m/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/s/' . $local[0]['channel_id'],
+ $arr['photo_mimetype'],
+ false
+ );
}
else {
$photos = import_xchan_photo($arr['photo'], $xchan_hash);
@@ -1100,6 +1116,8 @@ function zot_process_response($hub, $arr, $outq) {
return;
}
+ $dreport = true;
+
$x = json_decode($arr['body'], true);
if(! $x) {
@@ -1116,31 +1134,44 @@ function zot_process_response($hub, $arr, $outq) {
}
if(! (is_array($x['delivery_report']) && count($x['delivery_report']))) {
logger('encrypted delivery report could not be decrypted');
- return;
+ $dreport = false;
}
}
- foreach($x['delivery_report'] as $xx) {
- call_hooks('dreport_process',$xx);
- if(is_array($xx) && array_key_exists('message_id',$xx) && DReport::is_storable($xx)) {
- q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s','%s' ) ",
- dbesc($xx['message_id']),
- dbesc($xx['location']),
- dbesc($xx['recipient']),
- dbesc($xx['name']),
- dbesc($xx['status']),
- dbesc(datetime_convert('UTC','UTC',$xx['date'])),
- dbesc($xx['sender'])
- );
+ if($dreport) {
+ foreach($x['delivery_report'] as $xx) {
+ call_hooks('dreport_process',$xx);
+ if(is_array($xx) && array_key_exists('message_id',$xx) && DReport::is_storable($xx)) {
+
+ // legacy zot recipients add a space and their name to the xchan. split those if true.
+ $legacy_recipient = strpos($xx['recipient'], ' ');
+ if($legacy_recipient !== false) {
+ $legacy_recipient_parts = explode(' ', $xx['recipient'], 2);
+ $xx['recipient'] = $legacy_recipient_parts[0];
+ $xx['name'] = $legacy_recipient_parts[1];
+ }
+
+ q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_name, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s','%s' ) ",
+ dbesc($xx['message_id']),
+ dbesc($xx['location']),
+ dbesc($xx['recipient']),
+ dbesc($xx['name']),
+ dbesc($xx['status']),
+ dbesc(datetime_convert('UTC','UTC',$xx['date'])),
+ dbesc($xx['sender'])
+ );
+ }
}
}
}
- // we have a more descriptive delivery report, so discard the per hub 'queued' report.
- q("delete from dreport where dreport_queue = '%s' ",
- dbesc($outq['outq_hash'])
- );
+ if($dreport) {
+ // we have a more descriptive delivery report, so discard the per hub 'queued' report.
+ q("delete from dreport where dreport_queue = '%s' ",
+ dbesc($outq['outq_hash'])
+ );
+ }
// update the timestamp for this site
@@ -1232,6 +1263,7 @@ function zot_fetch($arr) {
$datatosend = json_encode(crypto_encapsulate(json_encode($data),$hub['hubloc_sitekey'], $algorithm));
$import = zot_zot($url,$datatosend);
+
}
else {
$algorithm = zot_best_algorithm($hub['site_crypto']);
@@ -1696,13 +1728,17 @@ function allowed_public_recips($msg) {
$condensed_recips[] = $rr['hash'];
$results = array();
- $r = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s' and channel_removed = 0 ",
+ $r = q("select channel_hash as hash, channel_id from channel left join abook on abook_channel = channel_id where abook_xchan = '%s' and channel_removed = 0 ",
dbesc($hash)
);
if($r) {
- foreach($r as $rr)
+ foreach($r as $rr) {
+ $cfg = get_abconfig($rr['channel_id'],$rr['hash'],'their_perms','view_stream');
+ if((! $cfg) && $scope !== 'any connections')
+ continue;
if(in_array($rr['hash'],$condensed_recips))
$results[] = array('hash' => $rr['hash']);
+ }
}
return $results;
}
@@ -1813,7 +1849,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
else {
$arr['item_wall'] = 0;
}
-
+
if ((! $tag_delivery) && (! $local_public)) {
$allowed = (perm_is_allowed($channel['channel_id'],$sender['hash'],$perm));
@@ -1824,10 +1860,10 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
intval($channel['channel_id'])
);
if ($parent) {
- $allowed = can_comment_on_post($d['hash'],$parent[0]);
+ $allowed = can_comment_on_post($sender['hash'],$parent[0]);
}
}
-
+
if (! $allowed) {
logger("permission denied for delivery to channel {$channel['channel_id']} {$channel['channel_address']}");
$DR->update('permission denied');
@@ -2314,7 +2350,7 @@ function process_mail_delivery($sender, $arr, $deliveries) {
if(! perm_is_allowed($channel['channel_id'],$sender['hash'],'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.
@@ -2342,7 +2378,7 @@ function process_mail_delivery($sender, $arr, $deliveries) {
);
if($r) {
if(intval($arr['mail_recalled'])) {
- msg_drop($r[0]['id'], $channel['channel_id'], $r[0]['conv_guid']);
+ msg_drop($r[0]['id'], $channel['channel_id'], $r[0]['conv_guid']);
$DR->update('mail recalled');
$result[] = $DR->get();
logger('mail_recalled');
@@ -3231,7 +3267,7 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
$channel = $r[0];
- // don't provide these in the export
+ // don't provide these in the export
unset($channel['channel_active']);
unset($channel['channel_password']);
@@ -3600,7 +3636,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(array_key_exists('channel_pageflags',$arr['channel']) && intval($arr['channel']['channel_pageflags'])) {
// Several pageflags are site-specific and cannot be sync'd.
- // Only allow those bits which are shareable from the remote and then
+ // Only allow those bits which are shareable from the remote and then
// logically OR with the local flags
$arr['channel']['channel_pageflags'] = $arr['channel']['channel_pageflags'] & (PAGE_HIDDEN|PAGE_AUTOCONNECT|PAGE_APPLICATION|PAGE_PREMIUM|PAGE_ADULT);
@@ -3614,7 +3650,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
'channel_r_storage', 'channel_r_pages', 'channel_w_stream', 'channel_w_wall',
'channel_w_comment', 'channel_w_mail', 'channel_w_like', 'channel_w_tagwall',
'channel_w_chat', 'channel_w_storage', 'channel_w_pages', 'channel_a_republish',
- 'channel_a_delegate', 'channel_moved'
+ 'channel_a_delegate', 'channel_moved', 'channel_r_photos', 'channel_w_photos'
];
$clean = array();
@@ -4913,6 +4949,7 @@ function zot_reply_pickup($data) {
dbesc($data['secret']),
dbesc($data['callback'])
);
+
if(! $r) {
$ret['message'] = 'nothing to pick up';
logger('mod_zot: pickup: ' . $ret['message']);
@@ -4922,12 +4959,13 @@ function zot_reply_pickup($data) {
/*
* Everything is good if we made it here, so find all messages that are going to this location
- * and send them all.
+ * and send them all - or a reasonable number if there are a lot so we don't overflow memory.
*/
- $r = q("select * from outq where outq_posturl = '%s'",
+ $r = q("select * from outq where outq_posturl = '%s' limit 100",
dbesc($data['callback'])
);
+
if($r) {
logger('mod_zot: successful pickup message received from ' . $data['callback'] . ' ' . count($r) . ' message(s) picked up', LOGGER_DEBUG);
@@ -4953,6 +4991,19 @@ function zot_reply_pickup($data) {
}
}
+ // It's possible that we have more than 100 messages waiting to be sent.
+
+ // See if there are any more messages in the queue.
+ $x = q("select * from outq where outq_posturl = '%s' order by outq_created limit 1",
+ dbesc($data['callback'])
+ );
+
+ // If so, kick off a new delivery notification for the next batch
+ if ($x) {
+ logger("Send additional pickup request.", LOGGER_DEBUG);
+ queue_deliver($x[0],true);
+ }
+
// this is a bit of a hack because we don't have the hubloc_url here, only the callback url.
// worst case is we'll end up using aes256cbc if they've got a different post endpoint
@@ -4964,6 +5015,8 @@ function zot_reply_pickup($data) {
$encrypted = crypto_encapsulate(json_encode($ret),$sitekey,$algorithm);
json_return_and_die($encrypted);
+ // @FIXME: There is a possibility that the transmission will get interrupted
+ // and fail - in which case this packet of messages will be lost.
/* pickup: end */
}
@@ -5024,7 +5077,7 @@ function zot_reply_auth_check($data,$encrypted_packet) {
}
// There should be exactly one recipient, the original auth requestor
-
+ /// @FIXME $recipients is undefined here.
$ret['message'] .= 'recipients ' . print_r($recipients,true) . EOL;
if ($data['recipients']) {
@@ -5233,3 +5286,25 @@ function zot_reply_notify($data) {
$ret['success'] = true;
json_return_and_die($ret);
}
+
+
+function zot_record_preferred($arr, $check = 'hubloc_network') {
+
+ if(! $arr) {
+ return $arr;
+ }
+
+ foreach($arr as $v) {
+ if($v[$check] === 'zot') {
+ return $v;
+ }
+ }
+ foreach($arr as $v) {
+ if($v[$check] === 'zot6') {
+ return $v;
+ }
+ }
+
+ return $arr[0];
+
+}