';
}
return $response;
}
/**
* Open a URL and autodetect contained ping/trackback locations
*
* @access public
* @param string The URL to autodetect/try
* @param string The URL to our blog
* @param string The author of our entry
* @param string The title of our entry
* @param string The body of our entry
* @return null
*/
function serendipity_reference_autodiscover($loc, $url, $author, $title, $text) {
global $serendipity;
$timeout = 30;
$u = parse_url($loc);
if ($u['scheme'] != 'http' && $u['scheme'] != 'https') {
return;
} elseif ($u['scheme'] == 'https' && !extension_loaded('openssl')) {
return; // Trackbacks to HTTPS URLs can only be performed with openssl activated
}
echo '
';
}
echo '';
}
/**
* Receive a trackback
*
* @access public
* @param int The ID of our entry
* @param string The title of the foreign blog
* @param string The URL of the foreign blog
* @param string The name of the foreign blog
* @param string The excerpt text of the foreign blog
* @return true
*/
function add_trackback ($id, $title, $url, $name, $excerpt) {
global $serendipity;
// We can't accept a trackback if we don't get any URL
// This is a protocol rule.
if (empty($url)) {
return 0;
}
// If title is not provided, the value for url will be set as the title
// This is a protocol rule.
if (empty($title)) {
$title = $url;
}
$comment = array(
'title' => $title,
'url' => $url,
'name' => $name,
'comment' => $excerpt
);
$is_utf8 = strtolower(LANG_CHARSET) == 'utf-8';
if ($GLOBALS['tb_logging']) {
$fp = fopen('trackback2.log', 'a');
fwrite($fp, '[' . date('d.m.Y H:i') . '] TRACKBACK TRANSCODING CHECK' . "\n");
}
foreach($comment AS $idx => $field) {
if (is_utf8($field)) {
// Trackback is in UTF-8. Check if our blog also is UTF-8.
if (!$is_utf8) {
if ($GLOBALS['tb_logging']) {
fwrite($fp, '[' . date('d.m.Y H:i') . '] Transcoding ' . $idx . ' from UTF-8 to ISO' . "\n");
}
$comment[$idx] = utf8_decode($field);
}
} else {
// Trackback is in some native format. We assume ISO-8859-1. Check if our blog is also ISO.
if ($is_utf8) {
if ($GLOBALS['tb_logging']) {
fwrite($fp, '[' . date('d.m.Y H:i') . '] Transcoding ' . $idx . ' from ISO to UTF-8' . "\n");
}
$comment[$idx] = utf8_encode($field);
}
}
}
if ($GLOBALS['tb_logging']) {
fwrite($fp, '[' . date('d.m.Y H:i') . '] TRACKBACK DATA: ' . print_r($comment, true) . '...' . "\n");
fwrite($fp, '[' . date('d.m.Y H:i') . '] TRACKBACK STORING...' . "\n");
fclose($fp);
}
serendipity_saveComment($id, $comment, 'TRACKBACK');
return 1;
}
/**
* Receive a pingback
*
* @access public
* @param int The entryid to receive a pingback for
* @param string The foreign postdata to add
* @return boolean
*/
function add_pingback ($id, $postdata) {
global $serendipity;
if(preg_match('@\s*\s*pingback.ping\s*\s*\s*\s*\s*([^<]*)\s*\s*\s*\s*\s*([^<]*)\s*\s*\s*\s*@i', $postdata, $matches)) {
$remote = $matches[1];
$local = $matches[2];
$comment['title'] = '';
$comment['url'] = $remote;
$comment['comment'] = '';
$comment['name'] = '';
serendipity_saveComment($id, $comment, 'PINGBACK');
return 1;
}
return 0;
}
/**
* Create an excerpt for a trackback to send
*
* @access public
* @param string Input text
* @return string Output text
*/
function serendipity_trackback_excerpt($text) {
return serendipity_mb('substr', strip_tags($text), 0, 255);
}
/**
* Report success of a trackback
*
* @access public
*/
function report_trackback_success () {
print '' . "\n";
print <<0
SUCCESS;
}
/**
* Report failure of a trackback
*
* @access public
*/
function report_trackback_failure () {
print '' . "\n";
print <<1Danger Will Robinson, trackback failed.
FAILURE;
}
/**
* Return success of a pingback
*
* @access public
*/
function report_pingback_success () {
print '' . "\n";
print <<success
SUCCESS;
}
/**
* Return failure of a pingback
*
* @access public
*/
function report_pingback_failure () {
print '' . "\n";
print <<0
FAILURE;
}
/**
* Search through link body, and automagically send a trackback ping.
*
* This is the trackback starter function that searches your text and sees if any
* trackback URLs are in there
*
* @access public
* @param int The ID of our entry
* @param string The author of our entry
* @param string The title of our entry
* @param string The text of our entry
* @param boolean Dry-Run, without performing trackbacks?
* @return
*/
function serendipity_handle_references($id, $author, $title, $text, $dry_run = false) {
global $serendipity;
static $old_references = array();
static $saved_references = array();
static $debug = false;
if ($dry_run) {
// Store the current list of references. We might need to restore them for later user.
$old_references = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}references WHERE (type = '' OR type IS NULL) AND entry_id = " . (int)$id, false, 'assoc');
if ($debug && is_string($old_references)) {
echo $old_references . " \n";
}
if (is_array($old_references) && count($old_references) > 0) {
$current_references = array();
foreach($old_references AS $idx => $old_reference) {
// We need the current reference ID to restore it later.
$saved_references[$old_reference['link'] . $old_reference['name']] = $current_references[$old_reference['link'] . $old_reference['name']] = $old_reference;
}
}
if ($debug) echo "Got references in dry run:
" . print_r($current_references, true) . "
\n";
} else {
// A dry-run was called previously and restorable references are found. Restore them now.
$del = serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}references WHERE (type = '' OR type IS NULL) AND entry_id = " . (int)$id);
if ($debug && is_string($del)) {
echo $del . " \n";
}
if ($debug) echo "Deleted references. \n";
if (is_array($old_references) && count($old_references) > 0) {
$current_references = array();
foreach($old_references AS $idx => $old_reference) {
// We need the current reference ID to restore it later.
$current_references[$old_reference['link'] . $old_reference['name']] = $old_reference;
$q = serendipity_db_insert('references', $old_reference, 'show');
$cr = serendipity_db_query($q);
if ($debug && is_string($cr)) {
echo $cr . " \n";
}
}
}
if ($debug) echo "Got references in final run:
" . print_r($current_references, true) . "
\n";
}
if (!preg_match_all('@]+?href\s*=\s*["\']?([^\'" >]+?)[ \'"][^>]*>(.+?)@i', $text, $matches)) {
$matches = array(0 => array(), 1 => array());
} else {
// remove full matches
array_shift($matches);
}
// Make trackback URL
$url = serendipity_archiveURL($id, $title, 'baseURL');
// Add URL references
$locations = $matches[0];
$names = $matches[1];
$checked_locations = array();
serendipity_plugin_api::hook_event('backend_trackbacks', $locations);
for ($i = 0, $j = count($locations); $i < $j; ++$i) {
if ($debug) echo "Checking {$locations[$i]}... \n";
if ($locations[$i][0] == '/') {
$locations[$i] = 'http' . (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off' ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $locations[$i];
}
if (isset($checked_locations[$locations[$i]])) {
if ($debug) echo "Already checked. \n";
continue;
}
if (preg_match_all('@]+?alt=["\']?([^\'">]+?)[\'"][^>]+?>@i', $names[$i], $img_alt)) {
if (is_array($img_alt) && is_array($img_alt[0])) {
foreach($img_alt[0] as $alt_idx => $alt_img) {
// Replace all s within a link with their respective ALT tag, so that references
// can be stored with a title.
$names[$i] = str_replace($alt_img, $img_alt[1][$alt_idx], $names[$i]);
}
}
}
$query = "SELECT COUNT(id) FROM {$serendipity['dbPrefix']}references
WHERE entry_id = ". (int)$id ."
AND link = '" . serendipity_db_escape_string($locations[$i]) . "'
AND (type = '' OR type IS NULL)";
$row = serendipity_db_query($query, true, 'num');
if ($debug && is_string($row)) {
echo $row . " \n";
}
if ($row[0] > 0 && isset($saved_references[$locations[$i] . $names[$i]])) {
if ($debug) echo "Found references for $id, skipping rest \n";
continue;
}
if (!isset($serendipity['noautodiscovery']) || !$serendipity['noautodiscovery']) {
if (!$dry_run) {
if ($debug) echo "Enabling autodiscovery. \n";
serendipity_reference_autodiscover($locations[$i], $url, $author, $title, serendipity_trackback_excerpt($text));
} elseif ($debug) {
echo "Skipping autodiscovery \n";
}
$checked_locations[$locations[$i]] = true; // Store trackbacked link so that no further trackbacks will be sent to the same link
} elseif ($debug) {
echo "Skipping full autodiscovery \n";
}
}
$del = serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}references WHERE entry_id=" . (int)$id . " AND (type = '' OR type IS NULL)");
if ($debug && is_string($del)) {
echo $del . " \n";
}
if ($debug) echo "Deleted references again. \n";
if (!is_array($old_references)) {
$old_references = array();
}
$duplicate_check = array();
for ($i = 0; $i < $j; ++$i) {
$i_link = serendipity_db_escape_string(strip_tags($names[$i]));
$i_location = serendipity_db_escape_string($locations[$i]);
// No link with same description AND same text should be inserted.
if (isset($duplicate_check[$i_location . $i_link])) {
continue;
}
if (isset($current_references[$locations[$i] . $names[$i]])) {
$query = "INSERT INTO {$serendipity['dbPrefix']}references (id, entry_id, name, link) VALUES(";
$query .= (int)$current_references[$locations[$i] . $names[$i]]['id'] . ", " . (int)$id . ", '" . $i_link . "', '" . $i_location . "')";
$ins = serendipity_db_query($query);
if ($debug && is_string($ins)) {
echo $ins . " \n";
}
$duplicate_check[$locations[$i] . $names[$i]] = true;
} else {
$query = "INSERT INTO {$serendipity['dbPrefix']}references (entry_id, name, link) VALUES(";
$query .= (int)$id . ", '" . $i_link . "', '" . $i_location . "')";
$ins = serendipity_db_query($query);
if ($debug && is_string($ins)) {
echo $ins . " \n";
}
$old_references[] = array(
'id' => serendipity_db_insert_id('references', 'id'),
'name' => $i_link,
'link' => $i_location,
'entry_id' => (int)$id
);
$duplicate_check[$i_location . $i_link] = true;
}
if ($debug) {
echo "Current lookup for {$locations[$i]}{$names[$i]} is