* License: GPL * * plugin_tb_action() action * tb_save() TrackBack Ping データ保存(更新) * tb_xml_msg($rc,$msg) XML 結果出力 * tb_mode_rss($tb_id) ?__mode=rss 処理 * tb_mode_view($tb_id) ?__mode=view 処理 */ function plugin_tb_action() { global $script,$vars,$trackback; // POST: TrackBack Ping を保存する if (!empty($vars['url'])) { tb_save(); } if ($trackback and !empty($vars['__mode']) and !empty($vars['tb_id'])) { switch ($vars['__mode']) { case 'rss': tb_mode_rss($vars['tb_id']); break; case 'view': tb_mode_view($vars['tb_id']); break; } } $pages = get_existpages(TRACKBACK_DIR,'.txt'); if (count($pages) == 0) { return array('msg'=>'','body'=>''); } return array( 'msg' => 'trackback list', 'body' => page_list($pages,'read',FALSE) ); } // TrackBack Ping データ保存(更新) function tb_save() { global $script,$vars,$trackback; static $fields = array(/* UTIME, */'url','title','excerpt','blog_name'); // 許可していないのに呼ばれた場合の対応 if (!$trackback) { tb_xml_msg(1,'Feature inactive.'); } // TrackBack Ping における URL パラメータは必須である。 if (empty($vars['url'])) { tb_xml_msg(1,'It is an indispensable parameter. URL is not set up.'); } // Query String を得る if (empty($vars['tb_id'])) { tb_xml_msg(1,'TrackBack Ping URL is inaccurate.'); } $url = $vars['url']; $tb_id = $vars['tb_id']; // ページ存在チェック $page = tb_id2page($tb_id); if ($page === FALSE) { tb_xml_msg(1,'TrackBack ID is invalid.'); } // URL 妥当性チェック (これを入れると処理時間に問題がでる) $result = http_request($url,'HEAD'); if ($result['rc'] !== 200) { tb_xml_msg(1,'URL is fictitious.'); } // TRACKBACK_DIR の存在と書き込み可能かの確認 if (!file_exists(TRACKBACK_DIR)) { tb_xml_msg(1,'No such directory'); } if (!is_writable(TRACKBACK_DIR)) { tb_xml_msg(1,'Permission denied'); } // TrackBack Ping のデータを更新 $filename = tb_get_filename($page); $data = tb_get($filename); $items = array(UTIME); foreach ($fields as $field) { $value = array_key_exists($field,$vars) ? $vars[$field] : ''; if (ereg("[,\"\n\r]",$value)) { $value = '"'.str_replace('"', '""', $value).'"'; } $items[$field] = $value; } $data[rawurldecode($items['url'])] = $items; $fp = fopen($filename,'w'); set_file_buffer($fp, 0); flock($fp,LOCK_EX); rewind($fp); foreach ($data as $line) { fwrite($fp,join(',',$line)."\n"); } flock($fp,LOCK_UN); fclose($fp); tb_xml_msg(0,''); } // XML 結果出力 function tb_xml_msg($rc,$msg) { header('Content-Type: text/xml'); echo ''; echo << $rc $msg EOD; die; } // ?__mode=rss 処理 function tb_mode_rss($tb_id) { global $script,$vars,$entity_pattern; $page = tb_id2page($tb_id); if ($page === FALSE) { return FALSE; } $items = ''; foreach (tb_get(tb_get_filename($page)) as $arr) { $utime = array_shift($arr); list ($url,$title,$excerpt,$blog_name) = array_map( create_function('$a','return htmlspecialchars($a);'),$arr); $items .= << $title $url $excerpt EOD; } $title = htmlspecialchars($page); $link = "$script?".rawurlencode($page); $vars['page'] = $page; $excerpt = strip_htmltag(convert_html(get_source($page))); $excerpt = preg_replace("/&$entity_pattern;/",'',$excerpt); $excerpt = mb_strimwidth(preg_replace("/[\r\n]/",' ',$excerpt),0,255,'...'); $rc = << 0 $title $link $excerpt ja-Jp$items EOD; $rc = mb_convert_encoding($rc,'UTF-8',SOURCE_ENCODING); header('Content-Type: text/xml'); echo ''; echo $rc; die; } // ?__mode=view 処理 function tb_mode_view($tb_id) { global $script,$page_title; global $_tb_title,$_tb_header,$_tb_entry,$_tb_refer,$_tb_date; global $_tb_header_Excerpt,$_tb_header_Weblog,$_tb_header_Tracked; // TrackBack ID からページ名を取得 $page = tb_id2page($tb_id); if ($page === FALSE) { return FALSE; } $r_page = rawurlencode($page); $tb_title = sprintf($_tb_title,$page); $tb_refer = sprintf($_tb_refer,"'$page'","$page_title"); $data = tb_get(tb_get_filename($page)); // 最新版から整列 usort($data,create_function('$a,$b','return $b[0] - $a[0];')); $tb_body = ''; foreach ($data as $x) { if (count($x) != 5) { // record broken continue; } list ($time,$url,$title,$excerpt,$blog_name) = $x; if ($title == '') { $title = 'no title'; } $time = date($_tb_date, $time + LOCALZONE); // May 2, 2003 11:25 AM $tb_body .= << $title
$_tb_header_Excerpt $excerpt
$_tb_header_Weblog $blog_name
$_tb_header_Tracked $time
EOD; } $msg = << $tb_title
$_tb_entry
$script?tb_id=$tb_id

$tb_refer
$tb_body
EOD; // BugTrack/466 エンコード誤認対策 header('Content-type: text/html; charset=UTF-8'); echo ''; echo mb_convert_encoding($msg,'UTF-8',SOURCE_ENCODING); die; } ?>