Source for file LC_Page.php

Documentation is available at LC_Page.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. // {{{ requires
  25. require_once(DATA_PATH 'module/Net/URL.php');
  26.  
  27. /**
  28.  * Web Page を制御する基底クラス
  29.  *
  30.  * Web Page を制御する Page クラスは必ずこのクラスを継承する.
  31.  * PHP4 ではこのような抽象クラスを作っても継承先で何でもできてしまうため、
  32.  * あまり意味がないが、アーキテクトを統一するために作っておく.
  33.  *
  34.  * @package Page
  35.  * @author LOCKON CO.,LTD.
  36.  * @version $Id:LC_Page.php 15532 2007-08-31 14:39:46Z nanasess $
  37.  */
  38. class LC_Page {
  39.  
  40.     // {{{ properties
  41.  
  42.     /** メインテンプレート */
  43.     var $tpl_mainpage;
  44.  
  45.     /** テンプレートのカラム数 */
  46.     var $tpl_column_num = 2;
  47.  
  48.     /** メインナンバー */
  49.     var $tpl_mainno;
  50.  
  51.     /** CSS のパス */
  52.     var $tpl_css;
  53.  
  54.     /** JavaScript */
  55.     var $tpl_javascript;
  56.  
  57.     /** タイトル */
  58.     var $tpl_title;
  59.  
  60.     /** カテゴリ */
  61.     var $tpl_page_category;
  62.  
  63.     /** ログインメールアドレス */
  64.     var $tpl_login_email;
  65.  
  66.     /** body タグの onload 属性 */
  67.     var $tpl_onload;
  68.  
  69.     /** 送料合計 */
  70.     var $tpl_total_deliv_fee;
  71.  
  72.     /** トランザクションID */
  73.     var $transactionid;
  74.  
  75.     // }}}
  76.     // {{{ functions
  77.  
  78.     /**
  79.      * Page を初期化する.
  80.      *
  81.      * @return void 
  82.      */
  83.     function init({
  84.         $this->tpl_authority $_SESSION['authority'];
  85.     }
  86.  
  87.     /**
  88.      * Page のプロセス.
  89.      *
  90.      * @return void 
  91.      */
  92.     function process({}
  93.  
  94.     /**
  95.      * デストラクタ.
  96.      *
  97.      * @return void 
  98.      */
  99.     function destroy({}
  100.  
  101.     /**
  102.      * 指定の URL へリダイレクトする.
  103.      *
  104.      * リダイレクト先 URL に SITE_URL 及び SSL_URL を含むかチェックし,
  105.      * LC_Page::getToken() の値を URLパラメータで自動的に付与する.
  106.      *
  107.      * @param string $url リダイレクト先 URL
  108.      * @param boolean $isMobile モバイル用にセッションIDを付与する場合 true
  109.      * @return void|boolean$url に SITE_URL 及び, SSL_URL を含まない場合 false,
  110.      *                        正常に遷移可能な場合は, $url の ロケーションヘッダを出力する.
  111.      * @see Net_URL
  112.      */
  113.     function sendRedirect($url$isMobile false{
  114.  
  115.         if (preg_match("/(" preg_quote(SITE_URL'/')
  116.                           . "|" preg_quote(SSL_URL'/'")/"$url)) {
  117.  
  118.             $netURL new Net_URL($url);
  119.             if (!empty($_SERVER['QUERY_STRING'])) {
  120.                 $netURL->addRawQueryString($_SERVER['QUERY_STRING']);
  121.             }
  122.  
  123.             $session SC_SessionFactory::getInstance();
  124.             if ($isMobile || $session->useCookie(== false{
  125.                 $netURL->addQueryString(session_name()session_id());
  126.             }
  127.  
  128.             $netURL->addQueryString(TRANSACTION_ID_NAME$this->getToken());
  129.             header("Location: " $netURL->getURL());
  130.             return true;
  131.         }
  132.         return false;
  133.     }
  134.  
  135.     // }}}
  136.     // {{{ protected functions
  137.  
  138.     /**
  139.      * トランザクショントークンを生成し, 取得する.
  140.      *
  141.      * 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
  142.      * 同時に, この文字列をセッションに保存する.
  143.      *
  144.      * この関数を使用するためには, 生成した文字列を次画面へ渡すパラメータとして
  145.      * 出力する必要がある.
  146.      *
  147.      * 例)
  148.      * <input type="hidden" name="transactionid" value="この関数の返り値" />
  149.      *
  150.      * 遷移先のページで, LC_Page::isValidToken() の返り値をチェックすることにより,
  151.      * 画面遷移の妥当性が確認できる.
  152.      *
  153.      * @access protected
  154.      * @return string トランザクショントークンの文字列
  155.      */
  156.     function getToken({
  157.         if (empty($_SESSION[TRANSACTION_ID_NAME])) {
  158.             $_SESSION[TRANSACTION_ID_NAME$this->createToken();
  159.         }
  160.         return $_SESSION[TRANSACTION_ID_NAME];
  161.     }
  162.  
  163.     /**
  164.      * トランザクショントークンの妥当性をチェックする.
  165.      *
  166.      * 前画面で生成されたトランザクショントークンの妥当性をチェックする.
  167.      * この関数を使用するためには, 前画面のページクラスで LC_Page::getToken()
  168.      * を呼んでおく必要がある.
  169.      *
  170.      * @access protected
  171.      * @return boolean トランザクショントークンが有効な場合 true
  172.      */
  173.     function isValidToken({
  174.  
  175.         $checkToken "";
  176.  
  177.         // $_POST の値を優先する
  178.         if (isset($_POST[TRANSACTION_ID_NAME])) {
  179.  
  180.             $checkToken $_POST[TRANSACTION_ID_NAME];
  181.         elseif (isset($_GET[TRANSACTION_ID_NAME])) {
  182.  
  183.             $checkToken $_GET[TRANSACTION_ID_NAME];
  184.         }
  185.  
  186.         $ret false;
  187.         // token の妥当性チェック
  188.         if ($checkToken === $_SESSION[TRANSACTION_ID_NAME]{
  189.  
  190.             $ret true;
  191.         }
  192.  
  193.         unset($_SESSION[TRANSACTION_ID_NAME]);
  194.         return $ret;
  195.     }
  196.  
  197.     /**
  198.      * $path から URL を取得する.
  199.      *
  200.      * 以下の順序で 引数 $path から URL を取得する.
  201.      * 1. realpath($path) で $path の 絶対パスを取得
  202.      * 2. $_SERVER['DOCUMENT_ROOT'] と一致する文字列を削除
  203.      * 3. $useSSL の値に応じて, SITE_URL 又は, SSL_URL を付与する.
  204.      *
  205.      * 返り値に, QUERY_STRING を含めたい場合は, key => value 形式
  206.      * の配列を $param へ渡す.
  207.      *
  208.      * @access protected
  209.      * @param string $path 結果を取得するためのパス
  210.      * @param array $param URL に付与するパラメータの配列
  211.      * @param mixed $useSSL 結果に SSL_URL を使用する場合 true,
  212.      *                          SITE_URL を使用する場合 false,
  213.      *                          デフォルト "escape" 現在のスキーマを使用
  214.      * @return string $path の存在する http(s):// から始まる絶対パス
  215.      * @see Net_URL
  216.      */
  217.     function getLocation($path$param array()$useSSL "escape"{
  218.         $rootPath $this->getRootPath($path);
  219.  
  220.         // スキーマを定義
  221.         if ($useSSL === true{
  222.             $url SSL_URL $rootPath;
  223.         elseif ($useSSL === false){
  224.             $url SITE_URL $rootPath;
  225.         elseif ($useSSL == "escape"{
  226.             if (SC_Utils_Ex::sfIsHTTPS()) {
  227.                 $url SSL_URL $rootPath;
  228.             else {
  229.                 $url SITE_URL $rootPath;
  230.             }
  231.         else {
  232.             die("[BUG] Illegal Parametor of \$useSSL ");
  233.         }
  234.  
  235.         $netURL new Net_URL($url);
  236.         // QUERY_STRING 生成
  237.         foreach ($param as $key => $val{
  238.             $netURL->addQueryString($key$val);
  239.         }
  240.  
  241.         return $netURL->getURL();
  242.     }
  243.  
  244.     function getRootPath($path{
  245.         // $path が / で始まっている場合
  246.         if (substr($path01== "/"{
  247.             $realPath realpath(HTML_PATH substr_replace($path""0strlen(URL_DIR)));
  248.         // 相対パスの場合
  249.         else {
  250.             $realPath realpath($path);
  251.         }
  252.  
  253.         // HTML_PATH を削除した文字列を取得.
  254.         // Windowsの場合は, ディレクトリの区切り文字を\から/に変換する
  255.         $realPath str_replace("\\""/"$realPath);
  256.         $htmlPath str_replace("\\""/"HTML_PATH);
  257.         
  258.         $htmlPath rtrim($htmlPath"/");
  259.         $rootPath str_replace($htmlPath""$realPath);
  260.         $rootPath ltrim($rootPath"/");
  261.         
  262.         return $rootPath;
  263.     }
  264.     
  265.     /**
  266.      * ページをリロードする.
  267.      *
  268.      * 引数 $queryString に, $_SERVER['QUERY_STRING'] の値を使用してはならない.
  269.      * この関数は, 内部で LC_Page::sendRedirect() を使用するため,
  270.      * $_SERVER['QUERY_STRING'] の値は自動的に付与される.
  271.      *
  272.      * @param array $queryString QueryString の配列
  273.      * @param bool $removeQueryString 付与されていた QueryString を削除する場合 true
  274.      * @return void 
  275.      * @see Net_URL
  276.      */
  277.     function reload($queryString array()$removeQueryString false{
  278.  
  279.         // 現在の URL を取得
  280.         $netURL new Net_URL($_SERVER['REQUEST_URI']);
  281.  
  282.         if ($removeQueryString{
  283.             $netURL->querystring array();
  284.             $_SERVER['QUERY_STRING'''// sendRedirect() での処理用らしい
  285.         }
  286.  
  287.         // QueryString を付与
  288.         if (!empty($queryString)) {
  289.             foreach ($queryString as $key => $val{
  290.                 $netURL->addQueryString($key$val);
  291.             }
  292.         }
  293.  
  294.         $this->sendRedirect($netURL->getURL());
  295.     }
  296.  
  297.     /**
  298.      * クライアントのキャッシュを許可する.
  299.      *
  300.      * session_start時のno-cacheヘッダーを抑制することで
  301.      * 「戻る」ボタン使用時の有効期限切れ表示を抑制する.
  302.      *
  303.      * @access protected
  304.      * @return void 
  305.      */
  306.     function allowClientCache({
  307.         session_cache_limiter('private-no-expire');
  308.     }
  309.  
  310.     /**
  311.      * デバック出力を行う.
  312.      *
  313.      * デバック用途のみに使用すること.
  314.      *
  315.      * @access protected
  316.      * @param mixed $val デバックする要素
  317.      * @return void 
  318.      */
  319.     function p($val{
  320.         SC_Utils_Ex::sfPrintR($val);
  321.     }
  322.  
  323.     // }}}
  324.     // {{{ private functions
  325.  
  326.     /**
  327.      * トランザクショントークン用の予測困難な文字列を生成して返す.
  328.      *
  329.      * @access private
  330.      * @return string トランザクショントークン用の文字列
  331.      */
  332.     function createToken({
  333.         return sha1(uniqid(rand()true));
  334.     }
  335. }
  336. ?>

Documentation generated on Tue, 28 Apr 2009 18:10:37 +0900 by phpDocumentor 1.4.2