OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@1020 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / NP_TrackBack / trunk / NP_TrackBack.php
1 <?php\r
2 // vim: tabstop=2:shiftwidth=2\r
3 \r
4    /* ==========================================================================================\r
5         * Trackback 2.0 for Nucleus CMS \r
6         * ==========================================================================================\r
7         * This program is free software and open source software; you can redistribute\r
8         * it and/or modify it under the terms of the GNU General Public License as\r
9         * published by the Free Software Foundation; either version 2 of the License,\r
10         * or (at your option) any later version.\r
11         *\r
12         * This program is distributed in the hope that it will be useful, but WITHOUT\r
13         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
14         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
15         * more details.\r
16         *\r
17         * You should have received a copy of the GNU General Public License along\r
18         * with this program; if not, write to the Free Software Foundation, Inc.,\r
19         * 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  or visit\r
20         * http://www.gnu.org/licenses/gpl.html\r
21         * ==========================================================================================\r
22         */\r
23 \r
24 define('NP_TRACKBACK_LINKCHECK_STRICT', 1);\r
25 define('NP_TRACKBACK_USE_XML_PARSER', 1);\r
26 define('NP_TRACKBACK_ENCODING_DETECT_ORDER', 'ASCII,ISO-2022-JP,UTF-8,EUC-JP,SJIS');\r
27 \r
28         class NP_TrackBack_XMLParser {\r
29                 function NP_TrackBack_XMLParser(){\r
30                         $this->isError = false;\r
31                         $this->inTarget = false;\r
32                 }\r
33         \r
34                 function parse($data){\r
35                         $rx = '/(<'.'?xml.*encoding=[\'"])(.*?)([\'"].*?'.'>)/m';\r
36                         if (preg_match($rx, $data, $m)) {\r
37                                 $encoding = strtoupper($m[2]);\r
38                         } else {\r
39                                 $encoding = mb_detect_encoding($data, NP_TRACKBACK_ENCODING_DETECT_ORDER);\r
40                         }\r
41                         \r
42                         if($encoding == "UTF-8" || $encoding == "ISO-8859-1") {\r
43                                 // noting\r
44                         } else {\r
45                                 $data = @mb_convert_encoding($data, "UTF-8", $encoding);\r
46                                 $data = str_replace ( $m[0], $m[1].'UTF-8'.$m[3], $data);\r
47                                 $encoding = 'UTF-8';\r
48                         }\r
49                         \r
50                         $this->parser = xml_parser_create($encoding);\r
51                         xml_set_object($this->parser, $this);\r
52                         xml_set_element_handler($this->parser, "_open", "_close");\r
53                         xml_set_character_data_handler($this->parser, "_cdata");\r
54                         xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, 'UTF-8').\r
55                         \r
56                         $this->words = array();\r
57                         xml_parse($this->parser, $data);\r
58                         $errcode = xml_get_error_code($this->parser);\r
59                     if ( $errcode != XML_ERROR_NONE ) {\r
60                         $this->isError = true;\r
61                                 $this->message = 'XML Parse Error: ' . xml_error_string($errcode) . ' in '. xml_get_current_line_number($this->parser);\r
62                     }\r
63                         return $this->message;\r
64                 }\r
65         \r
66                 function free(){\r
67                         xml_parser_free($this->parser);\r
68                 }\r
69         \r
70                 function _open($parser, $name, $attribute){\r
71                         switch( $name ){\r
72                                 case 'MESSAGE':\r
73                                         $this->inTarget = 'MESSAGE';\r
74                                         break;\r
75                                 case 'ERROR':\r
76                                         $this->inTarget = 'ERROR';\r
77                                         break;\r
78                         }\r
79                 }\r
80         \r
81                 function _close($parser, $name){\r
82                         if( $name == $this->inTarget ) $this->inTarget = null;\r
83                 }\r
84         \r
85                 function _cdata($parser, $data){\r
86                         switch( $this->inTarget ){\r
87                                 case 'MESSAGE':\r
88                                         $this->message = trim($data);\r
89                                         break;\r
90                                 case 'ERROR':\r
91                                         $this->isError = ($data ? true : false);\r
92                                         break;\r
93                         }\r
94                 }\r
95         }   \r
96    \r
97         class NP_TrackBack extends NucleusPlugin {\r
98                 var $useCurl = 1; // use curl? 2:precheck+read by curl, 1: read by curl 0: fread\r
99 \r
100 //modify start+++++++++\r
101                 function _createItemLink($itemid, $b){\r
102                         global $CONF, $manager;\r
103                         \r
104                         $itemLink = createItemLink($itemid,'');\r
105                         if( strpos($itemLink, 'http') === 0 ){\r
106                                 return $itemLink;\r
107                         }\r
108                                                 \r
109                         $blogurl = $b->getURL();\r
110                         if (!$blogurl) {\r
111                                 $b =& $manager->getBlog($CONF['DefaultBlog']);\r
112                                 $blogurl = $b->getURL();\r
113                                 if (!$blogurl) {\r
114                                         $blogurl = $CONF['IndexURL'];\r
115                                 }\r
116                         }\r
117                         \r
118                         if(substr($blogurl, -1) == '/')  $blogurl = substr($blogurl, 0, -1);\r
119                         $usePathInfo = ($CONF['URLMode'] == 'pathinfo');\r
120                         $itemUrlOrg = $CONF['ItemURL'];\r
121                         if( ! ($usePathInfo || substr($blogurl, -4) == '.php') ) $blogurl .= '/index.php';\r
122                         $CONF['ItemURL'] = $blogurl;\r
123                         \r
124                         $itemLink = createItemLink($itemid,'');\r
125                         $CONF['ItemURL'] = $itemUrlOrg;\r
126                         \r
127                         return $itemLink;\r
128                 }\r
129 //modify end+++++++++\r
130 \r
131         /**************************************************************************************\r
132          * SKIN VARS, TEMPLATE VARS AND ACTIONS\r
133                  */\r
134 \r
135                 /*\r
136                  * TrackBack data can be inserted using skinvars (or templatevars)\r
137                  */\r
138                 function doSkinVar($skinType, $what = '', $tb_id = '', $amount = 'limit-1') {\r
139 \r
140                         global $itemid, $manager, $CONF;\r
141 \r
142 //modify start+++++++++\r
143                         if(preg_match('/limit/i', $tb_id)){\r
144                                 $amount = $tb_id;\r
145                                 $tb_id = '';\r
146                         }\r
147                         $amount = intval(str_replace('limit', '', $amount));\r
148 //modify end+++++++++\r
149 \r
150                         if ($tb_id == '') $tb_id = intval($itemid);\r
151         \r
152 //mod by cles\r
153                         $isAcceptPing = $this->isAcceptTrackBack($tb_id);\r
154 \r
155                         //if( $skinType == 'template' && (! $isAcceptPing ) ){\r
156                         //      return;\r
157                         //}\r
158 //mod by cles end\r
159                         switch ($what) {\r
160                         \r
161                                 // Insert Auto-discovery RDF code\r
162                                 case 'tbcode':\r
163                                 case 'code':\r
164 //mod by cles\r
165 //                                      if($skinType == 'item')\r
166 \r
167                                         $spamcheck = array (\r
168                                                 'type'          => 'tbcode',\r
169                                                 'id'            => -1,\r
170                                                 'title'         => '',\r
171                                                 'excerpt'       => '',\r
172                                                 'blogname'      => '',\r
173                                                 'url'           => '',\r
174                                                 'return'        => true,\r
175                                                 'live'          => true,\r
176                                                 \r
177                                                 /* Backwards compatibility with SpamCheck API 1*/\r
178                                                 'data'          => '',\r
179                                                 'ipblock'   => true,\r
180                                         );\r
181                                         global $manager;\r
182                                         //$manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));\r
183                                         $spam = false;\r
184                                         if (isset($spamcheck['result']) && $spamcheck['result'] == true){\r
185                                                 $spam = true;\r
186                                         }\r
187 \r
188                                         if( ($skinType == 'item') && (!$spam) && $isAcceptPing  )\r
189 //mod by cles end\r
190                                                 $this->insertCode($tb_id);\r
191                                         break;\r
192                                         \r
193                                 // Insert TrackBack URL\r
194                                 case 'tburl':\r
195                                 case 'url':\r
196 //mod by cles\r
197 //                                      echo $this->getTrackBackUrl($tb_id);\r
198                                         if($isAcceptPing)\r
199                                                 echo $this->getTrackBackUrl($tb_id);\r
200                                         else\r
201                                                 echo 'Sorry, no trackback pings are accepted.';\r
202 //mod by cles end\r
203                                         break;\r
204                                 \r
205                                 // Insert manual ping URL\r
206                                 case 'form':\r
207                                 case 'manualpingformlink':\r
208                                         echo $this->getManualPingUrl($tb_id);\r
209                                         break;\r
210                                 \r
211                                 case 'sendpinglink':\r
212                                         echo $manager->addTicketToUrl($CONF['PluginURL'] . 'trackback/index.php?action=ping&amp;id=' . intval($tb_id));\r
213                                         break;\r
214         \r
215                                 // Insert TrackBack count\r
216                                 case 'count':\r
217                                         $count = $this->getTrackBackCount($tb_id);\r
218                                         switch ($count) {\r
219                                                 case 0:         echo TEMPLATE::fill($this->getOption('tplTbNone'), array('number' => $count)); break;\r
220                                                 case 1:         echo TEMPLATE::fill($this->getOption('tplTbOne'),  array('number' => $count)); break;\r
221                                                 default:        echo TEMPLATE::fill($this->getOption('tplTbMore'), array('number' => $count)); break;\r
222                                         }\r
223                                         break;\r
224 \r
225                                 // Shows the TrackBack list\r
226                                 case 'list':\r
227                                 case '':\r
228 //modify start+++++++++\r
229 //                                      $this->showList($tb_id);\r
230                                         $this->showList($tb_id, $amount);\r
231 //modify end+++++++++\r
232                                         break;\r
233 //mod by cles\r
234                                 // show requred URL\r
235                                 case 'required':\r
236                                         echo  $this->getRequiredURL($tb_id);\r
237                                         break;\r
238                                         \r
239                                 // shows the Local list\r
240                                 case 'locallist':\r
241                                         $this->showLocalList($tb_id);\r
242                                         break;                                  \r
243 //mod by cles end\r
244                                         \r
245                                 default:\r
246                                         return;\r
247                         }\r
248                 }\r
249         \r
250                 /*\r
251                  * When used in templates, the tb_id will be determined by the itemid there\r
252                  */\r
253                 function doTemplateVar(&$item, $what = '') {\r
254                         $this->doSkinVar('template', $what, $item->itemid);\r
255                 }\r
256                 \r
257                 function doTemplateCommentsVar(&$item, &$comment, $what = ''){\r
258                         $this->doSkinVar('templatecomments', $what, $item->itemid);\r
259                 }\r
260                 \r
261                 /*\r
262                 * A trackback ping is to be received on the URL\r
263                 * http://yourdomain.com/item/1234.trackback\r
264                 * Extra variables to be passed along are url, title, excerpt, blog_name\r
265                 */\r
266                 function event_InitSkinParse(&$data) {\r
267                         global $CONF, $itemid;\r
268                         $format = requestVar('format');\r
269                         \r
270                         if ($CONF['URLMode'] == 'pathinfo') {\r
271                                 if (preg_match('/(\/|\.)(trackback)(\/|$)/', serverVar('PATH_INFO'), $matches)) {\r
272                                         $format = $matches[2];\r
273                                 }\r
274                         }\r
275                         \r
276                         if ($format == 'trackback' && $data['type'] == 'item')\r
277                         {\r
278                                 $errorMsg = $this->handlePing(intval($itemid));\r
279                                 \r
280                                 if ($errorMsg != '')\r
281                                 $this->xmlResponse($errorMsg);\r
282                                 else\r
283                                 $this->xmlResponse();\r
284                                 \r
285                                 exit;\r
286                         }\r
287                 }\r
288 \r
289                 /*\r
290                  * A trackback ping is to be received on the URL\r
291                  * http://yourdomain.com/action.php?action=plugin&name=TrackBack&tb_id=1234\r
292                  * Extra variables to be passed along are url, title, excerpt, blog_name\r
293                  */\r
294                 function doAction($type)\r
295                 {\r
296                         global $CONF,$manager;\r
297                         $aActionsNotToCheck = array(\r
298                                 '',\r
299                                 'ping',\r
300                                 'form',\r
301                                 'redirect',\r
302                                 'left',\r
303                         );\r
304                         if (!in_array($type, $aActionsNotToCheck)) {\r
305                                 if (!$manager->checkTicket()) return _ERROR_BADTICKET;\r
306                         }\r
307                         \r
308                         switch ($type) {\r
309         \r
310                                 // When no action type is given, assume it's a ping\r
311                                 case '':\r
312                                         $errorMsg = $this->handlePing();\r
313                                         $this->xmlResponse($errorMsg);\r
314                                         break; \r
315                                         \r
316                                 // Manual ping\r
317                                 case 'ping':\r
318                                         $errorMsg = $this->handlePing();\r
319                                         if ($errorMsg != '')\r
320                                                 $this->showManualPingError(intRequestVar('tb_id'), $errorMsg);\r
321                                         else\r
322                                                 $this->showManualPingSuccess(intRequestVar('tb_id'));\r
323                                         break; \r
324         \r
325                                 // Show manual ping form\r
326                                 case 'form':\r
327 //mod by cles\r
328 //                                      $this->showManualPingForm(intRequestVar('tb_id'));\r
329                                         $tb_id = intRequestVar('tb_id');\r
330                                         $isAcceptPing = $this->isAcceptTrackBack($tb_id);\r
331                                         \r
332                                         if( $isAcceptPing )     \r
333                                                 $this->showManualPingForm($tb_id);\r
334                                         else\r
335                                                 echo 'Sorry, no trackback pings are accepted.';\r
336 //mod by cles end\r
337                                         break;\r
338         \r
339                                 // Detect trackback\r
340                                 case 'detect':\r
341                                         list($url, $title) = \r
342                                                 $this->getURIfromLink(html_entity_decode(requestVar('tb_link')));\r
343 \r
344                                         $url = addslashes($url);\r
345                                         $url = $this->_utf8_to_javascript($url);\r
346 \r
347                                         $title = addslashes($title);\r
348                                         $title = $this->_utf8_to_javascript($title);\r
349                                 \r
350                                         echo "tbDone('" . requestVar('tb_link') . "', '" . $url . "', '" . $title . "');";\r
351 \r
352                                         break;\r
353 //mod by cles\r
354                                 // redirect \r
355                                 case 'redirect':\r
356                                         return $this->redirect(intRequestVar('tb_id'), requestVar('urlHash'));\r
357                                         break;\r
358 //mod by cles end\r
359                                 case 'left':\r
360                                         echo $this->showLeftList(intRequestVar('tb_id'), intRequestVar('amount'));\r
361                                         break;\r
362                                 \r
363                                 // delete a trackback(local)\r
364                                 case 'deletelc':\r
365                                         $err = $this->deleteLocal(intRequestVar('tb_id'), intRequestVar('from_id'));\r
366                                         if( $err )\r
367                                                 return $err;\r
368                                         header('Location: ' . serverVar('HTTP_REFERER'));\r
369                                         break;\r
370                         } \r
371 \r
372                         exit;\r
373                 }\r
374                 \r
375                 function doIf($key = '', $value = '')\r
376                 {\r
377                         global $itemid;\r
378                         //echo "key: $key, value: $value";\r
379                         \r
380                         switch( strtolower($key) ){\r
381                                 case '':\r
382                                 case 'accept':\r
383                                         if( $value == '' ) $value = 'yes';\r
384                                         $value = ( $value == 'no' || (! $value) ) ? false : true;\r
385                                 \r
386                                         $ret = false;\r
387                                         if( $itemid )\r
388                                                 $ret = $this->isAcceptTrackBack($itemid);\r
389                                         else\r
390                                                 $ret = $this->isAcceptTrackBack();\r
391                                         return ( $value == false ) ? (! $ret) : $ret;\r
392                                         \r
393                                 case 'required':\r
394                                         if( $value == '' ) $value = 'yes';\r
395                                         $value = ( $value == 'no' || (! $value) ) ? false : true;\r
396                                         \r
397                                         $ret = false;\r
398                                         if( $itemid )\r
399                                                 $ret = $this->isEnableLinkCheck($itemid);\r
400                                         \r
401                                         return ( $value == false ) ? (! $ret) : $ret;\r
402                                         \r
403                                 default:\r
404                                         return false;\r
405                         }\r
406                 }\r
407 \r
408         /**************************************************************************************\r
409          * OUTPUT\r
410                  */\r
411 \r
412                 /*\r
413                  * Show a list of left trackbacks for this ID\r
414                  */\r
415                 function showLeftList($tb_id, $offset = 0, $amount = 99999999) {\r
416                         global $manager, $blog, $CONF;\r
417 \r
418                         $out = array();\r
419                         $query = '\r
420                                 SELECT \r
421                                         url, \r
422                                         md5(url) as urlHash,\r
423                                         blog_name, \r
424                                         excerpt, \r
425                                         title, \r
426                                         UNIX_TIMESTAMP(timestamp) AS timestamp \r
427                                 FROM \r
428                                         '.sql_table('plugin_tb').' \r
429                                 WHERE \r
430                                         tb_id = '.intval($tb_id).' AND\r
431                                         block = 0\r
432                                 ORDER BY \r
433                                         timestamp DESC\r
434                         ';\r
435                         if($offset)\r
436                                 $query .= ' LIMIT '.intval($offset).', ' .intval($amount);\r
437                         $res = sql_query($query);\r
438                         while ($row = mysql_fetch_array($res))\r
439                         {\r
440 \r
441                                 $row['blog_name']       = htmlspecialchars($row['blog_name'], ENT_QUOTES);\r
442                                 $row['title']           = htmlspecialchars($row['title'], ENT_QUOTES);\r
443                                 $row['excerpt']         = htmlspecialchars($row['excerpt'], ENT_QUOTES);\r
444                                 if (_CHARSET != 'UTF-8') {\r
445 //modify start+++++++++\r
446                                         $row['blog_name']       = $this->_restore_to_utf8($row['blog_name']);\r
447                                         $row['title']           = $this->_restore_to_utf8($row['title']);\r
448                                         $row['excerpt']         = $this->_restore_to_utf8($row['excerpt']);\r
449 //modify end+++++++++\r
450                                         $row['blog_name']       = $this->_utf8_to_entities($row['blog_name']);\r
451                                         $row['title']           = $this->_utf8_to_entities($row['title']);\r
452                                         $row['excerpt']         = $this->_utf8_to_entities($row['excerpt']);\r
453                                 }                               \r
454                                 $iVars = array(\r
455                                         'action'        => $this->getTrackBackUrl($tb_id),\r
456                                         'form'          => $this->getManualPingUrl($tb_id),\r
457                                         'name'          => $row['blog_name'],\r
458                                         'title'         => $row['title'],\r
459                                         'excerpt'       => $this->_cut_string($row['excerpt'], 400),\r
460                                         'url'           => htmlspecialchars($row['url'], ENT_QUOTES),\r
461                                         'date'          => htmlspecialchars(strftime($this->getOption('dateFormat'), $row['timestamp']), ENT_QUOTES)\r
462                                 );\r
463 \r
464 //mod by cles\r
465                                 if( $this->getOption('HideUrl') == 'yes' )\r
466                                         $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;type=redirect&amp;tb_id=' . $tb_id . '&amp;urlHash=' . $row['urlHash'];\r
467                                 else\r
468                                         $iVars['url'] = $row['url'];\r
469 //mod by cles end\r
470 \r
471                                 $out[] = TEMPLATE::fill($this->getOption('tplItem'), $iVars);\r
472                         }\r
473                         mysql_free_result($res);\r
474                         \r
475                         return @join("\n",$out);\r
476                 }\r
477 \r
478                 /*\r
479                  * Show a list of all trackbacks for this ID\r
480                  */\r
481                 function showList($tb_id, $amount = 0) {\r
482                         $tb_id = intval($tb_id);\r
483                         global $manager, $blog, $CONF, $member;\r
484 //mod by cles\r
485                         $enableHideurl = true;\r
486                         // for TB LinkLookup\r
487                         if( \r
488                                    strpos(serverVar('HTTP_USER_AGENT'),'Hatena Diary Track') === false\r
489                                 || strpos(serverVar('HTTP_USER_AGENT'),'NP_TrackBack') === false\r
490                                 || strpos(serverVar('HTTP_USER_AGENT'),'TBPingLinkLookup') === false\r
491                                 || strpos(serverVar('HTTP_USER_AGENT'),'MT::Plugin::BanNoReferTb') === false\r
492                                 || strpos(serverVar('HTTP_USER_AGENT'),'livedoorBlog') === false\r
493                         ){\r
494                                 $enableHideurl = false;\r
495                                 $amount = '-1';\r
496                         }\r
497 //mod by cles end\r
498 \r
499 /*\r
500                         $res = sql_query('\r
501                                 SELECT \r
502                                         url, \r
503                                         md5(url) as urlHash,\r
504                                         blog_name, \r
505                                         excerpt, \r
506                                         title, \r
507                                         UNIX_TIMESTAMP(timestamp) AS timestamp \r
508                                 FROM \r
509                                         '.sql_table('plugin_tb').' \r
510                                 WHERE \r
511                                         tb_id = '.$tb_id .' AND\r
512                                         block = 0\r
513                                 ORDER BY \r
514                                         timestamp ASC\r
515                         ');\r
516 */\r
517                         $query = '\r
518                                 SELECT \r
519                                         url, \r
520                                         md5(url) as urlHash,\r
521                                         blog_name, \r
522                                         excerpt, \r
523                                         title, \r
524                                         UNIX_TIMESTAMP(timestamp) AS timestamp \r
525                                 FROM \r
526                                         '.sql_table('plugin_tb').' \r
527                                 WHERE \r
528                                         tb_id = '.intval($tb_id) .' AND\r
529                                         block = 0\r
530                                 ORDER BY \r
531                                         timestamp DESC\r
532                         ';\r
533                         if( $amount == '-1' )\r
534                                 $query .= ' LIMIT 9999999';\r
535                         elseif( $amount )\r
536                                 $query .= ' LIMIT '.intval($amount);\r
537                         \r
538                         if( $amount != 0)\r
539                                 $res = sql_query($query);\r
540 \r
541                         $gVars = array(\r
542                                 'action' => $this->getTrackBackUrl(intval($tb_id)),\r
543                                 'form'   => $this->getManualPingUrl(intval($tb_id)),\r
544                                 'required' => $this->getRequiredURL(intval($tb_id)),\r
545                         );\r
546                         \r
547                         if ( $member->isLoggedIn() ){\r
548                                 $adminurl = htmlspecialchars($manager->addTicketToUrl($CONF['PluginURL'] . 'trackback/index.php?action=list&id=' . intval($tb_id)), ENT_QUOTES);\r
549                                 $pingformurl = htmlspecialchars($manager->addTicketToUrl($CONF['PluginURL'] . 'trackback/index.php?action=ping&id=' . intval($tb_id)), ENT_QUOTES);\r
550                                 $gVars['admin'] = '<a href="' . $adminurl . '" target="_blank">[admin]</a>';\r
551                                 $gVars['pingform'] = '<a href="' . $pingformurl . '" target="_blank">[pingform]</a>';\r
552                         }\r
553 \r
554                         echo TEMPLATE::fill($this->getOption('tplHeader'), $gVars);\r
555 \r
556 \r
557                         while ($amount != 0 && $row = mysql_fetch_array($res))\r
558                         {\r
559 \r
560                                 $row['blog_name']       = htmlspecialchars($row['blog_name'], ENT_QUOTES);\r
561                                 $row['title']           = htmlspecialchars($row['title'], ENT_QUOTES);\r
562                                 $row['excerpt']         = htmlspecialchars($row['excerpt'], ENT_QUOTES);\r
563 \r
564 /*\r
565 */\r
566                                 if (_CHARSET != 'UTF-8') {\r
567 //modify start+++++++++\r
568 /*\r
569                                         $row['blog_name']       = $this->_utf8_to_entities($row['blog_name']);\r
570                                         $row['title']           = $this->_utf8_to_entities($row['title']);\r
571                                         $row['excerpt']         = $this->_utf8_to_entities($row['excerpt']);\r
572 */\r
573                                         $row['blog_name']       = $this->_restore_to_utf8($row['blog_name']);\r
574                                         $row['title']           = $this->_restore_to_utf8($row['title']);\r
575                                         $row['excerpt']         = $this->_restore_to_utf8($row['excerpt']);\r
576 \r
577                                         $row['blog_name']       = mb_convert_encoding($row['blog_name'], _CHARSET, 'UTF-8');\r
578                                         $row['title']           = mb_convert_encoding($row['title'], _CHARSET, 'UTF-8');\r
579                                         $row['excerpt']         = mb_convert_encoding($row['excerpt'], _CHARSET, 'UTF-8');\r
580 //modify end+++++++++\r
581                                 }                               \r
582 \r
583 //modify start+++++++++\r
584 /*\r
585                                 $iVars = array(\r
586                                         'action'        => $this->getTrackBackUrl($tb_id),\r
587                                         'form'          => $this->getManualPingUrl($tb_id),\r
588                                         'name'          => $row['blog_name'],\r
589                                         'title'         => $row['title'],\r
590                                         'excerpt'       => $row['excerpt'],\r
591                                         'url'           => htmlspecialchars($row['url'], ENT_QUOTES),\r
592                                         'date'          => htmlspecialchars(strftime($this->getOption('dateFormat'), $row['timestamp'] + ($blog->getTimeOffset() * 3600)), ENT_QUOTES)\r
593                                 );\r
594 */\r
595                                 $iVars = array(\r
596                                         'action'        => $this->getTrackBackUrl($tb_id),\r
597                                         'form'          => $this->getManualPingUrl($tb_id),\r
598                                         'name'          => htmlspecialchars($row['blog_name'], ENT_QUOTES),\r
599                                         'title'         => htmlspecialchars($row['title'], ENT_QUOTES),\r
600                                         'excerpt'       => htmlspecialchars($this->_cut_string($row['excerpt'], 400), ENT_QUOTES),\r
601                                         'url'           => htmlspecialchars($row['url'], ENT_QUOTES),\r
602                                         'date'          => htmlspecialchars(strftime($this->getOption('dateFormat'), $row['timestamp']), ENT_QUOTES)\r
603                                 );\r
604 \r
605 //mod by cles\r
606                                 if( $enableHideurl && $this->getOption('HideUrl') == 'yes' )\r
607                                         $iVars['url'] = $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;type=redirect&amp;tb_id=' . intval($tb_id) . '&amp;urlHash=' . $row['urlHash'];\r
608                                 else\r
609                                         $iVars['url'] = $row['url'];\r
610 //mod by cles end\r
611 \r
612 //modify end+++++++++\r
613                                 echo TEMPLATE::fill($this->getOption('tplItem'), $iVars);\r
614                                 \r
615                         }\r
616 \r
617 //modify start+++++++++\r
618                         $q = '\r
619                                 SELECT \r
620                                         count(*) \r
621                                 FROM \r
622                                         '.sql_table('plugin_tb').' \r
623                                 WHERE \r
624                                         tb_id = '.intval($tb_id) .' AND\r
625                                         block = 0\r
626                                 ORDER BY \r
627                                         timestamp DESC\r
628                         ';\r
629                         $result = sql_query($q);\r
630                         $total = mysql_result($result,0,0);\r
631 \r
632                         if($amount != -1 && $total > $amount){\r
633                                 $leftcount = $total - $amount;\r
634 \r
635                                 echo '<script type="text/javascript" src="' . $this->getAdminURL() . 'detectlist.php?tb_id='.intval($tb_id).'&amp;amount='.intval($amount).'"></script>';\r
636 \r
637 ?>\r
638 \r
639 <a name="restoftrackback" id="restoftrackback"></a>\r
640 <div id="tbshownavi"><a href="#restoftrackback" onclick="resttbStart(); return false;" id="tbshow">Show left <?php echo $leftcount;?> Trackbacks</a></div>\r
641 <div id="tbhidenavi" style="display: none;"><a href="#restoftrackback" onclick="hideresttb(); return false;">Hide <?php echo $leftcount;?> Trackbacks</a></div>\r
642 <div id="resttb"></div>\r
643 \r
644 <?php\r
645                         }\r
646 //modify end+++++++++\r
647 \r
648                         if (mysql_num_rows($res) == 0) \r
649                         {\r
650                                 echo TEMPLATE::fill($this->getOption('tplEmpty'), $gVars);\r
651                         }\r
652                         mysql_free_result($res);\r
653                         \r
654                         echo TEMPLATE::fill($this->getOption('tplFooter'), $gVars);\r
655 \r
656                 }\r
657                         \r
658                 /*\r
659                  * Returns the TrackBack count for a TrackBack item\r
660                  */\r
661                 function getTrackBackCount($tb_id) {\r
662                         return quickQuery('SELECT COUNT(*) as result FROM ' . sql_table('plugin_tb') . ' WHERE tb_id='.intval($tb_id).' AND block = 0');\r
663                 }\r
664                 \r
665                 /**\r
666                   * Returns the manual ping URL\r
667                   */\r
668                 function getManualPingUrl($itemid) {\r
669                         global $CONF;\r
670                         return $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;type=form&amp;tb_id='.$itemid;\r
671                 }\r
672 \r
673                 /**\r
674                   * Show the manual ping form\r
675                   */\r
676                 function showManualPingError($itemid, $status = '') {\r
677                         global $CONF;\r
678 \r
679                         $form = true; $error = true; $success = false;\r
680                         sendContentType('text/html', 'admin-trackback', _CHARSET);      \r
681 //modify start+++++++++\r
682 //                      include ($this->getDirectory() . '/templates/form.html');\r
683                         require_once($this->getDirectory() . '/template.php');\r
684                         $mTemplate = new Trackback_Template(null, $this->getDirectory());\r
685                         $mTemplate->set ('CONF', $CONF);\r
686                         $mTemplate->set ('itemid', $itemid);\r
687                         $mTemplate->set ('form', $form);\r
688                         $mTemplate->set ('error', $error);\r
689                         $mTemplate->set ('success', $success);\r
690                         $mTemplate->set ('status', $status);\r
691                         $mTemplate->template('templates/form.html');\r
692                         echo $mTemplate->fetch();\r
693 //modify end+++++++++\r
694                 }\r
695                 \r
696                 function showManualPingSuccess($itemid, $status = '') {\r
697                         global $CONF;\r
698 \r
699                         $form = false; $error = false; $success = true;\r
700                         sendContentType('text/html', 'admin-trackback', _CHARSET);      \r
701 //modify start+++++++++\r
702                         //include ($this->getDirectory() . '/templates/form.html');\r
703                         require_once($this->getDirectory() . '/template.php');\r
704                         $mTemplate = new Trackback_Template(null, $this->getDirectory());\r
705                         $mTemplate->set ('CONF', $CONF);\r
706                         $mTemplate->set ('itemid', $itemid);\r
707                         $mTemplate->set ('form', $form);\r
708                         $mTemplate->set ('error', $error);\r
709                         $mTemplate->set ('success', $success);\r
710                         $mTemplate->set ('status', $status);\r
711                         $mTemplate->template('templates/form.html');\r
712                         echo $mTemplate->fetch();\r
713 //modify end+++++++++\r
714                 }\r
715                 \r
716                 function showManualPingForm($itemid, $text = '') {\r
717                         global $CONF;\r
718 \r
719                         $form = true; $error = false; $success = false;\r
720 \r
721                         // Check if we are allowed to accept pings\r
722                         if ( !$this->isAcceptTrackBack($itemid) ) {\r
723                                 $text = 'Sorry, no trackback pings are accepted';\r
724                                 $form = false; $error = true;\r
725                         }\r
726                         \r
727                         sendContentType('text/html', 'admin-trackback', _CHARSET);      \r
728 //modify start+++++++++\r
729                         //include ($this->getDirectory() . '/templates/form.html');\r
730                         require_once($this->getDirectory() . '/template.php');\r
731                         $mTemplate = new Trackback_Template(null, $this->getDirectory());\r
732                         $mTemplate->set ('CONF', $CONF);\r
733                         $mTemplate->set ('itemid', $itemid);\r
734                         $mTemplate->set ('form', $form);\r
735                         $mTemplate->set ('error', $error);\r
736                         $mTemplate->set ('success', $success);\r
737                         $mTemplate->set ('status', $status);\r
738                         $mTemplate->template('templates/form.html');\r
739                         echo $mTemplate->fetch();\r
740 //modify end+++++++++\r
741                 }\r
742         \r
743                 /**\r
744                   * Returns the trackback URL\r
745                   */\r
746                 function getTrackBackUrl($itemid) {\r
747                         global $CONF, $manager;\r
748                         return $CONF['ActionURL'] . '?action=plugin&amp;name=TrackBack&amp;tb_id='.$itemid;\r
749                 }               \r
750 \r
751                 /*\r
752                  * Insert RDF code for item\r
753                  */\r
754                 function insertCode($itemid) {\r
755                         $itemid = intval($itemid);\r
756                         global $manager, $CONF;\r
757 \r
758                         $item = & $manager->getItem($itemid, 0, 0);\r
759                         $blog = & $manager->getBlog(getBlogIDFromItemID($item['itemid']));\r
760                                 \r
761 /*\r
762                         $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());   \r
763                         $uri    = createItemLink($item['itemid'],'');   \r
764 */\r
765                         $uri    = $this->_createItemLink($item['itemid'],$blog);        \r
766                                         \r
767                         $title  = strip_tags($item['title']);\r
768                         $desc   = strip_tags($item['body']);\r
769                         $desc   = $this->_cut_string($desc, 200);\r
770                         $desc   = htmlspecialchars($desc, ENT_QUOTES);\r
771                         \r
772                         ?>\r
773                         <!--
774                         <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
775                                          xmlns:dc="http://purl.org/dc/elements/1.1/"
776                                          xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
777                         <rdf:Description
778                                          rdf:about="<?php echo $uri; ?>"
779                                          dc:identifier="<?php echo $uri; ?>"
780                                          dc:title="<?php echo $title; ?>"
781                                          dc:description="<?php echo $desc; ?>"
782                                          trackback:ping="<?php echo $this->getTrackBackUrl($itemid)?>"
783                                          dc:date="<?php echo strftime('%Y-%m-%dT%H:%M:%S')?>" />
784                         </rdf:RDF>
785                         -->
786                         <?php\r
787                 }\r
788 \r
789                 /**\r
790                  * Retrieving TrackBack Pings (when __mode=rss)\r
791                  */\r
792                 function rssResponse($tb_id) {\r
793                         $itemid = intval($itemid);\r
794                         global $manager, $CONF;\r
795                         $item =& $manager->getItem($tb_id, 0, 0);\r
796         \r
797                         if($item)\r
798                         {\r
799                                 $blog =& $manager->getBlog(getBlogIDFromItemID($item['itemid']));\r
800                                 \r
801                                 $blog_name  = $blog->getName();\r
802                                 $title      = $item['title'];\r
803                                 $excerpt    = $item['body'];\r
804 \r
805 //modify start+++++++++\r
806 /*\r
807                                 if (_CHARSET != 'UTF-8')\r
808                                 {\r
809                                         $title          = $this->_convert_to_utf8($title, $encoding);\r
810                                         $excerpt    = $this->_convert_to_utf8($excerpt, $encoding);\r
811                                         $blog_name  = $this->_convert_to_utf8($blog_name, $encoding);\r
812                                 }\r
813 \r
814                                 $title      = $this->_decode_entities(strip_tags($title));\r
815                                 $excerpt    = $this->_decode_entities(strip_tags($excerpt));\r
816                                 $blog_name  = $this->_decode_entities(strip_tags($blog_name));\r
817 */\r
818 \r
819                                 $title      = $this->_restore_to_utf8($title);\r
820                                 $excerpt    = $this->_restore_to_utf8($excerpt);\r
821                                 $blog_name  = $this->_restore_to_utf8($blog_name);\r
822 //modify end+++++++++\r
823 \r
824                                 $excerpt    = $this->_cut_string($excerpt, 200);\r
825 \r
826                                 \r
827 //modify start+++++++++\r
828 /*\r
829                                 $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());   \r
830                                 $url    = createItemLink($item['itemid'],'');   \r
831 */\r
832                                 $url    = $this->_createItemLink($item['itemid'],$blog);        \r
833 //modify end+++++++++\r
834         \r
835                                 // Use UTF-8 charset for output\r
836                                 header('Content-Type: text/xml');\r
837                                 echo "<","?xml version='1.0' encoding='UTF-8'?",">\n";\r
838                                 \r
839                                 echo "<response>\n";\r
840                                 echo "\t<error>0</error>\n";\r
841                                 echo "\t<rss version='0.91'>\n";\r
842                                 echo "\t\t<channel>\n";\r
843                                 echo "\t\t\t<title>".htmlspecialchars($title, ENT_QUOTES)."</title>\n";\r
844                                 echo "\t\t\t<link>".htmlspecialchars($url, ENT_QUOTES)."</link>\n";\r
845                                 echo "\t\t\t<description>".htmlspecialchars($excerpt, ENT_QUOTES)."</description>\n";\r
846         \r
847                                 $query = 'SELECT url, blog_name, excerpt, title, UNIX_TIMESTAMP(timestamp) as timestamp FROM '.sql_table('plugin_tb').' WHERE tb_id='.intval($tb_id).' AND block = 0 ORDER BY timestamp DESC';\r
848                                 $res = sql_query($query);\r
849                                 while ($o = mysql_fetch_object($res)) \r
850                                 {\r
851                                         // No need to do conversion, because it is already UTF-8\r
852                                         $data = array (\r
853                                                 'url'           => htmlspecialchars($o->url, ENT_QUOTES),\r
854                                                 'blogname'      => htmlspecialchars($this->_restore_to_utf8($o->blog_name), ENT_QUOTES),\r
855                                                 'timestamp' => strftime('%Y-%m-%d',$o->timestamp),\r
856                                                 'title'         => htmlspecialchars($this->_restore_to_utf8($o->title), ENT_QUOTES),\r
857                                                 'excerpt'       => htmlspecialchars($this->_restore_to_utf8($o->excerpt), ENT_QUOTES),\r
858                                                 'tburl'         => $this->getTrackBackUrl($tb_id)\r
859                                         );\r
860                                         \r
861                                         echo "\n";\r
862                                         echo "\t\t\t<item>\n";\r
863                                         echo "\t\t\t\t<title>".$data['title']."</title>\n";\r
864                                         echo "\t\t\t\t<link>".$data['url']."</link>\n";\r
865                                         echo "\t\t\t\t<description>".$data['excerpt']."</description>\n";\r
866                                         echo "\t\t\t</item>\n";\r
867                                 }\r
868                                 echo "\t\t</channel>\n";\r
869                                 echo "\t</rss>\n";\r
870                                 echo "</response>";\r
871                                 exit;\r
872                         }\r
873                         else\r
874                         {\r
875                                 $this->xmlResponse(_ERROR_NOSUCHITEM);\r
876                         }\r
877         \r
878                 }\r
879 \r
880 \r
881 \r
882         /**************************************************************************************\r
883          * SENDING AND RECEIVING TRACKBACK PINGS\r
884                  */\r
885 \r
886                 /* \r
887                  *  Send a Trackback ping to another website\r
888                  */\r
889                 function sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_url) \r
890                 {\r
891                         $sendEncoding = 'UTF-8';\r
892                         \r
893                         // 1. Check some basic things\r
894                         if (!$this->canSendPing()) {\r
895                                 return 'You\'re not allowed to send pings';\r
896                         }\r
897                         \r
898                         if ($this->getOption('SendPings') == 'no') {\r
899                                 return 'Sending trackback pings is disabled';\r
900                         }\r
901                         \r
902                         if ($ping_url == '') {\r
903                                 return 'No ping URL';\r
904                         }\r
905         \r
906                         // 2. Check if protocol is correct http URL\r
907                         $parsed_url = parse_url($ping_url);\r
908 \r
909                         if ($parsed_url['scheme'] != 'http' || $parsed_url['host'] == '')\r
910                                 return 'Bad ping URL';\r
911         \r
912                         $port = ($parsed_url['port']) ? $parsed_url['port'] : 80;\r
913         \r
914                         // 3. Create contents\r
915                         if($sendEncoding != _CHARSET){\r
916                                 $title = mb_convert_encoding($title, $sendEncoding, _CHARSET);\r
917                                 $excerpt = mb_convert_encoding($excerpt, $sendEncoding, _CHARSET);\r
918                                 $blog_name = mb_convert_encoding($blog_name, $sendEncoding, _CHARSET);\r
919                         }\r
920                         \r
921                         \r
922                         $content  = 'title=' .  urlencode( $title );\r
923                         $content .= '&url=' .           urlencode( $url );\r
924                         $content .= '&excerpt=' .       urlencode( $excerpt );\r
925                         $content .= '&blog_name=' . urlencode( $blog_name );\r
926         \r
927                         // 4. Prepare HTTP request\r
928                         $request  = 'POST ' . $parsed_url['path'];\r
929 \r
930                         if ($parsed_url['query'] != '')\r
931                                 $request .= '?' . $parsed_url['query'];\r
932                                 \r
933                         $request .= " HTTP/1.1\r\n";\r
934                         $request .= "Accept: */*\r\n";\r
935                         $request .= "User-Agent: " . $this->userAgent . "\r\n";\r
936                         $request .= ( $port == 80 )?\r
937                                                                         "Host: " . $parsed_url['host'] . "\r\n":\r
938                                                                         "Host: " . $parsed_url['host'] . ":" . $port . "\r\n";\r
939                         $request .= "Cache-Control: no-cache\r\n";\r
940                         $request .= "Connection: Close\r\n";\r
941                         $request .= "Content-Length: " . strlen( $content ) . "\r\n";\r
942                         $request .= "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";\r
943                         $request .= "\r\n";\r
944                         $request .= $content;\r
945         \r
946                         $socket = fsockopen( $parsed_url['host'], $port, $errno, $errstr );\r
947                         if ( ! $socket )\r
948                                 return 'Could not send ping: '.$errstr.' ('.$errno.')';\r
949         \r
950                         // 5. Execute HTTP request\r
951                         fputs($socket, $request);\r
952         \r
953                         // 6. Receive response\r
954                         $result = '';\r
955                         while (!feof($socket)) {\r
956                                 $result .= fgets($socket, 4096);\r
957                         }\r
958                         \r
959                         fclose($socket);\r
960         \r
961 //modify start+++++++++\r
962                         list($header, $body) = split("\r\n\r\n", $result, 2);\r
963                         preg_match("/HTTP\/1\.[0-1] ([0-9]+) ([^\r\n]*)\r?\n/", $header, $httpresp);\r
964                         $respCd = $httpresp[1];\r
965                         $respMsg = $httpresp[2];\r
966 \r
967                         if( $respCd != 200 ){\r
968                                 return 'An error occurred: HTTP Error: [' . $respCd . '] ' . $respMsg;\r
969                         }\r
970                         \r
971                         if( defined('NP_TRACKBACK_USE_XML_PARSER') && function_exists('xml_parser_create') ){\r
972                                 $p = new NP_TrackBack_XMLParser();\r
973 \r
974                                 # remove invalid string\r
975                                 $body = strstr($body, '<');\r
976                                 $body = substr($body, 0, strrpos($body,'>') === false ? 0 : strrpos($body,'>') + 1 );\r
977 \r
978                                 $p->parse($body);\r
979                                 $p->free();\r
980                                 if( $p->isError ){\r
981                                         $errorMessage = mb_convert_encoding($p->message, _CHARSET, 'UTF-8');\r
982                                         return 'An error occurred: ' . htmlspecialchars($errorMessage, ENT_QUOTES);\r
983                                 }\r
984                         } else {\r
985                                 if ( strpos($DATA[1],'<error>0</error>') === false ){\r
986                                         preg_match("/<message>(.*?)<\/message>/",$DATA[1],$error_message);\r
987                                         if( $error_message[1] ){\r
988                                                 $errorMessage = mb_convert_encoding($error_message[1], _CHARSET);\r
989                                                 return 'An error occurred: '.htmlspecialchars($errorMessage, ENT_QUOTES);\r
990                                         } else {\r
991                                                 return 'An error occurred: fatal error.';\r
992                                         }\r
993                                 }\r
994                         }\r
995                         \r
996                         return '';\r
997                 } \r
998 //modify end+++++++++\r
999 \r
1000                 /* \r
1001                  *  Handle a Trackback ping sent to this website\r
1002                  */\r
1003                 function handlePing($tb_id = 0) {\r
1004                         global $manager;\r
1005                         \r
1006                         // Defaults\r
1007                         $spam       = false;\r
1008                         $link       = false;\r
1009 //modify start+++++++++\r
1010 //                      $block      = true;\r
1011                         $block      = false;\r
1012 //modify end+++++++++\r
1013                         if ($tb_id == 0)\r
1014                         $tb_id          = intRequestVar('tb_id');\r
1015                         \r
1016                         $rss            = requestVar('__mode') == 'rss'; \r
1017 //mod by cles\r
1018                         $enableLinkCheck = $this->isEnableLinkCheck($tb_id);\r
1019                         $block = ( $enableLinkCheck ) ? true : false ;\r
1020 //mod by cles end\r
1021 \r
1022                         if (!$tb_id) {\r
1023                                 return 'TrackBack ID is missing (tb_id)';\r
1024                         }\r
1025                         \r
1026                         if ((!$manager->existsItem($tb_id,0,0)) && ($this->getOption('CheckIDs') == 'yes')) {\r
1027                                 return _ERROR_NOSUCHITEM;\r
1028                         }\r
1029 \r
1030                         // 0. Check if we need to output the list as rss\r
1031                         if ($rss) {\r
1032                                 $this->rssResponse($tb_id);\r
1033                                 return;\r
1034                         }\r
1035 //mod by cles\r
1036                         // check: accept pings.\r
1037                         $blogId = getBlogIDFromItemID($tb_id);\r
1038                         $isAcceptPing = $this->isAcceptTrackBack($tb_id);\r
1039                                 \r
1040                         if (! $isAcceptPing)\r
1041                                 return 'Sorry, no trackback pings are accepted.';\r
1042 //mod by cles end\r
1043 \r
1044                         // 1. Get attributes\r
1045 //modify start+++++++++\r
1046                         $b =& $manager->getBlog($blogId);\r
1047 //modify end+++++++++\r
1048                         $url            = requestVar('url');\r
1049                         $title          = requestVar('title');\r
1050                         $excerpt        = requestVar('excerpt');\r
1051                         $blog_name      = requestVar('blog_name');\r
1052                         \r
1053                         if( $url && preg_match('/https?:\/\/([^\/]+)/', $url, $matches) ){\r
1054                                 if( gethostbynamel($matches[1]) === FALSE )\r
1055                                         return 'URL is invalid (url)';\r
1056                         } else {\r
1057                                 return 'URL is missing or invalid (url)';\r
1058                         }\r
1059 \r
1060                         // 2. Conversion of encoding...\r
1061 //modify start+++++++++\r
1062 /*                      if (preg_match ("/;\s*charset=([^\n]+)/is", $_SERVER["CONTENT_TYPE"], $regs))\r
1063                                 $encoding = strtoupper(trim($regs[1]));\r
1064                         else\r
1065                                 $encoding = $this->_detect_encoding($excerpt);\r
1066 */\r
1067                         $encoding = $this->_detect_encoding($excerpt);\r
1068 //modify end+++++++++\r
1069                         \r
1070 //modify start+++++++++\r
1071                         if (_CHARSET != 'UTF-8'){\r
1072                                 $title = $this->_strip_controlchar(strip_tags(mb_convert_encoding($title, _CHARSET, $encoding)));\r
1073                                 $excerpt = $this->_strip_controlchar(strip_tags(mb_convert_encoding($excerpt, _CHARSET, $encoding)));\r
1074                                 $blog_name = $this->_strip_controlchar(strip_tags(mb_convert_encoding($blog_name, _CHARSET, $encoding)));\r
1075                         }else{\r
1076                                 $title      = $this->_strip_controlchar($this->_convert_to_utf8($title, $encoding));\r
1077                                 $excerpt    = $this->_strip_controlchar($this->_convert_to_utf8($excerpt, $encoding));\r
1078                                 $blog_name  = $this->_strip_controlchar($this->_convert_to_utf8($blog_name, $encoding));\r
1079 \r
1080                                 $title      = $this->_decode_entities(strip_tags($title));\r
1081                                 $excerpt    = $this->_decode_entities(strip_tags($excerpt));\r
1082                                 $blog_name  = $this->_decode_entities(strip_tags($blog_name));\r
1083                         }\r
1084 //modify end+++++++++\r
1085 \r
1086                         // 4. Save data in the DB\r
1087                         $res = @sql_query('\r
1088                                 SELECT \r
1089                                         tb_id, block, spam\r
1090                                 FROM \r
1091                                         '.sql_table('plugin_tb').' \r
1092                                 WHERE \r
1093                                         url   = \''.mysql_real_escape_string($url).'\' AND \r
1094                                         tb_id = \''.intval($tb_id).'\'\r
1095                         ');\r
1096                         \r
1097                         if (mysql_num_rows($res) != 0) \r
1098                         {\r
1099                                 // Existing TB, update it\r
1100 /*\r
1101                                 $res = @sql_query('\r
1102                                         UPDATE\r
1103                                                 '.sql_table('plugin_tb').'\r
1104                                         SET \r
1105                                                 title     = "'.mysql_real_escape_string($title).'", \r
1106                                                 excerpt   = "'.mysql_real_escape_string($excerpt).'", \r
1107                                                 blog_name = "'.mysql_real_escape_string($blog_name).'", \r
1108                                                 timestamp = '.mysqldate(time()).'\r
1109                                         WHERE \r
1110                                                 url       = "'.mysql_real_escape_string($url).'" AND \r
1111                                                 tb_id     = "'.$tb_id.'"\r
1112                                 ');\r
1113 */\r
1114 //modify start+++++++++\r
1115                                 $rows = mysql_fetch_assoc($res);\r
1116                                 $spam = ( $rows['block'] || $rows['spam'] ) ? true : false;\r
1117                                 $res = @sql_query('\r
1118                                         UPDATE\r
1119                                                 '.sql_table('plugin_tb').'\r
1120                                         SET \r
1121                                                 title     = \''.mysql_real_escape_string($title).'\', \r
1122                                                 excerpt   = \''.mysql_real_escape_string($excerpt).'\', \r
1123                                                 blog_name = \''.mysql_real_escape_string($blog_name).'\', \r
1124                                                 timestamp = '.mysqldate($b->getCorrectTime()).'\r
1125                                         WHERE \r
1126                                                 url       = \''.mysql_real_escape_string($url).'\' AND \r
1127                                                 tb_id     = \''.mysql_real_escape_string(intval($tb_id)).'\'\r
1128                                 ');\r
1129 //modify end+++++++++\r
1130 \r
1131                                 if (!$res) {\r
1132                                         return 'Could not update trackback data: '.mysql_error();\r
1133                                 }\r
1134                         } \r
1135                         else \r
1136                         {\r
1137 //mod by cles\r
1138                                 // spam block\r
1139                                 $res = @sql_query('SELECT id FROM '.sql_table('plugin_tb').' WHERE block = 1 and url = \''.mysql_real_escape_string($url).'\'' );\r
1140                                 if (mysql_num_rows($res) != 0) {\r
1141                                         // NP_Trackback has blocked tb !\r
1142                                         ACTIONLOG :: add(INFO, "Trackback: Duplicated Blocked Trackback [ignore] (itemid:$tb_id from: $url)");\r
1143                                         return 'Sorry, trackback ping is not accepted.';\r
1144                                 }\r
1145 //mod by cles end\r
1146                                                         \r
1147                                 // 4. SPAM check (for SpamCheck API 2 /w compat. API 1)\r
1148                                 $spamcheck = array (\r
1149                                         'type'          => 'trackback',\r
1150                                         'id'            => $tb_id,\r
1151                                         'title'         => $title,\r
1152                                         'excerpt'       => $excerpt,\r
1153                                         'blogname'      => $blog_name,\r
1154                                         'url'           => $url,\r
1155                                         'return'        => true,\r
1156                                         'live'          => true,\r
1157                                         \r
1158                                         /* Backwards compatibility with SpamCheck API 1*/\r
1159                                         'data'          => $url . "\n" . $title . "\n" . $excerpt . "\n" . $blog_name . "\n" . serverVar('HTTP_USER_AGENT'),\r
1160                                         'ipblock'   => true,\r
1161                                 );\r
1162                                 \r
1163                                 $manager->notify('SpamCheck', array ('spamcheck' => & $spamcheck));\r
1164                                 \r
1165                                 if (isset($spamcheck['result']) && $spamcheck['result'] == true) \r
1166                                 {\r
1167                                         $spam = true;\r
1168                                 }\r
1169                                 \r
1170                                 // 5. Content check (TO DO)\r
1171                                 if($spam == false || $enableLinkCheck == 'ignore' )     //modify\r
1172                                 {\r
1173 //mod by cles\r
1174 //                                      $contents = $this->retrieveUrl ($url);\r
1175 //                              \r
1176 //                                      if (preg_match("/(".preg_quote($_SERVER["REQUEST_URI"], '/').")|(".preg_quote($_SERVER["SERVER_NAME"], '/').")/i", $contents)) {        \r
1177 //                                              $link = true;\r
1178 //                                      }\r
1179                                         if( $enableLinkCheck ){\r
1180                                                 $contents = $this->retrieveUrl($url);\r
1181                                                 \r
1182                                                 $linkArray = $this->getPermaLinksFromText($contents);\r
1183                                                 \r
1184                                                 if( defined('NP_TRACKBACK_LINKCHECK_STRICT') )\r
1185                                                         $itemLink = $this->_createItemLink($tb_id, $b);\r
1186                                                 else\r
1187                                                         $itemLink = $b->getURL();\r
1188                                                 \r
1189                                                 $itemLinkPat = '{^' . preg_quote($itemLink) .'}i';\r
1190                                                 $itemLinkPat = str_replace('&','&(amp;)?', $itemLinkPat);\r
1191                                                 \r
1192                                                 foreach($linkArray as $l) {\r
1193                                                         if(preg_match($itemLinkPat, $l)){\r
1194                                                                 ACTIONLOG :: add(INFO, "Trackback: LinkCheck OK. (link: $l pat: $itemLinkPat )");\r
1195                                                                 $link = true;\r
1196                                                                 break;\r
1197                                                         }\r
1198                                                 }\r
1199                                                 if( ! $link ){\r
1200                                                         $cnt = @count($linkArray);\r
1201                                                         if( $enableLinkCheck == 'ignore' ){\r
1202                                                                 ACTIONLOG :: add(INFO, "Trackback: LinkCheck NG. [ignore] (itemid:$tb_id from: $url cnt: $cnt pat: $itemLinkPat)");\r
1203                                                                 return 'Sorry, trackback ping is not accepted.';\r
1204                                                         } else {\r
1205                                                                 ACTIONLOG :: add(INFO, "Trackback: LinkCheck NG. [block] (itemid:$tb_id from: $url cnt: $cnt pat: $itemLinkPat");\r
1206                                                         }\r
1207                                                 }\r
1208                                         }\r
1209 //mod by cles end\r
1210                                 }\r
1211 \r
1212                                 // 6. Determine if Trackback is safe...\r
1213 //modify start+++++++++\r
1214 //                              $block = $spam == true || $link == false;\r
1215 //                              $block = $spam == true ;\r
1216 //modify end+++++++++\r
1217 //mod by cles\r
1218                                 if ( $enableLinkCheck )\r
1219                                         $block = ($spam == true || $link == false);\r
1220                                 else\r
1221                                         $block = $spam == true ;\r
1222 //mod by cles end\r
1223                                 // New TB, insert it\r
1224 /*\r
1225                                 $query = '\r
1226                                         INSERT INTO \r
1227                                                 '.sql_table('plugin_tb').' \r
1228                                         SET\r
1229                                                 tb_id     = "'.$tb_id.'",\r
1230                                                 block     = "'.($block ? '1' : '0').'",\r
1231                                                 spam      = "'.($spam ? '1' : '0').'",\r
1232                                                 link      = "'.($link ? '1' : '0').'",\r
1233                                                 url       = "'.mysql_real_escape_string($url).'",\r
1234                                                 title     = "'.mysql_real_escape_string($title).'",\r
1235                                                 excerpt   = "'.mysql_real_escape_string($excerpt).'",\r
1236                                                 blog_name = "'.mysql_real_escape_string($blog_name).'",\r
1237                                                 timestamp = '.mysqldate(time()).'\r
1238                                 ';\r
1239 */\r
1240 //modify start+++++++++\r
1241                                 $query = '\r
1242                                         INSERT INTO \r
1243                                                 '.sql_table('plugin_tb').' \r
1244                                         SET\r
1245                                                 tb_id     = \''.mysql_real_escape_string(intval($tb_id)).'\',\r
1246                                                 block     = \''.($block ? '1' : '0').'\',\r
1247                                                 spam      = \''.($spam ? '1' : '0').'\',\r
1248                                                 link      = \''.($link ? '1' : '0').'\',\r
1249                                                 url       = \''.mysql_real_escape_string($url).'\',\r
1250                                                 title     = \''.mysql_real_escape_string($title).'\',\r
1251                                                 excerpt   = \''.mysql_real_escape_string($excerpt).'\',\r
1252                                                 blog_name = \''.mysql_real_escape_string($blog_name).'\',\r
1253                                                 timestamp = '.mysqldate($b->getCorrectTime()).'\r
1254                                 ';\r
1255 //modify end+++++++++\r
1256                                 \r
1257                                 $res = @sql_query($query);\r
1258 \r
1259                                 if (!$res) {\r
1260                                         return 'Could not save trackback data, possibly because of a double entry: ' . mysql_error() . $query;\r
1261                                 }\r
1262                         }\r
1263         \r
1264                         // 7. Send notification e-mail if needed\r
1265                         $notifyAddrs = $this->getOption('NotifyEmail');\r
1266                         $notifyAddrs = ( $notifyAddrs ? $notifyAddrs . ';' : '') \r
1267                                                         . $this->getBlogOption($blogId ,'NotifyEmailBlog');\r
1268                                                 \r
1269                         if ($notifyAddrs && $spam == false) \r
1270                         {\r
1271                                 \r
1272                                 $vars = array (\r
1273                                         'tb_id'    => $tb_id,\r
1274                                         'url'      => $url,\r
1275                                         'title'    => $title,\r
1276                                         'excerpt'  => $excerpt,\r
1277                                         'blogname' => $blog_name\r
1278                                 );\r
1279                                 \r
1280 //modify start+++++++++\r
1281 /*\r
1282                                 $vars = array (\r
1283                                         'tb_id'    => $tb_id,\r
1284                                         'url'      => $url,\r
1285                                         'title'    => mb_convert_encoding($title, 'ISO-2022-JP', _CHARSET),\r
1286                                         'excerpt'  => mb_convert_encoding($excerpt, 'ISO-2022-JP', _CHARSET),\r
1287                                         'blogname' => mb_convert_encoding($blog_name, 'ISO-2022-JP', _CHARSET)\r
1288                                 );\r
1289 */                              \r
1290 //maybe not needed because japanese version has "mb_send_mail" in function notify\r
1291 //modify end+++++++++\r
1292                                 \r
1293                                 $mailto_title = TEMPLATE::fill($this->notificationMailTitle, $vars);\r
1294                                 $mailto_msg   = TEMPLATE::fill($this->notificationMail, $vars);\r
1295         \r
1296                                 global $CONF, $DIR_LIBS;\r
1297                                 \r
1298                                 // make sure notification class is loaded\r
1299                                 if (!class_exists('notification'))\r
1300                                         include($DIR_LIBS . 'NOTIFICATION.php');\r
1301                                 \r
1302                                 $notify = new NOTIFICATION($notifyAddrs);\r
1303                                 $notify->notify($mailto_title, $mailto_msg , $CONF['AdminEmail']);\r
1304                                 \r
1305 //mod by cles+++++++++++        \r
1306                                 if ($manager->pluginInstalled('NP_Cache')){\r
1307                                         $p =& $manager->getPlugin('NP_Cache');\r
1308                                         $p->setCurrentBlog($tb_id);\r
1309                                         $p->cleanItem($tb_id);\r
1310                                         $p->cleanArray(array('index'));\r
1311                                 }\r
1312 //mod by cles end +++++++++++   \r
1313                         }\r
1314 \r
1315                         if( $block )\r
1316                                 return 'Sorry, trackback ping is not accepted.';\r
1317                         return '';\r
1318                 }       \r
1319 \r
1320                 function xmlResponse($errorMessage = '') \r
1321                 {\r
1322                         header('Content-type: application/xml; charset=utf-8');\r
1323                         echo "<"."?xml version='1.0' encoding='UTF-8'?".">\n";\r
1324                         echo "<response>\n";\r
1325 \r
1326                         if ($errorMessage){\r
1327                                 if (_CHARSET != 'UTF-8')\r
1328                                         $errorMessage = mb_convert_encoding($errorMessage, 'UTF-8');\r
1329                                 echo "<error>1</error>\n";\r
1330                                 echo "<message>".htmlspecialchars($errorMessage, ENT_QUOTES)."</message>\n";\r
1331                         } else {\r
1332                                 echo "<error>0</error>\n";\r
1333                         }\r
1334 \r
1335                         echo "</response>";\r
1336                         exit;\r
1337                 }\r
1338                 \r
1339                 /*\r
1340                  * Check if member may send ping (check if logged in)\r
1341                  */\r
1342                 function canSendPing() {\r
1343                         global $member;\r
1344                         return $member->isLoggedIn() || $this->xmlrpc;\r
1345                 }\r
1346 \r
1347 \r
1348 //mod by cles\r
1349                 function redirect($tb_id, $urlHash){\r
1350                         global $CONF;\r
1351                         $query = 'SELECT url FROM '.sql_table('plugin_tb').' WHERE tb_id='.intval($tb_id).' and md5(url)="'.$urlHash.'"';\r
1352                         $res = sql_query($query);\r
1353                         \r
1354                         $url = $CONF['SiteURL'];\r
1355                         \r
1356                         if ($o = mysql_fetch_object($res)) {\r
1357                                 $url = htmlspecialchars($o->url, ENT_QUOTES);\r
1358                         }\r
1359                         \r
1360                         $url = stripslashes($url);\r
1361                         $url = str_replace('&amp;','&',$url);\r
1362                         $url = str_replace('&lt;','<',$url);\r
1363                         $url = str_replace('&gt;','>',$url);\r
1364                         $url = str_replace('&quot;','"',$url);\r
1365                         \r
1366                         header('Location: '.$url);\r
1367                 }\r
1368                                 \r
1369                 function getRequiredURL($itemid){\r
1370                         global $manager;\r
1371                         $blog = & $manager->getBlog(getBlogIDFromItemID($itemid));\r
1372                         if( $this->isEnableLinkCheck($itemid) )\r
1373                                 return $this->_createItemLink($itemid, $blog);\r
1374                         return null;\r
1375                 }\r
1376                 \r
1377                 function isEnableLinkCheck($itemid){\r
1378                         $blogid = getBlogIDFromItemID($itemid);\r
1379                         \r
1380                         switch( $this->getItemOption($itemid, 'isAcceptW/OLink') ){\r
1381                                 case 'default':\r
1382                                         $def = $this->getBlogOption($blogid, 'isAcceptW/OLinkDef');\r
1383                                         if($def == 'yes')\r
1384                                                 return false;\r
1385                                         else\r
1386                                                 return $def; // block or ignore\r
1387                                 case 'yes':\r
1388                                         return false;\r
1389                                 case 'no':\r
1390                                         return true;\r
1391                                 default :\r
1392                                         ACTIONLOG :: add(INFO, "Trackback: Unknown Option (itemid:$itemid, value:$val)");\r
1393                                         return false;\r
1394                         }\r
1395                 }\r
1396                 \r
1397                 function isAcceptTrackBack($itemid = null){\r
1398                         $ret = false;\r
1399                         if( $this->getOption('AcceptPing') == 'yes' ){\r
1400                                 $bid = null;\r
1401                                 if($itemid){\r
1402                                         $bid = getBlogIDFromItemID(intval($itemid));\r
1403                                 } else {\r
1404                                         global $blog;\r
1405                                         $bid = $blog->getID();\r
1406                                 }\r
1407                                 \r
1408                                 if( $this->getBlogOption($bid, "AllowTrackBack") == 'yes' ){\r
1409                                         if( $itemid ){\r
1410                                                 $ret = ( $this->getItemOption(intval($itemid), 'ItemAcceptPing') == 'yes' ) ? true : false ;\r
1411                                         } else {\r
1412                                                 $ret = true;\r
1413                                         }\r
1414                                 } else {\r
1415                                         $ret = false;\r
1416                                 }\r
1417                         }\r
1418                         return $ret;\r
1419                 }\r
1420                 \r
1421 //mod by cles end\r
1422 \r
1423         /**************************************************************************************\r
1424          * EVENTS\r
1425                  */\r
1426 \r
1427                 function event_SendTrackback($data) {\r
1428                         global $manager;\r
1429                         \r
1430                         // Enable sending trackbacks for the XML-RPC API, otherwise we would \r
1431                         // get an error because the current user is not exactly logged in.\r
1432                         $this->xmlrpc = true;\r
1433                         \r
1434                         $itemid = $data['tb_id'];\r
1435                         $item = &$manager->getItem($itemid, 0, 0);\r
1436                         if (!$item) return; // don't ping for draft & future\r
1437                         if ($item['draft']) return;   // don't ping on draft items\r
1438                         \r
1439                         // gather some more information, needed to send the ping (blog name, etc)      \r
1440                         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
1441                         $blog_name      = $blog->getName();\r
1442                         \r
1443                         $title      = $data['title'] != '' ? $data['title'] : $item['title'];\r
1444                         $title          = strip_tags($title);\r
1445                         \r
1446                         $excerpt    = $data['body'] != '' ? $data['body'] : $item['body'];\r
1447                         $excerpt        = strip_tags($excerpt);\r
1448                         $excerpt    = $this->_cut_string($excerpt, 200);\r
1449                         \r
1450                         $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());\r
1451                         //$url = createItemLink($itemid);\r
1452                         $url = $this->_createItemLink($itemid, $blog);\r
1453                         \r
1454                         while (list(,$url) = each($data['urls'])) {\r
1455                                 $res = $this->sendPing($itemid, $title, $url, $excerpt, $blog_name, $url);\r
1456                                 if ($res) ACTIONLOG::add(WARNING, 'TrackBack Error:' . $res . ' (' . $url . ')');\r
1457                         }\r
1458                 }\r
1459                 \r
1460                 function event_RetrieveTrackback($data) {\r
1461                         \r
1462                         $res = sql_query('\r
1463                         SELECT \r
1464                         url, \r
1465                         title, \r
1466                         UNIX_TIMESTAMP(timestamp) AS timestamp \r
1467                         FROM \r
1468                         '.sql_table('plugin_tb').' \r
1469                         WHERE \r
1470                         tb_id = '.intval($data['tb_id']).' AND\r
1471                         block = 0\r
1472                         ORDER BY \r
1473                         timestamp ASC\r
1474                         ');\r
1475                         \r
1476                         while ($row = mysql_fetch_array($res)) {\r
1477                                 \r
1478                                 $trackback = array(\r
1479                                 'title' => $row['title'],\r
1480                                 'url'   => $row['url'],\r
1481                                 'ip'    => ''\r
1482                                 );\r
1483                                 \r
1484                                 $data['trackbacks'][] = $trackback;\r
1485                         }\r
1486                 }\r
1487 /*\r
1488                 function event_BookmarkletExtraHead($data) {\r
1489                         global $NP_TB_URL;\r
1490                         list ($NP_TB_URL,) = $this->getURIfromLink(requestVar('loglink'));\r
1491                 } \r
1492 */\r
1493                 function event_PrepareItemForEdit($data) {\r
1494 //                      if (!$this->getOption('AutoXMLHttp'))\r
1495                         if ($this->getOption('AutoXMLHttp') == 'no')\r
1496                         {\r
1497                                 // The space between body and more is to make sure we didn't join 2 words accidently....\r
1498                                 $this->larray = $this->autoDiscovery($data['item']['body'].' '.$data['item']['more']);\r
1499                         }\r
1500                 } \r
1501 \r
1502                 /*\r
1503                  * After an item has been added to the database, send out a ping if requested\r
1504                  * (trackback_ping_url variable in request)\r
1505                  */\r
1506                 function event_PostAddItem($data) {\r
1507                         $this->pingTrackback($data);\r
1508                 }\r
1509         \r
1510                 function event_PreUpdateItem($data) {\r
1511                         $this->pingTrackback($data);\r
1512                 }\r
1513 \r
1514                 /**\r
1515                  * Add trackback options to add item form/bookmarklet\r
1516                  */\r
1517                 function event_AddItemFormExtras($data) {\r
1518                 \r
1519 //                      global $NP_TB_URL;\r
1520                         \r
1521                         ?>\r
1522                                 <h3>TrackBack</h3>\r
1523                                 <p>\r
1524 <!--modify start+++++++++-->\r
1525 <!--                                    <label for="plug_tb_url">TrackBack Ping URL:</label>\r
1526                                         <input type="text" value="<?php if (isSet($NP_TB_URL)) {echo $NP_TB_URL;} ?>" id="plug_tb_url" name="trackback_ping_url" size="60" />\r
1527 -->\r
1528 <!--modify end+++++++++-->\r
1529                                         <label for="plug_tb_url">TrackBack URL:</label><br />\r
1530                                         <textarea id="plug_tb_url" name="trackback_ping_url" cols="60" rows="5" style="font:normal xx-small Tahoma, Arial, verdana ;"></textarea>\r
1531 <input type="button" name="btnAdd" value="<?php echo _TB_LIST_IT?>" onClick="AddStart()" />\r
1532 \r
1533                 <br />\r
1534         \r
1535                         <?php\r
1536 //                              if ($this->getOption('AutoXMLHttp'))\r
1537                                 if ($this->getOption('AutoXMLHttp') == 'yes')\r
1538                                 {\r
1539                         ?>\r
1540                                         <div id="tb_auto">\r
1541 <input type="button" name="discoverit" value="Auto Discover" onclick="tbSetup();" />\r
1542                                                 <img id='tb_busy' src='<?php echo $this->getAdminURL(); ?>busy.gif' style="display:none;" /><br />\r
1543                                         <div id="tb_auto_title"></div>\r
1544                                                 <table border="1"><tbody id="tb_ping_list"></tbody></table>\r
1545                                                 <input type="hidden" id="tb_url_amount" name="tb_url_amount" value="0" /> \r
1546                                         </div>\r
1547                                         \r
1548                         <?php\r
1549                                         $this->jsautodiscovery();\r
1550                                 }\r
1551                         ?>\r
1552                                 </p>\r
1553                         <?php\r
1554                 }\r
1555 \r
1556                 /**\r
1557                  * Add trackback options to edit item form/bookmarklet\r
1558                  */\r
1559                 function event_EditItemFormExtras($data) {\r
1560                         global $CONF;\r
1561                         ?>\r
1562 <!--                                    <input type="text" value="" id="plug_tb_url" name="trackback_ping_url" size="60" /><br />-->\r
1563                                 <h3>TrackBack</h3>\r
1564                                 <p>\r
1565                                         <label for="plug_tb_url">TrackBack URL:</label><br />\r
1566                                         <textarea id="plug_tb_url" name="trackback_ping_url" cols="60" rows="5" style="font:normal xx-small Tahoma, Arial, verdana ;"></textarea>\r
1567 <input type="button" name="btnAdd" value="<?php echo _TB_LIST_IT?>" onClick="AddStart()" />\r
1568         \r
1569                         <?php\r
1570 //                              if ($this->getOption('AutoXMLHttp'))\r
1571                                 if ($this->getOption('AutoXMLHttp') == 'yes')\r
1572                                 {\r
1573                         ?>\r
1574 \r
1575 \r
1576                                         <div id="tb_auto">\r
1577 <input type="button" name="discoverit" value="Auto Discover" onclick="tbSetup();" />\r
1578                                                 <img id='tb_busy' src='<?php echo $this->getAdminURL(); ?>busy.gif' style="display:none;" /><br />\r
1579                                         <div id="tb_auto_title"></div>\r
1580                                                 <table border="1"><tbody id="tb_ping_list"></tbody></table>\r
1581                                                 <input type="hidden" id="tb_url_amount" name="tb_url_amount" value="0" /> \r
1582                                         </div>\r
1583 \r
1584                         <?php\r
1585                                         $this->jsautodiscovery();\r
1586                                 }\r
1587                                 else\r
1588                                 {\r
1589                                         if (count($this->larray) > 0) \r
1590                                         {\r
1591                         ?>\r
1592                                         Auto Discovered Ping URL's:<br />\r
1593                         <?php\r
1594                                                 echo '<input type="hidden" name="tb_url_amount" value="'.count($this->larray).'" />';\r
1595         \r
1596                                                 $i = 0;\r
1597                                                 \r
1598                                                 while (list($url, $title) = each ($this->larray))\r
1599                                                 {\r
1600 //modify start+++++++++\r
1601                                                         if (_CHARSET != 'UTF-8') {\r
1602                                                                 $title = $this->_utf8_to_entities($title);\r
1603                                                                 $title = mb_convert_encoding($title, _CHARSET, 'UTF-8');\r
1604                                                         }\r
1605 //modify end+++++++++\r
1606 \r
1607                                                         echo '<input type="checkbox" name="tb_url_'.$i.\r
1608                                                                  '" value="'.$url.'" id="tb_url_'.$i.\r
1609                                                                  '" /><label for="tb_url_'.$i.'" title="'.$url.'">'.$title.'</label><br />';\r
1610                                                         \r
1611                                                         $i++;\r
1612                                                 }\r
1613                                         }\r
1614                                 }               \r
1615                         ?>\r
1616                                 </p>\r
1617                         <?php\r
1618                 }\r
1619 \r
1620                 /**\r
1621                  * Insert Javascript AutoDiscovery routines\r
1622                  */\r
1623                 function jsautodiscovery() \r
1624                 {\r
1625                         global $CONF;\r
1626                 \r
1627                         ?>\r
1628                                 <script type='text/javascript' src='<?php echo $this->getAdminURL(); ?>autodetect.php'></script>        \r
1629                         <?php\r
1630                 }\r
1631 \r
1632                 /**\r
1633                  * Ping all URLs\r
1634                  */\r
1635                 function pingTrackback($data) {\r
1636                         global $manager, $CONF;\r
1637                         \r
1638                         $ping_urls_count = 0;\r
1639                         $ping_urls = array();\r
1640                         $localflag = array();\r
1641                         \r
1642                         $ping_url = requestVar('trackback_ping_url');\r
1643 //modify start+++++++++\r
1644 /*\r
1645                         if ($ping_url) {\r
1646                                 $ping_urls[0] = $ping_url;\r
1647                                 $ping_urls_count++;\r
1648                         }\r
1649 */\r
1650                         if (trim($ping_url)) {\r
1651                                 $ping_urlsTemp = array();\r
1652                                 $ping_urlsTemp = preg_split("/[\s,]+/", trim($ping_url));\r
1653                                 for($i=0;$i<count($ping_urlsTemp);$i++){\r
1654                                         $ping_urls[] = trim($ping_urlsTemp[$i]);\r
1655                                         $ping_urls_count++;\r
1656                                 }\r
1657                         }\r
1658 //modify end+++++++++\r
1659         \r
1660                         $tb_url_amount = requestVar('tb_url_amount');\r
1661                         for ($i=0;$i<$tb_url_amount;$i++) {\r
1662                                 $tb_temp_url = requestVar('tb_url_'.$i);\r
1663                                 if ($tb_temp_url) {\r
1664                                         $ping_urls[$ping_urls_count] = $tb_temp_url;\r
1665                                         $localflag[$ping_urls_count] = (requestVar('tb_url_'.$i.'_local') == 'on')? 1: 0;\r
1666                                         $ping_urls_count++;\r
1667                                 }\r
1668                         }\r
1669         \r
1670                         if ($ping_urls_count <= 0) {\r
1671                                 return;\r
1672                         }\r
1673         \r
1674                         $itemid = $data['itemid'];\r
1675                         $item = &$manager->getItem($itemid, 0, 0);\r
1676                         if (!$item) return; // don't ping for draft & future\r
1677                         if ($item['draft']) return;   // don't ping on draft items\r
1678         \r
1679                         // gather some more information, needed to send the ping (blog name, etc)      \r
1680                         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
1681                         $blog_name      = $blog->getName();\r
1682 \r
1683                         $title      = $data['title'] != '' ? $data['title'] : $item['title'];\r
1684                         $title          = strip_tags($title);\r
1685 \r
1686                         $excerpt    = $data['body'] != '' ? $data['body'] : $item['body'];\r
1687                         $excerpt        = strip_tags($excerpt);\r
1688                         $excerpt    = $this->_cut_string($excerpt, 200);\r
1689         \r
1690 /*\r
1691                         $CONF['ItemURL'] = preg_replace('/\/$/', '', $blog->getURL());   \r
1692                         $url = createItemLink($itemid);\r
1693 */\r
1694                         $url    = $this->_createItemLink($item['itemid'],$blog);        \r
1695         \r
1696                         // send the ping(s) (add errors to actionlog)\r
1697                         for ($i=0; $i<count($ping_urls); $i++) {\r
1698                                 if( ! $localflag[$i] )\r
1699                                         $res = $this->sendPing($itemid, $title, $url, $excerpt, $blog_name, $ping_urls[$i]);\r
1700                                 else\r
1701                                         $res = $this->handleLocalPing($itemid, $title, $excerpt, $blog_name, $ping_urls[$i]);\r
1702                                 if ($res) ACTIONLOG::add(WARNING, 'TrackBack Error:' . $res . ' (' . $ping_urls[$i] . ')');\r
1703                         }\r
1704                 }\r
1705 \r
1706         \r
1707         \r
1708         \r
1709         /**************************************************************************************\r
1710          * AUTO-DISCOVERY\r
1711                  */\r
1712 \r
1713                 /*\r
1714                  * Auto-Discovery of TrackBack Ping URLs based on HTML story\r
1715                  */\r
1716                 function autoDiscovery($text) \r
1717                 {\r
1718                         $links  = $this->getPermaLinksFromText($text);\r
1719                         $result = array();\r
1720         \r
1721                         for ($i = 0; $i < count($links); $i++)\r
1722                         {\r
1723                                 list ($url, $title) = $this->getURIfromLink($links[$i]);\r
1724                                 \r
1725                                 if ($url != '')\r
1726                                         $result[$url] = $title;\r
1727                         }\r
1728                         \r
1729                         return $result;\r
1730                 }\r
1731                 \r
1732                 /*\r
1733                  * Auto-Discovery of TrackBack Ping URLs based on single link\r
1734                  */\r
1735                 function getURIfromLink($link) \r
1736                 {\r
1737                         \r
1738                         // Check to see if the cache contains this link\r
1739                         $res = sql_query('SELECT url, title FROM '.sql_table('plugin_tb_lookup').' WHERE link=\''.mysql_real_escape_string($link).'\'');\r
1740 \r
1741                         if ($row = mysql_fetch_array($res)) \r
1742                         {\r
1743                                 if ($row['title'] != '')\r
1744                                 {\r
1745 //modify start+++++++++\r
1746                                         if (_CHARSET != 'UTF-8'){\r
1747                                                 $row['title'] = mb_convert_encoding($row['title'], 'UTF-8', _CHARSET);\r
1748                                                 $row['title'] = $this->_decode_entities($row['title']);\r
1749                                         }\r
1750 //modify end+++++++++\r
1751                                         return array (\r
1752                                                 $row['url'], $row['title']\r
1753                                         );\r
1754                                 }\r
1755                                 else\r
1756                                 {\r
1757                                         return array (\r
1758                                                 $row['url'], $row['url']\r
1759                                         );\r
1760                                 }\r
1761                         }\r
1762                         \r
1763                         // Retrieve RDF\r
1764                         if (($rdf = $this->getRDFFromLink($link)) !== false) \r
1765                         {\r
1766                                 // Get PING attribute\r
1767                                 if (($uri = $this->getAttributeFromRDF($rdf, 'trackback:ping')) !== false) \r
1768                                 {\r
1769                                         // Get TITLE attribute\r
1770                                         if (($title = $this->getAttributeFromRDF($rdf, 'dc:title')) !== false) \r
1771                                         {\r
1772                                                 // Get CREATOR attribute\r
1773                                                 if (($author = $this->getAttributeFromRDF($rdf, 'dc:creator')) !== false) \r
1774                                                 {\r
1775                                                         $title = $author. ": " . $title;\r
1776                                                 }\r
1777         \r
1778                                                 $uri   = $this->_decode_entities($uri);\r
1779 //modify start+++++++++\r
1780                                                 if (_CHARSET != 'UTF-8')\r
1781                                                         $convertedTitle = mb_convert_encoding($title, _CHARSET, 'UTF-8');\r
1782                                                 else\r
1783                                                         $convertedTitle = $title;\r
1784 /*\r
1785                                                 // Store in cache\r
1786                                                 $res = sql_query("INSERT INTO ".sql_table('plugin_tb_lookup')." (link, url, title) VALUES ('".mysql_real_escape_string($link)."','".mysql_real_escape_string($uri)."','".mysql_real_escape_string($title)."')");\r
1787 */\r
1788                                                 // Store in cache\r
1789                                                 $res = sql_query("INSERT INTO ".sql_table('plugin_tb_lookup')." (link, url, title) VALUES ('".mysql_real_escape_string($link)."','".mysql_real_escape_string($uri)."','".mysql_real_escape_string($convertedTitle)."')");\r
1790 //modify end+++++++++\r
1791                                                 $title = $this->_decode_entities($title);\r
1792 \r
1793                                                 return array (\r
1794                                                         $uri, $title\r
1795                                                 );\r
1796                                         }\r
1797                                         else\r
1798                                         {\r
1799                                                 $uri = html_entity_decode($uri, ENT_COMPAT);\r
1800         \r
1801                                                 // Store in cache\r
1802                                                 $res = sql_query("INSERT INTO ".sql_table('plugin_tb_lookup')." (link, url, title) VALUES ('".mysql_real_escape_string($link)."','".mysql_real_escape_string($uri)."','')");\r
1803         \r
1804                                                 return array (\r
1805                                                         $uri, $uri\r
1806                                                 );\r
1807                                         }\r
1808                                 }\r
1809                         }\r
1810                         \r
1811                         // Store in cache\r
1812                         $res = sql_query("INSERT INTO ".sql_table('plugin_tb_lookup')." (link, url, title) VALUES ('".mysql_real_escape_string($link)."','','')");\r
1813         \r
1814                         return array ('', '');\r
1815                 }\r
1816         \r
1817                 /*\r
1818                  * Detect links used in HTML code\r
1819                  */\r
1820                 function getPermaLinksFromText($text)\r
1821                 {\r
1822                         $links = array();\r
1823                         \r
1824                         if (preg_match_all('/<a +([^>]+)>/i', $text, $array, PREG_SET_ORDER))\r
1825                         {\r
1826                                 $count = count($array);\r
1827                                 for ($i = 0; $i < $count; $i++)\r
1828                                 {\r
1829                                         if( preg_match('/https?:\/\/[-_.!~*\'()a-z0-9;\/?:@&=+$,%]+/i', $array[$i][1], $matches) )\r
1830                                                 $links[$matches[0]] = 1;\r
1831                                 }\r
1832                         }\r
1833                         \r
1834                         return array_keys($links);\r
1835                 }\r
1836         \r
1837                 /*\r
1838                  * Retrieve RDF code from external link\r
1839                  */\r
1840                 function getRDFFromLink($link) \r
1841                 {\r
1842                         if ($content = $this->getContents($link))\r
1843                         {\r
1844                                 preg_match_all('/(<rdf:RDF.*?<\/rdf:RDF>)/sm', $content, $rdfs, PREG_SET_ORDER);\r
1845                                 \r
1846                                 if (count($rdfs) > 1)\r
1847                                 {\r
1848                                         for ($i = 0; $i < count($rdfs); $i++)\r
1849                                         {\r
1850                                                 if (preg_match('|dc:identifier="'.preg_quote($link).'"|ms',$rdfs[$i][1])) \r
1851                                                 {\r
1852                                                         return $rdfs[$i][1];\r
1853                                                 }\r
1854                                         }\r
1855                                 }\r
1856                                 else\r
1857                                 {\r
1858                                         // No need to check the identifier\r
1859                                         return $rdfs[0][1];\r
1860                                 }\r
1861                         }\r
1862                         \r
1863                         return false;\r
1864                 }\r
1865         \r
1866                 /**\r
1867                  * Retrieve the contents of an external (X)HTML document\r
1868                  */\r
1869                 function getContents($link) {\r
1870                 \r
1871                         // Use cURL extention if available\r
1872                         if (function_exists("curl_init") && $this->useCurl == 2)\r
1873                         {\r
1874                                 // Make HEAD request\r
1875                                 $ch = curl_init();\r
1876                                 @curl_setopt($ch, CURLOPT_URL, $link);\r
1877                                 @curl_setopt($ch, CURLOPT_HEADER, true);\r
1878                                 @curl_setopt($ch, CURLOPT_NOBODY, true);\r
1879                                 @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);\r
1880                                 @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);\r
1881                                 @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\r
1882                                 @curl_setopt($ch, CURLOPT_TIMEOUT, 20);\r
1883                                 @curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);\r
1884 \r
1885                                 $headers = curl_exec($ch);\r
1886                                 curl_close($ch);\r
1887                                 \r
1888                                 // Check if the link points to a (X)HTML document\r
1889                                 if (preg_match('/Content-Type: (text\/html|application\/xhtml+xml)/i', $headers))\r
1890                                 {\r
1891                                         return $this->retrieveUrl ($link);\r
1892                                 }\r
1893                                 \r
1894                                 return false;\r
1895                         }\r
1896                         else\r
1897                         {\r
1898                                 return $this->retrieveUrl ($link);\r
1899                         }\r
1900                 }\r
1901         \r
1902                 /*\r
1903                  * Get a single attribute from RDF\r
1904                  */\r
1905                 function getAttributeFromRDF($rdf, $attribute)\r
1906                 {\r
1907                         if (preg_match('/'.$attribute.'="([^"]+)"/', $rdf, $matches)) \r
1908                         {\r
1909                                 return $matches[1];\r
1910                         }\r
1911                         \r
1912                         return false;\r
1913                 }\r
1914 \r
1915 \r
1916 \r
1917 \r
1918 \r
1919 \r
1920                 /**************************************************************************************/\r
1921                 /* Internal helper functions for dealing with external file retrieval                 */\r
1922         \r
1923                 function retrieveUrl ($url) {\r
1924 //mod by cles\r
1925                         $ua = ini_set('user_agent', $this->userAgent);\r
1926 //mod by cles end\r
1927                         if (function_exists('curl_init') && $this->useCurl > 0)\r
1928                         {\r
1929                                 // Set options\r
1930                                 $ch = curl_init();\r
1931                                 @curl_setopt($ch, CURLOPT_URL, $url);\r
1932                                 @curl_setopt($ch, CURLOPT_HEADER, 1);\r
1933                                 @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r
1934                                 @curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);\r
1935                                 @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\r
1936                                 @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);\r
1937                                 @curl_setopt($ch, CURLOPT_TIMEOUT, 20);\r
1938                                 @curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);\r
1939                 \r
1940                                 // Retrieve response\r
1941                                 $raw  = curl_exec($ch);\r
1942                                 $info = curl_getinfo($ch);\r
1943                         \r
1944                                 // Split into headers and contents\r
1945                                 $headers  = substr($raw, 0, $info['header_size']);\r
1946                                 $contents = substr($raw, $info['header_size']);\r
1947 \r
1948                                 curl_close($ch);\r
1949                         }\r
1950                         elseif ($fp = @fopen ($url, "rb"))\r
1951                         {\r
1952 //mod by cles\r
1953 //                              $contents = fread($fp, 8192);\r
1954                                 $contents = '';\r
1955                                 while (!feof($fp)) {\r
1956                                         $contents .= fread($fp, 8192);\r
1957                                 }\r
1958 //mod by cles end\r
1959                                 $headers  = '';\r
1960                                 \r
1961                                 fclose($fp);\r
1962                         }               \r
1963 //mod by cles\r
1964                         ini_set('user_agent', $ua);\r
1965 //mod by cles end\r
1966                         \r
1967                         // Next normalize the encoding to UTF8...\r
1968                         $contents = $this->_convert_to_utf8_auto($contents, $headers);\r
1969         \r
1970                         return $contents;\r
1971                 }\r
1972                 \r
1973 \r
1974                 /**************************************************************************************/\r
1975                 /* Internal helper functions for dealing with encodings and entities                  */\r
1976         \r
1977                 var $entities_default = array (\r
1978                         '&quot;'                => '&#34;',             \r
1979                         '&amp;'                 => '&#38;',             \r
1980                         '&apos;'                => '&#39;',             \r
1981                         '&lt;'                  => '&#60;',             \r
1982                         '&gt;'                  => '&#62;',             \r
1983                 );\r
1984         \r
1985 //modify start+++++++++\r
1986                 function _restore_to_utf8($contents)\r
1987                 {\r
1988                         if (_CHARSET != 'UTF-8')\r
1989                         {\r
1990                                 $contents = mb_convert_encoding($contents, 'UTF-8', _CHARSET);\r
1991                         }\r
1992                         $contents = $this->_decode_entities(strip_tags($contents));\r
1993                         return $contents;\r
1994                 }\r
1995 //modify end+++++++++\r
1996                 function _detect_encoding($string)\r
1997                 {\r
1998 //modify start+++++++++\r
1999                         if (function_exists('mb_convert_encoding')) {\r
2000                                 $encoding = (preg_match ("/;\s*charset=([^\n]+)/is", serverVar("CONTENT_TYPE"), $regs))? \r
2001                                         strtoupper(trim($regs[1])):\r
2002                                         '';\r
2003 \r
2004                                 if ( ($encoding !="") && ((mb_http_input("P") == "") || ( strtolower( ini_get("mbstring.http_input") ) == "pass")) ) {\r
2005                                         return $encoding;\r
2006                                 } else { \r
2007                                         $encoding = mb_detect_encoding($string, NP_TRACKBACK_ENCODING_DETECT_ORDER);\r
2008                                 }\r
2009                                 return ( $encoding ) ? $encoding : _CHARSET;\r
2010                         }\r
2011 //modify end+++++++++\r
2012                         if (!ereg("[\x80-\xFF]", $string) && !ereg("\x1B", $string))\r
2013                         return 'US-ASCII';\r
2014                         \r
2015                         if (!ereg("[\x80-\xFF]", $string) && ereg("\x1B", $string))\r
2016                         return 'ISO-2022-JP';\r
2017                         \r
2018                         if (preg_match("/^([\x01-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF][\x80-\xBF])+$/", $string) == 1)\r
2019                         return 'UTF-8';\r
2020                         \r
2021                         if (preg_match("/^([\x01-\x7F]|\x8E[\xA0-\xDF]|\x8F[xA1-\xFE][\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE])+$/", $string) == 1)\r
2022                         return 'EUC-JP';\r
2023                         \r
2024                         if (preg_match("/^([\x01-\x7F]|[\xA0-\xDF]|[\x81-\xFC][\x40-\xFC])+$/", $string) == 1)\r
2025                         return 'Shift_JIS';\r
2026                         \r
2027                         return 'ISO-8859-1';\r
2028                 }\r
2029 \r
2030                 function _convert_to_utf8($contents, $encoding)\r
2031                 {\r
2032                         $done = false;\r
2033                         \r
2034 //modify start+++++++++\r
2035 //                      if (!$done && function_exists('iconv'))  \r
2036 //                      {\r
2037 //                      \r
2038 //                              $result = @iconv($encoding, 'UTF-8//IGNORE', $contents);\r
2039 //      \r
2040 //                              if ($result) \r
2041 //                              {\r
2042 //                                      $contents = $result;\r
2043 //                                      $done = true;\r
2044 //                              }\r
2045 //                      }\r
2046                         \r
2047                         if(!$done && function_exists('mb_convert_encoding')) \r
2048                         {\r
2049                                 \r
2050                                 if( function_exists('mb_substitute_character') ){\r
2051                                         @mb_substitute_character('none');\r
2052                                 }\r
2053                                 $result = @mb_convert_encoding($contents, 'UTF-8', $encoding );\r
2054         \r
2055                                 if ($result) \r
2056                                 {\r
2057                                         $contents = $result;\r
2058                                         $done = true;\r
2059                                 }\r
2060                         }\r
2061 \r
2062                         if (!$done && function_exists('iconv'))  \r
2063                         {\r
2064                         \r
2065                                 $result = @iconv($encoding, 'UTF-8//IGNORE', $contents);\r
2066         \r
2067                                 if ($result) \r
2068                                 {\r
2069                                         $contents = $result;\r
2070                                         $done = true;\r
2071                                 }\r
2072                         }\r
2073 //modify end+++++++++\r
2074                         return $contents;\r
2075                 }\r
2076                 \r
2077                 function _convert_to_utf8_auto($contents, $headers = '')\r
2078                 {\r
2079                         /* IN:  string in unknown encoding, headers received during transfer\r
2080                          * OUT: string in UTF-8 encoding\r
2081                          */\r
2082         \r
2083                         $str = substr($contents, 0, 4096);\r
2084                         $len = strlen($str);\r
2085                         $pos = 0;\r
2086                         $out = '';\r
2087                         \r
2088                         while ($pos < $len)\r
2089                         {\r
2090                                 $ord = ord($str[$pos]);\r
2091                                 \r
2092                                 if ($ord > 32 && $ord < 128)\r
2093                                         $out .= $str[$pos];\r
2094                                         \r
2095                                 $pos++;\r
2096                         }\r
2097         \r
2098                         // Detection of encoding, check headers\r
2099                         if (preg_match ("/;\s*charset=([^\n]+)/is", $headers, $regs))\r
2100                                 $encoding = strtoupper(trim($regs[1]));\r
2101         \r
2102                         // Then check meta inside document\r
2103                         if (preg_match ("/;\s*charset=([^\"']+)/is", $out, $regs))\r
2104                                 $encoding = strtoupper(trim($regs[1]));\r
2105                                 \r
2106                         // Then check xml declaration\r
2107                         if (preg_match("/<\?xml.+encoding\s*=\s*[\"|']([^\"']+)[\"|']\s*\?>/i", $out, $regs))\r
2108                                 $encoding = strtoupper(trim($regs[1]));         \r
2109         \r
2110                         // Converts\r
2111                         return $this->_convert_to_utf8($contents, $encoding);\r
2112                 }\r
2113                 \r
2114                 function _decode_entities($string)\r
2115                 {\r
2116                         /* IN:  string in UTF-8 containing entities\r
2117                          * OUT: string in UTF-8 without entities\r
2118                          */\r
2119                          \r
2120                         /// Convert all hexadecimal entities to decimal entities\r
2121                         $string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', "'&#'.hexdec('\\1').';'", $string);          \r
2122                         \r
2123                         global $_entities;\r
2124                         // Deal with invalid cp1251 numeric entities    \r
2125                         $string = strtr($string, $_entities['cp1251']);\r
2126 \r
2127                         // Convert all named entities to numeric entities\r
2128                         $string = strtr($string, $this->entities_default);\r
2129                         $string = strtr($string, $_entities['named']);\r
2130 \r
2131                         // Convert all numeric entities to UTF-8\r
2132                         $string = preg_replace('/&#([0-9]+);/e', "'&#x'.dechex('\\1').';'", $string);\r
2133                         $string = preg_replace('/&#[Xx]([0-9A-Fa-f]+);/e', "NP_TrackBack::_hex_to_utf8('\\1')", $string);               \r
2134 \r
2135                         return $string;\r
2136                 }\r
2137         \r
2138                 function _hex_to_utf8($s){\r
2139                         return entity::_hex_to_utf8($s);\r
2140                 }               \r
2141 \r
2142                 function _utf8_to_entities($string)\r
2143                 {\r
2144                         /* IN:  string in UTF-8 encoding\r
2145                          * OUT: string consisting of only characters ranging from 0x00 to 0x7f, \r
2146                          *      using numeric entities to represent the other characters \r
2147                          */\r
2148                          \r
2149                         $len = strlen ($string);\r
2150                         $pos = 0;\r
2151                         $out = '';\r
2152                                 \r
2153                         while ($pos < $len) \r
2154                         {\r
2155                                 $ascii = ord (substr ($string, $pos, 1));\r
2156                                 \r
2157                                 if ($ascii >= 0xF0) \r
2158                                 {\r
2159                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xF0;\r
2160                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2161                                         $byte[3] = ord(substr ($string, $pos + 2, 1)) - 0x80;\r
2162                                         $byte[4] = ord(substr ($string, $pos + 3, 1)) - 0x80;\r
2163         \r
2164                                         $char_code = ($byte[1] << 18) + ($byte[2] << 12) + ($byte[3] << 6) + $byte[4];\r
2165                                         $pos += 4;\r
2166                                 }\r
2167                                 elseif (($ascii >= 0xE0) && ($ascii < 0xF0)) \r
2168                                 {\r
2169                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xE0;\r
2170                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2171                                         $byte[3] = ord(substr ($string, $pos + 2, 1)) - 0x80;\r
2172         \r
2173                                         $char_code = ($byte[1] << 12) + ($byte[2] << 6) + $byte[3];\r
2174                                         $pos += 3;\r
2175                                 }\r
2176                                 elseif (($ascii >= 0xC0) && ($ascii < 0xE0)) \r
2177                                 {\r
2178                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xC0;\r
2179                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2180         \r
2181                                         $char_code = ($byte[1] << 6) + $byte[2];\r
2182                                         $pos += 2;\r
2183                                 }\r
2184                                 else \r
2185                                 {\r
2186                                         $char_code = ord(substr ($string, $pos, 1));\r
2187                                         $pos += 1;\r
2188                                 }\r
2189         \r
2190                                 if ($char_code < 0x80)\r
2191                                         $out .= chr($char_code);\r
2192                                 else\r
2193                                         $out .=  '&#'. str_pad($char_code, 5, '0', STR_PAD_LEFT) . ';';\r
2194                         }\r
2195         \r
2196                         return $out;    \r
2197                 }                       \r
2198 \r
2199                 function _utf8_to_javascript($string)\r
2200                 {\r
2201                         /* IN:  string in UTF-8 encoding\r
2202                          * OUT: string consisting of only characters ranging from 0x00 to 0x7f, \r
2203                          *      using javascript escapes to represent the other characters \r
2204                          */\r
2205                          \r
2206                         $len = strlen ($string);\r
2207                         $pos = 0;\r
2208                         $out = '';\r
2209                                 \r
2210                         while ($pos < $len) \r
2211                         {\r
2212                                 $ascii = ord (substr ($string, $pos, 1));\r
2213                                 \r
2214                                 if ($ascii >= 0xF0) \r
2215                                 {\r
2216                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xF0;\r
2217                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2218                                         $byte[3] = ord(substr ($string, $pos + 2, 1)) - 0x80;\r
2219                                         $byte[4] = ord(substr ($string, $pos + 3, 1)) - 0x80;\r
2220         \r
2221                                         $char_code = ($byte[1] << 18) + ($byte[2] << 12) + ($byte[3] << 6) + $byte[4];\r
2222                                         $pos += 4;\r
2223                                 }\r
2224                                 elseif (($ascii >= 0xE0) && ($ascii < 0xF0)) \r
2225                                 {\r
2226                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xE0;\r
2227                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2228                                         $byte[3] = ord(substr ($string, $pos + 2, 1)) - 0x80;\r
2229         \r
2230                                         $char_code = ($byte[1] << 12) + ($byte[2] << 6) + $byte[3];\r
2231                                         $pos += 3;\r
2232                                 }\r
2233                                 elseif (($ascii >= 0xC0) && ($ascii < 0xE0)) \r
2234                                 {\r
2235                                         $byte[1] = ord(substr ($string, $pos, 1)) - 0xC0;\r
2236                                         $byte[2] = ord(substr ($string, $pos + 1, 1)) - 0x80;\r
2237         \r
2238                                         $char_code = ($byte[1] << 6) + $byte[2];\r
2239                                         $pos += 2;\r
2240                                 }\r
2241                                 else \r
2242                                 {\r
2243                                         $char_code = ord(substr ($string, $pos, 1));\r
2244                                         $pos += 1;\r
2245                                 }\r
2246         \r
2247                                 if ($char_code < 0x80)\r
2248                                         $out .= chr($char_code);\r
2249                                 else\r
2250                                         $out .=  '\\u'. str_pad(dechex($char_code), 4, '0', STR_PAD_LEFT);\r
2251                         }\r
2252         \r
2253                         return $out;    \r
2254                 }                       \r
2255 /*              \r
2256                 function _cut_string($string, $dl = 0) {\r
2257                 \r
2258                         $defaultLength = $dl > 0 ? $dl : $this->getOption('defaultLength');\r
2259                         \r
2260                         if ($defaultLength < 1)\r
2261                                 return $string;\r
2262         \r
2263                         $border    = 6;\r
2264                         $count     = 0;\r
2265                         $lastvalue = 0;\r
2266         \r
2267                         for ($i = 0; $i < strlen($string); $i++)\r
2268                 {\r
2269                         $value = ord($string[$i]);\r
2270            \r
2271                                 if ($value > 127)\r
2272                         {\r
2273                                 if ($value >= 192 && $value <= 223)\r
2274                                 $i++;\r
2275                                 elseif ($value >= 224 && $value <= 239)\r
2276                                 $i = $i + 2;\r
2277                                 elseif ($value >= 240 && $value <= 247)\r
2278                                 $i = $i + 3;\r
2279                                         \r
2280                                         if ($lastvalue <= 223 && $value >= 223 && \r
2281                                                 $count >= $defaultLength - $border)\r
2282                                         {\r
2283                                                 return substr($string, 0, $i) . '...';\r
2284                                         }\r
2285 \r
2286                                         // Chinese and Japanese characters are\r
2287                                         // wider than Latin characters\r
2288                                         if ($value >= 224)\r
2289                                                 $count++;\r
2290                                         \r
2291                         }\r
2292                                 elseif ($string[$i] == '/' || $string[$i] == '?' ||\r
2293                                                 $string[$i] == '-' || $string[$i] == ':' ||\r
2294                                                 $string[$i] == ',' || $string[$i] == ';')\r
2295                                 {\r
2296                                         if ($count >= $defaultLength - $border)\r
2297                                                 return substr($string, 0, $i) . '...';\r
2298                                 }\r
2299                                 elseif ($string[$i] == ' ')\r
2300                                 {\r
2301                                         if ($count >= $defaultLength - $border)\r
2302                                                 return substr($string, 0, $i) . '...';\r
2303                                 }\r
2304                                 \r
2305                                 if ($count == $defaultLength)\r
2306                                         return substr($string, 0, $i + 1) . '...';\r
2307       \r
2308                                 $lastvalue = $value;\r
2309                         $count++;\r
2310                 }\r
2311 \r
2312                         return $string;\r
2313                 }\r
2314 */\r
2315 \r
2316 function _cut_string($string, $dl = 0) {\r
2317         $maxLength = $dl > 0 ? $dl : $this->getOption('defaultLength');\r
2318         \r
2319         if ($maxLength < 1)\r
2320                 return $string;\r
2321         if (strlen($string) > $maxLength)\r
2322                 $string = mb_strimwidth($string, 0, $maxLength, '...', _CHARSET);\r
2323 \r
2324         return $string;\r
2325 }\r
2326 \r
2327 function _strip_controlchar($string){\r
2328         $string = preg_replace("/[\x01-\x08\x0b\x0c\x0e-\x1f\x7f]+/","",$string);\r
2329         $string = str_replace("\0","",$string);\r
2330         return $string;\r
2331 }\r
2332 \r
2333 //modify start+++++++++\r
2334         function checkTableVersion(){\r
2335                                 $res = sql_query("SHOW FIELDS from ".sql_table('plugin_tb') );\r
2336                                 $fieldnames = array();\r
2337                                 while ($co = mysql_fetch_assoc($res)) {\r
2338                                         if($co['Field'] == 'block') return true;\r
2339                                 }\r
2340                                 return false;\r
2341         }\r
2342 //modify end+++++++++\r
2343 \r
2344 /*---------------------------------------------------------------------------------- */\r
2345 /*   LOCAL                                                                           */\r
2346 /*---------------------------------------------------------------------------------- */\r
2347         /**\r
2348           * Handle an incoming TrackBack ping and save the data in the database\r
2349           */\r
2350         function handleLocalPing($itemid, $title, $excerpt, $blog_name, $ping_url){\r
2351                 global $manager;\r
2352                 $ping_url = trim($ping_url);\r
2353                 \r
2354                 if( preg_match("/^.+tb_id=([0-9]+)$/",$ping_url,$idnum) ){\r
2355                         $tb_id = intval($idnum[1]);\r
2356                 } elseif ( preg_match("/([0-9]+)\.trackback/",$ping_url,$idnum) ){\r
2357                         $tb_id = intval($idnum[1]);\r
2358                 } elseif ( preg_match("/itemid=([0-9]+)/",$ping_url,$idnum) ){\r
2359                         $tb_id = intval($idnum[1]);\r
2360                 }\r
2361 \r
2362                 if ((!$manager->existsItem($tb_id,0,0)) && ($this->getOption('CheckIDs') == 'yes'))\r
2363                         return _ERROR_NOSUCHITEM . "[ $tb_id ]";\r
2364                         \r
2365                 // save data in the DB\r
2366                 $query = 'INSERT INTO ' . sql_table('plugin_tb_lc') . " (tb_id, from_id) VALUES ('".intval($tb_id)."','".intval($itemid)."')";\r
2367                 $res = @sql_query($query);\r
2368                 if (!$res) \r
2369                         return 'Could not save trackback data, possibly because of a double entry: ' . mysql_error();\r
2370         }\r
2371         \r
2372         /**\r
2373           * Show the list of TrackBack pings for a certain Trackback ID\r
2374           */\r
2375         function showLocalList($tb_id) {\r
2376                 global $CONF, $manager;\r
2377                 \r
2378                 // create SQL query\r
2379                 $query = 'SELECT t.from_id as from_id , i.ititle as ititle, i.ibody as ibody, i.itime as itime, i.iblog as iblog FROM '.sql_table('plugin_tb_lc').' as t, '.sql_table('item').' as i WHERE t.tb_id='.intval($tb_id) .' and i.inumber=t.from_id ORDER BY i.itime DESC';\r
2380                 $res = sql_query($query);\r
2381                 \r
2382                 $vars = array(\r
2383                         'tburl' => $this->getTrackBackUrl($tb_id)\r
2384                 );\r
2385 \r
2386                 // when no TrackBack pings are found\r
2387                 if (!$res || mysql_num_rows($res) == 0) {\r
2388                         echo TEMPLATE::fill($this->getOption('tplLocalEmpty'), $vars);\r
2389                         return;\r
2390                 }\r
2391                 \r
2392                 // when TrackBack pings are found\r
2393                 echo TEMPLATE::fill($this->getOption('tplLocalHeader'), $vars);\r
2394                 \r
2395                 while ($o = mysql_fetch_object($res)) {\r
2396                         $canDelete = $this->canDelete($tb_id);\r
2397                         $data = array(\r
2398                                 'url' => createItemLink($o->from_id),\r
2399                                 'blogname' => htmlspecialchars(getBlogNameFromID($o->iblog)),\r
2400                                 'timestamp' => strftime('%Y-%m-%d',strtotime($o->itime)),\r
2401                                 'title' => htmlspecialchars($o->ititle),\r
2402                                 'excerpt' => htmlspecialchars(shorten(strip_tags($o->ibody),200,'...')),\r
2403                                 'delete' => $canDelete?'<a href="'. $manager->addTicketToUrl($CONF['ActionURL'].'?action=plugin&amp;name=TrackBack&amp;type=deletelc&amp;tb_id='.intval($tb_id).'&amp;from_id='.intval($o->from_id)).'">[delete]</a>':'',\r
2404                                 'tburl' => $this->getTrackBackUrl($tb_id),\r
2405                                 'commentcount'=> quickQuery('SELECT COUNT(*) as result FROM '.sql_table('comment').' WHERE citem=' . intval($o->from_id))\r
2406                         );\r
2407                         echo TEMPLATE::fill($this->getOption('tplLocalItem'), $data);\r
2408                 }\r
2409                 echo TEMPLATE::fill($this->getOption('tplLocalFooter'), $vars);\r
2410         }\r
2411         \r
2412         /**\r
2413           * Delete a TrackBack item, redirect to referer\r
2414           */\r
2415         function deleteLocal($tb_id, $from_id) {\r
2416                 if (!$this->canDelete($tb_id))\r
2417                         return 'You\'re not allowed to delete this trackback item';\r
2418                 $query = 'DELETE FROM ' . sql_table('plugin_tb_lc') . " WHERE tb_id='" . intval($tb_id) . "' and from_id='" . intval($from_id) ."'";\r
2419                 sql_query($query);\r
2420                 return '';\r
2421         }\r
2422         \r
2423         function canDelete($tb_id) {\r
2424                 global $member, $manager;\r
2425                 \r
2426                 if ( ! $member->isLoggedIn() ) return 0;\r
2427                 \r
2428                 $checkIDs = $this->getOption('CheckIDs');\r
2429                 $itemExists =& $manager->existsItem($tb_id,0,0);\r
2430                 \r
2431                 // if CheckIDs option is set, check if member canEdit($tb_id)\r
2432                 // if CheckIDs option is not set, and item exists, check if member canEdit($tb_id)\r
2433                 // if CheckIDs option is not set, and item does not exists, check if member isAdmin()\r
2434                 \r
2435                 if (($checkIDs == 'yes') || ($itemExists))\r
2436                         return $member->canAlterItem($tb_id);\r
2437                 else\r
2438                         return $member->isAdmin();\r
2439         }\r
2440 \r
2441                 /**************************************************************************************/\r
2442                 /* Plugin API calls, for installation, configuration and setup                        */\r
2443         \r
2444                 function getName()        {             return 'TrackBack';   }\r
2445                 function getAuthor()      {             return 'rakaz + nakahara21 + hsur'; }\r
2446                 function getURL()         {             return 'http://blog.cles.jp/np_cles/category/31/subcatid/3'; }\r
2447                 function getVersion()     {             return '2.0.3 jp13'; }\r
2448                 function getDescription() {             return '[$Revision: 1.311 $]<br />' . _TB_DESCRIPTION; }\r
2449         \r
2450 //modify start+++++++++\r
2451 /*\r
2452                 function getTableList()   {             return array(sql_table("plugin_tb"), sql_table("plugin_tb_lookup")); }\r
2453                 function getEventList()   {             return array('QuickMenu','PostAddItem','AddItemFormExtras','EditItemFormExtras','PreUpdateItem','PrepareItemForEdit', 'BookmarkletExtraHead'); }\r
2454 */\r
2455                 function getTableList()   {             return array(sql_table("plugin_tb"), sql_table("plugin_tb_lookup"), sql_table('plugin_tb_lc')); }\r
2456 \r
2457                 function getEventList()   {             return array('QuickMenu','PostAddItem','AddItemFormExtras','EditItemFormExtras','PreUpdateItem','PrepareItemForEdit', 'BookmarkletExtraHead', 'RetrieveTrackback', 'SendTrackback', 'InitSkinParse'); }\r
2458 //modify end+++++++++\r
2459                 function getMinNucleusVersion() {       return 330; }\r
2460         \r
2461                 function supportsFeature($feature) {\r
2462                         switch($feature) {\r
2463                                 case 'SqlTablePrefix':\r
2464                                         return 1;\r
2465 //modify start+++++++++\r
2466 //                              case 'HelpPage':\r
2467 //                                      return 1;\r
2468 //modify end+++++++++\r
2469                                 default:\r
2470                                         return 0;\r
2471                         }\r
2472                 }\r
2473 \r
2474         \r
2475                 function hasAdminArea() {                       return 1; }\r
2476 \r
2477                 function event_QuickMenu(&$data) {\r
2478                         global $member, $nucleus, $blogid;\r
2479                         \r
2480                         // only show to admins\r
2481                         if (!$member->isLoggedIn()) return;\r
2482 \r
2483                         array_push(\r
2484                                 $data['options'],\r
2485                                 array(\r
2486                                         'title' => 'Trackback',\r
2487                                         'url' => $this->getAdminURL(),\r
2488                                         'tooltip' => 'Manage your trackbacks'\r
2489                                 )\r
2490                         );\r
2491                 }\r
2492                         \r
2493                 function install() {\r
2494                         $this->createOption('AcceptPing',  _TB_AcceptPing,'yesno','yes');\r
2495                         $this->createOption('SendPings',   _TB_SendPings,'yesno','yes');\r
2496                         $this->createOption('AutoXMLHttp', _TB_AutoXMLHttp, 'yesno', 'yes');\r
2497                         $this->createOption('CheckIDs',    _TB_CheckIDs,'yesno','yes');\r
2498 \r
2499                         $this->createOption('tplHeader',   _TB_tplHeader, 'textarea', _TB_tplHeader_VAL);\r
2500                         $this->createOption('tplEmpty',    _TB_tplEmpty, 'textarea', _TB_tplEmpty_VAL);\r
2501                         $this->createOption('tplItem',     _TB_tplItem, 'textarea', _TB_tplItem_VAL);\r
2502                         $this->createOption('tplFooter',   _TB_tplFooter, 'textarea', _TB_tplFooter_VAL);\r
2503 //mod by cles\r
2504                         $this->createOption('tplLocalHeader',   _TB_tplLocalHeader, 'textarea', _TB_tplLocalHeader_VAL);\r
2505                         $this->createOption('tplLocalEmpty',       _TB_tplLocalEmpty, 'textarea', _TB_tplLocalEmpty_VAL);\r
2506                         $this->createOption('tplLocalItem',        _TB_tplLocalItem, 'textarea', _TB_tplLocalItem_VAL);\r
2507                         $this->createOption('tplLocalFooter',   _TB_tplLocalFooter, 'textarea', _TB_tplLocalFooter_VAL);\r
2508 //mod by cles end\r
2509 \r
2510                         $this->createOption('tplTbNone',   _TB_tplTbNone, 'text', "No Trackbacks");\r
2511                         $this->createOption('tplTbOne',    _TB_tplTbOne, 'text', "1 Trackback");\r
2512                         $this->createOption('tplTbMore',   _TB_tplTbMore, 'text', "<%number%> Trackbacks");\r
2513                         $this->createOption('dateFormat',  _TB_dateFormat, 'text', _TB_dateFormat_VAL);\r
2514         \r
2515                         $this->createOption('NotifyEmail', _TB_NotifyEmail,'text','');\r
2516                         $this->createOption('DropTable',   _TB_DropTable,'yesno','no');\r
2517 //mod by cles\r
2518                         $this->createOption('HideUrl',_TB_HideUrl,'yesno','yes');\r
2519                         $this->createOption('ajaxEnabled',_TB_ajaxEnabled,'yesno','no');\r
2520 \r
2521                         $this->createItemOption('ItemAcceptPing',_TB_ItemAcceptPing,'yesno','yes');\r
2522                         $this->createItemOption('isAcceptW/OLink',_TB_isAcceptWOLink,'select','default', _TB_isAcceptWOLink_VAL);\r
2523 \r
2524                         $this->createBlogOption('NotifyEmailBlog', _TB_NotifyEmailBlog,'text','');      \r
2525                         $this->createBlogOption('isAcceptW/OLinkDef',_TB_isAcceptWOLinkDef,'select','block', _TB_isAcceptWOLinkDef_VAL);\r
2526                         $this->createBlogOption('AllowTrackBack',_TB_AllowTrackBack,'yesno','yes');\r
2527 //mod by cles end\r
2528 \r
2529                         /* Create tables */\r
2530                         sql_query("\r
2531                                 CREATE TABLE IF NOT EXISTS \r
2532                                         ".sql_table('plugin_tb')."\r
2533                                 (\r
2534                                         `id`        INT(11)         NOT NULL       AUTO_INCREMENT,\r
2535                                         `tb_id`     INT(11)         NOT NULL, \r
2536                                         `url`       TEXT            NOT NULL, \r
2537                                         `block`     TINYINT(4)      NOT NULL, \r
2538                                         `spam`      TINYINT(4)      NOT NULL, \r
2539                                         `link`      TINYINT(4)      NOT NULL, \r
2540                                         `title`     TEXT,       \r
2541                                         `excerpt`   TEXT, \r
2542                                         `blog_name` TEXT, \r
2543                                         `timestamp` DATETIME, \r
2544                                         \r
2545                                         PRIMARY KEY (`id`)\r
2546                                 )\r
2547                         ");\r
2548                                                 \r
2549                         sql_query("\r
2550                                 CREATE TABLE IF NOT EXISTS\r
2551                                         ".sql_table('plugin_tb_lookup')."\r
2552                                 (\r
2553                                         `link`      TEXT            NOT NULL, \r
2554                                         `url`       TEXT            NOT NULL, \r
2555                                         `title`     TEXT, \r
2556                                         \r
2557                                         PRIMARY KEY (`link` (100))\r
2558                                 )\r
2559                         ");\r
2560 //modify start+++++++++\r
2561                         @sql_query('ALTER TABLE `' . sql_table('plugin_tb') . '` ADD INDEX `tb_id_block_timestamp_idx` ( `tb_id`, `block`, `timestamp` DESC )');\r
2562                         @sql_query('CREATE TABLE IF NOT EXISTS ' . sql_table('plugin_tb_lc'). ' (tb_id int(11) not null, from_id int(11) not null, PRIMARY KEY (tb_id,from_id))');\r
2563 //modify end+++++++++\r
2564                 }\r
2565         \r
2566                 function uninstall() {\r
2567                         if ($this->getOption('DropTable') == 'yes') {\r
2568                                 sql_query ('DROP TABLE '.sql_table('plugin_tb'));\r
2569                                 sql_query ('DROP TABLE '.sql_table('plugin_tb_lookup'));\r
2570                                 sql_query ("DROP table ".sql_table('plugin_tb_lc'));\r
2571                         }\r
2572                 }\r
2573 \r
2574                 function init() {\r
2575                         // include language file for this plugin \r
2576                         $language = ereg_replace( '[\\|/]', '', getLanguageName()); \r
2577                         if (file_exists($this->getDirectory().'language/'.$language.'.php')) \r
2578                                 include_once($this->getDirectory().'language/'.$language.'.php'); \r
2579       else \r
2580                                 include_once($this->getDirectory().'language/'.'english.php'); \r
2581                         $this->notificationMail = _TB_NORTIFICATION_MAIL_BODY;\r
2582                         $this->notificationMailTitle = _TB_NORTIFICATION_MAIL_TITLE;\r
2583                         \r
2584                         $this->userAgent = 'NucleusCMS NP_TrackBack plugin ( '.$this->getVersion().' )';\r
2585                 }\r
2586         }\r