148 lines
3.7 KiB
PHP
148 lines
3.7 KiB
PHP
<?php
|
|
namespace Zotlabs\Lib;
|
|
|
|
class DReport {
|
|
|
|
private $location;
|
|
private $sender;
|
|
private $recipient;
|
|
private $message_id;
|
|
private $status;
|
|
private $date;
|
|
|
|
function __construct($location,$sender,$recipient,$message_id,$status = 'deliver') {
|
|
$this->location = $location;
|
|
$this->sender = $sender;
|
|
$this->recipient = $recipient;
|
|
$this->name = EMPTY_STR;
|
|
$this->message_id = $message_id;
|
|
$this->status = $status;
|
|
$this->date = datetime_convert();
|
|
}
|
|
|
|
function update($status) {
|
|
$this->status = $status;
|
|
$this->date = datetime_convert();
|
|
}
|
|
|
|
function set_name($name) {
|
|
$this->name = $name;
|
|
}
|
|
|
|
function addto_update($status) {
|
|
$this->status = $this->status . ' ' . $status;
|
|
}
|
|
|
|
|
|
function set($arr) {
|
|
$this->location = $arr['location'];
|
|
$this->sender = $arr['sender'];
|
|
$this->recipient = $arr['recipient'];
|
|
$this->name = $arr['name'];
|
|
$this->message_id = $arr['message_id'];
|
|
$this->status = $arr['status'];
|
|
$this->date = $arr['date'];
|
|
}
|
|
|
|
function get() {
|
|
return array(
|
|
'location' => $this->location,
|
|
'sender' => $this->sender,
|
|
'recipient' => $this->recipient,
|
|
'name' => $this->name,
|
|
'message_id' => $this->message_id,
|
|
'status' => $this->status,
|
|
'date' => $this->date
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @brief decide whether to store a returned delivery report
|
|
*
|
|
* @param array $dr
|
|
* @return boolean
|
|
*/
|
|
|
|
static function is_storable($dr) {
|
|
|
|
if(get_config('system', 'disable_dreport'))
|
|
return false;
|
|
|
|
/**
|
|
* @hooks dreport_is_storable
|
|
* Called before storing a dreport record to determine whether to store it.
|
|
* * \e array
|
|
*/
|
|
|
|
call_hooks('dreport_is_storable', $dr);
|
|
|
|
// let plugins accept or reject - if neither, continue on
|
|
if(array_key_exists('accept',$dr) && intval($dr['accept']))
|
|
return true;
|
|
if(array_key_exists('reject',$dr) && intval($dr['reject']))
|
|
return false;
|
|
|
|
if(! ($dr['sender']))
|
|
return false;
|
|
|
|
// 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']),
|
|
dbesc($dr['sender'])
|
|
);
|
|
|
|
if(! $c)
|
|
return false;
|
|
|
|
// legacy zot recipients add a space and their name to the xchan. remove it if true.
|
|
|
|
$legacy_recipient = strpos($dr['recipient'], ' ');
|
|
if($legacy_recipient !== false) {
|
|
$legacy_recipient_parts = explode(' ', $dr['recipient'], 2);
|
|
$rxchan = $legacy_recipient_parts[0];
|
|
}
|
|
else {
|
|
$rxchan = $dr['recipient'];
|
|
}
|
|
|
|
|
|
|
|
// is the recipient one of our connections, or do we want to store every report?
|
|
|
|
$pcf = get_pconfig($c[0]['channel_id'],'system','dreport_store_all');
|
|
if($pcf)
|
|
return true;
|
|
|
|
// We always add ourself as a recipient to private and relayed posts
|
|
// So if a remote site says they can't find us, that's no big surprise
|
|
// and just creates a lot of extra report noise
|
|
|
|
if(($dr['location'] !== z_root()) && ($dr['sender'] === $rxchan) && ($dr['status'] === 'recipient not found'))
|
|
return false;
|
|
|
|
// If you have a private post with a recipient list, every single site is going to report
|
|
// back a failed delivery for anybody on that list that isn't local to them. We're only
|
|
// concerned about this if we have a local hubloc record which says we expected them to
|
|
// have a channel on that site.
|
|
|
|
$r = q("select hubloc_id from hubloc where hubloc_hash = '%s' and hubloc_url = '%s'",
|
|
dbesc($rxchan),
|
|
dbesc($dr['location'])
|
|
);
|
|
if((! $r) && ($dr['status'] === 'recipient_not_found'))
|
|
return false;
|
|
|
|
$r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
|
|
dbesc($rxchan),
|
|
intval($c[0]['channel_id'])
|
|
);
|
|
if($r)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
}
|