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

Documentation generated on Fri, 24 Feb 2012 14:02:57 +0900 by Seasoft