streams/Code/Module/Dreport.php

196 lines
6.9 KiB
PHP

<?php
namespace Code\Module;
use App;
use Code\Web\Controller;
use Code\Daemon\Run;
use Code\Render\Theme;
class Dreport extends Controller
{
public function get()
{
if (!local_channel()) {
notice(t('Permission denied') . EOL);
return '';
}
$table = 'item';
$channel = App::get_channel();
if (argc() > 1) {
$cmd = argv(1);
}
$mid = escape_tags($_REQUEST['mid']);
$message_id = unpack_link_id($mid);
$message_id = str_replace(['/activity/','/conversation/'], ['/item/','/item/'], $message_id);
if (!$message_id) {
notice(t('Invalid message') . EOL);
return '';
}
if ($cmd === 'push') {
$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($message_id),
intval($channel['channel_id']),
dbesc($channel['channel_hash']),
dbesc($channel['channel_hash'])
);
if ($i) {
Run::Summon(['Notifier', 'edit_post', $i[0]['id']]);
}
sleep(3);
goaway(z_root() . '/dreport/?mid=' . urlencode($mid));
}
if ($cmd === 'log') {
$host = escape_tags($_REQUEST['host']);
$r = q(
"select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s' and dreport_recip = '%s'",
dbesc($channel['channel_hash']),
dbesc($message_id),
dbesc($host)
);
if ($r) {
$output = '<h3>' . t('Delivery Log') . '</h3>';
$output .= EOL . $r[0]['dreport_log'];
return $output;
} else {
notice(t('Item not found') . 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 )) ",
dbesc($message_id),
dbesc($channel['channel_hash']),
dbesc($channel['channel_hash'])
);
break;
default:
break;
}
if (!$i) {
notice(t('Permission denied') . EOL);
return '';
}
$r = q(
"select * from dreport where dreport_xchan = '%s' and dreport_mid = '%s'",
dbesc($channel['channel_hash']),
dbesc($message_id)
);
if (!$r) {
notice(t('no results') . EOL);
}
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;
$r[$x]['dreport_result'] = t('channel sync processed');
break;
case 'queued':
$r[$x]['gravity'] = 2;
$r[$x]['dreport_result'] = '<a href="' . z_root() . '/dreport/log/?mid=' . $mid . '&host=' . urlencode($r[$x]['dreport_recip']) . '" >' . t('queued') . '</a>';
break;
case 'site dead':
$r[$x]['gravity'] = 3;
$r[$x]['dreport_result'] = t('site dead');
break;
case 'site deferred':
$r[$x]['gravity'] = 4;
$r[$x]['dreport_result'] = t('site might be dead - deferred');
break;
case 'posted':
$r[$x]['gravity'] = 5;
$r[$x]['dreport_result'] = t('posted');
break;
case 'accepted for delivery':
$r[$x]['gravity'] = 6;
$r[$x]['dreport_result'] = t('accepted for delivery');
break;
case 'updated':
$r[$x]['gravity'] = 7;
$r[$x]['dreport_result'] = t('updated');
break;
case 'update ignored':
$r[$x]['gravity'] = 8;
$r[$x]['dreport_result'] = t('update ignored');
break;
case 'permission denied':
$r[$x]['dreport_result'] = t('permission denied');
$r[$x]['gravity'] = 9;
break;
case 'recipient not found':
$r[$x]['dreport_result'] = t('recipient not found');
break;
case 'mail recalled':
$r[$x]['dreport_result'] = t('mail recalled');
break;
case 'duplicate mail received':
$r[$x]['dreport_result'] = t('duplicate mail received');
break;
case 'mail delivered':
$r[$x]['dreport_result'] = t('mail delivered');
break;
default:
if (str_starts_with($r[$x]['dreport_result'], 'delivery rejected')) {
$r[$x]['dreport_result'] = t('delivery rejected') . ' ' . substr($r[$x]['dreport_result'], 17);
}
$r[$x]['gravity'] = 1;
break;
}
}
usort($r, 'self::dreport_gravity_sort');
$entries = [];
foreach ($r as $rr) {
$entries[] = [
'name' => escape_tags($rr['dreport_name'] ?: $rr['dreport_recip']),
'result' => $rr['dreport_result'],
'time' => escape_tags(datetime_convert('UTC', date_default_timezone_get(), $rr['dreport_time']))
];
}
$output = replace_macros(Theme::get_template('dreport.tpl'), [
'$title' => sprintf(t('Delivery report for %1$s'), basename($message_id)) . '...',
'$table' => $table,
'$mid' => urlencode($mid),
'$options' => t('Options'),
'$push' => t('Redeliver'),
'$entries' => $entries
]);
return $output;
}
private static function dreport_gravity_sort($a, $b)
{
if ($a['gravity'] == $b['gravity']) {
if ($a['dreport_name'] === $b['dreport_name']) {
return strcmp($a['dreport_time'], $b['dreport_time']);
}
return strcmp($a['dreport_name'], $b['dreport_name']);
}
return (($a['gravity'] > $b['gravity']) ? 1 : (-1));
}
}