Source for file SC_SessionFactory_UseRequest.php

Documentation is available at SC_SessionFactory_UseRequest.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 CLASS_PATH 'session/SC_SessionFactory.php';
  26. require_once CLASS_EX_PATH "helper_extends/SC_Helper_Mobile_Ex.php";
  27.  
  28. /**
  29.  * Cookieを使用せず、リクエストパラメータによりセッションを継続する設定を行うクラス.
  30.  *
  31.  * このクラスを直接インスタンス化しないこと.
  32.  * 必ず SC_SessionFactory クラスを経由してインスタンス化する.
  33.  * また, SC_SessionFactory クラスの関数を必ずオーバーライドしている必要がある.
  34.  *
  35.  * @package SC_SessionFactory
  36.  * @author LOCKON CO.,LTD.
  37.  * @version $Id: SC_SessionFactory_UseRequest.php 17645 2008-10-02 15:37:07Z Seasoft $
  38.  */
  39.  
  40.     var $state = null;
  41.  
  42.     // }}}
  43.     // {{{ functions
  44.  
  45.     /**
  46.      * PC/モバイルのセッション管理オブジェクトを切り替える
  47.      *
  48.      * @param string $state 
  49.      */
  50.     function setState($state 'pc'{
  51.         switch($state{
  52.         case 'mobile':
  53.             $this->state = new LC_UseRequest_State_Mobile;
  54.             break;
  55.  
  56.         case 'pc':
  57.         default:
  58.             $this->state = new LC_UseRequest_State_PC;
  59.             break;
  60.         }
  61.     }
  62.  
  63.     /**
  64.      * Cookieを使用するかどうか
  65.      *
  66.      * @return boolean 常にfalseを返す
  67.      */
  68.     function useCookie({
  69.         return false;
  70.     }
  71.  
  72.     /**
  73.      * dtb_mobile_ext_session_id テーブルを検索してセッションIDを取得する。
  74.      * PCサイトでもモバイルサイトでもこのテーブルを利用する.
  75.      *
  76.      * @return string|null取得したセッションIDを返す。
  77.      *                      取得できなかった場合は null を返す。
  78.      */
  79.     function getExtSessionId({
  80.         if (!preg_match('|^' URL_DIR '(.*)$|'$_SERVER['SCRIPT_NAME']$matches)) {
  81.             return null;
  82.         }
  83.  
  84.         $url $matches[1];
  85.         $lifetime $this->state->getLifeTime();
  86.         $time date('Y-m-d H:i:s'time($lifetime);
  87.         $objQuery new SC_Query;
  88.  
  89.         foreach ($_REQUEST as $key => $value{
  90.             $session_id $objQuery->get('dtb_mobile_ext_session_id''session_id',
  91.                                          'param_key = ? AND param_value = ? AND url = ? AND create_date >= ?',
  92.                                          array($key$value$url$time));
  93.             if (isset($session_id)) {
  94.                 return $session_id;
  95.             }
  96.         }
  97.  
  98.         return null;
  99.     }
  100.  
  101.     /**
  102.      * 外部サイト連携用にセッションIDとパラメーターの組み合わせを保存する。
  103.      *
  104.      * @param string $param_key パラメーター名
  105.      * @param string $param_value パラメーター値
  106.      * @param string $url URL
  107.      * @return void 
  108.      */
  109.     function setExtSessionId($param_key$param_value$url{
  110.         $objQuery new SC_Query;
  111.  
  112.         // GC
  113.         $lifetime $this->state->getLifeTime();
  114.         $time date('Y-m-d H:i:s'time($lifetime);
  115.         $objQuery->delete('dtb_mobile_ext_session_id''create_date < ?'array($time));
  116.  
  117.         $arrValues array('session_id'  => session_id(),
  118.                            'param_key'   => $param_key,
  119.                            'param_value' => $param_value,
  120.                            'url'         => $url);
  121.  
  122.         $objQuery->insert('dtb_mobile_ext_session_id'$arrValues);
  123.     }
  124.  
  125.     /**
  126.      * セッションデータが有効かどうかをチェックする。
  127.      *
  128.      * @return boolean セッションデータが有効な場合は true、無効な場合は false を返す。
  129.      */
  130.     function validateSession({
  131.         /**
  132.          * PCサイトでは
  133.          *  ・セッションデータが適切に設定されているか
  134.          *  ・UserAgent
  135.          *  ・IPアドレス
  136.          *  ・有効期限
  137.          * モバイルサイトでは
  138.          *  ・セッションデータが適切に設定されているか
  139.          *  ・機種名
  140.          *  ・IPアドレス
  141.          *  ・有効期限
  142.          *  ・phone_id
  143.          * がチェックされる
  144.          */
  145.         return $this->state->validateSessionData();
  146.     }
  147.  
  148.     /**
  149.      * パラメーターから有効なセッションIDを取得する。
  150.      *
  151.      * @return string|false取得した有効なセッションIDを返す。
  152.      *                       取得できなかった場合は false を返す。
  153.      */
  154.     function getSessionId({
  155.         // パラメーターからセッションIDを取得する。
  156.         $sessionId @$_POST[session_name()];
  157.         if (!isset($sessionId)) {
  158.             $sessionId @$_GET[session_name()];
  159.         }
  160.         if (!isset($sessionId)) {
  161.             $sessionId $this->getExtSessionId();
  162.         }
  163.         if (!isset($sessionId)) {
  164.             return false;
  165.         }
  166.  
  167.         // セッションIDの存在をチェックする。
  168.         $objSession new SC_Helper_Session_Ex();
  169.         if ($objSession->sfSessRead($sessionId=== null{
  170.             GC_Utils_Ex::gfPrintLog("Non-existent session id : sid=$sessionId");
  171.             return false;
  172.         }
  173.         return session_id($sessionId);
  174.     }
  175.  
  176.     /**
  177.      * セッション初期処理を行う。
  178.      *
  179.      * @return void 
  180.      */
  181.     function initSession({
  182.         // セッションIDの受け渡しにクッキーを使用しない。
  183.         ini_set('session.use_cookies''0');
  184.         ini_set('session.use_trans_sid''1');
  185.  
  186.         // パラメーターから有効なセッションIDを取得する。
  187.         $sessionId $this->getSessionId();
  188.  
  189.         if (!$sessionId{
  190.             session_start();
  191.         }
  192.  
  193.         // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成
  194.         // し、セッションデータを初期化する。
  195.         if ($sessionId === false || !$this->validateSession()) {
  196.             session_regenerate_id(true);
  197.             // セッションデータの初期化
  198.             $this->state->inisializeSessionData();
  199.  
  200.             // 新しいセッションIDを付加してリダイレクトする。
  201.             if ($_SERVER['REQUEST_METHOD'== 'GET'{
  202.                 // GET の場合は同じページにリダイレクトする。
  203.                 $objMobile new SC_Helper_Mobile_Ex;
  204.                 header('Location: ' $objMobile->gfAddSessionId());
  205.             else {
  206.                 // GET 以外の場合はトップページへリダイレクトする。
  207.                 header('Location: ' URL_SITE_TOP '?' SID);
  208.             }
  209.             exit;
  210.         }
  211.  
  212.         // 有効期限を更新する.
  213.         $this->state->updateExpire();
  214.     }
  215. }
  216. /**
  217.  * セッションデータ管理クラスの基底クラス
  218.  *
  219.  */
  220.     /** 名前空間(pc/mobile) */
  221.     var $namespace = '';
  222.     /** 有効期間 */
  223.     var $lifetime  = 0;
  224.     /** エラーチェック関数名の配列 */
  225.     var $validate  = array();
  226.  
  227.     /**
  228.      * 名前空間を取得する
  229.      *
  230.      * @return string 
  231.      */
  232.     function getNameSpace(return $this->namespace}
  233.  
  234.     /**
  235.      * 有効期間を取得する
  236.      *
  237.      * @return integer 
  238.      */
  239.     function getLifeTime(return $this->lifetime}
  240.  
  241.     /**
  242.      * セッションデータが設定されているかを判定する.
  243.      * $_SESSION[$namespace]の値が配列の場合に
  244.      * trueを返す.
  245.      *
  246.      * @return boolean 
  247.      */
  248.     function validateNameSpace({
  249.         $namespace $this->getNameSpace();
  250.         if (isset($_SESSION[$namespace]&& is_array($_SESSION[$namespace])) {
  251.             return true;
  252.         }
  253.         GC_Utils_Ex::gfPrintLog("NameSpace $namespace not found in session data : sid=session_id());
  254.         return false;
  255.     }
  256.  
  257.     /**
  258.      * セッションのデータを取得する
  259.      * 取得するデータは$_SESSION[$namespace][$key]となる.
  260.      *
  261.      * @param string $key 
  262.      * @return mixed|null
  263.      */
  264.     function getValue($key{
  265.         $namespace $this->getNameSpace();
  266.         return isset($_SESSION[$namespace][$key])
  267.             ? $_SESSION[$namespace][$key]
  268.             : null;
  269.     }
  270.  
  271.     /**
  272.      * セッションにデータを登録する.
  273.      * $_SESSION[$namespace][$key] = $valueの形で登録される.
  274.      *
  275.      * @param string $key 
  276.      * @param mixed $value 
  277.      */
  278.     function setValue($key$value{
  279.         $namespace $this->getNameSpace();
  280.         $_SESSION[$namespace][$key$value;
  281.     }
  282.  
  283.     /**
  284.      * 有効期限を取得する.
  285.      *
  286.      * @return integer 
  287.      */
  288.     function getExpire({
  289.         return $this->getValue('expires');
  290.     }
  291.  
  292.     /**
  293.      * 有効期限を設定する.
  294.      *
  295.      */
  296.     function updateExpire({
  297.         $lifetime $this->getLifeTime();
  298.         $this->setValue('expires'time($lifetime);
  299.     }
  300.  
  301.     /**
  302.      * 有効期限内かどうかを判定する.
  303.      *
  304.      * @return boolean 
  305.      */
  306.     function validateExpire({
  307.         $expire $this->getExpire();
  308.         if (intval($expiretime()) {
  309.             return true;
  310.         }
  311.         $date date('Y/m/d H:i:s'$expire);
  312.         GC_Utils_Ex::gfPrintLog("Session expired at $date : sid=session_id());
  313.         return false;
  314.     }
  315.  
  316.     /**
  317.      * IPアドレスを取得する.
  318.      *
  319.      * @return string 
  320.      */
  321.     function getIp({
  322.         return $this->getValue('ip');
  323.     }
  324.  
  325.     /**
  326.      * IPアドレスを設定する.
  327.      *
  328.      */
  329.     function updateIp({
  330.         $this->setValue('ip'$_SERVER['REMOTE_ADDR']);
  331.     }
  332.  
  333.     /**
  334.      * REMOTE_ADDRとセッション中のIPが同じかどうかを判定する.
  335.      * 同じ場合にtrueが返る
  336.      *
  337.      * @return boolean 
  338.      */
  339.     function validateIp({
  340.         $ip $this->getIp();
  341.         if (!empty($_SERVER['REMOTE_ADDR'])
  342.          && $ip === $_SERVER['REMOTE_ADDR']{
  343.  
  344.             return true;
  345.         }
  346.  
  347.         $msg sprintf('Ip Addr mismatch : %s != %s(expected) : sid=%s',
  348.                        $_SERVER['REMOTE_ADDR']$ipsession_id());
  349.         GC_Utils_Ex::gfPrintLog($msg);
  350.         return false;
  351.     }
  352.  
  353.     /**
  354.      * UserAgentもしくは携帯の機種名を取得する.
  355.      *
  356.      * @return string 
  357.      */
  358.     function getModel({
  359.         return $this->getValue('model');
  360.     }
  361.  
  362.     /**
  363.      * セッション中のデータ検証する
  364.      *
  365.      * @return boolean 
  366.      */
  367.     function validateSessionData({
  368.         foreach ($this->validate as $method{
  369.             $method 'validate' $method;
  370.             if (!$this->$method()) {
  371.                 return false;
  372.             }
  373.         }
  374.         return true;
  375.     }
  376.  
  377.     /**
  378.      * セッションデータを初期化する.
  379.      *
  380.      */
  381.     function inisializeSessionData({}
  382. }
  383.  
  384. /**
  385.  * PCサイト用のセッションデータ管理クラス
  386.  *
  387.  */
  388.  
  389.     /**
  390.      * コンストラクタ
  391.      * セッションのデータ構造は下のようになる.
  392.      * $_SESSION["pc"]=> array(
  393.      *     ["model"]   => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
  394.      *     ["ip"]      => "127.0.0.1"
  395.      *     ["expires"] => 1204699031
  396.      * )
  397.      *
  398.      * @return LC_UseRequest_State_PC 
  399.      */
  400.     function LC_UseRequest_State_PC({
  401.         $this->namespace 'pc';
  402.         $this->lifetime  SESSION_LIFETIME;
  403.         $this->validate  array('NameSpace''Model''Ip''Expire');
  404.     }
  405.  
  406.     /**
  407.      * セッションにUserAgentを設定する.
  408.      *
  409.      */
  410.     function updateModel({
  411.         $this->setValue('model'$_SERVER['HTTP_USER_AGENT']);
  412.     }
  413.  
  414.     /**
  415.      * UserAgentを検証する.
  416.      *
  417.      * @return boolean 
  418.      */
  419.     function validateModel({
  420.         $ua $this->getModel();
  421.         if (!empty($_SERVER['HTTP_USER_AGENT'])
  422.          && $_SERVER['HTTP_USER_AGENT'=== $ua{
  423.  
  424.             return true;
  425.         }
  426.         $msg sprintf("User agent model mismatch : %s != %s(expected), sid=%s",
  427.                        $_SERVER['HTTP_USER_AGENT']$uasession_id());
  428.         GC_Utils_Ex::gfPrintLog($msg);
  429.         return false;
  430.     }
  431.  
  432.     /**
  433.      * セッションデータを初期化する.
  434.      *
  435.      */
  436.     function inisializeSessionData({
  437.         $_SESSION array();
  438.         $this->updateModel();
  439.         $this->updateIp();
  440.         $this->updateExpire();
  441.     }
  442. }
  443.  
  444. /**
  445.  * モバイルサイト用のセッションデータ管理クラス
  446.  *
  447.  */
  448.  
  449.     /**
  450.      * コンストラクタ
  451.      * セッションのデータ構造は下のようになる.
  452.      * $_SESSION["mobile"]=> array(
  453.      *     ["model"]   => 901sh
  454.      *     ["ip"]      => 127.0.0.1
  455.      *     ["expires"] => 1204699031
  456.      *     ["phone_id"]=> ****
  457.      * )
  458.      *
  459.      * @return LC_UseRequest_State_Mobile 
  460.      */
  461.     function LC_UseRequest_State_Mobile({
  462.         $this->namespace 'mobile';
  463.         $this->lifetime  MOBILE_SESSION_LIFETIME;
  464.         $this->validate  array('NameSpace''Model''Expire');
  465.     }
  466.  
  467.     /**
  468.      * 携帯の機種名を設定する
  469.      *
  470.      */
  471.     function updateModel({
  472.         $this->setValue('model'SC_MobileUserAgent::getModel());
  473.     }
  474.  
  475.     /**
  476.      * セッション中の携帯機種名と、アクセスしてきたブラウザの機種名が同じかどうかを判定する
  477.      *
  478.      * @return boolean 
  479.      */
  480.     function validateModel({
  481.         $modelInSession $this->getModel();
  482.         $model SC_MobileUserAgent::getModel();
  483.         if (!empty($model)
  484.          && $model === $modelInSession{
  485.  
  486.             return true;
  487.         }
  488.         return false;
  489.     }
  490.  
  491.     /**
  492.      * 携帯のIDを取得する
  493.      *
  494.      * @return string 
  495.      */
  496.     function getPhoneId({
  497.         return $this->getValue('phone_id');
  498.     }
  499.  
  500.     /**
  501.      * 携帯のIDを登録する.
  502.      *
  503.      */
  504.     function updatePhoneId({
  505.         $this->setValue('phone_id'SC_MobileUserAgent::getId());
  506.     }
  507.  
  508.     /**
  509.      * セッションデータを初期化する.
  510.      *
  511.      */
  512.     function inisializeSessionData({
  513.         $_SESSION array();
  514.         $this->updateModel();
  515.         $this->updateIp();
  516.         $this->updateExpire();
  517.         $this->updatePhoneId();
  518.     }
  519. }
  520. /*
  521.  * Local variables:
  522.  * coding: utf-8
  523.  * End:
  524.  */
  525. ?>

Documentation generated on Tue, 28 Apr 2009 18:13:42 +0900 by phpDocumentor 1.4.2