SC_SessionFactory
[ class tree: SC_SessionFactory ] [ index: SC_SessionFactory ] [ all elements ]

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-2010 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 18734 2010-06-22 08:45:33Z nanasess $
  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.  
  185.         // パラメーターから有効なセッションIDを取得する。
  186.         $sessionId $this->getSessionId();
  187.  
  188.         if (!$sessionId{
  189.             session_start();
  190.         }
  191.  
  192.         // セッションIDまたはセッションデータが無効な場合は、セッションIDを再生成
  193.         // し、セッションデータを初期化する。
  194.         if ($sessionId === false || !$this->validateSession()) {
  195.             session_regenerate_id(true);
  196.             // セッションデータの初期化
  197.             $this->state->inisializeSessionData();
  198.  
  199.             // 新しいセッションIDを付加してリダイレクトする。
  200.             if ($_SERVER['REQUEST_METHOD'== 'GET'{
  201.                 // GET の場合は同じページにリダイレクトする。
  202.                 $objMobile new SC_Helper_Mobile_Ex;
  203.                 header('Location: ' $objMobile->gfAddSessionId());
  204.             else {
  205.                 // GET 以外の場合はトップページへリダイレクトする。
  206.                 header('Location: ' URL_SITE_TOP '?' SID);
  207.             }
  208.             exit;
  209.         }
  210.  
  211.         // 有効期限を更新する.
  212.         $this->state->updateExpire();
  213.     }
  214. }
  215. /**
  216.  * セッションデータ管理クラスの基底クラス
  217.  *
  218.  */
  219.     /** 名前空間(pc/mobile) */
  220.     var $namespace = '';
  221.     /** 有効期間 */
  222.     var $lifetime  = 0;
  223.     /** エラーチェック関数名の配列 */
  224.     var $validate  = array();
  225.  
  226.     /**
  227.      * 名前空間を取得する
  228.      *
  229.      * @return string 
  230.      */
  231.     function getNameSpace(return $this->namespace}
  232.  
  233.     /**
  234.      * 有効期間を取得する
  235.      *
  236.      * @return integer 
  237.      */
  238.     function getLifeTime(return $this->lifetime}
  239.  
  240.     /**
  241.      * セッションデータが設定されているかを判定する.
  242.      * $_SESSION[$namespace]の値が配列の場合に
  243.      * trueを返す.
  244.      *
  245.      * @return boolean 
  246.      */
  247.     function validateNameSpace({
  248.         $namespace $this->getNameSpace();
  249.         if (isset($_SESSION[$namespace]&& is_array($_SESSION[$namespace])) {
  250.             return true;
  251.         }
  252.         GC_Utils_Ex::gfPrintLog("NameSpace $namespace not found in session data : sid=session_id());
  253.         return false;
  254.     }
  255.  
  256.     /**
  257.      * セッションのデータを取得する
  258.      * 取得するデータは$_SESSION[$namespace][$key]となる.
  259.      *
  260.      * @param string $key 
  261.      * @return mixed|null
  262.      */
  263.     function getValue($key{
  264.         $namespace $this->getNameSpace();
  265.         return isset($_SESSION[$namespace][$key])
  266.             ? $_SESSION[$namespace][$key]
  267.             : null;
  268.     }
  269.  
  270.     /**
  271.      * セッションにデータを登録する.
  272.      * $_SESSION[$namespace][$key] = $valueの形で登録される.
  273.      *
  274.      * @param string $key 
  275.      * @param mixed $value 
  276.      */
  277.     function setValue($key$value{
  278.         $namespace $this->getNameSpace();
  279.         $_SESSION[$namespace][$key$value;
  280.     }
  281.  
  282.     /**
  283.      * 有効期限を取得する.
  284.      *
  285.      * @return integer 
  286.      */
  287.     function getExpire({
  288.         return $this->getValue('expires');
  289.     }
  290.  
  291.     /**
  292.      * 有効期限を設定する.
  293.      *
  294.      */
  295.     function updateExpire({
  296.         $lifetime $this->getLifeTime();
  297.         $this->setValue('expires'time($lifetime);
  298.     }
  299.  
  300.     /**
  301.      * 有効期限内かどうかを判定する.
  302.      *
  303.      * @return boolean 
  304.      */
  305.     function validateExpire({
  306.         $expire $this->getExpire();
  307.         if (intval($expiretime()) {
  308.             return true;
  309.         }
  310.         $date date('Y/m/d H:i:s'$expire);
  311.         GC_Utils_Ex::gfPrintLog("Session expired at $date : sid=session_id());
  312.         return false;
  313.     }
  314.  
  315.     /**
  316.      * IPアドレスを取得する.
  317.      *
  318.      * @return string 
  319.      */
  320.     function getIp({
  321.         return $this->getValue('ip');
  322.     }
  323.  
  324.     /**
  325.      * IPアドレスを設定する.
  326.      *
  327.      */
  328.     function updateIp({
  329.         $this->setValue('ip'$_SERVER['REMOTE_ADDR']);
  330.     }
  331.  
  332.     /**
  333.      * REMOTE_ADDRとセッション中のIPが同じかどうかを判定する.
  334.      * 同じ場合にtrueが返る
  335.      *
  336.      * @return boolean 
  337.      */
  338.     function validateIp({
  339.         $ip $this->getIp();
  340.         if (!empty($_SERVER['REMOTE_ADDR'])
  341.          && $ip === $_SERVER['REMOTE_ADDR']{
  342.  
  343.             return true;
  344.         }
  345.  
  346.         $msg sprintf('Ip Addr mismatch : %s != %s(expected) : sid=%s',
  347.                        $_SERVER['REMOTE_ADDR']$ipsession_id());
  348.         GC_Utils_Ex::gfPrintLog($msg);
  349.         return false;
  350.     }
  351.  
  352.     /**
  353.      * UserAgentもしくは携帯の機種名を取得する.
  354.      *
  355.      * @return string 
  356.      */
  357.     function getModel({
  358.         return $this->getValue('model');
  359.     }
  360.  
  361.     /**
  362.      * セッション中のデータ検証する
  363.      *
  364.      * @return boolean 
  365.      */
  366.     function validateSessionData({
  367.         foreach ($this->validate as $method{
  368.             $method 'validate' $method;
  369.             if (!$this->$method()) {
  370.                 return false;
  371.             }
  372.         }
  373.         return true;
  374.     }
  375.  
  376.     /**
  377.      * セッションデータを初期化する.
  378.      *
  379.      */
  380.     function inisializeSessionData({}
  381. }
  382.  
  383. /**
  384.  * PCサイト用のセッションデータ管理クラス
  385.  *
  386.  */
  387.  
  388.     /**
  389.      * コンストラクタ
  390.      * セッションのデータ構造は下のようになる.
  391.      * $_SESSION["pc"]=> array(
  392.      *     ["model"]   => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"
  393.      *     ["ip"]      => "127.0.0.1"
  394.      *     ["expires"] => 1204699031
  395.      * )
  396.      *
  397.      * @return LC_UseRequest_State_PC 
  398.      */
  399.     function LC_UseRequest_State_PC({
  400.         $this->namespace 'pc';
  401.         $this->lifetime  SESSION_LIFETIME;
  402.         $this->validate  array('NameSpace''Model''Ip''Expire');
  403.     }
  404.  
  405.     /**
  406.      * セッションにUserAgentを設定する.
  407.      *
  408.      */
  409.     function updateModel({
  410.         $this->setValue('model'$_SERVER['HTTP_USER_AGENT']);
  411.     }
  412.  
  413.     /**
  414.      * UserAgentを検証する.
  415.      *
  416.      * @return boolean 
  417.      */
  418.     function validateModel({
  419.         $ua $this->getModel();
  420.         if (!empty($_SERVER['HTTP_USER_AGENT'])
  421.          && $_SERVER['HTTP_USER_AGENT'=== $ua{
  422.  
  423.             return true;
  424.         }
  425.         $msg sprintf("User agent model mismatch : %s != %s(expected), sid=%s",
  426.                        $_SERVER['HTTP_USER_AGENT']$uasession_id());
  427.         GC_Utils_Ex::gfPrintLog($msg);
  428.         return false;
  429.     }
  430.  
  431.     /**
  432.      * セッションデータを初期化する.
  433.      *
  434.      */
  435.     function inisializeSessionData({
  436.         $_SESSION array();
  437.         $this->updateModel();
  438.         $this->updateIp();
  439.         $this->updateExpire();
  440.     }
  441. }
  442.  
  443. /**
  444.  * モバイルサイト用のセッションデータ管理クラス
  445.  *
  446.  */
  447.  
  448.     /**
  449.      * コンストラクタ
  450.      * セッションのデータ構造は下のようになる.
  451.      * $_SESSION["mobile"]=> array(
  452.      *     ["model"]   => 901sh
  453.      *     ["ip"]      => 127.0.0.1
  454.      *     ["expires"] => 1204699031
  455.      *     ["phone_id"]=> ****
  456.      * )
  457.      *
  458.      * @return LC_UseRequest_State_Mobile 
  459.      */
  460.     function LC_UseRequest_State_Mobile({
  461.         $this->namespace 'mobile';
  462.         $this->lifetime  MOBILE_SESSION_LIFETIME;
  463.         $this->validate  array('NameSpace''Model''Expire');
  464.     }
  465.  
  466.     /**
  467.      * 携帯の機種名を設定する
  468.      *
  469.      */
  470.     function updateModel({
  471.         $this->setValue('model'SC_MobileUserAgent::getModel());
  472.     }
  473.  
  474.     /**
  475.      * セッション中の携帯機種名と、アクセスしてきたブラウザの機種名が同じかどうかを判定する
  476.      *
  477.      * @return boolean 
  478.      */
  479.     function validateModel({
  480.         $modelInSession $this->getModel();
  481.         $model SC_MobileUserAgent::getModel();
  482.         if (!empty($model)
  483.          && $model === $modelInSession{
  484.  
  485.             return true;
  486.         }
  487.         return false;
  488.     }
  489.  
  490.     /**
  491.      * 携帯のIDを取得する
  492.      *
  493.      * @return string 
  494.      */
  495.     function getPhoneId({
  496.         return $this->getValue('phone_id');
  497.     }
  498.  
  499.     /**
  500.      * 携帯のIDを登録する.
  501.      *
  502.      */
  503.     function updatePhoneId({
  504.         $this->setValue('phone_id'SC_MobileUserAgent::getId());
  505.     }
  506.  
  507.     /**
  508.      * セッションデータを初期化する.
  509.      *
  510.      */
  511.     function inisializeSessionData({
  512.         $_SESSION array();
  513.         $this->updateModel();
  514.         $this->updateIp();
  515.         $this->updateExpire();
  516.         $this->updatePhoneId();
  517.     }
  518. }
  519. /*
  520.  * Local variables:
  521.  * coding: utf-8
  522.  * End:
  523.  */
  524. ?>

Documentation generated on Fri, 24 Feb 2012 14:00:22 +0900 by Seasoft