summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorAhmad Anbar <aanbar@gmail.com>2015-02-04 18:20:01 +0100
committerAhmad Anbar <aanbar@gmail.com>2015-02-04 18:20:01 +0100
commite5454f9b28f123a5549971f580255a065b2f8cc2 (patch)
treec4927e7b7afb0bf242976034630cc60f2f1db00f /system
parent6db62ab0ad0e223806a1367e12b1884b48dc65d7 (diff)
parenteccac6e6a73a4d1a5b40f383ce64359c2c94ae12 (diff)
Merge remote-tracking branch 'upstream/develop' into develop
Diffstat (limited to 'system')
-rw-r--r--system/core/Benchmark.php3
-rw-r--r--system/core/CodeIgniter.php43
-rw-r--r--system/core/Common.php14
-rw-r--r--system/core/Config.php8
-rw-r--r--system/core/Controller.php5
-rw-r--r--system/core/Exceptions.php3
-rw-r--r--system/core/Hooks.php6
-rw-r--r--system/core/Input.php7
-rw-r--r--system/core/Lang.php7
-rw-r--r--system/core/Loader.php191
-rw-r--r--system/core/Log.php18
-rw-r--r--system/core/Model.php5
-rw-r--r--system/core/Output.php11
-rw-r--r--system/core/Router.php5
-rw-r--r--system/core/Security.php12
-rw-r--r--system/core/URI.php5
-rw-r--r--system/core/Utf8.php5
-rw-r--r--system/core/compat/hash.php3
-rw-r--r--system/core/compat/mbstring.php3
-rw-r--r--system/core/compat/password.php3
-rw-r--r--system/core/compat/standard.php3
-rw-r--r--system/database/DB.php5
-rw-r--r--system/database/DB_cache.php3
-rw-r--r--system/database/DB_driver.php7
-rw-r--r--system/database/DB_forge.php7
-rw-r--r--system/database/DB_query_builder.php5
-rw-r--r--system/database/DB_result.php17
-rw-r--r--system/database/DB_utility.php5
-rw-r--r--system/database/drivers/cubrid/cubrid_driver.php3
-rw-r--r--system/database/drivers/cubrid/cubrid_forge.php3
-rw-r--r--system/database/drivers/cubrid/cubrid_result.php3
-rw-r--r--system/database/drivers/cubrid/cubrid_utility.php3
-rw-r--r--system/database/drivers/ibase/ibase_driver.php3
-rw-r--r--system/database/drivers/ibase/ibase_forge.php3
-rw-r--r--system/database/drivers/ibase/ibase_result.php3
-rw-r--r--system/database/drivers/ibase/ibase_utility.php3
-rw-r--r--system/database/drivers/mssql/mssql_driver.php3
-rw-r--r--system/database/drivers/mssql/mssql_forge.php3
-rw-r--r--system/database/drivers/mssql/mssql_result.php5
-rw-r--r--system/database/drivers/mssql/mssql_utility.php3
-rw-r--r--system/database/drivers/mysql/mysql_driver.php7
-rw-r--r--system/database/drivers/mysql/mysql_forge.php3
-rw-r--r--system/database/drivers/mysql/mysql_result.php3
-rw-r--r--system/database/drivers/mysql/mysql_utility.php3
-rw-r--r--system/database/drivers/mysqli/mysqli_driver.php7
-rw-r--r--system/database/drivers/mysqli/mysqli_forge.php3
-rw-r--r--system/database/drivers/mysqli/mysqli_result.php3
-rw-r--r--system/database/drivers/mysqli/mysqli_utility.php3
-rw-r--r--system/database/drivers/oci8/oci8_driver.php3
-rw-r--r--system/database/drivers/oci8/oci8_forge.php3
-rw-r--r--system/database/drivers/oci8/oci8_result.php3
-rw-r--r--system/database/drivers/oci8/oci8_utility.php3
-rw-r--r--system/database/drivers/odbc/odbc_driver.php3
-rw-r--r--system/database/drivers/odbc/odbc_forge.php3
-rw-r--r--system/database/drivers/odbc/odbc_result.php3
-rw-r--r--system/database/drivers/odbc/odbc_utility.php3
-rw-r--r--system/database/drivers/pdo/pdo_driver.php3
-rw-r--r--system/database/drivers/pdo/pdo_forge.php3
-rw-r--r--system/database/drivers/pdo/pdo_result.php3
-rw-r--r--system/database/drivers/pdo/pdo_utility.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_4d_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_4d_forge.php7
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_informix_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_informix_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php5
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_oci_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_oci_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php3
-rw-r--r--system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php3
-rw-r--r--system/database/drivers/postgre/postgre_driver.php3
-rw-r--r--system/database/drivers/postgre/postgre_forge.php3
-rw-r--r--system/database/drivers/postgre/postgre_result.php3
-rw-r--r--system/database/drivers/postgre/postgre_utility.php3
-rw-r--r--system/database/drivers/sqlite/sqlite_driver.php3
-rw-r--r--system/database/drivers/sqlite/sqlite_forge.php3
-rw-r--r--system/database/drivers/sqlite/sqlite_result.php3
-rw-r--r--system/database/drivers/sqlite/sqlite_utility.php3
-rw-r--r--system/database/drivers/sqlite3/sqlite3_driver.php3
-rw-r--r--system/database/drivers/sqlite3/sqlite3_forge.php3
-rw-r--r--system/database/drivers/sqlite3/sqlite3_result.php5
-rw-r--r--system/database/drivers/sqlite3/sqlite3_utility.php3
-rw-r--r--system/database/drivers/sqlsrv/sqlsrv_driver.php3
-rw-r--r--system/database/drivers/sqlsrv/sqlsrv_forge.php3
-rw-r--r--system/database/drivers/sqlsrv/sqlsrv_result.php3
-rw-r--r--system/database/drivers/sqlsrv/sqlsrv_utility.php3
-rw-r--r--system/helpers/array_helper.php3
-rw-r--r--system/helpers/captcha_helper.php3
-rw-r--r--system/helpers/cookie_helper.php3
-rw-r--r--system/helpers/date_helper.php3
-rw-r--r--system/helpers/directory_helper.php3
-rw-r--r--system/helpers/download_helper.php3
-rw-r--r--system/helpers/email_helper.php3
-rw-r--r--system/helpers/file_helper.php3
-rw-r--r--system/helpers/form_helper.php47
-rw-r--r--system/helpers/html_helper.php3
-rw-r--r--system/helpers/inflector_helper.php3
-rw-r--r--system/helpers/language_helper.php3
-rw-r--r--system/helpers/number_helper.php3
-rw-r--r--system/helpers/path_helper.php3
-rw-r--r--system/helpers/security_helper.php3
-rw-r--r--system/helpers/smiley_helper.php3
-rw-r--r--system/helpers/string_helper.php3
-rw-r--r--system/helpers/text_helper.php3
-rw-r--r--system/helpers/typography_helper.php3
-rw-r--r--system/helpers/url_helper.php3
-rw-r--r--system/helpers/xml_helper.php3
-rw-r--r--system/language/english/calendar_lang.php3
-rw-r--r--system/language/english/date_lang.php3
-rw-r--r--system/language/english/db_lang.php3
-rw-r--r--system/language/english/email_lang.php3
-rw-r--r--system/language/english/form_validation_lang.php4
-rw-r--r--system/language/english/ftp_lang.php3
-rw-r--r--system/language/english/imglib_lang.php3
-rw-r--r--system/language/english/migration_lang.php3
-rw-r--r--system/language/english/number_lang.php3
-rw-r--r--system/language/english/pagination_lang.php3
-rw-r--r--system/language/english/profiler_lang.php3
-rw-r--r--system/language/english/unit_test_lang.php3
-rw-r--r--system/language/english/upload_lang.php3
-rw-r--r--system/libraries/Cache/Cache.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_apc.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_dummy.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_file.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_memcached.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_redis.php3
-rw-r--r--system/libraries/Cache/drivers/Cache_wincache.php3
-rw-r--r--system/libraries/Calendar.php5
-rw-r--r--system/libraries/Cart.php5
-rw-r--r--system/libraries/Driver.php3
-rw-r--r--system/libraries/Email.php5
-rw-r--r--system/libraries/Encrypt.php5
-rw-r--r--system/libraries/Encryption.php13
-rw-r--r--system/libraries/Form_validation.php19
-rw-r--r--system/libraries/Ftp.php5
-rw-r--r--system/libraries/Image_lib.php88
-rw-r--r--system/libraries/Javascript.php5
-rw-r--r--system/libraries/Javascript/Jquery.php5
-rw-r--r--system/libraries/Migration.php5
-rw-r--r--system/libraries/Pagination.php17
-rw-r--r--system/libraries/Parser.php4
-rw-r--r--system/libraries/Profiler.php4
-rw-r--r--system/libraries/Session/Session.php967
-rw-r--r--system/libraries/Session/SessionHandlerInterface.php59
-rw-r--r--system/libraries/Session/Session_driver.php148
-rw-r--r--system/libraries/Session/drivers/Session_cookie.php816
-rw-r--r--system/libraries/Session/drivers/Session_database_driver.php385
-rw-r--r--system/libraries/Session/drivers/Session_files_driver.php352
-rw-r--r--system/libraries/Session/drivers/Session_memcached_driver.php375
-rw-r--r--system/libraries/Session/drivers/Session_native.php257
-rw-r--r--system/libraries/Session/drivers/Session_redis_driver.php395
-rw-r--r--system/libraries/Table.php5
-rw-r--r--system/libraries/Trackback.php5
-rw-r--r--system/libraries/Typography.php4
-rw-r--r--system/libraries/Unit_test.php5
-rw-r--r--system/libraries/Upload.php8
-rw-r--r--system/libraries/User_agent.php5
-rw-r--r--system/libraries/Xmlrpc.php5
-rw-r--r--system/libraries/Xmlrpcs.php5
-rw-r--r--system/libraries/Zip.php5
174 files changed, 2579 insertions, 2221 deletions
diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php
index 86f3ae1aa..e420f62a1 100644
--- a/system/core/Benchmark.php
+++ b/system/core/Benchmark.php
@@ -131,6 +131,3 @@ class CI_Benchmark {
}
}
-
-/* End of file Benchmark.php */
-/* Location: ./system/core/Benchmark.php */ \ No newline at end of file
diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php
index 59fdba0e5..d830c1829 100644
--- a/system/core/CodeIgniter.php
+++ b/system/core/CodeIgniter.php
@@ -159,6 +159,29 @@ if ( ! is_php('5.4'))
/*
* ------------------------------------------------------
+ * Should we use a Composer autoloader?
+ * ------------------------------------------------------
+ */
+ if ($composer_autoload = config_item('composer_autoload'))
+ {
+ if ($composer_autoload === TRUE)
+ {
+ file_exists(APPPATH.'vendor/autoload.php')
+ ? require_once(APPPATH.'vendor/autoload.php')
+ : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.');
+ }
+ elseif (file_exists($composer_autoload))
+ {
+ require_once($composer_autoload);
+ }
+ else
+ {
+ log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload);
+ }
+ }
+
+/*
+ * ------------------------------------------------------
* Start the timer... tick tock tick tock...
* ------------------------------------------------------
*/
@@ -461,23 +484,6 @@ if ( ! is_php('5.4'))
/*
* ------------------------------------------------------
- * Should we use a Composer autoloader?
- * ------------------------------------------------------
- */
- if ($composer_autoload = config_item('composer_autoload'))
- {
- if ($composer_autoload === TRUE && file_exists(APPPATH.'vendor/autoload.php'))
- {
- require_once(APPPATH.'vendor/autoload.php');
- }
- elseif (file_exists($composer_autoload))
- {
- require_once($composer_autoload);
- }
- }
-
-/*
- * ------------------------------------------------------
* Is there a "pre_controller" hook?
* ------------------------------------------------------
*/
@@ -533,6 +539,3 @@ if ( ! is_php('5.4'))
* ------------------------------------------------------
*/
$EXT->call_hook('post_system');
-
-/* End of file CodeIgniter.php */
-/* Location: ./system/core/CodeIgniter.php */ \ No newline at end of file
diff --git a/system/core/Common.php b/system/core/Common.php
index b5a36636e..c3198b31f 100644
--- a/system/core/Common.php
+++ b/system/core/Common.php
@@ -54,7 +54,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
if ( ! function_exists('is_php'))
{
/**
- * Determines if the current version of PHP is greater then the supplied value
+ * Determines if the current version of PHP is equal to or greater than the supplied value
*
* @param string
* @return bool TRUE if the current version is $version or higher
@@ -555,15 +555,14 @@ if ( ! function_exists('set_status_header'))
}
}
- $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : FALSE;
-
if (strpos(PHP_SAPI, 'cgi') === 0)
{
header('Status: '.$code.' '.$text, TRUE);
}
else
{
- header(($server_protocol ? $server_protocol : 'HTTP/1.1').' '.$code.' '.$text, TRUE, $code);
+ $server_protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
+ header($server_protocol.' '.$code.' '.$text, TRUE, $code);
}
}
}
@@ -615,7 +614,7 @@ if ( ! function_exists('_error_handler'))
$_error->log_exception($severity, $message, $filepath, $line);
// Should we display the error?
- if (ini_get('display_errors'))
+ if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))
{
$_error->show_php_error($severity, $message, $filepath, $line);
}
@@ -650,7 +649,7 @@ if ( ! function_exists('_exception_handler'))
$_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine());
// Should we display the error?
- if (ini_get('display_errors'))
+ if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors')))
{
$_error->show_exception($exception);
}
@@ -842,6 +841,3 @@ if ( ! function_exists('function_usable'))
return FALSE;
}
}
-
-/* End of file Common.php */
-/* Location: ./system/core/Common.php */ \ No newline at end of file
diff --git a/system/core/Config.php b/system/core/Config.php
index d5ce91f48..a191a7727 100644
--- a/system/core/Config.php
+++ b/system/core/Config.php
@@ -72,6 +72,8 @@ class CI_Config {
*/
public $_config_paths = array(APPPATH);
+ // --------------------------------------------------------------------
+
/**
* Class constructor
*
@@ -82,7 +84,6 @@ class CI_Config {
public function __construct()
{
$this->config =& get_config();
- log_message('debug', 'Config Class Initialized');
// Set the base_url automatically if none was provided
if (empty($this->config['base_url']))
@@ -101,6 +102,8 @@ class CI_Config {
$this->set_item('base_url', $base_url);
}
+
+ log_message('info', 'Config Class Initialized');
}
// --------------------------------------------------------------------
@@ -356,6 +359,3 @@ class CI_Config {
}
}
-
-/* End of file Config.php */
-/* Location: ./system/core/Config.php */ \ No newline at end of file
diff --git a/system/core/Controller.php b/system/core/Controller.php
index 06005b058..a0d97baa2 100644
--- a/system/core/Controller.php
+++ b/system/core/Controller.php
@@ -77,7 +77,7 @@ class CI_Controller {
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
- log_message('debug', 'Controller Class Initialized');
+ log_message('info', 'Controller Class Initialized');
}
// --------------------------------------------------------------------
@@ -94,6 +94,3 @@ class CI_Controller {
}
}
-
-/* End of file Controller.php */
-/* Location: ./system/core/Controller.php */ \ No newline at end of file
diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php
index 550e03b78..fc25f57e6 100644
--- a/system/core/Exceptions.php
+++ b/system/core/Exceptions.php
@@ -273,6 +273,3 @@ class CI_Exceptions {
}
}
-
-/* End of file Exceptions.php */
-/* Location: ./system/core/Exceptions.php */ \ No newline at end of file
diff --git a/system/core/Hooks.php b/system/core/Hooks.php
index 429d6bceb..08479b133 100644
--- a/system/core/Hooks.php
+++ b/system/core/Hooks.php
@@ -88,8 +88,7 @@ class CI_Hooks {
public function __construct()
{
$CFG =& load_class('Config', 'core');
-
- log_message('debug', 'Hooks Class Initialized');
+ log_message('info', 'Hooks Class Initialized');
// If hooks are not enabled in the config file
// there is nothing else to do
@@ -265,6 +264,3 @@ class CI_Hooks {
}
}
-
-/* End of file Hooks.php */
-/* Location: ./system/core/Hooks.php */ \ No newline at end of file
diff --git a/system/core/Input.php b/system/core/Input.php
index 358417c79..72425c1c1 100644
--- a/system/core/Input.php
+++ b/system/core/Input.php
@@ -123,8 +123,6 @@ class CI_Input {
*/
public function __construct()
{
- log_message('debug', 'Input Class Initialized');
-
$this->_allow_get_array = (config_item('allow_get_array') === TRUE);
$this->_enable_xss = (config_item('global_xss_filtering') === TRUE);
$this->_enable_csrf = (config_item('csrf_protection') === TRUE);
@@ -140,6 +138,8 @@ class CI_Input {
// Sanitize global arrays
$this->_sanitize_globals();
+
+ log_message('info', 'Input Class Initialized');
}
// --------------------------------------------------------------------
@@ -847,6 +847,3 @@ class CI_Input {
}
}
-
-/* End of file Input.php */
-/* Location: ./system/core/Input.php */ \ No newline at end of file
diff --git a/system/core/Lang.php b/system/core/Lang.php
index fe1dc1a9d..deb955414 100644
--- a/system/core/Lang.php
+++ b/system/core/Lang.php
@@ -69,7 +69,7 @@ class CI_Lang {
*/
public function __construct()
{
- log_message('debug', 'Language Class Initialized');
+ log_message('info', 'Language Class Initialized');
}
// --------------------------------------------------------------------
@@ -172,7 +172,7 @@ class CI_Lang {
$this->is_loaded[$langfile] = $idiom;
$this->language = array_merge($this->language, $lang);
- log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile);
+ log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile);
return TRUE;
}
@@ -201,6 +201,3 @@ class CI_Lang {
}
}
-
-/* End of file Lang.php */
-/* Location: ./system/core/Lang.php */ \ No newline at end of file
diff --git a/system/core/Loader.php b/system/core/Loader.php
index d930dbfa8..ff7838640 100644
--- a/system/core/Loader.php
+++ b/system/core/Loader.php
@@ -138,7 +138,7 @@ class CI_Loader {
$this->_ci_ob_level = ob_get_level();
$this->_ci_classes =& is_loaded();
- log_message('debug', 'Loader Class Initialized');
+ log_message('info', 'Loader Class Initialized');
}
// --------------------------------------------------------------------
@@ -215,7 +215,7 @@ class CI_Loader {
$params = NULL;
}
- $this->_ci_load_class($library, $params, $object_name);
+ $this->_ci_load_library($library, $params, $object_name);
return $this;
}
@@ -577,7 +577,7 @@ class CI_Loader {
include_once($base_helper);
$this->_ci_helpers[$helper] = TRUE;
- log_message('debug', 'Helper loaded: '.$helper);
+ log_message('info', 'Helper loaded: '.$helper);
continue;
}
@@ -589,7 +589,7 @@ class CI_Loader {
include_once($path.'helpers/'.$helper.'.php');
$this->_ci_helpers[$helper] = TRUE;
- log_message('debug', 'Helper loaded: '.$helper);
+ log_message('info', 'Helper loaded: '.$helper);
break;
}
}
@@ -914,7 +914,7 @@ class CI_Loader {
include($_ci_path); // include() vs include_once() allows for multiple views with the same name
}
- log_message('debug', 'File loaded: '.$_ci_path);
+ log_message('info', 'File loaded: '.$_ci_path);
// Return the file data if requested
if ($_ci_return === TRUE)
@@ -949,17 +949,17 @@ class CI_Loader {
// --------------------------------------------------------------------
/**
- * Internal CI Class Loader
+ * Internal CI Library Loader
*
* @used-by CI_Loader::library()
- * @uses CI_Loader::_ci_init_class()
+ * @uses CI_Loader::_ci_init_library()
*
* @param string $class Class name to load
* @param mixed $params Optional parameters to pass to the class constructor
* @param string $object_name Optional object name to assign to
* @return void
*/
- protected function _ci_load_class($class, $params = NULL, $object_name = NULL)
+ protected function _ci_load_library($class, $params = NULL, $object_name = NULL)
{
// Get the class name, and while we're at it trim any slashes.
// The directory path can be included as part of the class name,
@@ -982,47 +982,22 @@ class CI_Loader {
}
$class = ucfirst($class);
- $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php';
- // Is this a class extension request?
- if (file_exists($subclass))
+ // Is this a stock library? There are a few special conditions if so ...
+ if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php'))
{
- $baseclass = BASEPATH.'libraries/'.$subdir.$class.'.php';
-
- if ( ! file_exists($baseclass))
- {
- log_message('error', 'Unable to load the requested class: '.$class);
- show_error('Unable to load the requested class: '.$class);
- }
-
- // Safety: Was the class already loaded by a previous call?
- if (class_exists(config_item('subclass_prefix').$class, FALSE))
- {
- // Before we deem this to be a duplicate request, let's see
- // if a custom object name is being supplied. If so, we'll
- // return a new instance of the object
- if ($object_name !== NULL)
- {
- $CI =& get_instance();
- if ( ! isset($CI->$object_name))
- {
- return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
- }
- }
-
- log_message('debug', $class.' class already loaded. Second attempt ignored.');
- return;
- }
-
- include_once($baseclass);
- include_once($subclass);
-
- return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name);
+ return $this->_ci_load_stock_library($class, $subdir, $params, $object_name);
}
// Let's search for the requested library file and load it.
foreach ($this->_ci_library_paths as $path)
{
+ // BASEPATH has already been checked for
+ if ($path === BASEPATH)
+ {
+ continue;
+ }
+
$filepath = $path.'libraries/'.$subdir.$class.'.php';
// Safety: Was the class already loaded by a previous call?
@@ -1036,7 +1011,7 @@ class CI_Loader {
$CI =& get_instance();
if ( ! isset($CI->$object_name))
{
- return $this->_ci_init_class($class, '', $params, $object_name);
+ return $this->_ci_init_library($class, '', $params, $object_name);
}
}
@@ -1050,13 +1025,13 @@ class CI_Loader {
}
include_once($filepath);
- return $this->_ci_init_class($class, '', $params, $object_name);
+ return $this->_ci_init_library($class, '', $params, $object_name);
}
// One last attempt. Maybe the library is in a subdirectory, but it wasn't specified?
if ($subdir === '')
{
- return $this->_ci_load_class($class.'/'.$class, $params, $object_name);
+ return $this->_ci_load_library($class.'/'.$class, $params, $object_name);
}
// If we got this far we were unable to find the requested class.
@@ -1067,9 +1042,84 @@ class CI_Loader {
// --------------------------------------------------------------------
/**
- * Internal CI Class Instantiator
+ * Internal CI Stock Library Loader
+ *
+ * @used-by CI_Loader::_ci_load_library()
+ * @uses CI_Loader::_ci_init_library()
+ *
+ * @param string $library Library name to load
+ * @param string $file_path Path to the library filename, relative to libraries/
+ * @param mixed $params Optional parameters to pass to the class constructor
+ * @param string $object_name Optional object name to assign to
+ * @return void
+ */
+ protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name)
+ {
+ $prefix = 'CI_';
+
+ if (class_exists($prefix.$library_name, FALSE))
+ {
+ if (class_exists(config_item('subclass_prefix').$library_name, FALSE))
+ {
+ $prefix = config_item('subclass_prefix');
+ }
+
+ // Before we deem this to be a duplicate request, let's see
+ // if a custom object name is being supplied. If so, we'll
+ // return a new instance of the object
+ if ($object_name !== NULL)
+ {
+ $CI =& get_instance();
+ if ( ! isset($CI->$object_name))
+ {
+ return $this->_ci_init_library($library_name, $prefix, $params, $object_name);
+ }
+ }
+
+ log_message('debug', $library_name.' class already loaded. Second attempt ignored.');
+ return;
+ }
+ elseif (file_exists(APPPATH.'libraries/'.$file_path.$library_name.'.php'))
+ {
+ // Override
+ include_once(APPPATH.'libraries/'.$file_path.$library_name.'.php');
+ if (class_exists($prefix.$library_name, FALSE))
+ {
+ return $this->_ci_init_library($library_name, $prefix, $params, $object_name);
+ }
+ else
+ {
+ log_message('debug', APPPATH.'libraries/'.$file_path.$library_name.'.php exists, but does not declare '.$prefix.$library_name);
+ }
+ }
+
+ include_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php');
+
+ // Check for extensions
+ $subclass = config_item('subclass_prefix').$library_name;
+ if (file_exists(APPPATH.'libraries/'.$file_path.$subclass.'.php'))
+ {
+ include_once(APPPATH.'libraries/'.$file_path.$subclass.'.php');
+ if (class_exists($subclass, FALSE))
+ {
+ $prefix = config_item('subclass_prefix');
+ }
+ else
+ {
+ log_message('debug', APPPATH.'libraries/'.$file_path.$subclass.'.php exists, but does not declare '.$subclass);
+ }
+ }
+
+ return $this->_ci_init_library($library_name, $prefix, $params, $object_name);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
+ * Internal CI Library Instantiator
*
- * @used-by CI_Loader::_ci_load_class()
+ * @used-by CI_Loader::_ci_load_stock_library()
+ * @used-by CI_Loader::_ci_load_library()
*
* @param string $class Class name
* @param string $prefix Class name prefix
@@ -1080,7 +1130,7 @@ class CI_Loader {
* @param string $object_name Optional object name to assign to
* @return void
*/
- protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL)
+ protected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL)
{
// Is there an associated config file for this class? Note: these should always be lowercase
if ($config === NULL)
@@ -1128,31 +1178,13 @@ class CI_Loader {
}
}
- if ($prefix === '')
- {
- if (class_exists('CI_'.$class, FALSE))
- {
- $name = 'CI_'.$class;
- }
- elseif (class_exists(config_item('subclass_prefix').$class, FALSE))
- {
- $name = config_item('subclass_prefix').$class;
- }
- else
- {
- $name = $class;
- }
- }
- else
- {
- $name = $prefix.$class;
- }
+ $class_name = $prefix.$class;
// Is the class name valid?
- if ( ! class_exists($name, FALSE))
+ if ( ! class_exists($class_name, FALSE))
{
- log_message('error', 'Non-existent class: '.$name);
- show_error('Non-existent class: '.$name);
+ log_message('error', 'Non-existent class: '.$class_name);
+ show_error('Non-existent class: '.$class_name);
}
// Set the variable name we will assign the class to
@@ -1170,13 +1202,13 @@ class CI_Loader {
$CI =& get_instance();
if (isset($CI->$object_name))
{
- if ($CI->$object_name instanceof $name)
+ if ($CI->$object_name instanceof $class_name)
{
- log_message('debug', $class." has already been instantiated as '".$object_name."'. Second attempt aborted.");
+ log_message('debug', $class_name." has already been instantiated as '".$object_name."'. Second attempt aborted.");
return;
}
- show_error("Resource '".$object_name."' already exists and is not a ".$class." instance.");
+ show_error("Resource '".$object_name."' already exists and is not a ".$class_name." instance.");
}
// Save the class name and object name
@@ -1184,8 +1216,8 @@ class CI_Loader {
// Instantiate the class
$CI->$object_name = isset($config)
- ? new $name($config)
- : new $name();
+ ? new $class_name($config)
+ : new $class_name();
}
// --------------------------------------------------------------------
@@ -1200,7 +1232,11 @@ class CI_Loader {
*/
protected function _ci_autoloader()
{
- include(APPPATH.'config/autoload.php');
+ if (file_exists(APPPATH.'config/autoload.php'))
+ {
+ include(APPPATH.'config/autoload.php');
+ }
+
if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
{
include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
@@ -1333,6 +1369,3 @@ class CI_Loader {
}
}
-
-/* End of file Loader.php */
-/* Location: ./system/core/Loader.php */ \ No newline at end of file
diff --git a/system/core/Log.php b/system/core/Log.php
index 7d318ed57..833316273 100644
--- a/system/core/Log.php
+++ b/system/core/Log.php
@@ -198,7 +198,20 @@ class CI_Log {
return FALSE;
}
- $message .= $level.' - '.date($this->_date_fmt).' --> '.$msg."\n";
+ // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format
+ if (strpos($this->_date_fmt, 'u') !== FALSE)
+ {
+ $microtime_full = microtime(TRUE);
+ $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000);
+ $date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full));
+ $date = $date->format($this->_date_fmt);
+ }
+ else
+ {
+ $date = date($this->_date_fmt);
+ }
+
+ $message .= $level.' - '.$date.' --> '.$msg."\n";
flock($fp, LOCK_EX);
@@ -222,6 +235,3 @@ class CI_Log {
}
}
-
-/* End of file Log.php */
-/* Location: ./system/core/Log.php */ \ No newline at end of file
diff --git a/system/core/Model.php b/system/core/Model.php
index 1cb00f742..a0469de11 100644
--- a/system/core/Model.php
+++ b/system/core/Model.php
@@ -55,7 +55,7 @@ class CI_Model {
*/
public function __construct()
{
- log_message('debug', 'Model Class Initialized');
+ log_message('info', 'Model Class Initialized');
}
// --------------------------------------------------------------------
@@ -78,6 +78,3 @@ class CI_Model {
}
}
-
-/* End of file Model.php */
-/* Location: ./system/core/Model.php */ \ No newline at end of file
diff --git a/system/core/Output.php b/system/core/Output.php
index beac6b377..02f66936c 100644
--- a/system/core/Output.php
+++ b/system/core/Output.php
@@ -141,7 +141,7 @@ class CI_Output {
// Get mime types for later
$this->mimes =& get_mimes();
- log_message('debug', 'Output Class Initialized');
+ log_message('info', 'Output Class Initialized');
}
// --------------------------------------------------------------------
@@ -391,7 +391,7 @@ class CI_Output {
/**
* Display Output
*
- * Processes sends the sends finalized output data to the browser along
+ * Processes and sends finalized output data to the browser along
* with any server headers and profile data. It also stops benchmark
* timers so the page rendering speed and memory usage can be shown.
*
@@ -491,7 +491,7 @@ class CI_Output {
}
echo $output;
- log_message('debug', 'Final output sent to browser');
+ log_message('info', 'Final output sent to browser');
log_message('debug', 'Total execution time: '.$elapsed);
return;
}
@@ -528,7 +528,7 @@ class CI_Output {
echo $output; // Send it to the browser!
}
- log_message('debug', 'Final output sent to browser');
+ log_message('info', 'Final output sent to browser');
log_message('debug', 'Total execution time: '.$elapsed);
}
@@ -777,6 +777,3 @@ class CI_Output {
}
}
-
-/* End of file Output.php */
-/* Location: ./system/core/Output.php */ \ No newline at end of file
diff --git a/system/core/Router.php b/system/core/Router.php
index b21335fc2..eb3da2285 100644
--- a/system/core/Router.php
+++ b/system/core/Router.php
@@ -147,7 +147,7 @@ class CI_Router {
}
}
- log_message('debug', 'Router Class Initialized');
+ log_message('info', 'Router Class Initialized');
}
// --------------------------------------------------------------------
@@ -525,6 +525,3 @@ class CI_Router {
}
}
-
-/* End of file Router.php */
-/* Location: ./system/core/Router.php */ \ No newline at end of file
diff --git a/system/core/Security.php b/system/core/Security.php
index 2bf0f6284..7c18c7406 100644
--- a/system/core/Security.php
+++ b/system/core/Security.php
@@ -75,7 +75,7 @@ class CI_Security {
/**
* Character set
*
- * Will be overriden by the constructor.
+ * Will be overridden by the constructor.
*
* @var string
*/
@@ -192,7 +192,7 @@ class CI_Security {
$this->charset = strtoupper(config_item('charset'));
- log_message('debug', 'Security Class Initialized');
+ log_message('info', 'Security Class Initialized');
}
// --------------------------------------------------------------------
@@ -244,7 +244,7 @@ class CI_Security {
$this->_csrf_set_hash();
$this->csrf_set_cookie();
- log_message('debug', 'CSRF token verified');
+ log_message('info', 'CSRF token verified');
return $this;
}
@@ -275,7 +275,7 @@ class CI_Security {
$secure_cookie,
config_item('cookie_httponly')
);
- log_message('debug', 'CRSF cookie Set');
+ log_message('info', 'CRSF cookie sent');
return $this;
}
@@ -533,7 +533,6 @@ class CI_Security {
return ($str === $converted_string);
}
- log_message('debug', 'XSS Filtering completed');
return $str;
}
@@ -998,6 +997,3 @@ class CI_Security {
}
}
-
-/* End of file Security.php */
-/* Location: ./system/core/Security.php */ \ No newline at end of file
diff --git a/system/core/URI.php b/system/core/URI.php
index 39d1a8f30..9bc34ace7 100644
--- a/system/core/URI.php
+++ b/system/core/URI.php
@@ -140,7 +140,7 @@ class CI_URI {
}
}
- log_message('debug', 'URI Class Initialized');
+ log_message('info', 'URI Class Initialized');
}
// --------------------------------------------------------------------
@@ -639,6 +639,3 @@ class CI_URI {
}
}
-
-/* End of file URI.php */
-/* Location: ./system/core/URI.php */ \ No newline at end of file
diff --git a/system/core/Utf8.php b/system/core/Utf8.php
index bca95c206..9d8ac41e1 100644
--- a/system/core/Utf8.php
+++ b/system/core/Utf8.php
@@ -74,7 +74,7 @@ class CI_Utf8 {
log_message('debug', 'UTF-8 Support Disabled');
}
- log_message('debug', 'Utf8 Class Initialized');
+ log_message('info', 'Utf8 Class Initialized');
}
// --------------------------------------------------------------------
@@ -162,6 +162,3 @@ class CI_Utf8 {
}
}
-
-/* End of file Utf8.php */
-/* Location: ./system/core/Utf8.php */ \ No newline at end of file
diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php
index aeacabdb9..477535dca 100644
--- a/system/core/compat/hash.php
+++ b/system/core/compat/hash.php
@@ -196,6 +196,3 @@ if ( ! function_exists('hash_pbkdf2'))
return substr($raw_output ? $hash : bin2hex($hash), 0, $length);
}
}
-
-/* End of file hash.php */
-/* Location: ./system/core/compat/hash.php */ \ No newline at end of file
diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php
index 52ca6d02f..ddb2bae47 100644
--- a/system/core/compat/mbstring.php
+++ b/system/core/compat/mbstring.php
@@ -147,6 +147,3 @@ if ( ! function_exists('mb_substr'))
: substr($str, $start);
}
}
-
-/* End of file mbstring.php */
-/* Location: ./system/core/compat/mbstring.php */ \ No newline at end of file
diff --git a/system/core/compat/password.php b/system/core/compat/password.php
index 00befb022..7b933aa04 100644
--- a/system/core/compat/password.php
+++ b/system/core/compat/password.php
@@ -231,6 +231,3 @@ if ( ! function_exists('password_verify'))
return ($compare === 0);
}
}
-
-/* End of file password.php */
-/* Location: ./system/core/compat/password.php */ \ No newline at end of file
diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php
index f24f7f8ae..5a428c114 100644
--- a/system/core/compat/standard.php
+++ b/system/core/compat/standard.php
@@ -387,6 +387,3 @@ if ( ! function_exists('quoted_printable_encode'))
return $output;
}
}
-
-/* End of file standard.php */
-/* Location: ./system/core/compat/standard.php */ \ No newline at end of file
diff --git a/system/database/DB.php b/system/database/DB.php
index fc9f4d0dc..d411b679e 100644
--- a/system/database/DB.php
+++ b/system/database/DB.php
@@ -130,7 +130,7 @@ function &DB($params = '', $query_builder_override = NULL)
{
if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL')))
{
- $val = var_export($val);
+ $val = var_export($val, TRUE);
}
$params[$key] = $val;
@@ -215,6 +215,3 @@ function &DB($params = '', $query_builder_override = NULL)
return $DB;
}
-
-/* End of file DB.php */
-/* Location: ./system/database/DB.php */ \ No newline at end of file
diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php
index 8f5317293..223055f60 100644
--- a/system/database/DB_cache.php
+++ b/system/database/DB_cache.php
@@ -219,6 +219,3 @@ class CI_DB_Cache {
}
}
-
-/* End of file DB_cache.php */
-/* Location: ./system/database/DB_cache.php */ \ No newline at end of file
diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php
index 185f930bf..a0803f170 100644
--- a/system/database/DB_driver.php
+++ b/system/database/DB_driver.php
@@ -381,7 +381,7 @@ abstract class CI_DB_driver {
}
}
- log_message('debug', 'Database Driver Class Initialized');
+ log_message('info', 'Database Driver Class Initialized');
}
// --------------------------------------------------------------------
@@ -1643,7 +1643,7 @@ abstract class CI_DB_driver {
/**
* Close DB Connection
*
- * This method would be overriden by most of the drivers.
+ * This method would be overridden by most of the drivers.
*
* @return void
*/
@@ -1906,6 +1906,3 @@ abstract class CI_DB_driver {
}
}
-
-/* End of file DB_driver.php */
-/* Location: ./system/database/DB_driver.php */ \ No newline at end of file
diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php
index 4ca980810..f6ee2a63a 100644
--- a/system/database/DB_forge.php
+++ b/system/database/DB_forge.php
@@ -167,7 +167,7 @@ abstract class CI_DB_forge {
public function __construct(&$db)
{
$this->db =& $db;
- log_message('debug', 'Database Forge Class Initialized');
+ log_message('info', 'Database Forge Class Initialized');
}
// --------------------------------------------------------------------
@@ -828,7 +828,7 @@ abstract class CI_DB_forge {
*/
protected function _attr_type(&$attributes)
{
- // Usually overriden by drivers
+ // Usually overridden by drivers
}
// --------------------------------------------------------------------
@@ -1033,6 +1033,3 @@ abstract class CI_DB_forge {
}
}
-
-/* End of file DB_forge.php */
-/* Location: ./system/database/DB_forge.php */ \ No newline at end of file
diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php
index 80b25f71b..79cbfb3ad 100644
--- a/system/database/DB_query_builder.php
+++ b/system/database/DB_query_builder.php
@@ -1699,7 +1699,7 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
* Groups tables in FROM clauses if needed, so there is no confusion
* about operator precedence.
*
- * Note: This is only used (and overriden) by MySQL and CUBRID.
+ * Note: This is only used (and overridden) by MySQL and CUBRID.
*
* @return string
*/
@@ -2723,6 +2723,3 @@ abstract class CI_DB_query_builder extends CI_DB_driver {
}
}
-
-/* End of file DB_query_builder.php */
-/* Location: ./system/database/DB_query_builder.php */ \ No newline at end of file
diff --git a/system/database/DB_result.php b/system/database/DB_result.php
index 3f26b8aae..746f2a110 100644
--- a/system/database/DB_result.php
+++ b/system/database/DB_result.php
@@ -556,7 +556,7 @@ class CI_DB_result {
/**
* Number of fields in the result set
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @return int
*/
@@ -572,7 +572,7 @@ class CI_DB_result {
*
* Generates an array of column names.
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @return array
*/
@@ -588,7 +588,7 @@ class CI_DB_result {
*
* Generates an array of objects containing field meta-data.
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @return array
*/
@@ -602,7 +602,7 @@ class CI_DB_result {
/**
* Free the result
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @return void
*/
@@ -620,7 +620,7 @@ class CI_DB_result {
* this internally before fetching results to make sure the
* result set starts at zero.
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @param int $n
* @return bool
@@ -637,7 +637,7 @@ class CI_DB_result {
*
* Returns the result set as an array.
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @return array
*/
@@ -653,7 +653,7 @@ class CI_DB_result {
*
* Returns the result set as an object.
*
- * Overriden by driver result classes.
+ * Overridden by driver result classes.
*
* @param string $class_name
* @return object
@@ -664,6 +664,3 @@ class CI_DB_result {
}
}
-
-/* End of file DB_result.php */
-/* Location: ./system/database/DB_result.php */ \ No newline at end of file
diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php
index 963080fbb..774d51533 100644
--- a/system/database/DB_utility.php
+++ b/system/database/DB_utility.php
@@ -87,7 +87,7 @@ abstract class CI_DB_utility {
public function __construct(&$db)
{
$this->db =& $db;
- log_message('debug', 'Database Utility Class Initialized');
+ log_message('info', 'Database Utility Class Initialized');
}
// --------------------------------------------------------------------
@@ -421,6 +421,3 @@ abstract class CI_DB_utility {
}
}
-
-/* End of file DB_utility.php */
-/* Location: ./system/database/DB_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php
index 438b48a5c..402117978 100644
--- a/system/database/drivers/cubrid/cubrid_driver.php
+++ b/system/database/drivers/cubrid/cubrid_driver.php
@@ -421,6 +421,3 @@ class CI_DB_cubrid_driver extends CI_DB {
}
}
-
-/* End of file cubrid_driver.php */
-/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php
index a4dde8f10..9484e94e1 100644
--- a/system/database/drivers/cubrid/cubrid_forge.php
+++ b/system/database/drivers/cubrid/cubrid_forge.php
@@ -225,6 +225,3 @@ class CI_DB_cubrid_forge extends CI_DB_forge {
}
}
-
-/* End of file cubrid_forge.php */
-/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php
index 193b98b92..e666bab56 100644
--- a/system/database/drivers/cubrid/cubrid_result.php
+++ b/system/database/drivers/cubrid/cubrid_result.php
@@ -175,6 +175,3 @@ class CI_DB_cubrid_result extends CI_DB_result {
}
}
-
-/* End of file cubrid_result.php */
-/* Location: ./system/database/drivers/cubrid/cubrid_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php
index ca76cf98f..de7d71568 100644
--- a/system/database/drivers/cubrid/cubrid_utility.php
+++ b/system/database/drivers/cubrid/cubrid_utility.php
@@ -77,6 +77,3 @@ class CI_DB_cubrid_utility extends CI_DB_utility {
return $this->db->display_error('db_unsupported_feature');
}
}
-
-/* End of file cubrid_utility.php */
-/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php
index 20c5d9c57..529c320cd 100644
--- a/system/database/drivers/ibase/ibase_driver.php
+++ b/system/database/drivers/ibase/ibase_driver.php
@@ -402,6 +402,3 @@ class CI_DB_ibase_driver extends CI_DB {
}
}
-
-/* End of file ibase_driver.php */
-/* Location: ./system/database/drivers/ibase/ibase_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php
index 828739fb5..0e748c710 100644
--- a/system/database/drivers/ibase/ibase_forge.php
+++ b/system/database/drivers/ibase/ibase_forge.php
@@ -249,6 +249,3 @@ class CI_DB_ibase_forge extends CI_DB_forge {
}
}
-
-/* End of file ibase_forge.php */
-/* Location: ./system/database/drivers/ibase/ibase_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php
index 1b6bbd72a..991146f45 100644
--- a/system/database/drivers/ibase/ibase_result.php
+++ b/system/database/drivers/ibase/ibase_result.php
@@ -159,6 +159,3 @@ class CI_DB_ibase_result extends CI_DB_result {
}
}
-
-/* End of file ibase_result.php */
-/* Location: ./system/database/drivers/ibase/ibase_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php
index 9dca599a8..79d2788e5 100644
--- a/system/database/drivers/ibase/ibase_utility.php
+++ b/system/database/drivers/ibase/ibase_utility.php
@@ -67,6 +67,3 @@ class CI_DB_ibase_utility extends CI_DB_utility {
}
}
-
-/* End of file ibase_utility.php */
-/* Location: ./system/database/drivers/ibase/ibase_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php
index 1aeff1d5a..8f15d8d69 100644
--- a/system/database/drivers/mssql/mssql_driver.php
+++ b/system/database/drivers/mssql/mssql_driver.php
@@ -529,6 +529,3 @@ class CI_DB_mssql_driver extends CI_DB {
}
}
-
-/* End of file mssql_driver.php */
-/* Location: ./system/database/drivers/mssql/mssql_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php
index 94d6332fb..84406a016 100644
--- a/system/database/drivers/mssql/mssql_forge.php
+++ b/system/database/drivers/mssql/mssql_forge.php
@@ -144,6 +144,3 @@ class CI_DB_mssql_forge extends CI_DB_forge {
}
}
-
-/* End of file mssql_forge.php */
-/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php
index 0f6dcd21e..c1c42a486 100644
--- a/system/database/drivers/mssql/mssql_result.php
+++ b/system/database/drivers/mssql/mssql_result.php
@@ -107,7 +107,7 @@ class CI_DB_mssql_result extends CI_DB_result {
public function field_data()
{
$retval = array();
- for ($i = 0, $c = $this->num_field(); $i < $c; $i++)
+ for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
{
$field = mssql_fetch_field($this->result_id, $i);
@@ -196,6 +196,3 @@ class CI_DB_mssql_result extends CI_DB_result {
}
}
-
-/* End of file mssql_result.php */
-/* Location: ./system/database/drivers/mssql/mssql_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php
index a587f5d8f..1040b5e41 100644
--- a/system/database/drivers/mssql/mssql_utility.php
+++ b/system/database/drivers/mssql/mssql_utility.php
@@ -75,6 +75,3 @@ class CI_DB_mssql_utility extends CI_DB_utility {
}
}
-
-/* End of file mssql_utility.php */
-/* Location: ./system/database/drivers/mssql/mssql_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php
index 41cb14ba4..f8e9b6d61 100644
--- a/system/database/drivers/mysql/mysql_driver.php
+++ b/system/database/drivers/mysql/mysql_driver.php
@@ -132,8 +132,8 @@ class CI_DB_mysql_driver extends CI_DB {
// Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages
$this->conn_id = ($persistent === TRUE)
- ? @mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)
- : @mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);
+ ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags)
+ : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags);
// ----------------------------------------------------------------
@@ -495,6 +495,3 @@ class CI_DB_mysql_driver extends CI_DB {
}
}
-
-/* End of file mysql_driver.php */
-/* Location: ./system/database/drivers/mysql/mysql_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php
index d90f003e3..cb90065f2 100644
--- a/system/database/drivers/mysql/mysql_forge.php
+++ b/system/database/drivers/mysql/mysql_forge.php
@@ -241,6 +241,3 @@ class CI_DB_mysql_forge extends CI_DB_forge {
}
}
-
-/* End of file mysql_forge.php */
-/* Location: ./system/database/drivers/mysql/mysql_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php
index aeed07c2c..26aaddd32 100644
--- a/system/database/drivers/mysql/mysql_result.php
+++ b/system/database/drivers/mysql/mysql_result.php
@@ -197,6 +197,3 @@ class CI_DB_mysql_result extends CI_DB_result {
}
}
-
-/* End of file mysql_result.php */
-/* Location: ./system/database/drivers/mysql/mysql_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php
index 2ec4da4b2..55857ab08 100644
--- a/system/database/drivers/mysql/mysql_utility.php
+++ b/system/database/drivers/mysql/mysql_utility.php
@@ -209,6 +209,3 @@ class CI_DB_mysql_utility extends CI_DB_utility {
}
}
-
-/* End of file mysql_utility.php */
-/* Location: ./system/database/drivers/mysql/mysql_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php
index 4370986bf..22a8ba678 100644
--- a/system/database/drivers/mysqli/mysqli_driver.php
+++ b/system/database/drivers/mysqli/mysqli_driver.php
@@ -125,6 +125,8 @@ class CI_DB_mysqli_driver extends CI_DB {
$client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0;
$mysqli = mysqli_init();
+ $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);
+
if ($this->stricton)
{
$mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"');
@@ -434,7 +436,7 @@ class CI_DB_mysqli_driver extends CI_DB {
* Error
*
* Returns an array containing code and message of the last
- * database error that has occured.
+ * database error that has occurred.
*
* @return array
*/
@@ -484,6 +486,3 @@ class CI_DB_mysqli_driver extends CI_DB {
}
}
-
-/* End of file mysqli_driver.php */
-/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php
index 29a8b4cef..196afa845 100644
--- a/system/database/drivers/mysqli/mysqli_forge.php
+++ b/system/database/drivers/mysqli/mysqli_forge.php
@@ -242,6 +242,3 @@ class CI_DB_mysqli_forge extends CI_DB_forge {
}
}
-
-/* End of file mysqli_forge.php */
-/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php
index e1e94cd1d..d648828bd 100644
--- a/system/database/drivers/mysqli/mysqli_result.php
+++ b/system/database/drivers/mysqli/mysqli_result.php
@@ -184,6 +184,3 @@ class CI_DB_mysqli_result extends CI_DB_result {
}
}
-
-/* End of file mysqli_result.php */
-/* Location: ./system/database/drivers/mysqli/mysqli_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php
index afa863e86..04fcd1ded 100644
--- a/system/database/drivers/mysqli/mysqli_utility.php
+++ b/system/database/drivers/mysqli/mysqli_utility.php
@@ -211,6 +211,3 @@ class CI_DB_mysqli_utility extends CI_DB_utility {
}
}
-
-/* End of file mysqli_utility.php */
-/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
index f57e042c5..b87b41112 100644
--- a/system/database/drivers/oci8/oci8_driver.php
+++ b/system/database/drivers/oci8/oci8_driver.php
@@ -708,6 +708,3 @@ class CI_DB_oci8_driver extends CI_DB {
}
}
-
-/* End of file oci8_driver.php */
-/* Location: ./system/database/drivers/oci8/oci8_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php
index f215d9534..80100977a 100644
--- a/system/database/drivers/oci8/oci8_forge.php
+++ b/system/database/drivers/oci8/oci8_forge.php
@@ -147,6 +147,3 @@ class CI_DB_oci8_forge extends CI_DB_forge {
}
}
-
-/* End of file oci8_forge.php */
-/* Location: ./system/database/drivers/oci8/oci8_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php
index ffcb2d73d..9ec54cc5c 100644
--- a/system/database/drivers/oci8/oci8_result.php
+++ b/system/database/drivers/oci8/oci8_result.php
@@ -227,6 +227,3 @@ class CI_DB_oci8_result extends CI_DB_result {
}
}
-
-/* End of file oci8_result.php */
-/* Location: ./system/database/drivers/oci8/oci8_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php
index fcec02bd2..90022a8c1 100644
--- a/system/database/drivers/oci8/oci8_utility.php
+++ b/system/database/drivers/oci8/oci8_utility.php
@@ -66,6 +66,3 @@ class CI_DB_oci8_utility extends CI_DB_utility {
}
}
-
-/* End of file oci8_utility.php */
-/* Location: ./system/database/drivers/oci8/oci8_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php
index 28a81e92f..f5d77a147 100644
--- a/system/database/drivers/odbc/odbc_driver.php
+++ b/system/database/drivers/odbc/odbc_driver.php
@@ -372,6 +372,3 @@ class CI_DB_odbc_driver extends CI_DB {
}
}
-
-/* End of file odbc_driver.php */
-/* Location: ./system/database/drivers/odbc/odbc_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php
index 77338e83f..45c5dc108 100644
--- a/system/database/drivers/odbc/odbc_forge.php
+++ b/system/database/drivers/odbc/odbc_forge.php
@@ -84,6 +84,3 @@ class CI_DB_odbc_forge extends CI_DB_forge {
}
}
-
-/* End of file odbc_forge.php */
-/* Location: ./system/database/drivers/odbc/odbc_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php
index bfd928106..10b93d4fc 100644
--- a/system/database/drivers/odbc/odbc_result.php
+++ b/system/database/drivers/odbc/odbc_result.php
@@ -266,6 +266,3 @@ if ( ! function_exists('odbc_fetch_object'))
return $rs_object;
}
}
-
-/* End of file odbc_result.php */
-/* Location: ./system/database/drivers/odbc/odbc_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php
index d155d015e..0e6c23328 100644
--- a/system/database/drivers/odbc/odbc_utility.php
+++ b/system/database/drivers/odbc/odbc_utility.php
@@ -61,6 +61,3 @@ class CI_DB_odbc_utility extends CI_DB_utility {
}
}
-
-/* End of file odbc_utility.php */
-/* Location: ./system/database/drivers/odbc/odbc_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php
index 0e727991d..68aeb0eef 100644
--- a/system/database/drivers/pdo/pdo_driver.php
+++ b/system/database/drivers/pdo/pdo_driver.php
@@ -398,6 +398,3 @@ class CI_DB_pdo_driver extends CI_DB {
}
}
-
-/* End of file pdo_driver.php */
-/* Location: ./system/database/drivers/pdo/pdo_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php
index 92e2e172e..eedd9722d 100644
--- a/system/database/drivers/pdo/pdo_forge.php
+++ b/system/database/drivers/pdo/pdo_forge.php
@@ -63,6 +63,3 @@ class CI_DB_pdo_forge extends CI_DB_forge {
protected $_drop_table_if = FALSE;
}
-
-/* End of file pdo_forge.php */
-/* Location: ./system/database/drivers/pdo/pdo_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php
index 93eaa3c72..fe26fea6e 100644
--- a/system/database/drivers/pdo/pdo_result.php
+++ b/system/database/drivers/pdo/pdo_result.php
@@ -196,6 +196,3 @@ class CI_DB_pdo_result extends CI_DB_result {
}
}
-
-/* End of file pdo_result.php */
-/* Location: ./system/database/drivers/pdo/pdo_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php
index e9b80a47d..72169c3ca 100644
--- a/system/database/drivers/pdo/pdo_utility.php
+++ b/system/database/drivers/pdo/pdo_utility.php
@@ -61,6 +61,3 @@ class CI_DB_pdo_utility extends CI_DB_utility {
}
}
-
-/* End of file pdo_utility.php */
-/* Location: ./system/database/drivers/pdo/pdo_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
index d2266685d..cf5a0c77f 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php
@@ -198,6 +198,3 @@ class CI_DB_pdo_4d_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_4d_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
index 76d9ea91e..6b420540c 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php
@@ -44,7 +44,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
* @author EllisLab Dev Team
* @link http://codeigniter.com/user_guide/database/
*/
-class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
+class CI_DB_pdo_4d_forge extends CI_DB_pdo_forge {
/**
* CREATE DATABASE statement
@@ -164,7 +164,7 @@ class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
$attributes['TYPE'] = 'INT';
return;
case 'BIGINT':
- $attribites['TYPE'] = 'INT64';
+ $attributes['TYPE'] = 'INT64';
return;
default: return;
}
@@ -215,6 +215,3 @@ class CI_DB_pdo_4d_forge extends CI_DB_4d_forge {
}
}
-
-/* End of file pdo_4d_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_4d_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
index 9ed66314b..98ac89f3d 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php
@@ -248,6 +248,3 @@ class CI_DB_pdo_cubrid_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_cubrid_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
index 94dd1e219..15b100d9b 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php
@@ -225,6 +225,3 @@ class CI_DB_pdo_cubrid_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_cubrid_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
index d1d42875a..c8d7c770d 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php
@@ -330,6 +330,3 @@ class CI_DB_pdo_dblib_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_dblib_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php
index 70f843516..d3dd9032e 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php
@@ -142,6 +142,3 @@ class CI_DB_pdo_dblib_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_dblib_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php
index 5fffd5a44..3bd5c9354 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php
@@ -261,6 +261,3 @@ class CI_DB_pdo_firebird_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_firebird_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
index 1e4f39f39..ad28a6550 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php
@@ -235,6 +235,3 @@ class CI_DB_pdo_firebird_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_firebird_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php
index 17a7732fc..5dba26ec9 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php
@@ -242,6 +242,3 @@ class CI_DB_pdo_ibm_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_ibm_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php
index 47e6d1c6f..d1b5f92c9 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php
@@ -152,6 +152,3 @@ class CI_DB_pdo_ibm_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_ibm_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php
index 01e32f5f4..9f8c017a5 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php
@@ -307,6 +307,3 @@ class CI_DB_pdo_informix_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_informix_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_informix_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php
index 45a18a3d1..22bdf6104 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php
@@ -161,6 +161,3 @@ class CI_DB_pdo_informix_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_informix_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_informix_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
index e4e4fa069..67dc5f5ec 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php
@@ -264,6 +264,3 @@ class CI_DB_pdo_mysql_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_mysql_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
index 1f007e7f4..e8e24c6b3 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php
@@ -199,8 +199,6 @@ class CI_DB_pdo_mysql_forge extends CI_DB_pdo_forge {
$extra_clause = ' FIRST';
}
- $comment_clause = isset($field['comment']) ? ' COMMENT ' . $field['comment'] : '';
-
return $this->db->escape_identifiers($field['name'])
.(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name']))
.' '.$field['type'].$field['length']
@@ -256,6 +254,3 @@ class CI_DB_pdo_mysql_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_mysql_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
index b80da33c2..d17e311f7 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php
@@ -293,6 +293,3 @@ class CI_DB_pdo_oci_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_oci_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_oci_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
index 64065e875..e2078cf39 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php
@@ -147,6 +147,3 @@ class CI_DB_pdo_oci_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_oci_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_oci_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
index c5e5a4ca1..51c70b630 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php
@@ -264,6 +264,3 @@ class CI_DB_pdo_odbc_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_odbc_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php
index 6fc9839b4..291352982 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php
@@ -68,6 +68,3 @@ class CI_DB_pdo_odbc_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_odbc_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
index 158c5d2eb..2dd41ca87 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php
@@ -377,6 +377,3 @@ class CI_DB_pdo_pgsql_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_pgsql_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_pgsql_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
index 2b4985497..b4a6160a8 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php
@@ -208,6 +208,3 @@ class CI_DB_pdo_pgsql_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_pgsql_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php
index e1c8670a9..f07f49f84 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php
@@ -203,6 +203,3 @@ class CI_DB_pdo_sqlite_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_sqlite_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php
index e09db10f0..28faaddb7 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php
@@ -235,6 +235,3 @@ class CI_DB_pdo_sqlite_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_sqlite_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
index ac3513560..b5bdbf91a 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php
@@ -367,6 +367,3 @@ class CI_DB_pdo_sqlsrv_driver extends CI_DB_pdo_driver {
}
}
-
-/* End of file pdo_sqlsrv_driver.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php
index 92f38af92..602a1d426 100644
--- a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php
+++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php
@@ -142,6 +142,3 @@ class CI_DB_pdo_sqlsrv_forge extends CI_DB_pdo_forge {
}
}
-
-/* End of file pdo_sqlsrv_forge.php */
-/* Location: ./system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php
index fa5934972..3f3e3f018 100644
--- a/system/database/drivers/postgre/postgre_driver.php
+++ b/system/database/drivers/postgre/postgre_driver.php
@@ -641,6 +641,3 @@ class CI_DB_postgre_driver extends CI_DB {
}
}
-
-/* End of file postgre_driver.php */
-/* Location: ./system/database/drivers/postgre/postgre_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php
index 85f4ad72b..d26e84cbc 100644
--- a/system/database/drivers/postgre/postgre_forge.php
+++ b/system/database/drivers/postgre/postgre_forge.php
@@ -203,6 +203,3 @@ class CI_DB_postgre_forge extends CI_DB_forge {
}
}
-
-/* End of file postgre_forge.php */
-/* Location: ./system/database/drivers/postgre/postgre_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php
index cfb64d372..a8ad24edf 100644
--- a/system/database/drivers/postgre/postgre_result.php
+++ b/system/database/drivers/postgre/postgre_result.php
@@ -180,6 +180,3 @@ class CI_DB_postgre_result extends CI_DB_result {
}
}
-
-/* End of file postgre_result.php */
-/* Location: ./system/database/drivers/postgre/postgre_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php
index 8252a39d4..7c6c02590 100644
--- a/system/database/drivers/postgre/postgre_utility.php
+++ b/system/database/drivers/postgre/postgre_utility.php
@@ -76,6 +76,3 @@ class CI_DB_postgre_utility extends CI_DB_utility {
return $this->db->display_error('db_unsupported_feature');
}
}
-
-/* End of file postgre_utility.php */
-/* Location: ./system/database/drivers/postgre/postgre_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php
index 2137bade0..9d9caa0b4 100644
--- a/system/database/drivers/sqlite/sqlite_driver.php
+++ b/system/database/drivers/sqlite/sqlite_driver.php
@@ -355,6 +355,3 @@ class CI_DB_sqlite_driver extends CI_DB {
}
}
-
-/* End of file sqlite_driver.php */
-/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php
index 92721a97f..2bba330c0 100644
--- a/system/database/drivers/sqlite/sqlite_forge.php
+++ b/system/database/drivers/sqlite/sqlite_forge.php
@@ -203,6 +203,3 @@ class CI_DB_sqlite_forge extends CI_DB_forge {
}
}
-
-/* End of file sqlite_forge.php */
-/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php
index 3b42a6dc0..487d00366 100644
--- a/system/database/drivers/sqlite/sqlite_result.php
+++ b/system/database/drivers/sqlite/sqlite_result.php
@@ -162,6 +162,3 @@ class CI_DB_sqlite_result extends CI_DB_result {
}
}
-
-/* End of file sqlite_result.php */
-/* Location: ./system/database/drivers/sqlite/sqlite_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php
index 7b0b2cbeb..9cb454274 100644
--- a/system/database/drivers/sqlite/sqlite_utility.php
+++ b/system/database/drivers/sqlite/sqlite_utility.php
@@ -59,6 +59,3 @@ class CI_DB_sqlite_utility extends CI_DB_utility {
}
}
-
-/* End of file sqlite_utility.php */
-/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php
index 27d2bbfff..fdbe94939 100644
--- a/system/database/drivers/sqlite3/sqlite3_driver.php
+++ b/system/database/drivers/sqlite3/sqlite3_driver.php
@@ -358,6 +358,3 @@ class CI_DB_sqlite3_driver extends CI_DB {
}
}
-
-/* End of file sqlite3_driver.php */
-/* Location: ./system/database/drivers/sqlite3/sqlite3_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php
index b1f3169c2..69f65b6f3 100644
--- a/system/database/drivers/sqlite3/sqlite3_forge.php
+++ b/system/database/drivers/sqlite3/sqlite3_forge.php
@@ -222,6 +222,3 @@ class CI_DB_sqlite3_forge extends CI_DB_forge {
}
}
-
-/* End of file sqlite3_forge.php */
-/* Location: ./system/database/drivers/sqlite3/sqlite3_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php
index 179bcc895..387481b7f 100644
--- a/system/database/drivers/sqlite3/sqlite3_result.php
+++ b/system/database/drivers/sqlite3/sqlite3_result.php
@@ -98,7 +98,7 @@ class CI_DB_sqlite3_result extends CI_DB_result {
);
$retval = array();
- for ($i = 0, $c = $this->num_fields(); $i < $this->num_fields(); $i++)
+ for ($i = 0, $c = $this->num_fields(); $i < $c; $i++)
{
$retval[$i] = new stdClass();
$retval[$i]->name = $this->result_id->columnName($i);
@@ -192,6 +192,3 @@ class CI_DB_sqlite3_result extends CI_DB_result {
}
}
-
-/* End of file sqlite3_result.php */
-/* Location: ./system/database/drivers/sqlite3/sqlite3_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php
index 3cd7faaa4..336f68754 100644
--- a/system/database/drivers/sqlite3/sqlite3_utility.php
+++ b/system/database/drivers/sqlite3/sqlite3_utility.php
@@ -59,6 +59,3 @@ class CI_DB_sqlite3_utility extends CI_DB_utility {
}
}
-
-/* End of file sqlite3_utility.php */
-/* Location: ./system/database/drivers/sqlite3/sqlite3_utility.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php
index 078aaec3d..8f17c8f96 100644
--- a/system/database/drivers/sqlsrv/sqlsrv_driver.php
+++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php
@@ -569,6 +569,3 @@ class CI_DB_sqlsrv_driver extends CI_DB {
}
}
-
-/* End of file sqlsrv_driver.php */
-/* Location: ./system/database/drivers/sqlsrv/sqlsrv_driver.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php
index 63c4f7e7f..b22b60a4a 100644
--- a/system/database/drivers/sqlsrv/sqlsrv_forge.php
+++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php
@@ -142,6 +142,3 @@ class CI_DB_sqlsrv_forge extends CI_DB_forge {
}
}
-
-/* End of file sqlsrv_forge.php */
-/* Location: ./system/database/drivers/sqlsrv/sqlsrv_forge.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php
index 8ec2a9f42..d2be926aa 100644
--- a/system/database/drivers/sqlsrv/sqlsrv_result.php
+++ b/system/database/drivers/sqlsrv/sqlsrv_result.php
@@ -191,6 +191,3 @@ class CI_DB_sqlsrv_result extends CI_DB_result {
}
}
-
-/* End of file sqlsrv_result.php */
-/* Location: ./system/database/drivers/sqlsrv/sqlsrv_result.php */ \ No newline at end of file
diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php
index 8fa0e68d6..77cf0aaf3 100644
--- a/system/database/drivers/sqlsrv/sqlsrv_utility.php
+++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php
@@ -75,6 +75,3 @@ class CI_DB_sqlsrv_utility extends CI_DB_utility {
}
}
-
-/* End of file sqlsrv_utility.php */
-/* Location: ./system/database/drivers/sqlsrv/sqlsrv_utility.php */ \ No newline at end of file
diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php
index c4fa330ea..e07b52bb5 100644
--- a/system/helpers/array_helper.php
+++ b/system/helpers/array_helper.php
@@ -113,6 +113,3 @@ if ( ! function_exists('elements'))
return $return;
}
}
-
-/* End of file array_helper.php */
-/* Location: ./system/helpers/array_helper.php */ \ No newline at end of file
diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php
index 7cdc0aff2..201987ac8 100644
--- a/system/helpers/captcha_helper.php
+++ b/system/helpers/captcha_helper.php
@@ -251,6 +251,3 @@ if ( ! function_exists('create_captcha'))
return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename);
}
}
-
-/* End of file captcha_helper.php */
-/* Location: ./system/helpers/captcha_helper.php */ \ No newline at end of file
diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php
index ce714d011..c2dc73a17 100644
--- a/system/helpers/cookie_helper.php
+++ b/system/helpers/cookie_helper.php
@@ -111,6 +111,3 @@ if ( ! function_exists('delete_cookie'))
set_cookie($name, '', '', $domain, $path, $prefix);
}
}
-
-/* End of file cookie_helper.php */
-/* Location: ./system/helpers/cookie_helper.php */ \ No newline at end of file
diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php
index 56f15e877..c9b71c30f 100644
--- a/system/helpers/date_helper.php
+++ b/system/helpers/date_helper.php
@@ -794,6 +794,3 @@ if ( ! function_exists('date_range'))
return $range;
}
}
-
-/* End of file date_helper.php */
-/* Location: ./system/helpers/date_helper.php */ \ No newline at end of file
diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php
index 2d7d15f9d..8f05c5b18 100644
--- a/system/helpers/directory_helper.php
+++ b/system/helpers/directory_helper.php
@@ -99,6 +99,3 @@ if ( ! function_exists('directory_map'))
return FALSE;
}
}
-
-/* End of file directory_helper.php */
-/* Location: ./system/helpers/directory_helper.php */ \ No newline at end of file
diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php
index a781a0c02..379120552 100644
--- a/system/helpers/download_helper.php
+++ b/system/helpers/download_helper.php
@@ -165,6 +165,3 @@ if ( ! function_exists('force_download'))
exit;
}
}
-
-/* End of file download_helper.php */
-/* Location: ./system/helpers/download_helper.php */ \ No newline at end of file
diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php
index d7691e349..c4d705810 100644
--- a/system/helpers/email_helper.php
+++ b/system/helpers/email_helper.php
@@ -82,6 +82,3 @@ if ( ! function_exists('send_email'))
return mail($recipient, $subject, $message);
}
}
-
-/* End of file email_helper.php */
-/* Location: ./system/helpers/email_helper.php */ \ No newline at end of file
diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php
index 1ff728778..8b15e60a5 100644
--- a/system/helpers/file_helper.php
+++ b/system/helpers/file_helper.php
@@ -449,6 +449,3 @@ if ( ! function_exists('octal_permissions'))
return substr(sprintf('%o', $perms), -3);
}
}
-
-/* End of file file_helper.php */
-/* Location: ./system/helpers/file_helper.php */ \ No newline at end of file
diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php
index 0e9207ee2..fb235291e 100644
--- a/system/helpers/form_helper.php
+++ b/system/helpers/form_helper.php
@@ -100,7 +100,7 @@ if ( ! function_exists('form_open'))
{
foreach ($hidden as $name => $value)
{
- $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value).'" style="display:none;" />'."\n";
+ $form .= '<input type="hidden" name="'.$name.'" value="'.html_escape($value).'" style="display:none;" />'."\n";
}
}
@@ -173,7 +173,7 @@ if ( ! function_exists('form_hidden'))
if ( ! is_array($value))
{
- $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value)."\" />\n";
+ $form .= '<input type="hidden" name="'.$name.'" value="'.html_escape($value)."\" />\n";
}
else
{
@@ -287,7 +287,7 @@ if ( ! function_exists('form_textarea'))
unset($data['value']); // textareas don't use the value attribute
}
- return '<textarea '._parse_form_attributes($data, $defaults).$extra.'>'.form_prep($val, TRUE)."</textarea>\n";
+ return '<textarea '._parse_form_attributes($data, $defaults).$extra.'>'.html_escape($val)."</textarea>\n";
}
}
@@ -392,7 +392,7 @@ if ( ! function_exists('form_dropdown'))
foreach ($val as $optgroup_key => $optgroup_val)
{
$sel = in_array($optgroup_key, $selected) ? ' selected="selected"' : '';
- $form .= '<option value="'.form_prep($optgroup_key).'"'.$sel.'>'
+ $form .= '<option value="'.html_escape($optgroup_key).'"'.$sel.'>'
.(string) $optgroup_val."</option>\n";
}
@@ -400,7 +400,7 @@ if ( ! function_exists('form_dropdown'))
}
else
{
- $form .= '<option value="'.form_prep($key).'"'
+ $form .= '<option value="'.html_escape($key).'"'
.(in_array($key, $selected) ? ' selected="selected"' : '').'>'
.(string) $val."</option>\n";
}
@@ -653,28 +653,13 @@ if ( ! function_exists('form_prep'))
*
* Formats text so that it can be safely placed in a form field in the event it has HTML tags.
*
+ * @deprecated 3.0.0 An alias for html_escape()
* @param string|string[] $str Value to escape
- * @param bool $is_textarea Whether we're escaping for a textarea element
* @return string|string[] Escaped values
*/
- function form_prep($str = '', $is_textarea = FALSE)
+ function form_prep($str)
{
- if (is_array($str))
- {
- foreach (array_keys($str) as $key)
- {
- $str[$key] = form_prep($str[$key], $is_textarea);
- }
-
- return $str;
- }
-
- if ($is_textarea === TRUE)
- {
- return str_replace(array('<', '>'), array('&lt;', '&gt;'), stripslashes($str));
- }
-
- return str_replace(array("'", '"'), array('&#39;', '&quot;'), stripslashes($str));
+ return html_escape($str, TRUE);
}
}
@@ -691,10 +676,9 @@ if ( ! function_exists('set_value'))
*
* @param string $field Field name
* @param string $default Default value
- * @param bool $is_textarea Whether the field is a textarea element
* @return string
*/
- function set_value($field = '', $default = '', $is_textarea = FALSE)
+ function set_value($field, $default = '')
{
$CI =& get_instance();
@@ -702,7 +686,7 @@ if ( ! function_exists('set_value'))
? $CI->form_validation->set_value($field, $default)
: $CI->input->post($field, FALSE);
- return form_prep($value === NULL ? $default : $value, $is_textarea);
+ return html_escape($value === NULL ? $default : $value);
}
}
@@ -721,7 +705,7 @@ if ( ! function_exists('set_select'))
* @param bool
* @return string
*/
- function set_select($field = '', $value = '', $default = FALSE)
+ function set_select($field, $value = '', $default = FALSE)
{
$CI =& get_instance();
@@ -768,7 +752,7 @@ if ( ! function_exists('set_checkbox'))
* @param bool
* @return string
*/
- function set_checkbox($field = '', $value = '', $default = FALSE)
+ function set_checkbox($field, $value = '', $default = FALSE)
{
$CI =& get_instance();
@@ -815,7 +799,7 @@ if ( ! function_exists('set_radio'))
* @param bool $default
* @return string
*/
- function set_radio($field = '', $value = '', $default = FALSE)
+ function set_radio($field, $value = '', $default = FALSE)
{
$CI =& get_instance();
@@ -921,7 +905,7 @@ if ( ! function_exists('_parse_form_attributes'))
{
if ($key === 'value')
{
- $val = form_prep($val);
+ $val = html_escape($val);
}
elseif ($key === 'name' && ! strlen($default['name']))
{
@@ -1012,6 +996,3 @@ if ( ! function_exists('_get_validation_object'))
return $return;
}
}
-
-/* End of file form_helper.php */
-/* Location: ./system/helpers/form_helper.php */ \ No newline at end of file
diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php
index daa380c15..28fbe00be 100644
--- a/system/helpers/html_helper.php
+++ b/system/helpers/html_helper.php
@@ -408,6 +408,3 @@ if ( ! function_exists('nbs'))
return str_repeat('&nbsp;', $num);
}
}
-
-/* End of file html_helper.php */
-/* Location: ./system/helpers/html_helper.php */ \ No newline at end of file
diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php
index 8ce671367..d8ed45df9 100644
--- a/system/helpers/inflector_helper.php
+++ b/system/helpers/inflector_helper.php
@@ -243,6 +243,3 @@ if ( ! function_exists('is_countable'))
);
}
}
-
-/* End of file inflector_helper.php */
-/* Location: ./system/helpers/inflector_helper.php */ \ No newline at end of file
diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php
index ec448ad69..25ce8abe1 100644
--- a/system/helpers/language_helper.php
+++ b/system/helpers/language_helper.php
@@ -73,6 +73,3 @@ if ( ! function_exists('lang'))
return $line;
}
}
-
-/* End of file language_helper.php */
-/* Location: ./system/helpers/language_helper.php */ \ No newline at end of file
diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php
index 50b6c44d7..3a24259e1 100644
--- a/system/helpers/number_helper.php
+++ b/system/helpers/number_helper.php
@@ -92,6 +92,3 @@ if ( ! function_exists('byte_format'))
return number_format($num, $precision).' '.$unit;
}
}
-
-/* End of file number_helper.php */
-/* Location: ./system/helpers/number_helper.php */ \ No newline at end of file
diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php
index ecf61d29e..c23ec6435 100644
--- a/system/helpers/path_helper.php
+++ b/system/helpers/path_helper.php
@@ -80,6 +80,3 @@ if ( ! function_exists('set_realpath'))
return is_dir($path) ? rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR : $path;
}
}
-
-/* End of file path_helper.php */
-/* Location: ./system/helpers/path_helper.php */ \ No newline at end of file
diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php
index fb0519272..adbf136bb 100644
--- a/system/helpers/security_helper.php
+++ b/system/helpers/security_helper.php
@@ -135,6 +135,3 @@ if ( ! function_exists('encode_php_tags'))
return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);
}
}
-
-/* End of file security_helper.php */
-/* Location: ./system/helpers/security_helper.php */ \ No newline at end of file
diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php
index 164222c1d..d053dd22c 100644
--- a/system/helpers/smiley_helper.php
+++ b/system/helpers/smiley_helper.php
@@ -253,6 +253,3 @@ if ( ! function_exists('_get_smiley_array'))
return $_smileys;
}
}
-
-/* End of file smiley_helper.php */
-/* Location: ./system/helpers/smiley_helper.php */ \ No newline at end of file
diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php
index 5daae987c..5860e15fb 100644
--- a/system/helpers/string_helper.php
+++ b/system/helpers/string_helper.php
@@ -303,6 +303,3 @@ if ( ! function_exists('repeater'))
return ($num > 0) ? str_repeat($data, $num) : '';
}
}
-
-/* End of file string_helper.php */
-/* Location: ./system/helpers/string_helper.php */ \ No newline at end of file
diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php
index 3a1f11c21..f2290c895 100644
--- a/system/helpers/text_helper.php
+++ b/system/helpers/text_helper.php
@@ -547,6 +547,3 @@ if ( ! function_exists('ellipsize'))
return $beg.$ellipsis.$end;
}
}
-
-/* End of file text_helper.php */
-/* Location: ./system/helpers/text_helper.php */ \ No newline at end of file
diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php
index e5bfbc0b9..45bb9b1d4 100644
--- a/system/helpers/typography_helper.php
+++ b/system/helpers/typography_helper.php
@@ -102,6 +102,3 @@ if ( ! function_exists('entity_decode'))
return get_instance()->security->entity_decode($str, $charset);
}
}
-
-/* End of file typography_helper.php */
-/* Location: ./system/helpers/typography_helper.php */ \ No newline at end of file
diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php
index afec35aea..bf623b000 100644
--- a/system/helpers/url_helper.php
+++ b/system/helpers/url_helper.php
@@ -567,6 +567,3 @@ if ( ! function_exists('redirect'))
exit;
}
}
-
-/* End of file url_helper.php */
-/* Location: ./system/helpers/url_helper.php */ \ No newline at end of file
diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php
index e0b2f58f3..55f9c2f66 100644
--- a/system/helpers/xml_helper.php
+++ b/system/helpers/xml_helper.php
@@ -88,6 +88,3 @@ if ( ! function_exists('xml_convert'))
return $str;
}
}
-
-/* End of file xml_helper.php */
-/* Location: ./system/helpers/xml_helper.php */ \ No newline at end of file
diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php
index b95b36eef..9d3352868 100644
--- a/system/language/english/calendar_lang.php
+++ b/system/language/english/calendar_lang.php
@@ -82,6 +82,3 @@ $lang['cal_september'] = 'September';
$lang['cal_october'] = 'October';
$lang['cal_november'] = 'November';
$lang['cal_december'] = 'December';
-
-/* End of file calendar_lang.php */
-/* Location: ./system/language/english/calendar_lang.php */ \ No newline at end of file
diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php
index 0edbe28f3..c61c9c2ad 100644
--- a/system/language/english/date_lang.php
+++ b/system/language/english/date_lang.php
@@ -92,6 +92,3 @@ $lang['UP12'] = '(UTC +12:00) Fiji, Gilbert Islands, Kamchatka Time, New Zealand
$lang['UP1275'] = '(UTC +12:45) Chatham Islands Standard Time';
$lang['UP13'] = '(UTC +13:00) Samoa Time Zone, Phoenix Islands Time, Tonga';
$lang['UP14'] = '(UTC +14:00) Line Islands';
-
-/* End of file date_lang.php */
-/* Location: ./system/language/english/date_lang.php */ \ No newline at end of file
diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php
index 85239b3cd..5b67da659 100644
--- a/system/language/english/db_lang.php
+++ b/system/language/english/db_lang.php
@@ -61,6 +61,3 @@ $lang['db_column_name_required'] = 'A column name is required for that operation
$lang['db_column_definition_required'] = 'A column definition is required for that operation.';
$lang['db_unable_to_set_charset'] = 'Unable to set client connection character set: %s';
$lang['db_error_heading'] = 'A Database Error Occurred';
-
-/* End of file db_lang.php */
-/* Location: ./system/language/english/db_lang.php */ \ No newline at end of file
diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php
index cd8fa8932..cc6b2fd5a 100644
--- a/system/language/english/email_lang.php
+++ b/system/language/english/email_lang.php
@@ -56,6 +56,3 @@ $lang['email_smtp_auth_un'] = 'Failed to authenticate username. Error: %s';
$lang['email_smtp_auth_pw'] = 'Failed to authenticate password. Error: %s';
$lang['email_smtp_data_failure'] = 'Unable to send data: %s';
$lang['email_exit_status'] = 'Exit status code: %s';
-
-/* End of file email_lang.php */
-/* Location: ./system/language/english/email_lang.php */ \ No newline at end of file
diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php
index 558949bf6..75d6e4b82 100644
--- a/system/language/english/form_validation_lang.php
+++ b/system/language/english/form_validation_lang.php
@@ -65,6 +65,4 @@ $lang['form_validation_less_than_equal_to'] = 'The {field} field must contain a
$lang['form_validation_greater_than'] = 'The {field} field must contain a number greater than {param}.';
$lang['form_validation_greater_than_equal_to'] = 'The {field} field must contain a number greater than or equal to {param}.';
$lang['form_validation_error_message_not_set'] = 'Unable to access an error message corresponding to your field name {field}.';
-
-/* End of file form_validation_lang.php */
-/* Location: ./system/language/english/form_validation_lang.php */ \ No newline at end of file
+$lang['form_validation_in_list'] = 'The {field} field must be one of: {param}.';
diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php
index 45e866dfd..bccc27397 100644
--- a/system/language/english/ftp_lang.php
+++ b/system/language/english/ftp_lang.php
@@ -49,6 +49,3 @@ $lang['ftp_no_source_file'] = 'Unable to locate the source file. Please check y
$lang['ftp_unable_to_rename'] = 'Unable to rename the file.';
$lang['ftp_unable_to_delete'] = 'Unable to delete the file.';
$lang['ftp_unable_to_move'] = 'Unable to move the file. Please make sure the destination directory exists.';
-
-/* End of file ftp_lang.php */
-/* Location: ./system/language/english/ftp_lang.php */ \ No newline at end of file
diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php
index 16f51a262..41129cd6e 100644
--- a/system/language/english/imglib_lang.php
+++ b/system/language/english/imglib_lang.php
@@ -54,6 +54,3 @@ $lang['imglib_invalid_path'] = 'The path to the image is not correct.';
$lang['imglib_copy_failed'] = 'The image copy routine failed.';
$lang['imglib_missing_font'] = 'Unable to find a font to use.';
$lang['imglib_save_failed'] = 'Unable to save the image. Please make sure the image and file directory are writable.';
-
-/* End of file imglib_lang.php */
-/* Location: ./system/language/english/imglib_lang.php */ \ No newline at end of file
diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php
index 9dbff7af3..9e4a7c58c 100644
--- a/system/language/english/migration_lang.php
+++ b/system/language/english/migration_lang.php
@@ -45,6 +45,3 @@ $lang['migration_class_doesnt_exist'] = 'The migration class "%s" could not be f
$lang['migration_missing_up_method'] = 'The migration class "%s" is missing an "up" method.';
$lang['migration_missing_down_method'] = 'The migration class "%s" is missing a "down" method.';
$lang['migration_invalid_filename'] = 'Migration "%s" has an invalid filename.';
-
-/* End of file migration_lang.php */
-/* Location: ./system/language/english/migration_lang.php */ \ No newline at end of file
diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php
index f2ac94570..db229c5b5 100644
--- a/system/language/english/number_lang.php
+++ b/system/language/english/number_lang.php
@@ -42,6 +42,3 @@ $lang['gigabyte_abbr'] = 'GB';
$lang['megabyte_abbr'] = 'MB';
$lang['kilobyte_abbr'] = 'KB';
$lang['bytes'] = 'Bytes';
-
-/* End of file number_lang.php */
-/* Location: ./system/language/english/number_lang.php */ \ No newline at end of file
diff --git a/system/language/english/pagination_lang.php b/system/language/english/pagination_lang.php
index 70eb75f94..be133781e 100644
--- a/system/language/english/pagination_lang.php
+++ b/system/language/english/pagination_lang.php
@@ -41,6 +41,3 @@ $lang['pagination_first_link'] = '&lsaquo; First';
$lang['pagination_next_link'] = '&gt;';
$lang['pagination_prev_link'] = '&lt;';
$lang['pagination_last_link'] = 'Last &rsaquo;';
-
-/* End of file pagination_lang.php */
-/* Location: ./system/language/english/pagination_lang.php */ \ No newline at end of file
diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php
index 1d111044f..ba3edba60 100644
--- a/system/language/english/profiler_lang.php
+++ b/system/language/english/profiler_lang.php
@@ -58,6 +58,3 @@ $lang['profiler_no_profiles'] = 'No Profile data - all Profiler sections have be
$lang['profiler_section_hide'] = 'Hide';
$lang['profiler_section_show'] = 'Show';
$lang['profiler_seconds'] = 'seconds';
-
-/* End of file profiler_lang.php */
-/* Location: ./system/language/english/profiler_lang.php */ \ No newline at end of file
diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php
index 52af2759c..639829ed8 100644
--- a/system/language/english/unit_test_lang.php
+++ b/system/language/english/unit_test_lang.php
@@ -56,6 +56,3 @@ $lang['ut_object'] = 'Object';
$lang['ut_resource'] = 'Resource';
$lang['ut_null'] = 'Null';
$lang['ut_notes'] = 'Notes';
-
-/* End of file unit_test_lang.php */
-/* Location: ./system/language/english/unit_test_lang.php */ \ No newline at end of file
diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php
index eeed557cd..a536dda31 100644
--- a/system/language/english/upload_lang.php
+++ b/system/language/english/upload_lang.php
@@ -53,6 +53,3 @@ $lang['upload_no_filepath'] = 'The upload path does not appear to be valid.';
$lang['upload_no_file_types'] = 'You have not specified any allowed file types.';
$lang['upload_bad_filename'] = 'The file name you submitted already exists on the server.';
$lang['upload_not_writable'] = 'The upload destination folder does not appear to be writable.';
-
-/* End of file upload_lang.php */
-/* Location: ./system/language/english/upload_lang.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php
index bee0c068b..40ac70103 100644
--- a/system/libraries/Cache/Cache.php
+++ b/system/libraries/Cache/Cache.php
@@ -272,6 +272,3 @@ class CI_Cache extends CI_Driver_Library {
}
}
-
-/* End of file Cache.php */
-/* Location: ./system/libraries/Cache/Cache.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php
index 3c441a2f2..e0d2ffb39 100644
--- a/system/libraries/Cache/drivers/Cache_apc.php
+++ b/system/libraries/Cache/drivers/Cache_apc.php
@@ -208,6 +208,3 @@ class CI_Cache_apc extends CI_Driver {
}
}
-
-/* End of file Cache_apc.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_apc.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php
index e05935dca..bf80945a9 100644
--- a/system/libraries/Cache/drivers/Cache_dummy.php
+++ b/system/libraries/Cache/drivers/Cache_dummy.php
@@ -170,6 +170,3 @@ class CI_Cache_dummy extends CI_Driver {
}
}
-
-/* End of file Cache_dummy.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_dummy.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php
index 3ff32cf60..68bc1ec96 100644
--- a/system/libraries/Cache/drivers/Cache_file.php
+++ b/system/libraries/Cache/drivers/Cache_file.php
@@ -284,6 +284,3 @@ class CI_Cache_file extends CI_Driver {
}
}
-
-/* End of file Cache_file.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php
index 03174bda1..b90b561c9 100644
--- a/system/libraries/Cache/drivers/Cache_memcached.php
+++ b/system/libraries/Cache/drivers/Cache_memcached.php
@@ -293,6 +293,3 @@ class CI_Cache_memcached extends CI_Driver {
}
}
-
-/* End of file Cache_memcached.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_redis.php b/system/libraries/Cache/drivers/Cache_redis.php
index 78563aab0..f2a41cc67 100644
--- a/system/libraries/Cache/drivers/Cache_redis.php
+++ b/system/libraries/Cache/drivers/Cache_redis.php
@@ -335,6 +335,3 @@ class CI_Cache_redis extends CI_Driver
}
}
-
-/* End of file Cache_redis.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_redis.php */ \ No newline at end of file
diff --git a/system/libraries/Cache/drivers/Cache_wincache.php b/system/libraries/Cache/drivers/Cache_wincache.php
index 4592d1dd8..528b2b9bf 100644
--- a/system/libraries/Cache/drivers/Cache_wincache.php
+++ b/system/libraries/Cache/drivers/Cache_wincache.php
@@ -204,6 +204,3 @@ class CI_Cache_wincache extends CI_Driver {
}
}
-
-/* End of file Cache_wincache.php */
-/* Location: ./system/libraries/Cache/drivers/Cache_wincache.php */ \ No newline at end of file
diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php
index e6ca225bf..014daac58 100644
--- a/system/libraries/Calendar.php
+++ b/system/libraries/Calendar.php
@@ -138,7 +138,7 @@ class CI_Calendar {
empty($config) OR $this->initialize($config);
- log_message('debug', 'Calendar Class Initialized');
+ log_message('info', 'Calendar Class Initialized');
}
// --------------------------------------------------------------------
@@ -548,6 +548,3 @@ class CI_Calendar {
}
}
-
-/* End of file Calendar.php */
-/* Location: ./system/libraries/Calendar.php */ \ No newline at end of file
diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php
index a0fe1053d..bf27c6392 100644
--- a/system/libraries/Cart.php
+++ b/system/libraries/Cart.php
@@ -115,7 +115,7 @@ class CI_Cart {
$this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);
}
- log_message('debug', 'Cart Class Initialized');
+ log_message('info', 'Cart Class Initialized');
}
// --------------------------------------------------------------------
@@ -565,6 +565,3 @@ class CI_Cart {
}
}
-
-/* End of file Cart.php */
-/* Location: ./system/libraries/Cart.php */ \ No newline at end of file
diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php
index 75466a186..da4c548e6 100644
--- a/system/libraries/Driver.php
+++ b/system/libraries/Driver.php
@@ -340,6 +340,3 @@ class CI_Driver {
}
}
-
-/* End of file Driver.php */
-/* Location: ./system/libraries/Driver.php */ \ No newline at end of file
diff --git a/system/libraries/Email.php b/system/libraries/Email.php
index c042aaade..4e0e0cd9f 100644
--- a/system/libraries/Email.php
+++ b/system/libraries/Email.php
@@ -421,7 +421,7 @@ class CI_Email {
$this->_safe_mode = ( ! is_php('5.4') && ini_get('safe_mode'));
$this->charset = strtoupper($this->charset);
- log_message('debug', 'Email Class Initialized');
+ log_message('info', 'Email Class Initialized');
}
// --------------------------------------------------------------------
@@ -2271,6 +2271,3 @@ class CI_Email {
}
}
-
-/* End of file Email.php */
-/* Location: ./system/libraries/Email.php */ \ No newline at end of file
diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php
index 45b3027eb..5faf1f206 100644
--- a/system/libraries/Encrypt.php
+++ b/system/libraries/Encrypt.php
@@ -97,7 +97,7 @@ class CI_Encrypt {
show_error('The Encrypt library requires the Mcrypt extension.');
}
- log_message('debug', 'Encrypt Class Initialized');
+ log_message('info', 'Encrypt Class Initialized');
}
// --------------------------------------------------------------------
@@ -478,6 +478,3 @@ class CI_Encrypt {
}
}
-
-/* End of file Encrypt.php */
-/* Location: ./system/libraries/Encrypt.php */ \ No newline at end of file
diff --git a/system/libraries/Encryption.php b/system/libraries/Encryption.php
index ef67b4cd5..fad4ea7f8 100644
--- a/system/libraries/Encryption.php
+++ b/system/libraries/Encryption.php
@@ -171,7 +171,7 @@ class CI_Encryption {
$this->_key = $key;
}
- log_message('debug', 'Encryption Class Initialized');
+ log_message('info', 'Encryption Class Initialized');
}
// --------------------------------------------------------------------
@@ -248,7 +248,7 @@ class CI_Encryption {
$params['mode'] = strtolower($params['mode']);
if ( ! isset($this->_modes['mcrypt'][$params['mode']]))
{
- log_message('error', 'Encryption: MCrypt mode '.strtotupper($params['mode']).' is not available.');
+ log_message('error', 'Encryption: MCrypt mode '.strtoupper($params['mode']).' is not available.');
}
else
{
@@ -268,7 +268,7 @@ class CI_Encryption {
if ($this->_handle = mcrypt_module_open($this->_cipher, '', $this->_mode, ''))
{
- log_message('debug', 'Encryption: MCrypt cipher '.strtoupper($this->_cipher).' initialized in '.strtoupper($this->_mode).' mode.');
+ log_message('info', 'Encryption: MCrypt cipher '.strtoupper($this->_cipher).' initialized in '.strtoupper($this->_mode).' mode.');
}
else
{
@@ -299,7 +299,7 @@ class CI_Encryption {
$params['mode'] = strtolower($params['mode']);
if ( ! isset($this->_modes['openssl'][$params['mode']]))
{
- log_message('error', 'Encryption: OpenSSL mode '.strtotupper($params['mode']).' is not available.');
+ log_message('error', 'Encryption: OpenSSL mode '.strtoupper($params['mode']).' is not available.');
}
else
{
@@ -322,7 +322,7 @@ class CI_Encryption {
else
{
$this->_handle = $handle;
- log_message('debug', 'Encryption: OpenSSL initialized with method '.strtoupper($handle).'.');
+ log_message('info', 'Encryption: OpenSSL initialized with method '.strtoupper($handle).'.');
}
}
}
@@ -924,6 +924,3 @@ class CI_Encryption {
: substr($str, $start);
}
}
-
-/* End of file Encryption.php */
-/* Location: ./system/libraries/Encryption.php */ \ No newline at end of file
diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
index f731544b1..f161b40e7 100644
--- a/system/libraries/Form_validation.php
+++ b/system/libraries/Form_validation.php
@@ -146,7 +146,7 @@ class CI_Form_validation {
// Automatically load the form helper
$this->CI->load->helper('form');
- log_message('debug', 'Form Validation Class Initialized');
+ log_message('info', 'Form Validation Class Initialized');
}
// --------------------------------------------------------------------
@@ -1449,6 +1449,20 @@ class CI_Form_validation {
// --------------------------------------------------------------------
/**
+ * Value should be within an array of values
+ *
+ * @param string
+ * @param string
+ * @return bool
+ */
+ public function in_list($value, $list)
+ {
+ return in_array($value, explode(',', $list), TRUE);
+ }
+
+ // --------------------------------------------------------------------
+
+ /**
* Is a Natural number (0,1,2,3, etc.)
*
* @param string
@@ -1589,6 +1603,3 @@ class CI_Form_validation {
}
}
-
-/* End of file Form_validation.php */
-/* Location: ./system/libraries/Form_validation.php */ \ No newline at end of file
diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php
index f6279cfc5..af45bb55f 100644
--- a/system/libraries/Ftp.php
+++ b/system/libraries/Ftp.php
@@ -112,7 +112,7 @@ class CI_FTP {
public function __construct($config = array())
{
empty($config) OR $this->initialize($config);
- log_message('debug', 'FTP Class Initialized');
+ log_message('info', 'FTP Class Initialized');
}
// --------------------------------------------------------------------
@@ -665,6 +665,3 @@ class CI_FTP {
}
}
-
-/* End of file Ftp.php */
-/* Location: ./system/libraries/Ftp.php */ \ No newline at end of file
diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php
index a70a7bb6f..e056654bb 100644
--- a/system/libraries/Image_lib.php
+++ b/system/libraries/Image_lib.php
@@ -392,7 +392,7 @@ class CI_Image_lib {
$this->initialize($props);
}
- log_message('debug', 'Image Lib Class Initialized');
+ log_message('info', 'Image Lib Class Initialized');
}
// --------------------------------------------------------------------
@@ -1212,6 +1212,13 @@ class CI_Image_lib {
imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity);
}
+ // We can preserve transparency for PNG images
+ if ($this->image_type === 3)
+ {
+ imagealphablending($src_img, FALSE);
+ imagesavealpha($src_img, TRUE);
+ }
+
// Output the image
if ($this->dynamic_output === TRUE)
{
@@ -1304,12 +1311,14 @@ class CI_Image_lib {
$y_axis = $this->wm_vrt_offset + $this->wm_padding;
if ($this->wm_use_drop_shadow === FALSE)
+ {
$this->wm_shadow_distance = 0;
+ }
$this->wm_vrt_alignment = strtoupper($this->wm_vrt_alignment[0]);
$this->wm_hor_alignment = strtoupper($this->wm_hor_alignment[0]);
- // Set verticle alignment
+ // Set vertical alignment
if ($this->wm_vrt_alignment === 'M')
{
$y_axis += ($this->orig_height / 2) + ($fontheight / 2);
@@ -1318,53 +1327,67 @@ class CI_Image_lib {
{
$y_axis += $this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight / 2);
}
-
- $x_shad = $x_axis + $this->wm_shadow_distance;
- $y_shad = $y_axis + $this->wm_shadow_distance;
-
+
+ // Set horizontal alignment
+ if ($this->wm_hor_alignment === 'R')
+ {
+ $x_axis += $this->orig_width - ($fontwidth * strlen($this->wm_text)) - $this->wm_shadow_distance;
+ }
+ elseif ($this->wm_hor_alignment === 'C')
+ {
+ $x_axis += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2);
+ }
+
if ($this->wm_use_drop_shadow)
{
- // Set horizontal alignment
- if ($this->wm_hor_alignment === 'R')
- {
- $x_shad += $this->orig_width - ($fontwidth * strlen($this->wm_text));
- $x_axis += $this->orig_width - ($fontwidth * strlen($this->wm_text));
- }
- elseif ($this->wm_hor_alignment === 'C')
- {
- $x_shad += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2);
- $x_axis += floor(($this->orig_width - ($fontwidth * strlen($this->wm_text))) / 2);
- }
-
- /* Set RGB values for text and shadow
+ // Offset from text
+ $x_shad = $x_axis + $this->wm_shadow_distance;
+ $y_shad = $y_axis + $this->wm_shadow_distance;
+
+ /* Set RGB values for shadow
*
* First character is #, so we don't really need it.
* Get the rest of the string and split it into 2-length
* hex values:
*/
- $txt_color = str_split(substr($this->wm_font_color, 1, 6), 2);
- $txt_color = imagecolorclosest($src_img, hexdec($txt_color[0]), hexdec($txt_color[1]), hexdec($txt_color[2]));
$drp_color = str_split(substr($this->wm_shadow_color, 1, 6), 2);
$drp_color = imagecolorclosest($src_img, hexdec($drp_color[0]), hexdec($drp_color[1]), hexdec($drp_color[2]));
-
- // Add the text to the source image
+
+ // Add the shadow to the source image
if ($this->wm_use_truetype)
{
imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text);
- imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text);
}
else
{
imagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color);
- imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color);
}
+ }
+
+ /* Set RGB values for text
+ *
+ * First character is #, so we don't really need it.
+ * Get the rest of the string and split it into 2-length
+ * hex values:
+ */
+ $txt_color = str_split(substr($this->wm_font_color, 1, 6), 2);
+ $txt_color = imagecolorclosest($src_img, hexdec($txt_color[0]), hexdec($txt_color[1]), hexdec($txt_color[2]));
- // We can preserve transparency for PNG images
- if ($this->image_type === 3)
- {
- imagealphablending($src_img, FALSE);
- imagesavealpha($src_img, TRUE);
- }
+ // Add the text to the source image
+ if ($this->wm_use_truetype)
+ {
+ imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text);
+ }
+ else
+ {
+ imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color);
+ }
+
+ // We can preserve transparency for PNG images
+ if ($this->image_type === 3)
+ {
+ imagealphablending($src_img, FALSE);
+ imagesavealpha($src_img, TRUE);
}
// Output the final image
@@ -1794,6 +1817,3 @@ class CI_Image_lib {
}
}
-
-/* End of file Image_lib.php */
-/* Location: ./system/libraries/Image_lib.php */ \ No newline at end of file
diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php
index 94586c069..4cc628692 100644
--- a/system/libraries/Javascript.php
+++ b/system/libraries/Javascript.php
@@ -85,7 +85,7 @@ class CI_Javascript {
// make js to refer to current library
$this->js =& $this->CI->$js_library_driver;
- log_message('debug', 'Javascript Class Initialized and loaded. Driver used: '.$js_library_driver);
+ log_message('info', 'Javascript Class Initialized and loaded. Driver used: '.$js_library_driver);
}
// --------------------------------------------------------------------
@@ -854,6 +854,3 @@ class CI_Javascript {
}
}
-
-/* End of file Javascript.php */
-/* Location: ./system/libraries/Javascript.php */ \ No newline at end of file
diff --git a/system/libraries/Javascript/Jquery.php b/system/libraries/Javascript/Jquery.php
index 1c6331f6b..25acceef7 100644
--- a/system/libraries/Javascript/Jquery.php
+++ b/system/libraries/Javascript/Jquery.php
@@ -115,7 +115,7 @@ class CI_Jquery extends CI_Javascript {
$this->script();
}
- log_message('debug', 'Jquery Class Initialized');
+ log_message('info', 'Jquery Class Initialized');
}
// --------------------------------------------------------------------
@@ -1074,6 +1074,3 @@ class CI_Jquery extends CI_Javascript {
}
}
-
-/* End of file Jquery.php */
-/* Location: ./system/libraries/Jquery.php */ \ No newline at end of file
diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php
index f46d45f5a..8ce4243fe 100644
--- a/system/libraries/Migration.php
+++ b/system/libraries/Migration.php
@@ -126,7 +126,7 @@ class CI_Migration {
$this->{'_'.$key} = $val;
}
- log_message('debug', 'Migrations class initialized');
+ log_message('info', 'Migrations Class Initialized');
// Are they trying to use migrations while it is disabled?
if ($this->_migration_enabled !== TRUE)
@@ -444,6 +444,3 @@ class CI_Migration {
}
}
-
-/* End of file Migration.php */
-/* Location: ./system/libraries/Migration.php */ \ No newline at end of file
diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php
index 1081fbec7..d63f61df6 100644
--- a/system/libraries/Pagination.php
+++ b/system/libraries/Pagination.php
@@ -299,6 +299,13 @@ class CI_Pagination {
protected $reuse_query_string = FALSE;
/**
+ * Use global URL suffix flag
+ *
+ * @var bool
+ */
+ protected $use_global_url_suffix = FALSE;
+
+ /**
* Data page attribute
*
* @var string
@@ -333,7 +340,7 @@ class CI_Pagination {
}
$this->initialize($params);
- log_message('debug', 'Pagination Class Initialized');
+ log_message('info', 'Pagination Class Initialized');
}
// --------------------------------------------------------------------
@@ -373,6 +380,11 @@ class CI_Pagination {
$this->page_query_string = TRUE;
}
+ if ($this->use_global_url_suffix === TRUE)
+ {
+ $this->suffix = $this->CI->config->item('url_suffix');
+ }
+
return $this;
}
@@ -682,6 +694,3 @@ class CI_Pagination {
}
}
-
-/* End of file Pagination.php */
-/* Location: ./system/libraries/Pagination.php */ \ No newline at end of file
diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php
index 5a2024955..57981af95 100644
--- a/system/libraries/Parser.php
+++ b/system/libraries/Parser.php
@@ -79,6 +79,7 @@ class CI_Parser {
public function __construct()
{
$this->CI =& get_instance();
+ log_message('info', 'Parser Class Initialized');
}
// --------------------------------------------------------------------
@@ -245,6 +246,3 @@ class CI_Parser {
}
}
-
-/* End of file Parser.php */
-/* Location: ./system/libraries/Parser.php */ \ No newline at end of file
diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php
index 9a4e833cc..f35d23faf 100644
--- a/system/libraries/Profiler.php
+++ b/system/libraries/Profiler.php
@@ -116,6 +116,7 @@ class CI_Profiler {
}
$this->set_sections($config);
+ log_message('info', 'Profiler Class Initialized');
}
// --------------------------------------------------------------------
@@ -573,6 +574,3 @@ class CI_Profiler {
}
}
-
-/* End of file Profiler.php */
-/* Location: ./system/libraries/Profiler.php */ \ No newline at end of file
diff --git a/system/libraries/Session/Session.php b/system/libraries/Session/Session.php
index 452afd5e5..2551e54e9 100644
--- a/system/libraries/Session/Session.php
+++ b/system/libraries/Session/Session.php
@@ -40,731 +40,856 @@ defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CodeIgniter Session Class
*
- * The user interface defined by EllisLab, now with puggable drivers to manage different storage mechanisms.
- * By default, the cookie session driver will load, but the 'sess_driver' config/param item (see above) can be
- * used to specify the 'native' driver, or any other you might create.
- * Once loaded, this driver setup is a drop-in replacement for the former CI_Session library, taking its place as the
- * 'session' member of the global controller framework (e.g.: $CI->session or $this->session).
- * In keeping with the CI_Driver methodology, multiple drivers may be loaded, although this might be a bit confusing.
- * The CI_Session library class keeps track of the most recently loaded driver as "current" to call for driver methods.
- * Ideally, one driver is loaded and all calls go directly through the main library interface. However, any methods
- * called through the specific driver will switch the "current" driver to itself before invoking the library method
- * (which will then call back into the driver for low-level operations). So, alternation between two drivers can be
- * achieved by specifying which driver to use for each call (e.g.: $this->session->native->set_userdata('foo', 'bar');
- * $this->session->cookie->userdata('foo'); $this->session->native->unset_userdata('foo');). Notice in the previous
- * example that the _native_ userdata value 'foo' would be set to 'bar', which would NOT be returned by the call for
- * the _cookie_ userdata 'foo', nor would the _cookie_ value be unset by the call to unset the _native_ 'foo' value.
- *
* @package CodeIgniter
* @subpackage Libraries
* @category Sessions
- * @author EllisLab Dev Team
+ * @author Andrey Andreev
* @link http://codeigniter.com/user_guide/libraries/sessions.html
*/
-class CI_Session extends CI_Driver_Library {
-
- /**
- * Initialization parameters
- *
- * @var array
- */
- public $params = array();
+class CI_Session {
/**
- * Valid drivers list
+ * Userdata array
*
- * @var array
+ * Just a reference to $_SESSION, for BC purposes.
*/
- public $valid_drivers = array('native', 'cookie');
+ public $userdata;
- /**
- * Current driver in use
- *
- * @var string
- */
- public $current = NULL;
-
- /**
- * User data
- *
- * @var array
- */
- protected $userdata = array();
-
- // ------------------------------------------------------------------------
-
- const FLASHDATA_KEY = 'flash';
- const FLASHDATA_NEW = ':new:';
- const FLASHDATA_OLD = ':old:';
- const FLASHDATA_EXP = ':exp:';
- const EXPIRATION_KEY = '__expirations';
- const TEMP_EXP_DEF = 300;
+ protected $_driver = 'files';
+ protected $_config;
// ------------------------------------------------------------------------
/**
- * CI_Session constructor
+ * Class constructor
*
- * The constructor loads the configured driver ('sess_driver' in config.php or as a parameter), running
- * routines in its constructor, and manages flashdata aging.
- *
- * @param array Configuration parameters
+ * @param array $params Configuration parameters
* @return void
*/
public function __construct(array $params = array())
{
- $_config =& get_instance()->config;
-
// No sessions under CLI
if (is_cli())
{
+ log_message('debug', 'Session: Initialization under CLI aborted.');
return;
}
-
- log_message('debug', 'CI_Session Class Initialized');
-
- // Add possible extra entries to our valid drivers list
- $drivers = isset($params['sess_valid_drivers']) ? $params['sess_valid_drivers'] : $_config->item('sess_valid_drivers');
- if ( ! empty($drivers))
+ elseif ((bool) ini_get('session.auto_start'))
{
- $drivers = array_map('strtolower', (array) $drivers);
- $this->valid_drivers = array_merge($this->valid_drivers, array_diff($drivers, $this->valid_drivers));
+ log_message('error', 'Session: session.auto_start is enabled in php.ini. Aborting.');
+ return;
}
-
- // Get driver to load
- $driver = isset($params['sess_driver']) ? $params['sess_driver'] : $_config->item('sess_driver');
- if ( ! $driver)
+ elseif ( ! empty($params['driver']))
+ {
+ $this->_driver = $params['driver'];
+ unset($params['driver']);
+ }
+ elseif ($driver = config_item('sess_driver'))
+ {
+ $this->_driver = $driver;
+ }
+ // Note: BC workaround
+ elseif (config_item('sess_use_database'))
{
- log_message('debug', "Session: No driver name is configured, defaulting to 'cookie'.");
- $driver = 'cookie';
+ $this->_driver = 'database';
}
- if ( ! in_array($driver, $this->valid_drivers))
+ if (($class = $this->_ci_load_classes($this->_driver)) === FALSE)
{
- log_message('error', 'Session: Configured driver name is not valid, aborting.');
return;
}
- // Save a copy of parameters in case drivers need access
- $this->params = $params;
+ // Configuration ...
+ $this->_configure($params);
- // Load driver and get array reference
- $this->load_driver($driver);
+ $class = new $class($this->_config);
+ if ($class instanceof SessionHandlerInterface)
+ {
+ if (is_php('5.4'))
+ {
+ session_set_save_handler($class, TRUE);
+ }
+ else
+ {
+ session_set_save_handler(
+ array($class, 'open'),
+ array($class, 'close'),
+ array($class, 'read'),
+ array($class, 'write'),
+ array($class, 'destroy'),
+ array($class, 'gc')
+ );
+
+ register_shutdown_function('session_write_close');
+ }
+ }
+ else
+ {
+ log_message('error', "Session: Driver '".$this->_driver."' doesn't implement SessionHandlerInterface. Aborting.");
+ return;
+ }
- // Delete 'old' flashdata (from last request)
- $this->_flashdata_sweep();
+ // Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers
+ if (isset($_COOKIE[$this->_config['cookie_name']])
+ && (
+ ! is_string($_COOKIE[$this->_config['cookie_name']])
+ OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
+ )
+ )
+ {
+ unset($_COOKIE[$this->_config['cookie_name']]);
+ }
- // Mark all new flashdata as old (data will be deleted before next request)
- $this->_flashdata_mark();
+ session_start();
- // Delete expired tempdata
- $this->_tempdata_sweep();
+ // Is session ID auto-regeneration configured? (ignoring ajax requests)
+ if ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH'])
+ && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'
+ && ($regenerate_time = config_item('sess_time_to_update')) > 0
+ )
+ {
+ if ( ! isset($_SESSION['__ci_last_regenerate']))
+ {
+ $_SESSION['__ci_last_regenerate'] = time();
+ }
+ elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time))
+ {
+ $this->sess_regenerate(FALSE);
+ }
+ }
+ // Another work-around ... PHP doesn't seem to send the session cookie
+ // unless it is being currently created or regenerated
+ elseif (isset($_COOKIE[$this->_config['cookie_name']]) && $_COOKIE[$this->_config['cookie_name']] === session_id())
+ {
+ setcookie(
+ $this->_config['cookie_name'],
+ session_id(),
+ (empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']),
+ $this->_config['cookie_path'],
+ $this->_config['cookie_domain'],
+ $this->_config['cookie_secure'],
+ TRUE
+ );
+ }
+
+ $this->_ci_init_vars();
- log_message('debug', 'CI_Session routines successfully run');
+ log_message('info', "Session: Class initialized using '".$this->_driver."' driver.");
}
// ------------------------------------------------------------------------
/**
- * Loads session storage driver
+ * CI Load Classes
*
- * @param string Driver classname
- * @return object Loaded driver object
+ * An internal method to load all possible dependency and extension
+ * classes. It kind of emulates the CI_Driver library, but is
+ * self-sufficient.
+ *
+ * @param string $driver Driver name
+ * @return string Driver class name
*/
- public function load_driver($driver)
+ protected function _ci_load_classes($driver)
{
- // Save reference to most recently loaded driver as library default and sync userdata
- $this->current = parent::load_driver($driver);
- $this->userdata =& $this->current->get_userdata();
- return $this->current;
- }
+ // PHP 5.4 compatibility
+ interface_exists('SessionHandlerInterface', FALSE) OR require_once(BASEPATH.'libraries/Session/SessionHandlerInterface.php');
- // ------------------------------------------------------------------------
+ $prefix = config_item('subclass_prefix');
- /**
- * Select default session storage driver
- *
- * @param string Driver name
- * @return void
- */
- public function select_driver($driver)
- {
- // Validate driver name
- $prefix = (string) get_instance()->config->item('subclass_prefix');
- $child = strtolower(str_replace(array('CI_', $prefix, $this->lib_name.'_'), '', $driver));
- if (in_array($child, array_map('strtolower', $this->valid_drivers)))
+ if ( ! class_exists('CI_Session_driver', FALSE))
{
- // See if driver is loaded
- if (isset($this->$child))
+ require_once(
+ file_exists(APPPATH.'libraries/Session/Session_driver.php')
+ ? APPPATH.'libraries/Session/Session_driver.php'
+ : BASEPATH.'libraries/Session/Session_driver.php'
+ );
+
+ if (file_exists($file_path = APPPATH.'libraries/Session/'.$prefix.'Session_driver.php'))
{
- // See if driver is already current
- if ($this->$child !== $this->current)
- {
- // Make driver current and sync userdata
- $this->current = $this->$child;
- $this->userdata =& $this->current->get_userdata();
- }
+ require_once($file_path);
+ }
+ }
+
+ $class = 'Session_'.$driver.'_driver';
+
+ // Allow custom drivers without the CI_ or MY_ prefix
+ if ( ! class_exists($class, FALSE) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php'))
+ {
+ require_once($file_path);
+ if (class_exists($class, FALSE))
+ {
+ return $class;
+ }
+ }
+
+ if ( ! class_exists('CI_'.$class, FALSE))
+ {
+ if (file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$class.'.php') OR file_exists($file_path = BASEPATH.'libraries/Session/drivers/'.$class.'.php'))
+ {
+ require_once($file_path);
+ }
+
+ if ( ! class_exists('CI_'.$class, FALSE) && ! class_exists($class, FALSE))
+ {
+ log_message('error', "Session: Configured driver '".$driver."' was not found. Aborting.");
+ return FALSE;
+ }
+ }
+
+ if ( ! class_exists($prefix.$class) && file_exists($file_path = APPPATH.'libraries/Session/drivers/'.$prefix.$class.'.php'))
+ {
+ require_once($file_path);
+ if (class_exists($prefix.$class, FALSE))
+ {
+ return $prefix.$class;
}
else
{
- // Load new driver
- $this->load_driver($child);
+ log_message('debug', 'Session: '.$prefix.$class.".php found but it doesn't declare class ".$prefix.$class.'.');
}
}
+
+ return 'CI_'.$class;
}
// ------------------------------------------------------------------------
/**
- * Destroy the current session
+ * Configuration
+ *
+ * Handle input parameters and configuration defaults
*
+ * @param array &$params Input parameters
* @return void
*/
- public function sess_destroy()
+ protected function _configure(&$params)
{
- // Just call destroy on driver
- $this->current->sess_destroy();
- }
+ $expiration = config_item('sess_expiration');
- // ------------------------------------------------------------------------
+ if (isset($params['cookie_lifetime']))
+ {
+ $params['cookie_lifetime'] = (int) $params['cookie_lifetime'];
+ }
+ else
+ {
+ $params['cookie_lifetime'] = ( ! isset($expiration) && config_item('sess_expire_on_close'))
+ ? 0 : (int) $expiration;
+ }
- /**
- * Regenerate the current session
- *
- * @param bool Destroy session data flag (default: false)
- * @return void
- */
- public function sess_regenerate($destroy = FALSE)
- {
- // Call regenerate on driver and resync userdata
- $this->current->sess_regenerate($destroy);
- $this->userdata =& $this->current->get_userdata();
- }
+ isset($params['cookie_name']) OR $params['cookie_name'] = config_item('sess_cookie_name');
+ if (empty($params['cookie_name']))
+ {
+ $params['cookie_name'] = ini_get('session.name');
+ }
+ else
+ {
+ ini_set('session.name', $params['cookie_name']);
+ }
- // ------------------------------------------------------------------------
+ isset($params['cookie_path']) OR $params['cookie_path'] = config_item('cookie_path');
+ isset($params['cookie_domain']) OR $params['cookie_domain'] = config_item('cookie_domain');
+ isset($params['cookie_secure']) OR $params['cookie_secure'] = (bool) config_item('cookie_secure');
- /**
- * Fetch a specific item from the session array
- *
- * @param string Item key
- * @return string Item value or NULL if not found
- */
- public function userdata($item = NULL)
- {
- if (isset($item))
+ session_set_cookie_params(
+ $params['cookie_lifetime'],
+ $params['cookie_path'],
+ $params['cookie_domain'],
+ $params['cookie_secure'],
+ TRUE // HttpOnly; Yes, this is intentional and not configurable for security reasons
+ );
+
+ if (empty($expiration))
+ {
+ $params['expiration'] = (int) ini_get('session.gc_maxlifetime');
+ }
+ else
{
- return isset($this->userdata[$item]) ? $this->userdata[$item] : NULL;
+ $params['expiration'] = (int) $expiration;
+ ini_set('session.gc_maxlifetime', $expiration);
}
- return isset($this->userdata) ? $this->userdata : array();
- }
+ $params['match_ip'] = (bool) (isset($params['match_ip']) ? $params['match_ip'] : config_item('sess_match_ip'));
- // ------------------------------------------------------------------------
+ isset($params['save_path']) OR $params['save_path'] = config_item('sess_save_path');
- /**
- * Fetch all session data
- *
- * @deprecated 3.0.0 Use userdata() with no parameters instead
- * @return array User data array
- */
- public function all_userdata()
- {
- return isset($this->userdata) ? $this->userdata : array();
+ $this->_config = $params;
+
+ // Security is king
+ ini_set('session.use_trans_id', 0);
+ ini_set('session.use_strict_mode', 1);
+ ini_set('session.use_cookies', 1);
+ ini_set('session.use_only_cookies', 1);
+ ini_set('session.hash_function', 1);
+ ini_set('session.hash_bits_per_character', 4);
}
// ------------------------------------------------------------------------
/**
- * Add or change data in the "userdata" array
+ * Handle temporary variables
+ *
+ * Clears old "flash" data, marks the new one for deletion and handles
+ * "temp" data deletion.
*
- * @param mixed Item name or array of items
- * @param string Item value or empty string
* @return void
*/
- public function set_userdata($newdata, $newval = '')
+ protected function _ci_init_vars()
{
- // Wrap params as array if singular
- if (is_string($newdata))
+ if ( ! empty($_SESSION['__ci_vars']))
{
- $newdata = array($newdata => $newval);
- }
+ $current_time = time();
- // Set each name/value pair
- if (count($newdata) > 0)
- {
- foreach ($newdata as $key => $val)
+ foreach ($_SESSION['__ci_vars'] as $key => &$value)
+ {
+ if ($value === 'new')
+ {
+ $_SESSION['__ci_vars'][$key] = 'old';
+ }
+ // Hacky, but 'old' will (implicitly) always be less than time() ;)
+ // DO NOT move this above the 'new' check!
+ elseif ($value < $current_time)
+ {
+ unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);
+ }
+ }
+
+ if (empty($_SESSION['__ci_vars']))
{
- $this->userdata[$key] = $val;
+ unset($_SESSION['__ci_vars']);
}
}
- // Tell driver data changed
- $this->current->sess_save();
+ $this->userdata =& $_SESSION;
}
// ------------------------------------------------------------------------
/**
- * Delete a session variable from the "userdata" array
+ * Mark as flash
*
- * @param mixed Item name or array of item names
- * @return void
+ * @param mixed $key Session data key(s)
+ * @return bool
*/
- public function unset_userdata($newdata)
+ public function mark_as_flash($key)
{
- // Wrap single name as array
- if (is_string($newdata))
+ if (is_array($key))
{
- $newdata = array($newdata => '');
+ for ($i = 0, $c = count($key); $i < $c; $i++)
+ {
+ if ( ! isset($_SESSION[$key[$i]]))
+ {
+ return FALSE;
+ }
+ }
+
+ $new = array_fill_keys($key, 'new');
+
+ $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])
+ ? array_merge($_SESSION['__ci_vars'], $new)
+ : $new;
+
+ return TRUE;
}
- // Unset each item name
- if (count($newdata) > 0)
+ if ( ! isset($_SESSION[$key]))
{
- foreach (array_keys($newdata) as $key)
- {
- unset($this->userdata[$key]);
- }
+ return FALSE;
}
- // Tell driver data changed
- $this->current->sess_save();
+ $_SESSION['__ci_vars'][$key] = 'new';
+ return TRUE;
}
// ------------------------------------------------------------------------
/**
- * Determine if an item exists
+ * Get flash keys
*
- * @param string Item name
- * @return bool
+ * @return array
*/
- public function has_userdata($item)
+ public function get_flash_keys()
{
- return isset($this->userdata[$item]);
+ if ( ! isset($_SESSION['__ci_vars']))
+ {
+ return array();
+ }
+
+ $keys = array();
+ foreach (array_keys($_SESSION['__ci_vars']) as $key)
+ {
+ is_int($_SESSION['__ci_vars'][$key]) OR $keys[] = $key;
+ }
+
+ return $keys;
}
// ------------------------------------------------------------------------
/**
- * Add or change flashdata, only available until the next request
+ * Unmark flash
*
- * @param mixed Item name or array of items
- * @param string Item value or empty string
+ * @param mixed $key Session data key(s)
* @return void
*/
- public function set_flashdata($newdata, $newval = '')
+ public function unmark_flash($key)
{
- // Wrap item as array if singular
- if (is_string($newdata))
+ if (empty($_SESSION['__ci_vars']))
{
- $newdata = array($newdata => $newval);
+ return;
}
- // Prepend each key name and set value
- if (count($newdata) > 0)
+ is_array($key) OR $key = array($key);
+
+ foreach ($key as $k)
{
- foreach ($newdata as $key => $val)
+ if (isset($_SESSION['__ci_vars'][$k]) && ! is_int($_SESSION['__ci_vars'][$k]))
{
- $flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_NEW.$key;
- $this->set_userdata($flashdata_key, $val);
+ unset($_SESSION['__ci_vars'][$k]);
}
}
+
+ if (empty($_SESSION['__ci_vars']))
+ {
+ unset($_SESSION['__ci_vars']);
+ }
}
// ------------------------------------------------------------------------
/**
- * Keeps existing flashdata available to next request.
+ * Mark as temp
*
- * @param mixed Item key(s)
- * @return void
+ * @param mixed $key Session data key(s)
+ * @param int $ttl Time-to-live in seconds
+ * @return bool
*/
- public function keep_flashdata($key)
+ public function mark_as_temp($key, $ttl = 300)
{
+ $ttl += time();
if (is_array($key))
{
- foreach ($key as $k)
+ $temp = array();
+
+ foreach ($key as $k => $v)
{
- $this->keep_flashdata($k);
+ // Do we have a key => ttl pair, or just a key?
+ if (is_int($k))
+ {
+ $k = $v;
+ $v = $ttl;
+ }
+ else
+ {
+ $v += time();
+ }
+
+ if ( ! isset($_SESSION[$k]))
+ {
+ return FALSE;
+ }
+
+ $temp[$k] = $v;
}
- return;
+ $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])
+ ? array_merge($_SESSION['__ci_vars'], $temp)
+ : $temp;
+
+ return TRUE;
}
- // 'old' flashdata gets removed. Here we mark all flashdata as 'new' to preserve it from _flashdata_sweep()
- // Note the function will return NULL if the $key provided cannot be found
- $old_flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_OLD.$key;
- $value = $this->userdata($old_flashdata_key);
+ if ( ! isset($_SESSION[$key]))
+ {
+ return FALSE;
+ }
- $new_flashdata_key = self::FLASHDATA_KEY.self::FLASHDATA_NEW.$key;
- $this->set_userdata($new_flashdata_key, $value);
+ $_SESSION['__ci_vars'][$key] = $ttl;
+ return TRUE;
}
// ------------------------------------------------------------------------
/**
- * Fetch a specific flashdata item from the session array
+ * Get temp keys
*
- * @param string Item key
- * @return string
+ * @return array
*/
- public function flashdata($key = NULL)
+ public function get_temp_keys()
{
- if (isset($key))
+ if ( ! isset($_SESSION['__ci_vars']))
{
- return $this->userdata(self::FLASHDATA_KEY.self::FLASHDATA_OLD.$key);
+ return array();
}
- // Get our flashdata items from userdata
- $out = array();
- foreach ($this->userdata() as $key => $val)
+ $keys = array();
+ foreach (array_keys($_SESSION['__ci_vars']) as $key)
{
- if (strpos($key, self::FLASHDATA_KEY.self::FLASHDATA_OLD) !== FALSE)
- {
- $key = str_replace(self::FLASHDATA_KEY.self::FLASHDATA_OLD, '', $key);
- $out[$key] = $val;
- }
+ is_int($_SESSION['__ci_vars'][$key]) && $keys[] = $key;
}
- return $out;
+ return $keys;
}
// ------------------------------------------------------------------------
/**
- * Add or change tempdata, only available until expiration
+ * Unmark flash
*
- * @param mixed Item name or array of items
- * @param string Item value or empty string
- * @param int Item lifetime in seconds or 0 for default
+ * @param mixed $key Session data key(s)
* @return void
*/
- public function set_tempdata($newdata, $newval = '', $expire = 0)
+ public function unmark_temp($key)
{
- // Set expiration time
- $expire = time() + ($expire ? $expire : self::TEMP_EXP_DEF);
-
- // Wrap item as array if singular
- if (is_string($newdata))
+ if (empty($_SESSION['__ci_vars']))
{
- $newdata = array($newdata => $newval);
+ return;
}
- // Get or create expiration list
- $expirations = $this->userdata(self::EXPIRATION_KEY);
- if ( ! $expirations)
- {
- $expirations = array();
- }
+ is_array($key) OR $key = array($key);
- // Prepend each key name and set value
- if (count($newdata) > 0)
+ foreach ($key as $k)
{
- foreach ($newdata as $key => $val)
+ if (isset($_SESSION['__ci_vars'][$k]) && is_int($_SESSION['__ci_vars'][$k]))
{
- $tempdata_key = self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key;
- $expirations[$tempdata_key] = $expire;
- $this->set_userdata($tempdata_key, $val);
+ unset($_SESSION['__ci_vars'][$k]);
}
}
- // Update expiration list
- $this->set_userdata(self::EXPIRATION_KEY, $expirations);
+ if (empty($_SESSION['__ci_vars']))
+ {
+ unset($_SESSION['__ci_vars']);
+ }
}
// ------------------------------------------------------------------------
/**
- * Delete a temporary session variable from the "userdata" array
+ * __get()
*
- * @param mixed Item name or array of item names
- * @return void
+ * @param string $key 'session_id' or a session data key
+ * @return mixed
*/
- public function unset_tempdata($newdata)
+ public function __get($key)
{
- // Get expirations list
- $expirations = $this->userdata(self::EXPIRATION_KEY);
- if (empty($expirations))
- {
- // Nothing to do
- return;
- }
-
- // Wrap single name as array
- if (is_string($newdata))
+ // Note: Keep this order the same, just in case somebody wants to
+ // use 'session_id' as a session data key, for whatever reason
+ if (isset($_SESSION[$key]))
{
- $newdata = array($newdata => '');
+ return $_SESSION[$key];
}
-
- // Prepend each item name and unset
- if (count($newdata) > 0)
+ elseif ($key === 'session_id')
{
- foreach (array_keys($newdata) as $key)
- {
- $tempdata_key = self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key;
- unset($expirations[$tempdata_key]);
- $this->unset_userdata($tempdata_key);
- }
+ return session_id();
}
- // Update expiration list
- $this->set_userdata(self::EXPIRATION_KEY, $expirations);
+ return NULL;
}
// ------------------------------------------------------------------------
/**
- * Fetch a specific tempdata item from the session array
+ * __set()
*
- * @param string Item key
- * @return string
+ * @param string $key Session data key
+ * @param mixed $value Session data value
+ * @return void
*/
- public function tempdata($key = NULL)
+ public function __set($key, $value)
{
- if (isset($key))
- {
- return $this->userdata(self::FLASHDATA_KEY.self::FLASHDATA_EXP.$key);
- }
+ $_SESSION[$key] = $value;
+ }
- // Get our tempdata items from userdata
- $out = array();
- foreach ($this->userdata() as $key => $val)
- {
- if (strpos($key, self::FLASHDATA_KEY.self::FLASHDATA_EXP) !== FALSE)
- {
- $key = str_replace(self::FLASHDATA_KEY.self::FLASHDATA_EXP, '', $key);
- $out[$key] = $val;
- }
- }
+ // ------------------------------------------------------------------------
- return $out;
+ /**
+ * Session destroy
+ *
+ * Legacy CI_Session compatibility method
+ *
+ * @return void
+ */
+ public function sess_destroy()
+ {
+ session_destroy();
}
// ------------------------------------------------------------------------
/**
- * Identifies flashdata as 'old' for removal
- * when _flashdata_sweep() runs.
+ * Session regenerate
+ *
+ * Legacy CI_Session compatibility method
*
+ * @param bool $destroy Destroy old session data flag
* @return void
*/
- protected function _flashdata_mark()
+ public function sess_regenerate($destroy = FALSE)
{
- foreach ($this->userdata() as $name => $value)
- {
- $parts = explode(self::FLASHDATA_NEW, $name);
- if (count($parts) === 2)
- {
- $this->set_userdata(self::FLASHDATA_KEY.self::FLASHDATA_OLD.$parts[1], $value);
- $this->unset_userdata($name);
- }
- }
+ $_SESSION['__ci_last_regenerate'] = time();
+ session_regenerate_id($destroy);
}
// ------------------------------------------------------------------------
/**
- * Removes all flashdata marked as 'old'
+ * Get userdata reference
*
- * @return void
+ * Legacy CI_Session compatibility method
+ *
+ * @returns array
*/
- protected function _flashdata_sweep()
+ public function &get_userdata()
{
- $userdata = $this->userdata();
- foreach (array_keys($userdata) as $key)
- {
- if (strpos($key, self::FLASHDATA_OLD))
- {
- $this->unset_userdata($key);
- }
- }
+ return $_SESSION;
}
// ------------------------------------------------------------------------
/**
- * Removes all expired tempdata
+ * Userdata (fetch)
*
- * @return void
+ * Legacy CI_Session compatibility method
+ *
+ * @param string $key Session data key
+ * @return mixed Session data value or NULL if not found
*/
- protected function _tempdata_sweep()
+ public function userdata($key = NULL)
{
- // Get expirations list
- $expirations = $this->userdata(self::EXPIRATION_KEY);
- if (empty($expirations))
+ if (isset($key))
{
- // Nothing to do
- return;
+ return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL;
}
+ elseif (empty($_SESSION))
+ {
+ return array();
+ }
+
+ $userdata = array();
+ $_exclude = array_merge(
+ array('__ci_vars'),
+ $this->get_flash_keys(),
+ $this->get_temp_keys()
+ );
- // Unset expired elements
- $now = time();
- $userdata = $this->userdata();
- foreach (array_keys($userdata) as $key)
+ foreach (array_keys($_SESSION) as $key)
{
- if (strpos($key, self::FLASHDATA_EXP) && $expirations[$key] < $now)
+ if ( ! in_array($key, $_exclude, TRUE))
{
- unset($expirations[$key]);
- $this->unset_userdata($key);
+ $userdata[$key] = $_SESSION[$key];
}
}
- // Update expiration list
- $this->set_userdata(self::EXPIRATION_KEY, $expirations);
+ return $userdata;
}
-}
-
-// ------------------------------------------------------------------------
-
-/**
- * CI_Session_driver Class
- *
- * Extend this class to make a new CI_Session driver.
- * A CI_Session driver basically manages an array of name/value pairs with some sort of storage mechanism.
- * To make a new driver, derive from (extend) CI_Session_driver. Overload the initialize method and read or create
- * session data. Then implement a save handler to write changed data to storage (sess_save), a destroy handler
- * to remove deleted data (sess_destroy), and an access handler to expose the data (get_userdata).
- * Put your driver in the libraries/Session/drivers folder anywhere in the loader paths. This includes the
- * application directory, the system directory, or any path you add with $CI->load->add_package_path().
- * Your driver must be named CI_Session_<name>, and your filename must be Session_<name>.php,
- * preferably also capitalized. (e.g.: CI_Session_foo in libraries/Session/drivers/Session_foo.php)
- * Then specify the driver by setting 'sess_driver' in your config file or as a parameter when loading the CI_Session
- * object. (e.g.: $config['sess_driver'] = 'foo'; OR $CI->load->driver('session', array('sess_driver' => 'foo')); )
- * Already provided are the Native driver, which manages the native PHP $_SESSION array, and
- * the Cookie driver, which manages the data in a browser cookie, with optional extra storage in a database table.
- *
- * @package CodeIgniter
- * @subpackage Libraries
- * @category Sessions
- * @author EllisLab Dev Team
- */
-abstract class CI_Session_driver extends CI_Driver {
+ // ------------------------------------------------------------------------
/**
- * CI Singleton
+ * Set userdata
+ *
+ * Legacy CI_Session compatibility method
*
- * @see get_instance()
- * @var object
+ * @param mixed $data Session data key or an associative array
+ * @param mixed $value Value to store
+ * @return void
*/
- protected $CI;
+ public function set_userdata($data, $value = NULL)
+ {
+ if (is_array($data))
+ {
+ foreach ($data as $key => &$value)
+ {
+ $_SESSION[$key] = $value;
+ }
+
+ return;
+ }
+
+ $_SESSION[$data] = $value;
+ }
// ------------------------------------------------------------------------
/**
- * Constructor
+ * Unset userdata
*
- * Gets the CI singleton, so that individual drivers
- * don't have to do it separately.
+ * Legacy CI_Session compatibility method
*
+ * @param mixed $data Session data key(s)
* @return void
*/
- public function __construct()
+ public function unset_userdata($key)
{
- $this->CI =& get_instance();
+ if (is_array($key))
+ {
+ foreach ($key as $k)
+ {
+ unset($_SESSION[$k]);
+ }
+
+ return;
+ }
+
+ unset($_SESSION[$key]);
}
// ------------------------------------------------------------------------
/**
- * Decorate
+ * All userdata (fetch)
*
- * Decorates the child with the parent driver lib's methods and properties
+ * Legacy CI_Session compatibility method
*
- * @param object Parent library object
- * @return void
+ * @return array $_SESSION, excluding flash data items
*/
- public function decorate($parent)
+ public function all_userdata()
{
- // Call base class decorate first
- parent::decorate($parent);
+ return $this->userdata();
+ }
- // Call initialize method now that driver has access to $this->_parent
- $this->initialize();
+ // ------------------------------------------------------------------------
+
+ /**
+ * Has userdata
+ *
+ * Legacy CI_Session compatibility method
+ *
+ * @param string $key Session data key
+ * @return bool
+ */
+ public function has_userdata($key)
+ {
+ return isset($_SESSION[$key]);
}
// ------------------------------------------------------------------------
/**
- * __call magic method
+ * Flashdata (fetch)
*
- * Handles access to the parent driver library's methods
+ * Legacy CI_Session compatibility method
*
- * @param string Library method name
- * @param array Method arguments (default: none)
- * @return mixed
+ * @param string $key Session data key
+ * @return mixed Session data value or NULL if not found
*/
- public function __call($method, $args = array())
+ public function flashdata($key = NULL)
{
- // Make sure the parent library uses this driver
- $this->_parent->select_driver(get_class($this));
- return parent::__call($method, $args);
+ if (isset($key))
+ {
+ return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && ! is_int($_SESSION['__ci_vars'][$key]))
+ ? $_SESSION[$key]
+ : NULL;
+ }
+
+ $flashdata = array();
+
+ if ( ! empty($_SESSION['__ci_vars']))
+ {
+ foreach ($_SESSION['__ci_vars'] as $key => &$value)
+ {
+ is_int($value) OR $flashdata[$key] = $_SESSION[$key];
+ }
+ }
+
+ return $flashdata;
}
// ------------------------------------------------------------------------
/**
- * Initialize driver
+ * Set flashdata
*
+ * Legacy CI_Session compatibiliy method
+ *
+ * @param mixed $data Session data key or an associative array
+ * @param mixed $value Value to store
* @return void
*/
- protected function initialize()
+ public function set_flashdata($data, $value = NULL)
{
- // Overload this method to implement initialization
+ $this->set_userdata($data, $value);
+ $this->mark_as_flash(is_array($data) ? array_keys($data) : $data);
}
// ------------------------------------------------------------------------
/**
- * Save the session data
+ * Keep flashdata
*
- * Data in the array has changed - perform any storage synchronization
- * necessary. The child class MUST implement this abstract method!
+ * Legacy CI_Session compatibility method
*
+ * @param mixed $key Session data key(s)
* @return void
*/
- abstract public function sess_save();
+ public function keep_flashdata($key)
+ {
+ $this->mark_as_flash($key);
+ }
// ------------------------------------------------------------------------
/**
- * Destroy the current session
+ * Temp data (fetch)
*
- * Clean up storage for this session - it has been terminated.
- * The child class MUST implement this abstract method!
+ * Legacy CI_Session compatibility method
*
- * @return void
+ * @param string $key Session data key
+ * @return mixed Session data value or NULL if not found
*/
- abstract public function sess_destroy();
+ public function tempdata($key = NULL)
+ {
+ if (isset($key))
+ {
+ return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$key]))
+ ? $_SESSION[$key]
+ : NULL;
+ }
+
+ $tempdata = array();
+
+ if ( ! empty($_SESSION['__ci_vars']))
+ {
+ foreach ($_SESSION['__ci_vars'] as $key => &$value)
+ {
+ is_int($value) && $tempdata[$key] = $_SESSION[$key];
+ }
+ }
+
+ return $tempdata;
+ }
// ------------------------------------------------------------------------
/**
- * Regenerate the current session
+ * Set tempdata
*
- * Regenerate the session ID.
- * The child class MUST implement this abstract method!
+ * Legacy CI_Session compatibility method
*
- * @param bool Destroy session data flag (default: false)
+ * @param mixed $data Session data key or an associative array of items
+ * @param mixed $value Value to store
+ * @param int $ttl Time-to-live in seconds
* @return void
*/
- abstract public function sess_regenerate($destroy = FALSE);
+ public function set_tempdata($data, $value = NULL, $ttl = 300)
+ {
+ $this->set_userdata($data, $value);
+ $this->mark_as_temp($data, $ttl);
+ }
// ------------------------------------------------------------------------
/**
- * Get a reference to user data array
+ * Unset tempdata
*
- * Give array access to the main CI_Session object.
- * The child class MUST implement this abstract method!
+ * Legacy CI_Session compatibility method
*
- * @return array Reference to userdata
+ * @param mixed $data Session data key(s)
+ * @return void
*/
- abstract public function &get_userdata();
+ public function unset_tempdata($key)
+ {
+ $this->unmark_temp($key);
+ }
}
-
-/* End of file Session.php */
-/* Location: ./system/libraries/Session/Session.php */ \ No newline at end of file
diff --git a/system/libraries/Session/SessionHandlerInterface.php b/system/libraries/Session/SessionHandlerInterface.php
new file mode 100644
index 000000000..9dab5ac07
--- /dev/null
+++ b/system/libraries/Session/SessionHandlerInterface.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+ */
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * SessionHandlerInterface
+ *
+ * PHP 5.4 compatibility interface
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+interface SessionHandlerInterface {
+
+ public function open($save_path, $name);
+ public function close();
+ public function read($session_id);
+ public function write($session_id, $session_data);
+ public function destroy($session_id);
+ public function gc($maxlifetime);
+}
diff --git a/system/libraries/Session/Session_driver.php b/system/libraries/Session/Session_driver.php
new file mode 100644
index 000000000..47376da5b
--- /dev/null
+++ b/system/libraries/Session/Session_driver.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+ */
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * CodeIgniter Session Driver Class
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+abstract class CI_Session_driver implements SessionHandlerInterface {
+
+ protected $_config;
+
+ /**
+ * Data fingerprint
+ *
+ * @var bool
+ */
+ protected $_fingerprint;
+
+ /**
+ * Lock placeholder
+ *
+ * @var mixed
+ */
+ protected $_lock = FALSE;
+
+ /**
+ * Read session ID
+ *
+ * Used to detect session_regenerate_id() calls because PHP only calls
+ * write() after regenerating the ID.
+ *
+ * @var string
+ */
+ protected $_session_id;
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Class constructor
+ *
+ * @param array $params Configuration parameters
+ * @return void
+ */
+ public function __construct(&$params)
+ {
+ $this->_config =& $params;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Cookie destroy
+ *
+ * Internal method to force removal of a cookie by the client
+ * when session_destroy() is called.
+ *
+ * @return bool
+ */
+ protected function _cookie_destroy()
+ {
+ return setcookie(
+ $this->_config['cookie_name'],
+ NULL,
+ 1,
+ $this->_config['cookie_path'],
+ $this->_config['cookie_domain'],
+ $this->_config['cookie_secure'],
+ TRUE
+ );
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get lock
+ *
+ * A dummy method allowing drivers with no locking functionality
+ * (databases other than PostgreSQL and MySQL) to act as if they
+ * do acquire a lock.
+ *
+ * @param string $session_id
+ * @return bool
+ */
+ protected function _get_lock($session_id)
+ {
+ $this->_lock = TRUE;
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Release lock
+ *
+ * @return bool
+ */
+ protected function _release_lock()
+ {
+ if ($this->_lock)
+ {
+ $this->_lock = FALSE;
+ }
+
+ return TRUE;
+ }
+
+}
diff --git a/system/libraries/Session/drivers/Session_cookie.php b/system/libraries/Session/drivers/Session_cookie.php
deleted file mode 100644
index c0e62affa..000000000
--- a/system/libraries/Session/drivers/Session_cookie.php
+++ /dev/null
@@ -1,816 +0,0 @@
-<?php
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP
- *
- * This content is released under the MIT License (MIT)
- *
- * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @package CodeIgniter
- * @author EllisLab Dev Team
- * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
- * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
- * @license http://opensource.org/licenses/MIT MIT License
- * @link http://codeigniter.com
- * @since Version 1.0.0
- * @filesource
- */
-defined('BASEPATH') OR exit('No direct script access allowed');
-
-/**
- * Cookie-based session management driver
- *
- * This is the classic CI_Session functionality, as written by EllisLab, abstracted out to a driver.
- *
- * @package CodeIgniter
- * @subpackage Libraries
- * @category Sessions
- * @author EllisLab Dev Team
- * @link http://codeigniter.com/user_guide/libraries/sessions.html
- */
-class CI_Session_cookie extends CI_Session_driver {
-
- /**
- * Whether to encrypt the session cookie
- *
- * @var bool
- */
- public $sess_encrypt_cookie = FALSE;
-
- /**
- * Whether to use to the database for session storage
- *
- * @var bool
- */
- public $sess_use_database = FALSE;
-
- /**
- * Name of the database table in which to store sessions
- *
- * @var string
- */
- public $sess_table_name = '';
-
- /**
- * Length of time (in seconds) for sessions to expire
- *
- * @var int
- */
- public $sess_expiration = 7200;
-
- /**
- * Whether to kill session on close of browser window
- *
- * @var bool
- */
- public $sess_expire_on_close = FALSE;
-
- /**
- * Whether to match session on ip address
- *
- * @var bool
- */
- public $sess_match_ip = FALSE;
-
- /**
- * Whether to match session on user-agent
- *
- * @var bool
- */
- public $sess_match_useragent = TRUE;
-
- /**
- * Name of session cookie
- *
- * @var string
- */
- public $sess_cookie_name = 'ci_session';
-
- /**
- * Session cookie prefix
- *
- * @var string
- */
- public $cookie_prefix = '';
-
- /**
- * Session cookie path
- *
- * @var string
- */
- public $cookie_path = '';
-
- /**
- * Session cookie domain
- *
- * @var string
- */
- public $cookie_domain = '';
-
- /**
- * Whether to set the cookie only on HTTPS connections
- *
- * @var bool
- */
- public $cookie_secure = FALSE;
-
- /**
- * Whether cookie should be allowed only to be sent by the server
- *
- * @var bool
- */
- public $cookie_httponly = FALSE;
-
- /**
- * Interval at which to update session
- *
- * @var int
- */
- public $sess_time_to_update = 300;
-
- /**
- * Key with which to encrypt the session cookie
- *
- * @var string
- */
- public $encryption_key = '';
-
- /**
- * Timezone to use for the current time
- *
- * @var string
- */
- public $time_reference = 'local';
-
- /**
- * Session data
- *
- * @var array
- */
- public $userdata = array();
-
- /**
- * Current time
- *
- * @var int
- */
- public $now;
-
- // ------------------------------------------------------------------------
-
- /**
- * Default userdata keys
- *
- * @var array
- */
- protected $defaults = array(
- 'session_id' => NULL,
- 'ip_address' => NULL,
- 'user_agent' => NULL,
- 'last_activity' => NULL
- );
-
- /**
- * Data needs DB update flag
- *
- * @var bool
- */
- protected $data_dirty = FALSE;
-
- /**
- * Standardize newlines flag
- *
- * @var bool
- */
- protected $_standardize_newlines;
-
- // ------------------------------------------------------------------------
-
- /**
- * Initialize session driver object
- *
- * @return void
- */
- protected function initialize()
- {
- // Set all the session preferences, which can either be set
- // manually via the $params array or via the config file
- $prefs = array(
- 'sess_encrypt_cookie',
- 'sess_use_database',
- 'sess_table_name',
- 'sess_expiration',
- 'sess_expire_on_close',
- 'sess_match_ip',
- 'sess_match_useragent',
- 'sess_cookie_name',
- 'cookie_path',
- 'cookie_domain',
- 'cookie_secure',
- 'cookie_httponly',
- 'sess_time_to_update',
- 'time_reference',
- 'cookie_prefix',
- 'encryption_key',
- );
-
- $this->_standardize_newlines = (bool) config_item('standardize_newlines');
-
- foreach ($prefs as $key)
- {
- $this->$key = isset($this->_parent->params[$key])
- ? $this->_parent->params[$key]
- : $this->CI->config->item($key);
- }
-
- if (empty($this->encryption_key))
- {
- show_error('In order to use the Cookie Session driver you are required to set an encryption key in your config file.');
- }
-
- // Do we need encryption? If so, load the encryption class
- if ($this->sess_encrypt_cookie === TRUE)
- {
- $this->CI->load->library('encryption');
- }
-
- // Check for database
- if ($this->sess_use_database === TRUE && $this->sess_table_name !== '')
- {
- // Load database driver
- $this->CI->load->database();
-
- // Register shutdown function
- register_shutdown_function(array($this, '_update_db'));
- }
-
- // Set the "now" time. Can either be GMT or server time, based on the config prefs.
- // We use this to set the "last activity" time
- $this->now = $this->_get_time();
-
- // Set the session length. If the session expiration is
- // set to zero we'll set the expiration two years from now.
- if ($this->sess_expiration === 0)
- {
- $this->sess_expiration = (60*60*24*365*2);
- }
-
- // Set the cookie name
- $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name;
-
- // Run the Session routine. If a session doesn't exist we'll
- // create a new one. If it does, we'll update it.
- if ( ! $this->_sess_read())
- {
- $this->_sess_create();
- }
- else
- {
- $this->_sess_update();
- }
-
- // Delete expired sessions if necessary
- $this->_sess_gc();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Write the session data
- *
- * @return void
- */
- public function sess_save()
- {
- // Check for database
- if ($this->sess_use_database === TRUE)
- {
- // Mark custom data as dirty so we know to update the DB
- $this->data_dirty = TRUE;
- }
-
- // Write the cookie
- $this->_set_cookie();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Destroy the current session
- *
- * @return void
- */
- public function sess_destroy()
- {
- // Kill the session DB row
- if ($this->sess_use_database === TRUE && isset($this->userdata['session_id']))
- {
- $this->CI->db->delete($this->sess_table_name, array('session_id' => $this->userdata['session_id']));
- $this->data_dirty = FALSE;
- }
-
- // Kill the cookie
- $this->_setcookie($this->sess_cookie_name, '', ($this->now - 31500000),
- $this->cookie_path, $this->cookie_domain, 0);
-
- // Kill session data
- $this->userdata = array();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Regenerate the current session
- *
- * Regenerate the session id
- *
- * @param bool Destroy session data flag (default: false)
- * @return void
- */
- public function sess_regenerate($destroy = FALSE)
- {
- // Check destroy flag
- if ($destroy)
- {
- // Destroy old session and create new one
- $this->sess_destroy();
- $this->_sess_create();
- }
- else
- {
- // Just force an update to recreate the id
- $this->_sess_update(TRUE);
- }
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Get a reference to user data array
- *
- * @return array Reference to userdata
- */
- public function &get_userdata()
- {
- return $this->userdata;
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Fetch the current session data if it exists
- *
- * @return bool
- */
- protected function _sess_read()
- {
- // Fetch the cookie
- $session = $this->CI->input->cookie($this->sess_cookie_name);
-
- // No cookie? Goodbye cruel world!...
- if ($session === NULL)
- {
- log_message('debug', 'A session cookie was not found.');
- return FALSE;
- }
-
- if ($this->sess_encrypt_cookie === TRUE)
- {
- $session = $this->CI->encryption->decrypt($session);
- if ($session === FALSE)
- {
- log_message('error', 'Session: Unable to decrypt the session cookie, possibly due to a HMAC mismatch.');
- return FALSE;
- }
- }
- else
- {
- if (($len = strlen($session) - 40) <= 0)
- {
- log_message('error', 'Session: The session cookie was not signed.');
- return FALSE;
- }
-
- // Check cookie authentication
- $hmac = substr($session, $len);
- $session = substr($session, 0, $len);
-
- // Time-attack-safe comparison
- $hmac_check = hash_hmac('sha1', $session, $this->encryption_key);
- $diff = 0;
- for ($i = 0; $i < 40; $i++)
- {
- $diff |= ord($hmac[$i]) ^ ord($hmac_check[$i]);
- }
-
- if ($diff !== 0)
- {
- log_message('error', 'Session: HMAC mismatch. The session cookie data did not match what was expected.');
- $this->sess_destroy();
- return FALSE;
- }
- }
-
- // Unserialize the session array
- $session = @unserialize($session);
-
- // Is the session data we unserialized an array with the correct format?
- if ( ! is_array($session) OR ! isset($session['session_id'], $session['ip_address'], $session['user_agent'], $session['last_activity']))
- {
- log_message('debug', 'Session: Wrong cookie data format');
- $this->sess_destroy();
- return FALSE;
- }
-
- // Is the session current?
- if (($session['last_activity'] + $this->sess_expiration) < $this->now OR $session['last_activity'] > $this->now)
- {
- log_message('debug', 'Session: Expired');
- $this->sess_destroy();
- return FALSE;
- }
-
- // Does the IP match?
- if ($this->sess_match_ip === TRUE && $session['ip_address'] !== $this->CI->input->ip_address())
- {
- log_message('debug', 'Session: IP address mismatch');
- $this->sess_destroy();
- return FALSE;
- }
-
- // Does the User Agent Match?
- if ($this->sess_match_useragent === TRUE &&
- trim($session['user_agent']) !== trim(substr($this->CI->input->user_agent(), 0, 120)))
- {
- log_message('debug', 'Session: User Agent string mismatch');
- $this->sess_destroy();
- return FALSE;
- }
-
- // Is there a corresponding session in the DB?
- if ($this->sess_use_database === TRUE)
- {
- $this->CI->db->where('session_id', $session['session_id']);
-
- if ($this->sess_match_ip === TRUE)
- {
- $this->CI->db->where('ip_address', $session['ip_address']);
- }
-
- if ($this->sess_match_useragent === TRUE)
- {
- $this->CI->db->where('user_agent', $session['user_agent']);
- }
-
- // Is caching in effect? Turn it off
- $db_cache = $this->CI->db->cache_on;
- $this->CI->db->cache_off();
-
- $query = $this->CI->db->get($this->sess_table_name);
-
- // Was caching in effect?
- if ($db_cache)
- {
- // Turn it back on
- $this->CI->db->cache_on();
- }
-
- // No result? Kill it!
- if (empty($query) OR $query->num_rows() === 0)
- {
- log_message('debug', 'Session: No match found in our database');
- $this->sess_destroy();
- return FALSE;
- }
-
- // Is there custom data? If so, add it to the main session array
- $row = $query->row();
- if ( ! empty($row->user_data))
- {
- $custom_data = unserialize(trim($row->user_data));
-
- if (is_array($custom_data))
- {
- $session = $session + $custom_data;
- }
- }
- }
-
- // Session is valid!
- $this->userdata = $session;
- return TRUE;
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Create a new session
- *
- * @return void
- */
- protected function _sess_create()
- {
- // Initialize userdata
- $this->userdata = array(
- 'session_id' => $this->_make_sess_id(),
- 'ip_address' => $this->CI->input->ip_address(),
- 'user_agent' => trim(substr($this->CI->input->user_agent(), 0, 120)),
- 'last_activity' => $this->now,
- );
-
- log_message('debug', 'Session: Creating new session ('.$this->userdata['session_id'].')');
-
- // Check for database
- if ($this->sess_use_database === TRUE)
- {
- // Add empty user_data field and save the data to the DB
- $this->CI->db->set('user_data', '')->insert($this->sess_table_name, $this->userdata);
- }
-
- // Write the cookie
- $this->_set_cookie();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Update an existing session
- *
- * @param bool Force update flag (default: false)
- * @return void
- */
- protected function _sess_update($force = FALSE)
- {
- // We only update the session every five minutes by default (unless forced)
- if ( ! $force && ($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
- {
- return;
- }
-
- // Update last activity to now
- $this->userdata['last_activity'] = $this->now;
-
- // Save the old session id so we know which DB record to update
- $old_sessid = $this->userdata['session_id'];
-
- // Changing the session ID during an AJAX call causes problems
- if ( ! $this->CI->input->is_ajax_request())
- {
- // Get new id
- $this->userdata['session_id'] = $this->_make_sess_id();
-
- log_message('debug', 'Session: Regenerate ID');
- }
-
- // Check for database
- if ($this->sess_use_database === TRUE)
- {
- $this->CI->db->where('session_id', $old_sessid);
-
- if ($this->sess_match_ip === TRUE)
- {
- $this->CI->db->where('ip_address', $this->CI->input->ip_address());
- }
-
- if ($this->sess_match_useragent === TRUE)
- {
- $this->CI->db->where('user_agent', trim(substr($this->CI->input->user_agent(), 0, 120)));
- }
-
- // Update the session ID and last_activity field in the DB
- $this->CI->db->update($this->sess_table_name,
- array(
- 'last_activity' => $this->now,
- 'session_id' => $this->userdata['session_id']
- )
- );
- }
-
- // Write the cookie
- $this->_set_cookie();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Update database with current data
- *
- * This gets called from the shutdown function and also
- * registered with PHP to run at the end of the request
- * so it's guaranteed to update even when a fatal error
- * occurs. The first call makes the update and clears the
- * dirty flag so it won't happen twice.
- *
- * @return void
- */
- public function _update_db()
- {
- // Check for database and dirty flag and unsaved
- if ($this->sess_use_database === TRUE && $this->data_dirty === TRUE)
- {
- // Set up activity and data fields to be set
- // If we don't find custom data, user_data will remain an empty string
- $set = array(
- 'last_activity' => $this->userdata['last_activity'],
- 'user_data' => ''
- );
-
- // Get the custom userdata, leaving out the defaults
- // (which get stored in the cookie)
- $userdata = array_diff_key($this->userdata, $this->defaults);
-
- // Did we find any custom data?
- if ( ! empty($userdata))
- {
- // Serialize the custom data array so we can store it
- $set['user_data'] = serialize($userdata);
- }
-
- // Reset query builder values.
- $this->CI->db->reset_query();
-
- // Run the update query
- // Any time we change the session id, it gets updated immediately,
- // so our where clause below is always safe
- $this->CI->db->where('session_id', $this->userdata['session_id']);
-
- if ($this->sess_match_ip === TRUE)
- {
- $this->CI->db->where('ip_address', $this->CI->input->ip_address());
- }
-
- if ($this->sess_match_useragent === TRUE)
- {
- $this->CI->db->where('user_agent', trim(substr($this->CI->input->user_agent(), 0, 120)));
- }
-
- $this->CI->db->update($this->sess_table_name, $set);
-
- // Clear dirty flag to prevent double updates
- $this->data_dirty = FALSE;
-
- log_message('debug', 'CI_Session Data Saved To DB');
- }
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Generate a new session id
- *
- * @return string Hashed session id
- */
- protected function _make_sess_id()
- {
- $new_sessid = '';
- do
- {
- $new_sessid .= mt_rand();
- }
- while (strlen($new_sessid) < 32);
-
- // To make the session ID even more secure we'll combine it with the user's IP
- $new_sessid .= $this->CI->input->ip_address();
-
- // Turn it into a hash and return
- return md5(uniqid($new_sessid, TRUE));
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Get the "now" time
- *
- * @return int Time
- */
- protected function _get_time()
- {
- if ($this->time_reference === 'local' OR $this->time_reference === date_default_timezone_get())
- {
- return time();
- }
-
- $datetime = new DateTime('now', new DateTimeZone($this->time_reference));
- sscanf($datetime->format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second);
-
- return mktime($hour, $minute, $second, $month, $day, $year);
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Write the session cookie
- *
- * @return void
- */
- protected function _set_cookie()
- {
- // Get userdata (only defaults if database)
- $cookie_data = ($this->sess_use_database === TRUE)
- ? array_intersect_key($this->userdata, $this->defaults)
- : $this->userdata;
-
- // The Input class will do this and since we use HMAC verification,
- // unless we standardize here as well, the hash won't match.
- if ($this->_standardize_newlines)
- {
- foreach (array_keys($this->userdata) as $key)
- {
- $this->userdata[$key] = preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $this->userdata[$key]);
- }
- }
-
- // Serialize the userdata for the cookie
- $cookie_data = serialize($cookie_data);
-
- if ($this->sess_encrypt_cookie === TRUE)
- {
- $cookie_data = $this->CI->encryption->encrypt($cookie_data);
- }
- else
- {
- // Require message authentication
- $cookie_data .= hash_hmac('sha1', $cookie_data, $this->encryption_key);
- }
-
- $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time();
-
- // Set the cookie
- $this->_setcookie($this->sess_cookie_name, $cookie_data, $expire, $this->cookie_path, $this->cookie_domain,
- $this->cookie_secure, $this->cookie_httponly);
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Set a cookie with the system
- *
- * This abstraction of the setcookie call allows overriding for unit testing
- *
- * @param string Cookie name
- * @param string Cookie value
- * @param int Expiration time
- * @param string Cookie path
- * @param string Cookie domain
- * @param bool Secure connection flag
- * @param bool HTTP protocol only flag
- * @return void
- */
- protected function _setcookie($name, $value = '', $expire = 0, $path = '', $domain = '', $secure = FALSE, $httponly = FALSE)
- {
- setcookie($name, $value, $expire, $path, $domain, $secure, $httponly);
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Garbage collection
- *
- * This deletes expired session rows from database
- * if the probability percentage is met
- *
- * @return void
- */
- protected function _sess_gc()
- {
- if ($this->sess_use_database !== TRUE)
- {
- return;
- }
-
- $probability = ini_get('session.gc_probability');
- $divisor = ini_get('session.gc_divisor');
-
- if (mt_rand(1, $divisor) <= $probability)
- {
- $expire = $this->now - $this->sess_expiration;
- $this->CI->db->delete($this->sess_table_name, 'last_activity < '.$expire);
-
- log_message('debug', 'Session garbage collection performed.');
- }
- }
-
-}
-
-/* End of file Session_cookie.php */
-/* Location: ./system/libraries/Session/drivers/Session_cookie.php */ \ No newline at end of file
diff --git a/system/libraries/Session/drivers/Session_database_driver.php b/system/libraries/Session/drivers/Session_database_driver.php
new file mode 100644
index 000000000..0ec6e34f0
--- /dev/null
+++ b/system/libraries/Session/drivers/Session_database_driver.php
@@ -0,0 +1,385 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+ */
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * CodeIgniter Session Database Driver
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session_database_driver extends CI_Session_driver implements SessionHandlerInterface {
+
+ /**
+ * DB object
+ *
+ * @var object
+ */
+ protected $_db;
+
+ /**
+ * Row exists flag
+ *
+ * @var bool
+ */
+ protected $_row_exists = FALSE;
+
+ /**
+ * Lock "driver" flag
+ *
+ * @var string
+ */
+ protected $_platform;
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Class constructor
+ *
+ * @param array $params Configuration parameters
+ * @return void
+ */
+ public function __construct(&$params)
+ {
+ parent::__construct($params);
+
+ $CI =& get_instance();
+ isset($CI->db) OR $CI->load->database();
+ $this->_db = $CI->db;
+
+ if ( ! $this->_db instanceof CI_DB_query_builder)
+ {
+ throw new Exception('Query Builder not enabled for the configured database. Aborting.');
+ }
+ elseif ($this->_db->pconnect)
+ {
+ throw new Exception('Configured database connection is persistent. Aborting.');
+ }
+
+ $db_driver = $this->_db->dbdriver.(empty($this->_db->subdriver) ? '' : '_'.$this->_db->subdriver);
+ if (strpos($db_driver, 'mysql') !== FALSE)
+ {
+ $this->_platform = 'mysql';
+ }
+ elseif (in_array($db_driver, array('postgre', 'pdo_pgsql'), TRUE))
+ {
+ $this->_platform = 'postgre';
+ }
+
+ // Note: BC work-around for the old 'sess_table_name' setting, should be removed in the future.
+ isset($this->_config['save_path']) OR $this->_config['save_path'] = config_item('sess_table_name');
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Open
+ *
+ * Initializes the database connection
+ *
+ * @param string $save_path Table name
+ * @param string $name Session cookie name, unused
+ * @return bool
+ */
+ public function open($save_path, $name)
+ {
+ return empty($this->_db->conn_id)
+ ? ( ! $this->_db->autoinit && $this->_db->db_connect())
+ : TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read
+ *
+ * Reads session data and acquires a lock
+ *
+ * @param string $session_id Session ID
+ * @return string Serialized session data
+ */
+ public function read($session_id)
+ {
+ if ($this->_get_lock($session_id) !== FALSE)
+ {
+ // Needed by write() to detect session_regenerate_id() calls
+ $this->_session_id = $session_id;
+
+ $this->_db
+ ->select('data')
+ ->from($this->_config['save_path'])
+ ->where('id', $session_id);
+
+ if ($this->_config['match_ip'])
+ {
+ $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
+ }
+
+ if (($result = $this->_db->get()->row()) === NULL)
+ {
+ $this->_fingerprint = md5('');
+ return '';
+ }
+
+ // PostgreSQL's variant of a BLOB datatype is Bytea, which is a
+ // PITA to work with, so we use base64-encoded data in a TEXT
+ // field instead.
+ $result = ($this->_platform === 'postgre')
+ ? base64_decode(rtrim($result->data))
+ : $result->data;
+
+ $this->_fingerprint = md5($result);
+ $this->_row_exists = TRUE;
+ return $result;
+ }
+
+ $this->_fingerprint = md5('');
+ return '';
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Write
+ *
+ * Writes (create / update) session data
+ *
+ * @param string $session_id Session ID
+ * @param string $session_data Serialized session data
+ * @return bool
+ */
+ public function write($session_id, $session_data)
+ {
+ // Was the ID regenerated?
+ if ($session_id !== $this->_session_id)
+ {
+ if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))
+ {
+ return FALSE;
+ }
+
+ $this->_row_exists = FALSE;
+ $this->_session_id = $session_id;
+ }
+ elseif ($this->_lock === FALSE)
+ {
+ return FALSE;
+ }
+
+ if ($this->_row_exists === FALSE)
+ {
+ $insert_data = array(
+ 'id' => $session_id,
+ 'ip_address' => $_SERVER['REMOTE_ADDR'],
+ 'timestamp' => time(),
+ 'data' => ($this->_platform === 'postgre' ? base64_encode($session_data) : $session_data)
+ );
+
+ if ($this->_db->insert($this->_config['save_path'], $insert_data))
+ {
+ $this->_fingerprint = md5($session_data);
+ return $this->_row_exists = TRUE;
+ }
+
+ return FALSE;
+ }
+
+ $this->_db->where('id', $session_id);
+ if ($this->_config['match_ip'])
+ {
+ $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
+ }
+
+ $update_data = array('timestamp' => time());
+ if ($this->_fingerprint !== md5($session_data))
+ {
+ $update_data['data'] = ($this->_platform === 'postgre')
+ ? base64_encode($session_data)
+ : $session_data;
+ }
+
+ if ($this->_db->update($this->_config['save_path'], $update_data))
+ {
+ $this->_fingerprint = md5($session_data);
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Close
+ *
+ * Releases locks
+ *
+ * @return void
+ */
+ public function close()
+ {
+ return ($this->_lock)
+ ? $this->_release_lock()
+ : TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Destroy
+ *
+ * Destroys the current session.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ public function destroy($session_id)
+ {
+ if ($this->_lock)
+ {
+ $this->_db->where('id', $session_id);
+ if ($this->_config['match_ip'])
+ {
+ $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
+ }
+
+ return $this->_db->delete($this->_config['save_path'])
+ ? ($this->close() && $this->_cookie_destroy())
+ : FALSE;
+ }
+
+ return ($this->close() && $this->_cookie_destroy());
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Garbage Collector
+ *
+ * Deletes expired sessions
+ *
+ * @param int $maxlifetime Maximum lifetime of sessions
+ * @return bool
+ */
+ public function gc($maxlifetime)
+ {
+ return $this->_db->delete($this->_config['save_path'], 'timestamp < '.(time() - $maxlifetime));
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get lock
+ *
+ * Acquires a lock, depending on the underlying platform.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ protected function _get_lock($session_id)
+ {
+ if ($this->_platform === 'mysql')
+ {
+ $arg = $session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : '');
+ if ($this->_db->query("SELECT GET_LOCK('".$arg."', 10) AS ci_session_lock")->row()->ci_session_lock)
+ {
+ $this->_lock = $arg;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ elseif ($this->_platform === 'postgre')
+ {
+ $arg = "hashtext('".$session_id."')".($this->_config['match_ip'] ? ", hashtext('".$_SERVER['REMOTE_ADDR']."')" : '');
+ if ($this->_db->simple_query('SELECT pg_advisory_lock('.$arg.')'))
+ {
+ $this->_lock = $arg;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ return parent::_get_lock($session_id);
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Release lock
+ *
+ * Releases a previously acquired lock
+ *
+ * @return bool
+ */
+ protected function _release_lock()
+ {
+ if ( ! $this->_lock)
+ {
+ return TRUE;
+ }
+
+ if ($this->_platform === 'mysql')
+ {
+ if ($this->_db->query("SELECT RELEASE_LOCK('".$this->_lock."') AS ci_session_lock")->row()->ci_session_lock)
+ {
+ $this->_lock = FALSE;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ elseif ($this->_platform === 'postgre')
+ {
+ if ($this->_db->simple_query('SELECT pg_advisory_unlock('.$this->_lock.')'))
+ {
+ $this->_lock = FALSE;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ return parent::_release_lock();
+ }
+
+}
diff --git a/system/libraries/Session/drivers/Session_files_driver.php b/system/libraries/Session/drivers/Session_files_driver.php
new file mode 100644
index 000000000..ad8315d52
--- /dev/null
+++ b/system/libraries/Session/drivers/Session_files_driver.php
@@ -0,0 +1,352 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+*/
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * CodeIgniter Session Files Driver
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session_files_driver extends CI_Session_driver implements SessionHandlerInterface {
+
+ /**
+ * Save path
+ *
+ * @var string
+ */
+ protected $_save_path;
+
+ /**
+ * File handle
+ *
+ * @var resource
+ */
+ protected $_file_handle;
+
+ /**
+ * File name
+ *
+ * @var resource
+ */
+ protected $_file_path;
+
+ /**
+ * File new flag
+ *
+ * @var bool
+ */
+ protected $_file_new;
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Class constructor
+ *
+ * @param array $params Configuration parameters
+ * @return void
+ */
+ public function __construct(&$params)
+ {
+ parent::__construct($params);
+
+ if (isset($this->_config['save_path']))
+ {
+ $this->_config['save_path'] = rtrim($this->_config['save_path'], '/\\');
+ ini_set('session.save_path', $this->_config['save_path']);
+ }
+ else
+ {
+ $this->_config['save_path'] = rtrim(ini_get('session.save_path'), '/\\');
+ }
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Open
+ *
+ * Sanitizes the save_path directory.
+ *
+ * @param string $save_path Path to session files' directory
+ * @param string $name Session cookie name, unused
+ * @return bool
+ */
+ public function open($save_path, $name)
+ {
+ if ( ! is_dir($save_path))
+ {
+ if ( ! mkdir($save_path, 0700, TRUE))
+ {
+ throw new Exception("Session: Configured save path '".$this->_config['save_path']."' is not a directory, doesn't exist or cannot be created.");
+ }
+ }
+ elseif ( ! is_writable($save_path))
+ {
+ throw new Exception("Session: Configured save path '".$this->_config['save_path']."' is not writable by the PHP process.");
+ }
+
+ $this->_config['save_path'] = $save_path;
+ $this->_file_path = $this->_config['save_path'].DIRECTORY_SEPARATOR
+ .$name // we'll use the session cookie name as a prefix to avoid collisions
+ .($this->_config['match_ip'] ? md5($_SERVER['REMOTE_ADDR']) : '');
+
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read
+ *
+ * Reads session data and acquires a lock
+ *
+ * @param string $session_id Session ID
+ * @return string Serialized session data
+ */
+ public function read($session_id)
+ {
+ // This might seem weird, but PHP 5.6 introduces session_reset(),
+ // which re-reads session data
+ if ($this->_file_handle === NULL)
+ {
+ // Just using fopen() with 'c+b' mode would be perfect, but it is only
+ // available since PHP 5.2.6 and we have to set permissions for new files,
+ // so we'd have to hack around this ...
+ if (($this->_file_new = ! file_exists($this->_file_path.$session_id)) === TRUE)
+ {
+ if (($this->_file_handle = fopen($this->_file_path.$session_id, 'w+b')) === FALSE)
+ {
+ log_message('error', "Session: File '".$this->_file_path.$session_id."' doesn't exist and cannot be created.");
+ return FALSE;
+ }
+ }
+ elseif (($this->_file_handle = fopen($this->_file_path.$session_id, 'r+b')) === FALSE)
+ {
+ log_message('error', "Session: Unable to open file '".$this->_file_path.$session_id."'.");
+ return FALSE;
+ }
+
+ if (flock($this->_file_handle, LOCK_EX) === FALSE)
+ {
+ log_message('error', "Session: Unable to obtain lock for file '".$this->_file_path.$session_id."'.");
+ fclose($this->_file_handle);
+ $this->_file_handle = NULL;
+ return FALSE;
+ }
+
+ // Needed by write() to detect session_regenerate_id() calls
+ $this->_session_id = $session_id;
+
+ if ($this->_file_new)
+ {
+ chmod($this->_file_path.$session_id, 0600);
+ $this->_fingerprint = md5('');
+ return '';
+ }
+ }
+ else
+ {
+ rewind($this->_file_handle);
+ }
+
+ $session_data = '';
+ for ($read = 0, $length = filesize($this->_file_path.$session_id); $read < $length; $read += strlen($buffer))
+ {
+ if (($buffer = fread($this->_file_handle, $length - $read)) === FALSE)
+ {
+ break;
+ }
+
+ $session_data .= $buffer;
+ }
+
+ $this->_fingerprint = md5($session_data);
+ return $session_data;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Write
+ *
+ * Writes (create / update) session data
+ *
+ * @param string $session_id Session ID
+ * @param string $session_data Serialized session data
+ * @return bool
+ */
+ public function write($session_id, $session_data)
+ {
+ // If the two IDs don't match, we have a session_regenerate_id() call
+ // and we need to close the old handle and open a new one
+ if ($session_id !== $this->_session_id && ( ! $this->close() OR $this->read($session_id) === FALSE))
+ {
+ return FALSE;
+ }
+
+ if ( ! is_resource($this->_file_handle))
+ {
+ return FALSE;
+ }
+ elseif ($this->_fingerprint === md5($session_data))
+ {
+ return ($this->_file_new)
+ ? TRUE
+ : touch($this->_file_path.$session_id);
+ }
+
+ if ( ! $this->_file_new)
+ {
+ ftruncate($this->_file_handle, 0);
+ rewind($this->_file_handle);
+ }
+
+ if (($length = strlen($session_data)) > 0)
+ {
+ for ($written = 0; $written < $length; $written += $result)
+ {
+ if (($result = fwrite($this->_file_handle, substr($session_data, $written))) === FALSE)
+ {
+ break;
+ }
+ }
+
+ if ( ! is_int($result))
+ {
+ $this->_fingerprint = md5(substr($session_data, 0, $written));
+ log_message('error', 'Session: Unable to write data.');
+ return FALSE;
+ }
+ }
+
+ $this->_fingerprint = md5($session_data);
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Close
+ *
+ * Releases locks and closes file descriptor.
+ *
+ * @return void
+ */
+ public function close()
+ {
+ if (is_resource($this->_file_handle))
+ {
+ flock($this->_file_handle, LOCK_UN);
+ fclose($this->_file_handle);
+
+ $this->_file_handle = $this->_file_new = $this->_session_id = NULL;
+ return TRUE;
+ }
+
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Destroy
+ *
+ * Destroys the current session.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ public function destroy($session_id)
+ {
+ if ($this->close())
+ {
+ return unlink($this->_file_path.$session_id) && $this->_cookie_destroy();
+ }
+ elseif ($this->_file_path !== NULL)
+ {
+ clearstatcache();
+ return file_exists($this->_file_path.$session_id)
+ ? (unlink($this->_file_path.$session_id) && $this->_cookie_destroy())
+ : TRUE;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Garbage Collector
+ *
+ * Deletes expired sessions
+ *
+ * @param int $maxlifetime Maximum lifetime of sessions
+ * @return bool
+ */
+ public function gc($maxlifetime)
+ {
+ if ( ! is_dir($this->_config['save_path']) OR ($files = scandir($this->_config['save_path'])) === FALSE)
+ {
+ log_message('debug', "Session: Garbage collector couldn't list files under directory '".$this->_config['save_path']."'.");
+ return FALSE;
+ }
+
+ $ts = time() - $maxlifetime;
+
+ foreach ($files as $file)
+ {
+ // If the filename doesn't match this pattern, it's either not a session file or is not ours
+ if ( ! preg_match('/(?:[0-9a-f]{32})?[0-9a-f]{40}$/i', $file)
+ OR ! is_file($this->_config['save_path'].DIRECTORY_SEPARATOR.$file)
+ OR ($mtime = filemtime($this->_config['save_path'].DIRECTORY_SEPARATOR.$file)) === FALSE
+ OR $mtime > $ts)
+ {
+ continue;
+ }
+
+ unlink($this->_config['save_path'].DIRECTORY_SEPARATOR.$file);
+ }
+
+ return TRUE;
+ }
+
+}
diff --git a/system/libraries/Session/drivers/Session_memcached_driver.php b/system/libraries/Session/drivers/Session_memcached_driver.php
new file mode 100644
index 000000000..00112c88c
--- /dev/null
+++ b/system/libraries/Session/drivers/Session_memcached_driver.php
@@ -0,0 +1,375 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+ */
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * CodeIgniter Session Memcached Driver
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session_memcached_driver extends CI_Session_driver implements SessionHandlerInterface {
+
+ /**
+ * Memcached instance
+ *
+ * @var Memcached
+ */
+ protected $_memcached;
+
+ /**
+ * Key prefix
+ *
+ * @var string
+ */
+ protected $_key_prefix = 'ci_session:';
+
+ /**
+ * Lock key
+ *
+ * @var string
+ */
+ protected $_lock_key;
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Class constructor
+ *
+ * @param array $params Configuration parameters
+ * @return void
+ */
+ public function __construct(&$params)
+ {
+ parent::__construct($params);
+
+ if (empty($this->_config['save_path']))
+ {
+ log_message('error', 'Session: No Memcached save path configured.');
+ }
+
+ if ($this->_config['match_ip'] === TRUE)
+ {
+ $this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':';
+ }
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Open
+ *
+ * Sanitizes save_path and initializes connections.
+ *
+ * @param string $save_path Server path(s)
+ * @param string $name Session cookie name, unused
+ * @return bool
+ */
+ public function open($save_path, $name)
+ {
+ $this->_memcached = new Memcached();
+ $this->_memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, TRUE); // required for touch() usage
+ $server_list = array();
+ foreach ($this->_memcached->getServerList() as $server)
+ {
+ $server_list[] = $server['host'].':'.$server['port'];
+ }
+
+ if ( ! preg_match_all('#,?([^,:]+)\:(\d{1,5})(?:\:(\d+))?#', $this->_config['save_path'], $matches, PREG_SET_ORDER))
+ {
+ $this->_memcached = NULL;
+ log_message('error', 'Session: Invalid Memcached save path format: '.$this->_config['save_path']);
+ return FALSE;
+ }
+
+ foreach ($matches as $match)
+ {
+ // If Memcached already has this server (or if the port is invalid), skip it
+ if (in_array($match[1].':'.$match[2], $server_list, TRUE))
+ {
+ log_message('debug', 'Session: Memcached server pool already has '.$match[1].':'.$match[2]);
+ continue;
+ }
+
+ if ( ! $this->_memcached->addServer($match[1], $match[2], isset($match[3]) ? $match[3] : 0))
+ {
+ log_message('error', 'Could not add '.$match[1].':'.$match[2].' to Memcached server pool.');
+ }
+ else
+ {
+ $server_list[] = $match[1].':'.$match[2];
+ }
+ }
+
+ if (empty($server_list))
+ {
+ log_message('error', 'Session: Memcached server pool is empty.');
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read
+ *
+ * Reads session data and acquires a lock
+ *
+ * @param string $session_id Session ID
+ * @return string Serialized session data
+ */
+ public function read($session_id)
+ {
+ if (isset($this->_memcached) && $this->_get_lock($session_id))
+ {
+ // Needed by write() to detect session_regenerate_id() calls
+ $this->_session_id = $session_id;
+
+ $session_data = (string) $this->_memcached->get($this->_key_prefix.$session_id);
+ $this->_fingerprint = md5($session_data);
+ return $session_data;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Write
+ *
+ * Writes (create / update) session data
+ *
+ * @param string $session_id Session ID
+ * @param string $session_data Serialized session data
+ * @return bool
+ */
+ public function write($session_id, $session_data)
+ {
+ if ( ! isset($this->_memcached))
+ {
+ return FALSE;
+ }
+ // Was the ID regenerated?
+ elseif ($session_id !== $this->_session_id)
+ {
+ if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))
+ {
+ return FALSE;
+ }
+
+ $this->_fingerprint = md5('');
+ $this->_session_id = $session_id;
+ }
+
+ if (isset($this->_lock_key))
+ {
+ $this->_memcached->replace($this->_lock_key, time(), 5);
+ if ($this->_fingerprint !== ($fingerprint = md5($session_data)))
+ {
+ if ($this->_memcached->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration']))
+ {
+ $this->_fingerprint = $fingerprint;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ return $this->_memcached->touch($this->_key_prefix.$session_id, $this->_config['expiration']);
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Close
+ *
+ * Releases locks and closes connection.
+ *
+ * @return void
+ */
+ public function close()
+ {
+ if (isset($this->_memcached))
+ {
+ isset($this->_lock_key) && $this->_memcached->delete($this->_lock_key);
+ if ( ! $this->_memcached->quit())
+ {
+ return FALSE;
+ }
+
+ $this->_memcached = NULL;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Destroy
+ *
+ * Destroys the current session.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ public function destroy($session_id)
+ {
+ if (isset($this->_memcached, $this->_lock_key))
+ {
+ $this->_memcached->delete($this->_key_prefix.$session_id);
+ return $this->_cookie_destroy();
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Garbage Collector
+ *
+ * Deletes expired sessions
+ *
+ * @param int $maxlifetime Maximum lifetime of sessions
+ * @return bool
+ */
+ public function gc($maxlifetime)
+ {
+ // Not necessary, Memcached takes care of that.
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get lock
+ *
+ * Acquires an (emulated) lock.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ protected function _get_lock($session_id)
+ {
+ if (isset($this->_lock_key))
+ {
+ return $this->_memcached->replace($this->_lock_key, time(), 5);
+ }
+
+ $lock_key = $this->_key_prefix.$session_id.':lock';
+ if ( ! ($ts = $this->_memcached->get($lock_key)))
+ {
+ if ( ! $this->_memcached->set($lock_key, TRUE, 5))
+ {
+ log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = $lock_key;
+ $this->_lock = TRUE;
+ return TRUE;
+ }
+
+ // Another process has the lock, we'll try to wait for it to free itself ...
+ $attempt = 0;
+ while ($attempt++ < 5)
+ {
+ usleep(((time() - $ts) * 1000000) - 20000);
+ if (($ts = $this->_memcached->get($lock_key)) < time())
+ {
+ continue;
+ }
+
+ if ( ! $this->_memcached->set($lock_key, time(), 5))
+ {
+ log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = $lock_key;
+ break;
+ }
+
+ if ($attempt === 5)
+ {
+ log_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 5 attempts, aborting.');
+ return FALSE;
+ }
+
+ $this->_lock = TRUE;
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Release lock
+ *
+ * Releases a previously acquired lock
+ *
+ * @return bool
+ */
+ protected function _release_lock()
+ {
+ if (isset($this->_memcached, $this->_lock_key) && $this->_lock)
+ {
+ if ( ! $this->_memcached->delete($this->_lock_key) && $this->_memcached->getResultCode() !== Memcached::RES_NOTFOUND)
+ {
+ log_message('error', 'Session: Error while trying to free lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = NULL;
+ $this->_lock = FALSE;
+ }
+
+ return TRUE;
+ }
+
+}
diff --git a/system/libraries/Session/drivers/Session_native.php b/system/libraries/Session/drivers/Session_native.php
deleted file mode 100644
index c95e7f23f..000000000
--- a/system/libraries/Session/drivers/Session_native.php
+++ /dev/null
@@ -1,257 +0,0 @@
-<?php
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP
- *
- * This content is released under the MIT License (MIT)
- *
- * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @package CodeIgniter
- * @author EllisLab Dev Team
- * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
- * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
- * @license http://opensource.org/licenses/MIT MIT License
- * @link http://codeigniter.com
- * @since Version 1.0.0
- * @filesource
- */
-defined('BASEPATH') OR exit('No direct script access allowed');
-
-/**
- * Native PHP session management driver
- *
- * This is the driver that uses the native PHP $_SESSION array through the Session driver library.
- *
- * @package CodeIgniter
- * @subpackage Libraries
- * @category Sessions
- * @author EllisLab Dev Team
- */
-class CI_Session_native extends CI_Session_driver {
-
- /**
- * Initialize session driver object
- *
- * @return void
- */
- protected function initialize()
- {
- // Get config parameters
- $config = array();
- $prefs = array(
- 'sess_cookie_name',
- 'sess_expire_on_close',
- 'sess_expiration',
- 'sess_match_ip',
- 'sess_match_useragent',
- 'sess_time_to_update',
- 'cookie_prefix',
- 'cookie_path',
- 'cookie_domain',
- 'cookie_secure',
- 'cookie_httponly'
- );
-
- foreach ($prefs as $key)
- {
- $config[$key] = isset($this->_parent->params[$key])
- ? $this->_parent->params[$key]
- : $this->CI->config->item($key);
- }
-
- // Set session name, if specified
- if ($config['sess_cookie_name'])
- {
- // Differentiate name from cookie driver with '_id' suffix
- $name = $config['sess_cookie_name'].'_id';
- if ($config['cookie_prefix'])
- {
- // Prepend cookie prefix
- $name = $config['cookie_prefix'].$name;
- }
- session_name($name);
- }
-
- // Set expiration, path, and domain
- $expire = 7200;
- $path = '/';
- $domain = '';
- $secure = (bool) $config['cookie_secure'];
- $http_only = (bool) $config['cookie_httponly'];
-
- if ($config['sess_expiration'] !== FALSE)
- {
- // Default to 2 years if expiration is "0"
- $expire = ($config['sess_expiration'] == 0) ? (60*60*24*365*2) : $config['sess_expiration'];
- }
-
- if ($config['cookie_path'])
- {
- // Use specified path
- $path = $config['cookie_path'];
- }
-
- if ($config['cookie_domain'])
- {
- // Use specified domain
- $domain = $config['cookie_domain'];
- }
-
- session_set_cookie_params($config['sess_expire_on_close'] ? 0 : $expire, $path, $domain, $secure, $http_only);
-
- // Start session
- session_start();
-
- // Check session expiration, ip, and agent
- $now = time();
- $destroy = FALSE;
- if (isset($_SESSION['last_activity']) && (($_SESSION['last_activity'] + $expire) < $now OR $_SESSION['last_activity'] > $now))
- {
- // Expired - destroy
- log_message('debug', 'Session: Expired');
- $destroy = TRUE;
- }
- elseif ($config['sess_match_ip'] === TRUE && isset($_SESSION['ip_address'])
- && $_SESSION['ip_address'] !== $this->CI->input->ip_address())
- {
- // IP doesn't match - destroy
- log_message('debug', 'Session: IP address mismatch');
- $destroy = TRUE;
- }
- elseif ($config['sess_match_useragent'] === TRUE && isset($_SESSION['user_agent'])
- && $_SESSION['user_agent'] !== trim(substr($this->CI->input->user_agent(), 0, 50)))
- {
- // Agent doesn't match - destroy
- log_message('debug', 'Session: User Agent string mismatch');
- $destroy = TRUE;
- }
-
- // Destroy expired or invalid session
- if ($destroy)
- {
- // Clear old session and start new
- $this->sess_destroy();
- session_start();
- }
-
- // Check for update time
- if ($config['sess_time_to_update'] && isset($_SESSION['last_activity'])
- && ($_SESSION['last_activity'] + $config['sess_time_to_update']) < $now)
- {
- // Changing the session ID amidst a series of AJAX calls causes problems
- if ( ! $this->CI->input->is_ajax_request())
- {
- // Regenerate ID, but don't destroy session
- log_message('debug', 'Session: Regenerate ID');
- $this->sess_regenerate(FALSE);
- }
- }
-
- // Set activity time
- $_SESSION['last_activity'] = $now;
-
- // Set matching values as required
- if ($config['sess_match_ip'] === TRUE && ! isset($_SESSION['ip_address']))
- {
- // Store user IP address
- $_SESSION['ip_address'] = $this->CI->input->ip_address();
- }
-
- if ($config['sess_match_useragent'] === TRUE && ! isset($_SESSION['user_agent']))
- {
- // Store user agent string
- $_SESSION['user_agent'] = trim(substr($this->CI->input->user_agent(), 0, 50));
- }
-
- // Make session ID available
- $_SESSION['session_id'] = session_id();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Save the session data
- *
- * @return void
- */
- public function sess_save()
- {
- // Nothing to do - changes to $_SESSION are automatically saved
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Destroy the current session
- *
- * @return void
- */
- public function sess_destroy()
- {
- // Cleanup session
- $_SESSION = array();
- $name = session_name();
- if (isset($_COOKIE[$name]))
- {
- // Clear session cookie
- $params = session_get_cookie_params();
- setcookie($name, '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
- unset($_COOKIE[$name]);
- }
- session_destroy();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Regenerate the current session
- *
- * Regenerate the session id
- *
- * @param bool Destroy session data flag (default: FALSE)
- * @return void
- */
- public function sess_regenerate($destroy = FALSE)
- {
- // Just regenerate id, passing destroy flag
- session_regenerate_id($destroy);
- $_SESSION['session_id'] = session_id();
- }
-
- // ------------------------------------------------------------------------
-
- /**
- * Get a reference to user data array
- *
- * @return array Reference to userdata
- */
- public function &get_userdata()
- {
- // Just return reference to $_SESSION
- return $_SESSION;
- }
-
-}
-
-/* End of file Session_native.php */
-/* Location: ./system/libraries/Session/drivers/Session_native.php */ \ No newline at end of file
diff --git a/system/libraries/Session/drivers/Session_redis_driver.php b/system/libraries/Session/drivers/Session_redis_driver.php
new file mode 100644
index 000000000..c53975ae4
--- /dev/null
+++ b/system/libraries/Session/drivers/Session_redis_driver.php
@@ -0,0 +1,395 @@
+<?php
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP
+ *
+ * This content is released under the MIT License (MIT)
+ *
+ * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @package CodeIgniter
+ * @author EllisLab Dev Team
+ * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
+ * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
+ * @license http://opensource.org/licenses/MIT MIT License
+ * @link http://codeigniter.com
+ * @since Version 3.0.0
+ * @filesource
+ */
+defined('BASEPATH') OR exit('No direct script access allowed');
+
+/**
+ * CodeIgniter Session Redis Driver
+ *
+ * @package CodeIgniter
+ * @subpackage Libraries
+ * @category Sessions
+ * @author Andrey Andreev
+ * @link http://codeigniter.com/user_guide/libraries/sessions.html
+ */
+class CI_Session_redis_driver extends CI_Session_driver implements SessionHandlerInterface {
+
+ /**
+ * phpRedis instance
+ *
+ * @var resource
+ */
+ protected $_redis;
+
+ /**
+ * Key prefix
+ *
+ * @var string
+ */
+ protected $_key_prefix = 'ci_session:';
+
+ /**
+ * Lock key
+ *
+ * @var string
+ */
+ protected $_lock_key;
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Class constructor
+ *
+ * @param array $params Configuration parameters
+ * @return void
+ */
+ public function __construct(&$params)
+ {
+ parent::__construct($params);
+
+ if (empty($this->_config['save_path']))
+ {
+ log_message('error', 'Session: No Redis save path configured.');
+ }
+ elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->_config['save_path'], $matches))
+ {
+ isset($matches[3]) OR $matches[3] = ''; // Just to avoid undefined index notices below
+ $this->_config['save_path'] = array(
+ 'host' => $matches[1],
+ 'port' => empty($matches[2]) ? NULL : $matches[2],
+ 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : NULL,
+ 'database' => preg_match('#database=(\d+)#', $matches[3], $match) ? (int) $match[1] : NULL,
+ 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[3], $match) ? (float) $match[1] : NULL
+ );
+
+ preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->_key_prefix = $match[1];
+ }
+ else
+ {
+ log_message('error', 'Session: Invalid Redis save path format: '.$this->_config['save_path']);
+ }
+
+ if ($this->_config['match_ip'] === TRUE)
+ {
+ $this->_key_prefix .= $_SERVER['REMOTE_ADDR'].':';
+ }
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Open
+ *
+ * Sanitizes save_path and initializes connection.
+ *
+ * @param string $save_path Server path
+ * @param string $name Session cookie name, unused
+ * @return bool
+ */
+ public function open($save_path, $name)
+ {
+ if (empty($this->_config['save_path']))
+ {
+ return FALSE;
+ }
+
+ $redis = new Redis();
+ if ( ! $redis->connect($this->_config['save_path']['host'], $this->_config['save_path']['port'], $this->_config['save_path']['timeout']))
+ {
+ log_message('error', 'Session: Unable to connect to Redis with the configured settings.');
+ }
+ elseif (isset($this->_config['save_path']['password']) && ! $redis->auth($this->_config['save_path']['password']))
+ {
+ log_message('error', 'Session: Unable to authenticate to Redis instance.');
+ }
+ elseif (isset($this->_config['save_path']['database']) && ! $redis->select($this->_config['save_path']['database']))
+ {
+ log_message('error', 'Session: Unable to select Redis database with index '.$this->_config['save_path']['database']);
+ }
+ else
+ {
+ $this->_redis = $redis;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Read
+ *
+ * Reads session data and acquires a lock
+ *
+ * @param string $session_id Session ID
+ * @return string Serialized session data
+ */
+ public function read($session_id)
+ {
+ if (isset($this->_redis) && $this->_get_lock($session_id))
+ {
+ // Needed by write() to detect session_regenerate_id() calls
+ $this->_session_id = $session_id;
+
+ $session_data = (string) $this->_redis->get($this->_key_prefix.$session_id);
+ $this->_fingerprint = md5($session_data);
+ return $session_data;
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Write
+ *
+ * Writes (create / update) session data
+ *
+ * @param string $session_id Session ID
+ * @param string $session_data Serialized session data
+ * @return bool
+ */
+ public function write($session_id, $session_data)
+ {
+ if ( ! isset($this->_redis))
+ {
+ return FALSE;
+ }
+ // Was the ID regenerated?
+ elseif ($session_id !== $this->_session_id)
+ {
+ if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))
+ {
+ return FALSE;
+ }
+
+ $this->_fingerprint = md5('');
+ $this->_session_id = $session_id;
+ }
+
+ if (isset($this->_lock_key))
+ {
+ $this->_redis->setTimeout($this->_lock_key, 5);
+ if ($this->_fingerprint !== ($fingerprint = md5($session_data)))
+ {
+ if ($this->_redis->set($this->_key_prefix.$session_id, $session_data, $this->_config['expiration']))
+ {
+ $this->_fingerprint = $fingerprint;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ return $this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration']);
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Close
+ *
+ * Releases locks and closes connection.
+ *
+ * @return void
+ */
+ public function close()
+ {
+ if (isset($this->_redis))
+ {
+ try {
+ if ($this->_redis->ping() === '+PONG')
+ {
+ isset($this->_lock_key) && $this->_redis->delete($this->_lock_key);
+ if ( ! $this->_redis->close())
+ {
+ return FALSE;
+ }
+ }
+ }
+ catch (RedisException $e)
+ {
+ log_message('error', 'Session: Got RedisException on close(): '.$e->getMessage());
+ }
+
+ $this->_redis = NULL;
+ return TRUE;
+ }
+
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Destroy
+ *
+ * Destroys the current session.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ public function destroy($session_id)
+ {
+ if (isset($this->_redis, $this->_lock_key))
+ {
+ if ($this->_redis->delete($this->_key_prefix.$session_id) !== 1)
+ {
+ log_message('debug', 'Session: Redis::delete() expected to return 1, got '.var_export($result, TRUE).' instead.');
+ }
+
+ return $this->_cookie_destroy();
+ }
+
+ return FALSE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Garbage Collector
+ *
+ * Deletes expired sessions
+ *
+ * @param int $maxlifetime Maximum lifetime of sessions
+ * @return bool
+ */
+ public function gc($maxlifetime)
+ {
+ // Not necessary, Redis takes care of that.
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Get lock
+ *
+ * Acquires an (emulated) lock.
+ *
+ * @param string $session_id Session ID
+ * @return bool
+ */
+ protected function _get_lock($session_id)
+ {
+ if (isset($this->_lock_key))
+ {
+ return $this->_redis->setTimeout($this->_lock_key, 5);
+ }
+
+ $lock_key = $this->_key_prefix.$session_id.':lock';
+ if (($ttl = $this->_redis->ttl($lock_key)) < 1)
+ {
+ if ( ! $this->_redis->setex($lock_key, 5, time()))
+ {
+ log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = $lock_key;
+
+ if ($ttl === -1)
+ {
+ log_message('debug', 'Session: Lock for '.$this->_key_prefix.$session_id.' had no TTL, overriding.');
+ }
+
+ $this->_lock = TRUE;
+ return TRUE;
+ }
+
+ // Another process has the lock, we'll try to wait for it to free itself ...
+ $attempt = 0;
+ while ($attempt++ < 5)
+ {
+ usleep(($ttl * 1000000) - 20000);
+ if (($ttl = $this->_redis->ttl($lock_key)) > 0)
+ {
+ continue;
+ }
+
+ if ( ! $this->_redis->setex($lock_key, 5, time()))
+ {
+ log_message('error', 'Session: Error while trying to obtain lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = $lock_key;
+ break;
+ }
+
+ if ($attempt === 5)
+ {
+ log_message('error', 'Session: Unable to obtain lock for '.$this->_key_prefix.$session_id.' after 5 attempts, aborting.');
+ return FALSE;
+ }
+
+ $this->_lock = TRUE;
+ return TRUE;
+ }
+
+ // ------------------------------------------------------------------------
+
+ /**
+ * Release lock
+ *
+ * Releases a previously acquired lock
+ *
+ * @return bool
+ */
+ protected function _release_lock()
+ {
+ if (isset($this->_redis, $this->_lock_key) && $this->_lock)
+ {
+ if ( ! $this->_redis->delete($this->_lock_key))
+ {
+ log_message('error', 'Session: Error while trying to free lock for '.$this->_key_prefix.$session_id);
+ return FALSE;
+ }
+
+ $this->_lock_key = NULL;
+ $this->_lock = FALSE;
+ }
+
+ return TRUE;
+ }
+
+}
diff --git a/system/libraries/Table.php b/system/libraries/Table.php
index 118536f88..7a39dfc77 100644
--- a/system/libraries/Table.php
+++ b/system/libraries/Table.php
@@ -120,7 +120,7 @@ class CI_Table {
$this->template[$key] = $val;
}
- log_message('debug', 'Table Class Initialized');
+ log_message('info', 'Table Class Initialized');
}
// --------------------------------------------------------------------
@@ -535,6 +535,3 @@ class CI_Table {
}
}
-
-/* End of file Table.php */
-/* Location: ./system/libraries/Table.php */ \ No newline at end of file
diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php
index 3284923fd..23bdbbd58 100644
--- a/system/libraries/Trackback.php
+++ b/system/libraries/Trackback.php
@@ -103,7 +103,7 @@ class CI_Trackback {
*/
public function __construct()
{
- log_message('debug', 'Trackback Class Initialized');
+ log_message('info', 'Trackback Class Initialized');
}
// --------------------------------------------------------------------
@@ -554,6 +554,3 @@ class CI_Trackback {
}
}
-
-/* End of file Trackback.php */
-/* Location: ./system/libraries/Trackback.php */ \ No newline at end of file
diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php
index c34fedcb1..3b6cb1645 100644
--- a/system/libraries/Typography.php
+++ b/system/libraries/Typography.php
@@ -172,7 +172,6 @@ class CI_Typography {
// Build our finalized string. We cycle through the array, skipping tags, and processing the contained text
$str = '';
$process = TRUE;
- $paragraph = FALSE;
for ($i = 0, $c = count($chunks) - 1; $i <= $c; $i++)
{
@@ -423,6 +422,3 @@ class CI_Typography {
}
}
-
-/* End of file Typography.php */
-/* Location: ./system/libraries/Typography.php */ \ No newline at end of file
diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php
index 6137673c0..7b744adc6 100644
--- a/system/libraries/Unit_test.php
+++ b/system/libraries/Unit_test.php
@@ -111,7 +111,7 @@ class CI_Unit_test {
*/
public function __construct()
{
- log_message('debug', 'Unit Testing Class Initialized');
+ log_message('info', 'Unit Testing Class Initialized');
}
// --------------------------------------------------------------------
@@ -403,6 +403,3 @@ function is_false($test)
{
return ($test === FALSE);
}
-
-/* End of file Unit_test.php */
-/* Location: ./system/libraries/Unit_test.php */ \ No newline at end of file
diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php
index e022c43d4..f5534a7f7 100644
--- a/system/libraries/Upload.php
+++ b/system/libraries/Upload.php
@@ -296,7 +296,7 @@ class CI_Upload {
$this->_mimes =& get_mimes();
$this->_CI =& get_instance();
- log_message('debug', 'Upload Class Initialized');
+ log_message('info', 'Upload Class Initialized');
}
// --------------------------------------------------------------------
@@ -338,11 +338,9 @@ class CI_Upload {
$this->$key = $defaults[$key];
}
}
-
}
else
{
-
foreach ($config as $key => &$value)
{
if ($key[0] !== '_' && $reflection->hasProperty($key))
@@ -357,7 +355,6 @@ class CI_Upload {
}
}
}
-
}
// if a file_name was provided in the config, use it instead of the user input
@@ -1300,6 +1297,3 @@ class CI_Upload {
}
}
-
-/* End of file Upload.php */
-/* Location: ./system/libraries/Upload.php */ \ No newline at end of file
diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php
index 04e1a59ba..53d932a53 100644
--- a/system/libraries/User_agent.php
+++ b/system/libraries/User_agent.php
@@ -183,7 +183,7 @@ class CI_User_agent {
$this->_compile_data();
}
- log_message('debug', 'User Agent Class Initialized');
+ log_message('info', 'User Agent Class Initialized');
}
// --------------------------------------------------------------------
@@ -681,6 +681,3 @@ class CI_User_agent {
}
}
-
-/* End of file User_agent.php */
-/* Location: ./system/libraries/User_agent.php */ \ No newline at end of file
diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php
index 5ecebaf6d..9d7cbffa2 100644
--- a/system/libraries/Xmlrpc.php
+++ b/system/libraries/Xmlrpc.php
@@ -314,7 +314,7 @@ class CI_Xmlrpc {
$this->initialize($config);
- log_message('debug', 'XML-RPC Class Initialized');
+ log_message('info', 'XML-RPC Class Initialized');
}
// --------------------------------------------------------------------
@@ -1900,6 +1900,3 @@ class XML_RPC_Values extends CI_Xmlrpc
}
} // END XML_RPC_Values Class
-
-/* End of file Xmlrpc.php */
-/* Location: ./system/libraries/Xmlrpc.php */ \ No newline at end of file
diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php
index f786b2323..af7041337 100644
--- a/system/libraries/Xmlrpcs.php
+++ b/system/libraries/Xmlrpcs.php
@@ -104,7 +104,7 @@ class CI_Xmlrpcs extends CI_Xmlrpc {
$this->methods = array_merge($this->methods, $config['functions']);
}
- log_message('debug', 'XML-RPC Server Class Initialized');
+ log_message('info', 'XML-RPC Server Class Initialized');
}
// --------------------------------------------------------------------
@@ -622,6 +622,3 @@ class CI_Xmlrpcs extends CI_Xmlrpc {
}
}
-
-/* End of file Xmlrpcs.php */
-/* Location: ./system/libraries/Xmlrpcs.php */ \ No newline at end of file
diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php
index cee5d8d76..f2f17148b 100644
--- a/system/libraries/Zip.php
+++ b/system/libraries/Zip.php
@@ -113,7 +113,7 @@ class CI_Zip {
public function __construct()
{
$this->now = time();
- log_message('debug', 'Zip Compression Class Initialized');
+ log_message('info', 'Zip Compression Class Initialized');
}
// --------------------------------------------------------------------
@@ -482,6 +482,3 @@ class CI_Zip {
}
}
-
-/* End of file Zip.php */
-/* Location: ./system/libraries/Zip.php */ \ No newline at end of file