OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@1020 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / NP_TrackBack / branches / DOM-branch / NP_TrackBack.php
1 <?php\r
2 \r
3 // vim: tabstop=4:shiftwidth=4\r
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
12  *\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
16  * more details.\r
17  *\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
23  * NP_Trackback.php\r
24  *\r
25  * @author    rakaz\r
26  * @author    nakahara21\r
27  * @author    hsur\r
28  * @author    shizuki\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
36  */\r
37 \r
38 /**\r
39  * class NP_TrackBack\r
40  *\r
41  * @since first version\r
42  */\r
43 \r
44 class NP_TrackBack extends NucleusPlugin\r
45 {\r
46 \r
47 /**\r
48  * Plugin API calls, for installation, configuration and setup\r
49  */\r
50 \r
51 // {{{ function getName()\r
52 \r
53     /**\r
54      * return PLUGIN's name\r
55      *\r
56      * @retrun string\r
57      */\r
58     function getName()\r
59     {\r
60         return 'Nucleus CMS TrackBack plugin DOM-branche';\r
61     }\r
62 \r
63 // }}}\r
64 // {{{ function getAuthor()\r
65 \r
66     /**\r
67      * return PLUGIN's author(s)\r
68      *\r
69      * @retrun string\r
70      */\r
71     function getAuthor()\r
72     {\r
73         return 'rakaz + nakahara21 + hsur + shizuki';\r
74     }\r
75 \r
76 // }}}\r
77 // {{{ function getURL()\r
78 \r
79     /**\r
80      * return URL of distribution site or author's e-mail address\r
81      *\r
82      * @retrun string\r
83      */\r
84     function getURL()\r
85     {\r
86         return 'http://japan.nucleuscms.org/wiki/plugins:trackback';\r
87     }\r
88 \r
89 // }}}\r
90 // {{{ function getVersion()\r
91 \r
92     /**\r
93      * return PLUGIN's version\r
94      *\r
95      * @retrun string\r
96      */\r
97     function getVersion()\r
98     {\r
99         return '2.0.3 jp13 DOM-branche $Revision$';\r
100     }\r
101 \r
102 // }}}\r
103 // {{{ function getDescription()\r
104 \r
105     /**\r
106      * return PLUGIN's description\r
107      *\r
108      * @retrun string\r
109      */\r
110     function getDescription()\r
111     {\r
112         return '[2.0.3 jp13 DOM-branche $Revision$]<br />' . _TB_DESCRIPTION;\r
113     }\r
114 \r
115 // }}}\r
116 // {{{ function getTableList()\r
117 \r
118     /**\r
119      * return data base tables this plugin uses\r
120      *\r
121      * @retrun array\r
122      */\r
123     function getTableList()\r
124     {\r
125         $retArr = array(\r
126             sql_table("plugin_tb"),\r
127             sql_table("plugin_tb_lookup"),\r
128             sql_table('plugin_tb_lc')\r
129         );\r
130         return $retArr;\r
131      }\r
132 \r
133 // }}}\r
134 // {{{ function getEventList()\r
135 \r
136     /**\r
137      * return Nucleus CMS APIs this plugin uses\r
138      *\r
139      * @retrun array\r
140      */\r
141     function getEventList()\r
142     {\r
143         $retArr = array(\r
144             'QuickMenu',\r
145             'PostAddItem',\r
146             'AddItemFormExtras',\r
147             'EditItemFormExtras',\r
148             'PreUpdateItem',\r
149             'PrepareItemForEdit',\r
150 //          'BookmarkletExtraHead',\r
151             'RetrieveTrackback',\r
152             'SendTrackback',\r
153             'InitSkinParse',\r
154             'TemplateExtraFields'\r
155         );\r
156         return $retArr;\r
157     }\r
158 \r
159 // }}}\r
160 // {{{ function getMinNucleusVersion()\r
161 \r
162     /**\r
163      * return Lowest Nucleus CMS version by which this plugin operates\r
164      *\r
165      * @retrun array\r
166      */\r
167     function getMinNucleusVersion()\r
168     {\r
169         return 341;\r
170     }\r
171 \r
172 // }}}\r
173 // {{{ function supportsFeature($feature)\r
174 \r
175     /**\r
176      * return "true" if feature support\r
177      *\r
178      * @param str feature name\r
179      * @retrun int\r
180      */\r
181     function supportsFeature($feature)\r
182     {\r
183         switch($feature) {\r
184             case 'SqlTablePrefix':\r
185                 return 1;\r
186             default:\r
187                 return 0;\r
188         }\r
189     }\r
190 \r
191 // }}}\r
192 // {{{ function install()\r
193 \r
194     /**\r
195      * setup NP_TrackBack\r
196      *\r
197      * @retrun void\r
198      */\r
199     function install()\r
200     {\r
201         switch (strtoupper(_CHARSET) == 'UTF-8') {\r
202             case 'UTF-8':\r
203                 $collate = 'utf8_unicode_ci';\r
204                 $charset = 'utf8';\r
205                 break;\r
206             case 'EUC-JP':\r
207                 $collate = 'ujis_japanese_ci';\r
208                 $charset = 'ujis';\r
209                 break;\r
210             default:\r
211                 $collate = 'latin1_swedish_ci';\r
212                 $charset = 'latin1';\r
213                 break;\r
214         }\r
215         // Create tables\r
216         sql_query("\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
231         );\r
232 \r
233         sql_query("\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
239         );\r
240 \r
241         sql_query("\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
248         );\r
249 \r
250         // plugin options\r
251 \r
252         // global options\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
262 \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
276 \r
277         // blog options\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
281 \r
282         // item options\r
283         $this->createItemOption('ItemAcceptPing',  _TB_ItemAcceptPing, 'yesno',  'yes');\r
284         $this->createItemOption('isAcceptW/OLink', _TB_isAcceptWOLink, 'select', 'default', _TB_isAcceptWOLink_VAL);\r
285     }\r
286 \r
287 // }}}\r
288 // {{{ function uninstall()\r
289 \r
290     /**\r
291      * delete TrackBack table if uninstall\r
292      *\r
293      * @retrun void\r
294      */\r
295     function uninstall()\r
296     {\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
301         }\r
302     }\r
303 \r
304 // }}}\r
305 // {{{ function init()\r
306 \r
307     /**\r
308      * initialize\r
309      *\r
310      * @retrun void\r
311      */\r
312     function init()\r
313     {\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
318         } else {\r
319             include_once($this->getDirectory() . 'language/english.php'); \r
320         }\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
324     }\r
325 \r
326 // }}}\r
327 // {{{ function doSkinVar($skinType, $what = '', $tb_id = '', $amount = 'limit-1', $template = '')\r
328 \r
329     /**\r
330      * skin vars process\r
331      *\r
332      * @param str\r
333      * @param str\r
334      * @param int\r
335      * @param int/str\r
336      * @param str\r
337      */\r
338     function doSkinVar($skinType, $what = '', $tb_id = '', $amount = 'limit-1', $template = '')\r
339     {\r
340         global $itemid, $manager, $CONF;\r
341         if(preg_match('/limit/i', $tb_id)){\r
342             $amount = $tb_id;\r
343             $tb_id  = '';\r
344         }\r
345         $amount = intval(str_replace('limit', '', $amount));\r
346         if ($tb_id == '') {\r
347             $tb_id = intval($itemid);\r
348         }\r
349         $isAcceptPing = $this->isAcceptTrackBack($tb_id);\r
350         switch ($what) {\r
351             case 'tbcode':\r
352             case 'code':\r
353                 // Insert Auto-discovery RDF code\r
354                 $spamcheck = array (\r
355                     'type'     => 'tbcode',\r
356                     'id'       => -1,\r
357                     'title'    => '',\r
358                     'excerpt'  => '',\r
359                     'blogname' => '',\r
360                     'url'      => '',\r
361                     'return'   => true,\r
362                     'live'     => true,\r
363                     'data'     => '', //Backwards compatibility with SpamCheck API 1\r
364                     'ipblock'  => true,\r
365                 );\r
366 //              $manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));\r
367                 $spam = false;\r
368                 if (isset($spamcheck['result']) && $spamcheck['result'] == true){\r
369                     $spam = true;\r
370                 }\r
371                 if($skinType == 'item' && !$spam && $isAcceptPing) {\r
372                     $this->insertCode($tb_id);\r
373                 }\r
374                 break;\r
375             case 'tburl':\r
376             case 'url':\r
377                 // Insert TrackBack URL\r
378                 if($isAcceptPing) {\r
379                     echo $this->getTrackBackUrl($tb_id);\r
380                 } else {\r
381                     if (!empty($template)) {\r
382                         $template =& $manager->getTemplate($template); \r
383                         $template =  $template['NP_TrackBack_tplTbNoAccept'];\r
384                     } else {\r
385                         $template =  $this->getOption('tplTbNoAccept');\r
386                     }\r
387                     echo TEMPLATE::fill($template, array());\r
388                 }\r
389                 break;\r
390             case 'form':\r
391             case 'manualpingformlink':\r
392                 // Insert manual ping URL\r
393                 echo $this->getManualPingUrl($tb_id);\r
394                 break;\r
395             case 'sendpinglink':\r
396                 echo $manager->addTicketToUrl($this->getAdminURL() . 'index.php?action=ping&amp;id=' . intval($tb_id));\r
397                 break;\r
398             case 'count':\r
399                 // Insert TrackBack count\r
400                 $count = $this->getTrackBackCount($tb_id);\r
401                 if (!empty($template)) {\r
402                     $template =& $manager->getTemplate($template);\r
403                 }\r
404                 switch ($count) {\r
405                     case 0:\r
406                         if (is_array($template)) {\r
407                             $template =  $template['NP_TrackBack_tplTbNone'];\r
408                         } else {\r
409                             $template =  $this->getOption('tplTbNone');\r
410                         }\r
411                         break;\r
412                     case 1:\r
413                         if (is_array($template)) {\r
414                             $template =  $template['NP_TrackBack_tplTbOne'];\r
415                         } else {\r
416                             $template =  $this->getOption('tplTbOne');\r
417                         }\r
418                         break;\r
419                     default:\r
420                         if (is_array($template)) {\r
421                             $template =  $template['NP_TrackBack_tplTbMore'];\r
422                         } else {\r
423                             $template =  $this->getOption('tplTbMore');\r
424                         }\r
425                         break;\r
426                 }\r
427                 echo TEMPLATE::fill($template, array('number' => $count));\r
428                 break;\r
429             case 'list':\r
430             case '':\r
431                 // Shows the TrackBack list\r
432                 $this->showList($tb_id, $amount);\r
433                 break;\r
434             case 'required':\r
435                 // show requred URL\r
436                 echo  $this->getRequiredURL($tb_id);\r
437                 break;\r
438             case 'locallist':\r
439                 // shows the Local list\r
440                 $this->showLocalList($tb_id);\r
441                 break;\r
442             default:\r
443                 return;\r
444         }\r
445     }\r
446 \r
447 // }}}\r
448 // {{{ function doTemplateVar(&$item, $what = '', $template = '')\r
449 \r
450     /**\r
451      * template vars process\r
452      *\r
453      * @param obj\r
454      * @param str\r
455      * @param str\r
456      */\r
457     function doTemplateVar(&$item, $what = '', $template = '')\r
458     {\r
459         $this->doSkinVar('template', $what, $item->itemid, $template);\r
460     }\r
461 \r
462 // }}}\r
463 // {{{ function doTemplateCommentsVar(&$item, &$comment, $what = '', $template = '')\r
464 \r
465     /**\r
466      * comment template vars process\r
467      *\r
468      * @param obj\r
469      * @param obj\r
470      * @param str\r
471      * @param str\r
472      */\r
473     function doTemplateCommentsVar(&$item, &$comment, $what = '', $template = '')\r
474     {\r
475         $this->doSkinVar('templatecomments', $what, $item->itemid, $template);\r
476     }\r
477 \r
478 // }}}\r
479 // {{{ function doAction($type)\r
480 \r
481     /**\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
485      *\r
486      * @param str\r
487      */\r
488     function doAction($type)\r
489     {\r
490         global $CONF,$manager;\r
491         $aActionsNotToCheck = array(\r
492             '',\r
493             'ping',\r
494             'form',\r
495             'redirect',\r
496             'left',\r
497         );\r
498         if (!in_array($type, $aActionsNotToCheck)) {\r
499             if (!$manager->checkTicket()) return _ERROR_BADTICKET;\r
500         }\r
501         switch ($type) {\r
502             case '':\r
503             // When no action type is given, assume it's a ping\r
504                 $errorMsg = $this->handlePing();\r
505                 $this->xmlResponse($errorMsg);\r
506                 break; \r
507             case 'ping':\r
508             // Manual ping\r
509                 $errorMsg = $this->handlePing();\r
510                 if ($errorMsg != '') {\r
511                     $this->showManualPingError(intRequestVar('tb_id'), $errorMsg);\r
512                 } else {\r
513                     $this->showManualPingSuccess(intRequestVar('tb_id'));\r
514                 }\r
515                 break; \r
516             case 'form':\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
522                 } else {\r
523                     if (!empty(requestVar['template'])) {\r
524                         $template =& $manager->getTemplate(requestVar['template']); \r
525                         $template =  $template['NP_TrackBack_tplTbNoAccept'];\r
526                     } else {\r
527                         $template =  $this->getOption('tplTbNoAccept');\r
528                     }\r
529                     echo TEMPLATE::fill($template, array());\r
530                 }\r
531                 break;\r
532             case 'detect':\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
540                 break;\r
541             case 'redirect':\r
542             // redirect \r
543                 return $this->redirect(intRequestVar('tb_id'), requestVar('urlHash'));\r
544                 break;\r
545             case 'left':\r
546                 echo $this->showLeftList(intRequestVar('tb_id'), intRequestVar('amount'));\r
547                 break;\r
548             case 'deletelc':\r
549             // delete a trackback(local)\r
550                 $err = $this->deleteLocal(intRequestVar('tb_id'), intRequestVar('from_id'));\r
551                 if ($err) {\r
552                     return $err;\r
553                 }\r
554                 header('Location: ' . serverVar('HTTP_REFERER'));\r
555                 break;\r
556         }\r
557         exit;\r
558     }\r
559 \r
560 // }}}\r
561 // {{{ function doIf($key = '', $value = '')\r
562 \r
563     /**\r
564      * COMPARE key and value\r
565      *\r
566      * @param str\r
567      * @param str\r
568      */\r
569     function doIf($key = '', $value = '')\r
570     {\r
571         global $itemid;\r
572         //echo "key: $key, value: $value";\r
573         switch (strtolower($key)) {\r
574             case '':\r
575             case 'accept':\r
576                 if ($value == '') {\r
577                     $value = 'yes';\r
578                 }\r
579                 $value = ($value == 'no' || (!$value)) ? false : true;\r
580                 $ret   = false;\r
581                 if ($itemid) {\r
582                     $ret = $this->isAcceptTrackBack($itemid);\r
583                 } else {\r
584                     $ret = $this->isAcceptTrackBack();\r
585                 }\r
586                 return ($value == false) ? (!$ret) : $ret;\r
587             case 'required':\r
588                 if ($value == '') {\r
589                     $value = 'yes';\r
590                 }\r
591                 $value = ($value == 'no' || (!$value)) ? false : true;\r
592                 $ret = false;\r
593                 if( $itemid ) {\r
594                     $ret = $this->isEnableLinkCheck($itemid);\r
595                 }\r
596                 return ($value == false) ? (!$ret) : $ret;\r
597             default:\r
598                 return false;\r
599         }\r
600     }\r
601 \r
602 // }}}\r
603 // {{{ function event_InitSkinParse(&$data)\r
604 \r
605     /**\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
609      *\r
610      * @param arr\r
611      */\r
612     function event_InitSkinParse(&$data)\r
613     {\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
619             }\r
620         }\r
621         \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
626             } else {\r
627                 $this->xmlResponse();\r
628             }\r
629             exit;\r
630         }\r
631     }\r
632 \r
633 // }}}\r
634 // {{{ function event_TemplateExtraFields(&$data)\r
635 \r
636     /**\r
637      * extra template field\r
638      *\r
639      * @param arr\r
640      */\r
641     function event_TemplateExtraFields(&$data)\r
642     {\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
649         );\r
650     }\r
651 \r
652 // }}}\r
653 // {{{ function event_SendTrackback($data)\r
654 \r
655     /**\r
656      * trackbackping send via xmlrpc\r
657      *\r
658      * @param arr\r
659      */\r
660     function event_SendTrackback($data)\r
661     {\r
662         global $manager;\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
668         if (!$item) {\r
669             return; // don't ping for draft & future\r
670         }\r
671         if ($item['draft']) {\r
672             return;   // don't ping on draft items\r
673         }\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
683         \r
684         while (list(,$url) = each($data['urls'])) {\r
685             $res = $this->sendPing($itemid, $title, $url, $excerpt, $blog_name, $url);\r
686             if ($res) {\r
687                 ACTIONLOG::add(WARNING, 'TrackBack Error:' . $res . ' (' . $url . ')');\r
688             }\r
689         }\r
690     }\r
691 \r
692 // }}}\r
693 // {{{ function event_RetrieveTrackback($data)\r
694 \r
695     /**\r
696      * trackbackping receive via xmlrpc\r
697      *\r
698      * @param arr\r
699      */\r
700     function event_RetrieveTrackback($data)\r
701     {\r
702         \r
703         $res = sql_query('\r
704             SELECT \r
705                 `url`,\r
706                 `title`,\r
707                 UNIX_TIMESTAMP(`timestamp`) AS timestamp\r
708             FROM\r
709                 `' . sql_table('plugin_tb') . '`\r
710             WHERE\r
711                 `tb_id` = ' . intval($data['tb_id']) . ' AND\r
712                 `block` = 0\r
713             ORDER BY\r
714                 `timestamp` ASC\r
715         ');\r
716         \r
717         while ($row = sql_fetch_assoc($res)) {\r
718             $trackback = array(\r
719                 'title' => $row['title'],\r
720                 'url'   => $row['url'],\r
721                 'ip'    => ''\r
722             );\r
723             $data['trackbacks'][] = $trackback;\r
724         }\r
725     }\r
726 \r
727 // }}}\r
728 // {{{ function event_BookmarkletExtraHead($data)\r
729 \r
730     /**\r
731      * insert extra code to <head /> tags on bookmarklet\r
732      *\r
733      * @param arr\r
734      *\r
735     function event_BookmarkletExtraHead($data)\r
736     {\r
737         global $NP_TB_URL;\r
738         list ($NP_TB_URL,) = $this->getURIfromLink(requestVar('loglink'));\r
739     } \r
740 \r
741 // }}}\r
742 // {{{ function event_PrepareItemForEdit($data)\r
743 \r
744     /**\r
745      * auto discover from item body\r
746      *\r
747      * @param arr\r
748      */\r
749     function event_PrepareItemForEdit($data)\r
750     {\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
754         }\r
755     } \r
756 \r
757 // }}}\r
758 // {{{ function event_PostAddItem($data)\r
759 \r
760     /**\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
763      *\r
764      * @param arr\r
765      */\r
766     function event_PostAddItem($data)\r
767     {\r
768         $this->pingTrackback($data);\r
769     }\r
770 \r
771 // }}}\r
772 // {{{ function event_PreUpdateItem($data)\r
773 \r
774     /**\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
777      *\r
778      * @param arr\r
779      */\r
780     function event_PreUpdateItem($data)\r
781     {\r
782         $this->pingTrackback($data);\r
783     }\r
784 \r
785 // }}}\r
786 // {{{ function event_AddItemFormExtras($data)\r
787 \r
788     /**\r
789      * Add trackback options to add item form/bookmarklet\r
790      *\r
791      * @param arr\r
792      */\r
793     function event_AddItemFormExtras($data)\r
794     {\r
795         $this->itemFormExtra($data, 'add');\r
796     }\r
797 \r
798 // }}}\r
799 // {{{ function event_PreUpdateItem($data)\r
800 \r
801     /**\r
802      * Add trackback options to edit item form/bookmarklet\r
803      *\r
804      * @param arr\r
805      */\r
806     function event_EditItemFormExtras($data)\r
807     {\r
808         $this->itemFormExtra($data, 'edit');\r
809     }\r
810 \r
811 // }}}\r
812 // {{{ function showLeftList($tb_id, $offset = 0, $amount = 99999999, $templateName = '')\r
813 \r
814     /**\r
815      * Show a list of left trackbacks for this ID\r
816      *\r
817      * @param int\r
818      * @param int\r
819      * @param int\r
820      * @param str\r
821      */\r
822     function showLeftList($tb_id, $offset = 0, $amount = 99999999, $templateName = '')\r
823     {\r
824         global $manager, $blog, $CONF;\r
825         $tb_id = intval($tb_id);\r
826         $out   = array();\r
827         $query = '\r
828             SELECT \r
829                 `url`, \r
830                 md5(`url`) as urlHash,\r
831                 `blog_name`,\r
832                 `excerpt`,\r
833                 `title`,\r
834                 UNIX_TIMESTAMP(`timestamp`) AS timestamp\r
835             FROM\r
836                 `' . sql_table('plugin_tb') . '`\r
837             WHERE\r
838                 `tb_id` = ' . $tb_id . ' AND\r
839                 `block` = 0\r
840             ORDER BY \r
841                 `timestamp` DESC\r
842         ';\r
843         if ($offset) {\r
844             $query .= ' LIMIT ' . intval($offset) . ', ' . intval($amount);\r
845         }\r
846         $res       = sql_query($query);\r
847         $templates = '';\r
848         if (!empty($templateName)) {\r
849             $templates =& $manager->getTemplate($templateName);\r
850         }\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
862             }\r
863             $iVars = array(\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
871             );\r
872             if ($this->getOption('HideUrl') == 'yes') {\r
873                 $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack'\r
874                               . '&amp;type=redirect&amp;tb_id=' . $tb_id\r
875                               . '&amp;urlHash=' . $row['urlHash']\r
876                               . '&amp;template=' . $templateName;\r
877             } else {\r
878                 $iVars['url'] = $row['url'];\r
879             }\r
880             if (is_array($templates)) {\r
881                 $template = $templates['NP_TrackBack_tplItem'];\r
882             } else {\r
883                 $template = $this->getOption('tplItem');\r
884             }\r
885             $out[] = TEMPLATE::fill($template, $iVars);\r
886         }\r
887         sql_free_result($res);\r
888         return implode("\n", $out);\r
889     }\r
890 \r
891 // }}}\r
892 // {{{ function showList($tb_id, $amount = 0, $templateName = '')\r
893 \r
894     /**\r
895      * Show a list of trackbacks for this ID\r
896      *\r
897      * @param int\r
898      * @param int\r
899      * @param str\r
900      */\r
901     function showList($tb_id, $amount = 0, $templateName = '')\r
902     {\r
903         $tb_id = intval($tb_id);\r
904         global $manager, $blog, $CONF, $member;\r
905         $enableHideurl = true;\r
906         // for TB LinkLookup\r
907         if( \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
913         ) {\r
914             $enableHideurl = false;\r
915             $amount        = '-1';\r
916         }\r
917         $query = '\r
918             SELECT \r
919                 `url`, \r
920                 md5(`url`) as urlHash,\r
921                 `blog_name`,\r
922                 `excerpt`,\r
923                 `title`,\r
924                 UNIX_TIMESTAMP(`timestamp`) AS timestamp\r
925             FROM\r
926                 `' . sql_table('plugin_tb') . '`\r
927             WHERE\r
928                 `tb_id` = ' . $tb_id . ' AND\r
929                 `block` = 0\r
930             ORDER BY \r
931                 `timestamp` DESC\r
932         ';\r
933         if ($amount == '-1') {\r
934             $query .= ' LIMIT 9999999';\r
935         } elseif($amount) {\r
936             $query .= ' LIMIT ' . intval($amount);\r
937         }\r
938         if ($amount != 0) {\r
939             $res = sql_query($query);\r
940         }\r
941         $gVars = array(\r
942             'action'   => $this->getTrackBackUrl($tb_id),\r
943             'form'     => $this->getManualPingUrl($tb_id),\r
944             'required' => $this->getRequiredURL($tb_id),\r
945         );\r
946         $templates = '';\r
947         if (!empty($templateName)) {\r
948             $templates =& $manager->getTemplate($templateName);\r
949         }\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
955         }\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
961         } else {\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
966         }\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
979             }\r
980             $iVars = array(\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
988             );\r
989             if ($enableHideurl && $this->getOption('HideUrl') == 'yes') {\r
990                 $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack'\r
991                               . '&amp;type=redirect&amp;tb_id=' . $tb_id\r
992                               . '&amp;urlHash=' . $row['urlHash'];\r
993             } else {\r
994                 $iVars['url'] = $row['url'];\r
995             }\r
996             echo TEMPLATE::fill($tpl_Item, $iVars);\r
997         }\r
998         $q = '\r
999             SELECT \r
1000                 count(*) \r
1001             FROM \r
1002                 `' . sql_table('plugin_tb') . '`\r
1003             WHERE \r
1004                 `tb_id` = ' . $tb_id . ' AND\r
1005                 `block` = 0\r
1006             ORDER BY\r
1007                 `timestamp` DESC\r
1008         ';\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}&amp;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
1022 \r
1023 ___SCRIPTCODE___;\r
1024         }\r
1025         if (sql_num_rows($res) == 0) {\r
1026                 echo TEMPLATE::fill($tpl_Empt, $gVars);\r
1027         }\r
1028         sql_free_result($res);\r
1029         echo TEMPLATE::fill($tpl_Foot, $gVars);\r
1030     }\r
1031 \r
1032 // }}}\r
1033 // {{{ function getTrackBackCount($tb_id)\r
1034 \r
1035     /**\r
1036      * Returns the TrackBack count for a TrackBack item\r
1037      *\r
1038      * @param int\r
1039      * @return str\r
1040      */\r
1041     function getTrackBackCount($tb_id)\r
1042     {\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
1045     }\r
1046 \r
1047 // }}}\r
1048 // {{{ function getManualPingUrl($itemid)\r
1049 \r
1050     /**\r
1051      * Returns the manual ping URL\r
1052      *\r
1053      * @param int\r
1054      * @return str\r
1055      */\r
1056     function getManualPingUrl($itemid)\r
1057     {\r
1058         global $CONF;\r
1059         return $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;type=form&amp;tb_id=' . intval($itemid);\r
1060     }\r
1061 \r
1062 // }}}\r
1063 // {{{ function showManualPingError($itemid, $status = '')\r
1064 \r
1065     /**\r
1066      * Show the manual ping form\r
1067      *\r
1068      * @param int\r
1069      * @param str\r
1070      */\r
1071     function showManualPingError($itemid, $status = '')\r
1072     {\r
1073         global $CONF;\r
1074         $form    = true;\r
1075         $error   = true;\r
1076         $success = false;\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
1088     }\r
1089 \r
1090 // }}}\r
1091 // {{{ function showManualPingSuccess($itemid, $status = '')\r
1092 \r
1093     /**\r
1094      * Show the manual ping form\r
1095      *\r
1096      * @param int\r
1097      * @param str\r
1098      */\r
1099     function showManualPingSuccess($itemid, $status = '')\r
1100     {\r
1101         global $CONF;\r
1102         $form    = false;\r
1103         $error   = false;\r
1104         $success = true;\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
1116     }\r
1117 \r
1118 // }}}\r
1119 // {{{ function showManualPingForm($itemid, $text = '', $templateName = '')\r
1120 \r
1121     /**\r
1122      * Show the manual ping form\r
1123      *\r
1124      * @param int\r
1125      * @param str\r
1126      * @param str\r
1127      */\r
1128     function showManualPingForm($itemid, $text = '', $templateName = '')\r
1129     {\r
1130         global $CONF;\r
1131         $form    = true;\r
1132         $error   = false; \r
1133         $success = false;\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
1139             } else {\r
1140                 $template =  $this->getOption('tplTbNoAccept');\r
1141             }\r
1142             $text  =  TEMPLATE::fill($template, array());\r
1143             $form  = false;\r
1144             $error = true;\r
1145         }\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
1157     }\r
1158 \r
1159 // }}}\r
1160 // {{{ function getTrackBackUrl($itemid)\r
1161 \r
1162     /**\r
1163      * Returns the trackback URL\r
1164      *\r
1165      * @param int\r
1166      */\r
1167     function getTrackBackUrl($itemid)\r
1168     {\r
1169         global $CONF;\r
1170         return $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;tb_id='.$itemid;\r
1171     }\r
1172 \r
1173 // }}}\r
1174 // {{{ function itemFormExtra($data, $type = 'add')\r
1175 \r
1176     /**\r
1177      * Add trackback options to add/edit item form/bookmarklet\r
1178      *\r
1179      * @param int\r
1180      * @param str\r
1181      */\r
1182     function itemFormExtra($data, $type = 'add')\r
1183     {\r
1184         $listIt = _TB_LIST_IT;\r
1185         $admURL = $this->getAdminURL();\r
1186         echo <<<___FORMEXTRA___\r
1187     <h3>TrackBack</h3>\r
1188     <p>\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
1192 \r
1193 ___FORMEXTRA___;\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
1203             </table>\r
1204             <input type="hidden" id="tb_url_amount" name="tb_url_amount" value="0" /> \r
1205         </div>\r
1206 \r
1207 ___FORMEXTRA___;\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
1213                 $i = 0;\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
1218                     }\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
1221                     $i++;\r
1222                 }\r
1223             }\r
1224         }\r
1225         echo "</p>\n";\r
1226     }\r
1227 \r
1228 // }}}\r
1229 // {{{ function jsautodiscovery()\r
1230 \r
1231     /**\r
1232      * Insert Javascript AutoDiscovery routines\r
1233      */\r
1234     function jsautodiscovery()\r
1235     {\r
1236         echo '<script type="text/javascript" src="' . $this->getAdminURL() . 'autodetect.php"></script>';\r
1237     }\r
1238 \r
1239 // }}}\r
1240 // {{{ function insertCode($itemid)\r
1241 \r
1242     /**\r
1243      * Insert RDF code for item\r
1244      *\r
1245      * @param int\r
1246      */\r
1247     function insertCode($itemid)\r
1248     {\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
1261 <!--\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
1265 <rdf:Description\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
1272 </rdf:RDF>\r
1273 -->\r
1274 \r
1275 ___RDFCODE___;\r
1276     }\r
1277 \r
1278 // }}}\r
1279 // {{{ function rssResponse($tb_id)\r
1280 \r
1281     /**\r
1282      * Retrieving TrackBack Pings (when __mode=rss)\r
1283      *\r
1284      * @param int\r
1285      */\r
1286     function rssResponse($tb_id)\r
1287     {\r
1288         $tb_id = intval($tb_id);\r
1289         global $manager, $CONF;\r
1290         $item =& $manager->getItem($tb_id, 0, 0);\r
1291         if ($item) {\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
1298 \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
1309 \r
1310             $query = 'SELECT '\r
1311                    .    '`url`, '\r
1312                    .    '`blog_name`, '\r
1313                    .    '`excerpt`, '\r
1314                    .    '`title`, '\r
1315                    .    'UNIX_TIMESTAMP(`timestamp`) as timestamp '\r
1316                    . 'FROM '\r
1317                    .    sql_table('plugin_tb') . ' '\r
1318                    . 'WHERE '\r
1319                    .    '`tb_id` = ' . $tb_id . ' AND '\r
1320                    .    '`block` = 0 '\r
1321                    . 'ORDER BY '\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
1332             }\r
1333             header('Content-Type: text/xml');\r
1334             echo $dom->saveXML();\r
1335         } else {\r
1336             $this->xmlResponse(_ERROR_NOSUCHITEM);\r
1337         }\r
1338     }\r
1339 \r
1340 // }}}\r
1341 // {{{ function sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_url)\r
1342 \r
1343     /**\r
1344      * Send a Trackback ping to another website\r
1345      *\r
1346      * @param int\r
1347      * @param str\r
1348      * @param str\r
1349      * @param str\r
1350      * @param str\r
1351      * @param str\r
1352      */\r
1353     function sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_url)\r
1354     {\r
1355 //        $sendEncoding = 'UTF-8';\r
1356         // 1. Check some basic things\r
1357         if (!$this->canSendPing()) {\r
1358             return _TB_msgNOTALLOWED_SEND;\r
1359         }\r
1360         if ($this->getOption('SendPings') == 'no') {\r
1361             return _TB_msgDISABLED_SEND;\r
1362         }\r
1363         if ($ping_url == '') {\r
1364             return _TB_msgNO_SENDER_URL;\r
1365         }\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
1370         }\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
1377         }\r
1378         $ch      = curl_init();\r
1379         $data    = array(\r
1380             'title'     => $title,\r
1381             'url'       => $url,\r
1382             'excerpt'   => $excerpt,\r
1383             'blog_name' => $blog_name\r
1384         );\r
1385         $options = array(\r
1386             CURLOPT_URL            => $ping_url,\r
1387             CURLOPT_POST           => 1,\r
1388             CURLOPT_POSTFIELDS     => $data,\r
1389             CURLOPT_RETURNTRANSFER => 1,\r
1390         );\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
1395         }\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
1399         }\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
1406         }\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
1412         }\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
1420             }\r
1421             return sprintf(_TB_msgAN_ERROR_OCCURRED, htmlspecialchars($mesage, ENT_QUOTES));\r
1422         }\r
1423         return '';\r
1424     }\r
1425 \r
1426 // }}}\r
1427 // {{{ function handlePing($tb_id = 0)\r
1428 \r
1429     /**\r
1430      * Send a Trackback ping to another website\r
1431      *\r
1432      * @param int\r
1433      * @return str\r
1434      */\r
1435     function handlePing($tb_id = 0)\r
1436     {\r
1437         global $manager;\r
1438         // Defaults\r
1439         $span  = false;\r
1440         $link  = false;\r
1441         $block = false;\r
1442         $rss   = false;\r
1443         if ($tb_id == 0) {\r
1444             $tb_id = intRequestVar('tb_id');\r
1445         }\r
1446         if (requestVar('__mode') == 'rss') {\r
1447             $rss = true;\r
1448         }\r
1449         if ($this->isEnableLinkCheck($tb_id)) {\r
1450             $block = true;\r
1451         }\r
1452         if (!$tb_id) {\r
1453             return _TB_msgTBID_IS_MISSING;\r
1454         }\r
1455         if ((!$manager->existsItem($tb_id,0,0)) && ($this->getOption('CheckIDs') == 'yes')) {\r
1456             return _ERROR_NOSUCHITEM;\r
1457         }\r
1458         // 0. Check if we need to output the list as rss\r
1459         if ($rss) {\r
1460             $this->rssResponse($tb_id);\r
1461             return;\r
1462         }\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
1468         }\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
1478             }\r
1479         } else {\r
1480             return _TB_msgNO_SENDER_URL;\r
1481         }\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
1488         } else {\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
1495         }\r
1496         // 3. Save data in the DB\r
1497         $res = sql_query("\r
1498             SELECT \r
1499                 `tb_id`,\r
1500                 `block`,\r
1501                 `spam`\r
1502             FROM \r
1503                 `' . sql_table('plugin_tb') . '`\r
1504             WHERE \r
1505                 `url`   = '" . sql_real_escape_string($url) . "' AND \r
1506                 `tb_id` = '" . intval($tb_id) . "'\r
1507         ");\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
1512                 UPDATE\r
1513                     `" . sql_table('plugin_tb') . "`\r
1514                 SET \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
1519                 WHERE \r
1520                     `url`       = '" . sql_real_escape_string($url) . "' AND \r
1521                     `tb_id`     = '" . sql_real_escape_string(intval($tb_id)) . "'\r
1522             ');\r
1523             if (!$res) {\r
1524                 return sprintf(_TB_msgTB_COULDNOT_TB_UPDATE, sql_error());\r
1525             }\r
1526         } else {\r
1527             // spam block\r
1528             $res = sql_query('\r
1529                 SELECT \r
1530                     `id` \r
1531                 FROM \r
1532                     `' . sql_table('plugin_tb') . '` \r
1533                 WHERE \r
1534                     `block` = 1 and \r
1535                     `url`   = "' . sql_real_escape_string($url) . '"\r
1536             ');\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
1541             }\r
1542             // 4. SPAM check (for SpamCheck API 2 /w compat. API 1)\r
1543             $spamcheck = array (\r
1544                 'type'     => 'trackback',\r
1545                 'id'       => $tb_id,\r
1546                 'title'    => $title,\r
1547                 'excerpt'  => $excerpt,\r
1548                 'blogname' => $blog_name,\r
1549                 'url'      => $url,\r
1550                 'return'   => true,\r
1551                 'live'     => true,\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
1555             );\r
1556             $manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));\r
1557             if (isset($spamcheck['result']) && $spamcheck['result'] == true) {\r
1558                 $spam = true;\r
1559             }\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
1568                     } else {\r
1569                         $itemLink = $b->getURL();\r
1570                     }\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
1576                             $link = true;\r
1577                             break;\r
1578                         }\r
1579                     }\r
1580                     if (!$link) {\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
1585                         } else {\r
1586                             ACTIONLOG :: add(INFO, sprintf(_TB_msgLINK_CHECK_BLOCK, $tb_id, $url, $cnt, $itemLinkPat));\r
1587                         }\r
1588                     }\r
1589                 }\r
1590             }\r
1591             // 6. Determine if Trackback is safe...\r
1592             if ($enableLinkCheck) {\r
1593                 $block = ($spam == true || $link == false);\r
1594             } else {\r
1595                 $block = $spam == true;\r
1596             }\r
1597             $query = '\r
1598                 INSERT INTO \r
1599                     `' . sql_table('plugin_tb') . '` \r
1600                 SET\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
1610             ';\r
1611             $res = sql_query($query);\r
1612             if (!$res) {\r
1613                 return _TB_msgCOULDNOT_SAVE_DOUBLE . mysql_error() . $query;\r
1614             }\r
1615         }\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
1621             $vars = array (\r
1622                 'tb_id'    => $tb_id,\r
1623                 'url'      => $url,\r
1624                 'title'    => $title,\r
1625                 'excerpt'  => $excerpt,\r
1626                 'blogname' => $blog_name\r
1627             );\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
1634             }\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
1642             }\r
1643         }\r
1644         if( $block ) {\r
1645             return _TB_tplNO_ACCEPT;\r
1646         }\r
1647             return '';\r
1648     }\r
1649 \r
1650 // }}}\r
1651 // {{{ function xmlResponse($errorMessage = '')\r
1652 \r
1653     /**\r
1654      * Send a Trackback ping to another website\r
1655      *\r
1656      * @param str\r
1657      */\r
1658     function xmlResponse($errorMessage = '')\r
1659     {\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
1667             } elase {\r
1668                 $response->appendChild($dom->createElement('error', '0'));\r
1669             }\r
1670         }\r
1671         exit;\r
1672     }\r
1673 \r
1674 // }}}\r
1675 // {{{ function canSendPing()\r
1676 \r
1677     /**\r
1678      * Check if member may send ping (check if logged in)\r
1679      *\r
1680      * @return bool\r
1681      */\r
1682     function canSendPing()\r
1683     {\r
1684         global $member;\r
1685         return $member->isLoggedIn() || $this->xmlrpc;\r
1686     }\r
1687 \r
1688 // }}}\r
1689 // {{{ function redirect($tb_id, $urlHash)\r
1690 \r
1691     /**\r
1692      * Redirect to trackbacked\r
1693      *\r
1694      * @param int\r
1695      * @param str\r
1696      */\r
1697     function redirect($tb_id, $urlHash)\r
1698     {\r
1699         $que = '\r
1700             SELECT\r
1701                 `url` as result\r
1702             FROM\r
1703                 `%s`\r
1704             WHERE\r
1705                 `tb_id`    = %d AND\r
1706                 md5(`url`) = "%s"\r
1707         ';\r
1708         $url = htmlspecialchars(quickQuery(sprintf($que, $tb_id, $url_Hash)), ENT_QUOTES);\r
1709         if (empty($url)) {\r
1710             global $CONF;\r
1711             $url = $CONF['SiteURL'];\r
1712         }\r
1713         $url = htmlspecialchars_decode(stripslashes($url), ENT_QUOTES);\r
1714         header('Location: ' . $url);\r
1715     }\r
1716 \r
1717 // }}}\r
1718 // {{{ function getRequiredURL($itemid)\r
1719 \r
1720     /**\r
1721      * Get required URL for link check\r
1722      *\r
1723      * @param int\r
1724      * @return str\r
1725      */\r
1726     function getRequiredURL($itemid)\r
1727     {\r
1728         global $manager;\r
1729         $blog =& $manager->getBlog(getBlogIDFromItemID(intval($itemid)));\r
1730         if ($this->isEnableLinkCheck(intval($itemid))) {\r
1731             return $this->_createItemLink(intval($itemid), $blog);\r
1732         }\r
1733         return '';\r
1734     }\r
1735 \r
1736 // }}}\r
1737 // {{{ function isEnableLinkCheck($itemid)\r
1738 \r
1739     /**\r
1740      * Is link check Enable ?\r
1741      *\r
1742      * @param int\r
1743      * @return bool\r
1744      */\r
1745     function isEnableLinkCheck($itemid)\r
1746     {\r
1747         switch($this->getItemOption($itemid, 'isAcceptW/OLink')) {\r
1748             case 'yes':\r
1749                 return false;\r
1750                 break;\r
1751             case 'no':\r
1752                 return true;\r
1753                 break;\r
1754             case 'default'\r
1755             default:\r
1756                 $blogid = getBlogIDFromItemID(intval($itemid));\r
1757                 $def    = $this->getBlogOption(intval($blogid), 'isAcceptW/OLinkDef');\r
1758                 return $def != 'yes';\r
1759                 break;\r
1760         }\r
1761     }\r
1762 \r
1763 // }}}\r
1764 // {{{ function isAcceptTrackBack($itemid = null)\r
1765 \r
1766     /**\r
1767      * Is TrackBack Accept ?\r
1768      *\r
1769      * @param int\r
1770      * @return bool\r
1771      */\r
1772     function isAcceptTrackBack($itemid = null)\r
1773     {\r
1774         $ret = false;\r
1775         if ($this->getOption('AcceptPing') == 'yes') {\r
1776             if ($itemid) {\r
1777                 $bid = getBlogIDFromItemID(intval($itemid));\r
1778             } else {\r
1779                 global $blog;\r
1780                 if ($blog) {\r
1781                     $bid = $blog->getID();\r
1782                 } else {\r
1783                     global $CONF;\r
1784                     $bid = $CONF['DefaultBlog'];\r
1785                 }\r
1786             }\r
1787             if ($this->getBlogOption($bid, 'AllowTrackBack') == 'yes') {\r
1788                 if ($itemid) {\r
1789                     $ret = $this->$this->getItemOption(intval($itemid), 'ItemAcceptPing') == 'yes' ? true : false;\r
1790                 } else {\r
1791                     $ret = true;\r
1792                 }\r
1793             } else {\r
1794                 $ret = false;\r
1795             }\r
1796         }\r
1797         return $ret;\r
1798     }\r
1799 \r
1800 // }}}\r
1801 // {{{ function pingTrackback($data)\r
1802 \r
1803     /**\r
1804      * Ping all URLs\r
1805      *\r
1806      * @param array\r
1807      */\r
1808     function pingTrackback($data)\r
1809     {\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
1819         }\r
1820         $ping_urls_count = count($ping_urls);\r
1821         $tb_url_amount   = requestVar('tb_url_amount');\r
1822 \r
1823 \r
1824 \r
1825 \r
1826 \r
1827 \r
1828                 /**\r
1829                  * Ping all URLs\r
1830                  */\r
1831                 function pingTrackback($data) {\r
1832                         global $manager, $CONF;\r
1833                         \r
1834                         $ping_urls_count = 0;\r
1835                         $ping_urls = array();\r
1836                         $localflag = array();\r
1837                         \r
1838                         $ping_url = requestVar('trackback_ping_url');\r
1839 //modify start+++++++++\r
1840 /*\r
1841                         if ($ping_url) {\r
1842                                 $ping_urls[0] = $ping_url;\r
1843                                 $ping_urls_count++;\r
1844                         }\r
1845 */\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
1852                                 }\r
1853                         }\r
1854 //modify end+++++++++\r
1855         \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
1863                                 }\r
1864                         }\r
1865         \r
1866                         if ($ping_urls_count <= 0) {\r
1867                                 return;\r
1868                         }\r
1869         \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
1874         \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
1878 \r
1879                         $title      = $data['title'] != '' ? $data['title'] : $item['title'];\r
1880                         $title          = strip_tags($title);\r
1881 \r
1882                         $excerpt    = $data['body'] != '' ? $data['body'] : $item['body'];\r
1883                         $excerpt        = strip_tags($excerpt);\r
1884                         $excerpt    = $this->_cut_string($excerpt, 200);\r
1885         \r
1886 /*\r
1887                         $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());   \r
1888                         $url = createItemLink($itemid);\r
1889 */\r
1890                         $url    = $this->_createItemLink($item['itemid'],$blog);        \r
1891         \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
1896                                 else\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
1899                         }\r
1900                 }\r
1901 \r
1902 \r
1903 \r
1904 \r
1905 \r
1906 \r
1907 \r
1908 \r
1909 \r
1910 \r
1911 \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
1921 \r
1922             $query = 'SELECT '\r
1923                    .    '`url`, '\r
1924                    .    '`blog_name`, '\r
1925                    .    '`excerpt`, '\r
1926                    .    '`title`, '\r
1927                    .    'UNIX_TIMESTAMP(`timestamp`) as timestamp '\r
1928                    . 'FROM '\r
1929                    .    sql_table('plugin_tb') . ' '\r
1930                    . 'WHERE '\r
1931                    .    '`tb_id` = ' . $tb_id . ' AND '\r
1932                    .    '`block` = 0 '\r
1933                    . 'ORDER BY '\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
1944             }\r
1945             header('Content-Type: text/xml');\r
1946             echo $dom->saveXML();\r
1947 \r
1948 \r
1949 \r
1950 \r
1951 \r
1952 \r
1953 \r
1954 \r
1955 \r
1956 \r
1957 \r
1958 \r
1959 \r
1960 \r
1961 \r
1962 \r
1963 \r
1964 \r
1965 \r
1966 \r
1967 \r
1968 \r
1969 \r
1970 \r
1971 \r
1972 \r
1973 \r
1974 \r
1975 \r
1976 \r
1977 \r
1978 \r
1979 \r
1980 \r
1981 \r
1982 \r
1983 \r
1984 \r