OSDN Git Service

BugTrack/2062 Remove Referer function config default page
[pukiwiki/pukiwiki.git] / plugin / amazon.inc.php
index 736f895..636edfc 100644 (file)
@@ -1,47 +1,46 @@
 <?php
 // PukiWiki - Yet another WikiWikiWeb clone.
-// $Id: amazon.inc.php,v 1.11 2004/12/28 15:12:25 henoheno Exp $
-// Id: amazon.inc.php,v 1.1 2003/07/24 13:00:00 ´×¼Ë
+// amazon.inc.php
 //
 // Amazon plugin: Book-review maker via amazon.com/amazon.jp
 //
 // Copyright:
-//     2004 PukiWiki Developer Team
-//     2003 ´×¼Ë <raku@rakunet.org> (Original author)
+//     2004-2016 PukiWiki Development Team
+//     2003 閑舎 <raku@rakunet.org> (Original author)
 //
 // License: GNU/GPL
 //
 // ChangeLog:
-// * 2004/04/03 PukiWiki Developer Team (arino <arino@users.sourceforge.jp>)
+// * 2004/04/03 PukiWiki Developer Team (arino <arino@users.osdn.me>)
 //        - replace plugin_amazon_get_page().
 //        - PLUGIN_AMAZON_XML 'xml.amazon.com' -> 'xml.amazon.co.jp'
-// * 0.6  URL ¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¡¢No image ¤òɽ¼¨¡¢²èÁüÇÛÃ֤ʤɽ¤Àµ¡£
-//        ¥¤¥ó¥é¥¤¥ó¥×¥é¥°¥¤¥ó¤Î¸Æ¤Ó½Ð¤·Êý¤ò½¤Àµ¡£
-//       ASIN ÈÖ¹æÉôʬ¤ò¥Á¥§¥Ã¥¯¤¹¤ë¡£
-//       ²èÁü¡¢¥¿¥¤¥È¥ë¤Î¥­¥ã¥Ã¥·¥å¤Ë¤è¤ë®ÅÙ¤ÎÂçÉý¥¢¥Ã¥×¡£
-// * 0.7  ¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼À¸À®¤Î¥Ç¥Ð¥Ã¥°¡¢Ç§¾ÚÌäÂê¤Î°ì±þ¤Î¥¯¥ê¥¢¡£
-// * 0.8  amazon Á´¾¦ÉʤβèÁü¤òɽ¼¨¡£
-//       ¥¢¥½¥·¥¨¥¤¥È ID ¤ËÂбþ¡£
-// * 0.9  RedHat9+php4.3.2+apache2.0.46 ¤Ç²èÁü¤¬ÅÓÃæ¤Þ¤Ç¤·¤«Æɤ߹þ¤Þ¤ì¤Ê¤¤ÌäÂê¤ËÂн衣
-//        ÆüËܸì¥Ú¡¼¥¸¤Î²¼¤Ë¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼¤òºî¤í¤¦¤È¤¹¤ë¤Èʸ»ú²½¤±¤·¤Æºî¤ì¤Ê¤¤ÌäÂê¤Î²ò·è¡£
-//        ½ñÀҤǤʤ¯ CD ¤Ê¤É¡¢ASIN Éôʬ¤¬Ä¹¤¯¤Æ¤â¥¿¥¤¥È¥ë¤ò¤¦¤Þ¤¯½¦¤¦¤è¤¦¤Ë¤¹¤ë¡£
-//        ¼Ì±Æ¤Î¤ß¼è¤ê¹þ¤à¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢B000002G6J.01 ¤È½ñ¤«¤º B000002G6J ¤È½ñ¤¤¤Æ¤â¼Ì±Æ¤¬½Ð¤ë¤è¤¦¤Ë¤¹¤ë¡£
-//       ASIN ¤ËÂбþ¤¹¤ë¥­¥ã¥Ã¥·¥å²èÁü/¥­¥ã¥Ã¥·¥å¥¿¥¤¥È¥ë¤ò¤½¤ì¤¾¤ìºï½ü¤¹¤ëµ¡Ç½Äɲá£
-//       proxy Âбþ(»î¸³Åª)¡£
-//       proxy ¼ÂÁõ¤Î²áÄø¤Ç°ìÈ̥桼¥¶¤Î¤¿¤á¤Î AID ¤Ï¤Ê¤¯¤È¤â¼«Æ°À¸À®¤µ¤ì¤ë¤³¤È¤¬¤ï¤«¤ê¡¢ºï½ü¤·¤¿¡£
-// * 1.0  ¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼¤Ç¤Ê¤¯¡¢¥ì¥Ó¥å¡¼¤È¤¹¤ë¡£
-//        ²èÁü¤Î¥­¥ã¥Ã¥·¥å¤òºï½ü¤¹¤ë´ü¸Â¤òÀߤ±¤ë¡£
-//        ¥¿¥¤¥È¥ë¡¢¼Ì±Æ¤ò Web Services ¤Î XML ¥¢¥¯¥»¥¹¤ÎÊýË¡¤Ë¤è¤Ã¤Æ get ¤¹¤ë¤³¤È¤Ç»þ´Ö¤òû½Ì¤¹¤ë¡£
-//        ¥ì¥Ó¥å¡¼¥Ú¡¼¥¸À¸À®¤Î¥¿¥¤¥ß¥ó¥°¤Ë¤Ä¤¤¤ÆÃí¤òÆþ¤ì¤ë¡£
-// * 1.1  ÊÔ½¸À©¸Â¤ò¤«¤±¤Æ¤¤¤ë¾ì¹ç¡¢Éô³°¼Ô¤¬¥ì¥Ó¥å¡¼¤òºî¤í¤¦¤È¤·¤Æ¡¢¥Ú¡¼¥¸¤Ï¤Ç¤­¤Ê¤¤¤¬ ASIN4774110655.tit ¤Ê¤É¤Î¥­¥ã¥Ã¥·¥å¤¬¤Ç¤­¤ë¤Î¤ò²ò·è¡£
-//        ²èÁü¤ÎºÇ¸å¤¬ 01 ¤Î¾ì¹ç¡¢image ¤òºï½ü¤¹¤ë¤È noimage.jpg ¤È¤Ê¤Ã¤Æ¤·¤Þ¤¦¥Ð¥°¤ò½¤Àµ¡£
-//        1.0 ¤ÇƳÆþ¤·¤¿ XML ¥¢¥¯¥»¥¹¤Ï¹â®¤À¤¬¡¢ÊÖ¤¹²èÁü¾ðÊ󤬥¦¥½¤Ê¤Î¤Ç¡¢09 ¤¬¤À¤á¤Ê¤é 01 ¤ò¥È¥é¥¤¤¹¤ë¡¢¤Ç»ÃÄêŪ¤Ë²ò·è¡£
+// * 0.6  URL が存在しない場合、No image を表示、画像配置など修正。
+//        インラインプラグインの呼び出し方を修正。
+//       ASIN 番号部分をチェックする。
+//       画像、タイトルのキャッシュによる速度の大幅アップ。
+// * 0.7  ブックレビュー生成のデバッグ、認証問題の一応のクリア。
+// * 0.8  amazon 全商品の画像を表示。
+//       アソシエイト ID に対応。
+// * 0.9  RedHat9+php4.3.2+apache2.0.46 で画像が途中までしか読み込まれない問題に対処。
+//        日本語ページの下にブックレビューを作ろうとすると文字化けして作れない問題の解決。
+//        書籍でなく CD など、ASIN 部分が長くてもタイトルをうまく拾うようにする。
+//        写影のみ取り込むのでなければ、B000002G6J.01 と書かず B000002G6J と書いても写影が出るようにする。
+//       ASIN に対応するキャッシュ画像/キャッシュタイトルをそれぞれ削除する機能追加。
+//       proxy 対応(試験的)。
+//       proxy 実装の過程で一般ユーザのための AID はなくとも自動生成されることがわかり、削除した。
+// * 1.0  ブックレビューでなく、レビューとする。
+//        画像のキャッシュを削除する期限を設ける。
+//        タイトル、写影を Web Services の XML アクセスの方法によって get することで時間を短縮する。
+//        レビューページ生成のタイミングについて注を入れる。
+// * 1.1  編集制限をかけている場合、部外者がレビューを作ろうとして、ページはできないが ASIN4774110655.tit などのキャッシュができるのを解決。
+//        画像の最後が 01 の場合、image を削除すると noimage.jpg となってしまうバグを修正。
+//        1.0 で導入した XML アクセスは高速だが、返す画像情報がウソなので、09 がだめなら 01 をトライする、で暫定的に解決。
 //
 // Caution!:
-// * Ãøºî¸¢¤¬´ØÏ¢¤¹¤ë°Ù¡¢www.amazon.co.jp ¤Î¥¢¥½¥·¥¨¥¤¥È¥×¥í¥°¥é¥à¤ò³Îǧ¤Î¾å¤´ÍøÍѲ¼¤µ¤¤¡£
-// * ¥ì¥Ó¥å¡¼¤Ï¡¢amazon ¥×¥é¥°¥¤¥ó¤¬¸Æ¤Ó½Ð¤¹ÊÔ½¸²èÌ̤Ϥ⤦½ÐÍè¤Æ PukiWiki ¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢
-//   Ãæ»ß¤¹¤ë¤Ê¤éÁ´Ê¸¤òºï½ü¤·¤Æ¥Ú¡¼¥¸¤Î¹¹¿·¥Ü¥¿¥ó¤ò²¡¤¹¤³¤È¡£
-// * ²¼¤Î PLUGIN_AMAZON_AID¡¢PROXY ¥µ¡¼¥Ð¤ÎÉôʬ¡¢expire ¤ÎÉôʬ¤òŬÅö¤ËÊÔ½¸¤·¤Æ»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤(¾¤Ï¤½¤Î¤Þ¤Þ¤Ç¤â Ok)¡£
+// * 著作権が関連する為、www.amazon.co.jp のアソシエイトプログラムを確認の上ご利用下さい。
+// * レビューは、amazon プラグインが呼び出す編集画面はもう出来て PukiWiki に登録されているので、
+//   中止するなら全文を削除してページの更新ボタンを押すこと。
+// * 下の PLUGIN_AMAZON_AID、PROXY サーバの部分、expire の部分を適当に編集して使用してください(他はそのままでも Ok)。
 //
 // Thanks to: Reimy and PukiWiki Developers Team
 //
@@ -92,21 +91,21 @@ function plugin_amazon_init()
                $amazon_aid = PLUGIN_AMAZON_AID . '/';
        }
        $amazon_body = <<<EOD
--ºî¼Ô: [[¤³¤³ÊÔ½¸¤Î¤³¤È]]
--ɾ¼Ô: ¤ªÌ¾Á°
--ÆüÉÕ: &date;
-**¤ªÁ¦¤áÂоÝ
-[[¤³¤³ÊÔ½¸¤Î¤³¤È]]
+-作者: [[ここ編集のこと]]
+-評者: お名前
+-日付: &date;
+**お薦め対象
+[[ここ編集のこと]]
 
 #amazon(,clear)
-**´¶ÁÛ
-[[¤³¤³ÊÔ½¸¤Î¤³¤È]]
-
-// ¤Þ¤º¡¢¤³¤Î¥ì¥Ó¥å¡¼¤ò»ß¤á¤ë¾ì¹ç¡¢Á´Ê¸¤òºï½ü¤·¡¢¥Ú¡¼¥¸¤Î[¹¹¿·¥Ü¥¿¥ó]¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤¡ª(PukiWiki ¤Ë¤Ï¤â¤¦ÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹)
-// Â³¤±¤ë¤Ê¤é¡¢¾å¤Î¡¢[[¤³¤³ÊÔ½¸¤Î¤³¤È]]Éôʬ¤ò³ç¸Ì¤ò´Þ¤á¤Æºï½ü¤·¡¢½ñ¤­Ä¾¤·¤Æ¤¯¤À¤µ¤¤¡£
-// ¤ªÌ¾Á°¡¢Éôʬ¤Ï¤´¼«Ê¬¤Î̾Á°¤ËÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£»ä¤À¤È¡¢´×¼Ë¡¢¤Ç¤¹¡£
-// **¤ªÁ¦¤áÂоݡ¢¤è¤ê¾å¤Ï¡¢¿·¤·¤¤¹Ô¤òÄɲ䷤ʤ¤¤Ç¤¯¤À¤µ¤¤¡£Ìܼ¡ºîÀ®¤Ë»ÈÍѤ¹¤ë¤Î¤Ç¡£
-// //¤Ç»Ï¤Þ¤ë¥³¥á¥ó¥È¹Ô¤Ï¡¢ºÇ½ªÅª¤ËÁ´Éô¥«¥Ã¥È¤·¤Æ¤¯¤À¤µ¤¤¡£Ìܼ¡¤¬Àµ¾ï¤ËºîÀ®¤Ç¤­¤Ê¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£
+**感想
+[[ここ編集のこと]]
+
+// まず、このレビューを止める場合、全文を削除し、ページの[更新ボタン]を押してください!(PukiWiki にはもう登録されています)
+// 続けるなら、上の、[[ここ編集のこと]]部分を括弧を含めて削除し、書き直してください。
+// お名前、部分はご自分の名前に変更してください。私だと、閑舎、です。
+// **お薦め対象、より上は、新しい行を追加しないでください。目次作成に使用するので。
+// //で始まるコメント行は、最終的に全部カットしてください。目次が正常に作成できない可能性があります。
 #comment
 EOD;
 }
@@ -116,12 +115,17 @@ function plugin_amazon_convert()
        global $script, $vars, $asin, $asin_all;
 
        if (func_num_args() > 3) {
+               if (PKWK_READONLY) return ''; // Show nothing
+
                return '#amazon([ASIN-number][,left|,right]' .
                        '[,book-title|,image|,delimage|,deltitle|,delete])';
+
        } else if (func_num_args() == 0) {
-               // ¥ì¥Ó¥å¡¼ºîÀ®
-               $s_page = htmlspecialchars($vars['page']);
-               if ($s_page == '') $s_page = $vars['refer'];
+               // レビュー作成
+               if (PKWK_READONLY) return ''; // Show nothing
+
+               $s_page = htmlsc($vars['page']);
+               if ($s_page == '') $s_page = isset($vars['refer']) ? $vars['refer'] : '';
                $ret = <<<EOD
 <form action="$script" method="post">
  <div>
@@ -129,7 +133,7 @@ function plugin_amazon_convert()
   <input type="hidden" name="refer" value="$s_page" />
   ASIN:
   <input type="text" name="asin" size="30" value="" />
-  <input type="submit" value="¥ì¥Ó¥å¡¼ÊÔ½¸" /> (ISBN 10 ·å or ASIN 12 ·å)
+  <input type="submit" value="レビュー編集" /> (ISBN 10 桁 or ASIN 12 桁)
  </div>
 </form>
 EOD;
@@ -139,15 +143,15 @@ EOD;
        $aryargs = func_get_args();
 
        $align = strtolower($aryargs[1]);
-       if ($align == 'clear') return '<div style="clear:both"></div>'; // ²þ¹ÔÁÞÆþ
-       if ($align != 'left') $align = 'right'; // ÇÛÃÖ·èÄê
+       if ($align == 'clear') return '<div style="clear:both"></div>'; // 改行挿入
+       if ($align != 'left') $align = 'right'; // 配置決定
 
-       $asin_all = htmlspecialchars($aryargs[0]);  // for XSS
+       $asin_all = htmlsc($aryargs[0]);  // for XSS
        if (is_asin() == FALSE && $align != 'clear') return FALSE;
 
        if ($aryargs[2] != '') {
-               // ¥¿¥¤¥È¥ë»ØÄê
-               $title = $alt = htmlspecialchars($aryargs[2]); // for XSS
+               // タイトル指定
+               $title = $alt = htmlsc($aryargs[2]); // for XSS
                if ($alt == 'image') {
                        $alt = plugin_amazon_get_asin_title();
                        if ($alt == '') return FALSE;
@@ -173,7 +177,7 @@ EOD;
                        }
                }
        } else {
-               // ¥¿¥¤¥È¥ë¼«Æ°¼èÆÀ
+               // タイトル自動取得
                $alt = $title = plugin_amazon_get_asin_title();
                if ($alt == '') return FALSE;
        }
@@ -186,34 +190,40 @@ function plugin_amazon_action()
        global $vars, $script, $edit_auth, $edit_auth_users;
        global $amazon_body, $asin, $asin_all;
 
-       $asin_all = htmlspecialchars(rawurlencode(strip_bracket($vars['asin'])));
+       if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
+
+       $s_page   = isset($vars['refer']) ? $vars['refer'] : '';
+       $asin_all = isset($vars['asin']) ?
+               htmlsc(rawurlencode(strip_bracket($vars['asin']))) : '';
 
        if (! is_asin()) {
-               $retvars['msg']   = '¥Ö¥Ã¥¯¥ì¥Ó¥å¡¼ÊÔ½¸';
-               $retvars['refer'] = $vars['refer'];
+               $retvars['msg']   = 'ブックレビュー編集';
+               $retvars['refer'] = & $s_page;
                $retvars['body']  = plugin_amazon_convert();
                return $retvars;
 
        } else {
-               $s_page     = $vars['refer'];
                $r_page     = $s_page . '/' . $asin;
                $r_page_url = rawurlencode($r_page);
+               $auth_user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : '';
 
                pkwk_headers_sent();
-               if ($edit_auth && (! isset($_SERVER['PHP_AUTH_USER']) ||
-                   ! array_key_exists($_SERVER['PHP_AUTH_USER'], $edit_auth_users) ||
-                       $edit_auth_users[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW'])) {
-                       header('Location: ' . get_script_uri() . '?cmd=read&page=' . $r_page_url);
+               if ($edit_auth && ($auth_user == '' || ! isset($edit_auth_users[$auth_user]) ||
+                   $edit_auth_users[$auth_user] != $_SERVER['PHP_AUTH_PW'])) {
+                       // Edit-auth failed. Just look the page
+                       header('Location: ' . get_script_uri() . '?' . $r_page_url);
                } else {
                        $title = plugin_amazon_get_asin_title();
-                       if ($title == '' || preg_match('/^\//', $s_page)) {
+                       if ($title == '' || preg_match('#^/#', $s_page)) {
+                               // Invalid page name
+                               header('Location: ' . get_script_uri() . '?' . pagename_urlencode($s_page));
+                       } else {
+                               $body = '#amazon(' . $asin_all . ',,image)' . "\n" .
+                                       '*' . $title . "\n" . $amazon_body;
+                               plugin_amazon_review_save($r_page, $body);
                                header('Location: ' . get_script_uri() .
-                                       '?cmd=read&page=' . encode($s_page));
+                                       '?cmd=edit&page=' . $r_page_url);
                        }
-                       $body = '#amazon(' . $asin_all . ',,image)' . "\n" .
-                               '*' . $title . "\n" . $amazon_body;
-                       plugin_amazon_review_save($r_page, $body);
-                       header('Location: ' . get_script_uri() . '?cmd=edit&page=' . $r_page_url);
                }
                exit;
        }
@@ -225,7 +235,7 @@ function plugin_amazon_inline()
 
        list($asin_all) = func_get_args();
 
-       $asin_all = htmlspecialchars($asin_all); // for XSS
+       $asin_all = htmlsc($asin_all); // for XSS
        if (! is_asin()) return FALSE;
 
        $title = plugin_amazon_get_asin_title();
@@ -275,11 +285,11 @@ function plugin_amazon_get_asin_title()
 
        $url = PLUGIN_AMAZON_XML . $asin;
 
-       if (file_exists(CACHE_DIR) === FALSE || is_writable(CACHE_DIR) === FALSE) $nocachable = 1; // ¥­¥ã¥Ã¥·¥åÉԲĤξì¹ç
+       if (file_exists(CACHE_DIR) === FALSE || is_writable(CACHE_DIR) === FALSE) $nocachable = 1; // キャッシュ不可の場合
 
        if (($title = plugin_amazon_cache_title_fetch(CACHE_DIR)) == FALSE) {
-               $nocache = 1; // ¥­¥ã¥Ã¥·¥å¸«¤Ä¤«¤é¤º
-               $body    = plugin_amazon_get_page($url); // ¤·¤«¤¿¤Ê¤¤¤Î¤Ç¼è¤ê¤Ë¤¤¤¯
+               $nocache = 1; // キャッシュ見つからず
+               $body    = plugin_amazon_get_page($url); // しかたないので取りにいく
                $tmpary  = array();
                $body    = mb_convert_encoding($body, SOURCE_ENCODING, 'UTF-8');
                preg_match('/<ProductName>([^<]*)</', $body, $tmpary);
@@ -302,7 +312,7 @@ function plugin_amazon_get_asin_title()
        }
 }
 
-// ¥¿¥¤¥È¥ë¥­¥ã¥Ã¥·¥å¤¬¤¢¤ë¤«Ä´¤Ù¤ë
+// タイトルキャッシュがあるか調べる
 function plugin_amazon_cache_title_fetch($dir)
 {
        global $asin, $asin_ext, $asin_all;
@@ -331,7 +341,7 @@ function plugin_amazon_cache_title_fetch($dir)
        }
 }
 
-// ²èÁü¥­¥ã¥Ã¥·¥å¤¬¤¢¤ë¤«Ä´¤Ù¤ë
+// 画像キャッシュがあるか調べる
 function plugin_amazon_cache_image_fetch($dir)
 {
        global $asin, $asin_ext, $asin_all;
@@ -358,8 +368,8 @@ function plugin_amazon_cache_image_fetch($dir)
                        $size = getimagesize($tmpfile);
                        unlink($tmpfile);
                }
-               if ($body == '' || $size[1] <= 1) { // Ä̾ï¤Ï1¤¬Ê֤뤬ǰ¤Î¤¿¤á0¤Î¾ì¹ç¤â(reimy)
-                       // ¥­¥ã¥Ã¥·¥å¤ò PLUGIN_AMAZON_NO_IMAGE ¤Î¥³¥Ô¡¼¤È¤¹¤ë
+               if ($body == '' || $size[1] <= 1) { // 通常は1が返るが念のため0の場合も(reimy)
+                       // キャッシュを PLUGIN_AMAZON_NO_IMAGE のコピーとする
                        if ($asin_ext == '09') {
                                $url = 'http://images-jp.amazon.com/images/P/' . $asin . '.01.MZZZZZZZ.jpg';
                                $body = plugin_amazon_get_page($url);
@@ -430,7 +440,7 @@ function plugin_amazon_review_save($page, $data)
 
 function plugin_amazon_get_page($url)
 {
-       $data = http_request($url);
+       $data = pkwk_http_request($url);
        return ($data['rc'] == 200) ? $data['data'] : '';
 }
 
@@ -444,10 +454,9 @@ function is_asin()
                return FALSE;
        } else {
                $asin     = $tmpary[1];
-               $asin_ext = $tmpary[2];
+               $asin_ext = isset($tmpary[2]) ? $tmpary[2] : '';
                if ($asin_ext == '') $asin_ext = '09';
                $asin_all = $asin . $asin_ext;
                return TRUE;
        }
 }
-?>