blob: d6eab9be3280545f54f258534cb84cb4fd7d7564 [file] [log] [blame]
Andrey Andreev47a47fb2014-05-31 16:08:30 +03001<?php
2/**
3 * CodeIgniter
4 *
Ivan Tcholakov90da83c2015-01-19 17:23:08 +02005 * An open source application development framework for PHP
Andrey Andreev47a47fb2014-05-31 16:08:30 +03006 *
Andrey Andreev46f2f262014-11-11 14:37:51 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev47a47fb2014-05-31 16:08:30 +03008 *
Andrey Andreevcce6bd12018-01-09 11:32:02 +02009 * Copyright (c) 2014 - 2018, British Columbia Institute of Technology
Andrey Andreev47a47fb2014-05-31 16:08:30 +030010 *
Andrey Andreev46f2f262014-11-11 14:37:51 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Andrey Andreev47a47fb2014-05-31 16:08:30 +030017 *
Andrey Andreev46f2f262014-11-11 14:37:51 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
Andrey Andreev1924e872016-01-11 12:55:34 +020031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
Andrey Andreevcce6bd12018-01-09 11:32:02 +020032 * @copyright Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreev46f2f262014-11-11 14:37:51 +020033 * @license http://opensource.org/licenses/MIT MIT License
Andrey Andreevbd202c92016-01-11 12:50:18 +020034 * @link https://codeigniter.com
Andrey Andreev46f2f262014-11-11 14:37:51 +020035 * @since Version 3.0.0
Andrey Andreev47a47fb2014-05-31 16:08:30 +030036 * @filesource
37 */
38defined('BASEPATH') OR exit('No direct script access allowed');
39
40/**
41 * CodeIgniter Session Driver Class
42 *
Andrey Andreev46f2f262014-11-11 14:37:51 +020043 * @package CodeIgniter
Andrey Andreev47a47fb2014-05-31 16:08:30 +030044 * @subpackage Libraries
45 * @category Sessions
Andrey Andreev46f2f262014-11-11 14:37:51 +020046 * @author Andrey Andreev
Andrey Andreevbd202c92016-01-11 12:50:18 +020047 * @link https://codeigniter.com/user_guide/libraries/sessions.html
Andrey Andreev47a47fb2014-05-31 16:08:30 +030048 */
49abstract class CI_Session_driver implements SessionHandlerInterface {
50
Andrey Andreevdfb39be2014-10-06 01:50:14 +030051 protected $_config;
Andrey Andreev47a47fb2014-05-31 16:08:30 +030052
53 /**
Andrey Andreev93d9fa72014-08-27 22:14:36 +030054 * Data fingerprint
Andrey Andreev47a47fb2014-05-31 16:08:30 +030055 *
56 * @var bool
57 */
58 protected $_fingerprint;
59
Andrey Andreev93d9fa72014-08-27 22:14:36 +030060 /**
61 * Lock placeholder
62 *
63 * @var mixed
64 */
65 protected $_lock = FALSE;
66
Andrey Andreev7474a672014-10-31 23:35:32 +020067 /**
68 * Read session ID
69 *
70 * Used to detect session_regenerate_id() calls because PHP only calls
71 * write() after regenerating the ID.
72 *
73 * @var string
74 */
75 protected $_session_id;
76
Andrey Andreevaf849692015-12-12 14:07:39 +020077 /**
78 * Success and failure return values
79 *
80 * Necessary due to a bug in all PHP 5 versions where return values
81 * from userspace handlers are not handled properly. PHP 7 fixes the
82 * bug, so we need to return different values depending on the version.
83 *
84 * @see https://wiki.php.net/rfc/session.user.return-value
85 * @var mixed
86 */
87 protected $_success, $_failure;
88
Andrey Andreev47a47fb2014-05-31 16:08:30 +030089 // ------------------------------------------------------------------------
90
91 /**
92 * Class constructor
93 *
94 * @param array $params Configuration parameters
95 * @return void
96 */
Andrey Andreevdfb39be2014-10-06 01:50:14 +030097 public function __construct(&$params)
Andrey Andreev47a47fb2014-05-31 16:08:30 +030098 {
Andrey Andreevdfb39be2014-10-06 01:50:14 +030099 $this->_config =& $params;
Andrey Andreevaf849692015-12-12 14:07:39 +0200100
101 if (is_php('7'))
102 {
103 $this->_success = TRUE;
104 $this->_failure = FALSE;
105 }
106 else
107 {
108 $this->_success = 0;
109 $this->_failure = -1;
110 }
Andrey Andreev47a47fb2014-05-31 16:08:30 +0300111 }
112
113 // ------------------------------------------------------------------------
114
Andrey Andreev10411fc2015-01-19 13:54:53 +0200115 /**
Andrey Andreeva9da3dd2018-06-12 16:40:12 +0300116 * PHP 5.x validate ID
117 *
Andrey Andreev99225a02018-08-22 14:28:44 +0300118 * Enforces session.use_strict_mode
Andrey Andreeva9da3dd2018-06-12 16:40:12 +0300119 *
120 * @return void
121 */
122 public function php5_validate_id()
123 {
Michiel Vugteveend3e92732018-08-07 15:23:21 +0200124 if (isset($_COOKIE[$this->_config['cookie_name']]) && ! $this->validateSessionId($_COOKIE[$this->_config['cookie_name']]))
Andrey Andreeva9da3dd2018-06-12 16:40:12 +0300125 {
126 unset($_COOKIE[$this->_config['cookie_name']]);
127 }
128 }
129
130 // ------------------------------------------------------------------------
131
132 /**
Andrey Andreev10411fc2015-01-19 13:54:53 +0200133 * Cookie destroy
134 *
135 * Internal method to force removal of a cookie by the client
136 * when session_destroy() is called.
137 *
138 * @return bool
139 */
Andrey Andreev47a47fb2014-05-31 16:08:30 +0300140 protected function _cookie_destroy()
141 {
142 return setcookie(
Andrey Andreevdfb39be2014-10-06 01:50:14 +0300143 $this->_config['cookie_name'],
Andrey Andreev47a47fb2014-05-31 16:08:30 +0300144 NULL,
145 1,
Andrey Andreevdfb39be2014-10-06 01:50:14 +0300146 $this->_config['cookie_path'],
147 $this->_config['cookie_domain'],
148 $this->_config['cookie_secure'],
149 TRUE
Andrey Andreev47a47fb2014-05-31 16:08:30 +0300150 );
151 }
152
Andrey Andreev93d9fa72014-08-27 22:14:36 +0300153 // ------------------------------------------------------------------------
154
155 /**
156 * Get lock
157 *
Andrey Andreev19c25242015-01-14 22:13:36 +0200158 * A dummy method allowing drivers with no locking functionality
159 * (databases other than PostgreSQL and MySQL) to act as if they
160 * do acquire a lock.
Andrey Andreev93d9fa72014-08-27 22:14:36 +0300161 *
162 * @param string $session_id
163 * @return bool
164 */
165 protected function _get_lock($session_id)
166 {
Andrey Andreev19c25242015-01-14 22:13:36 +0200167 $this->_lock = TRUE;
Andrey Andreev93d9fa72014-08-27 22:14:36 +0300168 return TRUE;
169 }
170
171 // ------------------------------------------------------------------------
172
173 /**
174 * Release lock
175 *
176 * @return bool
177 */
178 protected function _release_lock()
179 {
Andrey Andreev19c25242015-01-14 22:13:36 +0200180 if ($this->_lock)
Andrey Andreev93d9fa72014-08-27 22:14:36 +0300181 {
Andrey Andreev93d9fa72014-08-27 22:14:36 +0300182 $this->_lock = FALSE;
183 }
184
185 return TRUE;
186 }
187
Andrey Andreeva027a7f2016-03-10 13:59:20 +0200188 // ------------------------------------------------------------------------
189
190 /**
191 * Fail
192 *
193 * Drivers other than the 'files' one don't (need to) use the
194 * session.save_path INI setting, but that leads to confusing
195 * error messages emitted by PHP when open() or write() fail,
196 * as the message contains session.save_path ...
197 * To work around the problem, the drivers will call this method
198 * so that the INI is set just in time for the error message to
199 * be properly generated.
200 *
201 * @return mixed
202 */
203 protected function _fail()
204 {
205 ini_set('session.save_path', config_item('sess_save_path'));
206 return $this->_failure;
207 }
Andrey Andreev47a47fb2014-05-31 16:08:30 +0300208}