3 // vim: tabstop=4:shiftwidth=4
\r
5 /* ==========================================================================================
\r
6 * Trackback 2.0 for Nucleus CMS
\r
7 * ==========================================================================================
\r
8 * This program is free software and open source software; you can redistribute
\r
9 * it and/or modify it under the terms of the GNU General Public License as
\r
10 * published by the Free Software Foundation; either version 2 of the License,
\r
11 * or (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
18 * You should have received a copy of the GNU General Public License along
\r
19 * with this program; if not, write to the Free Software Foundation, Inc.,
\r
20 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA or visit
\r
21 * http://www.gnu.org/licenses/gpl.html
\r
22 * ==========================================================================================
\r
26 * @author nakahara21
\r
29 * @copyright 2002-2009 rakaz
\r
30 * @copyright 2002-2009 rakaznakahara21
\r
31 * @copyright 2002-2009 hsur
\r
32 * @copyright 2002-2009 shizuki
\r
33 * @license http://nucleuscms.org/license.txt GNU General Public License
\r
34 * @link http://japan.nucleuscms.org/wiki/plugins:trackback
\r
35 * @version 2.0.3 jp13 DOMDocument-branche $Id$
\r
39 * class NP_TrackBack
\r
41 * @since first version
\r
44 class NP_TrackBack extends NucleusPlugin
\r
48 * Plugin API calls, for installation, configuration and setup
\r
51 // {{{ function getName()
\r
54 * return PLUGIN's name
\r
60 return 'Nucleus CMS TrackBack plugin DOM-branche';
\r
64 // {{{ function getAuthor()
\r
67 * return PLUGIN's author(s)
\r
71 function getAuthor()
\r
73 return 'rakaz + nakahara21 + hsur + shizuki';
\r
77 // {{{ function getURL()
\r
80 * return URL of distribution site or author's e-mail address
\r
86 return 'http://japan.nucleuscms.org/wiki/plugins:trackback';
\r
90 // {{{ function getVersion()
\r
93 * return PLUGIN's version
\r
97 function getVersion()
\r
99 return '2.0.3 jp13 DOM-branche $Revision$';
\r
103 // {{{ function getDescription()
\r
106 * return PLUGIN's description
\r
110 function getDescription()
\r
112 return '[2.0.3 jp13 DOM-branche $Revision$]<br />' . _TB_DESCRIPTION;
\r
116 // {{{ function getTableList()
\r
119 * return data base tables this plugin uses
\r
123 function getTableList()
\r
126 sql_table("plugin_tb"),
\r
127 sql_table("plugin_tb_lookup"),
\r
128 sql_table('plugin_tb_lc')
\r
134 // {{{ function getEventList()
\r
137 * return Nucleus CMS APIs this plugin uses
\r
141 function getEventList()
\r
146 'AddItemFormExtras',
\r
147 'EditItemFormExtras',
\r
149 'PrepareItemForEdit',
\r
150 // 'BookmarkletExtraHead',
\r
151 'RetrieveTrackback',
\r
154 'TemplateExtraFields'
\r
160 // {{{ function getMinNucleusVersion()
\r
163 * return Lowest Nucleus CMS version by which this plugin operates
\r
167 function getMinNucleusVersion()
\r
173 // {{{ function supportsFeature($feature)
\r
176 * return "true" if feature support
\r
178 * @param str feature name
\r
181 function supportsFeature($feature)
\r
184 case 'SqlTablePrefix':
\r
192 // {{{ function install()
\r
195 * setup NP_TrackBack
\r
201 switch (strtoupper(_CHARSET) == 'UTF-8') {
\r
203 $collate = 'utf8_unicode_ci';
\r
207 $collate = 'ujis_japanese_ci';
\r
211 $collate = 'latin1_swedish_ci';
\r
212 $charset = 'latin1';
\r
217 CREATE TABLE IF NOT EXISTS `" . sql_table('plugin_tb') . "` (
\r
218 `id` int(11) NOT NULL AUTO_INCREMENT,
\r
219 `tb_id` int(11) NOT NULL,
\r
220 `url` text COLLATE utf8_unicode_ci NOT NULL,
\r
221 `block` tinyint(4) NOT NULL,
\r
222 `spam` tinyint(4) NOT NULL,
\r
223 `link` tinyint(4) NOT NULL,
\r
224 `title` text COLLATE " . $collate . ",
\r
225 `excerpt` text COLLATE " . $collate . ",
\r
226 `blog_name` text COLLATE " . $collate . ",
\r
227 `timestamp` datetime DEFAULT NULL,
\r
228 PRIMARY KEY (`id`),
\r
229 KEY `tb_id_block_timestamp_idx` (`tb_id`,`block`,`timestamp`)
\r
230 ) ENGINE=MyISAM DEFAULT CHARSET=" . $charset . " COLLATE=" . $collate
\r
234 CREATE TABLE IF NOT EXISTS `" . sql_table('plugin_tb_lc') . "` (
\r
235 `tb_id` int(11) NOT NULL,
\r
236 `from_id` int(11) NOT NULL,
\r
237 PRIMARY KEY (`tb_id`,`from_id`)
\r
238 ) ENGINE=MyISAM DEFAULT CHARSET=" . $charset . " COLLATE=" . $collate
\r
242 CREATE TABLE IF NOT EXISTS `" . sql_table('plugin_tb_lookup') . "` (
\r
243 `link` text COLLATE " . $collate . " NOT NULL,
\r
244 `url` text COLLATE " . $collate . " NOT NULL,
\r
245 `title` text COLLATE " . $collate . ",
\r
246 PRIMARY KEY (`link`(100))
\r
247 ) ENGINE=MyISAM DEFAULT CHARSET=" . $charset . " COLLATE=" . $collate
\r
253 $this->createOption('AcceptPing', _TB_AcceptPing, 'yesno', 'yes');
\r
254 $this->createOption('SendPings', _TB_SendPings, 'yesno', 'yes');
\r
255 $this->createOption('AutoXMLHttp', _TB_AutoXMLHttp, 'yesno', 'yes');
\r
256 $this->createOption('CheckIDs', _TB_CheckIDs, 'yesno', 'yes');
\r
257 $this->createOption('dateFormat', _TB_dateFormat, 'text', _TB_dateFormat_VAL);
\r
258 $this->createOption('NotifyEmail', _TB_NotifyEmail, 'text', '');
\r
259 $this->createOption('DropTable', _TB_DropTable, 'yesno', 'no');
\r
260 $this->createOption('HideUrl', _TB_HideUrl, 'yesno', 'yes');
\r
261 $this->createOption('ajaxEnabled', _TB_ajaxEnabled, 'yesno', 'no');
\r
263 // default templates
\r
264 $this->createOption('tplHeader', _TB_tplHeader, 'textarea', _TB_tplHeader_VAL);
\r
265 $this->createOption('tplEmpty', _TB_tplEmpty, 'textarea', _TB_tplEmpty_VAL);
\r
266 $this->createOption('tplItem', _TB_tplItem, 'textarea', _TB_tplItem_VAL);
\r
267 $this->createOption('tplFooter', _TB_tplFooter, 'textarea', _TB_tplFooter_VAL);
\r
268 $this->createOption('tplLocalHeader', _TB_tplLocalHeader, 'textarea', _TB_tplLocalHeader_VAL);
\r
269 $this->createOption('tplLocalEmpty', _TB_tplLocalEmpty, 'textarea', _TB_tplLocalEmpty_VAL);
\r
270 $this->createOption('tplLocalItem', _TB_tplLocalItem, 'textarea', _TB_tplLocalItem_VAL);
\r
271 $this->createOption('tplLocalFooter', _TB_tplLocalFooter, 'textarea', _TB_tplLocalFooter_VAL);
\r
272 $this->createOption('tplTbNone', _TB_tplTbNone, 'text', "No Trackbacks");
\r
273 $this->createOption('tplTbOne', _TB_tplTbOne, 'text', "1 Trackback");
\r
274 $this->createOption('tplTbMore', _TB_tplTbMore, 'text', "<%number%> Trackbacks");
\r
275 $this->createOption('tplTbNoAccept', _TB_tplNO_ACCEPT, 'text', "Sorry, no trackback pings are accepted.");
\r
278 $this->createBlogOption('NotifyEmailBlog', _TB_NotifyEmailBlog, 'text', '');
\r
279 $this->createBlogOption('isAcceptW/OLinkDef', _TB_isAcceptWOLinkDef, 'select', 'block', _TB_isAcceptWOLinkDef_VAL);
\r
280 $this->createBlogOption('AllowTrackBack', _TB_AllowTrackBack, 'yesno', 'yes');
\r
283 $this->createItemOption('ItemAcceptPing', _TB_ItemAcceptPing, 'yesno', 'yes');
\r
284 $this->createItemOption('isAcceptW/OLink', _TB_isAcceptWOLink, 'select', 'default', _TB_isAcceptWOLink_VAL);
\r
288 // {{{ function uninstall()
\r
291 * delete TrackBack table if uninstall
\r
295 function uninstall()
\r
297 if ($this->getOption('DropTable') == 'yes') {
\r
298 sql_query ('DROP TABLE ' . sql_table('plugin_tb'));
\r
299 sql_query ('DROP TABLE ' . sql_table('plugin_tb_lookup'));
\r
300 sql_query ('DROP TABLE ' . sql_table('plugin_tb_lc'));
\r
305 // {{{ function init()
\r
314 // include language file for this plugin
\r
315 $language = ereg_replace( '[\\|/]', '', getLanguageName());
\r
316 if (file_exists($this->getDirectory() . 'language/' . $language . '.php')) {
\r
317 include_once($this->getDirectory() . 'language/' . $language . '.php');
\r
319 include_once($this->getDirectory() . 'language/english.php');
\r
321 $this->notificationMail = _TB_NORTIFICATION_MAIL_BODY;
\r
322 $this->notificationMailTitle = _TB_NORTIFICATION_MAIL_TITLE;
\r
323 $this->userAgent = $this->getName() . ' ( ' . $this->getVersion() . ' )';
\r
327 // {{{ function doSkinVar($skinType, $what = '', $tb_id = '', $amount = 'limit-1', $template = '')
\r
330 * skin vars process
\r
338 function doSkinVar($skinType, $what = '', $tb_id = '', $amount = 'limit-1', $template = '')
\r
340 global $itemid, $manager, $CONF;
\r
341 if(preg_match('/limit/i', $tb_id)){
\r
345 $amount = intval(str_replace('limit', '', $amount));
\r
346 if ($tb_id == '') {
\r
347 $tb_id = intval($itemid);
\r
349 $isAcceptPing = $this->isAcceptTrackBack($tb_id);
\r
353 // Insert Auto-discovery RDF code
\r
354 $spamcheck = array (
\r
355 'type' => 'tbcode',
\r
363 'data' => '', //Backwards compatibility with SpamCheck API 1
\r
366 // $manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));
\r
368 if (isset($spamcheck['result']) && $spamcheck['result'] == true){
\r
371 if($skinType == 'item' && !$spam && $isAcceptPing) {
\r
372 $this->insertCode($tb_id);
\r
377 // Insert TrackBack URL
\r
378 if($isAcceptPing) {
\r
379 echo $this->getTrackBackUrl($tb_id);
\r
381 if (!empty($template)) {
\r
382 $template =& $manager->getTemplate($template);
\r
383 $template = $template['NP_TrackBack_tplTbNoAccept'];
\r
385 $template = $this->getOption('tplTbNoAccept');
\r
387 echo TEMPLATE::fill($template, array());
\r
391 case 'manualpingformlink':
\r
392 // Insert manual ping URL
\r
393 echo $this->getManualPingUrl($tb_id);
\r
395 case 'sendpinglink':
\r
396 echo $manager->addTicketToUrl($this->getAdminURL() . 'index.php?action=ping&id=' . intval($tb_id));
\r
399 // Insert TrackBack count
\r
400 $count = $this->getTrackBackCount($tb_id);
\r
401 if (!empty($template)) {
\r
402 $template =& $manager->getTemplate($template);
\r
406 if (is_array($template)) {
\r
407 $template = $template['NP_TrackBack_tplTbNone'];
\r
409 $template = $this->getOption('tplTbNone');
\r
413 if (is_array($template)) {
\r
414 $template = $template['NP_TrackBack_tplTbOne'];
\r
416 $template = $this->getOption('tplTbOne');
\r
420 if (is_array($template)) {
\r
421 $template = $template['NP_TrackBack_tplTbMore'];
\r
423 $template = $this->getOption('tplTbMore');
\r
427 echo TEMPLATE::fill($template, array('number' => $count));
\r
431 // Shows the TrackBack list
\r
432 $this->showList($tb_id, $amount);
\r
435 // show requred URL
\r
436 echo $this->getRequiredURL($tb_id);
\r
439 // shows the Local list
\r
440 $this->showLocalList($tb_id);
\r
448 // {{{ function doTemplateVar(&$item, $what = '', $template = '')
\r
451 * template vars process
\r
457 function doTemplateVar(&$item, $what = '', $template = '')
\r
459 $this->doSkinVar('template', $what, $item->itemid, $template);
\r
463 // {{{ function doTemplateCommentsVar(&$item, &$comment, $what = '', $template = '')
\r
466 * comment template vars process
\r
473 function doTemplateCommentsVar(&$item, &$comment, $what = '', $template = '')
\r
475 $this->doSkinVar('templatecomments', $what, $item->itemid, $template);
\r
479 // {{{ function doAction($type)
\r
482 * A trackback ping is to be received on the URL
\r
483 * http://yourdomain.com/action.php?action=plugin&name=TrackBack&tb_id=1234
\r
484 * Extra variables to be passed along are url, title, excerpt, blog_name
\r
488 function doAction($type)
\r
490 global $CONF,$manager;
\r
491 $aActionsNotToCheck = array(
\r
498 if (!in_array($type, $aActionsNotToCheck)) {
\r
499 if (!$manager->checkTicket()) return _ERROR_BADTICKET;
\r
503 // When no action type is given, assume it's a ping
\r
504 $errorMsg = $this->handlePing();
\r
505 $this->xmlResponse($errorMsg);
\r
509 $errorMsg = $this->handlePing();
\r
510 if ($errorMsg != '') {
\r
511 $this->showManualPingError(intRequestVar('tb_id'), $errorMsg);
\r
513 $this->showManualPingSuccess(intRequestVar('tb_id'));
\r
517 // Show manual ping form
\r
518 $tb_id = intRequestVar('tb_id');
\r
519 $isAcceptPing = $this->isAcceptTrackBack($tb_id);
\r
520 if ($isAcceptPing) {
\r
521 $this->showManualPingForm($tb_id);
\r
523 if (!empty(requestVar['template'])) {
\r
524 $template =& $manager->getTemplate(requestVar['template']);
\r
525 $template = $template['NP_TrackBack_tplTbNoAccept'];
\r
527 $template = $this->getOption('tplTbNoAccept');
\r
529 echo TEMPLATE::fill($template, array());
\r
533 // Detect trackback
\r
534 list($url, $title) = $this->getURIfromLink(html_entity_decode(requestVar('tb_link')));
\r
535 $url = addslashes($url);
\r
536 $url = $this->_utf8_to_javascript($url);
\r
537 $title = addslashes($title);
\r
538 $title = $this->_utf8_to_javascript($title);
\r
539 echo "tbDone('" . requestVar('tb_link') . "', '" . $url . "', '" . $title . "');";
\r
543 return $this->redirect(intRequestVar('tb_id'), requestVar('urlHash'));
\r
546 echo $this->showLeftList(intRequestVar('tb_id'), intRequestVar('amount'));
\r
549 // delete a trackback(local)
\r
550 $err = $this->deleteLocal(intRequestVar('tb_id'), intRequestVar('from_id'));
\r
554 header('Location: ' . serverVar('HTTP_REFERER'));
\r
561 // {{{ function doIf($key = '', $value = '')
\r
564 * COMPARE key and value
\r
569 function doIf($key = '', $value = '')
\r
572 //echo "key: $key, value: $value";
\r
573 switch (strtolower($key)) {
\r
576 if ($value == '') {
\r
579 $value = ($value == 'no' || (!$value)) ? false : true;
\r
582 $ret = $this->isAcceptTrackBack($itemid);
\r
584 $ret = $this->isAcceptTrackBack();
\r
586 return ($value == false) ? (!$ret) : $ret;
\r
588 if ($value == '') {
\r
591 $value = ($value == 'no' || (!$value)) ? false : true;
\r
594 $ret = $this->isEnableLinkCheck($itemid);
\r
596 return ($value == false) ? (!$ret) : $ret;
\r
603 // {{{ function event_InitSkinParse(&$data)
\r
606 * A trackback ping is to be received on the URL
\r
607 * http://yourdomain.com/item/1234.trackback
\r
608 * Extra variables to be passed along are url, title, excerpt, blog_name
\r
612 function event_InitSkinParse(&$data)
\r
614 global $CONF, $itemid;
\r
615 $format = requestVar('format');
\r
616 if ($CONF['URLMode'] == 'pathinfo') {
\r
617 if (preg_match('/(\/|\.)(trackback)(\/|$)/', serverVar('PATH_INFO'), $matches)) {
\r
618 $format = $matches[2];
\r
622 if ($format == 'trackback' && $data['type'] == 'item') {
\r
623 $errorMsg = $this->handlePing(intval($itemid));
\r
624 if ($errorMsg != '') {
\r
625 $this->xmlResponse($errorMsg);
\r
627 $this->xmlResponse();
\r
634 // {{{ function event_TemplateExtraFields(&$data)
\r
637 * extra template field
\r
641 function event_TemplateExtraFields(&$data)
\r
643 $data['fields']['NP_TrackBack'] = array(
\r
644 'NP_TrackBack_tplTbNoAccept' => _TB_tplNO_ACCEPT,
\r
645 'NP_TrackBack_tplTbNone' => _TB_tplTbNone,
\r
646 'NP_TrackBack_tplTbOne' => _TB_tplTbOne,
\r
647 'NP_TrackBack_tplTbMore' => _TB_tplTbMore,
\r
648 'NP_TrackBack_tplItem' => _TB_tplItem,
\r
653 // {{{ function event_SendTrackback($data)
\r
656 * trackbackping send via xmlrpc
\r
660 function event_SendTrackback($data)
\r
663 // Enable sending trackbacks for the XML-RPC API, otherwise we would
\r
664 // get an error because the current user is not exactly logged in.
\r
665 $this->xmlrpc = true;
\r
666 $itemid = intval($data['tb_id']);
\r
667 $item =& $manager->getItem($itemid, 0, 0);
\r
669 return; // don't ping for draft & future
\r
671 if ($item['draft']) {
\r
672 return; // don't ping on draft items
\r
674 // gather some more information, needed to send the ping (blog name, etc)
\r
675 $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));
\r
676 $blog_name = $blog->getName();
\r
677 $title = $data['title'] != '' ? $data['title'] : $item['title'];
\r
678 $title = strip_tags($title);
\r
679 $excerpt = $data['body'] != '' ? $data['body'] : $item['body'];
\r
680 $excerpt = strip_tags($excerpt);
\r
681 $excerpt = $this->_cut_string($excerpt, 200);
\r
682 $url = $this->_createItemLink($itemid, $blog);
\r
684 while (list(,$url) = each($data['urls'])) {
\r
685 $res = $this->sendPing($itemid, $title, $url, $excerpt, $blog_name, $url);
\r
687 ACTIONLOG::add(WARNING, 'TrackBack Error:' . $res . ' (' . $url . ')');
\r
693 // {{{ function event_RetrieveTrackback($data)
\r
696 * trackbackping receive via xmlrpc
\r
700 function event_RetrieveTrackback($data)
\r
707 UNIX_TIMESTAMP(`timestamp`) AS timestamp
\r
709 `' . sql_table('plugin_tb') . '`
\r
711 `tb_id` = ' . intval($data['tb_id']) . ' AND
\r
717 while ($row = sql_fetch_assoc($res)) {
\r
718 $trackback = array(
\r
719 'title' => $row['title'],
\r
720 'url' => $row['url'],
\r
723 $data['trackbacks'][] = $trackback;
\r
728 // {{{ function event_BookmarkletExtraHead($data)
\r
731 * insert extra code to <head /> tags on bookmarklet
\r
735 function event_BookmarkletExtraHead($data)
\r
738 list ($NP_TB_URL,) = $this->getURIfromLink(requestVar('loglink'));
\r
742 // {{{ function event_PrepareItemForEdit($data)
\r
745 * auto discover from item body
\r
749 function event_PrepareItemForEdit($data)
\r
751 if ($this->getOption('AutoXMLHttp') == 'no') {
\r
752 // The space between body and more is to make sure we didn't join 2 words accidently....
\r
753 $this->larray = $this->autoDiscovery($data['item']['body'] . ' ' . $data['item']['more']);
\r
758 // {{{ function event_PostAddItem($data)
\r
761 * After an item has been added to the database, send out a ping if requested
\r
762 * (trackback_ping_url variable in request)
\r
766 function event_PostAddItem($data)
\r
768 $this->pingTrackback($data);
\r
772 // {{{ function event_PreUpdateItem($data)
\r
775 * After an item has been updated on the database, send out a ping if requested
\r
776 * (trackback_ping_url variable in request)
\r
780 function event_PreUpdateItem($data)
\r
782 $this->pingTrackback($data);
\r
786 // {{{ function event_AddItemFormExtras($data)
\r
789 * Add trackback options to add item form/bookmarklet
\r
793 function event_AddItemFormExtras($data)
\r
795 $this->itemFormExtra($data, 'add');
\r
799 // {{{ function event_PreUpdateItem($data)
\r
802 * Add trackback options to edit item form/bookmarklet
\r
806 function event_EditItemFormExtras($data)
\r
808 $this->itemFormExtra($data, 'edit');
\r
812 // {{{ function showLeftList($tb_id, $offset = 0, $amount = 99999999, $templateName = '')
\r
815 * Show a list of left trackbacks for this ID
\r
822 function showLeftList($tb_id, $offset = 0, $amount = 99999999, $templateName = '')
\r
824 global $manager, $blog, $CONF;
\r
825 $tb_id = intval($tb_id);
\r
830 md5(`url`) as urlHash,
\r
834 UNIX_TIMESTAMP(`timestamp`) AS timestamp
\r
836 `' . sql_table('plugin_tb') . '`
\r
838 `tb_id` = ' . $tb_id . ' AND
\r
844 $query .= ' LIMIT ' . intval($offset) . ', ' . intval($amount);
\r
846 $res = sql_query($query);
\r
848 if (!empty($templateName)) {
\r
849 $templates =& $manager->getTemplate($templateName);
\r
851 while($row = sql_fetch_array($res)) {
\r
852 $row['blog_name'] = htmlspecialchars($row['blog_name'], ENT_QUOTES);
\r
853 $row['title'] = htmlspecialchars($row['title'], ENT_QUOTES);
\r
854 $row['excerpt'] = htmlspecialchars($row['excerpt'], ENT_QUOTES);
\r
855 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
856 $row['blog_name'] = $this->_restore_to_utf8($row['blog_name']);
\r
857 $row['title'] = $this->_restore_to_utf8($row['title']);
\r
858 $row['excerpt'] = $this->_restore_to_utf8($row['excerpt']);
\r
859 $row['blog_name'] = $this->_utf8_to_entities($row['blog_name']);
\r
860 $row['title'] = $this->_utf8_to_entities($row['title']);
\r
861 $row['excerpt'] = $this->_utf8_to_entities($row['excerpt']);
\r
864 'action' => $this->getTrackBackUrl($tb_id),
\r
865 'form' => $this->getManualPingUrl($tb_id),
\r
866 'name' => $row['blog_name'], ENT_QUOTES),
\r
867 'title' => $row['title'],
\r
868 'excerpt' => $this->_cut_string($row['excerpt'], 400),
\r
869 'url' => htmlspecialchars($row['url'], ENT_QUOTES),
\r
870 'date' => htmlspecialchars(strftime($this->getOption('dateFormat'), $row['timestamp']), ENT_QUOTES)
\r
872 if ($this->getOption('HideUrl') == 'yes') {
\r
873 $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&name=TrackBack'
\r
874 . '&type=redirect&tb_id=' . $tb_id
\r
875 . '&urlHash=' . $row['urlHash']
\r
876 . '&template=' . $templateName;
\r
878 $iVars['url'] = $row['url'];
\r
880 if (is_array($templates)) {
\r
881 $template = $templates['NP_TrackBack_tplItem'];
\r
883 $template = $this->getOption('tplItem');
\r
885 $out[] = TEMPLATE::fill($template, $iVars);
\r
887 sql_free_result($res);
\r
888 return implode("\n", $out);
\r
892 // {{{ function showList($tb_id, $amount = 0, $templateName = '')
\r
895 * Show a list of trackbacks for this ID
\r
901 function showList($tb_id, $amount = 0, $templateName = '')
\r
903 $tb_id = intval($tb_id);
\r
904 global $manager, $blog, $CONF, $member;
\r
905 $enableHideurl = true;
\r
906 // for TB LinkLookup
\r
908 strpos(serverVar('HTTP_USER_AGENT'), 'Hatena Diary Track') === false
\r
909 || strpos(serverVar('HTTP_USER_AGENT'), 'NP_TrackBack') === false
\r
910 || strpos(serverVar('HTTP_USER_AGENT'), 'TBPingLinkLookup') === false
\r
911 || strpos(serverVar('HTTP_USER_AGENT'), 'MT::Plugin::BanNoReferTb') === false
\r
912 || strpos(serverVar('HTTP_USER_AGENT'), 'livedoorBlog') === false
\r
914 $enableHideurl = false;
\r
920 md5(`url`) as urlHash,
\r
924 UNIX_TIMESTAMP(`timestamp`) AS timestamp
\r
926 `' . sql_table('plugin_tb') . '`
\r
928 `tb_id` = ' . $tb_id . ' AND
\r
933 if ($amount == '-1') {
\r
934 $query .= ' LIMIT 9999999';
\r
935 } elseif($amount) {
\r
936 $query .= ' LIMIT ' . intval($amount);
\r
938 if ($amount != 0) {
\r
939 $res = sql_query($query);
\r
942 'action' => $this->getTrackBackUrl($tb_id),
\r
943 'form' => $this->getManualPingUrl($tb_id),
\r
944 'required' => $this->getRequiredURL($tb_id),
\r
947 if (!empty($templateName)) {
\r
948 $templates =& $manager->getTemplate($templateName);
\r
950 if ($member->isLoggedIn()) {
\r
951 $adminurl = $manager->addTicketToUrl($this->getAdminURL() . 'index.php?action=list&id=' . $tb_id);
\r
952 $pingformurl = $manager->addTicketToUrl($this->getAdminURL() . 'index.php?action=ping&id=' . $tb_id);
\r
953 $gVars['admin'] = '<a href="' . htmlspecialchars($adminurl, ENT_QUOTES) . '" target="_blank">[admin]</a>';
\r
954 $gVars['pingform'] = '<a href="' . htmlspecialchars($pingformurl, ENT_QUOTES) . '" target="_blank">[pingform]</a>';
\r
956 if (is_array($templates)) {
\r
957 $tpl_Head = $templates['NP_TrackBack_tplHeader'];
\r
958 $tpl_Item = $templates['NP_TrackBack_tplItem'];
\r
959 $tpl_Empt = $templates['NP_TrackBack_tplEmpty'];
\r
960 $tpl_Foot = $templates['NP_TrackBack_tplFooter'];
\r
962 $tpl_Head = $this->getOption('tplHeader');
\r
963 $tpl_Item = $this->getOption('tplItem');
\r
964 $tpl_Empt = $this->getOption('tplEmpty');
\r
965 $tpl_Foot = $this->getOption('tplFooter');
\r
967 echo TEMPLATE::fill($tpl_Head, $gVars);
\r
968 while ($amount != 0 && $row = sql_fetch_array($res)) {
\r
969 $row['blog_name'] = htmlspecialchars($row['blog_name'], ENT_QUOTES);
\r
970 $row['title'] = htmlspecialchars($row['title'], ENT_QUOTES);
\r
971 $row['excerpt'] = htmlspecialchars($row['excerpt'], ENT_QUOTES);
\r
972 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
973 $row['blog_name'] = $this->_restore_to_utf8($row['blog_name']);
\r
974 $row['title'] = $this->_restore_to_utf8($row['title']);
\r
975 $row['excerpt'] = $this->_restore_to_utf8($row['excerpt']);
\r
976 $row['blog_name'] = mb_convert_encoding($row['blog_name'], _CHARSET, 'UTF-8');
\r
977 $row['title'] = mb_convert_encoding($row['title'], _CHARSET, 'UTF-8');
\r
978 $row['excerpt'] = mb_convert_encoding($row['excerpt'], _CHARSET, 'UTF-8');
\r
981 'action' => $this->getTrackBackUrl($tb_id),
\r
982 'form' => $this->getManualPingUrl($tb_id),
\r
983 'name' => htmlspecialchars($row['blog_name'], ENT_QUOTES),
\r
984 'title' => htmlspecialchars($row['title'], ENT_QUOTES),
\r
985 'excerpt' => htmlspecialchars($this->_cut_string($row['excerpt'], 400), ENT_QUOTES),
\r
986 'url' => htmlspecialchars($row['url'], ENT_QUOTES),
\r
987 'date' => htmlspecialchars(strftime($this->getOption('dateFormat'), $row['timestamp']), ENT_QUOTES)
\r
989 if ($enableHideurl && $this->getOption('HideUrl') == 'yes') {
\r
990 $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&name=TrackBack'
\r
991 . '&type=redirect&tb_id=' . $tb_id
\r
992 . '&urlHash=' . $row['urlHash'];
\r
994 $iVars['url'] = $row['url'];
\r
996 echo TEMPLATE::fill($tpl_Item, $iVars);
\r
1002 `' . sql_table('plugin_tb') . '`
\r
1004 `tb_id` = ' . $tb_id . ' AND
\r
1009 $result = sql_query($q);
\r
1010 $total = sql_result($result, 0, 0);
\r
1011 if ($amount != -1 && $total > $amount) {
\r
1012 $leftcount = $total - $amount;
\r
1013 $adminURL = $this->getAdminURL();
\r
1014 $tb_id = intval($tb_id);
\r
1015 $amount = intval($amount);
\r
1016 echo <<<___SCRIPTCODE___
\r
1017 <script type="text/javascript" src="{$adminURL}detectlist.php?tb_id={$tb_id}&amount={$amount}"></script>';
\r
1018 <a name="restoftrackback" id="restoftrackback"></a>
\r
1019 <div id="tbshownavi"><a href="#restoftrackback" onclick="resttbStart(); return false;" id="tbshow">Show left {$leftcount} Trackbacks</a></div>
\r
1020 <div id="tbhidenavi" style="display: none;"><a href="#restoftrackback" onclick="hideresttb(); return false;">Hide {$leftcount} Trackbacks</a></div>
\r
1021 <div id="resttb"></div>
\r
1025 if (sql_num_rows($res) == 0) {
\r
1026 echo TEMPLATE::fill($tpl_Empt, $gVars);
\r
1028 sql_free_result($res);
\r
1029 echo TEMPLATE::fill($tpl_Foot, $gVars);
\r
1033 // {{{ function getTrackBackCount($tb_id)
\r
1036 * Returns the TrackBack count for a TrackBack item
\r
1041 function getTrackBackCount($tb_id)
\r
1043 $query = 'SELECT COUNT(*) as result FROM %s WHERE tb_id=%d AND block = 0'
\r
1044 return quickQuery(sprintf($query, sql_table('plugin_tb'), $tb_id));
\r
1048 // {{{ function getManualPingUrl($itemid)
\r
1051 * Returns the manual ping URL
\r
1056 function getManualPingUrl($itemid)
\r
1059 return $CONF['ActionURL'] . '?action=plugin&name=TrackBack&type=form&tb_id=' . intval($itemid);
\r
1063 // {{{ function showManualPingError($itemid, $status = '')
\r
1066 * Show the manual ping form
\r
1071 function showManualPingError($itemid, $status = '')
\r
1077 sendContentType('text/html', 'admin-trackback', _CHARSET);
\r
1078 require_once($this->getDirectory() . '/template.php');
\r
1079 $mTemplate = new Trackback_Template(null, $this->getDirectory());
\r
1080 $mTemplate->set ('CONF', $CONF);
\r
1081 $mTemplate->set ('itemid', $itemid);
\r
1082 $mTemplate->set ('form', $form);
\r
1083 $mTemplate->set ('error', $error);
\r
1084 $mTemplate->set ('success', $success);
\r
1085 $mTemplate->set ('status', $status);
\r
1086 $mTemplate->template('templates/form.html');
\r
1087 echo $mTemplate->fetch();
\r
1091 // {{{ function showManualPingSuccess($itemid, $status = '')
\r
1094 * Show the manual ping form
\r
1099 function showManualPingSuccess($itemid, $status = '')
\r
1105 sendContentType('text/html', 'admin-trackback', _CHARSET);
\r
1106 require_once($this->getDirectory() . '/template.php');
\r
1107 $mTemplate = new Trackback_Template(null, $this->getDirectory());
\r
1108 $mTemplate->set ('CONF', $CONF);
\r
1109 $mTemplate->set ('itemid', $itemid);
\r
1110 $mTemplate->set ('form', $form);
\r
1111 $mTemplate->set ('error', $error);
\r
1112 $mTemplate->set ('success', $success);
\r
1113 $mTemplate->set ('status', $status);
\r
1114 $mTemplate->template('templates/form.html');
\r
1115 echo $mTemplate->fetch();
\r
1119 // {{{ function showManualPingForm($itemid, $text = '', $templateName = '')
\r
1122 * Show the manual ping form
\r
1128 function showManualPingForm($itemid, $text = '', $templateName = '')
\r
1134 // Check if we are allowed to accept pings
\r
1135 if ( !$this->isAcceptTrackBack($itemid) ) {
\r
1136 if (!empty($templateName)) {
\r
1137 $templates =& $manager->getTemplate($templateName);
\r
1138 $template = $templates['NP_TrackBack_tplTbNoAccept'];
\r
1140 $template = $this->getOption('tplTbNoAccept');
\r
1142 $text = TEMPLATE::fill($template, array());
\r
1146 sendContentType('text/html', 'admin-trackback', _CHARSET);
\r
1147 require_once($this->getDirectory() . '/template.php');
\r
1148 $mTemplate = new Trackback_Template(null, $this->getDirectory());
\r
1149 $mTemplate->set ('CONF', $CONF);
\r
1150 $mTemplate->set ('itemid', $itemid);
\r
1151 $mTemplate->set ('form', $form);
\r
1152 $mTemplate->set ('error', $error);
\r
1153 $mTemplate->set ('success', $success);
\r
1154 $mTemplate->set ('status', $status);
\r
1155 $mTemplate->template('templates/form.html');
\r
1156 echo $mTemplate->fetch();
\r
1160 // {{{ function getTrackBackUrl($itemid)
\r
1163 * Returns the trackback URL
\r
1167 function getTrackBackUrl($itemid)
\r
1170 return $CONF['ActionURL'] . '?action=plugin&name=TrackBack&tb_id='.$itemid;
\r
1174 // {{{ function itemFormExtra($data, $type = 'add')
\r
1177 * Add trackback options to add/edit item form/bookmarklet
\r
1182 function itemFormExtra($data, $type = 'add')
\r
1184 $listIt = _TB_LIST_IT;
\r
1185 $admURL = $this->getAdminURL();
\r
1186 echo <<<___FORMEXTRA___
\r
1187 <h3>TrackBack</h3>
\r
1189 <label for="plug_tb_url">TrackBack URL:</label><br />
\r
1190 <textarea id="plug_tb_url" name="trackback_ping_url" cols="60" rows="5" style="font:normal xx-small Tahoma, Arial, verdana ;"></textarea>
\r
1191 <input type="button" name="btnAdd" value="{$listIt}" onClick="AddStart()" /><br />
\r
1194 $XMLHttp = $this->getOption('AutoXMLHttp');
\r
1195 if ($XMLHttp == 'yes') {
\r
1196 echo <<<___FORMEXTRA___
\r
1197 <div id="tb_auto">
\r
1198 <input type="button" name="discoverit" value="Auto Discover" onclick="tbSetup();" />
\r
1199 <img id='tb_busy' src='{$admURL}busy.gif' style="display:none;" /><br />
\r
1200 <div id="tb_auto_title"></div>
\r
1201 <table border="1">
\r
1202 <tbody id="tb_ping_list"></tbody>
\r
1204 <input type="hidden" id="tb_url_amount" name="tb_url_amount" value="0" />
\r
1208 $this->jsautodiscovery();
\r
1209 } elseif ($type == 'edit' && $XMLHttp != 'yes') {
\r
1210 if (count($this->larray) > 0) {
\r
1211 echo "\nAuto Discovered Ping URL's:<br />\n";
\r
1212 echo '<input type="hidden" name="tb_url_amount" value="'.count($this->larray).'" />';
\r
1214 while (list($url, $title) = each($this->larray)) {
\r
1215 if (_CHARSET != 'UTF-8') {
\r
1216 $title = $this->_utf8_to_entities($title);
\r
1217 $title = mb_convert_encoding($title, _CHARSET, 'UTF-8');
\r
1219 echo '<input type="checkbox" name="tb_url_' . $i . '" value="' . $url . '" id="tb_url_' . $i . '" />';
\r
1220 echo '<label for="tb_url_' . $i . '" title="' . $url . '">' . $title . '</label><br />';
\r
1229 // {{{ function jsautodiscovery()
\r
1232 * Insert Javascript AutoDiscovery routines
\r
1234 function jsautodiscovery()
\r
1236 echo '<script type="text/javascript" src="' . $this->getAdminURL() . 'autodetect.php"></script>';
\r
1240 // {{{ function insertCode($itemid)
\r
1243 * Insert RDF code for item
\r
1247 function insertCode($itemid)
\r
1249 $itemid = intval($itemid);
\r
1250 global $manager, $CONF;
\r
1251 $item =& $manager->getItem($itemid, 0, 0);
\r
1252 $blog =& $manager->getBlog(getBlogIDFromItemID($item['itemid']));
\r
1253 $uri = $this->_createItemLink($item['itemid'], $blog);
\r
1254 $title = strip_tags($item['title']);
\r
1255 $desc = strip_tags($item['body']);
\r
1256 $desc = $this->_cut_string($desc, 200);
\r
1257 $desc = htmlspecialchars($desc, ENT_QUOTES);
\r
1258 $tburl = $this->getTrackBackUrl($itemid);
\r
1259 $time = strftime('%Y-%m-%dT%H:%M:%S');
\r
1260 echo <<<___RDFCODE___
\r
1262 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
\r
1263 xmlns:dc="http://purl.org/dc/elements/1.1/"
\r
1264 xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
\r
1266 rdf:about="{$uri}"
\r
1267 dc:identifier="{$uri}"
\r
1268 dc:title="{$title}"
\r
1269 dc:description="{$desc}"
\r
1270 trackback:ping="{$tburi}"
\r
1271 dc:date="{$time}" />
\r
1279 // {{{ function rssResponse($tb_id)
\r
1282 * Retrieving TrackBack Pings (when __mode=rss)
\r
1286 function rssResponse($tb_id)
\r
1288 $tb_id = intval($tb_id);
\r
1289 global $manager, $CONF;
\r
1290 $item =& $manager->getItem($tb_id, 0, 0);
\r
1292 $blog =& $manager->getBlog(getBlogIDFromItemID($item['itemid']));
\r
1293 $blog_name = $this->_restore_to_utf8($blog->getName());
\r
1294 $title = $this->_restore_to_utf8($item['title']);
\r
1295 $excerpt = $this->_restore_to_utf8($item['body']);
\r
1296 $excerpt = $this->_cut_string($excerpt, 200);
\r
1297 $url = $this->_createItemLink($item['itemid'], $blog);
\r
1299 // Create response XML
\r
1300 $dom = new DOMDocument('1.0', 'UTF-8');
\r
1301 $response = $dom->appendChild($dom->createElement('response'));
\r
1302 $response->appendChild($dom->createElement('error', '0'));
\r
1303 $rss = $response->appendChild($dom->createElement('rss'));
\r
1304 $rss->setAttribute("version", "0.91");
\r
1305 $channel = $rss->appendChild($dom->createElement('channel'));
\r
1306 $channel->appendChild($dom->createElement('title', htmlspecialchars($title, ENT_QUOTES)));
\r
1307 $channel->appendChild($dom->createElement('link', htmlspecialchars($url, ENT_QUOTES)));
\r
1308 $channel->appendChild($dom->createElement('description', htmlspecialchars($excerpt, ENT_QUOTES)));
\r
1310 $query = 'SELECT '
\r
1315 . 'UNIX_TIMESTAMP(`timestamp`) as timestamp '
\r
1317 . sql_table('plugin_tb') . ' '
\r
1319 . '`tb_id` = ' . $tb_id . ' AND '
\r
1322 . '`timestamp` DESC';
\r
1323 $res = sql_query($query);
\r
1324 while($data = sql_fetch_assoc($res)) {
\r
1325 $data['title'] = htmlspecialchars($this->_restore_to_utf8($data['title']), ENT_QUOTES);
\r
1326 $data['excerpt'] = htmlspecialchars($this->_restore_to_utf8($data['excerpt']), ENT_QUOTES);
\r
1327 $data['url'] = htmlspecialchars($data['url'], ENT_QUOTES);
\r
1328 $item = $channel->appendChild($dom->createElement('item'));
\r
1329 $item->appendChild($dom->createElement('title', $data['title']);
\r
1330 $item->appendChild($dom->createElement('link', $data['url']);
\r
1331 $item->appendChild($dom->createElement('description', $data['excerpt']);
\r
1333 header('Content-Type: text/xml');
\r
1334 echo $dom->saveXML();
\r
1336 $this->xmlResponse(_ERROR_NOSUCHITEM);
\r
1341 // {{{ function sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_url)
\r
1344 * Send a Trackback ping to another website
\r
1353 function sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_url)
\r
1355 // $sendEncoding = 'UTF-8';
\r
1356 // 1. Check some basic things
\r
1357 if (!$this->canSendPing()) {
\r
1358 return _TB_msgNOTALLOWED_SEND;
\r
1360 if ($this->getOption('SendPings') == 'no') {
\r
1361 return _TB_msgDISABLED_SEND;
\r
1363 if ($ping_url == '') {
\r
1364 return _TB_msgNO_SENDER_URL;
\r
1366 // 2. Check if protocol is correct http URL
\r
1367 $parsed_url = parse_url($ping_url);
\r
1368 if (strpos($parsed_url['scheme'], 'http') !== 0 || !$parsed_url['host']) {
\r
1369 return _TB_msgBAD_SENDER_URL;
\r
1371 // 3. Create contents
\r
1372 // if ($sendEncoding != _CHARSET) {
\r
1373 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
1374 $title = mb_convert_encoding($title, 'UTF-8', _CHARSET);
\r
1375 $excerpt = mb_convert_encoding($excerpt, 'UTF-8', _CHARSET);
\r
1376 $blog_name = mb_convert_encoding($blog_name, 'UTF-8', _CHARSET);
\r
1378 $ch = curl_init();
\r
1380 'title' => $title,
\r
1382 'excerpt' => $excerpt,
\r
1383 'blog_name' => $blog_name
\r
1386 CURLOPT_URL => $ping_url,
\r
1387 CURLOPT_POST => 1,
\r
1388 CURLOPT_POSTFIELDS => $data,
\r
1389 CURLOPT_RETURNTRANSFER => 1,
\r
1391 curl_setopt_array($ch, $options);
\r
1392 $response = curl_exec($ch);
\r
1393 if ($response === false) {
\r
1394 return sprintf(_TB_msgCOULDNOT_SEND_PING, curl_error($ch), curl_errno($ch));
\r
1396 $respCd = curl_getinfo($ch, CURLINFO_HTTP_CODE);
\r
1397 if ($respCd != 200) {
\r
1398 return sprintf(_TB_msgRESP_HTTP_ERROR, $respCd, curl_error($ch));
\r
1400 $domDoc = new DOMDocument;
\r
1401 $domDoc->preserveWhiteSpace = false;
\r
1402 $domDoc->loadXML($response);
\r
1403 $encoding = $dom->encoding;
\r
1404 if (empty($encoding)) {
\r
1405 $encoding = $this->_detect_encoding($response); //mb_detect_encoding($response, 'ASCII,ISO-2022-JP,UTF-8,EUC-JP,SJIS')
\r
1407 if (strtoupper($encoding) != "UTF-8" && strtoupper($encoding) != "ISO-8859-1") {
\r
1408 $response = @mb_convert_encoding($response, "UTF-8", $encoding);
\r
1409 $domDoc = new DOMDocument;
\r
1410 $domDoc->preserveWhiteSpace = false;
\r
1411 $domDoc->loadXML($response);
\r
1413 $errors = $domDoc->getElementsByTagName('error');
\r
1414 $error = $errors->item(0)->nodeValue;
\r
1415 if (intval($error)) {
\r
1416 $mesages = $domDoc->getElementsByTagName('message');
\r
1417 $mesage = $mesages->item(0)->nodeValue;
\r
1418 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
1419 $mesage = @mb_convert_encoding($mesage, _CHARSET, "UTF-8");
\r
1421 return sprintf(_TB_msgAN_ERROR_OCCURRED, htmlspecialchars($mesage, ENT_QUOTES));
\r
1427 // {{{ function handlePing($tb_id = 0)
\r
1430 * Send a Trackback ping to another website
\r
1435 function handlePing($tb_id = 0)
\r
1443 if ($tb_id == 0) {
\r
1444 $tb_id = intRequestVar('tb_id');
\r
1446 if (requestVar('__mode') == 'rss') {
\r
1449 if ($this->isEnableLinkCheck($tb_id)) {
\r
1453 return _TB_msgTBID_IS_MISSING;
\r
1455 if ((!$manager->existsItem($tb_id,0,0)) && ($this->getOption('CheckIDs') == 'yes')) {
\r
1456 return _ERROR_NOSUCHITEM;
\r
1458 // 0. Check if we need to output the list as rss
\r
1460 $this->rssResponse($tb_id);
\r
1463 // check: accept pings.
\r
1464 $blogId = getBlogIDFromItemID($tb_id);
\r
1465 $isAcceptPing = $this->isAcceptTrackBack($tb_id);
\r
1466 if (!$isAcceptPing) {
\r
1467 return _TB_tplNO_ACCEPT;
\r
1469 // 1. Get attributes
\r
1470 $b =& $manager->getBlog(intval($blogId));
\r
1471 $url = requestVar('url');
\r
1472 $title = requestVar('title');
\r
1473 $excerpt = requestVar('excerpt');
\r
1474 $blog_name = requestVar('blog_name');
\r
1475 if ($url && preg_match('/https?:\/\/([^\/]+)/', $url, $matches) ){
\r
1476 if( gethostbynamel($matches[1]) === FALSE ) {
\r
1477 return _TB_msgBAD_SENDER_URL;
\r
1480 return _TB_msgNO_SENDER_URL;
\r
1482 // 2. Conversion of encoding...
\r
1483 $encoding = $this->_detect_encoding($excerpt);
\r
1484 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
1485 $title = $this->_strip_controlchar(strip_tags(mb_convert_encoding($title, _CHARSET, $encoding)));
\r
1486 $excerpt = $this->_strip_controlchar(strip_tags(mb_convert_encoding($excerpt, _CHARSET, $encoding)));
\r
1487 $blog_name = $this->_strip_controlchar(strip_tags(mb_convert_encoding($blog_name, _CHARSET, $encoding)));
\r
1489 $title = $this->_strip_controlchar($this->_convert_to_utf8($title, $encoding));
\r
1490 $title = $this->_decode_entities(strip_tags($title));
\r
1491 $excerpt = $this->_strip_controlchar($this->_convert_to_utf8($excerpt, $encoding));
\r
1492 $excerpt = $this->_decode_entities(strip_tags($excerpt));
\r
1493 $blog_name = $this->_strip_controlchar($this->_convert_to_utf8($blog_name, $encoding));
\r
1494 $blog_name = $this->_decode_entities(strip_tags($blog_name));
\r
1496 // 3. Save data in the DB
\r
1497 $res = sql_query("
\r
1503 `' . sql_table('plugin_tb') . '`
\r
1505 `url` = '" . sql_real_escape_string($url) . "' AND
\r
1506 `tb_id` = '" . intval($tb_id) . "'
\r
1508 if (sql_num_rows($res) != 0) {
\r
1509 $rows = sql_fetch_assoc($res);
\r
1510 $spam = ($rows['block'] || $rows['spam'] ) ? true : false;
\r
1511 $res = sql_query("
\r
1513 `" . sql_table('plugin_tb') . "`
\r
1515 `title` = '" . sql_real_escape_string($title) . "',
\r
1516 `excerpt` = '" . sql_real_escape_string($excerpt) . "',
\r
1517 `blog_name` = '" . sql_real_escape_string($blog_name) . "',
\r
1518 `timestamp` = ' . mysqldate($b->getCorrectTime()) . '
\r
1520 `url` = '" . sql_real_escape_string($url) . "' AND
\r
1521 `tb_id` = '" . sql_real_escape_string(intval($tb_id)) . "'
\r
1524 return sprintf(_TB_msgTB_COULDNOT_TB_UPDATE, sql_error());
\r
1528 $res = sql_query('
\r
1532 `' . sql_table('plugin_tb') . '`
\r
1535 `url` = "' . sql_real_escape_string($url) . '"
\r
1537 if (mysql_num_rows($res) != 0) {
\r
1538 // NP_Trackback has blocked tb !
\r
1539 ACTIONLOG :: add(INFO, sprintf(_TB_msgDUPLICATED_TB_BLOCKED, $tb_id, $url));
\r
1540 return _TB_tplNO_ACCEPT;
\r
1542 // 4. SPAM check (for SpamCheck API 2 /w compat. API 1)
\r
1543 $spamcheck = array (
\r
1544 'type' => 'trackback',
\r
1546 'title' => $title,
\r
1547 'excerpt' => $excerpt,
\r
1548 'blogname' => $blog_name,
\r
1552 /* Backwards compatibility with SpamCheck API 1*/
\r
1553 'data' => $url . "\n" . $title . "\n" . $excerpt . "\n" . $blog_name . "\n" . serverVar('HTTP_USER_AGENT'),
\r
1554 'ipblock' => true,
\r
1556 $manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));
\r
1557 if (isset($spamcheck['result']) && $spamcheck['result'] == true) {
\r
1560 // 5. Content check (TO DO)
\r
1561 $enableLinkCheck = $this->isEnableLinkCheck($tb_id);
\r
1562 if ($spam == false || $enableLinkCheck == 'ignore') {
\r
1563 if ($enableLinkCheck) {
\r
1564 $contents = $this->retrieveUrl($url);
\r
1565 $linkArray = $this->getPermaLinksFromText($contents);
\r
1566 if (defined('NP_TRACKBACK_LINKCHECK_STRICT')) {
\r
1567 $itemLink = $this->_createItemLink($tb_id, $b);
\r
1569 $itemLink = $b->getURL();
\r
1571 $itemLinkPat = '{^' . preg_quote($itemLink) .'}i';
\r
1572 $itemLinkPat = str_replace('&','&(amp;)?', $itemLinkPat);
\r
1573 foreach ($linkArray as $l) {
\r
1574 if(preg_match($itemLinkPat, $l)) {
\r
1575 ACTIONLOG :: add(INFO, sprintf(_TB_msgLINK_CHECK_OK, $l, $itemLinkPat));
\r
1581 $cnt = @count($linkArray);
\r
1582 if ($enableLinkCheck == 'ignore') {
\r
1583 ACTIONLOG :: add(INFO, sprintf(_TB_msgLINK_CHECK_IGNORE, $tb_id, $url, $cnt, $itemLinkPat));
\r
1584 return _TB_tplNO_ACCEPT;
\r
1586 ACTIONLOG :: add(INFO, sprintf(_TB_msgLINK_CHECK_BLOCK, $tb_id, $url, $cnt, $itemLinkPat));
\r
1591 // 6. Determine if Trackback is safe...
\r
1592 if ($enableLinkCheck) {
\r
1593 $block = ($spam == true || $link == false);
\r
1595 $block = $spam == true;
\r
1599 `' . sql_table('plugin_tb') . '`
\r
1601 `tb_id` = \'' . sql_real_escape_string(intval($tb_id)) . '\',
\r
1602 `block` = \'' . ($block ? '1' : '0') . '\',
\r
1603 `spam` = \'' . ($spam ? '1' : '0') . '\',
\r
1604 `link` = \'' . ($link ? '1' : '0') . '\',
\r
1605 `url` = \'' . sql_real_escape_string($url) . '\',
\r
1606 `title` = \'' . sql_real_escape_string($title) . '\',
\r
1607 `excerpt` = \'' . sql_real_escape_string($excerpt) . '\',
\r
1608 `blog_name` = \'' . sql_real_escape_string($blog_name) . '\',
\r
1609 `timestamp` = ' . mysqldate($b->getCorrectTime()) . '
\r
1611 $res = sql_query($query);
\r
1613 return _TB_msgCOULDNOT_SAVE_DOUBLE . mysql_error() . $query;
\r
1616 // 7. Send notification e-mail if needed
\r
1617 $notifyAddrs = $this->getOption('NotifyEmail');
\r
1618 $notifyAddrs = ($notifyAddrs ? $notifyAddrs . ';' : '')
\r
1619 . $this->getBlogOption($blogId, 'NotifyEmailBlog');
\r
1620 if ($notifyAddrs && $spam == false) {
\r
1622 'tb_id' => $tb_id,
\r
1624 'title' => $title,
\r
1625 'excerpt' => $excerpt,
\r
1626 'blogname' => $blog_name
\r
1628 $mailto_title = TEMPLATE::fill($this->notificationMailTitle, $vars);
\r
1629 $mailto_msg = TEMPLATE::fill($this->notificationMail, $vars);
\r
1630 global $CONF, $DIR_LIBS;
\r
1631 // make sure notification class is loaded
\r
1632 if (!class_exists('notification')) {
\r
1633 include($DIR_LIBS . 'NOTIFICATION.php');
\r
1635 $notify = new NOTIFICATION($notifyAddrs);
\r
1636 $notify->notify($mailto_title, $mailto_msg , $CONF['AdminEmail']);
\r
1637 if ($manager->pluginInstalled('NP_Cache')) {
\r
1638 $p =& $manager->getPlugin('NP_Cache');
\r
1639 $p->setCurrentBlog($tb_id);
\r
1640 $p->cleanItem($tb_id);
\r
1641 $p->cleanArray(array('index'));
\r
1645 return _TB_tplNO_ACCEPT;
\r
1651 // {{{ function xmlResponse($errorMessage = '')
\r
1654 * Send a Trackback ping to another website
\r
1658 function xmlResponse($errorMessage = '')
\r
1660 $dom = new DOMDocument('1.0', 'UTF-8');
\r
1661 $response = $dom->appendChild($dom->createElement('response'));
\r
1662 if ($errorMessage) {
\r
1663 if (strtoupper(_CHARSET) != 'UTF-8') {
\r
1664 $errorMessage = mb_convert_encoding($errorMessage, 'UTF-8');
\r
1665 $response->appendChild($dom->createElement('error', '1'));
\r
1666 $response->appendChild($dom->createElement('message', htmlspecialchars($errorMessage, ENT_QUOTES)));
\r
1668 $response->appendChild($dom->createElement('error', '0'));
\r
1675 // {{{ function canSendPing()
\r
1678 * Check if member may send ping (check if logged in)
\r
1682 function canSendPing()
\r
1685 return $member->isLoggedIn() || $this->xmlrpc;
\r
1689 // {{{ function redirect($tb_id, $urlHash)
\r
1692 * Redirect to trackbacked
\r
1697 function redirect($tb_id, $urlHash)
\r
1708 $url = htmlspecialchars(quickQuery(sprintf($que, $tb_id, $url_Hash)), ENT_QUOTES);
\r
1709 if (empty($url)) {
\r
1711 $url = $CONF['SiteURL'];
\r
1713 $url = htmlspecialchars_decode(stripslashes($url), ENT_QUOTES);
\r
1714 header('Location: ' . $url);
\r
1718 // {{{ function getRequiredURL($itemid)
\r
1721 * Get required URL for link check
\r
1726 function getRequiredURL($itemid)
\r
1729 $blog =& $manager->getBlog(getBlogIDFromItemID(intval($itemid)));
\r
1730 if ($this->isEnableLinkCheck(intval($itemid))) {
\r
1731 return $this->_createItemLink(intval($itemid), $blog);
\r
1737 // {{{ function isEnableLinkCheck($itemid)
\r
1740 * Is link check Enable ?
\r
1745 function isEnableLinkCheck($itemid)
\r
1747 switch($this->getItemOption($itemid, 'isAcceptW/OLink')) {
\r
1756 $blogid = getBlogIDFromItemID(intval($itemid));
\r
1757 $def = $this->getBlogOption(intval($blogid), 'isAcceptW/OLinkDef');
\r
1758 return $def != 'yes';
\r
1764 // {{{ function isAcceptTrackBack($itemid = null)
\r
1767 * Is TrackBack Accept ?
\r
1772 function isAcceptTrackBack($itemid = null)
\r
1775 if ($this->getOption('AcceptPing') == 'yes') {
\r
1777 $bid = getBlogIDFromItemID(intval($itemid));
\r
1781 $bid = $blog->getID();
\r
1784 $bid = $CONF['DefaultBlog'];
\r
1787 if ($this->getBlogOption($bid, 'AllowTrackBack') == 'yes') {
\r
1789 $ret = $this->$this->getItemOption(intval($itemid), 'ItemAcceptPing') == 'yes' ? true : false;
\r
1801 // {{{ function pingTrackback($data)
\r
1808 function pingTrackback($data)
\r
1810 global $manager, $CONF;
\r
1811 $ping_urls_count = 0;
\r
1812 $ping_urls = array();
\r
1813 $ping_url = requestVar('trackback_ping_url');
\r
1814 $localflag = array();
\r
1815 if (trim($ping_url)) {
\r
1816 $ping_urlsTemp = array();
\r
1817 $ping_urlsTemp = preg_split("/[\s,]+/", trim($ping_url));
\r
1818 for ($i=0; $i<count($ping_urlsTemp); $i++) {
\r
1820 $ping_urls_count = count($ping_urls);
\r
1821 $tb_url_amount = requestVar('tb_url_amount');
\r
1831 function pingTrackback($data) {
\r
1832 global $manager, $CONF;
\r
1834 $ping_urls_count = 0;
\r
1835 $ping_urls = array();
\r
1836 $localflag = array();
\r
1838 $ping_url = requestVar('trackback_ping_url');
\r
1839 //modify start+++++++++
\r
1842 $ping_urls[0] = $ping_url;
\r
1843 $ping_urls_count++;
\r
1846 if (trim($ping_url)) {
\r
1847 $ping_urlsTemp = array();
\r
1848 $ping_urlsTemp = preg_split("/[\s,]+/", trim($ping_url));
\r
1849 for($i=0;$i<count($ping_urlsTemp);$i++){
\r
1850 $ping_urls[] = trim($ping_urlsTemp[$i]);
\r
1851 $ping_urls_count++;
\r
1854 //modify end+++++++++
\r
1856 $tb_url_amount = requestVar('tb_url_amount');
\r
1857 for ($i=0;$i<$tb_url_amount;$i++) {
\r
1858 $tb_temp_url = requestVar('tb_url_'.$i);
\r
1859 if ($tb_temp_url) {
\r
1860 $ping_urls[$ping_urls_count] = $tb_temp_url;
\r
1861 $localflag[$ping_urls_count] = (requestVar('tb_url_'.$i.'_local') == 'on')? 1: 0;
\r
1862 $ping_urls_count++;
\r
1866 if ($ping_urls_count <= 0) {
\r
1870 $itemid = $data['itemid'];
\r
1871 $item = &$manager->getItem($itemid, 0, 0);
\r
1872 if (!$item) return; // don't ping for draft & future
\r
1873 if ($item['draft']) return; // don't ping on draft items
\r
1875 // gather some more information, needed to send the ping (blog name, etc)
\r
1876 $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));
\r
1877 $blog_name = $blog->getName();
\r
1879 $title = $data['title'] != '' ? $data['title'] : $item['title'];
\r
1880 $title = strip_tags($title);
\r
1882 $excerpt = $data['body'] != '' ? $data['body'] : $item['body'];
\r
1883 $excerpt = strip_tags($excerpt);
\r
1884 $excerpt = $this->_cut_string($excerpt, 200);
\r
1887 $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());
\r
1888 $url = createItemLink($itemid);
\r
1890 $url = $this->_createItemLink($item['itemid'],$blog);
\r
1892 // send the ping(s) (add errors to actionlog)
\r
1893 for ($i=0; $i<count($ping_urls); $i++) {
\r
1894 if( ! $localflag[$i] )
\r
1895 $res = $this->sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_urls[$i]);
\r
1897 $res = $this->handleLocalPing($itemid, $title, $excerpt, $blog_name, $ping_urls[$i]);
\r
1898 if ($res) ACTIONLOG::add(WARNING, 'TrackBack Error:' . $res . ' (' . $ping_urls[$i] . ')');
\r
1912 $dom = new DOMDocument('1.0', 'UTF-8');
\r
1913 $response = $dom->appendChild($dom->createElement('response'));
\r
1914 $response->appendChild($dom->createElement('error', '0'));
\r
1915 $rss = $response->appendChild($dom->createElement('rss'));
\r
1916 $rss->setAttribute("version", "0.91");
\r
1917 $channel = $rss->appendChild($dom->createElement('channel'));
\r
1918 $channel->appendChild($dom->createElement('title', htmlspecialchars($title, ENT_QUOTES)));
\r
1919 $channel->appendChild($dom->createElement('link', htmlspecialchars($url, ENT_QUOTES)));
\r
1920 $channel->appendChild($dom->createElement('description', htmlspecialchars($excerpt, ENT_QUOTES)));
\r
1922 $query = 'SELECT '
\r
1927 . 'UNIX_TIMESTAMP(`timestamp`) as timestamp '
\r
1929 . sql_table('plugin_tb') . ' '
\r
1931 . '`tb_id` = ' . $tb_id . ' AND '
\r
1934 . '`timestamp` DESC';
\r
1935 $res = sql_query($query);
\r
1936 while($data = sql_fetch_assoc($res)) {
\r
1937 $data['title'] = htmlspecialchars($this->_restore_to_utf8($data['title']), ENT_QUOTES);
\r
1938 $data['excerpt'] = htmlspecialchars($this->_restore_to_utf8($data['excerpt']), ENT_QUOTES);
\r
1939 $data['url'] = htmlspecialchars($data['url'], ENT_QUOTES);
\r
1940 $item = $channel->appendChild($dom->createElement('item'));
\r
1941 $item->appendChild($dom->createElement('title', $data['title']);
\r
1942 $item->appendChild($dom->createElement('link', $data['url']);
\r
1943 $item->appendChild($dom->createElement('description', $data['excerpt']);
\r
1945 header('Content-Type: text/xml');
\r
1946 echo $dom->saveXML();
\r