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: Ethna_Session.php 417 2006-11-17 09:03:53Z cocoitiban $
  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'$_SERVER['REMOTE_ADDR'];
  160.         $_SESSION['__anonymous__'$anonymous;
  161.         $this->session_start true;
  162.  
  163.         return true;
  164.     }
  165.  
  166.     /**
  167.      *  セッションを破棄する
  168.      *
  169.      *  @access public
  170.      *  @return bool    true:正常終了 false:エラー
  171.      */
  172.     function destroy()
  173.     {
  174.         if (!$this->session_start{
  175.             return true;
  176.         }
  177.         
  178.         session_destroy();
  179.         $this->session_start false;
  180.         setcookie($this->session_name""0"/");
  181.  
  182.         return true;
  183.     }
  184.  
  185.     /**
  186.      *  セッションIDを再生成する
  187.      *
  188.      *  @access public
  189.      *  @return bool    true:正常終了 false:エラー
  190.      */
  191.     function regenerateId($lifetime 0$anonymous false)
  192.     {
  193.         if ($this->session_start{
  194.             return false;
  195.         }
  196.        
  197.         $tmp $_SESSION;
  198.  
  199.         $this->destroy();
  200.         $this->start($lifetime$anonymous);
  201.         
  202.         unset($tmp['REMOTE_ADDR']);
  203.         unset($tmp['__anonymous__']);
  204.         foreach ($tmp as $key => $value{
  205.             $_SESSION[$key$value;
  206.         }
  207.  
  208.         return true;
  209.     }
  210.  
  211.     /**
  212.      *  セッション値へのアクセサ(R)
  213.      *
  214.      *  @access public
  215.      *  @param  string  $name   キー
  216.      *  @return mixed   取得した値(null:セッションが開始されていない)
  217.      */
  218.     function get($name)
  219.     {
  220.         if (!$this->session_start{
  221.             return null;
  222.         }
  223.  
  224.         if (!isset($_SESSION[$name])) {
  225.             return null;
  226.         }
  227.         return $_SESSION[$name];
  228.     }
  229.  
  230.     /**
  231.      *  セッション値へのアクセサ(W)
  232.      *
  233.      *  @access public
  234.      *  @param  string  $name   キー
  235.      *  @param  string  $value  値
  236.      *  @return bool    true:正常終了 false:エラー(セッションが開始されていない)
  237.      */
  238.     function set($name$value)
  239.     {
  240.         if (!$this->session_start{
  241.             // no way
  242.             return false;
  243.         }
  244.  
  245.         $_SESSION[$name$value;
  246.  
  247.         return true;
  248.     }
  249.  
  250.     /**
  251.      *  セッションの値を破棄する
  252.      *
  253.      *  @access public
  254.      *  @param  string  $name   キー
  255.      *  @return bool    true:正常終了 false:エラー(セッションが開始されていない)
  256.      */
  257.     function remove($name)
  258.     {
  259.         if (!$this->session_start{
  260.             return false;
  261.         }
  262.  
  263.         unset($_SESSION[$name]);
  264.  
  265.         return true;
  266.     }
  267.  
  268.     /**
  269.      *  セッションが開始されているかどうかを返す
  270.      *
  271.      *  @access public
  272.      *  @param  string  $anonymous  匿名セッションを「開始」とみなすかどうか(default: false)
  273.      *  @return bool    true:開始済み false:開始されていない
  274.      */
  275.     function isStart($anonymous false)
  276.     {
  277.         if ($anonymous{
  278.             return $this->session_start;
  279.         else {
  280.             if ($this->session_start && $this->isAnonymous(!= true{
  281.                 return true;
  282.             else {
  283.                 return false;
  284.             }
  285.         }
  286.     }
  287.  
  288.     /**
  289.      *  匿名セッションかどうかを返す
  290.      *
  291.      *  @access public
  292.      *  @return bool    true:匿名セッション false:非匿名セッション/セッション開始されていない
  293.      */
  294.     function isAnonymous()
  295.     {
  296.         return $this->anonymous;
  297.     }
  298.  
  299.     /**
  300.      *  セッションに保存されたIPアドレスとアクセス元のIPアドレスが
  301.      *  同一ネットワーク範囲かどうかを判別する(16bit mask)
  302.      *
  303.      *  @access private
  304.      *  @param  string  $src_ip     セッション開始時のアクセス元IPアドレス
  305.      *  @param  string  $dst_ip     現在のアクセス元IPアドレス
  306.      *  @return bool    true:正常終了 false:不正なIPアドレス
  307.      */
  308.     function _validateRemoteAddr($src_ip$dst_ip)
  309.     {
  310.         $src ip2long($src_ip);
  311.         $dst ip2long($dst_ip);
  312.  
  313.         if (($src 0xffff0000== ($dst 0xffff0000)) {
  314.             return true;
  315.         else {
  316.             $this->logger->log(LOG_NOTICE"session IP validation failed [%s] - [%s]",
  317.                                $src_ip$dst_ip);
  318.             return false;
  319.         }
  320.     }
  321. }
  322. // }}}
  323. ?>

Documentation generated on Thu, 08 May 2008 00:15:27 +0900 by phpDocumentor 1.4.2