OSDN Git Service

InterWikiName: Correct Google.jp => Google, Yahoo.jp => Yahoo
[pukiwiki/pukiwiki.git] / plugin / tb.inc.php
1 <?php
2 // $Id: tb.inc.php,v 1.17 2005/01/23 03:15:40 henoheno Exp $
3 /*
4  * PukiWiki/TrackBack: TrackBack Ping receiver and viewer
5  * (C) 2003-2004 PukiWiki Developer Team
6  * (C) 2003, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
7  * License: GPL
8  *
9  * plugin_tb_action()    action
10  * plugin_tb_save($url, $tb_id) Save or update TrackBack Ping data
11  * plugin_tb_return($rc, $msg)  Return TrackBack ping via HTTP/XML
12  * plugin_tb_mode_rss($tb_id)   ?__mode=rss
13  * plugin_tb_mode_view($tb_id)  ?__mode=view
14  */
15
16 switch(LANG){
17 case 'ja': define('PLUGIN_TB_LANGUAGE', 'ja-Jp'); break;
18 default  : define('PLUGIN_TB_LANGUAGE', 'en-us'); break;
19 }
20
21 function plugin_tb_action()
22 {
23         global $vars, $trackback;
24
25         if (isset($vars['url'])) {
26                 // Receive and save a TrackBack Ping (both GET and POST)
27                 $url   = $vars['url'];
28                 $tb_id = isset($vars['tb_id']) ? $vars['tb_id'] : '';
29                 plugin_tb_save($url, $tb_id); // Send a response (and exit)
30
31         } else {
32                 if ($trackback && isset($vars['__mode']) && isset($vars['tb_id'])) {
33                         // Show TrackBacks received (and exit)
34                         switch ($vars['__mode']) {
35                         case 'rss' : plugin_tb_mode_rss($vars['tb_id']);  break;
36                         case 'view': plugin_tb_mode_view($vars['tb_id']); break;
37                         }
38                 }
39
40                 // Show List of pages that TrackBacks reached
41                 $pages = get_existpages(TRACKBACK_DIR, '.txt');
42                 if (! empty($pages)) {
43                         return array('msg'=>'trackback list',
44                                 'body'=>page_list($pages, 'read', FALSE));
45                 } else {
46                         return array('msg'=>'', 'body'=>'');
47                 }
48         }
49 }
50
51 // Save or update TrackBack Ping data
52 function plugin_tb_save($url, $tb_id)
53 {
54         global $vars, $trackback;
55         static $fields = array( /* UTIME, */ 'url', 'title', 'excerpt', 'blog_name');
56
57         $die = '';
58         if (! $trackback) $die .= 'TrackBack feature disabled. ';
59         if ($url   == '') $die .= 'URL parameter is not set. ';
60         if ($tb_id == '') $die .= 'TrackBack Ping ID is not set. ';
61         if ($die != '') plugin_tb_return(1, $die);
62
63         if (! file_exists(TRACKBACK_DIR)) plugin_tb_return(1, 'No such directory: TRACKBACK_DIR');
64         if (! is_writable(TRACKBACK_DIR)) plugin_tb_return(1, 'Permission denied: TRACKBACK_DIR');
65
66         $page = tb_id2page($tb_id);
67         if ($page === FALSE) plugin_tb_return(1, 'TrackBack ID is invalid.');
68
69         // URL validation (maybe worse of processing time limit)
70         $result = http_request($url, 'HEAD');
71         if ($result['rc'] !== 200) plugin_tb_return(1, 'URL is fictitious.');
72
73         // Update TrackBack Ping data
74         $filename = tb_get_filename($page);
75         $data     = tb_get($filename);
76
77         $items = array(UTIME);
78         foreach ($fields as $key) {
79                 $value = isset($vars[$key]) ? $vars[$key] : '';
80                 if (preg_match('/[,"' . "\n\r" . ']/', $value))
81                         $value = '"' . str_replace('"', '""', $value) . '"';
82                 $items[$key] = $value;
83         }
84         $data[rawurldecode($items['url'])] = $items;
85
86         $fp = fopen($filename, 'w');
87         set_file_buffer($fp, 0);
88         flock($fp, LOCK_EX);
89         rewind($fp);
90         foreach ($data as $line) {
91                 $line = preg_replace('/[\r\n]/s', '', $line); // One line, one ping
92                 fwrite($fp, join(',', $line) . "\n");
93         }
94         flock($fp, LOCK_UN);
95         fclose($fp);
96
97         plugin_tb_return(0); // Return OK
98 }
99
100 // Return TrackBack ping via HTTP/XML
101 function plugin_tb_return($rc, $msg = '')
102 {
103         pkwk_common_headers();
104         header('Content-Type: text/xml');
105         echo '<?xml version="1.0" encoding="iso-8859-1"?>';
106         echo '<response>';
107         echo ' <error>' . $rc . '</error>';
108         if ($rc !== 0) echo '<message>' . $msg . '</message>';
109         echo '</response>';
110         exit;
111 }
112
113 // ?__mode=rss
114 function plugin_tb_mode_rss($tb_id)
115 {
116         global $script, $vars, $entity_pattern;
117
118         $page = tb_id2page($tb_id);
119         if ($page === FALSE) return FALSE;
120
121         $items = '';
122         foreach (tb_get(tb_get_filename($page)) as $arr) {
123                 // _utime_, title, excerpt, _blog_name_
124                 array_shift($arr); // Cut utime
125                 list ($url, $title, $excerpt) = array_map(
126                         create_function('$a', 'return htmlspecialchars($a);'), $arr);
127                 $items .= <<<EOD
128
129    <item>
130     <title>$title</title>
131     <link>$url</link>
132     <description>$excerpt</description>
133    </item>
134 EOD;
135         }
136
137         $title = htmlspecialchars($page);
138         $link  = $script . '?' . rawurlencode($page);
139         $vars['page'] = $page;
140         $excerpt = strip_htmltag(convert_html(get_source($page)));
141         $excerpt = preg_replace("/&$entity_pattern;/", '', $excerpt);
142         $excerpt = mb_strimwidth(preg_replace("/[\r\n]/", ' ', $excerpt), 0, 255, '...');
143         $lang    = PLUGIN_TB_LANGUAGE;
144
145         $rc = <<<EOD
146 <?xml version="1.0" encoding="utf-8" ?>
147 <response>
148  <error>0</error>
149  <rss version="0.91">
150   <channel>
151    <title>$title</title>
152    <link>$link</link>
153    <description>$excerpt</description>
154    <language>$lang</language>$items
155   </channel>
156  </rss>
157 </response>
158 EOD;
159
160         pkwk_common_headers();
161         header('Content-Type: text/xml');
162         echo mb_convert_encoding($rc, 'UTF-8', SOURCE_ENCODING);
163         exit;
164 }
165
166 // ?__mode=view
167 function plugin_tb_mode_view($tb_id)
168 {
169         global $script, $page_title;
170         global $_tb_title, $_tb_header, $_tb_entry, $_tb_refer, $_tb_date;
171         global $_tb_header_Excerpt, $_tb_header_Weblog, $_tb_header_Tracked;
172
173         $page = tb_id2page($tb_id);
174         if ($page === FALSE) return FALSE;
175
176         $r_page = rawurlencode($page);
177
178         $tb_title = sprintf($_tb_title, $page);
179         $tb_refer = sprintf($_tb_refer, '<a href="' . $script . '?' . $r_page .
180                 '">\'' . $page . '\'</a>', '<a href="' . $script . '">' . $page_title . '</a>');
181
182         $data = tb_get(tb_get_filename($page));
183
184         // Sort: The first is the latest
185         usort($data, create_function('$a,$b', 'return $b[0] - $a[0];'));
186
187         $tb_body = '';
188         foreach ($data as $x) {
189                 if (count($x) != 5) continue; // Ignore incorrect record
190
191                 list ($time, $url, $title, $excerpt, $blog_name) = $x;
192                 if ($title == '') $title = 'no title';
193
194                 $time = date($_tb_date, $time + LOCALZONE); // May 2, 2003 11:25 AM
195                 $tb_body .= <<<EOD
196 <div class="trackback-body">
197  <span class="trackback-post"><a href="$url" target="new" rel="nofollow">$title</a><br />
198   <strong>$_tb_header_Excerpt</strong> $excerpt<br />
199   <strong>$_tb_header_Weblog</strong> $blog_name<br />
200   <strong>$_tb_header_Tracked</strong> $time
201  </span>
202 </div>
203 EOD;
204         }
205         $msg = <<<EOD
206 <?xml version="1.0" encoding="UTF-8"?>
207 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
208 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
209 <head>
210  <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
211  <title>$tb_title</title>
212  <link rel="stylesheet" href="skin/trackback.css" type="text/css" />
213 </head>
214 <body>
215  <div id="banner-commentspop">$_tb_header</div>
216  <div class="blog">
217   <div class="trackback-url">
218    $_tb_entry<br />
219    $script?tb_id=$tb_id<br /><br />
220    $tb_refer
221   </div>
222   $tb_body
223  </div>
224 </body>
225 </html>
226 EOD;
227
228         pkwk_common_headers();
229
230         // BugTrack/466 Care for MSIE trouble
231         // Logically correct, but MSIE will treat the data like 'file downloading'
232         //header('Content-type: application/xhtml+xml; charset=UTF-8');
233         header('Content-type: text/html; charset=UTF-8'); // Works well
234
235         echo mb_convert_encoding($msg, 'UTF-8', SOURCE_ENCODING);
236         exit;
237 }
238 ?>