function diaspost_queue_hook(&$a, &$b) { $hostname = $a->get_hostname(); $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'", dbesc(NETWORK_DIASPORA2)); if (!count($qi)) { return; } require_once 'include/queue_fn.php'; foreach ($qi as $x) { if ($x['network'] !== NETWORK_DIASPORA2) { continue; } logger('diaspost_queue: run'); $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` on `contact`.`uid` = `user`.`uid`\n\t\t\tWHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1", intval($x['cid'])); if (!count($r)) { continue; } $userdata = $r[0]; $diaspost_username = get_pconfig($userdata['uid'], 'diaspost', 'diaspost_username'); $diaspost_password = z_unobscure(get_pconfig($userdata['uid'], 'diaspost', 'diaspost_password')); $diaspost_url = get_pconfig($userdata['uid'], 'diaspost', 'diaspost_url'); $success = false; if ($diaspost_url && $diaspost_username && $diaspost_password) { require_once "addon/diaspost/diasphp.php"; logger('diaspost_queue: able to post for user ' . $diaspost_username); $z = unserialize($x['content']); $post = $z['post']; logger('diaspost_queue: post: ' . $post, LOGGER_DATA); try { logger('diaspost_queue: prepare', LOGGER_DEBUG); $conn = new Diasphp($diaspost_url); logger('diaspost_queue: try to log in ' . $diaspost_username, LOGGER_DEBUG); $conn->login($diaspost_username, $diaspost_password); logger('diaspost_queue: try to send ' . $body, LOGGER_DEBUG); $conn->post($post, $hostname); logger('diaspost_queue: send ' . $userdata['uid'] . ' success', LOGGER_DEBUG); $success = true; remove_queue_item($x['id']); } catch (Exception $e) { logger("diaspost_queue: Send " . $userdata['uid'] . " failed: " . $e->getMessage(), LOGGER_DEBUG); } } else { logger('diaspost_queue: send ' . $userdata['uid'] . ' missing username or password', LOGGER_DEBUG); } if (!$success) { logger('diaspost_queue: delayed'); update_queue_item($x['id']); } } }
function gnusoc_queue_deliver(&$a, &$b) { $outq = $b['outq']; if ($outq['outq_driver'] !== 'slap') { return; } $b['handled'] = true; $headers = array('Content-type: application/magic-envelope+xml', 'Content-length: ' . strlen($outq['outq_msg'])); $counter = 0; $result = z_post_url($outq['outq_posturl'], $outq['outq_msg'], $counter, array('headers' => $headers, 'novalidate' => true)); if ($result['success'] && $result['return_code'] < 300) { logger('slap_deliver: queue post success to ' . $outq['outq_posturl'], LOGGER_DEBUG); if ($b['base']) { q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ", dbesc(datetime_convert()), dbesc($b['base'])); } q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s' limit 1", dbesc('accepted for delivery'), dbesc(datetime_convert()), dbesc($outq['outq_hash'])); remove_queue_item($outq['outq_hash']); } else { logger('slap_deliver: queue post returned ' . $result['return_code'] . ' from ' . $outq['outq_posturl'], LOGGER_DEBUG); update_queue_item($outq['outq_hash']); } return; }
function push_queue_deliver(&$a, &$b) { $outq = $b['outq']; if ($outq['outq_driver'] !== 'push') { return; } $b['handled'] = true; $m = json_decode($outq['outq_msg'], true); if ($m) { $headers = array("Content-type: application/atom+xml", sprintf("Link: <%s>;rel=hub,<%s>;rel=self", z_root() . '/pubsubhubbub', $m['topic']), "X-Hub-Signature: sha1=" . $m['sig']); $counter = 0; $result = z_post_url($outq['outq_posturl'], $m['body'], $counter, array('headers' => $headers, 'novalidate' => true)); if ($result['success'] && $result['return_code'] < 300) { logger('push_deliver: queue post success to ' . $outq['outq_posturl'], LOGGER_DEBUG); if ($b['base']) { q("update site set site_update = '%s', site_dead = 0 where site_url = '%s' ", dbesc(datetime_convert()), dbesc($b['base'])); } q("update dreport set dreport_result = '%s', dreport_time = '%s' where dreport_queue = '%s' limit 1", dbesc('accepted for delivery'), dbesc(datetime_convert()), dbesc($outq['outq_hash'])); q("update push_subscriber set last_update = '%s' where callback_url = '%s' and topic = '%s'", dbesc(datetime_convert()), dbesc($outq['outq_posturl']), dbesc($m['topic'])); remove_queue_item($outq['outq_hash']); } else { logger('push_deliver: queue post returned ' . $result['return_code'] . ' from ' . $outq['outq_posturl'], LOGGER_DEBUG); update_queue_item($outq['outq_hash']); } return; } }
function statusnet_queue_deliver(&$a, &$b) { $outq = $b['outq']; if ($outq['outq_driver'] !== 'statusnet') { return; } $ckey = get_pconfig($outq['outq_channel'], 'statusnet', 'consumerkey'); $csecret = get_pconfig($outq['outq_channel'], 'statusnet', 'consumersecret'); $otoken = get_pconfig($outq['outq_channel'], 'statusnet', 'oauthtoken'); $osecret = get_pconfig($outq['outq_channel'], 'statusnet', 'oauthsecret'); if ($ckey && $csecret && $otoken && $osecret) { $dent = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret); if ($outq['outq_msg']) { $result = $dent->post('statuses/update', array('status' => $outq['outq_msg'])); if ($result->error) { logger('Send to GNU social failed: "' . $result->error . '"'); update_queue_item($outq['outq_hash']); } else { logger('statusnet_post send, result: ' . print_r($result, true) . "\nmessage: " . $outq['outq_msg'], LOGGER_DEBUG); remove_queue_item($outq['outq_hash']); } } } $b['handled'] = true; }
function queue_deliver($outq, $immediate = false) { $base = null; $h = parse_url($outq['outq_posturl']); if ($h) { $base = $h['scheme'] . '://' . $h['host'] . ($h['port'] ? ':' . $h['port'] : ''); } if ($base && $base !== z_root() && $immediate) { $y = q("select site_update, site_dead from site where site_url = '%s' ", dbesc($base)); if ($y) { if (intval($y[0]['site_dead'])) { remove_queue_by_posturl($outq['outq_posturl']); logger('dead site ignored ' . $base); return; } if ($y[0]['site_update'] < datetime_convert('UTC', 'UTC', 'now - 1 month')) { update_queue_item($outq['outq_hash'], 10); logger('immediate delivery deferred for site ' . $base); return; } } else { // zot sites should all have a site record, unless they've been dead for as long as // your site has existed. Since we don't know for sure what these sites are, // call them unknown q("insert into site (site_url, site_update, site_dead, site_type) values ('%s','%s',0,%d) ", dbesc($base), dbesc(datetime_convert()), intval($outq['outq_driver'] === 'post' ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN)); } } $arr = array('outq' => $outq, 'base' => $base, 'handled' => false, 'immediate' => $immediate); 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' limit 1", dbesc('accepted for delivery'), dbesc(datetime_convert()), dbesc($outq['outq_hash'])); remove_queue_item($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 delivery_loop() 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) { delivery_loop($piled_up); } } } else { logger('deliver: queue post returned ' . $result['return_code'] . ' from ' . $outq['outq_posturl'], LOGGER_DEBUG); update_queue_item($outq['outq_posturl']); } return; } // normal zot delivery logger('deliver: dest: ' . $outq['outq_posturl'], LOGGER_DEBUG); $result = zot_zot($outq['outq_posturl'], $outq['outq_notify']); if ($result['success']) { logger('deliver: remote zot delivery succeeded to ' . $outq['outq_posturl']); zot_process_response($outq['outq_posturl'], $result, $outq); } else { logger('deliver: remote zot delivery failed to ' . $outq['outq_posturl']); logger('deliver: remote zot delivery fail data: ' . print_r($result, true), LOGGER_DATA); update_queue_item($outq['outq_hash'], 10); } return; }