OSDN Git Service

TrackBackの処理を修正
authorarino <arino>
Sun, 27 Jul 2003 13:54:59 +0000 (22:54 +0900)
committerarino <arino>
Sun, 27 Jul 2003 13:54:59 +0000 (22:54 +0900)
http_request()関数をTrackBackから独立させ、proxy二対応できるように修正
proxy.phpを追加

plugin/referer.inc.php
proxy.php [new file with mode: 0644]
pukiwiki.ini.php
trackback.php

index 70b805d..3417fdc 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// $Id: referer.inc.php,v 1.1 2003/07/03 04:56:04 arino Exp $
+// $Id: referer.inc.php,v 1.2 2003/07/27 13:54:58 arino Exp $
 /*
  * PukiWiki Referer ¥×¥é¥°¥¤¥ó(¥ê¥ó¥¯¸µÉ½¼¨¥×¥é¥°¥¤¥ó)
  * (C) 2003, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
 // ¹½À®ÄêµÁ¥Õ¥¡¥¤¥ë
 define('CONFIG_REFERER','plugin/referer/config');
 
-function plugin_referer_action() {
-  global $script,$vars,$post,$referer;
-  global $_referer_msg;
-
-  // µö²Ä¤·¤Æ¤¤¤Ê¤¤¤Î¤Ë¸Æ¤Ð¤ì¤¿¾ì¹ç¤ÎÂбþ
-  if (!$referer) {
-    // ¥Ç¥Õ¥©¥ë¥È¤Ï¡¢PukiWiki ¤òɽ¼¨
-    header("Location: $script");
-    die();
-  }
-
-  // ¥Ú¡¼¥¸»ØÄê¤Ê¤·
-  if (empty($vars["page"])) {
-    header("Location: $script");
-    die();
-  }
-
-  // À°Îó½ç
-  $sort = $vars["sort"];
-  if (is_null($sort) || empty($sort)) {
-    $sort = "0d";
-  }
-
-  $retval['msg']  = $_referer_msg['msg_H0_Refer'];
-  $retval['body'] = referer_edit($vars["page"],$sort);
-  return $retval;
-}
-
-function referer_edit($page,$sort) {
-
-  $r_page = rawurlencode($page);
-  $file   = TRACKBACK_DIR.md5($r_page).".ref";
-  $data = tb_get($file);
-  if ($data === false) return "";
-
-  switch ($sort) {
-    case "0d":
-      usort($data, 'referer_sort_by_LastDate_d'); // 0d ºÇ½ª¹¹¿·Æü»þ(¿·Ãå½ç)
-      break;
-    case "0a":
-      usort($data, 'referer_sort_by_LastDate_a'); // 0a ºÇ½ª¹¹¿·Æü»þ(ÆüÉÕ½ç)
-      break;
-    case "1d":
-      usort($data, 'referer_sort_by_RegDate_d');  // 1d ½é²óÅÐÏ¿Æü»þ(¿·Ãå½ç)
-      break;
-    case "1a":
-      usort($data, 'referer_sort_by_RegDate_a');  // 1a ½é²óÅÐÏ¿Æü»þ(ÆüÉÕ½ç)
-      break;
-    case "2d":
-      usort($data, 'referer_sort_by_Counter_d');  // 2d ¥«¥¦¥ó¥¿(Â礭¤¤½ç)
-      break;
-    case "2a":
-      usort($data, 'referer_sort_by_Counter_a');  // 2a ¥«¥¦¥ó¥¿(¾®¤µ¤¤½ç)
-      break;
-    case "3":
-      usort($data, 'referer_sort_by_Referer');    // 3 Referer
-      break;
-    default:
-      $sort = "0d";
-      usort($data, 'referer_sort_by_LastDate_d'); // 0d ºÇ½ª¹¹¿·Æü»þ(¿·Ãå½ç)
-  }
-
-  $msg .= referer_body($data,$page,$sort);
-  return $msg;
+function plugin_referer_action()
+{
+       global $vars,$referer;
+       global $_referer_msg;
+       
+       // µö²Ä¤·¤Æ¤¤¤Ê¤¤¤«¡¢¥Ú¡¼¥¸¤Î»ØÄ꤬¤Ê¤¤
+       if (!$referer or empty($vars['page']))
+       {
+               return array('msg'=>'','body'=>'');
+       }
+       
+       // À°Îó½ç
+       $sort = (empty($vars['sort'])) ? '0d' : $vars['sort'];
+       
+       return array(
+               'msg'  => $_referer_msg['msg_H0_Refer'],
+               'body' => referer_body($vars['page'],$sort)
+       );
 }
 
 // Referer ÌÀºÙ¹ÔÊÔ½¸
-// 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
-function referer_body($data,$page,$sort) {
-  global $_referer_msg, $pconfig_color;
-
-  $rc     = "";
-  $bg = referer_set_color();
-
-  $hed0   = "<td style=\"";
-  $hed1   = "\" colspan=\"2\">";
-  $hed2   = "<a href=\"./?plugin=referer&amp;page=".$page."&amp;sort=";
-
-  $hed_last = $hed0.$bg["etc"].$hed1.$hed2."0d\">".$_referer_msg['msg_Chr_darr']."</a>".$_referer_msg['msg_Hed_LastUpdate'].$hed2."0a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-  $hed_1st  = $hed0.$bg["etc"].$hed1.$hed2."1d\">".$_referer_msg['msg_Chr_darr']."</a>".$_referer_msg['msg_Hed_1stDate'].$hed2."1a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-  $hed_ctr  = $hed0.$bg["etc"]."text-align:right;\">".$hed2."2d\">".$_referer_msg['msg_Chr_darr']."</a>".$_referer_msg['msg_Hed_RefCounter'].$hed2."2a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-  $hed_ref  = $hed0.$bg["etc"]."\">".$hed2."3\">".$_referer_msg['msg_Hed_Referer']."</a></td>\n";
-
-  switch ($sort) {
-    case "0d":
-      $hed_last = $hed0.$bg["cur"].$hed1.$_referer_msg['msg_Chr_darr'].$hed2."0d\">".$_referer_msg['msg_Hed_LastUpdate'].$hed2."0a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-      break;
-    case "0a":
-      $hed_last = $hed0.$bg["cur"].$hed1.$_referer_msg['msg_Chr_uarr'].$hed2."0a\">".$_referer_msg['msg_Hed_LastUpdate'].$hed2."0d\">".$_referer_msg['msg_Chr_darr']."</a></td>\n";
-      break;
-    case "1d":
-      $hed_1st  = $hed0.$bg["cur"].$hed1.$_referer_msg['msg_Chr_darr'].$hed2."1d\">".$_referer_msg['msg_Hed_1stDate'].$hed2."1a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-      break;
-    case "1a":
-      $hed_1st  = $hed0.$bg["cur"].$hed1.$_referer_msg['msg_Chr_uarr'].$hed2."1a\">".$_referer_msg['msg_Hed_1stDate'].$hed2."1d\">".$_referer_msg['msg_Chr_darr']."</a></td>\n";
-      break;
-    case "2d":
-      $hed_ctr  = $hed0.$bg["cur"]."text-align:right;\">".$_referer_msg['msg_Chr_darr'].$hed2."2d\">".$_referer_msg['msg_Hed_RefCounter'].$hed2."2a\">".$_referer_msg['msg_Chr_uarr']."</a></td>\n";
-      break;
-    case "2a":
-      $hed_ctr  = $hed0.$bg["cur"]."text-align:right;\">".$_referer_msg['msg_Chr_uarr'].$hed2."2a\">".$_referer_msg['msg_Hed_RefCounter'].$hed2."2d\">".$_referer_msg['msg_Chr_darr']."</a></td>\n";
-      break;
-    case "3":
-      $hed_ref  = $hed0.$bg["cur"]."\">".$hed2."3\">".$_referer_msg['msg_Hed_Referer']."</a></td>\n";
-      break;
-  }
-
-  $rc .= "<table border=\"1\" cellspacing=\"1\" summary=\"Referer\">\n<tr>\n".
-    $hed_last.$hed_1st.$hed_ctr.$hed_ref."</tr>\n";
-
-  foreach ($data as $x) {
-    // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
-    $progress0 = ereg_replace("[()]", "", get_passage($x[0])); // ºÇ½ª¹¹¿·Æü»þ¤«¤é¤Î·Ð²á»þ´Ö
-    $progress1 = ereg_replace("[()]", "", get_passage($x[1])); // ½é²óÅÐÏ¿Æü»þ¤«¤é¤Î·Ð²á»þ´Ö
-    $x[0] = date($_referer_msg['msg_Fmt_Date'], $x[0]+LOCALZONE); // ºÇ½ª¹¹¿·Æü»þʸ»úÎó
-    $x[1] = date($_referer_msg['msg_Fmt_Date'], $x[1]+LOCALZONE); // ½é²óÅÐÏ¿Æü»þʸ»úÎó
-    $url  = htmlspecialchars(rawurldecode(rawurldecode($x[3]))); // URL
-    $x[3] = htmlspecialchars(rawurldecode($x[3])); // URL
-    $rc .= "<tr>\n".
-       "<td>".$x[0]."</td>\n".
-       "<td>".$progress0."</td>\n";
-    if ($x[2] == 1) {
-      $rc .= "<td colspan=\"2\">N/A</td>\n";
-    } else {
-      $rc .= "<td>".$x[1]."</td>\n".
-       "<td>".$progress1."</td>\n";
-    }
-    $rc .= "<td style=\"text-align:right;\">".$x[2]."</td>\n";
-
-    if (referer_ignore_check($x[3])) {
-      // Å¬ÍÑÉԲĥǡ¼¥¿¤Î¤¿¤á¡¢¥¢¥ó¥«¡¼Ëõ»¦
-      $rc .= "<td>".$url."</td>\n";
-    } else {
-      $rc .= "<td><a href=\"$x[3]\">".$url."</a></td>\n";
-    }
-    $rc .= "</tr>\n";
-  }
-
-  $rc .= "</table>\n";
-  return $rc;
-}
-
-function referer_set_color() {
-  global $pconfig_color;
-
-  // config.php
-  if (!count($pconfig_color)) {
-    $config = new Config(CONFIG_REFERER);
-    $config->read();
-    $pconfig_color = $config->get('COLOR');
-    unset($config);
-  }
-
-  // ¥Ç¥Õ¥©¥ë¥È¥«¥é¡¼
-  $rc["cur"] = "background-color:#88ff88;";
-  $rc["etc"] = "background-color:#cccccc;";
-
-  foreach ($pconfig_color as $x) {
-    // BGCOLOR(#88ff88)
-    preg_match("'BGCOLOR\((.*)\)'si", $x[1], $regs);
-    if (!empty($regs[1])) $x[1] = $regs[1];
-    $rc[ $x[0] ] = "background-color:".$x[1].";";
-  }
-  return $rc;
+function referer_body($page,$sort)
+{
+       global $script,$_referer_msg;
+       
+       $data = tb_get(tb_get_filename($page,'.ref'));
+       if (count($data) == 0)
+       {
+               return '<p>no data.</p>';
+       }
+       $bg = referer_set_color();
+       
+       $arrow_last = $arrow_1st = $arrow_ctr = '';
+       $color_last = $color_1st = $color_ctr = $color_ref = $bg['etc'];
+       $sort_last = '0d';
+       $sort_1st = '1d';
+       $sort_ctr = '2d';
+       
+       switch ($sort)
+       {
+               case '0d': // 0d ºÇ½ª¹¹¿·Æü»þ(¿·Ãå½ç)
+                       usort($data,create_function('$a,$b','return $b[0] - $a[0];'));
+                       $color_last = $bg['cur'];
+                       $arrow_last = $_referer_msg['msg_Chr_darr'];
+                       $sort_last = '0a';
+                       break;
+               case '0a': // 0a ºÇ½ª¹¹¿·Æü»þ(ÆüÉÕ½ç)
+                       usort($data,create_function('$a,$b','return $a[0] - $b[0];'));
+                       $color_last = $bg['cur'];
+                       $arrow_last = $_referer_msg['msg_Chr_uarr'];
+//                     $sort_last = '0d';
+                       break;
+               case '1d': // 1d ½é²óÅÐÏ¿Æü»þ(¿·Ãå½ç)
+                       usort($data,create_function('$a,$b','return $b[2] - $a[2];'));
+                       $color_1st = $bg['cur'];
+                       $arrow_1st = $_referer_msg['msg_Chr_darr'];
+                       $sort_1st = '1a';
+                       break;
+               case '1a': // 1a ½é²óÅÐÏ¿Æü»þ(ÆüÉÕ½ç)
+                       usort($data,create_function('$a,$b','return $a[2] - $b[2];'));
+                       $color_1st = $bg['cur'];
+                       $arrow_1st = $_referer_msg['msg_Chr_uarr'];
+//                     $sort_1st = '1d';
+                       break;
+               case '2d': // 2d ¥«¥¦¥ó¥¿(Â礭¤¤½ç)
+                       usort($data,create_function('$a,$b','return $b[3] - $a[3];'));
+                       $color_ctr = $bg['cur'];
+                       $arrow_ctr = $_referer_msg['msg_Chr_darr'];
+                       $sort_ctr = '2a';
+                       break;
+               case '2a': // 2a ¥«¥¦¥ó¥¿(¾®¤µ¤¤½ç)
+                       usort($data,create_function('$a,$b','return $a[3] - $b[3];'));
+                       $color_ctr = $bg['cur'];
+                       $arrow_ctr = $_referer_msg['msg_Chr_uarr'];
+//                     $sort_ctr = '2d';
+                       break;
+               case '3': // 3 Referer
+                       usort($data,create_function('$a,$b','return ($a[1] == $b[1]) ? 0 : (($a[1] > $b[1]) ? 1 : -1);'));
+                       $color_ref = $bg['cur'];
+                       break;
+       }
+       
+       $body = '';
+       foreach ($data as $arr)
+       {
+               // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
+               list($ltime,$stime,$count,$url,$enable) = $arr;
+               $s_url = htmlspecialchars($url);
+               
+               $lpass = get_passage($ltime,FALSE); // ºÇ½ª¹¹¿·Æü»þ¤«¤é¤Î·Ð²á»þ´Ö
+               $spass = get_passage($stime,FALSE); // ½é²óÅÐÏ¿Æü»þ¤«¤é¤Î·Ð²á»þ´Ö
+               $ldate = get_date($_referer_msg['msg_Fmt_Date'],$ltime); // ºÇ½ª¹¹¿·Æü»þʸ»úÎó
+               $sdate = get_date($_referer_msg['msg_Fmt_Date'],$stime); // ½é²óÅÐÏ¿Æü»þʸ»úÎó
+               
+               $body .= " <tr>\n  <td>$ldate</td>\n  <td>$lpass</td>\n";
+               $body .= ($count == 1) ? "  <td colspan=\"2\">N/A</td>\n" : "  <td>$sdate</td>\n  <td>$spass</td>\n";
+               $body .= "  <td style=\"text-align:right;\">$count</td>\n";
+               
+               // Å¬ÍÑÉԲĥǡ¼¥¿¤Î¤È¤­¤Ï¥¢¥ó¥«¡¼¤ò¤Ä¤±¤Ê¤¤
+               $body .= referer_ignore_check($url) ?
+                       "  <td>$s_url</td>\n" : "  <td><a href=\"$s_url\">$s_url</a></td>\n";
+               $body .= " </tr>\n";
+       }
+       $href = $script.'?plugin=referer&amp;page='.rawurlencode($page);
+       return <<<EOD
+<table border="1" cellspacing="1" summary="Referer">
+ <tr>
+  <td style="background-color:$color_last" colspan="2">
+   <a href="$href&amp;sort=$sort_last">{$_referer_msg['msg_Hed_LastUpdate']}$arrow_last</a>
+  </td>
+  <td style="background-color:$color_1st" colspan="2">
+   <a href="$href&amp;sort=$sort_1st">{$_referer_msg['msg_Hed_1stDate']}$arrow_1st</a>
+  </td>
+  <td style="background-color:$color_ctr;text-align:right">
+   <a href="$href&amp;sort=$sort_ctr">{$_referer_msg['msg_Hed_RefCounter']}$arrow_ctr</a>
+  </td>
+  <td style="background-color:$color_ref">
+   <a href="$href&amp;sort=3">{$_referer_msg['msg_Hed_Referer']}</a>
+   </td>
+ </tr>
+ $body 
+</table>
+EOD;
 }
 
-function referer_ignore_check($url) {
-  global $pconfig_ignore_url;
-
-  // config.php
-  if (!count($pconfig_ignore_url)) {
-    $config = new Config(CONFIG_REFERER);
-    $config->read();
-    $pconfig_ignore_url = $config->get('IGNORE');
-    unset($config);
-  }
-
-  foreach ($pconfig_ignore_url as $x) {
-    if (strpos($url,$x) === 0) return 1;
-  }
-  return 0;
+function referer_set_color()
+{
+       static $color;
+       
+       if (!isset($color))
+       {
+               // ¥Ç¥Õ¥©¥ë¥È¥«¥é¡¼
+               $color = array(
+                       'cur' => '#88ff88',
+                       'etc' => '#cccccc'
+               );
+               
+               $config = new Config(CONFIG_REFERER);
+               $config->read();
+               $pconfig_color = $config->get('COLOR');
+               unset($config);
+               foreach ($pconfig_color as $x)
+               {
+                       // BGCOLOR(#88ff88)
+                       $color[$x[0]] = htmlspecialchars(
+                               preg_match('/BGCOLOR\(([^)]+)\)/si',$x[1],$matches) ? $matches[1] : $x[1]
+                       );
+               }                       
+       }
+       return $color;
 }
 
-// ¥Ç¡¼¥¿¤òÀ°Îó
-// 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer
-function referer_sort_by_LastDate_d($p1, $p2) { return ($p2['0'] - $p1['0']); }
-function referer_sort_by_LastDate_a($p1, $p2) { return ($p1['0'] - $p2['0']); }
-function referer_sort_by_RegDate_d($p1, $p2)  { return ($p2['1'] - $p1['1']); }
-function referer_sort_by_RegDate_a($p1, $p2)  { return ($p1['1'] - $p2['1']); }
-function referer_sort_by_Counter_d($p1, $p2)  { return ($p2['2'] - $p1['2']); }
-function referer_sort_by_Counter_a($p1, $p2)  { return ($p1['2'] - $p2['2']); }
-function referer_sort_by_Referer($p1, $p2) {
-  if ($p1['3'] == $p2['3']) return 0;
-  return ($p1['3'] > $p2['3']) ? 1 : -1;
+function referer_ignore_check($url)
+{
+       static $ignore_url;
+       
+       // config.php
+       if (!isset($ignore_url))
+       {
+               $config = new Config(CONFIG_REFERER);
+               $config->read();
+               $ignore_url = $config->get('IGNORE');
+               unset($config);
+       }
+       
+       foreach ($ignore_url as $x)
+       {
+               if (strpos($url,$x) === 0)
+               {
+                       return 1;
+               }
+       }
+       return 0;
 }
-
-?>
\ No newline at end of file
+?>
diff --git a/proxy.php b/proxy.php
new file mode 100644 (file)
index 0000000..42a6f87
--- /dev/null
+++ b/proxy.php
@@ -0,0 +1,136 @@
+<?php
+/////////////////////////////////////////////////
+// PukiWiki - Yet another WikiWikiWeb clone.
+//
+// $Id: proxy.php,v 1.1 2003/07/27 13:54:58 arino Exp $
+//
+
+/*
+ * http_request($url)
+ *   HTTP¥ê¥¯¥¨¥¹¥È¤òȯ¹Ô¤·¡¢¥Ç¡¼¥¿¤ò¼èÆÀ¤¹¤ë
+ * $url     : http://¤«¤é»Ï¤Þ¤ëURL(http://user:pass@host:port/path?query)
+ * $method  : GET, POST, HEAD¤Î¤¤¤º¤ì¤«(¥Ç¥Õ¥©¥ë¥È¤ÏGET)
+ * $headers : Ç¤°Õ¤ÎÄɲåإåÀ
+ * $post    : POST¤Î»þ¤ËÁ÷¿®¤¹¤ë¥Ç¡¼¥¿¤ò³ÊǼ¤·¤¿ÇÛÎó('ÊÑ¿ô̾'=>'ÃÍ')
+*/
+
+function http_request($url,$method='GET',$headers='',$post=array())
+{
+       global $use_proxy,$proxy_host,$proxy_port;
+       
+       $rc = array();
+       $arr = parse_url($url);
+       
+       $via_proxy = $use_proxy and via_proxy($arr['host']);
+       
+       // query
+       $arr['query'] = isset($arr['query']) ? '?'.$arr['query'] : '';
+       // port
+       $arr['port'] = isset($arr['port']) ? $arr['port'] : 80;
+       
+       $url = $via_proxy ? $arr['scheme'].'://'.$arr['host'].':'.$arr['port'] : '';
+       $url .= $arr['path'].$arr['query'];
+       
+       $query = $method.' '.$url." HTTP/1.0\r\n";
+       $query .= "Host: ".$arr['host']."\r\n";
+       $query .= "User-Agent: PukiWiki/".S_VERSION."\r\n";
+
+       // Basic Ç§¾ÚÍÑ
+       if (isset($arr['user']) and isset($arr['pass']))
+       {
+               $query .= 'Authorization: Basic '.
+                       base64_encode($arr['user'].':'.$arr['pass'])."\r\n";
+       }
+       
+       $query .= $headers;
+       
+       // POST »þ¤Ï¡¢urlencode ¤·¤¿¥Ç¡¼¥¿¤È¤¹¤ë
+       if (strtoupper($method) == 'POST')
+       {
+               $POST = array();
+               foreach ($post as $name=>$val)
+               {
+                       $POST[] = $name.'='.urlencode($val);
+               }
+               $data = join('&',$POST);
+               $query .= "Content-Type: application/x-www-form-urlencoded\r\n";
+               $query .= 'Content-Length: '.strlen($data)."\r\n";
+               $query .= "\r\n";
+               $query .= $data;
+       }
+       else
+       {
+               $query .= "\r\n";
+       }
+       
+       $fp = fsockopen(
+               $via_proxy ? $proxy_host : $arr['host'],
+               $via_proxy ? $proxy_port : $arr['port'],
+               $errno,$errstr,30);
+       if (!$fp)
+       {
+               return array(
+                       'query'  => $query, // Query String
+                       'rc'     => $errno, // ¥¨¥é¡¼ÈÖ¹æ
+                       'header' => '',     // Header
+                       'data'   => $errstr // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
+               );
+       }
+       
+       fputs($fp, $query);
+       
+       $response = '';
+       while (!feof($fp))
+       {
+               $response .= fgets($fp,4096);
+       }
+       fclose($fp);
+       
+       $resp = explode("\r\n\r\n",$response,2);
+       $rccd = explode(' ',$resp[0],3); // array('HTTP/1.1','200','OK\r\n...')
+       return array(
+               'query'  => $query,             // Query String
+               'rc'     => (integer)$rccd[1], // Response Code
+               'header' => $resp[0],           // Header
+               'data'   => $resp[1]            // Data
+       );
+}
+// ¥×¥í¥­¥·¤ò·Ðͳ¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«È½Äê
+function via_proxy($host)
+{
+       global $use_proxy,$no_proxy;
+       static $ip_pattern = '/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:\/(.+))?$/';
+       
+       if (!$use_proxy)
+       {
+               return FALSE;
+       }
+       $ip = gethostbyname($host);
+       $l_ip = ip2long($ip);
+       $valid = (is_long($l_ip) and long2ip($l_ip) == $ip); // valid ip address
+       
+       foreach ($no_proxy as $network)
+       {
+               if ($valid and preg_match($ip_pattern,$network,$matches))
+               {
+                       $l_net = ip2long($matches[1]);
+                       $mask = array_key_exists(2,$matches) ? $matches[2] : 32;
+                       $mask = is_numeric($mask) ?
+                               pow(2,32) - pow(2,32 - $mask) : // "10.0.0.0/8"
+                               ip2long($mask);                 // "10.0.0.0/255.0.0.0"
+                       if (($l_ip & $mask) == $l_net)
+                       {
+                               return FALSE;
+                       }
+               }
+               else
+               {
+                       if (preg_match('/'.preg_quote($network,'/').'/',$host))
+                       {
+                               return FALSE;
+                       }
+               }
+       }
+       return TRUE;
+}
+?>
index 47d4f49..8c2c000 100644 (file)
@@ -2,7 +2,7 @@
 /////////////////////////////////////////////////
 // PukiWiki - Yet another WikiWikiWeb clone.
 //
-// $Id: pukiwiki.ini.php,v 1.42 2003/07/14 04:27:07 arino Exp $
+// $Id: pukiwiki.ini.php,v 1.43 2003/07/27 13:54:58 arino Exp $
 //
 // PukiWiki setting file
 
@@ -174,6 +174,21 @@ $splitter = ">>>>>>>>>>";
 $update_exec = '';
 //$update_exec = '/usr/bin/mknmz --media-type=text/pukiwiki -O /var/lib/namazu/index/ -L ja -c -K /var/www/wiki/';
 
+/////////////////////////////////////////////////
+// HTTP¥ê¥¯¥¨¥¹¥È¤Ë¥×¥í¥­¥·¥µ¡¼¥Ð¤ò»ÈÍѤ¹¤ë
+$use_proxy = 0;
+// proxy ¥Û¥¹¥È
+$proxy_host = 'proxy.xxx.yyy.zzz';
+// proxy ¥Ý¡¼¥ÈÈÖ¹æ
+$proxy_port = 8080;
+// ¥×¥í¥­¥·¥µ¡¼¥Ð¤ò»ÈÍѤ·¤Ê¤¤¥Û¥¹¥È¤Î¥ê¥¹¥È
+$no_proxy = array(
+'127.0.0.1',
+'localhost',
+//'192.168.1.0/24',
+//'no-proxy.com',
+);
+
 ////////////////////////////////////////////////
 // ¥Ú¡¼¥¸¤Î¹¹¿·»þ¤Ë¥á¡¼¥ë¤òÁ÷¿®¤¹¤ë
 $notify = 0;
index cfbae55..0208240 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// $Id: trackback.php,v 1.6 2003/07/14 08:09:17 arino Exp $
+// $Id: trackback.php,v 1.7 2003/07/27 13:54:58 arino Exp $
 /*
  * PukiWiki TrackBack ¥×¥í¥°¥é¥à
  * (C) 2003, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
  * http://localhost/pukiwiki/pukiwiki.php?FrontPage ¤ÈÌÀ³Î¤Ë»ØÄꤷ¤Ê¤¤¤È
  * TrackBack ID ¤Î¼èÆÀ¤Ï¤Ç¤­¤Ê¤¤
  *
- * tb_count($page, $ext)       TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ // pukiwiki.skin.LANG.php
- * tb_send($page,$data)                TrackBack Ping Á÷¿® // file.php
- * tb_ScanLink($data)          convert_html() ÊÑ´¹·ë²Ì¤Î <a> ¥¿¥°¤«¤é URL Ãê½Ð
- * tb_PageInfo($page)          ¥Ú¡¼¥¸¾ðÊó¼èÆÀ
- * tb_xml_msg($rc,$msg)                XML ·ë²Ì½ÐÎÏ
- * tb_save()                   TrackBack Ping ¥Ç¡¼¥¿Êݸ(¹¹¿·)
- * tb_delete($page)            TrackBack Ping ¥Ç¡¼¥¿ºï½ü // edit.inc.php
- * tb_get($file)               TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
- * tb_put($file,$data)         TrackBack Ping ¥Ç¡¼¥¿½ÐÎÏ
- * tb_mode_rss($file)          ?__mode=rss ½èÍý
- * tb_mode_view($id)           ?__mode=view ½èÍý
- * tb_body($file)              TrackBack Ping ÌÀºÙ¹ÔÊÔ½¸
- * tb_sort_by_date_d($p1, $p2) ¥Ç¡¼¥¿¤òÆüÉÕ½ç¡Ê¹ß½ç¡Ë¤ÇÀ°Îó
- * tb_id2page($id)             TrackBack ID ¤«¤é¥Ú¡¼¥¸Ì¾¼èÆÀ
- * tb_http($url, $method="GET", $headers="", $post=array(""))
- *                             GET, POST, HEAD ¤Ê¤É¤Î»ØÄê½èÍý¤ª¤è¤Ó ¥ì¥¹¥Ý¥ó¥¹¥³¡¼¥É¼èÆÀ
- * tb_PutID($page)             Ê¸¾ÏÃæ¤Ë trackback:ping ¤òËä¤á¹þ¤à¤¿¤á¤Î¥Ç¡¼¥¿¤òÀ¸À® // pukiwiki.php
- * tb_GetID($url)              Ê¸½ñ¤ò GET ¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿ TrackBack ID ¤ò¼èÆÀ
- * tb_xml_GetId($data)         Ëä¤á¹þ¤Þ¤ì¤¿¥Ç¡¼¥¿¤«¤é TrackBack ID ¤ò¼èÆÀ
- * tb_startElementHandler_GetId($parser, $name, $attribs)
- *                             xml_set_element_handler´Ø¿ô¤Ç¥»¥Ã¥È¤·¤¿ startElementHandler
- * tb_xg_dummy($parser, $name) xml_set_element_handler´Ø¿ô¤Ç¥»¥Ã¥È¤·¤¿ EndElementHandler
+ * tb_get_id($page)       TrackBack Ping ID¤ò¼èÆÀ
+ * tb_id2page($tb_id)     TrackBack Ping ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
+ * tb_get_filename($page) TrackBack Ping ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ
+ * tb_count($page)        TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ  // pukiwiki.skin.LANG.php
+ * tb_send($page,$data)   TrackBack Ping Á÷¿®  // file.php
+ * tb_delete($page)       TrackBack Ping ¥Ç¡¼¥¿ºï½ü  // edit.inc.php
+ * tb_get($file,$key=1)   TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
+ * tb_get_rdf($page)      Ê¸¾ÏÃæ¤ËËä¤á¹þ¤à¤¿¤á¤Îrdf¤ò¥Ç¡¼¥¿¤òÀ¸À® // pukiwiki.php
+ * tb_get_url($url)       Ê¸½ñ¤òGET¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿TrackBack Ping URL¤ò¼èÆÀ
+ * class TrackBack_XML    XML¤«¤éTrackBack Ping ID¤ò¼èÆÀ¤¹¤ë¥¯¥é¥¹
  * == Referer Âбþʬ ==
- * ref_save($page)             Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·)
- * ref_put($url,$file,$data)   Referer ¥Ç¡¼¥¿½ÐÎÏ
- * get_referer($local=FALSE)   Referer ÊÑ¿ô¤òÌ᤹
- *
+ * ref_save($page)        Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·) // pukiwiki.php
  */
 
-if (!defined('TRACKBACK_DIR')) {
-  define('TRACKBACK_DIR','./trackback/');
-}
-
-// TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ
-// ³ÈÄ¥»Ò .ref ¤Î¾ì¹ç¤Ï¡¢Referer ¸Ä¿ô
-function tb_count($page, $ext=".txt") {
-
-  $page_enc = md5($page);
-  $file = TRACKBACK_DIR.$page_enc.$ext;
-
-  // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤­¹þ¤ß²Äǽ¤«¤Î³Îǧ
-  if (file_exists($file) === false) {
-    return 0;
-  }
-  return count( file($file) );
+if (!defined('TRACKBACK_DIR'))
+{
+       define('TRACKBACK_DIR','./trackback/');
 }
 
-// TrackBack Ping Á÷¿®
-function tb_send($page,$data) {
-  global $script, $trackback;
-
-  if (!$trackback) return;
-  set_time_limit( 0 ); // ½èÍý¼Â¹Ô»þ´ÖÀ©¸Â(php.ini ¥ª¥×¥·¥ç¥ó max_execution_time )
-
-  $link = tb_ScanLink($data);
-  if (!is_array($link)) return; // ¥ê¥ó¥¯Ìµ¤·¤Ï½ªÎ»
-  $r_page = rawurlencode($page);
-
-  // ¼«Ê¸½ñ¤Î¾ðÊó
-  $putdata = array();
-  $putdata["title"] = $page; // ¥¿¥¤¥È¥ë¤Ï¥Ú¡¼¥¸Ì¾
-  $putdata["url"] = $script."?".$r_page; // Á÷¿®»þ¤ËºÆÅÙ¡¢rawurlencode ¤µ¤ì¤ë
-  $putdata["excerpt"] = tb_PageInfo($page);
-  $putdata["blog_name"] = "PukiWiki/TrackBack 0.1";
-  $putdata["charset"] = SOURCE_ENCODING; // Á÷¿®Â¦Ê¸»ú¥³¡¼¥É(̤´ûÄê)
-
-  foreach ($link as $x) {
-  // URL ¤«¤é TrackBack ID ¤ò¼èÆÀ¤¹¤ë
-    $tbid = tb_GetID($x);
-    if (empty($tbid)) continue; // TrackBack ¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤
-    list($resp,$header,$data,$query) = tb_http($tbid,"POST","",$putdata);
-    // FIXME: ¥¨¥é¡¼½èÍý¤ò¹Ô¤Ã¤Æ¤â¡¢¤¸¤ã¡¢¤É¤¦¤¹¤ë¡©¤À¤·¤Ê¤¡...
-  }
-
+// TrackBack Ping ID¤ò¼èÆÀ
+function tb_get_id($page)
+{
+       return md5($page);
 }
 
-// convert_html() ÊÑ´¹·ë²Ì¤Î <a> ¥¿¥°¤«¤é URL Ãê½Ð
-function tb_ScanLink($data) {
-  $link = array();
-  $string = convert_html($data);
-
-  // ¥ë¡¼¥×
-  while (preg_match("'(href=)(\"|\')(http:?[^\"^\'^\>]+)'si", $string, $regs)) {
-    $link[] = $regs[3];
-    $string = str_replace($regs[3], "", $string);
-  }
-  return $link;
+// TrackBack Ping ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
+function tb_id2page($tb_id)
+{
+       static $pages,$cache = array();
+       
+       if (array_key_exists($tb_id,$cache))
+       {
+               return $cache[$tb_id];
+       }
+       if (!isset($pages))
+       {
+               $pages = get_existpages();
+       }
+       foreach ($pages as $page)
+       {
+               $_tb_id = tb_get_id($page);
+               $cache[$_tb_id] = $page;
+               unset($pages[$page]);
+               if ($_tb_id == $tb_id)
+               {
+                       return $page;
+               }
+       }
+       return FALSE; // ¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç
 }
 
-// ¥Ú¡¼¥¸¾ðÊó¼èÆÀ
-function tb_PageInfo($page) {
-  // ÍøÍÑ¥Ú¡¼¥¸¤Î°ú¿ô¤Ê¤·
-  if (empty($page)) return "";
-
-  // ³µÍפÎÀ¸À®
-  $excerpt = '';
-  $ctr_len = 0;
-  $body = get_source($page);
-  foreach ($body as $x) {
-    if ($x[0] == '/' && $x[1] == '/') continue; // PukiWiki ¤È¤·¤Æ¤Ï¡¢¥³¥á¥ó¥È¹Ô
-    $excerpt .= trim($x);
-    $ctr_len += strlen(trim($x));
-    if ($ctr_len > 255) break; // 255 ¤òĶ²á¤·¤¿»þÅÀ¤Ç½ªÎ»
-  }
-  return $excerpt;
+// TrackBack Ping ¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë̾¤ò¼èÆÀ
+function tb_get_filename($page,$ext='.txt')
+{
+       return TRACKBACK_DIR.tb_get_id($page).$ext;
 }
 
-// XML ·ë²Ì½ÐÎÏ
-function tb_xml_msg($rc,$msg) {
-  $x = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n".
-    "<response>\n".
-    "<error>".$rc."</error>\n";
-  if (!empty($msg)) $x .= "<message>".$msg."</message>\n";
-  $x .= "</response>\n";
-  header('Content-Type: text/xml');
-  print $x;
-  die();
+// TrackBack Ping ¥Ç¡¼¥¿¸Ä¿ô¼èÆÀ
+function tb_count($page,$ext='.txt')
+{
+       $filename = tb_get_filename($page,$ext);
+       return file_exists($filename) ? count(file($filename)) : 0;
 }
 
-// TrackBack Ping ¥Ç¡¼¥¿Êݸ(¹¹¿·)
-function tb_save() {
-  global $script,$vars,$post;
-
-  // TrackBack Ping ¤Ë¤ª¤±¤ë URL ¥Ñ¥é¥á¡¼¥¿¤Ïɬ¿Ü¤Ç¤¢¤ë¡£
-  if (empty($post["url"])) {
-    tb_xml_msg(1,"It is an indispensable parameter. URL is not set up.");
-  }
-
-  // URL ÂÅÅöÀ­¥Á¥§¥Ã¥¯ (¤³¤ì¤òÆþ¤ì¤ë¤È½èÍý»þ´Ö¤ËÌäÂ꤬¤Ç¤ë)
-  list($res,$hed,$dat,$query) = tb_http($post["url"],"HEAD");
-  if ($res !== 200) {
-    tb_xml_msg(1,"URL is fictitious.");
-  }
-
-  // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤­¹þ¤ß²Äǽ¤«¤Î³Îǧ
-  if (file_exists(TRACKBACK_DIR) === false) {
-    die(TRACKBACK_DIR.": No such directory");
-  }
-  if (is_writable(TRACKBACK_DIR) === false) {
-    die(TRACKBACK_DIR.": Permission denied");
-  }
-
-  // Query String ¤òÆÀ¤ë
-  if (empty($vars["tb_id"])) {
-    tb_xml_msg(1,"TrackBack Ping URL is inaccurate.");
-  }
-
-  // ¥Ú¡¼¥¸Â¸ºß¥Á¥§¥Ã¥¯
-  $page = tb_id2page($vars["tb_id"]);
-  if ($page == $vars["tb_id"]) {
-    tb_xml_msg(1,"TrackBack ID is invalid.");
-  }
-
-  // TrackBack Ping ¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤à
-  $rc = tb_put(TRACKBACK_DIR.$vars["tb_id"].".txt",tb_get(TRACKBACK_DIR.$vars["tb_id"].".txt"));
-
-  tb_xml_msg($rc,"");
+// TrackBack Ping Á÷¿®
+function tb_send($page,$data)
+{
+       global $script,$trackback;
+       
+       if (!$trackback)
+       {
+               return;
+       }
+       
+       set_time_limit(0); // ½èÍý¼Â¹Ô»þ´ÖÀ©¸Â(php.ini ¥ª¥×¥·¥ç¥ó max_execution_time )
+       
+       $data = convert_html($data);
+       
+       // convert_html() ÊÑ´¹·ë²Ì¤Î <a> ¥¿¥°¤«¤é URL Ãê½Ð
+       preg_match_all('#href="(https?://[^"]+)"#',$data,$links,PREG_PATTERN_ORDER);
+       
+       // ¼«¥Û¥¹¥È($script¤Ç»Ï¤Þ¤ëurl)¤ò½ü¤¯
+       $links = preg_grep("/^(?!".preg_quote($script,'/')."\?)./",$links[1]);
+               
+       // ¥ê¥ó¥¯Ìµ¤·¤Ï½ªÎ»
+       if (!is_array($links) or count($links) == 0)
+       {
+               return;
+       }
+       
+       $r_page = rawurlencode($page);
+       
+       // ¼«Ê¸½ñ¤Î¾ðÊó
+       $putdata = array(
+               'title'     => $page, // ¥¿¥¤¥È¥ë¤Ï¥Ú¡¼¥¸Ì¾
+               'url'       => "$script?$r_page", // Á÷¿®»þ¤ËºÆÅÙ¡¢rawurlencode ¤µ¤ì¤ë
+               'excerpt'   => mb_strimwidth(preg_replace("/[\r\n]/",' ',strip_htmltag($data)),0,255,'...'),
+               'blog_name' => 'PukiWiki/TrackBack 0.1',
+               'charset'   => SOURCE_ENCODING // Á÷¿®Â¦Ê¸»ú¥³¡¼¥É(̤´ûÄê)
+       );
+       foreach ($links as $link)
+       {
+               // URL ¤«¤é TrackBack ID ¤ò¼èÆÀ¤¹¤ë
+               $tb_id = tb_GetID($link);
+               if (empty($tb_id)) // TrackBack ¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤
+               {
+                       continue;
+               }
+               $result = http_request($link,'POST','',$putdata);
+               // FIXME: ¥¨¥é¡¼½èÍý¤ò¹Ô¤Ã¤Æ¤â¡¢¤¸¤ã¡¢¤É¤¦¤¹¤ë¡©¤À¤·¤Ê¤¡...
+       }
 }
 
 // TrackBack Ping ¥Ç¡¼¥¿ºï½ü
-function tb_delete($page) { @unlink(TRACKBACK_DIR.md5($page).".txt"); }
-
-// TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
-function tb_get($file) {
-  if (!file_exists($file)) {
-    return false;
-  }
-
-  $rc    = array();
-  $ctr   = 0;
-
-  $fp = @fopen ($file,"r");
-  while ($data = @fgetcsv($fp, 8192, ",")) {
-    $rc[$ctr++] = $data;
-  }
-  @fclose ($fp);
-  return $rc;
-}
-
-// TrackBack Ping ¥Ç¡¼¥¿½ÐÎÏ
-function tb_put($file,$data) {
-  global $script,$vars,$post;
-
-  // Ê¸»ú¥³¡¼¥ÉÊÑ´¹
-  if (empty($post["charset"])) $post["charset"] = "auto";
-  $post["title"]     = mb_convert_encoding($post["title"],SOURCE_ENCODING,$post["charset"]);
-  $post["excerpt"]   = mb_convert_encoding($post["excerpt"],SOURCE_ENCODING,$post["charset"]);
-  $post["blog_name"] = mb_convert_encoding($post["blog_name"],SOURCE_ENCODING,$post["charset"]);
-
-  if (!($fp = fopen($file,"w"))) return 1;
-  @flock($fp, LOCK_EX);
-
-  // ¥«¥ó¥Þ¤¬Æþ¤Ã¤Æ¤âÎɤ¤¤è¤¦¤Ë¡£(¤Ê¤ó¤«°ã¤¦¤È»×¤¦¤Ê¤¡)
-  $post["url"]       = rawurlencode($post["url"]);
-  $post["title"]     = rawurlencode($post["title"]);
-  $post["excerpt"]   = rawurlencode($post["excerpt"]);
-  $post["blog_name"] = rawurlencode($post["blog_name"]);
-
-  $sw_put = 0; // ¹¹¿·ÍÑ
-  if ($data !== false) {
-    foreach ($data as $x) {
-      if ($x[1] == $post["url"]) {
-        $sw_put = 1;
-        $x[0] = UTIME;
-        $x[2] = $post["title"];
-        $x[3] = $post["excerpt"];
-        $x[4] = $post["blog_name"];
-      }
-      // UTIME, url, title, excerpt, blog_name
-      fwrite($fp, $x[0].",".$x[1].",".$x[2].",".$x[3].",".$x[4]."\n");
-    }
-  }
-
-  // ¹¹¿·¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢£±·ïÄɲ乤ë
-  if (!$sw_put) {
-    fwrite($fp, UTIME.",".$post["url"].",".$post["title"].",".$post["excerpt"].",".$post["blog_name"]."\n");
-  }
-
-  @flock($fp, LOCK_UN);
-  @fclose($fp);
-
-  return 0;
-}
-
-// ?__mode=rss ½èÍý
-function tb_mode_rss($file) {
-
-  $data = tb_get($file);
-  // É½¼¨¥Ç¡¼¥¿¤Ê¤·
-  if ($data === false) {
-    tb_xml_msg(1,"TrackBack Ping data does not exist.");
-  }
-
-  $rc = <<<EOD
-<?xml version="1.0" encoding="utf-8" ?>
-<response>
-<error>0</error>
-<rss version="0.91">
-<channel>
-
-EOD;
-
-  $sw_item = 0;
-  foreach ($data as $x) {
-    if ($sw_item) $rc .= "<item>\n";
-    $x[1] = rawurldecode($x[1]);
-    $x[2] = rawurldecode($x[2]);
-    $x[3] = rawurldecode($x[3]);
-    // UTIME, url, title, excerpt, blog_name
-    $rc .= <<<EOD
-<title>$x[2]</title>
-<link>$x[1]</link>
-<description>$x[3]</description>
-
-EOD;
-    if ($sw_item) {
-      $rc .= "</item>\n";
-    } else {
-      $rc .= "<language>ja-Jp</language>\n";
-      $sw_item = 1;
-    }
-  }
-
-  $rc .= <<<EOD
-</channel>
-</rss>
-</response>
-
-EOD;
-
-  $rc = mb_convert_encoding($rc,"utf-8",SOURCE_ENCODING);
-  header('Content-Type: text/xml');
-  echo $rc;
-}
-
-// ?__mode=view ½èÍý
-function tb_mode_view($tbid) {
-  global $script, $page_title;
-  global $_tb_title, $_tb_header, $_tb_entry, $_tb_refer;
-
-  // TrackBack ID ¤«¤é¥Ú¡¼¥¸Ì¾¤ò¼èÆÀ
-  $page   = tb_id2page($tbid);
-  $r_page = rawurlencode($page);
-  $file   = TRACKBACK_DIR.$tbid.".txt";
-
-  $tb_title = sprintf($_tb_title,$page);
-  $tb_refer = sprintf($_tb_refer,"<a href=\"$script?$r_page\">'$page'</a>","<a href=\"$script\">$page_title</a>");
-
-  $msg = <<<EOD
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
-<head>
- <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
-<title>$tb_title</title>
-<link rel="stylesheet" href="skin/trackback.css" type="text/css" />
-</head>
-<body>
-<div id="banner-commentspop">$_tb_header</div>
-<div class="blog">
-
-<div class="trackback-url">
-$_tb_entry<br />
-$script?plugin=tb&tb_id=$tbid <br /><br />
-$tb_refer
-</div>
-EOD;
-
-  $msg .= tb_body($file);
-  $msg .= <<<EOD
-</div>
-</body>
-</html>
-EOD;
-
-  $msg = mb_convert_encoding($msg,"UTF-8",SOURCE_ENCODING);
-  echo $msg;
-  die();
-}
-
-// TrackBack Ping ÌÀºÙ¹ÔÊÔ½¸
-function tb_body($file) {
-  global $_tb_header_Excerpt, $_tb_header_Weblog, $_tb_header_Tracked, $_tb_date;
-
-  $data = tb_get($file);
-  if ($data === false) return;
-
-  // ºÇ¿·ÈǤ«¤éÀ°Îó
-  usort($data, 'tb_sort_by_date_d');
-
-  $rc = "";
-  foreach ($data as $x) {
-    // UTIME, url, title, excerpt, blog_name
-    $x[0] = date($_tb_date, $x[0]+LOCALZONE); // May  2, 2003 11:25 AM
-    $x[1] = rawurldecode($x[1]); // URL
-    $x[2] = rawurldecode($x[2]); // title
-    $x[3] = rawurldecode($x[3]); // excerpt
-    $x[4] = rawurldecode($x[4]); // blog_name
-    $rc .= <<<EOD
-<div class="trackback-body">
-<span class="trackback-post"><a href="$x[1]" target="new">$x[2]</a><br />
-<strong>$_tb_header_Excerpt</strong> $x[3]<br />
-<strong>$_tb_header_Weblog</strong> $x[4]<br />
-<strong>$_tb_header_Tracked</strong> $x[0]</span>
-</div>
-EOD;
-  }
-
-  return $rc;
-}
-
-// ¥Ç¡¼¥¿¤òÆüÉÕ½ç¡Ê¹ß½ç¡Ë¤ÇÀ°Îó
-function tb_sort_by_date_d($p1, $p2) {
-  return ($p2['0'] - $p1['0']);
-}
-
-// TrackBack ID ¤«¤é¥Ú¡¼¥¸Ì¾¼èÆÀ
-function tb_id2page($id) {
-  global $tb_pages;
-
-  if (!is_array($tb_pages)) {
-    $tb_pages = get_existpages();
-    natcasesort($tb_pages);
-  }
-
-  foreach ($tb_pages as $x) {
-    if ($id == md5(rawurlencode($x))) return rawurldecode($x);
-  }
-  return $id; // ¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç
-
+function tb_delete($page)
+{
+       $filename = tb_get_filename($page);
+       if (file_exists($filename))
+       {
+               @unlink($filename);
+       }
 }
 
-/*
- * $url     : http://¤«¤é»Ï¤Þ¤ëURL( http://user:pass@host:port/path?query )
- * $method  : GET, POST, HEAD¤Î¤¤¤º¤ì¤«(¥Ç¥Õ¥©¥ë¥È¤ÏGET)
- * $headers : Ç¤°Õ¤ÎÄɲåإåÀ
- * $post    : POST¤Î»þ¤ËÁ÷¿®¤¹¤ë¥Ç¡¼¥¿¤ò³ÊǼ¤·¤¿ÇÛÎó("ÊÑ¿ô̾"=>"ÃÍ")
- */
-function tb_http($url, $method="GET", $headers="", $post=array(""))
+// TrackBack Ping ¥Ç¡¼¥¿ÆþÎÏ
+function tb_get($file,$key=1)
 {
-  $rc = array();
-  $url_arry = parse_url($url);
-
-  // query
-  if (isset($url_arry['query'])) {
-    $url_arry['query'] = "?".$url_arry['query'];
-  } else {
-    $url_arry['query'] = "";
-  }
-  // fragment
-  if (isset($url_arry['fragment'])) {
-    $url_arry['fragment'] = "#".$url_arry['fragment'];
-  } else {
-    $url_arry['fragment'] = "";
-  }
-
-  if (!isset($url_arry['port'])) $url_arry['port'] = 80;
-
-  $query = $method." ".
-    $url_arry['path'].$url_arry['query'].$url_arry['fragment'].
-    " HTTP/1.0\r\n";
-  $query .= "Host: ".$url_arry['host']."\r\n";
-  $query .= "User-Agent: PukiWiki/TrackBack 0.1\r\n";
-
-  // Basic Ç§¾ÚÍÑ
-  if (isset($url_arry['user']) && isset($url_arry['pass'])) {
-    $query .= "Authorization: Basic ".
-      base64_encode($url_arry['user'].":".$url_arry['pass'])."\r\n";
-  }
-
-  $query .= $headers;
-
-  // POST »þ¤Ï¡¢urlencode ¤·¤¿¥Ç¡¼¥¿¤È¤¹¤ë
-  if (strtoupper($method) == "POST") {
-    while (list($name, $val) = each($post)) {
-      $POST[] = $name."=".urlencode($val);
-    }
-    $data = implode("&", $POST);
-    $query .= "Content-Type: application/x-www-form-urlencoded\r\n";
-    $query .= "Content-Length: ".strlen($data)."\r\n";
-    $query .= "\r\n";
-    $query .= $data;
-  } else {
-    $query .= "\r\n";
-  }
-
-  $fp = fsockopen($url_arry['host'], $url_arry['port'], $errno, $errstr, 30);
-  if (!$fp) {
-    if ($errno == 0) {
-      $rc[0] = 406; // Not Acceptable
-      $rc[1] = ""; // Header
-      $rc[2] = ""; // Data
-      $rc[3] = $query; // Query String
-      return $rc;
-    }
-    // Proxy ·Ðͳ¤Î¾ì¹ç¤Ï¡¢¼ºÇÔ¤·¡¢errno ¤Ï 0 ¤È¤Ê¤ë¡£
-    // Warning: fsockopen() [http://www.php.net/function.fsockopen]:
-    // php_network_getaddresses: gethostbyname failed in C:\var\www\html\pukiwiki\trackback.php on line 457
-    // Warning: fsockopen() [http://www.php.net/function.fsockopen]:
-    // unable to connect to xxxx.xx.xx:80 in C:\var\www\html\pukiwiki\trackback.php on line 457
-    // ¤³¤ÎÁàºî¤òÀµ¤·¤¯½ªÎ»¤·¤Þ¤·¤¿¡£
-    // (0)
-    $rc[0] = $errno; // ¥¨¥é¡¼ÈÖ¹æ
-    $rc[1] = ""; // Header
-    $rc[2] = $errstr; // ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸
-    $rc[3] = $query; // Query String
-    return $rc;
-    // die("trackback.php: $errstr ($errno)\n");
-  }
-
-  fputs($fp, $query);
-
-  $response = "";
-  while (!feof($fp)) {
-    $response .= fgets($fp, 4096);
-  }
-
-  fclose($fp);
-  $resp  = split("\r\n\r\n", $response, 2);
-  $rccd  = strtok($resp[0]," ");
-  $rc[0] = strtok(" "); // Response Code
-  $rc[0] = $rc[0] * 1; // ¿ô»ú·¿¤ËÊÑ´¹
-  $rc[1] = $resp[0]; // Header
-  $rc[2] = $resp[1]; // Data
-  $rc[3] = $query; // Query String
-  return $rc;
+       if (!file_exists($file))
+       {
+               return array();
+       }
+       
+       $result = array();
+       $fp = @fopen($file,'r');
+       flock($fp,LOCK_EX);
+       while ($data = @fgetcsv($fp,8192,','))
+       {
+               // $data[$key] = URL
+               $result[$data[$key]] = $data;
+       }
+       flock($fp,LOCK_UN);
+       fclose ($fp);
+       
+       return $result;
 }
 
 // Ê¸¾ÏÃæ¤Ë trackback:ping ¤òËä¤á¹þ¤à¤¿¤á¤Î¥Ç¡¼¥¿¤òÀ¸À®
-function tb_PutId($page) {
-  global $script,$trackback;
-
-  if (!$trackback) return "";
-
-  $r_page = rawurlencode($page);
-  $page_enc = md5($r_page);
-  // $dcdate = substr_replace(get_date('Y-m-d\TH:i:sO',$time),':',-2,0);
-  // dc:date="$dcdate"
-
-  $rc = <<<EOD
+function tb_get_rdf($page)
+{
+       global $script,$trackback;
+       
+       if (!$trackback)
+       {
+               return '';
+       }
+       
+       $r_page = rawurlencode($page);
+       $tb_id = tb_get_id($page);
+       // $dcdate = substr_replace(get_date('Y-m-d\TH:i:sO',$time),':',-2,0);
+       // dc:date="$dcdate"
+       
+       return <<<EOD
 <!--
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:dc="http://purl.org/dc/elements/1.1/"
-         xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
-<rdf:Description
-    rdf:about="$script?$r_page"
-    dc:identifier="$script?$r_page"
-    dc:title="$page"
-    trackback:ping="$script?plugin=tb&amp;tb_id=$page_enc" />
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
+ <rdf:Description
+   rdf:about="$script?$r_page"
+   dc:identifier="$script?$r_page"
+   dc:title="$page"
+   trackback:ping="$script?plugin=tb&amp;tb_id=$tb_id" />
 </rdf:RDF>
 -->
 EOD;
-  return $rc;
 }
 
-// Ê¸½ñ¤ò GET ¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿ TrackBack ID ¤ò¼èÆÀ
-function tb_GetID($url) {
-  global $tb_get_url, $tb_get_id;
-
-  $tb_get_url = $url;
-  $tb_get_id  = "";
-
-  // 0: Response Code, 1:Header, 2:Data, 3:Query String
-  $data = tb_http($url);
-  if ($data[0] !== 200) return "";
-
-  // ¥ë¡¼¥×
-  while (preg_match("'(<rdf:RDF .*?>)(.*?)(</rdf:RDF>)'si",$data[2],$regs)) {
-    tb_xml_GetId($regs[1].$regs[2].$regs[3]);
-    if (!empty($tb_get_id)) return $tb_get_id;
-    $data[2] = str_replace($regs[1].$regs[2].$regs[3], "", $data[2]);
-  }
-  return "";
-}
-
-// Ëä¤á¹þ¤Þ¤ì¤¿¥Ç¡¼¥¿¤«¤é TrackBack ID ¤ò¼èÆÀ
-function tb_xml_GetId($data) {
-  // XML ¥Ñ¡¼¥µ¤òºîÀ®¤¹¤ë
-  $xml_parser = xml_parser_create();
-  if (!$xml_parser) return;
-
-  // start ¤ª¤è¤Ó end Í×ÁǤΥϥó¥É¥é¤òÀßÄꤹ¤ë
-  xml_set_element_handler($xml_parser, "tb_startElementHandler_GetId", "tb_xg_dummy");
-  xml_parse($xml_parser, $data, 0);
-  xml_parser_free($xml_parser);
-  return;
+// Ê¸½ñ¤òGET¤·¡¢Ëä¤á¹þ¤Þ¤ì¤¿TrackBack Ping url¤ò¼èÆÀ
+function tb_get_url($url)
+{
+       // ¥×¥í¥­¥·¤ò·Ðͳ¤¹¤ëɬÍפ¬¤¢¤ë¥Û¥¹¥È¤Ë¤Ïping¤òÁ÷¿®¤·¤Ê¤¤
+       $parse_url = parse_url($url);
+       if (empty($parse_url['host']) or via_proxy($parse_url['host']))
+       {
+               return '';
+       }
+       
+       $data = http_request($url);
+       
+       if ($data['rc'] !== 200)
+       {
+               return '';
+       }
+       
+       if (!preg_match_all('#<rdf:RDF[^>]*>(.*?)</rdf:RDF>#si',$data['data'],$matches,PREG_PATTERN_ORDER))
+       {
+               return '';
+       }
+       
+       $obj = new TrackBack_XML();
+       foreach ($matches[1] as $body)
+       {
+               $tb_url = $obj->parse($body,$url);
+               if ($tb_url !== FALSE)
+               {
+                       return $tb_url;
+               }
+       }
+       return '';
 }
 
-// xml_set_element_handler´Ø¿ô¤Ç¥»¥Ã¥È¤·¤¿ startElementHandler
-function tb_startElementHandler_GetId($parser, $name, $attribs) {
-  global $tb_get_url, $tb_get_id;
-
-  if ($name !== "RDF:DESCRIPTION") return;
-
-  $tbid = $tburl = $tbabout = "";
-  foreach ($attribs as $key=>$value) {
-    // print "KEY=".$key." VAL=".$value."\n";
-    if ($key == "RDF:ABOUT") {
-      $tbabout = $value;
-      continue;
-    }
-    if ($key == "DC:IDENTIFER" || $key == "DC:IDENTIFIER") {
-      $tburl = $value;
-      continue;
-    }
-    if ($key == "TRACKBACK:PING") {
-      $tbid = $value;
-      continue;
-    }
-  }
-
-  // print "URL:".$tb_get_url."=".$tburl."\n";
-  // print "TBID:".$tbid."\n";
-  if ($tb_get_url == $tburl || $tb_get_url == $tbabout) $tb_get_id = $tbid;
+// Ëä¤á¹þ¤Þ¤ì¤¿¥Ç¡¼¥¿¤«¤é TrackBack Ping url¤ò¼èÆÀ¤¹¤ë¥¯¥é¥¹
+class TrackBack_XML
+{
+       var $url;
+       var $tb_url;
+       
+       function parse($buf,$url)
+       {
+               // ½é´ü²½
+               $this->url = $url;
+               $this->tb_url = FALSE;
+               
+               $xml_parser = xml_parser_create();
+               xml_set_element_handler($xml_parser,array(&$this,'start_element'),array(&$this,'end_element'));
+               xml_parse($xml_parser,$data,0);
+               
+               if (!xml_parse($xml_parser,$buf,TRUE))
+               {
+/*                     die(sprintf('XML error: %s at line %d in %s',
+                               xml_error_string(xml_get_error_code($xml_parser)),
+                               xml_get_current_line_number($xml_parser),
+                               $buf
+                       ));
+*/
+                       return FALSE;
+               }
+               
+               return $this->tb_url;
+       }
+       function start_element($parser,$name,$attrs)
+       {
+               if ($name !== 'RDF:DESCRIPTION')
+               {
+                       return;
+               }
+               
+               $about = $url = $tb_url = '';
+               foreach ($attrs as $key=>$value)
+               {
+                       switch ($key)
+                       {
+                               case 'RDF:ABOUT':
+                                       $about = $value;
+                                       break;
+                               case 'DC:IDENTIFER':
+                               case 'DC:IDENTIFIER':
+                                       $url = $value;
+                                       break;
+                               case 'TRACKBACK:PING':
+                                       $tb_url = $value;
+                                       break;
+                       }
+               }
+               if ($about == $this->url or $url == $this->url)
+               {
+                       $this->tb_url = $tb_url;
+               }
+       }
+       function end_element($parser,$name)
+       {
+               // do nothing
+       }
 }
 
-// xml_set_element_handler´Ø¿ô¤Ç¥»¥Ã¥È¤·¤¿ EndElementHandler
-function tb_xg_dummy($parser, $name) { return; }
-
 // Referer ¥Ç¡¼¥¿Êݸ(¹¹¿·)
-function ref_save($page) {
-  global $referer;
-
-  if (!$referer) return;
-  $url = get_referer();
-  if (empty($url)) return;
-
-  // URI ¤ÎÂÅÅöÀ­É¾²Á
-  $url_arry = parse_url($url);
-  if (!isset($url_arry['host'])) return;
-
-  // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤­¹þ¤ß²Äǽ¤«¤Î³Îǧ
-  if (file_exists(TRACKBACK_DIR) === false) {
-    die(TRACKBACK_DIR.": No such directory");
-  }
-  if (is_writable(TRACKBACK_DIR) === false) {
-    die(TRACKBACK_DIR.": Permission denied");
-  }
-
-  $filename = TRACKBACK_DIR.md5(rawurlencode($page)).".ref";
-  // Referer ¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤à
-  $rc = ref_put($url,$filename,tb_get($filename));
-  return;
-}
-
-// Referer ¥Ç¡¼¥¿½ÐÎÏ
-function ref_put($url,$file,$data) {
-
-  if (!($fp = fopen($file,"w"))) return 1;
-  @flock($fp, LOCK_EX);
-
-  // ¥«¥ó¥Þ¤¬Æþ¤Ã¤Æ¤âÎɤ¤¤è¤¦¤Ë¡£(¤Ê¤ó¤«°ã¤¦¤È»×¤¦¤Ê¤¡)
-  $url = rawurlencode($url);
-
-  $sw_put = 0; // ¹¹¿·ÍÑ
-  if ($data !== false) {
-    foreach ($data as $x) {
-      if (!$x[4]) continue; // ÍøÍѲÄÈݥե饰¤¬ ¥¼¥í¤Î¾ì¹ç¤Ï¡¢¥Ç¡¼¥¿¤ò¼Î¤Æ¤ë
-      // Referer ¥Ø¥Ã¥À¤¬°ìÃפ¹¤ë¾ì¹ç¤Ï¡¢¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë
-      if ($x[3] == $url) {
-        $sw_put = 1;
-       $x[0] = UTIME; // ºÇ½ª¹¹¿·Æü»þ
-       $x[2]++;       // »²¾È¥«¥¦¥ó¥¿
-      }
-      // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
-      fwrite($fp, $x[0].",".$x[1].",".$x[2].",".$x[3].",".$x[4]."\n");
-    }
-  }
-
-  // ¹¹¿·¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢£±·ïÄɲ乤ë
-  if (!$sw_put) {
-    // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
-    fwrite($fp, UTIME.",".UTIME.",1,".$url.",1\n");
-  }
-
-  @flock($fp, LOCK_UN);
-  @fclose($fp);
-
-  return 0;
-}
-
-// Referer ÊÑ¿ô¤òÌ᤹
-function get_referer($local=FALSE)
+function ref_save($page)
 {
-       $HTTP_REFERER = $_SERVER['HTTP_REFERER'];
-       // ¼«¥µ¥¤¥È¤âÍ­¸ú¤Î¾ì¹ç¤Ï¡¢¤½¤Î¤Þ¤ÞÌ᤹
-       if ($local)
+       global $referer;
+       
+       if (!$referer)
+       {
+               return;
+       }
+       
+       $url = $_SERVER['HTTP_REFERER'];
+       
+       // ¼«¥µ¥¤¥ÈÆâ¤Î¾ì¹ç¤Ï½èÍý¤·¤Ê¤¤
+       if ($url == '' or strpos($url,'http://'.$_SERVER['HTTP_HOST']) === 0)
+       {
+               return;
+       }
+       
+       // URI ¤ÎÂÅÅöÀ­É¾²Á
+       $arr = parse_url($url);
+       if (!isset($arr['host']))
+       {
+               return;
+       }
+       
+       // TRACKBACK_DIR ¤Î¸ºß¤È½ñ¤­¹þ¤ß²Äǽ¤«¤Î³Îǧ
+       if (!is_dir(TRACKBACK_DIR))
+       {
+               die(TRACKBACK_DIR.': No such directory');
+       }
+       if (!is_writable(TRACKBACK_DIR))
+       {
+               die(TRACKBACK_DIR.': Permission denied');
+       }
+       
+       // Referer ¤Î¥Ç¡¼¥¿¤ò¹¹¿·
+       if (ereg("[,\"\n\r]",$url))
+       {
+               $url = '"'.str_replace('"', '""', $url).'"';
+       }
+       $filename = tb_get_filename($page,'.ref');
+       $data = tb_get($filename,3);
+       if (!array_key_exists($url,$data))
+       {
+               // 0:ºÇ½ª¹¹¿·Æü»þ, 1:½é²óÅÐÏ¿Æü»þ, 2:»²¾È¥«¥¦¥ó¥¿, 3:Referer ¥Ø¥Ã¥À, 4:ÍøÍѲÄÈݥե饰(1¤ÏÍ­¸ú)
+               $data[$url] = array(UTIME,UTIME,0,$url,1);
+       }
+       $data[$url][0] = UTIME;
+       $data[$url][2]++;
+       
+       if (!($fp = fopen($filename,'w')))
        {
-               return $HTTP_REFERER;
+               return 1;
        }
-       $HTTP_HOST = 'http://'.$_SERVER['HTTP_HOST'];
-       // ¼«¥µ¥¤¥ÈÆâ¤Î¾ì¹ç¤Ï¡¢¾Ãµî
-       if (strpos($HTTP_REFERER,$HTTP_HOST) === 0)
+       flock($fp, LOCK_EX);
+       foreach ($data as $line)
        {
-               $HTTP_REFERER = '';
+               fwrite($fp,join(',',$line)."\n");
        }
-       return $HTTP_REFERER;
+       flock($fp, LOCK_UN);
+       fclose($fp);
+       
+       return 0;
 }
 ?>