Source for file Ethna_Session.php

Documentation is available at Ethna_Session.php

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4.  *  Ethna_Session.php
  5.  *
  6.  *  @author     Masaki Fujimoto <fujimoto@php.net>
  7.  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
  8.  *  @package    Ethna
  9.  *  @version    $Id$
  10.  */
  11.  
  12. // {{{ Ethna_Session
  13. /**
  14.  *  セッションクラス
  15.  *
  16.  *  @author     Masaki Fujimoto <fujimoto@php.net>
  17.  *  @access     public
  18.  *  @package    Ethna
  19.  */
  20. {
  21.     /**#@+
  22.      *  @access private
  23.      */
  24.  
  25.     /** @var    object  Ethna_Logger    loggerオブジェクト */
  26.     var $logger;
  27.  
  28.     /** @var    string  セッション名 */
  29.     var $session_name;
  30.  
  31.     /** @var    string  セッションデータ保存ディレクトリ */
  32.     var $session_save_dir;
  33.  
  34.     /** @var    bool    セッション開始フラグ */
  35.     var $session_start false;
  36.  
  37.     /** @var    bool    匿名セッションフラグ */
  38.     var $anonymous false;
  39.  
  40.     /**#@-*/
  41.  
  42.     /**
  43.      *  Ethna_Sessionクラスのコンストラクタ
  44.      *
  45.      *  @access public
  46.      *  @param  string  $appid      アプリケーションID(セッション名として使用)
  47.      *  @param  string  $save_dir   セッションデータを保存するディレクトリ
  48.      */
  49.     function Ethna_Session($appid$save_dir$logger)
  50.     {
  51.         $this->session_name "${appid}SESSID";
  52.         $this->session_save_dir $save_dir;
  53.         $this->logger =$logger;
  54.  
  55.         if ($this->session_save_dir != ""{
  56.             session_save_path($this->session_save_dir);
  57.         }
  58.  
  59.         session_name($this->session_name);
  60.         session_cache_limiter('private, must-revalidate');
  61.  
  62.         $this->session_start false;
  63.         if (isset($_SERVER['REQUEST_METHOD']== false{
  64.             return;
  65.         }
  66.  
  67.         if (strcasecmp($_SERVER['REQUEST_METHOD']'post'== 0{
  68.             $http_vars =$_POST;
  69.         else {
  70.             $http_vars =$_GET;
  71.         }
  72.         if (array_key_exists($this->session_name$http_vars)
  73.             && $http_vars[$this->session_name!= null{
  74.             $_COOKIE[$this->session_name$http_vars[$this->session_name];
  75.         }
  76.     }
  77.  
  78.     /**
  79.      *  セッションを復帰する
  80.      *
  81.      *  @access public
  82.      */
  83.     function restore()
  84.     {
  85.         if (!empty($_COOKIE[$this->session_name]||
  86.         (ini_get("session.use_trans_sid"== &&
  87.         !empty($_REQUEST[$this->session_name]))
  88.         {
  89.             session_start();
  90.             $this->session_start true;
  91.  
  92.             // check session
  93.             if ($this->isValid(== false{
  94.                 setcookie($this->session_name""0"/");
  95.                 $this->session_start false;
  96.             }
  97.  
  98.             // check anonymous
  99.             if ($this->get('__anonymous__')) {
  100.                 $this->anonymous true;
  101.             }
  102.         }
  103.     }
  104.  
  105.     /**
  106.      *  セッションの正当性チェック
  107.      *
  108.      *  @access public
  109.      *  @return bool    true:正当なセッション false:不当なセッション
  110.      */
  111.     function isValid()
  112.     {
  113.         if (!$this->session_start{
  114.             if (!empty($_COOKIE[$this->session_name]|| session_id(!= null{
  115.                 setcookie($this->session_name""0"/");
  116.             }
  117.             return false;
  118.         }
  119.  
  120.         // check remote address
  121.         if (!isset($_SESSION['REMOTE_ADDR'])
  122.             || $this->_validateRemoteAddr($_SESSION['REMOTE_ADDR'],
  123.                                           $_SERVER['REMOTE_ADDR']== false{
  124.             // we do not allow this
  125.             setcookie($this->session_name""0"/");
  126.             session_destroy();
  127.             $this->session_start false;
  128.             return false;
  129.         }
  130.  
  131.         return true;
  132.     }
  133.  
  134.     /**
  135.      *  セッションを開始する
  136.      *
  137.      *  @access public
  138.      *  @param  int     $lifetime   セッション有効期間(秒単位, 0ならセッションクッキー)
  139.      *  @return bool    true:正常終了 false:エラー
  140.      */
  141.     function start($lifetime 0$anonymous false)
  142.     {
  143.         if ($this->session_start{
  144.             // we need this?
  145.             $_SESSION['REMOTE_ADDR'$_SERVER['REMOTE_ADDR'];
  146.             $_SESSION['__anonymous__'$anonymous;
  147.             return true;
  148.         }
  149.  
  150.         if (is_null($lifetime)) {
  151.             ini_set('session.use_cookies'0);
  152.         else {
  153.             ini_set('session.use_cookies'1);
  154.         }
  155.  
  156.         session_set_cookie_params($lifetime);
  157.         session_id(Ethna_Util::getRandom());
  158.         session_start();
  159.         $_SESSION['REMOTE_ADDR'= isset($_SERVER['REMOTE_ADDR']$_SERVER['REMOTE_ADDR']false;
  160.         $_SESSION['__anonymous__'$anonymous;
  161.         $this->anonymous $anonymous;
  162.         $this->session_start true;
  163.  
  164.         return true;
  165.     }
  166.  
  167.     /**
  168.      *  セッションを破棄する
  169.      *
  170.      *  @access public
  171.      *  @return bool    true:正常終了 false:エラー
  172.      */
  173.     function destroy()
  174.     {
  175.         if (!$this->session_start{
  176.             return true;
  177.         }
  178.         
  179.         session_destroy();
  180.         $this->session_start false;
  181.         setcookie($this->session_name""0"/");
  182.  
  183.         return true;
  184.     }
  185.  
  186.     /**
  187.      *  セッションIDを再生成する
  188.      *
  189.      *  @access public
  190.      *  @return bool    true:正常終了 false:エラー
  191.      */
  192.     function regenerateId($lifetime 0$anonymous false)
  193.     {
  194.         if ($this->session_start{
  195.             return false;
  196.         }
  197.        
  198.         $tmp $_SESSION;
  199.  
  200.         $this->destroy();
  201.         $this->start($lifetime$anonymous);
  202.         
  203.         unset($tmp['REMOTE_ADDR']);
  204.         unset($tmp['__anonymous__']);
  205.         foreach ($tmp as $key => $value{
  206.             $_SESSION[$key$value;
  207.         }
  208.  
  209.         return true;
  210.     }
  211.  
  212.     /**
  213.      *  セッション値へのアクセサ(R)
  214.      *
  215.      *  @access public
  216.      *  @param  string  $name   キー
  217.      *  @return mixed   取得した値(null:セッションが開始されていない)
  218.      */
  219.     function get($name)
  220.     {
  221.         if (!$this->session_start{
  222.             return null;
  223.         }
  224.  
  225.         if (!isset($_SESSION[$name])) {
  226.             return null;
  227.         }
  228.         return $_SESSION[$name];
  229.     }
  230.  
  231.     /**
  232.      *  セッション値へのアクセサ(W)
  233.      *
  234.      *  @access public
  235.      *  @param  string  $name   キー
  236.      *  @param  string  $value  値
  237.      *  @return bool    true:正常終了 false:エラー(セッションが開始されていない)
  238.      */
  239.     function set($name$value)
  240.     {
  241.         if (!$this->session_start{
  242.             // no way
  243.             return false;
  244.         }
  245.  
  246.         $_SESSION[$name$value;
  247.  
  248.         return true;
  249.     }
  250.  
  251.     /**
  252.      *  セッションの値を破棄する
  253.      *
  254.      *  @access public
  255.      *  @param  string  $name   キー
  256.      *  @return bool    true:正常終了 false:エラー(セッションが開始されていない)
  257.      */
  258.     function remove($name)
  259.     {
  260.         if (!$this->session_start{
  261.             return false;
  262.         }
  263.  
  264.         unset($_SESSION[$name]);
  265.  
  266.         return true;
  267.     }
  268.  
  269.     /**
  270.      *  セッションが開始されているかどうかを返す
  271.      *
  272.      *  @access public
  273.      *  @param  string  $anonymous  匿名セッションを「開始」とみなすかどうか(default: false)
  274.      *  @return bool    true:開始済み false:開始されていない
  275.      */
  276.     function isStart($anonymous false)
  277.     {
  278.         if ($anonymous{
  279.             return $this->session_start;
  280.         else {
  281.             if ($this->session_start && $this->isAnonymous(!= true{
  282.                 return true;
  283.             else {
  284.                 return false;
  285.             }
  286.         }
  287.     }
  288.  
  289.     /**
  290.      *  匿名セッションかどうかを返す
  291.      *
  292.      *  @access public
  293.      *  @return bool    true:匿名セッション false:非匿名セッション/セッション開始されていない
  294.      */
  295.     function isAnonymous()
  296.     {
  297.         return $this->anonymous;
  298.     }
  299.  
  300.     /**
  301.      *  セッションに保存されたIPアドレスとアクセス元のIPアドレスが
  302.      *  同一ネットワーク範囲かどうかを判別する(16bit mask)
  303.      *
  304.      *  @access private
  305.      *  @param  string  $src_ip     セッション開始時のアクセス元IPアドレス
  306.      *  @param  string  $dst_ip     現在のアクセス元IPアドレス
  307.      *  @return bool    true:正常終了 false:不正なIPアドレス
  308.      */
  309.     function _validateRemoteAddr($src_ip$dst_ip)
  310.     {
  311.         $src ip2long($src_ip);
  312.         $dst ip2long($dst_ip);
  313.  
  314.         if (($src 0xffff0000== ($dst 0xffff0000)) {
  315.             return true;
  316.         else {
  317.             $this->logger->log(LOG_NOTICE"session IP validation failed [%s] - [%s]",
  318.                                $src_ip$dst_ip);
  319.             return false;
  320.         }
  321.     }
  322. }
  323. // }}}
  324. ?>

Documentation generated on Fri, 11 Nov 2011 04:00:52 +0900 by phpDocumentor 1.4.3